Enjaulamento de usuário no sistema operacional
Coloco neste artigo, as configurações para criar uma jaula para um usuário no sistema operacional.
Enjaulamento de usuário no sistema operacional
Estarei pontuando abaixo as devidas configurações:
1. Criação do diretório do usuário:
# mkdir /home/squadra
2. Arquivos de suporte de sessão do usuário:
# ls -l /dev/{null,zero,stdin,stdout,stderr,random,tty}
crw-rw-rw- 1 root root 1, 3 Mai 19 2014 /dev/null
crw-rw-rw- 1 root root 1, 8 Mai 19 2014 /dev/random
lrwxrwxrwx 1 root root 15 Mai 19 2014 /dev/stderr -> /proc/self/fd/2
lrwxrwxrwx 1 root root 15 Mai 19 2014 /dev/stdin -> /proc/self/fd/0
lrwxrwxrwx 1 root root 15 Mai 19 2014 /dev/stdout -> /proc/self/fd/1
crw-rw-rw- 1 root tty 5, 0 Jul 12 17:31 /dev/tty
crw-rw-rw- 1 root root 1, 5 Mai 19 2014 /dev/zero
3. Criação do diretório de sessão:
# mkdir -p /home/squadra/dev/
4. Com o comando mknod crie os arquivos. Lembrando de usar sempre o parâmetro -m para especificar os bits de permissões dos arquivos.
# mknod -m 666 null c 1 3
# mknod -m 666 random c 1 8
# mknod -m 666 tty c 5 0
# mknod -m 666 zero c 1 5
5. Mudar a permissão do home do usuário:
# chmod 0755 /home/squadra/
6. Validar a permissão do home do usuário:
# ls -ltr /home/squadra
dr-xr-xr-x. 27 root root 4096 Mar 22 10:50
7. Agora temos que criar o diretório bin e copiar o /bin/bash:
# mkdir -p /home/squadra/bin
# cp -v /bin/bash /home/squadra/bin/
"/bin/bash" -> "/home/squadra/bin/bash"
8. Como o bash requer as bibliotecas. Se faz necessário a criação do diretório /lib64 dentro do home do usuário e a cópia das lib.
# mkdir -p /home/squadra/lib64
# ldd /bin/bash
linux-vdso.so.1 => (0x00007fff272f6000)
libtinfo.so.5 => /lib64/libtinfo.so.5 (0x0000003b69e00000)
libdl.so.2 => /lib64/libdl.so.2 (0x0000003b59a00000)
libc.so.6 => /lib64/libc.so.6 (0x0000003b59e00000)
/lib64/ld-linux-x86-64.so.2 (0x0000003b59600000)
# cp -v /lib64/{libtinfo.so.5,libdl.so.2,libc.so.6,ld-linux-x86-64.so.2} /home/squadra/lib64/
"/lib64/libtinfo.so.5" -> "/home/squadra/lib64/libtinfo.so.5"
"/lib64/libdl.so.2" -> "/home/squadra/lib64/libdl.so.2"
"/lib64/libc.so.6" -> "/home/squadra/lib64/libc.so.6"
"/lib64/ld-linux-x86-64.so.2" -> "/home/squadra/lib64/ld-linux-x86-64.so.2"
9. Agora iremos criar o usuário:
# useradd squadra
useradd: aviso: o diretório pessoal já existe.
Não copiando nenhum arquivo do diretório skel.
10. Iremos criar o diretório /etc no home do usuário e realizar a cópia do /etc/passwd e /etc/group:
# mkdir /home/squadra/etc
# cp -vf /etc/{passwd,group} /home/squadra/etc/
"/etc/passwd" -> "/home/squadra/etc/passwd"
"/etc/group" -> "/home/squadra/etc/group"
11. Agora chegou a hora de definirmos o enjaulamento no ssh:
# vi /etc/ssh/sshd_config
12. Restart do ssh:
# service sshd restart
13. Como o meu usuário irá apenas ler logs, eu defini os comandos que ele pode executar:
# cp -v /bin/ls /home/squadr/bin/
# cp -v /bin/cat /home/squadr/bin/
# cp -v /bin/more /home/squadr/bin/
# cp -v /bin/tail /home/squadr/bin/
14. Uma dica: verificar as lib de todos os comandos. Caso não estiverem no arquivo /home/squadra/lib64/, basta copiar. Exemplo abaixo:
# ldd /bin/ls
libselinux.so.1 => /lib/x86_64-linux-gnu/libselinux.so.1 (0x00007f544ba0c000)
libc.so.6 => /lib/x86_64-linux-gnu/libc.so.6 (0x00007f544b61b000)
libpcre.so.3 => /lib/x86_64-linux-gnu/libpcre.so.3 (0x00007f544b3a9000)
libdl.so.2 => /lib/x86_64-linux-gnu/libdl.so.2 (0x00007f544b1a5000)
/lib64/ld-linux-x86-64.so.2 (0x00007f544be56000)
libpthread.so.0 => /lib/x86_64-linux-gnu/libpthread.so.0 (0x00007f544af86000)
Lembrando que o usuário (squadra) foi apenas o meu usuário de teste.
Espero ter ajudado com esse artigo!
1. Criação do diretório do usuário:
# mkdir /home/squadra
2. Arquivos de suporte de sessão do usuário:
# ls -l /dev/{null,zero,stdin,stdout,stderr,random,tty}
crw-rw-rw- 1 root root 1, 3 Mai 19 2014 /dev/null
crw-rw-rw- 1 root root 1, 8 Mai 19 2014 /dev/random
lrwxrwxrwx 1 root root 15 Mai 19 2014 /dev/stderr -> /proc/self/fd/2
lrwxrwxrwx 1 root root 15 Mai 19 2014 /dev/stdin -> /proc/self/fd/0
lrwxrwxrwx 1 root root 15 Mai 19 2014 /dev/stdout -> /proc/self/fd/1
crw-rw-rw- 1 root tty 5, 0 Jul 12 17:31 /dev/tty
crw-rw-rw- 1 root root 1, 5 Mai 19 2014 /dev/zero
3. Criação do diretório de sessão:
# mkdir -p /home/squadra/dev/
4. Com o comando mknod crie os arquivos. Lembrando de usar sempre o parâmetro -m para especificar os bits de permissões dos arquivos.
# mknod -m 666 null c 1 3
# mknod -m 666 random c 1 8
# mknod -m 666 tty c 5 0
# mknod -m 666 zero c 1 5
5. Mudar a permissão do home do usuário:
# chmod 0755 /home/squadra/
6. Validar a permissão do home do usuário:
# ls -ltr /home/squadra
dr-xr-xr-x. 27 root root 4096 Mar 22 10:50
7. Agora temos que criar o diretório bin e copiar o /bin/bash:
# mkdir -p /home/squadra/bin
# cp -v /bin/bash /home/squadra/bin/
"/bin/bash" -> "/home/squadra/bin/bash"
8. Como o bash requer as bibliotecas. Se faz necessário a criação do diretório /lib64 dentro do home do usuário e a cópia das lib.
# mkdir -p /home/squadra/lib64
# ldd /bin/bash
linux-vdso.so.1 => (0x00007fff272f6000)
libtinfo.so.5 => /lib64/libtinfo.so.5 (0x0000003b69e00000)
libdl.so.2 => /lib64/libdl.so.2 (0x0000003b59a00000)
libc.so.6 => /lib64/libc.so.6 (0x0000003b59e00000)
/lib64/ld-linux-x86-64.so.2 (0x0000003b59600000)
# cp -v /lib64/{libtinfo.so.5,libdl.so.2,libc.so.6,ld-linux-x86-64.so.2} /home/squadra/lib64/
"/lib64/libtinfo.so.5" -> "/home/squadra/lib64/libtinfo.so.5"
"/lib64/libdl.so.2" -> "/home/squadra/lib64/libdl.so.2"
"/lib64/libc.so.6" -> "/home/squadra/lib64/libc.so.6"
"/lib64/ld-linux-x86-64.so.2" -> "/home/squadra/lib64/ld-linux-x86-64.so.2"
9. Agora iremos criar o usuário:
# useradd squadra
useradd: aviso: o diretório pessoal já existe.
Não copiando nenhum arquivo do diretório skel.
10. Iremos criar o diretório /etc no home do usuário e realizar a cópia do /etc/passwd e /etc/group:
# mkdir /home/squadra/etc
# cp -vf /etc/{passwd,group} /home/squadra/etc/
"/etc/passwd" -> "/home/squadra/etc/passwd"
"/etc/group" -> "/home/squadra/etc/group"
11. Agora chegou a hora de definirmos o enjaulamento no ssh:
# vi /etc/ssh/sshd_config
#define username to apply chroot jail to
Match User squadra
#specify chroot jail
ChrootDirectory /home/squadra
Match User squadra
#specify chroot jail
ChrootDirectory /home/squadra
12. Restart do ssh:
# service sshd restart
13. Como o meu usuário irá apenas ler logs, eu defini os comandos que ele pode executar:
# cp -v /bin/ls /home/squadr/bin/
# cp -v /bin/cat /home/squadr/bin/
# cp -v /bin/more /home/squadr/bin/
# cp -v /bin/tail /home/squadr/bin/
14. Uma dica: verificar as lib de todos os comandos. Caso não estiverem no arquivo /home/squadra/lib64/, basta copiar. Exemplo abaixo:
# ldd /bin/ls
libselinux.so.1 => /lib/x86_64-linux-gnu/libselinux.so.1 (0x00007f544ba0c000)
libc.so.6 => /lib/x86_64-linux-gnu/libc.so.6 (0x00007f544b61b000)
libpcre.so.3 => /lib/x86_64-linux-gnu/libpcre.so.3 (0x00007f544b3a9000)
libdl.so.2 => /lib/x86_64-linux-gnu/libdl.so.2 (0x00007f544b1a5000)
/lib64/ld-linux-x86-64.so.2 (0x00007f544be56000)
libpthread.so.0 => /lib/x86_64-linux-gnu/libpthread.so.0 (0x00007f544af86000)
Lembrando que o usuário (squadra) foi apenas o meu usuário de teste.
Espero ter ajudado com esse artigo!
Gostaria de compartilhar também uma alternativa para a cópia dos binários.
Você poderia, por exemplo, usar o mount:
mount --bind /bin /home/user/bin
mount --bind /etc /home/user/etc
mount --bind /lib/x86_64-linux-gnu /home/user/lib64
Se você não quiser montar o /etc ou /bin inteiro, pode gerar um fake chroot com a cópia dos arquivos que você listou e monta-los a partir de /chroot/{bin,etc,lib64...} por exemplo.
Outra forma seria usar hardlinks, mas eles não podem ser usados para apontar para diretórios (Pois aponta para o endereço do inode).
Se você usar apenas um conta com esse Chroot é ok, mas em caso muitos users enjaulados é muito difícil até de manter os binários e libs atualizadas, já que fica tudo esparramado. Além de usar espaço em disco desnecessário!