Beruflich Dokumente
Kultur Dokumente
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:
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
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
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
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 ./
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.
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> _
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%
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
14
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.
No fantstico?
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
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.
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.
19
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
21
Entre os dois mtodos, prefira sempre o fcil, pois ele faz muito mais do que apenas copiar a
chave pblica; ele:
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.
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 ~] $ _
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 ~] $ _
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
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:
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'
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 ~] $ _
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?
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 ~] $ _
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
|
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.
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
|
+-----------------+
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 [~]$ _
Note: na segunda conexo, foram 2,4 segundos contra 0,3 segundos. Ponto para a
multiplexao!
36
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
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
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.
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
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
4545 de fire para a 4545 de casa (note que possvel usar o mesmo nmero
de porta local e remota sem qualquer problema)
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)
43
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:
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
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
Por hoje s.
Bons tneis e boa navegao!
Controle de acesso
Por interface de rede
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
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
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
50