Pular para o conteúdo

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.
Anderson L Tamborim y2h4ck
Hits: 68.803 Categoria: Linux Subcategoria: Segurança
  • Indicar
  • Impressora
  • Denunciar

Parte 4: 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. :)

   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

PortSentry: Melhorando a segurança do seu Linux

Carnivore e Altivore: Os predadores do FBI

Análise passiva (parte 2)

Race condition - vulnerabilidades em suids

OpenVZ: Virtualização para servidores Linux

Alta Disponibilidade (High Availability) em sistemas GNU/Linux

Bloqueio de usuários com o chroot

Replicação com OpenLDAP

Arpwatch - Detecte em sua rede ataques de Arp Spoofing/Arp Poisoning

Introdução ao ModSecurity

#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

Entre na sua conta para comentar.