Sie sind auf Seite 1von 50

Be-a-b do SSH

PabloHess | July 27 2010 | Comments (8) | Visits (16684)

Carssimos leitores, inicio aqui uma srie que h muito tempo eu vinha querendo fazer. O
objetivo apresentar tecnologias disponveis em qualquer sistema GNU/Linux (e
frequentemente tambm em sistemas Unix e assemelhados) a partir do zero, de forma que at
os usurios sem qualquer experincia as compreendam e consigam us-las com facilidade.
Para comear a srie, escolhi meu amado SSH.

Apresentao do SSH
Em poucas palavras, o SSH, ou Secure SHell, um protocolo de comunicao entre dois
pontos que aplica a criptografia em toda a sua extenso. Para explicar de onde vem a
segurana (Secure, lembra?), nada melhor que uma imagem.
Sem criptografia, a comunicao pode ser interceptada e compreendida por bisbilhoteiros mal
intencionados:

Com a criptografia do SSH, bisbilhoteiros sero incapazes de entender o que significam os


dados interceptados:

O que o SSH pode transmitir?


O SSH muito verstil, muito flexvel. Seu propsito bsico permitir que voc, de posse de
uma conta de shell numa mquina, consiga "entrar" (isto , fazer login) nela.
Por exemplo, se voc usa um computador no trabalho e outro em casa, basta ter o SSH
instalado em ambos para, a partir de casa, conseguir entrar no computador do trabalho (e viceversa!). Eu uso o SSH todos os dias para, a partir do trabalho, atualizar o sistema do meu
computador domstico (no uso atualizaes automticas).

At arquivos
Outro uso do SSH a transferncia de arquivos. Sim, com o SSH muito fcil copiar um
arquivo de uma mquina para a outra, sem necessidade de qualquer outro programa instalado.
Na linha de comando, existem dois comandos para usar isso: scp e sftp (este funciona como
o venervel comando ftp, mas sobre o segurssimo SSH). Muito melhor do que ficar
mandando e-mail pra voc mesmo pra depois abrir em casa, certo?

Janelas de programas?!
Sim, o SSH capaz de transmitir uma nica janela de um nico programa (por exemplo, o
Firefox), de uma mquina para outra. Suponhamos que voc esteja no trabalho e precise
descobrir aquele site que voc visitou no fim de semana, pelo computador de casa. S usando
o Firefox de casa voc vai conseguir acessar o histrico, certo? Com o SSH, basta abrir, no
trabalho, o seu firefox de casa. claro que a janela vai demorar um tanto pra abrir e o
navegador no vai ficar muito funcional, mas possvel consultar o histrico para encontrar
aquele site to valioso.

Mos obra
Se voc s tem um nico computador neste momento para testar o SSH, a vai um alerta: o
SSH um protocolo de comunicao, ento brincar com ele s faz sentido com duas ou mais
mquinas. Neste caso, sugiro abrir uma conta SSH gratuita em um dos seguintes servios:
devio.us (preencha todos os campos e use o shell padro, a menos que voc saiba o que est
fazendo) ou cjb.net.
Se voc tiver duas mquinas Linux na mesma rede, nem precisa disso, pois o Linux j traz o
SSH instalado (ou pronto para instalar pelos repositrios) por padro.

Exerccio 1
Para nosso primeiro exerccio, vamos nomenclatura: cliente o computador local. Voc vai
usar o computador local para acessar um computador remoto. Em contrapartida, servidor o
computador remoto, que ficar com a porta 22 TCP (a porta padro do protocolo SSH)
escutando a rede, espera de conexes.
Como vamos fazer vrios tipos de exerccios, bom j instalar os pacotes de servidor e cliente
em todas as mquinas envolvidas. Para isso, confira no seu gerenciador/instalador de
pacotes os pacotes openssh-server e openssh-client e certifique-se de instalar aqueles
necessrios para o servidor e o cliente (geralmente, bastam esses dois citados).
Se voc preferiu usar um servidor daqueles gratuitos, no necessrio instalar nenhum pacote
nele.
Aps a instalao de todos os pacotes, vamos comear agindo como clientes. Digite o
comando:
ssh nome_de_usurio@servidor

Servidores pblicos gratuitos


Por exemplo, eu uso o servio devio.us, onde me cadastrei com o usurio fulano. O comando
que eu uso para entrar na minha conta do devio.us :
ssh fulano@devio.us

Ao pressionar ENTER, o resultado algo assim:


The authenticity of host 'devio.us (66.7.199.108)' can't be established.
RSA key fingerprint is d4:d3:fd:33:24:d3:e1:94:97:c3:52:21:3b:ee:b4:e9.
Are you sure you want to continue connecting (yes/no)?

Isso aparece porque a primeira vez que voc se conecta a esse servidor. Responda y e
pressione ENTER. O resultado ser:
fulano@devio.us's password:

Digite a senha que voc cadastrou no servio e depois pressione ENTER. O resultado, depois
de algumas linhas de anncios (somente nos servidores gratuitos citados):
fulano@wolfman $

No caso wolfman o nome da mquina remota (hospedada no devio.us). Isto significa que
voc est num shell de um computador que nem sabe onde se localiza!

Servidores prprios
Se voc dispe de duas mquinas com GNU/Linux e j instalou os pacotes de cliente e
servidor em ambas, pode simplesmente sentar-se em frente a uma e conectar-se outra.
Supondo que a mquina sua frente se chame comp-a e a outra mquina se chame comp-b,
use em comp-a o seguinte comando:
ssh fulano@comp-b

Claro que fulano deve ser trocado pelo seu nome de usurio em comp-b. Este comando
significa: abra um shell na mquina comp-b usando para isso o usurio fulano.
Fornea a senha do usurio fulano em comp-b e voc ver um shell do comp-b na tela do
comp-a.

Usurios diferentes
Suponha que em comp-a o seu usurio se chame pablo, e em comp-b ele se chame phess.
Como fazer para entrar do comp-a no comp-b? Lembre-se: sempre use o nome do usurio
remoto.
4

Ento, nesse caso, o comando para entrar como usurio phess em comp-b :
ssh phess@comp-b

Minha rede s tem IPs


Em redes domsticas, muito comum no existir um servidor DNS para transformar os
nomes em nmeros IP. Ento, cada computador s capaz de encontrar os demais por meio
de seus IPs.
Se voc estiver em frente ao computador com IP 10.0.0.1 e quiser acessar o computador com
IP 10.2.2.2 na conta do usurio pablo, o comando a ser digitado no computador com IP
10.0.0.1 :
ssh pablo@10.2.2.2

Simples, no?

Comandos remotos
Note que o shell remoto funciona exatamente como o shell local. Voc pode usar todos os
comandos que quiser, pois, neste ponto, no h diferena entre estar fisicamente em frente ao
computador remoto ou estar ligado a ele por SSH.
por isso que o SSH a ferramenta preferida de qualquer pessoa que tenha que administrar
outras mquinas distncia.
Experimente os comandos ls, uname -a, ifconfig -a, ping ou outros que voc use com
frequncia. Experimente pingar a sua mquina local a partir da mquina remota. Mas cuidado
para no dar um n na sua cabea! :)

Logout
Ao final da brincadeira, para sair basta pressionar CTRL+D ou digitar logout ou exit. Com
isso, voc fecha a conexo mquina remota e retorna ao shell local. Gostou da viagem?
Ento deixe seu comentrio abaixo e aguarde o prximo captulo desta srie sobre o poderoso
SSH.

Cpia de arquivos
Quando voc est no trabalho e decide que precisa ter determinado arquivo em casa, como
voc faz?
5

Se voc costuma usar um pen drive como meio de transporte, ou enviar um e-mail para sua
prpria conta, no se envergonhe. Estas so as solues usadas pela maioria das pessoas.
No entanto, se voc l os blogs do IBM developerWorks, suponho que voc tenha interesse
em fazer o melhor uso possvel da tecnologia, e no permanecer com os hbitos mais comuns
e menos eficientes.
Vamos ver agora como o nosso querido SSH pode ajudar a copiar arquivos diretamente de um
local para outro, sem recorrer a pen drives, e-mails ou qualquer outro intermedirio.

SCP
O primeiro comando de cpia do SSH o scp. Seu nome vem de Secure copy, e ele funciona
de forma muito semelhante ao comando cp.
Vamos voltar ao cenrio proposto no incio deste artigo: voc est no trabalho (computador
chamado trab), encontra uma imagem perfeita para usar como papel de parede e grava-a
localmente com o nome imagem.jpg na pasta /home/ftal/. O objetivo usar essa imagem
no computador de casa (chamado casa), pois no trabalho o papel de parede infelizmente tem
que ser o logo da empresa... :)
Nota: Para estas instrues, fundamental que o servidor SSH esteja instalado e em
funcionamento nos dois computadores: trab e casa.
Suponhamos ainda que o seu usurio, no trabalho, seja ftal (de Fulano de Tal) e, no
computador de casa, seja fulano.
Abra um shell no computador do trabalho e digite o comando:
[ftal@trab ~]$ scp imagem.jpg fulano@casa:~/

Este comando diz: copie o arquivo local imagem.jpg para o usurio fulano no computador
casa, no diretrio ~/ (um atalho para o diretrio home do usurio fulano).
Quando for pedida a senha, fornea a senha que o usurio fulano usa no computador casa.

Vamos conferir?
sempre bom conferir se as cpias que fizemos de fato ocorreram conforme esperado.
Para isso, vamos voltar a entrar na mquina remota (agora, a mquina remota o computador
de casa):
[ftal@trab ~]$ ssh fulano@casa
fulano@casa's password:

Preencha a senha do usurio fulano no computador casa para completar seu login remoto e
visualizar o prompt do computador casa:
[fulano@casa ~]$ _

Puxa, j vi que o usurio fulano no computador casa no leu o post sobre como deixar seu
prompt do Bash mais til e bonito. ;)
Agora, liste o contedo do diretrio home desse usurio:

ls

Veja que o arquivo imagem.jpg est l. Caso contrrio, ocorreu algum erro na cpia. Repita
alguns passos e veja se aparece alguma mensagem de erro, at corrigir o problema.
Depois de confirmar que tudo correu certo, pode sair do computador de casa.
[fulano@casa ~]$ logout

Cpia para outro diretrio


Se voc j tem uma pasta onde guarda todos os seus papis de parede (por exemplo, eu uso
~/temas/backgrounds/ para isso), pode us-la diretamente no comando, da seguinte forma:
[ftal@trab ~]$ scp imagem.jpg fulano@casa:~/temas/backgrounds/

Viu? Funciona exatamente como o comando cp.

Agora ao contrrio!
Se voc estava trabalhando muito e no deu tempo de enviar o arquivo gravado para o
computador de casa, no se aflija. Contanto que o computador do trabalho esteja ligado, basta
usar o mesmo scp a partir do computador de casa:
[fulano@casa ~] scp ftal@trab:~/imagem.jpg temas/backgrounds/

Viu s? De uma nica vez, copiamos o arquivo imagem.jpg que estava no home do usurio
ftal no computador trab para a pasta temas/backgrounds/ no home do usurio fulano na
mquina local. Nada mal para um comando de trs letras. :)
Se voc quisesse copiar o arquivo remoto para a pasta atual:
[fulano@casa ~] scp ftal@trab:~/imagem.jpg ./

E se, alm disso, o arquivo imagem.jpg estivesse na pasta Desktop/ da mquina trab:
[fulano@casa ~] scp ftal@trab:~/Desktop/imagem.jpg ./

Cpia de diretrio inteiro (recursiva)


Quer copiar um diretrio inteiro? Basta usar a opo -r (de recursive):
[fulano@casa temas] scp -r backgrounds ftal@trab:~/
Password:
paisagem-01.jpg
100%
0
15.0KB/s
00:00
paisagem-02.jpg
100%
0
13.0KB/s
00:00
paisagem-03.jpg
100%
0
19.0KB/s
00:00
abstrato-01.jpg
100%
0
24.0KB/s
00:00
abstrato-02.jpg
100%
0
17.0KB/s
00:00
espao-001.jpg
100%
0
14.0KB/s
00:00
espao-002.jpg
100%
0
27.0KB/s
00:00
espao-003.jpg
100%
0
19.0KB/s
00:00
espao-004.jpg
100%
0
23.0KB/s
00:00
espao-005.jpg
100%
0
20.0KB/s
00:00
espao-006.jpg
100%
0
11.0KB/s
00:00

Com -r, o scp copia o diretrio e todo seu contedo (inclusive subdiretrios e seus
respectivos contedos). Evidentemente, a opo -r pode ser usada em cpias nos dois
sentidos: local para remoto e remoto para local.

Melhor que FTP


O venervel FTP (File Transfer Protocol) existe em sua forma atual desde 1985, ou seja, j
mostra sinais da idade. Mas muitas pessoas j se acostumaram a us-lo para enviar e baixar
arquivos pela Internet, de forma que simplesmente abandon-lo uma m ideia.
Felizmente, o pessoal do OpenSSH (a implementao do protocolo SSH mais usada no
planeta, a mesma presente em todas as distribuies GNU/Linux) pensou nisso e criou o
sftp, uma espcie de FTP sobre SSH.
O principal uso do sftp nos casos em que o usurio no sabe com exatido o que deseja
baixar do computador remoto, ou para onde no computador remoto ele deseja enviar seus
arquivos locais.
Suponhamos que voc tenha baixado no computador do trabalho uma outra imagem boa para
usar como papel de parede, mas no consegue se lembrar do nome usado para salv-la. Voc
tem duas possibilidades:
1. Entrar via SSH, procurar o arquivo, fazer logout e usar o scp para copiar o arquivo, ou
2. Entrar via sftp, procurar o arquivo e baix-lo imediatamente.
O recurso de SFTP vem ativado por padro na maioria dos sistemas GNU/Linux, ento basta
ter o servidor instalado na mquina para entrar nela via sftp.

No cenrio acima, bastaria usarmos o seguinte comando:


[fulano@casa ~]$ sftp ftal@trab
Connecting to ftal@trab...
ftal@trab's password:
sftp> _

Note que a ltima linha indica que estamos num prompt SFTP. Ou seja, podemos digitar
comandos.
Infelizmente, o prompt do SFTP no igual ao Bash, ou seja, ele no um shell completo,
nem possui a capacidade de executar scripts. Os comadnos que ele aceita podem ser listados
com o comando ? no seu prompt:
sftp> ?
Available commands:
bye
cd path
chgrp grp path
chmod mode path
chown own path
df [-hi] [path]

Quit sftp
Change remote directory to 'path'
Change group of file 'path' to 'grp'
Change permissions of file 'path' to 'mode'
Change owner of file 'path' to 'own'
Display statistics for current directory or
filesystem containing 'path'
exit
Quit sftp
get [-P] remote-path [local-path] Download file
help
Display this help text
lcd path
Change local directory to 'path'
lls [ls-options [path]]
Display local directory listing
lmkdir path
Create local directory
ln oldpath newpath
Symlink remote file
lpwd
Print local working directory
ls [-1aflnrSt] [path]
Display remote directory listing
lumask umask
Set local umask to 'umask'
mkdir path
Create remote directory
progress
Toggle display of progress meter
put [-P] local-path [remote-path] Upload file
pwd
Display remote working directory
quit
Quit sftp
rename oldpath newpath
Rename remote file
rm path
Delete remote file
rmdir path
Remove remote directory
symlink oldpath newpath
Symlink remote file
version
Show SFTP version
!command
Execute 'command' in local shell
!
Escape to local shell
?
Synonym for help

Um bom primeiro comando, assim que se entra num servidor SFTP, o ls:
sftp> ls
arquivo1.txt
arquivo2.txt
arquivo3.txt
Desktop
temas
fotos
foto-03.jpg
foto-1.jpg
foto-2.jpg

10

foto-99.jpg
sftp> _

Nem adianta experimentar as opes do comando ls, como ls -lah, porque no se trata do
mesmo comando; o ls do sftp est embutido neste.
Para entrar no diretrio Desktop/, basta usar o comando cd:
sftp> cd Desktop
sftp> ls
googleearth.desktop
irpf2009-desktop.desktop
irpf2010-desktop.desktop
mozilla-thunderbird-bin.desktop
pidgin.desktop
rfb-receitanet201002.desktop
skype.desktop
papel_de_parede_legal.jpg
sftp> _

Opa! Temos um arquivo que queremos: papel_de_parede_legal.jpg, dentro de Desktop/.


Vamos baix-lo para a mquina local?
Primeiro, veja onde voc est na mquina local com o comando lpwd (de local pwd):
sftp> lpwd
Local working directory: /home/fulano/
sftp> _

Acontece que o objetivo gravar o arquivo remoto no diretrio de temas da mquina local.
Ento, temos que mudar de diretrio na mquina local. Isso feito com o comando lcd (de
local cd):
sftp>
sftp>
Local
sftp>

lcd temas/backgrounds
lpwd
working directory: /home/fulano/temas/backgrounds
_

Ok, ento estamos nos locais certos dos dois computadores. Agora, basta baixar o arquivo
desejado:
sftp> get papel_de_parede_legal.jpg
Fetching /home/ftal/Desktop/papel_de_parede_legal.jpg to
papel_de_parede_legal.jpg
/home/fulano/temas/backgrounds/papel_de_parede_legal.jpg
230523
50.1KB/s
--:-- ETA
sftp> _

100%

Seria possvel salvar o arquivo localmente com um nome diferente:


sftp> get papel_de_parede_legal.jpg pdpl.jpg
Fetching /home/ftal/Desktop/papel_de_parede_legal.jpg to pdpl.jpg
/home/fulano/temas/backgrounds/pdpl.jpg
100%
230523
50.1KB/s
00:00 ETA
sftp> _

11

Upload
Se voc quiser enviar um arquivo, basta usar o comando put:
sftp> lpwd
Local working directory: /home/fulano/temas/backgrounds
sftp> lls
paisagem-01.jpg
paisagem-02.jpg
paisagem-03.jpg
abstrato-01.jpg
abstrato-02.jpg
espao-001.jpg
espao-002.jpg
espao-003.jpg
espao-004.jpg
espao-005.jpg
espao-006.jpg
sftp> put abstrato-01.jpg
Uploading abstrato-01.jpg to /home/ftal/Desktop/abstrato-01.jpg
abstrato-01.jpg
100% 75390
32.4KB/s
00:00
sftp> _

Prtico, no?
Ao final, saia do shell SFTP remoto com CTRL+D ou digite o comando bye.

SFTP grfico
Meu objetivo aqui que voc permanea na linha de comando, aproveitando e aprendendo ao
mximo os poderes dessa ferramenta. Porm, claro que existem vezes em que um programa
grfico cai muito melhor.
Nesses casos, a boa notcia que a maioria dos gerenciadores de arquivos e programas de
download para GNU/Linux so compatveis com SFTP. Ento, basta abri-los, informar qual
o servidor, o nome e a senha do usurio remoto e conectar.

12

Agora que j apresentei os comandos ssh, scp e sftp, vou deixar um pouco mais de tempo
para voc praticar. Mas enquanto isso, que tal aprender um pouco da teoria por trs do SSH e
aproveitar para se livrar da senha a cada login?
Vamos l?

13

Criptografia bsica: fins


Como nos informa o verbete sobre criptografia na Wikipdia,
Criptografia (Do Grego kryptos, "escondido", e graphein, "escrita") o estudo dos princpios
e tcnicas pelas quais a informao pode ser transformada da sua forma original para outra
ilegvel, de forma que possa ser conhecida apenas por seu destinatrio (detentor da "chave
secreta"), o que a torna difcil de ser lida por algum no autorizado. Assim sendo, s o
receptor da mensagem pode ler a informao com facilidade.
O objetivo da criptografia justamente aquele mostrado nas figuras abaixo, publicadas no
primeiro post desta srie:
Sem criptografia, qualquer pessoa consegue capturar e entender os dados que trafegam entre
o seu computador e algum outro na Internet:

Com a criptografia, os dados saem do seu computador transformados em algo


incompreensvel para qualquer pessoa diferente do destinatrio. Ento, embora ainda possa
ser possvel interceptar os dados que trafegam, ser muito mais difcil entender o contedo:

14

Criptografia bsica: meios


Para os apressados: A criptografia usada no SSH requer 2 chaves, sendo uma (chamada
pblica) usada pelo remetente para criptografar os dados antes de envi-los e a outra
(chamada privada) usada para recuperar a mensagem original a partir da aparente "baguna"
recebida.
Para os pacientes: Uma forma extremamente simples de criptografia substituir cada letra
de uma palavra pela sua sucessora no alfabeto. Desta forma, eu poderia transmitir a palavra
"algoritmo" da seguinte forma: "bmhpsjunp". Para entender a mensagem, o destinatrio
precisaria, evidentemente, conhecer o mtodo usado e saber us-lo. Assim, ele conseguiria
reverter as letras uma posio e restaurar o contedo original da mensagem.
Claro que este exemplo mostrou apenas um mtodo trivial e extremamente fcil de ser
quebrado. Um bom mtodo (ou algoritmo, como o nome mais usado) criptogrfico utiliza
mltiplas rodadas de substituies e transformaes dos dados, todas com base em um nico
nmero bem comprido, chamado de chave criptogrfica ou apenas chave.
Sem possuir o nmero, um bisbilhoteiro poderia capturar uma mensagem criptografada e
tentar todos os nmeros que conhece, at encontrar aquele que a decifra. por isso que as
chaves precisam ser nmeros muito compridos, frequentemente na casa dos 2048 bits - ou
seja, variando entre 0 e 2^2048 (dois elevado a 2048), que esta monstruosidade de 617
dgitos:

15

323170060713110073007148766886699519604441026697154840321303
454275246551388678908931972014115229134636887179609218980194
941195591504909210950881523864482831206308773673009960917501
977503896521067960576383840675682767922186426197561618380943
384761704705816458520363050428875758915410658086075523991239
303855219143333896683424206849747865645694948561760353263220
580778056593310261927084603141502585928641771167259436037184
618573575983511523016459044036976132332872312271256847108202
097251571017269313234696785425806566979350459972683529986382
155251663894373355436021354332296046453184786049521481935558
53611059596230656

Entendeu? Para o bisbilhoteiro encontrar o nmero que usamos, ele precisaria passar muito
tempo testando nmeros para encontrar aquele que foi usado. Mas ateno: conforme os
computadores avanam, seu poder computacional aumenta, o que significa que cada vez
necessrio menos tempo para um bisbilhoteiro obstinado encontrar a chave correta.
por isso que recomenda-se aumentar o tamanho das chaves criptogrficas com o passar dos
anos. Chaves criptogrficas de 512 bits j foram consideradas inquebrveis, mas em 1999 um
estudo provou que podiam ser quebradas na prtica, sendo que hoje isto requer poucas
semanas de processamento dos computadores modernos. A Wikipdia em ingls diz que
chaves RSA (um dos conjuntos de algoritmos mais utilizados) de 300 bits "podem ser
decifradas por um computador domstico em poucas horas". Porm, para nossa felicidade, a
Wikipdia tambm diz (sobre chaves RSA) que:
Alguns especialistas acreditam que chaves de 1024 bits podem tornar-se quebrveis no curto
prazo (embora haja questionamentos a respeito); poucos veem alguma forma de chaves com
4096 bits tornarem-se quebrvieis no futuro.

Criptografia simtrica e assimtrica


Na esfera em que estamos tratando, existem dois tipos de criptografia: simtrica e assimtrica.
O nome pode assustar, mas o conceito simples.
Criptografia simtrica (ou de chaves simtricas): usada uma nica chave para criptografar
e decifrar os dados. como a chave da sua casa: somente uma chave com aqueles sulcos
especficos consegue girar para trancar ou destrancar a porta.
At aqui, os exemplos usaram somente esse tipo de criptografia.
Criptografia assimtrica (ou de chave pblica, ou de chaves assimtricas): a usada pelo
SSH. Este mtodo avanado permite que cada mquina (ou pessoa) divulgue abertamente uma
de suas chaves (a pblica) para que outras pessoas a utilizem nas comunicaes com ela. A
outra chave (chamada privada) fica muito bem guardada pelo seu nico dono, e a nica
chave capaz de decifrar o que a chave pblica cifrou.
Os mtodos avanados da criptografia assimtrica garantem, por mais anti-intuitivo que
parea, que a chave pblica s seja utilizvel para criptografar uma mensagem, e no para
decifr-la. Somente a chave privada capaz de decifrar uma mensagem que tenha sido
cifrada pela chave pblica. Por isso importante que a chave privada fique muito bem
guardada pelo seu dono.
16

No fantstico?

Acorde! hora da prtica!


Agora que voc j sabe a importncia da criptografia e do tamanho das chaves, e tambm j
conhece a utilidade de cada chave, hora de criar o seu prprio par. Vamos l?
Nosso usurio de exemplo, Fulano, tem um computador em casa (chamado casa, com usurio
fulano) e outro no trabalho (chamado trab, com usurio ftal).

Chaves da mquina
Antes de Fulano criar um par de chaves em casa e outro em trab, assim que a comunicao
via SSH ocorria, passo a passo:
[fulano@casa ~] $ ssh ftal@trab

Com isso, casa envia a trab a chave pblica de casa, que geralmente fica guardada em
/etc/ssh/ssh_host_key.pub e criada durante a instalao do pacote openssh-server.
trab

recebe a chave pblica e pede a senha do usurio ftal:

ftal@trab's password:

Fulano informa a senha de ftal em trab, trab confere-a e, caso esteja correta, permite o
login:
ftal@trab [~]$ _

Viu? O prompt do Bash diferente nas duas mquinas, o que altamente recomendvel para
evitar que voc execute comandos na mquina errada.

Login sem senha e chaves do usurio


Agora que voc j domina o SSH e entra remotamente nas suas vrias mquinas todos os dias,
talvez a tarefa de informar a senha a cada novo acesso esteja ficando um pouco incmoda.
Vejamos como sanar isso.
Mas primeiro, um pouco de...

17

Histria
O fabuloso OpenSSH a implementao do protocolo SSH mais completa que conheo. Ele
foi criado pelos desenvolvedores do sistema operacional OpenBSD, um sistema livre lanado
sob a licena BSD.
O OpenSSH includo em inmeros sistemas e produtos de vrios fabricantes, e com razo:
ele o mximo! :)
Os recursos de gerao de chaves e login sem senha que vou descrever a seguir so criaes
do OpenSSH. Ento, mais do que o protocolo SSH, se voc deseja agradecer a algum pelos
recursos que j apresentei e continuarei apresentando nesta srie de posts, esse algum a
comunidade de desenvolvedores do OpenSSH.

Gerar chaves
O OpenSSH capaz de gerar chaves de dois tipos: DSA e RSA.
DSA (Digital Signature Algorithm) um algoritmo de criptografia padronizado pelo governo
federal dos EUA, mas o OpenSSH s gera chaves DSA com no mximo 1024 bits o que j
vimos que um problema potencial.
RSA (Rivest, Shamir e Adleman) um algoritmo muito usado na criptografia assimtrica, e
no OpenSSH pode gerar chaves de 4096 bits (inquebrveis na atualidade) ou at mais.
Por padro, o OpenSSH gera chaves RSA de 2048 bits.
Vamos comear: gere um par de chaves para seu usurio fulano no computador casa com o
comando ssh-keygen:
[fulano@casa ~]$ ssh-keygen
Generating public/private rsa key pair.
Enter file in which to save the key (/home/fulano/.ssh/id_rsa):
<PRESSIONE APENAS ENTER>
Enter passphrase (empty for no passphrase): <PRESSIONE APENAS ENTER>
Enter same passphrase again: <PRESSIONE APENAS ENTER>
Your identification has been saved in /home/fulano/.ssh/id_rsa.
Your public key has been saved in /home/fulano/.ssh/id_rsa.pub.
The key fingerprint is:
fe:a2:e1:49:cc:a3:d3:41:35:d5:a9:a1:34:c2:07:0f fulano@casa
The key's randomart image is:
+--[ RSA 2048]----+
|
. . . .
|
|
. o . .
o |
|
. o o o .
|
| . . o o .
|
|
. . oSo
|
|
. ..E
|
|
. o
|
|
.o+o.
|
|
.BXo.
|
+-----------------+
[fulano@casa ~]$ _

18

A sada do comando ssh-keygen bastante informativa. Ela diz onde salvou a chave primria
(/home/fulano/.ssh/id_rsa, no caso), onde salvou a chave pblica
(/home/fulano/.ssh/id_rsa.pub), informa a assinatura (fingerprint) da chave e ainda
fornece uma espcie de retrato artstico (randomart) dessa mesma chave.
O objetivo desse retrato artstico que o usurio sempre olhe para o retrato ao se conectar a
um servidor SSH. Se a chave criptogrfica do servidor for alterada, sua arte mudar
significativamente. Assim, se voc entra todos os dias no mesmo servidor, voc acaba se
acostumando a visualizar um retrato especfico - se o retrato mudar algum dia, voc vai
perceber rapidamente que a chave foi alterada, o que geralmente indica que o servidor foi
invadido.

Aparncia de uma chave


Fique vontade para ler suas prprias chaves. Elas esto onde o ssh-keygen disse que as
colocou (por padro, ~/.ssh/id_rsa e ~/.ssh/id_rsa.pub.
Um exemplo de chave RSA de 2048 bits:
[fulano@casa ~]$ cat ~/.ssh/id_rsa
-----BEGIN RSA PRIVATE KEY----MIIEogIBAAKCAQEAx0ICaSI4ddHt6R2VMn2ton3DLJKmSKVk5F8ewRs6f0tyJqH5
Srr7wMbT5XtQgwDFFNRY4JzXzdcReeaSiYdzoG5sPtgeUiA8T55vuLetvC/EfF/T
U2v/mnVy/JrOwWBPCoYbPpanqrGb7HtqKoHCi0ij69ovRb0Oq20eVR5ne/ATrQUE
utklByq570PSh8rIkRWB/42PTbv4LTItsLdLkH7v9ehmXS+iSIlV/VVARyvwUCO8
ZaGZhi0Zq7yXSJbu6wkuCKKdh+ppsb+zSzHABXYtrvSAMXZKVfkvTamsqleXeQoN
WrNDTYcQixEKxO4/jyoiY7WWZSP0fgZX0ulbOwIBIwKCAQAti25D6pCP9Xg1SJch
e8/qoGcgIYUX60pC0+nFvRSvYbOxDxRo2kgsEDBu951fxalj2MPbkZBpkD6CQ1Sx
uI91II3FOLZ5K/CHOigqOJy9TL8yXwu7S+Km9kYrHBIAUIcYWSrMejTz0NMuvR+U
r/Hz81iq8ArOHJWjhqfY8QG17VQALr/3pmwWySRgUa/ZTAh4IzWc0riV7Pzf10C4
0XYiraIwWp3ZILQpSU7ukwTcVNCPggbSfJQTxKKzorhgxlkbNqYYJ5ohMwIbBbEn
S9hVgjzuckK/jFlh9Im5wsk8855zg+DSOqnIpJCk5AmWl9G6VFjQ/zainRcUiIDw
uMgLAoGBAOxVyWh8fO2Q4ioStIDLkXFGYw+zF5p8jAYQt8eLjTgs+KyKhheJ/Mo7
Di4TqEpYjKF/AN58HqnFxVDc/FcN1yv5cq/HpYg/UpWbY7zcVPCqgmNoBdxWNZQa
kgD3hQI0vAs/gYGW0jicaz1foBKqV0pST/CxtXRXWy2xsyu8WwCzAoGBANfWbxRi
5B6SmJC3KfBljLI9GGe+XA1BQx/JLKr8la6Lzp3X1dw9Q8PY2m6V6cCqrD5dSgAQ
oefp64D82FmTW/0ah2eXT9L3WKrgIw9i8Pzk2f+zur/VOq8u2VPJcHoK8bcAJ5Qs
IGPjS9paC04nvr+tqS0fo5MGWYHSfff5Ze9ZAoGAGwJ9awbptMAZ2Owx4tVvtSyd
m2TswTLOLJQyQrDc8HorDGeaS9VBdjKiiOxNv1qTuq9t0EizDBaaNSCR3hA12SPS
l78Lmork3eXfg0xhepck2CklPcC1qoaxmbXjULWR1WZX8Y2UXj3DHPT8WeeU8o0Q
c0eCc7I2Tl1zj/hE6iMCgYEAy4EJpYHPxQ3gTe6GoNTGfCr5wOaukCeXD1dHX2Mu
CvjYwLWPIByBuKfj5Jv5pwdR8ahqV9Uq8Jq5eZ3wjvinMHgZRGoYEA3IoRx40/4z
rJ1CkgE7DKR5KNRmgjL1BVrGpTqo+Wtu/xgi8nIn6pqAphjEFJosg08hMULOirfy
ZVMCgYEA5SARBel+4UnbnHyjO1fOaxZQtisO3s2BL73Yfm+MEMVOMsTEqf9pxwWB
7kADadVVW9/S2zGAAjlN3VXvbTMJoyibQiPED2XV19LtqoiOZV0DHVEMPaxEt8S1
vKJAjVJCIW0A96UFgmO8J/eEv49SpyLyppU0VVG1KkPHUHTBtrU=
-----END RSA PRIVATE KEY-----

19

[fulano@casa ~]$ cat ~/.ssh/id_rsa.pub


ssh-rsa AAAAB3NzaC1yc2EAAAABIwAAAQEAx0ICaSI4ddHt6R2VMn2ton3D
LJKmSKVk5F8ewRs6f0tyJqH5Srr7wMbT5XtQgwDFFNRY4JzXzdcReeaSiYdz
oG5sPtgeUiA8T55vuLetvC/EfF/TU2v/mnVy/JrOwWBPCoYbPpanqrGb7Htq
KoHCi0ij69ovRb0Oq20eVR5ne/ATrQUEutklByq570PSh8rIkRWB/42PTbv4
LTItsLdLkH7v9ehmXS+iSIlV/VVARyvwUCO8ZaGZhi0Zq7yXSJbu6wkuCKKd
h+ppsb+zSzHABXYtrvSAMXZKVfkvTamsqleXeQoNWrNDTYcQixEKxO4/jyoi
Y7WWZSP0fgZX0ulbOw== fulano@casa
[fulano@casa ~]$ _

Interessante, no? Se voc no soubesse que so chaves criptogrficas, certamente as


confundiria com puro lixo digital, imagino.

Login sem senha


Tudo que fizemos at agora tinha o objetivo de preparar um grande facilitador para o uso e a
segurana do OpenSSH: o login sem senha, tambm conhecido como login por chave pblica.
Lembra da ordem dos acontecimentos na sesso SSH?
1. cliente envia sua prpria chave pblica ao servidor
2. servidor usa a chave pblica recebida (ou seja, a do cliente) para criptografar a
conexo, e j comea pedindo a senha
3. cliente recebe pedido criptografado com sua chave pblica e usa sua chave privada
para decifrar o que recebeu. um pedido de senha
4. pessoa em frente ao computador informa a senha do usurio no servidor
5. se a senha estiver correta, o login feito
O passo 2 acima pode ser diferente. possvel gravar no servidor a chave pblica do cliente,
o que informa ao servidor que essa chave pblica j conhecida, e o login desse usurio
especfico nesse cliente especfico (fulano@casa, no caso) pode dispensar o pedido de senha
(a senha de ftal@trab, no nosso exemplo).
Com esse procedimento, sempre que fulano@casa tentar fazer login em ftal@trab, o login
dispensar o pedido de senha (contanto que, na criao do par de chaves com o ssh-keygen o
usurio fulano@casa tenha apenas pressionado ENTER no lugar da passphrase.
Ento vamos l: vamos copiar nossa chave pblica recm-gerada para dentro do servidor!
Primeiro passo: copiar o arquivo da chave pblica do cliente para o servidor:
[fulano@casa ~]$ scp ~/.ssh/id_rsa.pub \
ftal@trab:~/chave-publica-fulano-casa
ftal@trab's password:
id_rsa.pub
100%
12KB 12.2KB/s

00:00

20

[fulano@casa ~]$ _

Segundo passo: entrar no servidor e copiar o contedo do arquivo de chave pblica recebido
do cliente para dentro do arquivo que armazena as chaves pblicas do usurio ftal@trab:
[fulano@casa ~]$ ssh ftal@trab
ftal@trab's password:
ftal@trab [~] $ cat chave-publica-fulano-casa >> \
~/.ssh/authorized_keys
ftal@trab [~] $ _

Terceiro passo: verificar se o servidor OpenSSH est configurado para aceitar login com
autenticao por chave pblica:
ftal@trab [~] $ sudo grep 'PubkeyAuthentication' \
/etc/ssh/sshd_config
PubkeyAuthentication yes

Se a sada do comando mostrar um no no lugar do yes, abra o arquivo e altere para yes. J no
caso de a sada no incluir uma linha como essa, acrescente a linha ao arquivo:
ftal@trab [~] $ sudo su
Password:
root@trab [~] $ echo 'PubkeyAuthentication yes' >> \
/etc/sshd_config

Quarto passo: tentar a conexo sem senha:


root@trab [~] $ exit
ftal@trab [~] $ exit
[fulano@casa ~]$ ssh ftal@trab
ftal@trab [~] $ _

Parabns! Voc conseguiu!


E olha que usamos a tcnica mais difcil. :)

Login sem senha, tcnica fcil


Apresentei primeiro a tcnica difcil para que voc aprecie mais o trabalho do pessoal do
OpenSSH. ;)
Eles criaram h algumas verses o comando ssh-copy-id para fazer justamente tudo isso:
copiar a chave pblica do seu usurio para o arquivo de chaves autorizadas no servidor. Seu
uso simples. Como j copiamos a chave de casa para trab, vamos agora fazer o
procedimento contrrio (para permitir o login sem senha de trab para casa:
[fulano@casa ~]$ ssh ftal@trab

21

ftal@trab [~] $ ssh-keygen


Generating public/private rsa key pair.
Enter file in which to save the key (/home/ftal/.ssh/id_rsa): <PRESSIONE
APENAS ENTER>
Enter passphrase (empty for no passphrase): <PRESSIONE APENAS ENTER>
Enter same passphrase again: <PRESSIONE APENAS ENTER>
Your identification has been saved in /home/ftal/.ssh/id_rsa.
Your public key has been saved in /home/ftal/.ssh/id_rsa.pub.
The key fingerprint is:
21:bc:50:c6:1e:b1:7a:db:e8:d8:d8:d6:b5:57:4c:dd ftal@trab
The key's randomart image is:
+--[ RSA 2048]----+
|
.+.
|
|
+o.
|
|
..+..
..|
|
o.o .
. E|
|
. o S
o
|
|
. + .
o |
|
o... . .
|
|
*. . . .
|
|
o.+
.
|
+-----------------+
ftal@trab [~] $ ssh-copy-id -i .ssh/id_rsa.pub fulano@casa
Now try logging into the machine, with "ssh 'fulano@casa'", and check in:
.ssh/authorized_keys
to make sure we haven't added extra keys that you weren't expecting.
ftal@trab [~] $ _

Entre os dois mtodos, prefira sempre o fcil, pois ele faz muito mais do que apenas copiar a
chave pblica; ele:

verifica as permisses do diretrio .ssh do servidor para garantir sua segurana

confere se o arquivo de chaves autorizadas mesmo o padro


(~/.ssh/authorized_keys)

garante que a chave copiada seja a pblica, no a privada. Se voc informar a chave
errada na opo -i, ele d um alerta. No mtodo difcil, voc pode acabar se
enganando e expondo sua chave privada - isso obrigaria voc a gerar um novo par de
chaves, j que a privacidade da sua chave privada foi violada.

Questes de segurana do login por chave


A maior praticidade do login por chave (e sem senha) levanta alguns questionamentos de
segurana quanto autenticao.
A boa segurana depende de vrios aspectos: geralmente "algo que voc tem", "algo que voc
sabe" e "algo que voc ".
22

Algo que voc tem: um pen drive, um token, um smart card.

Algo que voc sabe: sua senha.

Algo que voc : sua impresso digital, ocular, vocal...

A autenticao por senha conta somente com o que voc sabe. E fato que voc pode
facilmente esquecer qualquer coisa que j soube algum dia. :)
A autenticao somente por chave tambm tem um nico fator: o que voc tem (a prpria
chave, seja no HD ou num pen drive). E tambm fato que tudo que se possui pode ser
perdido ou roubado ou clonado. ;)
Portanto, a autenticao mais segura com os dados que poderamos ter no momento seria por
chave com senha. Ou seja, se voc tem preocupaes reais com a segurana do seu login
remoto, use uma senha ao gerar seu par de chaves. No preencha o passphrase apenas com a
tecla ENTER.

Problemas?
comum, quando voc est aprendendo a lidar com chaves pblicas e privadas, alterar suas
chaves sem perceber. Nesses casos, possvel que voc receba o seguinte alerta:
[fulano@casa ~] $ ssh ftal@trab
@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
@
WARNING: REMOTE HOST IDENTIFICATION HAS CHANGED!
@
@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
IT IS POSSIBLE THAT SOMEONE IS DOING SOMETHING NASTY!
Someone could be eavesdropping on you right now (man-in-themiddle attack)!
It is also possible that the RSA host key has just been changed.
The fingerprint for the RSA key sent by the remote host is
d4:d3:fd:ac:c4:d3:e9:94:97:cc:52:21:3b:e4:ba:e9.
Please contact your system administrator.
Add correct host key in /home/fulano/.ssh/known_hosts to get
rid of this message.
Offending key in /home/fulano/.ssh/known_hosts:63
RSA host key for trab has changed and you have requested
strict checking.
Host key verification failed.
[fulano@casa ~] $ _

Calma. Esta mensagem simplesmente significa que a chave pblica da mquina que voc
tentou acessar, trab, foi alterada. O OpenSSH, muito precavido, faz grande alarde disso, pois
de fato no para algo assim ocorrer em situaes normais.
Para resolver o problema (quando voc souber que h motivos para a chave ter sido alterada),
basta excluir a chave pblica do seu arquivo local de chaves pblicas conhecidas.
23

O OpenSSH armazena a chave pblica de todas as mquinas remotas que voc j acessou
alguma vez. Por padro, elas ficam no arquivo ~/.ssh/known_hosts, uma chave por linha.
Veja que a mensagem de alerta informou em qual linha do arquivo se encontra a chave
pblica esperada para a mquina trab:
Offending key in /home/fulano/.ssh/known_hosts:63

Vamos conferir?
[fulano@casa ~] $ sed -n '63 p' .ssh/known_hosts
trab ssh-rsa AAAAB3NzaC1yc2EAAAABIwAAAQEA0vmeTKKSv6w2GjJfJSZ
lCl90644zIE6KMAYSZ6xfF4/0k4QSnVqo+ooxNKpfgAaNhVKngptSCcU2J8J
EySqaxvCI5Vw6ixwNPg1LqmczI9vEDe2v1e5efaIFAvfrXy/WVGd7He86SOD
75WDg5Go+QY5nAcnW5stA8Gs9tu/JksMa4KOQZxYE/EOZSPtoUG/+TMuOgl/
cSnwMXQhIjjUDTn7UMO4Y9PozWI0ck760y4/VfBwmtQBaluADMRpeHlwVRU6
h1qJgCI0juWqtR7NFb4LVG6EFYZ0trDIe1PsANtz2u1dmu/D0aiA0SYh1GQu
YdgQxixZLQnKI0DR4Aw4uGQ==
[fulano@casa ~] $ _

L est. A linha 63 de fato contm a chave pblica antiga de trab. Vamos apag-la:
[fulano@casa ~] $ sed -ne '63 d' -i .ssh/known_hosts
[fulano@casa ~] $ _

Estou aproveitando para mostrar um pouco das utilidades de mais um programinha


fantstico, o sed. Fique vontade para usar seu editor de texto preferido (grfico ou no)
para abrir o arquivo ~/.ssh/known_hosts, conferir a linha especfica e apag-la.
Feito isso, vamos tentar a conexo novamente. Note que o OpenSSH agora no conhece mais
a mquina trab, ento vai tratar a conexo como se fosse com uma mquina nova qual voc
jamais se conectou:
[fulano@casa ~] $ ssh ftal@trab
The authenticity of host 'trab (11.22.333.444)' can't be
established.
RSA key fingerprint is d4:d3:fd:ca:c4:d3:e9:94:97:cc:52:21:3b
:4e:ba:e9.
Are you sure you want to continue connecting (yes/no)? yes
Warning: Permanently added 'trab,11.22.333.444' (RSA) to the
list of known hosts.
ftal@trab [~]$ _

Fora esse problema, dificilmente voc encontrar algum outro.

Comandos remotos
24

Executar um comando remoto de forma no interativa por meio do OpenSSH muito fcil.
Suponhamos que voc esteja no computador casa e queira consultar o load average do
computador trab, que fica l no seu escritrio.
Para quem no conhece, o load average um conjunto de trs nmeros que oferecem uma
ideia de quo ocupado est(o) a(s) CPU(s) do seu sistema no ltimo minuto, nos ltimos 5
minutos e nos ltimos 15 minutos.
Para consultar o load average do seu sistema local, basta executar:
[fulano@casa ~] $ uptime
23:42:04 up 1 day, 4:02, 6 users, load average: 1.31, 0.55, 0.20
[fulano@casa ~] $ _

Para executar apenas este comando na mquina trab sob o usurio ftal, faramos assim:
[fulano@casa ~] $ ssh ftal@trab 'uptime'
10:45PM up 70 days, 19:42, 73 users, load averages: 3.93, 3.00, 2.83
[fulano@casa ~] $ _

O que esse comando fez:


1. Entrou como usurio ftal no computador trab via SSH (no foi necessrio informar
uma senha porque j havamos configurado o login por chave pblica).
2. Executou o comando uptime.
3. Fechou a sesso e mostrou o prompt local do Bash.
Simples, no?

IP remoto
Outro uso simples da execuo de comandos remotos: descobrir rapidamente o IP da mquina
remota.
Nosso bravo usurio fulano quer saber o IP da placa de rede eth0 de sua outra mquina,
trab. Para isso, basta executar:
[fulano@casa ~] $ ssh ftal@trab 'ifconfig eth0'
eth0
Encapsulamento do Link: Ethernet Endereo de HW 70:5a:6b:97:22:0d
inet end.: 192.168.123.241 Bcast:192.168.123.255
Masc:255.255.255.0
UP BROADCASTMULTICAST MTU:1500 Mtrica:1
RX packets:0 errors:0 dropped:0 overruns:0 frame:0
TX packets:0 errors:0 dropped:0 overruns:0 carrier:0
colises:0 txqueuelen:1000
RX bytes:0 (0.0 B) TX bytes:0 (0.0 B)
IRQ:30 Endereo de E/S:0x2000

25

[fulano@casa ~] $ _

Como mostra a sada do comando ifconfig eth0 executado em trab, o IP da placa de rede
eth0 de trab 192.168.123.241.

Pra l e pra c
Como poderamos exibir somente a linha que contm o IP da placa de rede eth0 de trab?
Primeiramente, como faramos isso localmente? Sugiro usar o grep:
[fulano@casa ~] $ ifconfig eth0 | grep 'inet'
inet end.: 10.0.2.2 Bcast:10.255.255.255

Masc:255.0.0.0

[fulano@casa ~] $ _

Se voc no tem intimidade com o pipe (smbolo |) ou com o grep, aqui est a explicao do
que este comando fez:
1. executou ifconfig eth0 e encaminhou sua sada ( isso que o pipe faz) para o
prximo comando.
2. o prximo comando foi grep 'inet', que age como um filtro: analisa tudo que
recebe (ou seja, sua entrada) e exibe como sada apenas as linhas que se enquadrarem
no padro descrito (no caso, a sequncia de caracteres inet).
3. o comando grep exibiu como sada a nica linha da sada de ifconfig eth0 que
continha inet.
E ento, como fulano pode exibir apenas a linha do IP de trab?
[fulano@casa ~] $ ssh ftal@trab 'ifconfig eth0' | grep 'inet'
inet end.: 192.168.123.241 Bcast:192.168.123.255
Masc:255.255.255.0
[fulano@casa ~] $ _

Fcil, no?
O comando ifconfig eth0 foi executado em trab, e sua sada foi filtrada na mquina local
(isto , casa) pelo grep. Neste caso simples, isso no problemtico, mas imagine se
quisssemos encontrar uma linha de um longo arquivo que est na mquina remota.
[fulano@casa ~] $ ssh ftal@trab \

26

'cat livros/senhor_dos_aneis_1.txt' | grep Gandalf


(espera...)
(longa lista de linhas com "Gandalf" no meio, evidentemente)
[fulano@casa ~] $ _

A espera citada seria em decorrncia de um leve mau uso da rede: com este comando, voc
transportaria via rede todo o texto do livro, para filtr-lo localmente com o grep. No seria
muito mais inteligente filtr-lo no prprio servidor? Assim, a nica coisa que trafegaria pela
rede seria a sada do grep, bem menor do que o contedo inteiro do livro:

[fulano@casa ~] $ ssh ftal@trab \


'cat livros/senhor_dos_aneis_1.txt | grep Gandalf'
(a mesma longa lista de linhas, mas sem a espera)
[fulano@casa ~] $ _

Encontrou a diferena?
Est no fechamento das aspas do comando remoto. Veja que neste exemplo, o comando
remoto foi:
'cat livros/senhor_dos_aneis_1.txt | grep Gandalf'

No exemplo anterior, o comando remoto era:


'cat livros/senhor_dos_aneis_1.txt'

e a sada era filtrada pelo grep local (isto , em casa).


Moral desta histria: pense bem onde voc deve fechar as aspas.

Livro inteiro
Suponhamos que voc precise executar um programa (chamado tratalivro) que recebe
como entrada o livro que filtramos acima. Porm, enquanto o livro est em trab, voc e o
tratalivro esto no computador casa.
Uma das possibilidades seria, sem dvida, copiar o livro inteiro com o scp:
[fulano@casa ~] $ scp ftal@trab:~/livros/senhor_dos_aneis_1.txt ./
senhor_dos_aneis_1.txt
100% 5.0M
60.3KB/s
00:00
[fulano@casa ~] $ tratalivro senhor_dos_aneis_1.txt
3.1415 * 10^4 ocorrncias da palavra "anel"

27

[fulano@casa ~] $ _

Pois , nosso programa tratalivro simplesmente conta o nmero de ocorrncias da palavra


"anel" no arquivo de entrada. :)
Note que transferimos 5.0 MB pela Internet. Dependendo da velocidade da conexo, isso
pode ser muito entediante. Alm disso, tivemos que executar dois comandos, o que no era o
objetivo deste exerccio.
Outra soluo: transferir o arquivo com o comando ssh:
[fulano@casa ~] $ ssh ftal@trab 'cat livros/senhor_dos_aneis_1.txt' | \
tratalivro
3.1415 * 10^4 ocorrncias da palavra "anel"
[fulano@casa ~] $ _

Bem melhor, no? Fizemos tudo em um nico comando. Porm, transferimos todos os 5 MB
pela nossa conexo de rede potencialmente lenta.
A questo no que a conexo seja lenta. Simplesmente, se h uma forma de acelerar este
processo, por que no us-lo?

Livro compactado
Como faramos para transferir um livro inteiro ocupando menos espao (ou seja, transferindo
menos dados) do que os 5.0 MB originais?
Eu ouvi compactao???
Exatamente. Vamos compactar os dados antes de transmiti-los pela rede!
Primeiro, com vrios comandos (ruim):
[fulano@casa ~] $ ssh ftal@trab
[ftal@trab] ~$ gzip livros/senhor_dos_aneis_1.txt
[ftal@trab] ~$ du -sh livros/senhor_dos_aneis_1.txt.gz
2.1M
livros/senhor_dos_aneis_1.txt
[ftal@trab] ~$ exit
[fulano@casa ~] $ ssh ftal@trab \
'cat livros/senhor_dos_aneis_1.txt.gz' | \
gunzip | tratalivro
3.1415 * 10^4 ocorrncias da palavra "anel"
[fulano@casa ~] $ _

As etapas foram:
1. entrar em trab como ftal
2. compactar o arquivo com o gzip (depois conferimos que o arquivo .gz gerado ficou
com apenas 2,1 MB)
28

3. sair de trab
4. transmitir o arquivo compactado por SSH, descompact-lo localmente (em casa) e
trat-lo tambm localmente
A vantagem: transmitimos somente o livro compactado, o que significa que menos dados
transitaram e nossa comunicao via rede foi potencialmente mais rpida. Porm, quantos
comandos, no?

Livro compactado com um comando


Agora sim. Este o Jeito Certo! :)

Juro que no h mgica envolvida no comando a seguir. :)


[fulano@casa ~] $ ssh ftal@trab \
'gzip -c livros/senhor_dos_aneis_1.txt' | \
gunzip | tratalivro
3.1415 * 10^4 ocorrncias da palavra "anel"
[fulano@casa ~] $ _

Vamos s etapas no mgicas:


1. executar um comando como ftal em trab
2. o comando : compactar o arquivo do livro e repass-lo sada padro (em vez de
gravar um arquivo .gz)
3. a sada do comando remoto o livro compactado, e isso transmitido via rede, de
trab para casa
4. em casa, o comando gunzip descompacta os dados recebidos e os repassa ao
comando tratalivro
5. o comando tratalivro recebe o livro descompactado e imprime seus resultados
normalmente.

Caminho aberto!
Este uso do OpenSSH abre as portas para usos muito mais poderosos.
Por exemplo, quer descompactar localmente um arquivo .tar.gz remoto? Simples:
[fulano@casa ~] $ ssh ftal@trab 'cat /diretrio/arquivo.tar.gz' | \

29

tar -zxv
conteudo1.txt
conteudo2.txt
conteudo3.txt
conteudo4.jpg
conteudo5.png
[fulano@casa ~] $ _

Entendeu?
O usurio fulano executou o comando cat /diretrio/arquivo.tar.gz na mquina trab
(sob o usurio ftal) e o resultado foi encaminhado pelo pipe para o comando local tar
-zxv, que por sua vez descompactou e "destarou" os dados recebidos, criando assim os 5
arquivos mostrados.

Imagem de CD remoto
Quer gravar remotamente a imagem de um CD que est na sua mquina local? Basta
compact-la localmente e descompact-la "do outro lado":
[fulano@casa ~] $ dd if=/dev/cdrom | gzip -c | \
ssh ftal@trab 'gunzip > imagem.iso'
166+1 registros de entrada
166+1 registros de sada
700413952 bytes (700 MB) copiados, 234,03412 segundos, 3 MB/s
[fulano@casa ~] $ _

As 3 linhas que dizem 166+1 registros... so a sada do comando dd.


J usei esta tcnica para fazer backup de imagens de discos rgidos inteiros (160 GB). Sem a
compactao, cada disco enviado pela rede a 100 Mbps levava quase uma hora (eram vrios
discos enviados para o mesmo servidor ao mesmo tempo). Com a transmisso das imagens
compactadas, bastavam poucos minutos para cada imagem de disco.

Concluso
Este post foi mais avanado que os anteriores, e apresentou outros utilitrios de linha de
comando, como dd, gzip, gunzip e tar. Se voc no os conhece, aproveite para estud-los
um pouco (ou aguarde as sries sobre cada um deles no futuro). ;)
Associado ao uso de pipes, o OpenSSH pode fazer verdadeiros milagres, at a transmisso de
um computador remoto para outro (bnus de fim de post!):
30

[fulano@casa ~] $ ssh ftal@trab 'tar -zcO livros' | \


ssh fulaninho@netbook 'tar -zxv livros'
livros/senhor_dos_aneis_1.txt
livros/senhor_dos_aneis_2.txt
livros/senhor_dos_aneis_3.txt
livros/mochileiro_das_galaxias_1.txt
livros/mochileiro_das_galaxias_2.txt
livros/mochileiro_das_galaxias_3.txt
livros/mochileiro_das_galaxias_4.txt
livros/a_volta_dos_que_nao_foram.txt
livros/as_trancas_do_rei_careca.txt
livros/maremoto_no_deserto.txt
[fulano@casa ~] $ _

Se voc no est convencido(a) de que o OpenSSH um grande software, no se decepcione.


Os prximos posts vo apresentar timos argumentos.

Sempre exibir randomart

Lembra que eu falei da randomart na parte 3 desta srie?


A randomart uma espcie de "impresso digital artstica" da chave pblica do
servidor. Exemplos de randomart de chaves RSA de 2048 bits (padro do OpenSSH
h algumas verses):
+--[ RSA 2048]----+
|
o.o o.XB. |
|
*.+o *oo |
|
B....o
|
|
. . o
|
|
S .
|
|
o
|
|
E
|
|
|
|
|
+-----------------+
+--[ RSA 2048]----+
|
|
|
.
|
|
+ o .
|
|
. E * . . |
|
. +SO + .
|
|
. =.o o . |
|
o. . . |
31

|
o.o . |
|
++o
|
+-----------------+
+--[ RSA 2048]----+
|.=oo.
|
|o.oo.o
|
|oo o+ .
|
|o.o.+. o
|
|...+... S
|
|. ..
.
|
|
.
|
|
.
|
|
o+E
|
+-----------------+

Utilidade da randomart
O objetivo da randomart que voc, usurio do servidor, se acostume com ela e
consiga detectar invases ao servidor.
Se voc entra todos os dias num mesmo servidor via OpenSSH, voc deve ver
todos os dias a mesma randomart, pois a chave criptogrfica do servidor no deve
ser alterada no dia a dia. Pessoas so boas para se acostumar a ver uma imagem.
Desta forma, se voc v todo dia uma mesma imagem e, de repente, num dia como
outro qualquer a imagem muda, voc rapidamente vai identificar uma potencial
invaso ao servidor, pois isso significa que a chave dele foi alterada.

No vejo nenhuma chave


Porm, como voc j percebeu, a exibio da randomart pelo servidor ainda no
vem ativada por padro na maioria das distribuies GNU/Linux. Isto ocorre porque
cabe ao cliente ativar essa exibio. isso mesmo, quem exibe a randomart da
chave criptogrfica do servidor o cliente, no o prprio servidor.
Ento, que tal seguirmos as recomendaes dos inteligentes desenvolvedores do
OpenSSH e ativarmos a exibio da randomart em nosso cliente OpenSSH?
fcil: basta abrir o arquivo ~/.ssh/config.
O seu usurio provavelmente ainda no possui esse arquivo, pois ele no criado
por padro pelo comando ssh-keygen que usamos para gerar o par de chaves do
usurio cliente. Neste caso, basta cri-lo com seu editor de texto preferido e
escrever nele as seguintes linhas:
32

Host *
VisualHostKey yes
Isto significa: para todos os servidores a que eu me conectar, por favor exiba a
randomart.
Feito isso, conecte-se ao seu servidor OpenSSH preferido e confira a imagem qual
voc fatalmente vai se acostumar:
[fulano@casa ~] $ ssh ftal@trab
+--[ RSA 2048]----+
|
|
|
|
|
|
|
.
|
| o o
S
|
|
=.o.+ o
|
| =.=+* E
|
| o.*o= o
|
| .o .oo
|
+-----------------+

Economia: mltiplas sesses em uma


Voc sabe todas as transaes que ocorrem para estabelecer uma nica conexo
SSH entre seu cliente OpenSSH e o servidor? Pois experimente usar a opo -v (ou
ainda a -vv) quando se conectar ao servidor:
[fulano@casa ~] $ ssh ftal@trab -v
OpenSSH_5.3p1, OpenSSL 0.9.8o 01 Jun 2010
debug1: Reading configuration data /home/fulano/.ssh/config
debug1: Applying options for *
debug1: Reading configuration data /etc/ssh/ssh_config
debug1: Connecting to devio.us [66.7.199.108] port 22.
debug1: Connection established.
debug1: identity file /home/pablo/.ssh/identity type -1
debug1: identity file /home/pablo/.ssh/id_rsa type 1
debug1: identity file /home/pablo/.ssh/id_dsa type 2
debug1: Remote protocol version 2.0, remote software version
OpenSSH_5.5
debug1: match: OpenSSH_5.5 pat OpenSSH*
debug1: Enabling compatibility mode for protocol 2.0
debug1: Local version string SSH-2.0-OpenSSH_5.3
debug1: SSH2_MSG_KEXINIT sent
debug1: SSH2_MSG_KEXINIT received
debug1: kex: server->client aes128-ctr hmac-md5 none
debug1: kex: client->server aes128-ctr hmac-md5 none
debug1: SSH2_MSG_KEX_DH_GEX_REQUEST(1024<1024<8192) sent
debug1: expecting SSH2_MSG_KEX_DH_GEX_GROUP
debug1: SSH2_MSG_KEX_DH_GEX_INIT sent
debug1: expecting SSH2_MSG_KEX_DH_GEX_REPLY
33

debug1: Host 'devio.us' is known and matches the RSA host key.
debug1: Found key in /home/fulano/.ssh/known_hosts:1
Host key fingerprint is
d4:d3:fd:ca:c4:d3:e9:94:97:cc:52:21:3b:e4:ba:e9
+--[ RSA 2048]----+
|
|
|
|
|
|
|
.
|
| o o
S
|
|
=.o.+ o
|
| =.=+* E
|
| o.*o= o
|
| .o .oo
|
+-----------------+
debug1: ssh_rsa_verify: signature correct
debug1: SSH2_MSG_NEWKEYS sent
debug1: expecting SSH2_MSG_NEWKEYS
debug1: SSH2_MSG_NEWKEYS received
debug1: SSH2_MSG_SERVICE_REQUEST sent
debug1: SSH2_MSG_SERVICE_ACCEPT received
debug1: Authentications that can continue:
publickey,password,keyboard-interactive
debug1: Next authentication method: publickey
debug1: Offering public key: /home/fulano/.ssh/id_dsa
debug1: Server accepts key: pkalg ssh-dss blen 433
debug1: Authentication succeeded (publickey).
debug1: channel 0: new [client-session]
debug1: setting up multiplex master socket
debug1: Entering interactive session.
ftal@trab [~]$ _

Agora experimente usar -vv ou -vvv em vez de -v. Viu quantas transaes?
Se voc costuma abrir vrias conexes entre um mesmo usurio e um mesmo
servidor (digamos, do usurio fulano em casa para o usurio ftal em trab), voc
pode economizar vrias transaes se ativar a multiplexao de conexo.
Com a multiplexao, a primeira conexo cria um socket (um arquivo local) que
passa todos os dados de todas as sesses paralelas por uma nica conexo.
Isso mais fcil visto do que explicado, ento vamos l. Acrescente a seguinte linha
seo Host * do seu arquivo ~/.ssh/config:
Host *
ControlMaster auto
ControlPath /tmp/%r@%h:%p

34

No precisa apagar aquela linha VisualHostKey yes que voc j tinha inserido.
Basta incluir estas duas linhas na mesma seo, seja logo acima ou logo abaixo
de VisualHostKey yes.
Estas instrues no arquivo de configurao informam ao cliente OpenSSH que ele
deve sempre verificar se j existe um socket para a conexo de controle
(ControlMaster auto), criando um quando no houver. E tambm informam o local e
o nome do arquivo para criao do socket (/tmp/ftal@trab:22, no caso da conexo
ao usurio ftal em trab na porta padro do SSH). Outro valor possvel (talvez at
mais recomendvel) para o socket de controle seria:
ControlPath /home/fulano/%r@%h:%p
Desta forma, o socket de controle fica armazenado no diretrio home do usurio, e
no no diretrio /tmp/ onde os demais usurios da sua mquina cliente podem
potencialmente interagir com o socket.
Feito isso, experimente desconectar-se do servidor e abrir uma nova conexo com a
opo -v. Voc deve ver a seguinte linha l no incio das mensagens debug1:
debug1: auto-mux: Trying existing master
debug1: Control socket "/tmp/ftal@trab:22" does not exist

Elas significam que o seu cliente tentou encontrar um socket de controle (existing
master) para a conexo e no o encontrou com o nome e no diretrio onde ele sabia
procurar.
Um pouco abaixo, deve ter sido exibida tambm a linha:
debug1: setting up multiplex master socket
Ela indica que o socket mestre foi criado. Portanto, esta conexo a conexo
mestre.
Agora, sem desconectar a conexo mestre, abra um novo terminal e conecte-se
novamente ao mesmo servidor:
[fulano@casa ~] $ ssh -v ftal@trab
OpenSSH_5.3p1, OpenSSL 0.9.8o 01 Jun 2010
debug1: Reading configuration data /home/fulano/.ssh/config
debug1: Applying options for *
debug1: Reading configuration data /etc/ssh/ssh_config
debug1: auto-mux: Trying existing master
+--[ RSA 2048]----+
|
|
|
|
|
|
|
.
|
35

| o o
S
|
|
=.o.+ o
|
| =.=+* E
|
| o.*o= o
|
| .o .oo
|
+-----------------+
ftal@trab [~]$ _

Notou a diferena? Assim que o "novo" cliente encontrou o socket de controle j


aberto para a conexo mesma mquina, ele o utilizou, de forma que no precisou
abrir uma nova sesso SSH com o servidor.
Com isso, todo o trnsito de dados entre ambas as conexes
de fulano@casa a ftal@trab ocorre por um nico canal, que sai do
socket /tmp/ftal@trab:22 (localizado em casa) e vai at o servidor trab.
Essa economia no apenas esttica. Experimente criar as conexes sem a
opo -v e sem a multiplexao, e depois veja como usar a multiplexao acelera a
criao das novas conexes. Uma rpida medida de teste entre dois computadores
(um local, outro em algum ponto da Internet) no meu ambiente de teste:
SEM MULTIPLEXAO:
PRIMEIRA CONEXO:
[usuario@comp1 ~] $ ssh user1@serv
SEGUNDA CONEXO, EM OUTRO TERMINAL:
[usuario@comp1 ~] $ time ssh user1@serv 'exit'
real 0m2.430s
user 0m0.003s
sys 0m0.002s
******************
COM MULTIPLEXAO:
PRIMEIRA CONEXO:
[usuario@comp1 ~] $ ssh user1@serv
SEGUNDA CONEXO, EM OUTRO TERMINAL:
[usuario@comp1 ~] $ time ssh user1@serv 'exit'
real 0m0.284s
user 0m0.000s
sys 0m0.002s

Note: na segunda conexo, foram 2,4 segundos contra 0,3 segundos. Ponto para a
multiplexao!

36

Recursos bons ativados para todos


Se voc acha que esses recursos (randomart e multiplexao) devem ser ativados
para todos os usurios no seu cliente, basta fazer essa configurao de forma
global, isto , usar o arquivo/etc/ssh/ssh_config (ou /etc/ssh_config em algumas
raras distribuies).
O arquivo /etc/ssh/ssh_config o arquivo global de configurao do cliente
OpenSSH. Note, nas mensagens debug1 acima, que o OpenSSH l esse arquivo
quando realiza uma conexo, alm de ler o arquivo de configurao pessoal do
usurio, evidentemente.
O arquivo /etc/ssh/ssh_config normalmente j existe (ele instalado pelo
pacote openssh-client ou openssh), e costuma j ter contedo, embora todas as
linhas venham comentadas (ou seja, desativadas) por padro.
Para ativar globalmente para todos os usurios as configuraes de multiplexao e
de exibio da randomart, basta descomentar ou acrescentar as seguintes linhas
no /etc/ssh/ssh_config:
Host *
ControlMaster auto
ControlPath /tmp/%r@%h:%p
VisualHostKey yes

Configuraes diferentes para cada servidor


Se voc deseja ativar configuraes diferentes para um servidor especfico (por
exemplo, desativar a exibio da randomart para o servidor trab), basta usar uma
seo especfica para ele acima da seo global no arquivo de configurao
(~/.ssh/config ou /etc/ssh/ssh_config, ou ambos, caso voc use ambos), da
seguinte forma:
Host trab
VisualHostKey no
Host *
ControlMaster auto
ControlPath /tmp/%r@%h:%p
VisualHostKey yes

Qualquer seo especfica abaixo da seo global (Host *) ter suas opes ignoradas caso
tenham valores diferentes daquelas definidas na seo global. Ou seja, a configurao abaixo
para trab no funciona:
Host *
ControlMaster auto
37

ControlPath /tmp/%r@%h:%p
VisualHostKey yes
Host trab
VisualHostKey no

Tneis
Agora que j entramos nos recursos avanados do OpenSSH, hora de apresentar
aquele que talvez seja o mais apreciado pelos usurios avanados: tneis.
Um tnel SSH uma conexo criptografada entre duas mquinas (o servidor e o
cliente), que tem como objetivo redirecionar o trfego entre a mquina remota (o
servidor) e uma terceira, como mostra a figura:

38

O tubo amarelado que atravessa parte da nuvem representa justamente a conexo


criptografada (chamada de tnel) entre o seu computador local (indicado pelo texto
local) e o servidor SSH (indicado pro inter, de intermedirio).
Por sua vez, o servidor SSH se conecta mquina de destino (destino) sem
qualquer criptografia, e age como intermedirio nas comunicaes entre a sua
mquina local e a de destino.
Vejamos como usar isso.

Exemplos prticos
Fulano est em sua mquina de casa e precisa alterar uma regra no firewall da
empresa. Porm, o sistema de gerenciamento do firewall s pode ser acessado a
partir de dentro da prpria rede da empresa. Como fazer?
Basta criar um tnel SSH entre sua mquina de casa e uma mquina no trabalho,
redirecionando o trfego para a porta correta do sistema de gerenciamento do
firewall.
39

Para este exemplo, suponhamos a seguinte estrutura de rede:

Fulano em casa (mquina casa): 10.0.1.2

Mquina no trabalho (mquina trab): 222.222.222.222 (escutando SSH via


Internet)

Sistema de gerenciamento do firewall (mquina fire): 192.168.1.60 (na rede


interna da empresa), porta 4545

Com esse cenrio, a criao do tnel SSH com as caractersticas desejadas s


precisaria do seguinte comando:
[fulano@casa ~] $ ssh ftal@trab -NL 6000:192.168.1.60:4545

Este comando diz: crie uma conexo SSH com a mquina trab `` usando o usurio ``ftal,
no execute comando algum (-N) e ligue minha porta local (-L) 6000 porta 4545 da
mquina 192.168.1.60.
Confuso? Veja se a figura abaixo ajuda.

Como mostra a figura, quando o Firefox apontado para o endereo localhost:6000, o


trfego repassado, por meio de uma porta qualquer (representada por abc),
porta 22 da mquina trab via SSH isto , sob forte criptografia e, em seguida,
sai de trab por uma porta qualquer (xyz na figura) em direo porta 4545 de fire.
Outro exemplo til, mas que nem sempre d certo, o redirecionamento da porta
TCP 80 (ou seja, web). O motivo da frequente falha que muitos sites empregam
40

javascript e outras tecnologias que fazem, elas prprias, inmeras requisies a


outros servidores, possivelmente at em portas diferentes da TCP 80. O resultado
que muitos sites falham.

Tnel compactado
Um exemplo extremamente importante o emprego de tneis SSH com uso de
compactao. Um timo caso de uso: VNC via Internet.
O protocolo VNC simples e inegavelmente prtico, mas via Internet ele pode ser
impraticvel, dependendo da velocidade de acesso das duas pontas envolvidas.
Com uso da compactao no tnel, tudo funciona melhor.
Vejamos o comando:
[fulano@casa ~] $ ssh ftal@trab -CNL 55900:localhost:5900

Note, neste comando, o uso da opo -C, que ativa a compactao da conexo, e o
uso da mquina de destino localhost. Isto significa: entre em trab com o usurio ftal e,
l, redirecione a porta 5900 (VNC) de localhost para a porta 55900 da minha mquina
local. Notou a diferena? O redirecionamento de uma porta do prprio servidor SSH
intermedirio requer o uso de localhost no lugar da mquina de destino.
Em seguida, entre em trab e abra uma sesso VNC. Eu gosto do x11vnc, que exporta
a sesso X.org atual via VNC muito til quando o seu computador do trabalho
incapaz de exibir adequadamente aquele site todo feito em Flash, por exemplo.
[fulano@casa ~] $ ssh ftal@trab
ftal@trab [~]$ x11vnc
(vrias linhas na sada)

Por ltimo, num novo terminal em casa, conecte seu cliente VNC porta 55900 local:
[fulano@casa ~] $ vncviewer localhost::55900

Um detalhe: se voc j usa a multiplexao de terminais conforme proposto na parte


5 desta srie, importante criar o tnel sobre uma nova conexo SSH. Portanto, o
comando mais indicado, nesse caso, :
[fulano@casa ~] $ ssh ftal@trab -MCNL 55900:localhost:5900

Note a opo -M. Ela significa que a sesso SSH deve ser uma sesso mestre,
mesmo que j existam outras sesses SSH estabelecidas de casa para trab.

Mltiplas portas
41

Quer redirecionar mais de uma porta de trab para portas locais em casa? Basta usar
mltiplas vezes a opo -L, da seguinte forma:
[fulano@casa ~] $ ssh ftal@trab -MCN \
-L 55900:localhost:5900 \
-L 8080:localhost:80 \
-L 4545:fire:4545
\
-L 25:mail.empresa.br:25

Este comando, como voc pode imaginar, redireciona as portas:

5900 de trab para a 55900 de casa

8080 de trab para a 80 de casa

4545 de fire para a 4545 de casa (note que possvel usar o mesmo nmero
de porta local e remota sem qualquer problema)

25 de mail.empresa.br para a 25 de casa.

Note que as opes -M (criar uma nova sesso para esta conexo), -C (ativar a
compresso do trfego) e -N (no executar nenhum comando) s precisam ser
definidas uma nica vez, pois dizem respeito conexo entre fulano@casa e ftal@trab.

Tneis reversos
Se o seu problema envolte acesso externo sua mquina local, geralmente a
questo atravessar alguma (ou at vrias) camadas de NAT. Nestes casos, o
OpenSSH tambm oferece a soluo: um tnel reverso.
Se os tneis normais permitem a conexo da mquina local a destinos externos por
meio de uma porta local, os tneis reversos fazem justamente o oposto: permitem
conectar uma porta da mquina intermediria a outra porta de uma mquina remota
ou local por meio da sua mquina local. Calma, o comando esclarece:
[fulano@casa ~] $ ssh ftal@trab -NR 8080:www.google.com.br:80

Resultado: qualquer um que acesse a porta 8080 em trab ter sua conexo
redirecionada, por meio do tnel SSH que passa por casa, para a porta 80 de
www.google.com.br.
Outro exemplo: Fulano est em seu computador de trabalho, trab, e j sabe que
precisar acessar a mquina fire a partir do computador casa. Com isso, Fulano j
prepara o tnel reverso e deixa tudo pronto para uso. Quando chegar em sua casa,
bastar acessar a porta 8080 da mquina casa para se conectar porta 4545 de fire
atravs do tnel que passa por trab:
ftal@trab [~]$ ssh fulano@casa -NR 8080:fire:4545

42

Ou seja, para fire, o trfego vai parecer ter vindo de trab, que onde foi criado o tnel
reverso.
Assim como nos tneis normais, o uso de compresso altamente recomendvel,
assim como a criao de uma sesso mestre para esta conexo. E mltiplas portas
tambm podem ser encaminhadas, ou ainda misturadas com tneis normais:
ftal@trab [~]$ ssh fulano@casa -MCN \
-R 8080:fire:4545
\
-R 9091:localhost:8081
\
-L 3300:www.google.com.br:80 \
-R 55900:localhost:5900

Isto significa: abra uma conexo com fulano em casa e crie os tneis entre as portas:

8080 de casa para 4545 de fire (passando por trab, pois um tnel reverso)

9091 de casa para 8081 de trab (tnel reverso)

3300 de trab para 80 de www.google.com.br (passando por casa, pois um tnel


normal)

55900 de casa para 5900 de trab (tnel reverso).

VPN para os menos favorecidos


Isto mostra que o OpenSSH pode ser usado at para criar VPN's (redes privadas
virtuais, que se comportam como redes locais mas encontram-se espalhadas pela
Internet) rudimentares.

SSH + Proxy = VPN web


Uma outra forma esta com menos ar de gambiarra de usar a criptografia do
SSH para estabelecer uma espcie de VPN o uso de um servidor proxy no
computador intermedirio. Isto ser tema de um post exclusivo no futuro, mas j
posso adiantar as bases do sistema: configure um proxy simples (no precisa ser o
Squid, basta algo como o privoxy) na mquina intermediria isto , no servidor
OpenSSH e crie um tnel para a porta do proxy, depois configure seu navegador
para usar como proxy esta porta em localhost. Com isto, voc garante o trfego
criptografado entre a sua mquina e o computador intermedirio, e ainda consegue
fugir de diversos tipos de bloqueios de acesso locais.

43

Proxy HTTP em tnel


Cenrio

Suponhamos que voc esteja viajando com seu notebook. O hotel onde voc se hospedou
oferece sinal wi-fi, mas voc, como internauta ciente das ameaas sua segurana e tambm
sua privacidade, quer mais proteo.
Talvez o hotel at oferea a proteo do WPA ou WPA2 no ponto de acesso bem mais do
que a mdia dos hotis que conheo mas isso no significa muito; qualquer outro hspede
conectado mesma rede pode bisbilhotar o seu trfego.
A nica forma de garantir a sua privacidade na navegao ter certeza de que todo o seu
trfego circule por meio de uma conexo criptografada entre o seu computador e algum local
mais seguro fora da rede do hotel. Que tal usar um tnel para isso?
Graficamente, esta soluo seria assim:

44

A linha que liga laptop a servidor SSH, passando pelo ponto de acesso wi-fi, o tnel SSH
que vamos construir. Com ele, o que "entra no tnel" em laptop s sai para a Internet pela
outra ponta, em servidor SSH.
Lista de ingredientes

Se servidor SSH fosse nossa mquina de destino, esta tarefa exigiria apenas a criao do
tnel, sem qualquer passo adicional. Por exemplo, se quisssemos acessar somente a porta 80
de servidor SSH a partir da porta 8000 de laptop, bastaria o seguinte comando:

[fulano@laptop ~]$ ssh ftal@servidorSSH -NL 8000:localhost:80

Certo?
E se quisssemos acessar somente a porta 22 da mquina www.exemplo.br por meio do tnel,
bastaria:
[fulano@laptop ~]$ ssh ftal@servidorSSH -NL 45678:www.exemplo.br:22

Porm, nosso objetivo navegar vontade, com toda a segurana e a privacidade oferecidas
pelo tnel SSH. Portanto, precisamos de um proxy no servidor SSH alm do prprio
servidor OpenSSH, evidentemente.
Infelizmente, proxies dependem do protocolo. Entretanto, como a navegao web j capaz
de suprir quase todas as nossas necessidades atuais (e-mail, FTP e at shell possuem verses
web), um proxy HTTP j resolve praticamente todas as nossas necessidades.
Apresento o tinyproxy, um proxy HTTP bem pequeno e econmico, mas capaz de suprir todas
as necessidades do cenrio apresentado neste post. Claro que poderamos usar outros
45

servidores proxy mais completos, como Squid ou Privoxy, mas o tinyproxy mais fcil e
rpido de configurar, o que significa que deixa menos espao para abrirmos brechas de
segurana.
O tinyproxy est disponvel nos repositrios oficiais de todas as principais distribuies
GNU/Linux, ento sua instalao faclima. Em sistemas Ubuntu e outros derivados do
Debian:
apt-get install tinyproxy

Em sistemas Fedora:
yum install tinyproxy

Em sistemas Gentoo:
emerge tinyproxy

Configurao do tinyproxy

O tinyproxy bem fcil de configurar. Na verdade, no sistema Ubuntu usado para os testes
deste post, o arquivo de configurao j veio pronto. No foi preciso configurar nada, mas
sempre bom conferir se as seguintes linhas esto l:
Port 8888
Allow 127.0.0.1

A primeira informa a porta de rede onde o proxy escutar. O padro 8888 pode ser usado.
A segunda linha muito importante, pois define a disponibilidade do tinyproxy somente na
interface loopback, isto , apenas a mquina local (servidor SSH) tem permisso de se
conectar ao tinyproxy. Como proxies so vetores de ataque muito visados por
cibercriminosos, muito importante afastar suas fontes de problema.
E o melhor: ao permitir que somente a mquina local acesse o proxy, voc no impede que a
sua mquina remota use o tinyproxy, j que, atravs do tnel SSH, as conexes chegaro ao
tinyproxy como se viessem da mquina local.
Mos obra!

Instalado o tinyproxy no servidor SSH, inicie-o. Para conferir se ele est mesmo escutando,
use:
netstat -ltnp

e procure a linha que termina com tinyproxy. Note que ela indica a porta onde o programa
est escutando (8888, por padro).
De volta ao laptop no hotel temos 2 tarefas bem simples pela frente: criar o tnel (1
comando) e configurar o navegador web para usar seu servidor proxy.
Criar o tnel fcil, certo? Diga a, qual das 3 linhas abaixo cria o tnel da forma que
precisamos?
46

(A) [fulano@laptop ~]$ ssh ftal@servidorSSH -NL 8000:localhost:8888


(B) [fulano@laptop ~]$ ssh ftal@servidorSSH -NL 8888:localhost:8000
(C) [fulano@laptop ~]$ ssh ftal@servidorSSH -NR 8888:localhost:8000

Claro que voc acertou: a opo A. Somente ela cria o tnel SSH entre a porta 8000 em
laptop e a porta 8888 em servidorSSH no sentido certo. A opo C tambm cria esse tnel,
mas no sentido inverso: o que entra pela porta 8888 em servidorSSH redirecionado para a
porta 8000 em laptop. Ento, no resolve nosso problema.
Novamente, recomendo a configurao do login por chave pblica sem senha de laptop para
servidorSSH, para facilitar sua vida e talvez at automatizar a criao do tnel.
Com o tnel estabelecido entre as duas mquinas, basta configurar seu navegador web para
usar o proxy. No Firefox, isso significa ir ao menu Editar > Preferncias > Avanado > Rede
> Configurar conexo. Na janela que se abre, marque Configurao manual de proxy e
preencha o campo HTTP com:
localhost

e o campo Porta ao lado dele com 8000 (lembre-se, isso depende da porta de entrada que
voc tiver definido para o tnel SSH, e no da porta onde o tinyproxy escutar no servidor
SSH).
Marque tambm a caixa Usar este proxy para todos os protocolos.
Pressione OK, feche as janelas de configurao que foram abertas e digite o endereo
desejado no seu Firefox.
Parabns, voc est protegido por um tnel SSH.
Bnus: velocidade com privacidade

Boa parte do trfego do navegador web texto. E texto, como voc sabe, altamente
compactvel. Alm disso, voc tambm sabe que conexes de hotel geralmente so LENTAS
(em negrito e caixa alta!). Ento, o que voc acha de comprimirmos tudo que passa no nosso
tnel SSH de forma a melhorar pelo menos um pouco a velocidade de carregamento das
pginas nesse cenrio?
Comprimir o contedo de um tnel muito fcil: basta usar a opo -C do comando ssh
usado para criar o tnel:
[fulano@laptop ~]$ ssh -C ftal@servidorSSH -NL 8000:localhost:8888

Esta tcnica especialmente vlida quando o seu servidor SSH (e proxy) tem uma boa largura
de banda para entrada (download), mas a sada (upload) limitada. Sem a compresso, o
gargalo da sua conexo pode ser justamente a velocidade de upload do servidor SSH, ou, mais
frequentemente, a pssima velocidade de download do hotel. Em ambos os casos, compactar
o trfego do tnel uma boa ideia.
47

E lembre-se sempre: se voc estiver usando a multiplexao de sesses SSH, importante


criar o tnel com uma conexo mestre:
[fulano@laptop ~]$ ssh -MC ftal@servidorSSH -NL 8000:localhost:8888

Por hoje s.
Bons tneis e boa navegao!

Controle de acesso
Por interface de rede

O arquivo /etc/ssh/sshd_config contm uma boa quantidade de opes de configurao.


Uma delas pode ser muito importante para determinarmos quem tem ou no tem acesso ao
servidor:
ListenAddress 0.0.0.0

Esta opo, se definida com o valor acima, faz com que o servidor OpenSSH escute em todas
as interfaces de rede da mquina.
Se seu servidor possui mais de uma conexo de rede, cabe a seguinte pergunta: o OpenSSH
deve escutar em todas as interfaces?
Caso seu servidor tenha uma interface com o IP 10.1.2.3 e a outra com o IP 192.168.100.200,
e no precise escutar OpenSSH na primeira, basta usar o seguinte valor no arquivo de
configurao do servidor OpenSSH (/etc/ssh/sshd_config):
ListenAddress 192.168.100.200

Por iptables
48

Bloquear um servio de rede via iptables sempre uma possibilidade, mas pode ser
interessante deixar esse recurso como ltima opo. A menos, claro, que voc esteja
concentrando no iptables todas as filtragens de servios.
Nesse caso, bastam linhas como:
# iptables -A INPUT -s <rede_ou_endereo_de_origem> \
-p tcp \
--dport 22 \
-j ACCEPT

para ativar o servio SSH vindo de determinada rede ou host.

Por tcp_wrappers

O sistema tcp_wrappers foi feito justamente para dar aos servios como o OpenSSH um
controle de acesso mais refinado. Com ele, basta incluir nos arquivos /etc/hosts.allow e
/etc/hosts.deny os IPs ou redes que tm ou no tm, respectivamente, permisso de acessar
o servio.
Um dado interessante do tcp_wrappers que no ele que nega ou permite acesso aos
servios. O tcp_wrappers simplesmente informa ao servio especfico caso o endereo de
origem da conexo seja proibido. Ento, continua sendo o servio no caso, o OpenSSH
quem nega ou permite acesso. Ele simplesmente passa a contar com a ajuda do tcp_wrappers
para tomar essa deciso.
Por isso, antes de usar o tcp_wrappers em conjunto com seu servidor sshd preciso conferir
se esse binrio, o /usr/sbin/sshd, inclui o suporte a tcp_wrappers. Basta um comando:
# ldd $(which sshd)
lib...
...
libwrap.so.0 => /lib/libwrap.so.0 (0x0000f750677ca000)
...
...
# _
Como voc pode ver, o binrio sshd est linkado biblioteca libwrap, que justamente o

que

precisvamos confirmar. Nem todos os servios em GNU/Linux possuem a opo de usar


tcp_wrappers.
Se voc deseja impedir que a rede 10.0.0.0/8 se conecte ao seu servidor OpenSSH, basta
acrescentar a seguinte linha ao arquivo /etc/hosts.deny:
sshd: 10.0.0.0/8

Porm, se h uma mquina dentro da rede 10.0.0.0/8 (a mquina 10.1.2.3, por exemplo) que
deve poder acessar seu servidor, voc pode usar a linha um pouco diferente:
sshd: 10.0.0.0/8 EXCEPT 10.1.2.3

49

possvel ainda definir nomes de redes e de hosts. Por exemplo, para proibir mquinas do
domnio perigo.br de acessarem seu servidor OpenSSH, basta adicionar a seguinte linha ao
/etc/hosts.deny:
sshd: .perigo.br

Concluso

O tcp_wrappers um sistema extremamente poderoso e flexvel, caractersticas tpicas das


solues livres. Um post futuro ainda vai tratar de mais detalhes dele. Por enquanto, confira as
pginas de manual hosts_access(5) e hosts_options(5)
At breve!

50

Das könnte Ihnen auch gefallen