Instalação e Ativação SELinux no Debian
Em meus estudos sobre SELinux não encontrei material em português mostrando de forma prática como se instala o SELinux no Debian, abaixo demonstro da maneira mais simples possível como fazer.
Apesar deste tutorial falar de como instalar no Debian Etch é possível aplicá-lo também no Lenny.
Na próxima versão estável do Debian muitas novas funcionalidades estão sendo aplicadas aos programas que trabalham no "user-space", pois não basta ter o SELinux compilado dentro do kernel e ativá-lo é preciso que as ferramentas que o manipulam estejam preparadas para interargir.
Considerando que você já está com uma instalação padrão do Debian Etch, instale os seguintes pacotes:
# aptitude install selinux-basics selinux-policy-refpolicy-targeted
O Debian vai resoler as dependências e encarregar-se de instalar mais alguns pacotes que auxiliam na administração do SELinux.
Para ajustar e finalizar as configurações e deixar o SELinux funcionando é interessante utilizar o aplicativo "check-selinux-installation" é um programa desenvolvido em python que auxilía a instalação criando uma "check-list" com dicas de como proceder para finalizar a configuração do SELinux.
# check-selinux-installation
getfilecon: getfilecon(/proc/1) failed
SELinux is not enabled.
Could not read the domain of PID 1.
Old style ttys were found.
/etc/pam.d/ssh is not SELinux enabled
/etc/pam.d/login is not SELinux enabled
Dynamic motd updating is enabled
A dynamic MOTD is present in /var/run/motd.
FSCKFIX is not enabled – not serious, but could prevent system from booting…
Abaixo o que é necessário para "zerar" esta lista. Vou começar removendo terminais antigos "Old style ttys were found."
# rm -f /dev/[tp]ty[abcdepqrstuvwxyz][0-9a-f]
Para ativar as configurações do pam "/etc/pam.d/ssh" e "/etc/pam.d/login" basta editar os arquivos e descomentar.
No arquivo /etc/pam.d/login procure pela entrada abaixo e descomente.
session required pam_selinux.so multiple
No arquivo /etc/pam.d/ssh procure pela entrada abaixo, descomente e remova a opção multiple:
session required pam_selinux.so
O "Message of the Day" (motd) é atualizado dinâmicamente para isto precisamos definir um motd estático.
# rm -f /etc/motd /var/run/motd
Crie um novo com uma mesnagem qualquer:
# echo -ne "Bem vindo.\n" >> /etc/motd
Modifique o arquivo /etc/init.d/bootmisc.sh, procure pelas entradas abaixo e comente-as.
# Update motd
# uname -snrvm > /var/run/motd
# [ -f /etc/motd.tail ] && cat /etc/motd.tail >> /var/run/motd
Para solucionar este item "FSCKFIX is not enabled" no arquivo /etc/default/rcS existe a seguinte entrada "FSCKFIX=no" modifique para yes, isto modifica o tipo de ação que o Debian toma quando executa um fsck durante o boot tirando a opção (-a) menos segura quando tentar reparar um disco em relação a (-y).
FSCKFIX=yes
Apesar de que a variável abaixo não está sendo mais utilizada neste arquivo (/etc/default/rcS), se não à inserirmos como abaixo, devido a um bug nos scripts de checagem do "check-selinux-installation" ele retornará "Dynamic motd updating is enabled", para resolver adicione a entrada abaixo só para termos um "check-list" sem nenhuma reclamação.
EDITMOTD=no
Salve o arquivo.
SELinux vem compilado dentro do kernel do Debian por padrão, mas não é ativado, para isto é preciso passar para o kenrel na inicialização o parâmetro selinux=1. Edite o arquivo de configuração do seu gerenciador de boot (grub/lilo) e adicione o parâmetro, abaixo demostro como ficaria no grub.
title Debian GNU/Linux, kernel 2.6.18-6-686
root (hd0,0)
kernel /boot/vmlinuz-2.6.18-6-686 root=/dev/sda1 ro selinux=1
initrd /boot/initrd.img-2.6.18-6-686
savedefault
Para que o SELinux aplique seu conceito MAC(Mandatory Access Control) é preciso aplicar o contexto para todos os arquivos do sistema. Para isto tanto com o comando "fixfiles relabel" como adicionando um arquivo vazio na raiz com o nome de ".autorelabel" e executando um reboot.
# touch /.autorelabel
# fixfiles relabel
Files in the /tmp directory may be labeled incorrectly, this command
can remove all files in /tmp. If you choose to remove files from /tmp,
a reboot will be required after completion.
Do you wish to clean out the /tmp directory [N]? N
/sbin/setfiles: labeling files under /
matchpathcon_filespec_eval: hash table stats: 23509 elements, 17216/65536 buckets used, longest chain length 3
/sbin/setfiles: Done.
Repare que o comando fixfiles pergunta se quer remover todos os arquivos do diretório tmp, responda NÃO pois a remoção dos arquivos do /tmp podem causar inconsistências a programas que já estão em execução. Utilize a opção de criação do arquivos pois de qualquer forma é preciso reinciar o sistema para que o SELinux fique ativado.
Um detalhe importante é que alguns programas após a ativação do SELinux se estiver utilizando a política targeted podem gerar diversos avisos no seu /var/log/messages, os passos abaixos são necessários para evitar essas mensagens….
Edite o arquivo de configuração do udev "/etc/udev/udev.conf" e acrescente ao final:
no_static_dev="1"
Isso evita que o udev crie o diretório "/dev/.static". Para atualizar as "initial ramdisk images":
# update-initramfs -k all -u
O pacote findutils que traz o comando locate executa um script que varre todo o sistema operacional para indexá-lo, desatvie o script que faz esta varredura pois traz diversas mensagens no /var/log/messages quando é executado. Ainda não existe uma política para que sua execução ocorra de forma efetiva e sem mensagens.
Para desativar edite o arquivo "/etc/cron.daily/find" e na segunda linha acrescente um "exit 0".
Outro que pode nos trazer problemas e muitas mensagens é o arquivo responsável por fazer periódicamente um backup de alguns arquivos chave do sistema operacional (/etc/shadow, /etc/gshadow, /etc/passwd), edite o arquivo "/etc/cron.daily/standard" e procure pela entrada "Backup key system files" e comente todo o bloco:
#
# Backup key system files
#
#
#if cd $bak ; then
# cmp -s passwd.bak /etc/passwd || (cp -p /etc/passwd passwd.bak &&
# chmod 600 passwd.bak)
# cmp -s group.bak /etc/group || (cp -p /etc/group group.bak &&
# chmod 600 group.bak)
# if [ -f /etc/shadow ] ; then
# cmp -s shadow.bak /etc/shadow || (cp -p /etc/shadow shadow.bak &&
# chmod 600 shadow.bak)
# fi
# if [ -f /etc/gshadow ] ; then
# cmp -s gshadow.bak /etc/gshadow || (cp -p /etc/gshadow gshadow.bak &&
# chmod 600 gshadow.bak)
# fi
#fi
Agora reinicie a máquina e após execute para verificar sua instlação:
# check-selinux-installation
Provavelmente não retornará nada pode checar com um "echo $?", e também:
# sestatus
SELinux status: enabled
SELinuxfs mount: /selinux
Current mode: permissive
Mode from config file: permissive
Policy version: 20
Policy from config file: refpolicy-targeted
Como pode ver na saida dos comandos o SELinux está instalado corretamente e no modo permissive que é um modo onde o SELinux não nega as requisições aos arquivos/dispositivos/processos com base nos contextos somente gera um log no arquivo /var/log/messages.
Nos próximos posts sobre SELinux pretendo mostrar de forma prática como utilizá-lo para blindarmos nosso sistema operacional e aumentar considrávelmente a segurança.
Obrigado e até o próximo! ;-)
Referências
http://wiki.debian.org/SELinux
http://etbe.blogspot.com/2006/12/se-linux-on-debian-in-5-minutes.html
http://www.coker.com.au/selinux/tweaks.html


