Um guia para os iniciantes no mundo do FreeBSD
Introdução ao SSH.
É de conhecimento comum que a utilização do telnet para acessar hosts remotos é extremamente insegura.A melhor alternativa é substituir o uso do telnet pelo uso do SSH, que criptografa todos os dados enviados ao host utilizando o metodo de criptografia de chave publica, muito semelhante ao utilizado pelo pgp.
Através desse metodo voce gera duas chaves criptográficas, uma chave privada que deve ser mantida em um lugar seguro e uma chave publica, que deve ser amplamente divulgada. Tudo o que for criptografado usando a chave publica so podera ser descriptografada por quem possuir a chave privada correspondente.
As ultimas releases do FreeBSD (4.1 e 4.2) trazem o OpenSSH como parte integrante da instalação default. Esse tutorial por sua vez foi baseado no ssh 1.2.27 , logo podem existir algumas diferenças na forma de uso caso voce opte pelo openssh, nada que uma consulta ao man nao resolva ;-).
Os principais arquivos do SSH são os seguintes:
| sshd | - Daemon do SSH |
| sshd_config | - Arquivo de configuraçao do sshd |
| ssh-keygen | - Utilitario para gerar o par de chaves publica/privada |
| ssh-agent | - Agente de autenticação para troca de chaves RSA |
| ssh-add | - Utilitario para adicionar uma chave privada ao pool de chave disponiveis ao ssh-agent |
| ssh | - Client SSH |
| ssh_config | - Arquivo de configuração do ssh |
| scp | - Utilitario para transferencia de arquivos de forma segura |
| slogin | - Versao segura do rlogin |
Quando voce executar o ssh pela primeira vez ele ira criar um diretorio .ssh dentro do seu diretorio home, nesse diretorio ficarao armazenados por default as suas chaves publica e privada.
Para gerar o seu par de chaves voce deve utilizar o aplicativo ssh-keygen, como no exemplo abaixo:
edson@ebrandi ~ $ ssh-keygen
Generating RSA keys: Key generation complete.
Enter file in which to save the key (/home/edson/.ssh/identity): Pressione ENTER
Created directory '/home/edson/.ssh'.
Enter passphrase (empty for no passphrase): Digite sua senha
Enter same passphrase again: Confirme sua senha
Your identification has been saved in /home/edson/.ssh/identity.
Your public key has been saved in /home/edson/.ssh/identity.pub.
The key fingerprint is:
8c:30:9a:62:80:3b:6c:9d:7f:76:db:96:b7:b8:f8:d5 edson@ebrandi.myip.org
edson@ebrandi ~ $
Após a execução do comando acima, voce terá gerado os arquivos:
| ~/.ssh/identity | - Sua chave privada |
| ~/.ssh/identity.pub | - Sua chave publica |
Agora voce precisa gravar uma copia do arquivo identity.pub no ~/.ssh/ de cada host remoto que voce precisa acessar, mas para que o ssh possa utiliza-lo voce precisa renomea-lo para authorized_keys.Voce pode transferir o arquivo via FTP, ou se for o caso envia-lo por e-mail para o administrador local do host.
Uma vez que voce ja colocou uma copia do authorized_keys em cada host, voce deve utilizar o ssh para se conectar, por exemplo:
edson@ebrandi /usr/home/edson $ ssh edson@10.0.0.1
The authenticity of host '10.0.0.1' can't be established.
RSA key fingerprint is 10:99:f7:b4:fb:e5:ce:bb:bc:de:e8:ad:4f:7d:10:64.
Are you sure you want to continue connecting (yes/no)?yes
Warning: Permanently added '10.0.0.1' (RSA) to the list of known hosts.
Enter passphrase for RSA key 'edson@ebrandi.myip.org': Digite sua senha
Last login: Thu Dec 21 22:18:19 2000 from 10.0.0.1
Copyright (c) 1980, 1983, 1986, 1988, 1990, 1991, 1993, 1994
The Regents of the University of California. All rights reserved.
edson@ebrandi /usr/home/edson $
Como pode ver na primeira conexao o ssh gera um RSA key fingerprint para o host remoto e pergunta se voce deseja adiciona-lo ao seu arquivo ~/.ssh/known_hosts na sequencia ele detecta a presença do arquivo authorized_keys e inicia a autenticaçao via chave RSA.
A senha da chave RSA não precisa ser a mesma utilizada para telnet/ftp, para alterar a sua senha voce deve usar o comando ssh-keygen da seguinte forma:
edson@ebrandi /usr/home/edson $ ssh-keygen -p
Enter file in which the key is (/home/edson/.ssh/identity): Pressione ENTER
Enter old passphrase: Digite sua senha atual
Key has comment 'edson@ebrandi.myip.org'
Enter new passphrase (empty for no passphrase): Digite sua nova senha
Enter same passphrase again: Confirme sua nova senha
Your identification has been saved with the new passphrase.
edson@ebrandi /usr/home/edson $
No dia a dia de um administrador de sistemas ele precisa se logar N! vezes nos servidores e ele pode nao achar muito pratico ficar digitando sua senha a cada conexao, para aqueles que perferem simplificar seu dia a dia existe a possibilidade de usar o ssh-agent em conjunto com o ssh-add para manter a sua chave privada em memoria. Para isso, siga os passos abaixo:
1. Execute o ssh-agent:
edson@ebrandi ~ $ ssh-agent $SHELL
$
2. Carrege a sua chave privada para memoria:
$ ssh-add
Need passphrase for /home/edson/.ssh/identity
Enter passphrase for edson@ebrandi.myip.org: Digite sua senha
Identity added: /home/edson/.ssh/identity (edson@ebrandi.myip.org)
$
3. Verifique se a chave foi carregada corretamente:
$ ssh-add -l
1024 8c:30:9a:62:80:3b:6c:9d:7f:76:db:96:b7:b8:f8:d5 edson@ebrandi.myip.org
$
4. Faça a conexão com o host desejado:
$ ssh edson@10.0.0.1
Last login: Thu Dec 21 22:19:47 2000 from 10.0.0.1
Copyright (c) 1980, 1983, 1986, 1988, 1990, 1991, 1993, 1994
The Regents of the University of California. All rights reserved.
edson@ebrandi /usr/home/edson $
5. Pronto, agora voce ja pode se conectar a qualquer um dos seus hosts remotos de forma segura e sem fornecer uma senha. Quando voce der exit do terminal a sua chave publica sera descarregada da memoria.
Pelo metódo acima voce terá o beneficio das chaves em memoria apenas no terminal onde voce executou o ssh-agent, se voce tiver disponivel o XFree86 em seu desktop é possivel extender essa facilidade a todos os xterm que voce abrir, para isso basta iniciar o X com o comando:
edson@ebrandi ~ $ ssh-agent startx &
O restante do procedimento sera igual, abra um xterm e use o ssh-add para carregar as chaves, depois para qualquer xterm que voce abrir basta se conectar ao host desejado que ele nao vai pedir senha.
Para copiar um arquivo de um host para outro de modo seguro, voce deve utilizar o scp, a sintaxe é a seguinte:
scp arquivo_local seu_login@host_remoto:/algun/diretorio/arquivo_remoto
ou
scp seu_login@host_remoto:/algun/diretorio/arquivo_remoto /algun/dir/arquivo_local, por exemplo:
edson@ebrandi ~ $ scp edson@10.0.0.1:/tmp/teste .
Enter passphrase for RSA key 'edson@ebrandi.myip.org': Digite sua senha
teste 100% |*****************************| 6 00:00
edson@ebrandi ~ $
De novo se voce estiver usando o ssh-agent o processo acima nao vai lhe pedir senha.
Algumas vezes precisamos exportar o display de alguma aplicaçao X para um server remoto, o que tambem é extremamente inseguro, uma vez que existem dezenas de snoops de tela disponiveis na rede. Uma boa solução para esse problema é tunelar o trafego X11 entre os hosts via ssh. Para isso basta que voce siga os passos abaixo:
1. Verifique se o seu arquivo /usr/local/etc/sshd_config possui as linhas abaixo:
X11Forwarding yes
X11DisplayOffset 10
Se nao possuir ou se estiver diferente, altere o arquivo para que as linhas fiquem como mostrado acima.
2. Verifique se o seu arquivo /usr/local/etc/ssh_config possui a linha abaixo:
ForwardX11 yes
Se nao possuir ou se estiver comentado, ltere o arquivo para que a linha fique como mostrado acima.
3. Agora sempre que voce precisar exportar o DISPLAY de um aplicativo X, ao invés de exportar para:
export DISPLAY=seu_ip:0.0 , por ex: export DISPLAY=10.0.0.2:0.0
Voce deve logar via ssh e executar o seguinte comando para exportar o display:
export DISPLAY=127.0.0.1:10
Dessa forma voce ira usar um tunel ssh entre os dois hosts e vai acessar de forma segura o aplicativo grafico remoto.
Da mesma forma como voce pode tunelar o Dispaly do X, voce pode redirecionar de forma segura qualquer porta do client para o servidorvia ssh. para isso basta seguir os passos abaixo:
1. Verifique se o seu arquivo /usr/local/etc/sshd_config possui a linha abaixo:
AllowTcpForwarding yes
Caso ele não possua insira a linha acima e restart o sshd.
2. Voce deve se logar no server desejado usando o ssh a sintaxe para usar o tcp forward é:
$ ssh -L porta_local:nome_servidor_ssh:porta_do_servidor
ou
$ ssh -R porta_local:nome_servidor_ssh:porta_do_servidor
A opção -L redireciona todos os requests que vierem para a porta_local do client para a porta_do_servidor no host remoto
A opção -R redireciona todos os requests que chegarem para a porta_do_servidor do host remoto para a porta_local do Client
Confuso ??? Vamos ver se um exemplo ajuda :-)
Se eu executar o comando:
ssh -L 110:ebrandi.myip.org:110 edson@ebrandi.myip.org
Apos me autenticar, eu posso baixar as minhas mensagens de e-mail via pop3 do servidor ebrandi.myip.org atraves de um canal seguro, simplesmente setando como meu pop3 server 127.0.0.1:110 no meu client pop3. Enquanto eu permanecer conectado o tunel estara funcionando.
Por outro lado se eu executar o comando:
ssh -R 110:ebrandi.myip.org:110 edson@ebrandi.myip.org
Eu vou fazer com que o servidor ebrandi.myip.org, que nao tem serviço na porta 110 , redirecione para a porta 110 do meu desktop, via um canal seguro, todas as requisicoes que chegarem para ele na porta 110. Acho que agora melhorou não ???
Observações:
Sempre utilize chaves RSA com senhas fortes, pois se voce usar senhas fracas e alguem conseguir uma copia do seu arquivo ~/.ssh/identity , é quase certeza que ele tera livre acesso a todas as maquinas que voce administra. Obviamente usar chaves RSA sem senha é suicidio!!!
Verifique se o seu sshd esta configurado para recusar login de contas com uid 0 (root), de contas com senha em branco e para ignorar o .rhosts, para isso basta colocar as opçoes abaixo no sshd_config:
PermitRootLogin no
IgnoreRhosts yes
PermitEmptyPasswords no
Se voce for utilizar port forward , lembre-se que apenas o root pode fazer o forward de portas privilegiadas, ou seja abaixo de 1024.
Leia o man do ssh e do sshd, acredite vale cad minuto que voce perder lendo.
Espero que voces aproveitem esse texto e que a leitura seja tao gratificante para voces como foi para mim escreve-lo, mesmo as 03:00 da madrugada de uma sexta feira :-\ heheheh.
[]'s Edson Brandi
Se você possui alguma critica , duvida ou sugestão ,entre em contato pelo e-mail: edson.brandi@uol.com.br