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