# Guia do Linux/Avançado/CVS/Servidor de CVS - configurando métodos de acesso ao repositório
## Servidor de CVS - configurando métodos de acesso ao repositório

O CVS é uma aplicação cliente/servidor, possuindo diversas maneiras de fazer o acesso seu repositório (veja [#s-s-cvs-p-repos Repositório, Seção 17.3.1] repositórios). Estes métodos são os seguintes:
* local ([#s-s-cvs-d-metodos-local local, Seção 17.2.1]).
* ext ([#s-s-cvs-d-metodos-ext ext, Seção 17.2.3]).
* pserver ([#s-s-cvs-d-metodos-pserver pserver (password server), Seção 17.2.4]).
* fork ([#s-s-cvs-d-metodos-fork fork, Seção 17.2.2]).
* GSSAPI ([#s-s-cvs-d-metodos-gssapi gssapi, Seção 17.2.6]).
Eles são explicados em detalhes nas sub-seções a seguir.

### local

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.
Este método é ideal para trabalhar na máquina local ou com os arquivos administrativos do CVS existentes no diretório CVSROOT do repositório. É muito útil também para configurar outros métodos de acesso, como o pserver.
Para criar seu repositório, veja [#s-s-cvs-p-mkrepos Criando um repositório, Seção 17.3.2].

#### Configurando o método local

Para utilizar o método de acesso local, basta definir a variável CVSROOT da seguinte forma (assumindo que o repositório esteja instalado em /var/lib/cvs):
Depois disso, basta utilizar os comandos normais do cvs sem precisar se autenticar no sistema. Veja os detalhes de utilização dos comandos de CVS após o login na seção [#s-s-cvs-c Clientes de CVS, Seção 17.5].

### fork

Este método é semelhante ao local, mas ele "simula" uma conexão de rede com o servidor. É muito usado para fins de testes.

#### Configurando o método fork

Para utilizar o método de acesso fork, basta definir a variável CVSROOT da seguinte forma (assumindo que o repositório esteja instalado em /var/lib/cvs):
Depois disso, basta utilizar os comandos normais do cvs, sem precisar se autenticar no sistema. Veja os detalhes de utilização dos comandos do CVS após o login em [#s-s-cvs-c Clientes de CVS, Seção 17.5].

### ext

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

#### Configurando o método ext

Defina a variável CVSROOT da seguinte forma para utilizar este método de acesso (assumindo /var/lib/cvs como repositório):
A "conta" é uma conta de usuário existente no servidor remoto (por exemplo, gleydson) seguido do nome do servidor remoto (separado por uma "@"). Por exemplo para acessar o servidor cvs.cipsga.org.br usando a conta michelle:
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 [#s-s-cvs-c Clientes de CVS, Seção 17.5]. O uso mais frequente do ext é para conexões seguras feitas via ssh, feita da seguinte forma:
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.
OBS1: O acesso via ssh 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.
OBS2: É possível especificar a senha na variável CVSROOT usando a sintaxe semelhante a usada no ftp:
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 Linux).

### pserver (password server)

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 ext é que o pserver 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 (/etc/passwd) como através de um banco de dados separado por repositório.
A grande vantagem deste segundo método é que cada projeto poderá ter membros com acessos diferenciados; o membro x poderá ter acesso ao projeto sgml mas não ao projeto focalinux; ou o usuário y poderá ter acesso de gravação (para trabalhar no projeto focalinux) mas somente acesso de leitura ao projeto sgml.
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 ext para todos os projetos).
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.

### Configurando um servidor pserver
#### Ativando o servidor pserver

Para ativar o pserver (caso ainda não o tenha feito). Execute o comando dpkg-reconfigure cvs e selecione a opção Ativar o servidor pserver. Uma maneira de fazer isso automaticamente é modificando o arquivo /etc/inetd.conf adicionando a seguinte linha:
Na Debian, o cvs é iniciado através do script /usr/sbin/cvs-pserver que checa os binários e executa o cvs para todos os repositórios especificados no arquivo /etc/cvs-pserver.conf.
Caso precise adicionar mais repositórios para acesso via pserver ou outro método de acesso, veja [#s-s-cvs-p-mkrepos Criando um repositório, Seção 17.3.2].
Você também poderá executar o método pserver sob um usuário que não seja o root, para isto, modifique a entreada referênte ao usuário.grupo no inetd.conf e tenha certeza que o daemon consegue fazer as operações de suid/sgid no diretório onde o repositório se encontra.

#### Servidor pserver usando autenticação do sistema

Para usar o banco de dados de autenticação do sistema (/etc/passwd) para autenticar os usuários remotos, primeiro tenha certeza que o servidor pserver está ativado (como descrito em [#s-s-cvs-d-metodos-pserver-c-pserver Ativando o servidor pserver, Seção 17.2.5.1]. Repetindo o exemplo anterior, a usuária Michelle deverá ter uma conta em /etc/passwd para fazer acesso ao cvs:
Será pedido a senha da usuária michelle. 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.
OBS1: A senha poderá ser passada junto com o login da mesma forma como o ftp. Veja a observação em [#s-s-cvs-d-metodos-ext-c Configurando o método ext, Seção 17.2.3.1].
OBS2: 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 /bin/false como shell de usuário (para desativar o login no sistema) ou usar o método de acesso descrito em [#s-s-cvs-d-metodos-pserver-c-system Servidor pserver usando autenticação do sistema, Seção 17.2.5.2] 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.

#### Servidor pserver com autenticação própria

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 /etc/passwd. Para criar um servidor deste tipo siga os seguintes procedimentos:
* Exporte a variável CVSROOT apontando para o repositório que deseja configurar o acesso. Como isto é uma configuração administrativa, assumo o método de acesso local sendo usada pelo usuário administrador do servidor: export CVSROOT=/var/lib/cvs.
* Crie um diretório para trabalhar nos arquivos administrativos do repositório: mkdir /tmp/repos
* Entre no diretório criado acima e execute o comando: cvs checkout .
* Quando terminar de baixar os arquivos, entre no subdiretório CVSROOT, os arquivos de configuração do repositório se encontram lá (para detalhes sobre cada um destes arquivos, veja [#s-s-cvs-cvsroot Arquivos administrativos em CVSROOT, Seção 17.4].
* Edite o arquivo config e mude a variável SystemAuth para no. Isto diz ao servidor pserver não usar os arquivos de autenticação do sistema, mas a invés disso usar seu banco de dados próprio.
Em algumas instalações, caso exista o arquivo passwd no repositório, o pserver automaticamente o utiliza ao invés do /etc/passwd.
* Crie um arquivo passwd no diretório CVSROOT o formato deste arquivo é:
Onde:

##### usuario

    Nome da conta de usuário que fará acesso ao CVS.

##### senha

    Senha que será usada pelo usuário. Ela deverá ser criptografada usando o algoritmo crypt. O comando mkpasswd senha 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 mkpasswd está presente no pacote whois na Debian.

##### usuario_local

    Usuário local que terá suas permissões mapeadas ao usuário do CVS. Como a conta de usuário do cvs 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".
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:
É necessário especificar um diretório home do usuário, pois o servidor cvs precisa ter acesso ao arquivo /home/do/cvs/.cvsignore. OBS1: 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. OBS2: Permita que os usuários somente tenham acesso a máquina via CVS. OBS3: Certifique-se sempre que o dono/grupo do repositório seja root.src (ou outro grupo que tenha criado) adicione somente usuários de confiança no grupo src para criar novos projetos. Exemplos:
O usuário cvs gleydsonm quando logar no cvs, terá as permissões de acesso do usuário cvsuser do sistema. OBS1: 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 commits. 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. OBS2: Caso tenha preferido usar o pserver sob um usuário diferente de root e esteja obtendo a mensagem setgid failed: Operation not permitted, 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 /etc/passwd é o mesmo que especificou para acesso ao repositório.
* Para dar direito de leitura ao repositório, crie um arquivo chamado readers 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 CVS e não do sistema (usuário gleydsonm, segundo o exemplo).
Exemplo:
* Para dar direito de gravação ao repositório, crie um arquivo chamado writers. Seu formato é idêntico ao arquivo readers.
Exemplo:
* Pronto, o acesso a CVS usando um banco de dados próprio está pronto! basta dar o commit nos arquivos, adicionar os arquivos readers, writers e passwd no repositório (veja [#s-s-cvs-p-add Adicionando um arquivo ao módulo CVS do servidor, Seção 17.3.9]) 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 passwd via rede, então será necessário cria-lo manualmente dentro do repositório do servidor.
OBS: O arquivo passwd 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 root ou ter permissões adequadas). O recomendável é utilizar o scp ([ch-s-ssh.html#s-s-ssh-cliente-scp scp, Seção 15.2.2]) para realizar transferências seguras. . O método de acesso do CVS aos arquivos readers e writers é restritiva, portanto se um nome de usuário existir no arquivo readers e writers o que valerá será o menor nível de acesso. Vendo os exemplos acima, os usuários gleydsonm e anonymous terão somente acesso a leitura do repositório e macan, otavio, hmh, kov acesso de leitura e gravação.

### gssapi

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 --with-gssapi).