Jails em SSH: Montando sistema de Shell Seguro

Neste artigo vamos aprender a criar sistemas de Jail em SSH e assim separar recursos a usuários shell de acordo com suas necessidades, criando um ambiente secundário, o que aumenta a segurança na disponibilização de acessos remotos a terceiros.

[ Hits: 62.669 ]

Por: Anderson L Tamborim em 19/02/2008 | Blog: http://y2h4ck.wordpress.com


Montando a estrutura de Jail



Vamos criar a pasta onde será criada nossa primeira Jail. Nela iremos instalar um Jail contendo o seguinte:
  • A shell Bash básica
  • Editores de texto
  • SCP

# mkdir /home/jail
# chown root:root /home/jail


Isto evita que bisbilhoteiros do lado de fora, entrem para dentro da Jail para ver o que os outros usuários acessam.

O Jailkit tem um aplicativo chamado jk_init que permite criar e copiar programas para o ambiente Jail de forma rápida e eficiente.

Vamos criar a Jail utilizando-o:

# jk_init -v -j /home/jail basicshell editors scp

Após executar este comando o jk_init irá gerar os links simbólicos e criar o mknod s dos /dev/random e /dev/null da sua jail. O jk_init copia os binários e faz uma referência para as bibliotecas compartilhadas que cada binário utiliza.

Para saber quais shared libs cara programa utiliza é fácil, basta usar o comando ldd:

# whereis scp
scp: /usr/bin/scp /usr/X11R6/bin/scp

# ldd /usr/bin/scp
libresolv.so.2 => /lib/tls/i686/cmov/libresolv.so.2 (0xb7ee0000)
libcrypto.so.0.9.8 => /usr/lib/i686/cmov/libcrypto.so.0.9.8 (0xb7da6000)
libutil.so.1 => /lib/tls/i686/cmov/libutil.so.1 (0xb7da1000)
libz.so.1 => /usr/lib/libz.so.1 (0xb7d8d000)
libnsl.so.1 => /lib/tls/i686/cmov/libnsl.so.1 (0xb7d77000)
libcrypt.so.1 => /lib/tls/i686/cmov/libcrypt.so.1 (0xb7d49000)
libgssapi_krb5.so.2 => /usr/lib/libgssapi_krb5.so.2 (0xb7d2d000)
libkrb5.so.3 => /usr/lib/libkrb5.so.3 (0xb7cb1000)
libk5crypto.so.3 => /usr/lib/libk5crypto.so.3 (0xb7c8b000)
libcom_err.so.2 => /lib/libcom_err.so.2 (0xb7c88000)
libkrb5support.so.0 => /usr/lib/libkrb5support.so.0 (0xb7c83000)
libc.so.6 => /lib/tls/i686/cmov/libc.so.6 (0xb7b52000)
libdl.so.2 => /lib/tls/i686/cmov/libdl.so.2 (0xb7b4e000)
/lib/ld-linux.so.2 (0xb7efb000)

Ou seja o jk_init precisa referenciar todas estas libs, caso contrário o SCP não irá funcionar de forma adequada.

Após o comando acima para criar nossa jail tenha concluído vamos dar uma checada no que ele gerou:

# cd /home/jail/
# ls -la

total 32
drwxr-xr-x 8 root root 4096 2008-02-19 15:41 .
drwxr-xr-x 5 root root 4096 2008-02-19 15:35 ..
drwxr-xr-x 2 root root 4096 2008-02-19 15:41 bin
drwxr-xr-x 2 root root 4096 2008-02-19 15:41 dev
drwxr-xr-x 5 root root 4096 2008-02-19 15:41 etc
drwxr-xr-x 3 root root 4096 2008-02-19 15:41 lib
drwxr-xr-x 5 root root 4096 2008-02-19 15:41 usr
drwxr-xr-x 3 root root 4096 2008-02-19 15:41 var

Ele criou a estrutura necessária para que nosso usuário possa viver com o suficiente para ser feliz (ou não rs rs) neste ambiente.

Para viver nesta nova jail vamos criar um usuário chamado "bandit", ou seja o bandit vai ficar na Jail? (piada péssima eheh).

# useradd bandit
# passwd bandit


O usuário bandit existe normalmente como qualquer outro:

# ls -ld /home/bandit
drwxr-xr-x 2 bandit bandit 4096 2008-02-19 15:46 /home/bandit

# cat /etc/passwd | grep bandit
bandit:x:1002:1002:,,,:/home/bandit:/bin/bash

Vamos agora utilizar o comando jk_jailuser. Este comando irá criar o ambiente do nosso usuário dentro da Jail.

# jk_jailuser -m -j /home/jail bandit

Para que o usuário bandit possa ser direcionado para a jail no momento do login ele deve ter em seu interpretador de comando no /etc/passwd o jk_chrootsh. Este será o responsável para colocar o usuário em seu devido ambiente com seus environment:

No /etc/passwd deve ficar da seguinte forma:

bandit:x:1002:1002:,,,;/home/jail/./home/bandit:/usr/sbin/jk_chrootsh


Onde como sabemos a pasta de home dele deve apontar para a pasta dentro do /home/jail.

Obviamente o diretório /home/jail/home/bandit deve existir e pertencer ao usuário, sendo assim vamos criá-lo:

# mkdir home
# cd home/
# mkdir bandit
# chown bandit:bandit bandit/
# ls -la

total 12
drwxr-xr-x 3 root root 4096 2008-02-19 15:51 .
drwxr-xr-x 9 root root 4096 2008-02-19 15:51 ..
drwxr-xr-x 2 bandit bandit 4096 2008-02-19 15:51 bandit

Pronto, o usuário tem seu novo home.

Vamos também criar um /tmp para que os usuários possam utilizá-lo dentro da Jail:

# mkdir /home/jail/tmp
# chmod a+rwx /home/jail/tmp


É muito importante criar também um /dev/null dentro do Jail, uma vez que vários aplicativos como por exemplo SCP precisam do /dev/null para executar corretamente.

# mknod -m 666 /home/jail/dev/null c 1 3

Edite agora as entradas do /etc/passwd e /etc/group de sua JAIL ou seja, os arquivos /home/jail/etc/passwd e /home/jail/etc/group. Verifique se eles estão de acordo com os abaixo, com as informações corretas sobre o usuário:

# cat etc/passwd

root:x:0:0:root:/root:/bin/bash
bandit:x:1002:1002::/home/bandit:/bin/bash

# cat etc/group

root:x:0:
bandit:x:1002:

Feito isto nossa primeira Jail está pronta e já pode ser utilizada.

Para efetuar a manutenção da Jail usaremos o aplicativo jk_update. Ele vai servir para procurar por arquivos supostamente perigosos como SUIDs, e arquivos com permissão de execução global. Isso vai ajudar muito na segurança da sua Jail.

Para checar utilize:

# jk_update -j /home/jail -d

Existe um pequeno arquivo de configuração para o jk_update onde você define o que deve ser checado ou não. Ele é bem intuitivo e pode ser configurado de acordo com a sua necessidade.

# cat /etc/jailkit/jk_check.ini
[/home/testchroot]
# jk_check does not run any tests in this directory (useful for proc filesystem)
# be careful!! there is I repeat NO SINGLE TEST in this directory
#ignorepatheverywhere =

# jk_check compares files if they are equal to their counterparts in the real system,
# using md5sum(). In the specified directories it will not test if files are equal
# it will still test for world writable directories and setuid files
ignorepathoncompare = /home/testchroot/home, /home/testchroot/etc

# jk_check tests directory permissions, if you deliberately made some directories writable
# for group or others, or you don't care, specify them here
ignorewritableforgroup = /home/testchroot/home
ignorewritableforothers = /home/testchroot/home/tmp

# jk_check tests for setuid root and setgid root files
# if you deliberately have such files specify them here
ignoresetuidexecuteforuser = /home/testchroot/usr/bin/smbmnt, /home/testchroot/usr/bin/smbumount
ignoresetuidexecuteforgroup = /home/testchroot/usr/bin/smbmnt, /home/testchroot/usr/bin/smbumount
ignoresetuidexecuteforothers =

Terminada esta primeira parte está na hora de colocar nosso projeto sob-fogo e verificar se a Jail realmente se comporta da forma adequada. :)

Página anterior     Próxima página

Páginas do artigo
   1. Prólogo
   2. Introdução - Jail Chroot e funcionalidades
   3. Iniciando o Projeto: Recursos necessários
   4. Montando a estrutura de Jail
   5. Projeto sob fogo: Testando o nosso sistema Jail
   6. Considerações finais
Outros artigos deste autor

Análise Forense - Aspectos de perícia criminal

PortSentry: Melhorando a segurança do seu Linux

PHLAK :: [P]rofessional [H]acker's [L]inux [A]ssault [K]it

Segurança no SSH via plugins da PAM

Race condition - vulnerabilidades em suids

Leitura recomendada

ANDRAX - Pentest usando o Android

Protegendo seu servidor de e-mail Postfix

PuTTY - Estabelecendo Chave Secreta com OpenSSH

Integração de servidores Linux com Active Directory

Metasploit Adobe Exploit

  
Comentários
[1] Comentário enviado por alpkaiser em 20/02/2008 - 11:45h

Muito bom.

Mais uma vez um ótimo artigo que vem ajudar em muito na implementação de segurança em servidores Linux.

Parabéns.

[2] Comentário enviado por capitainkurn em 20/02/2008 - 11:49h

Ótimo artigo! Aliás gosto muito de seus artigos e frequentemente costumo tirar umas colas.
Já está em meus favoritos.

Parabéns!

[3] Comentário enviado por marcaoguitarra em 20/02/2008 - 12:32h

Bonzinho!!!
heheehe
muito bom cara, eu já tinha feito um apache em chroot mas não tão bem configurado assim, gostei desse jaill_kit...

[4] Comentário enviado por kalib em 20/02/2008 - 14:46h

A primeira coisa q me veio a cabeça foi um honey pott... rsrsrs
Parabéns pelo artigo camarada...o conteúdo está excelente, didático...
O conteúdo é bastante interessante...ainda não conhecia essa prática.
Parabéns novamente pelo excelente trabalho. ;]

[5] Comentário enviado por tinti em 21/02/2008 - 09:35h

Vc deitou cara!!! Muito bom!!!

[6] Comentário enviado por maran em 21/02/2008 - 21:12h

Assim eu fiquei pensando aqui né em como fazer um comentário, e cara não precisa dizer nada, simplesmente perfeito...

Abraços.

[7] Comentário enviado por removido em 25/02/2008 - 12:02h

Simplesmente fantástico!! Parabéns, com certeza utilizar Jails e Chroot é mais uma forma de mantermos nossos servicos mais seguros.

Continue postando novos artigos e utilizando a mesma didática.

Abracos.

[8] Comentário enviado por rfmartins em 01/03/2008 - 19:09h

fiz tudo que esta notutorial, mas quando crie o usuario, ele nao aparece no home.
verifiquei o /etc/passwd e o usuario esta da sequinte forma:

bandit:x:1002:1002::/home/bandit:/bin/sh

como posso ressolver isto ??

[9] Comentário enviado por danimontelo em 03/12/2009 - 12:13h

Excelente tutorial! Ajudou-me bastante em tornar mais seguro o acesso remoto aos servidores que administro.

Grata e abraços, Dani

[10] Comentário enviado por carlosparisotto em 25/08/2014 - 09:26h

Primeiramente, muito bom o artigo.
Estou usando essa ferramenta há um tempo já, porém agora estou precisando fazer um SSH sem senha
para um desses usuários enjaulados e não estou conseguindo. Sabe se é possível? Se já conseguiste
fazer, favor passar o procedimento, pois estou fazendo o mesmo procedimento que para um usuário
comum e não está funcionando. Obrigado

[11] Comentário enviado por carlosparisotto em 25/08/2014 - 11:11h

Opa, descobri que o problema na verdade é o meu SELinux, então já entra em outro tópico. Vou verificar. Valeu!


Contribuir com comentário