Brincando com Jail's no FreeBSD
Eae pessoal!?
Bom hoje a aventura é com as Jail's do FreeBSD.
As Jails foram criadas por Poul-Henning Kamp para a R&D Associates e daí introduzidas no FreeBSD 4.0. Robert Watson esteve envolvido na documentação e na elaboração de alguns ''remendos''.
E também as Jails servem para "virtualizar" alguns serviços, por exemplo:
Um provedor que disponibilize shells para seus clientes, ele pode criar uma Jail para cada um deles, sem que isso atrapalhasse os outros processos, ela funciona como se fosse um mini-sistema independente com seus usuários e seu super-usuário próprios, ou melhor ainda funciona parecido com um VMWare, compartilha os recursos da máquina mas roda independente, mas tudo dentro de um processo "enjaulado" quase indistinguível de um sistema real.
Aí que entra a questão da segurança que a Jail proporciona, pois dentro da Jail tudo que está abaixo dela (na máquina anfitriã) não é visível, e você pode disponibilizar várias Jails sem que elas saibam da existência de outras. O que for feito pelo root de uma Jail não afeta o sistema anfitrião.
As Jails foram criadas por Poul-Henning Kamp para a R&D Associates e daí introduzidas no FreeBSD 4.0. Robert Watson esteve envolvido na documentação e na elaboração de alguns ''remendos''.
E também as Jails servem para "virtualizar" alguns serviços, por exemplo:
Um provedor que disponibilize shells para seus clientes, ele pode criar uma Jail para cada um deles, sem que isso atrapalhasse os outros processos, ela funciona como se fosse um mini-sistema independente com seus usuários e seu super-usuário próprios, ou melhor ainda funciona parecido com um VMWare, compartilha os recursos da máquina mas roda independente, mas tudo dentro de um processo "enjaulado" quase indistinguível de um sistema real.
Aí que entra a questão da segurança que a Jail proporciona, pois dentro da Jail tudo que está abaixo dela (na máquina anfitriã) não é visível, e você pode disponibilizar várias Jails sem que elas saibam da existência de outras. O que for feito pelo root de uma Jail não afeta o sistema anfitrião.
Bom Vamos ao índice da "brincadeira":
- Criando a Jail
- Configurações no Host em relação a Jail
- Configurando a Jail
- Configurações das sysctl's no anfitrião[1]
- Atualização da Jail
- Considerações e Links
1. Criando a Jail
Primeiro iremos criar a pasta onde os arquivos da nossa Jail irá ficar:
# mkdir /usr/jails
# mkdir /usr/jails/1
Como eu estava em processo de atualização da minha máquina de testes eu havia acabado de atualizar ela para o FreeBSD 6.2PRE-RELEASE, então meu /usr/obj estava prontinho pra dar make installworld que é o comando que iremos usar a seguir:
# cd /usr/src
# make installworld DESTDIR=/usr/jails/1
# cd etc
# make distribution DESTDIR=/usr/jails/1
Caso, vc não tenha apagado os objetos em /usr/obj, vc terá de rodar o buildworld primeiro pra depois o installworld e assim por diante.
2. Configurações no Host em relação a Jail
Após a instalação da Jail é necessário fazer com que o Host anfitrião saiba que ele existe, configurando o IP que deverá ser usado pela Jail, como as demais configurações de arranque da Jail que serão detalhadas agora:
No arquivo /etc/rc.conf:
ifconfig_lnc0="inet 192.168.0.16 netmask 255.255.255.0"
ifconfig_lnc0_alias0="inet 192.168.0.17 netmask 255.255.255.0" #IP que a Jail irá usar
* o dispositivo "lnc0" é a placa de rede virtual do meu VMWare, substitua pela sua na sua configuração.
jail_enable="YES"
jail_set_hostname_allow="YES"
jail_socket_unixiproute_only="YES"
jail_sysvipc_allow="YES"
jail_list="j01"
jail_j01_rootdir="/usr/jails/1"
jail_j01_hostname="zion-j01.zion.local"
jail_j01_ip="192.168.0.17"
jail_j01_exec="/bin/sh /etc/rc"
jail_j01_devfs_enable="YES"
jail_j01_procfs_enable="YES"
Este ultimo bloco de configurações é específico da Jail chamada "j01" a qual se refere na flag "jail_list=". Ou seja, para cada jail que vc adicionar no sistema um bloco desse é necessário para seu funcionamento.
3. Configurando a Jail
Quase pronto!
Agora iremos mecher com as configurações nos arquivos dentro da Jail que criamos nos passos anteriores.
Temos que criar um arquivo (vazio) "fstab" para a Jail:
Configurar os NameServers para resolução de nomes:
E agora criaremos o "rc.conf" da Jail:
E inseriremos isto:
Agora é necessário fazer com que o SSH ouça apenas no IP da Jail adicionando ao sshd_config a seguinte linha:
Também precisamos criar a pasta do ports e também uma pasta BUILD dentro da pasta tmp da Jail:
Agora criamos um make.conf para a Jail:
Montar o DEVFS para o Jail:
Ligar o dispositivo "null" ao núcleo do kernel:
Pronto. Agora iremos subir a Jail e criar os usuários para que possamos acessá-la por SSH e assim poderemos configurar outras coisas ainda dentro da Jail como /etc/syslogd.conf ou mesmo rodar o sysinstall.
Para rodar a Jail execute:
E estamos na Jail:
Agora dentro da Jail defina a senha do root com o comando passwd, e crie usuários normalmente com o pw. Configure o timezone no sysinstall.
Terminado isso digite "exit" para sair.
Como já configuramos tudo e já estão habilitadas todas as configurações no host anfitrião, basta subi-la pelo script rc dele.
E com o comando jls vc pode ver as Jails em "UP":
Agora iremos mecher com as configurações nos arquivos dentro da Jail que criamos nos passos anteriores.
Temos que criar um arquivo (vazio) "fstab" para a Jail:
# touch /usr/jails/1/etc/fstab
Configurar os NameServers para resolução de nomes:
# echo "nameserver ip.do.server.de.nomes" > /usr/jails/1/etc/resolv.conf
E agora criaremos o "rc.conf" da Jail:
# vi /usr/jails/1/etc/rc.conf
E inseriremos isto:
network_interfaces="" # Para desabilitar os alertas do ifconfig
rpcbind_enable="NO"
usbd_enable="NO"
font8x14="NO" # bloco de personalização de fonte (desnecessário/opcional)
font8x16="swiss-8x16"
font8x8="swiss-8x8"
keymap="br275.iso.acc"
keyrate="fast"
clear_tmp_enable="YES"
update_motd="NO"
fsck_y_enable="YES"
virecover_enable="NO"
syslogd_flags="-ss"
sshd_enable="YES" # habilita SSH
sendmail_enable="NONE" # desabilita sendmail
Agora é necessário fazer com que o SSH ouça apenas no IP da Jail adicionando ao sshd_config a seguinte linha:
ListenAddress 192.168.0.17 #substitua esse IP pelo IP que vc colocou pra sua Jail
Também precisamos criar a pasta do ports e também uma pasta BUILD dentro da pasta tmp da Jail:
# mkdir /usr/jails/1/usr/ports
# mkdir /usr/jails/1/etc/BUILD
Agora criamos um make.conf para a Jail:
# touch /usr/jails/1/etc/make.conf
# cd /usr/jails/1
# echo "WRKDIRPREFIX=/tmp/BUILD" > etc/make.conf
Montar o DEVFS para o Jail:
# mount_devfs devfs /usr/jails/1/dev
Ligar o dispositivo "null" ao núcleo do kernel:
# cd /usr/jails/1
# ln -sf dev/null kernel
Pronto. Agora iremos subir a Jail e criar os usuários para que possamos acessá-la por SSH e assim poderemos configurar outras coisas ainda dentro da Jail como /etc/syslogd.conf ou mesmo rodar o sysinstall.
Para rodar a Jail execute:
# jail /usr/jails/1 j01 192.168.0.17 /bin/sh
E estamos na Jail:
zion-j01#
Agora dentro da Jail defina a senha do root com o comando passwd, e crie usuários normalmente com o pw. Configure o timezone no sysinstall.
Terminado isso digite "exit" para sair.
Como já configuramos tudo e já estão habilitadas todas as configurações no host anfitrião, basta subi-la pelo script rc dele.
# /etc/rc.d/jails start
Configuring jails:.
Starting jails: j01
E com o comando jls vc pode ver as Jails em "UP":
# jls
JID IP Address Hostname Path
6 192.168.0.17 zion-j01.zion.local /usr/jails/1
4. Configurações das sysctl's no anfitrião[1]
Veremos agora como e quais parametros (MIB's) - ''Management Information Base'' usar para alterar o estado do núcleo do sistema e o tratamento dado por este às Jails.Presentemente a alteração destas MIBs propaga-se a todas as Jails existentes no sistema, no futuro esta funcionalidade será afinada para que possa haver maior distinção entre cada Jail e suas configurações.
Para receber a listagem de todas as ''MIBs'' usadas pelo núcleo basta executar como root o comando: sysctl -a | more
No nosso caso iremos só pesquisar as que interagem directamente com o mundo das Jails.
$ sysctl -a | grep 'jail'Resumidamente, estas MIBs significam:
security.jail.set_hostname_allowed: 0
security.jail.socket_unixiproute_only: 1
security.jail.sysvipc_allowed: 1
security.jail.getfsstatroot_only: 1
security.jail.allow_raw_sockets: 0
security.jail.chflags_allowed: 0
security.jail.jailed: 0
- security.jail.allow_raw_sockets
Esta entrada determina se o root é capaz ou não de criar ''raw sockets''. Activando esta MIB, irá permitir que utilitários como ping e traceroute operem dentro das Jails. - security.jail.getfsstatroot_only
Define se dentro de uma Jail, os processos são capazes de ver ou não todos os ''mountpoints''. - security.jail.set_hostname_allowed
Esta MIB assegura se os processos dentro da Jail podem ou não alterar o nome do nó via comando hostname. - security.jail.socket_unixiproute_only
A tecnologia de enclausuramento permite auscultar um IP versão 4 em cada Jail, e limitar o acesso a outros endereços de rede no espaço IPv4 que possam estar disponíveis no ambiente. No entanto, presentemente a Jail não é capaz de limitar o acesso a outras pilhas de protocolos de rede que não tenham esta técnologia de enclausuramento. Assim, por defeito, processos dentro de Jails apenas podem aceder a protocolos nos seguintes domínios: (PF_LOCAL, PF_INET e PF_ROUTE, permitindo-os aceder a sockets de UNIX, endereços IPv4 e sockets de roteamento. - security.jail.sysvipc_allowed
Com esta MIB definimos se os processos residentes nas Jails irão ter acesso a primitivas ''System V IPC''.
Como nota especial para esta MIB, dou como exemplo o caso de se ter uma instância de PostgreSQL a correr dentro de uma Jail o qual obriga a activação da MIB em causa. - security.jail.chflags_allowed
Esta entrada determina se um utilizador priviligiado dentro da Jail é tratado por chflags(2). Se estiver a zero, este utilizador é tratado como não priviligiado não podendo alterar ficheiros com ''flags'' definidas.
Entretanto também temos as seguintes MIB's que devem ser alvo de atensão:
As considerações finais para este tema vão para:
$ root@fac:/etc/rc.d$ sysctl -a | grep 'bsd.see_other'Acima, como o próprio nome indica, cada utilizador ou grupo de utilizadores, só poderá ver os seus/grupo processos.
security.bsd.see_other_uids: 1
security.bsd.see_other_gids: 1
As considerações finais para este tema vão para:
- Uma MIB com o valor zero (0) estará ináctiva, uma com o valor um (1) estará activa.
- Para que as ''sysctl's'' premanecam correctamente configuradas após reiniciarmos o servidor, deveremos lista-las em /etc/sysctl.conf
5. Atualização da Jail
Um tópico que eu achei poucas informações, bom é simples como se estivessemos fazendo na própria máquina, a diferença é que temos mostrar a Jail na hora de instalar a nova compilação do sistema. Segue exemplo abaixo:
No anfitrião:
# /etc/rc.d/jails stop j01
Atualize os sources com csup ou cvsup.
# cd /usr/src
# make -j4 buildworld
E agora a parte da instalação, faça backup do /usr/jails/1/etc pois eles poderão ser sobrescritos com arquivos vazios após o MERGE.
# make installworld DESTDIR=/usr/jails/1
# mergemaster -D /usr/jails/1
# /etc/rc.d/jails start
Pronto Jail atualizada!
6. Considerações Finais e Links
Com este artigo acredito ter ficado claro como é simples de se virtualizar serviços com FreeBSD sem precisar comprar uma solução proprietária (VMWare e outros).
Dentro desta Jail criada usando o portsnap podemos baixar o ports com a opção extract e então compilar qualquer aplicação que queiramos. Como citado anteriormente é um sistema independente (em termos), isolado e com um nível legal de segurança para rodar seus aplicativos de risco, por exemplo um apache, ou então um banco PostgreSQL.
Links:
[1] http://www.myfreebsd.com.br/modules.php?name=Sections&op=viewarticle&artid=29
[2] http://en.wikipedia.org/wiki/FreeBSD_Jail
Dentro desta Jail criada usando o portsnap podemos baixar o ports com a opção extract e então compilar qualquer aplicação que queiramos. Como citado anteriormente é um sistema independente (em termos), isolado e com um nível legal de segurança para rodar seus aplicativos de risco, por exemplo um apache, ou então um banco PostgreSQL.
Links:
[1] http://www.myfreebsd.com.br/modules.php?name=Sections&op=viewarticle&artid=29
[2] http://en.wikipedia.org/wiki/FreeBSD_Jail
1 Comments:
O ROBERTO TA UM DUMBO NA FOTO DE BAIXO HEIN!!!
Postar um comentário
<< Home