9.24.2012

Informação básica sobre OpenSSH


O protocolo ssh tornou-se o programa de eleição para conexões remotas, visto que a comunicação é encriptada ao contrário do que sucede com os velhinhos telnet ou rlogin.
O protocolo ssh usa o mecanismo de encriptação de chave pública. Nesta forma de criptografia necessitamos de duas chaves, uma chave pública e outra privada. A chave pública pode ser livremente divulgada e a chave privada deve ser protegida a todo o custo, visto ser esta a responsável pela efetiva segurança da encriptação. Para mais informação sobre este método clique aqui.

Do ponto de vista do administrador, deveremos sempre efetuar logins remotos recorrendo ao protocolo ssh e nunca por telnet. Tal aplica-se a máquinas Linux, routers e outros dispositivos onde exista essa opção. Saliente-se igualmente, que se deverá em analogia usar sempre o protocolo https ao invés do http para aceder a configurações de equipamentos. Deve-se ter igualmente em atenção o tamanho da chave.  Há alguns anos consideravam-se as chaves de 128 bits seguras. Hoje em dia deverão ser escolhidas chaves de 512 ou mesmo 1024 bits. Quanto maior é a chave mais lento se torna o processo de encriptação, sendo que actualmente tal não constituí um problema, mesmo para chaves de 1024 bits.

No mundo Linux a implementação mais conhecida do servidor de ssh é o OpenSSH.  Para efetuar ligações ssh existem em Linux aplicações nativas que o fazem. Para Windows, destaca-se o inevitável Putty e para administradores mais avançados recomenda-se a solução comercial SecureCrt (disponibiliza atualmente versões para Linux).

Numa instalação mínima RHEL ou CentOS  o OpenSSH virá instalado por defeito. Pode sempre verificar-se se está instalado
[root@serverA ~]# rpm  -qa | grep -i OpenSSH
OpenSSH-*
OpenSSH-server-*
………

Se por alguma incidência o OpenSSH não estiver instalado pode sempre fazê-lo com o comando:

[root@serverA ~]# yum  -y install OpenSSH-server

Em Ubuntu os commandos análogos são:

mm@ubuntu-serverA:~$ dpkg -l OpenSSH-server 

mm@ubuntu-serverA:~$ sudo apt-get  -y install OpenSSH-server

Se pretende que a máquina seja acedida por ssh deverá assegurar que o deamon está ativo. Em sistemas RHEL/CentOS confirme com 

[root@serverA ~]# service sshd status
sshd (pid 2242 2101) is running..

Caso não esteja a correr, execute o comando 

[root@serverA ~]# service sshd start

Para parar deverá usar stop para reinicializar, restart. 

Analogamente para Ubuntu:

pmatias@ubuntu-serverA:~$ sudo /etc/init.d/ssh start

e

pmatias@ubuntu-serverA:~$ sudo /etc/init.d/ssh stop

Conforme mencionado, o OpenSSH costuma estar instalado e a correr na maioria das distribuições de Linux. O ficheiro de configuração costuma estar localizado na diretoria /etc/ssh/ com o nome sshd_config. As instalações baseadas em Debian, como o Ubuntu, também costumam ter o ficheiro de configuração nessa localização. Alguns dos parâmetros de configuração: 

  • AuthorizedKeysFile:  Especifica o ficheiro que contém as chaves públicas. Geralmente /[directoria home]/.ssh/ authorized_keys
  • Ciphers: Lista de cifras permitidas para a versão 2 do protocolo.
  • Port: Porta utilizado pelo protocolo, por defeito é a 22.
  • Protocol: Versão do protocolo. Existindo dois, o 1 e o 2, deverá ser sempre utilizado o 2, visto que o 1 é atualmente considerado inseguro. 
  • AllowTcpForwarding : Especifica  se o encaminhamento do protocol TCP é permitido. Por defeito encontra-se configurada a opção sim.
  • X11Forwarding: Especifica se o encaminhamento do protocolo X11 é permitido.  Por defeito encontra-se configurada a opção não.
  • ListenAddress: Especifica o endereço local que o deamon SSH escuta. 
O OpenSSH possui vários programas, o óbvio shh, o Secure Copy – scp e o Secure Ftp.

O programa cliente de ssh vai assumir que a autenticação no sistema remoto será com o mesmo utilizador que nesse momento está a efetuar a ligação no sistema local. Se no entanto pretender efetuar a autenticação com outro utilizador (supõe-se que está autenticado como root no sistema local e pretende ligar-se como utilizador pmatias no sitema remoto), deverá utilizar o comando: 

[root@serverA ~]# ssh -l pmatias serverB

Ou 

[root@serverA ~]# ssh pmatias@serverB

Após inserir a password correta efetuará login no sistema com a conta de utilizador pretendida. 
Relembre-se que se pretender autenticar-se como root, bastará

[root@serverA ~]# ssh serverB

Com o protocolo IPv6 implementado: 

root@serverA ~]# ssh -6  pmatias@2001:DB8::2

Obviamente, ao invés do nome do servidor pode usar o endereço IP da máquina. 

Uma das utilizações interessantes do ssh encontra-se na criação de túneis entre um sistema local e sistemas remotos, como se de uma VPN se tratasse, visto que a informação circula encriptada. Imaginemos o cenário: 

Temos uma máquina configurada como firewall (ServerA) com duas interfaces de rede. Uma das interfaces está diretamente ligada à Internet e a outra à LAN da empresa. Imagine-se que a interface pública ou WAN tem o IP 1.1.1.1 e a interface privada 192.168.1.1 da LAN 192.168.1.0/24. Todos os servidores e workstations não são acessíveis através da Internet. O único serviço permitido na Interface WAN é o deamon sshd. 

Suponha-se que um dos servidores internos possui uma aplicação WEB de contabilidade que o utilizador pmatias quer aceder a partir da Internet. O nome do servidor é “Contab”, com um endereço IP 192.168.1.100. O nome da workstation da qual vai ser estabelecida a ligação é “pcpessoal”. Relembrando que as máquinas da LAN da empresa não podem ser diretamente acedidas através da Internet, teremos então que efetuar o chamado tunneling SSH . Vejamos com detalhe todo o processo: 



  1. No seu próprio computador o utilizador vai autenticar-se com as suas credenciais.
  2. Localmente, o utilizador vai criar um túnel da porta 9000 da sua máquina à porta 80 da máquina que corre a aplicação web à qual pretende aceder. Para o fazer vai executar o comando  [pmatias@pcpessoal ~]# ssh  –L 9000:192.168.1.100:80 1.1.1.1 ou efetuar a ligação ssh e  ssh> -L 9000:192.168.1.100:80
  3. Após autenticar-se com sucesso no servidor remoto, neste caso, o serverA, poderá então abrir o browser para aceder à aplicação. O utilizador verificará se o túnel está a funcionar corretamente, abrindo o browser para aceder à porta que está a reencaminhar o tráfego na máquina local e colocando o endereço http://localhost:9000 .
  4. Se tudo correu conforme previsto, o conteúdo web fornecido pelo servidor da aplicação surgirá, tal como se o mesmo estivesse a ser acedido a partir de uma máquina dentro da LAN da empresa.Para terminar a ligação e desfazer o túnel bastará desligar a ligação ssh estabelecida. 
Este método permite o acesso seguro a sistemas, seja em redes internas LAN ou através da Internet. Não pode ser considerada uma solução VPN completa visto que não é possível aceder concorrencialmente a todos os sistemas de uma LAN remota, mas funciona perfeitamente para aceder aos recursos de uma máquina. No exemplo referido, efetuou-se tunneling de http através de SSH, mas qualquer protocolo poderia ter sido utilizado, como Telnet ou VNC. Este método é igualmente utilizado para ultrapassar eventuais restrições de firewalls e proxies para aceder a recursos. 

Relembrando a sintaxe do comando: 

ssh –L [porta local]:[IP da máquina de destino]:[porta de destino] [IP do servidor ssh]

O Secure Copy (scp) é utilizado como o substituto do antigo rcp, permitindo efetuar cópias de ficheiros entre máquinas. Imaginemos que o utilizador está autenticado na sua máquina e pretende copiar um ficheiro chamado . bashrc localizado na sua diretoria pessoal  para a sua diretoria pessoal no ServerA. O comando será: 

[pmatias@hostA ~]$ scp .bashrc serverA:/home/yyang

Para efetuar a operação inversa, bastará trocar a ordem

[pmatias@hostA ~]$ scp serverA:/home/yyang/.bashrc  .

O Secure FTP permite uma operacionalidade idêntica ao protocolo ftp, mas de forma segura. Para efetuar a ligação a um sistema remoto que tenha um servidor de SFTP a correr bastará executar o comando, usando as credenciais do acesso por ssh:

[root@hostA ~]# sftp yyang@serverA

Após a autenticação surgirá a prompt 

sftp>

Poderá, tal como no acesso por ftp, listar directorias e efetuar download e upload de ficheiros. Para mais informações sobre os comandos disponíveis digitar ? .

Existe um excelente software para Windows que permite toda a operacionalidade do SCP e do SFTP num ambiente user-friendly – WinSCP-. Descarregue-o em http://winscp.net/eng/download.php

Fontes: Linux Administration, a beginners guide, wikipedia. 


9.19.2012

Funcionamento básico do comando tar


Num sistema Linux a compressão e arquivamento de ficheiros são normalmente realizados com dois comandos gzip e o tar.
O comando tar agrupa vários ficheiros num um único ficheiro, sem compressão. Para comprimir esse grande ficheiro necessitamos de um programa específico para o efeito.
Podendo sempre recorrer ao manual do programa [man tar] para ver todas as potencialidades, as opções mais comuns são as seguintes:

-c [cria um novo arquivo]
-t [visualiza o conteúdo do arquivo]
-x [extrai o conteúdo do arquivo]
-f [especifica o nome do ficheiro ou do dispositivo no qual o arquivo está localizado]
-j [filtra o arquivo com o programa de compressão bzip2]
-z [filtra o arquivo com o programa de compressão gzip]

Saliente-se que o comando tar é dos poucos programas em Linux onde a ordem de colocação das opções é relevante. A opção -f (localização do ficheiro) se colocada noutro lugar não funcionará.

Vejamos alguns exemplos, criando uma pasta com 4 ficheiros:

[marco@pweb _Temp]$mkdir lixo ; touch lixo/{1,2,3,4}

Criemos agora uma ficheiro de arquivo lixo.tar contend todos os ficheiros existentes na pasta lixo.
[marco@pweb _Temp]$ tar -cf lixo.tar lixo/

Para visualizarmos o processo de arquivamento, criemos o ficheiro 2lixo.tar com a opção –v

[marco@pweb _Temp]$tar -vcf 2 lixo.tar lixo
lixo/
lixo/2
lixo/4
lixo/1
lixo/3

Nenhum destes ficheiros de arquivo possui algum tipo de compressão. Para comprimirmos os ficheiros, utilizamos o comando gzip em conjunto com o comando tar, criando o ficheiro 3lixo.tar.gz

[marco@pweb _Temp]$tar -vczf 3lixo.tar.gz lixo/
lixo/
lixo/2
lixo/4
lixo/1
lixo/3

Para extrair o conteúdo do ficheiro bastará usar a opção x

[marco@pweb _Temp]$tar -vxzf 3lixo.tar.gz
lixo/
lixo/2
lixo/4
lixo/1
lixo/3

Permissões em Linux


Num sistema Linux existem 3 níveis de utilizadores do sistema:

1. Utilizador (User) representado pela letra u refere-se ao dono do ficheiro .
2. Grupo ( Group) representado pela letra g, refere-se ao grupo de utilizadores .
3. Outros (Other) representado pela letra  o, refere-se a todos os outros utilizadores.

Para além disso existe outro nível de representação que engloba todos os utilizadores, representado pela letra a (ALL)
Refira-se igualmente os níveis de permissões:

1. Leitura (Read), representado pela letra r
2. Escrita (Write), representado pela letra w
3. Execução ( Execute), representado pela letra x

Os operadores ariteméticos “+”, “-“ e “=” permitem efetuar as operações de atribuição das permissões aos ficheiros.  O “+” e p “-“ atribuem e removem atribuições e o “=” define mandatoriamente as permissões removendo as existentes.

A mera listagem dos ficheiros com o comando ls não nos permite verificar as permissões. Para tal devemos colocar o switch –l , executando o comando ls –s

[marco@pweb _Temp]$ ls –l
total 0
-rw-rw-r--. 1 marco marco 0 Sep  9 01:57 exp1.txt

Pelo output do comando, verificamos que o Utilizador ou dono do ficheiro possui permissões de leitura e escrita, assim como os membros do grupo. Os restantes utilizadores apenas possuem permissões de leitura do ficheiro.

Suponhamos que temos determinado ficheiro que pretendemos executar, por exemplo, um scipt para realizar determinada tarefa. O ficheiro apenas tem permissões por defeito

[marco@pweb _Temp]$ ls –l
total 0
-rw-rw-r--. 1 marco marco 0 Sep  9 02:05 programa
[marco@pweb _Temp]$ chmod u+x programa
[marco@pweb _Temp]$ ls -l
total 0
-rwxrw-r--. 1 marco marco 0 Sep  9 02:05 programa

Neste momento, apenas o dono do ficheiro poderá executar o ficheiro. Na maioria das distribuições os ficheiros executáveis apresentam uma cor diferenciada dos restantes.
Se quisermos remover todas as permissões a todos os restantes utilizadores bastaria

[marco@pweb _Temp]$ chmod go-rwx programa
[marco@pweb _Temp]$ ls -l
total 0
-rwx------. 1 marco marco 0 Sep  9 02:05 programa

Para além deste método podemos mudar as permissões em modo octal , sendo este sistema mais direto e simples quando compreendido e dominado.
Para tal, estudem-se as seguintes tabelas:

User 
Group
Other
r
w
x
r
w
x
r
w
x
4
2
1
4
2
1
4
2
1

0
---
Sem permissões
1
--x
Execução
2
-w-
Somente escrita
3
-wx
Escrita e execução
4
r--
Leitura
5
r-x
Leitura e execução
6
rw-
Leitura e escrita
7
rwx
Leitura, escrita e execução

Suponhamos que pretendemos que o ficheiro tenha todas as permissões para o seu dono e nenhumas para o grupo e para os outros utilizadores. 

[marco@pweb _Temp]$ chmod 700 programa
[marco@pweb _Temp]$ ls -l
total 0
-rwx------. 1 marco marco 0 Sep  9 02:05 programa

Colocamos 700 (4+2+1, 0, 0), contemplando assim as operações de execução, leitura e escrita em todos os utilizadores. 
Vejamos agora qual o comando a executar para que o dono do ficheiro tenha todas as permissões, o grupo apenas possa ler e executar, e todos os restantes utilizadores apenas executar. 

[marco@pweb _Temp]$ chmod 751 programa
[marco@pweb _Temp]$ ls -l
total 0
-rwxr-x--x. 1 marco marco 0 Sep  9 02:05 programa