Melhorando a segurança no FreeBSD com securelevel + chflags
Posted by gondim | Posted in Dicas, FreeBSD, Segurança | Posted on 04-05-2012
Tags:chflags, secure level
4
Um dos recursos muito interessante que o FreeBSD possui é o Secure Level que bloqueia até mesmo o root de executar certas funções. O FreeBSD possui 5 níveis.
-1 e 0 (Permanently Insecure Mode e Insecure Mode): são os níveis mais inseguros, permitem que o root faça qualquer coisa no sistema. O default do sistema é -1.
1 (Secure Mode): nesse nível já existe uma melhora na segurança pois as flags append-only dos arquivos não podem ser alteradas, /dev/kmem e /dev/mem não podem ser abertos para escrita, /dev/io não pode ser aberto para nada e modulos de kernel não podem ser carregados ou descarregados.
2 (Highly Secure Mode): faz tudo que o Secure Mode faz e mais… discos não podem ser abertos para escrita exceto pelo mount. Protege o sistema de arquivos mesmo com este desmontado e não aceita usar o newfs em modo multi-usuário. Tentativas de ajustar data e hora do sistema geram logs e não são aceitas com diferanças superiores à 1 segundo.
3 (Network Secure Mode): faz tudo que o Highly Secure Mode faz e mais… não permite qualquer mudança nas regras de firewall e controle de banda.
Os modos podem ser alterados de 2 formas: através do /etc/sysctl.conf ou pelo /etc/rc.conf. No sysctl.conf seria usando kern.securelevel e no /etc/rc.conf usando as entradas abaixo como exemplo:
kern_securelevel_enable=”YES”
kern_securelevel=”2″
Usando o sysctl você pode alterar em tempo de execução o secure level. Um exemplo abaixo:
# sysctl kern.securelevel=2
kern.securelevel: -1 -> 2
Outro detalhe importante: depois que você sobe de level não é possivel descer:
# sysctl kern.securelevel=-1
sysctl: kern.securelevel: Operation not permitted
Se você acrescentou no /etc/sysctl.conf ou no /etc/rc.conf o secure level e quiser voltar para algum level específico, então você vai precisar alterar o arquivo que você editou e re-iniciar o sistema para que tenha efeito.
Até aqui nada de muito extraordinário e você deve estar se perguntando: ah mas aí e se o cara invadir, basta alterar o arquivo e re-iniciar? Sim mas aí entra um outro recurso do FreeBSD chamado flags e que pode ser alterado com o chflags. O chflags permite mudarmos as características dos arquivos e deixá-los como por exemplo append-only e até imutáveis. Nesse caso se tiver usando secure level de 1 à 3, eles não poderão ter essas flags removidas dos arquivos. Vamos dizer que queremos colocar nosso sistema com secure level 2 e adicionamos as linhas mencionadas acima no /etc/rc.conf. Agora fazemos isso:
# chflags schg /etc/rc.conf
# chflags schg /etc/sysctl.conf
Os comandos acima transformam esses 2 arquivos em imutáveis, ou seja, não poderão ser alterados. Após re-iniciado o sistema além deles estarem imutáveis, estaremos usando secure level 2. Nesse caso um invasor não poderia alterar esses arquivos e o único jeito seria re-iniciando o sistema, entrar em modo single-user, aí sim alterar com o chflags esses arquivos e editá-los. Reparem que essa tarefa não é nada boa para manutenções remotas e por isso muito cuidado.
Junto à isso imaginem fazer coisas como:
# chflags schg /usr/local/bin/*
# chflags schg /bin/*
# chflags schg /usr/local/sbin/*
# chflags schg /usr/sbin/*
# chflags schg /sbin/*# chflags schg /usr/lib/*
# chflags schg /usr/local/lib/*
# chflags schg /usr/libexec/*
# chflags schg /usr/local/libexec/*
Dessa forma em uma invasão mesmo o cara sendo root não conseguria alterar esses arquivos acima pois estariam imutáveis. O mesmo pode ser feito com logs usando o parâmetro sappnd no lugar de schg que faz o arquivo se tornar append-only. Para remover essas flags é necessário estar em level -1 ou 0 e o parâmetro seria noschg ou nosappnd. Exemplo abaixo:
# chflags noschg /usr/local/bin/*
# chflags noschg /bin/*
# chflags noschg /usr/local/sbin/*
# chflags noschg /usr/sbin/*
# chflags noschg /sbin/*# chflags noschg /usr/lib/*
# chflags noschg /usr/local/lib/*
# chflags noschg /usr/libexec/*
# chflags noschg /usr/local/libexec/*
Fazendo a proteção acima lembrem-se que sempre que forem atualizar o sistema, seja usando o cvsup ou pacotes do ports, removam as flags de proteção dos arquivos porque senão vários erros ocorrerão por tentarem alterar os arquivos protegidos.
Mais informações sobre Secure Level e chflags usem o man: man security e man chflags.
Be happy!!!