<sect id="s-cvs-d">Servidor de CVS - configurando métodos de acesso ao repositório
 <p>
O CVS é uma aplicação cliente/servidor, possuindo diversas maneiras de fazer 
o acesso seu repositório (veja <ref id="s-cvs-p-repos"> repositórios). Estes 
métodos são os seguintes: 
<list compact>
 <item>local (<ref id="s-cvs-d-metodos-local">).
 <item>ext (<ref id="s-cvs-d-metodos-ext">).
 <item>pserver (<ref id="s-cvs-d-metodos-pserver">).
 <item>fork (<ref id="s-cvs-d-metodos-fork">).
 <item>GSSAPI (<ref id="s-cvs-d-metodos-gssapi">).
</list>
Eles são explicados em detalhes nas sub-seções a seguir.


<sect1 id="s-cvs-d-metodos-local">local
 <p>
Acessa o diretório do repositório diretamente no disco local. 
A vantagem deste método é que não é requerido nem nome nem senha
para acesso (você precisa apenas ter permissões para acesso aos arquivos
que deseja trabalhar) e também não é preciso nenhuma conexão de rede. 
 <p>
Este método é ideal para trabalhar na máquina local ou com os arquivos 
administrativos do CVS existentes no diretório <file>CVSROOT</file> 
do repositório. É muito útil também para configurar outros métodos de 
acesso, como o <tt>pserver</tt>.
 <p>
Para criar seu repositório, veja <ref id="s-cvs-p-mkrepos">.


<sect2 id="s-cvs-d-metodos-local-c">Configurando o método local
 <p>
Para utilizar o método de acesso local, basta definir a variável
<var>CVSROOT</var> da seguinte forma (assumindo que o repositório 
esteja instalado em <file>/var/lib/cvs</file>):
<example>
export CVSROOT=/var/lib/cvs

ou 

export CVSROOT=local:/var/lib/cvs

</example>
Depois disso, basta utilizar os comandos normais do <prgn>cvs</prgn> sem 
precisar se autenticar no sistema. Veja os detalhes de utilização dos 
comandos de CVS após o login na seção <ref id="s-cvs-c">.


<sect1 id="s-cvs-d-metodos-fork">fork
 <p>
Este método é semelhante ao local, mas ele "simula" uma conexão de rede com 
o servidor. É muito usado para fins de testes. 


<sect2 id="s-cvs-d-metodos-fork-c">Configurando o método fork
 <p>
Para utilizar o método de acesso <em>fork</em>, basta definir a variável
<var>CVSROOT</var> da seguinte forma (assumindo que o repositório 
esteja instalado em <file>/var/lib/cvs</file>):
<example>
export CVSROOT=fork:/var/lib/cvs

</example>
Depois disso, basta utilizar os comandos normais do <prgn>cvs</prgn>, sem 
precisar se autenticar no sistema. Veja os detalhes de utilização dos comandos 
do CVS após o login em <ref id="s-cvs-c">.


<sect1 id="s-cvs-d-metodos-ext">ext
 <p>
Este método de acesso lhe permite especificar um programa externo que será 
usado para fazer uma conexão remota com o servidor <prgn>cvs</prgn>.Este programa 
é definido na variável <var>CVS_RSH</var> e caso não ela seja especificada 
o padrão é <prgn>rsh</prgn>.
 <p>
Este método requer que o usuário possua um login/senha no banco de dados 
de autenticação <file>/etc/passwd</file> do servidor de destino. Suas 
permissões de acesso ao CVS (leitura/gravação) serão as mesmas definidas 
neste arquivo. 
 <p>
O uso do acesso criptografado via <prgn>ssh</prgn> é possível definindo o 
programa <prgn>ssh</prgn> na variável <var>CVS_RSH</var>. Veja os exemplos 
a seguir em <ref id="s-cvs-d-metodos-ext-c">.
 <p>
Para criar seu repositório, veja <ref id="s-cvs-p-mkrepos">.


<sect2 id="s-cvs-d-metodos-ext-c">Configurando o método ext
 <p>
Defina a variável <var>CVSROOT</var> da seguinte forma para 
utilizar este método de acesso (assumindo <file>/var/lib/cvs</file>
como repositório):
<example>
export CVSROOT=:ext:conta@servidor.org.br:/var/lib/cvs
cvs login

</example>
A "conta" é uma conta de usuário existente no servidor remoto 
(por exemplo, <tt>gleydson</tt>) seguido do nome do servidor 
remoto (separado por uma "@"). Por exemplo para acessar o 
servidor <em>cvs.cipsga.org.br</em> usando a conta 
<em>michelle</em>:
<example>
export CVSROOT=:ext:michelle@cvs.cipsga.org.br:/var/lib/cvs
cvs checkout

</example>
OBS: A senha via método de acesso "ext" será pedida somente uma vez 
quando for necessário o primeiro acesso ao servidor remoto. Veja os detalhes de 
utilização dos comandos de CVS após o login na seção 
<ref id="s-cvs-c">. O uso mais freqüente do <tt>ext</tt> é para 
conexões seguras feitas via <prgn>ssh</prgn>, feita da seguinte
forma: 
<example>
export CVS_RSH=ssh
export CVSROOT=:ext:michelle@cvs.cipsga.org.br:/var/lib/cvs
cvs checkout

</example>
O acesso de leitura/gravação do usuário, é definido de acordo com as 
permissões deste usuário no sistema. Uma maneira recomendada é 
definir um grupo que terá acesso a gravação no CVS e adicionar usuários
que possam fazer gravação neste grupo.
<![ %OBS [ 
 <p>
<strong>OBS1: </strong> O acesso via <prgn>ssh</prgn> traz a vantagem de 
que as senhas trafegarão de forma segura via rede, não sendo facilmente
capturadas por sniffers e outros programas de monitoração que possam 
estar instalados na rota entre você e o servidor.
 <p>
<strong>OBS2: </strong> É possível especificar a senha na variável 
<var>CVSROOT</var> usando a sintaxe semelhante a usada no ftp:
<example>
export CVSROOT=:ext:michelle:senha@cvs.cipsga.org.br:/var/lib/cvs

</example>
Entretanto isto não é recomendado, pois os processos da máquina poderão 
capturar facilmente a senha (incluindo usuários normais, caso a máquina
não esteja com patches de restrições de acesso a processos configurada, 
que é o padrão em quase todas as distribuições de <prgn>Linux</prgn>).
]]>


<sect1 id="s-cvs-d-metodos-pserver">pserver (password server)
 <p>
Este é um método de acesso remoto que utiliza um banco de dados de usuários 
senhas para acesso ao repositório. A diferença em relação ao método de acesso 
<em>ext</em> é que o <em>pserver</em> roda através de um servidor próprio 
na porta 2401. O acesso dos usuários (leitura/gravação) no repositório pode 
ser feita tanto através do banco de dados de usuários do sistema 
(<file>/etc/passwd</file>) como através de um banco de dados separado 
por repositório.
 <p>
A grande vantagem deste segundo método é que cada projeto poderá ter membros
com acessos diferenciados; o membro x poderá ter acesso ao projeto <tt>sgml</tt> 
mas não ao projeto <tt>focalinux</tt>; ou o usuário y poderá ter acesso de 
gravação (para trabalhar no projeto <tt>focalinux</tt>) mas somente acesso 
de leitura ao projeto <tt>sgml</tt>. 
 <p>
Este é o método de acesso preferido para a criação de usuários anônimos
(uma vez que o administrador de um servidor que hospede muitos projetos não vai 
querer abrir um acesso anônimo via <tt>ext</tt> para todos os projetos). 
 <p>
Também existe a vantagem que novos membros do projeto e tarefas administrativas 
são feitas por qualquer pessoa que possua acesso de gravação aos arquivos do 
repositório.


<sect1 id="s-cvs-d-metodos-pserver-c">Configurando um servidor pserver

<sect2 id="s-cvs-d-metodos-pserver-c-pserver">Ativando o servidor pserver
 <p>
Para ativar o pserver (caso ainda não o tenha feito). Execute o comando 
<tt>dpkg-reconfigure cvs</tt> e selecione a opção <tt>Ativar o servidor pserver</tt>.
Uma maneira de fazer isso automaticamente é modificando o arquivo 
<file>/etc/inetd.conf</file> adicionando a seguinte linha: 
<example>
# na Debian
cvspserver      stream  tcp     nowait.400      root    /usr/sbin/tcpd /usr/sbin/cvs-pserver

# em outras Distribuições 
cvspserver  stream  tcp  nowait  root  /usr/bin/cvs cvs -f --allow-root=/var/lib/cvs pserver
</example>
Na <prgn>Debian</prgn>, o cvs é iniciado através do script <file>/usr/sbin/cvs-pserver</file> que checa os binários e executa o <prgn>cvs</prgn> para todos os repositórios 
especificados no arquivo <file>/etc/cvs-pserver.conf</file>.
 <p>
Caso precise adicionar mais repositórios para acesso via <em>pserver</em> ou outro
método de acesso, veja <ref id="s-cvs-p-mkrepos">. 
 <p>
Você também poderá executar o método <tt>pserver</tt> sob um usuário que não
seja o root, para isto, modifique a entreada referênte ao usuário.grupo no
<file>inetd.conf</file> e tenha certeza que o daemon consegue fazer as operações
de suid/sgid no diretório onde o repositório se encontra.


<sect2 id="s-cvs-d-metodos-pserver-c-system">Servidor pserver usando autenticação do sistema
 <p>
Para usar o banco de dados de autenticação do sistema (<file>/etc/passwd</file>) para 
autenticar os usuários remotos, primeiro tenha certeza que o servidor 
<em>pserver</em> está ativado (como descrito em <ref id="s-cvs-d-metodos-pserver-c-pserver">. Repetindo o exemplo anterior, a usuária <em>Michelle</em> deverá ter 
uma conta em <file>/etc/passwd</file> para fazer acesso ao cvs:
<example>
export CVSROOT=:pserver:michelle@cvs.cipsga.org.br:/var/lib/cvs
cvs login

</example>
Será pedido a senha da usuária <tt>michelle</tt>. Entrando com a senha 
correta, o sistema retornará para o aviso de comando. Uma mensagem 
será mostrada caso a senha entrada seja incorreta. Daqui em diante, 
o resto da seção CVS é normal e você terá as permissões de acesso 
ao repositório de acordo com as suas permissões de acesso naquele 
diretório. 
<![ %OBS [ 
 <p>
<strong>OBS1: </strong> A senha poderá ser passada junto com o login da mesma 
forma como o ftp. Veja a observação em <ref id="s-cvs-d-metodos-ext-c">. 
 <p> 
<strong>OBS2: </strong> A desvantagem do método pserver padrão é que a seção 
é feita em texto plano, desta forma, alguns cuidados podem ser tomados 
para tornar o sistema um pouco mais seguro. Um deles é dar <file>/bin/false</file>
como shell de usuário (para desativar o login no sistema) ou usar o método 
de acesso descrito em <ref id="s-cvs-d-metodos-pserver-c-system"> em combinação 
com este. Tenha conciencia das influências disso se a máquina for usada para 
outras tarefas, como um servidor "pop3" por exemplo. ]]>


<sect2 id="s-cvs-d-metodos-pserver-c-pwrepos">Servidor pserver com autenticação própria
 <p>
Esta forma de acesso armazena os usuários em um banco de dados próprio, não 
requerendo a criação de contas locais no arquivo <file>/etc/passwd</file>. 
Para criar um servidor deste tipo siga os seguintes procedimentos:
<enumlist compact>
 <item>
Exporte a variável <var>CVSROOT</var> apontando para o repositório que deseja 
configurar o acesso. Como isto é uma configuração administrativa, assumo o método de 
acesso <em>local</em> sendo usada pelo usuário administrador do servidor: 
<tt>export CVSROOT=/var/lib/cvs</tt>.

 <item>
Crie um diretório para trabalhar nos arquivos administrativos do 
repositório: <tt>mkdir /tmp/repos</tt>

 <item>
Entre no diretório criado acima e execute o comando: <tt>cvs checkout .</tt>

 <item>
Quando terminar de baixar os arquivos, entre no subdiretório <file>CVSROOT</file>, 
os arquivos de configuração do repositório se encontram lá (para detalhes sobre 
cada um destes arquivos, veja <ref id="s-cvs-cvsroot">.

 <item>
Edite o arquivo <file>config</file> e mude a variável <var>SystemAuth</var> para 
<tt>no</tt>. Isto diz ao servidor <em>pserver</em> não usar os arquivos de 
autenticação do sistema, mas a invés disso usar seu banco de dados próprio.
 <p>
Em algumas instalações, caso exista o arquivo <file>passwd</file> no repositório, 
o <em>pserver</em> automaticamente o utiliza ao invés do <file>/etc/passwd</file>. 

 <item>
Crie um arquivo <file>passwd</file> no diretório <file>CVSROOT</file> o formato 
deste arquivo é:
<example>
usuario:senha:usuario_local

</example>
Onde:
<taglist compact>
 <tag>usuario</tag>
  <item>
Nome da conta de usuário que fará acesso ao CVS. 

 <tag>senha</tag>
  <item>
Senha que será usada pelo usuário. Ela deverá ser criptografada usando o 
algoritmo crypt. O comando <prgn>mkpasswd senha</prgn> pode ser usado para 
gerar a senha criptografada. Caso este campo seja deixado em branco, nenhuma 
senha de usuário será utilizada. O utilitário <prgn>mkpasswd</prgn> 
está presente no pacote <package>whois</package> na <prgn>Debian</prgn>.

 <tag>usuario_local</tag>
  <item>
Usuário local que terá suas permissões mapeadas ao usuário do CVS. Como a 
conta de usuário do <prgn>cvs</prgn> não existe no sistema, é necessário que 
o sistema tenha uma maneira de saber que nível de acesso este usuário terá. 
Caso não crie este usuário ou ele seja inválido, você terá erros do tipo 
": no such user" no momento que fizer o "cvs login".
 <p>
Uma forma segura de se fazer isto, é criar uma conta de usuário *somente* com
acesso aos arquivos do CVS, sem shell e senha. Isto permitirá 
mapear a UID/GID do usuário criado com o acesso do CVS sem comprometer a 
segurança do sistema de arquivos. Isto pode ser feito 
através do seguinte comando: 
<example>
adduser --disabled-password --disabled-login usuario
</example>
É necessário especificar um diretório home do usuário, pois o servidor 
cvs precisa ter acesso ao arquivo <file>/home/do/cvs/.cvsignore</file>.

<![ %OBS [
 <p>
<strong>OBS1: </strong> Mais uma vez: Leve sempre em conta a forma que os outros 
serviços em sua máquina estão configurados (como eles fazem acesso, permissões 
de acesso, diretórios onde gravam arquivos, são algumas delas) antes de escolher como 
um serviço novo na máquina funcionará. Isto poderá modificar ou deixar 
vulnerável a segurança de sua instalação.
 <p>
<strong>OBS2: </strong> Permita que os usuários <strong>somente</strong>
tenham acesso a máquina via CVS.
 <p>
<strong>OBS3: </strong> Certifique-se sempre que o dono/grupo do repositório 
seja <tt>root.src</tt> (ou outro grupo que tenha criado) adicione 
somente usuários de confiança no grupo <file>src</file> para criar novos
projetos.
]]>
 <p>
Exemplos:
<example>
gleydsonm:K32dk1234k:cvsuser
anonymous::pooruser

</example>
O usuário cvs <em>gleydsonm</em> quando logar no cvs, terá as permissões de 
acesso do usuário <em>cvsuser</em> do sistema. 

<![ %OBS [
 <p>
<strong>OBS1: </strong> Certifique-se que o usuário local possui permissões de 
gravação no diretório do CVS, caso contrário ele não poderá fazer <em>commits</em>.
Lembre-se que as permissões de leitura/gravação do usuário serão controladas 
através de arquivos do próprio pserver, mas também é necessária a permissão de 
gravação do usuário no repositório. Isto poderá ser feito através de grupos 
de sistema e garante uma dupla camada de segurança. 
 <p>
<strong>OBS2:</strong> Caso tenha preferido usar o <tt>pserver</tt> sob um
usuário diferente de root e esteja obtendo a mensagem 
<tt>setgid failed: Operation not permitted</tt>, significa que o servidor 
CVS não consegue mudar para o grupo referente ao usado no diretório do 
repositório. Verifique se as permissões estão adequadas e se o grupo 
do usuário CVS no <file>/etc/passwd</file> é o mesmo que especificou para 
acesso ao repositório. ]]>
</taglist>

 <item>
Para dar direito de leitura ao repositório, crie um arquivo chamado 
<file>readers</file> e adicione os nomes de usuários que terão acesso
ao repositório (um por linha). O nome que deverá ser usado é o nome 
do usuário de <em>CVS</em> e não do sistema (usuário <tt>gleydsonm</tt>,
 segundo o exemplo). 
 <p>
Exemplo:
<example>
gleydsonm
anonymous

</example>

<item>
Para dar direito de gravação ao repositório, crie um arquivo chamado 
<file>writers</file>. Seu formato é idêntico ao arquivo <file>readers</file>.
 <p>
Exemplo:
<example>
gleydsonm
macan
otavio
hmh
kov

</example>

<item>
Pronto, o acesso a CVS usando um banco de dados próprio está pronto! basta dar o 
commit nos arquivos, adicionar os arquivos <file>readers</file>, <file>writers</file>
e <file>passwd</file> no repositório (veja <ref id="s-cvs-p-add">) para o servidor de 
CVS para te-lo funcionando. Note que em versões mais novas do CVS, não 
é possível transferir o arquivo <file>passwd</file> via rede, então 
será necessário cria-lo manualmente dentro do repositório do servidor.
<![ %OBS [
 <p>
<strong>OBS: </strong> O arquivo <file>passwd</file> não é transferido pelo 
commit por motivos de segurança, pois ele contém senhas que podem ser 
capturadas e usada por pessoas maliciosas. Será necessário transferi-lo 
manualmente para o repositório do servidor remoto (você terá que ser o 
usuário <em>root</em> ou ter permissões adequadas). O recomendável é 
utilizar o <prgn>scp</prgn> <![ %CAPJUNTOS [ (<ref id="s-ssh-cliente-scp">) ]]> 
para realizar transferências seguras.
]]>.


</enumlist>
O método de acesso do CVS aos arquivos <file>readers</file> e 
<file>writers</file> é restritiva, portanto se um nome de 
usuário existir no arquivo <file>readers</file> e <file>writers</file> o que 
valerá será o menor nível de acesso. Vendo os exemplos acima, os usuários
<em>gleydsonm e anonymous</em> terão somente acesso a leitura do repositório e 
<em>macan, otavio, hmh, kov</em> acesso de leitura e gravação. 


<sect1 id="s-cvs-d-metodos-gssapi">gssapi
 <p>
Quando o CVS é compilado com o suporte a Kerberos 5, ele tenta estabelecer 
automaticamente uma conexão segura usando este método. Este método 
funciona somente se o CVS estiver compilado com o suporte a Kerberos
(opção <tt>--with-gssapi</tt>).

