Você está na página 1de 211

Instrutor Mrcio Oliveira

Hardening em Sistemas operacionais Linux


Oys -2013
www.oys.com.br

Hardening & Segurana em


Servidores Linux

Captulo 1
Hardening Ajustes de Segurana

1.1. Objetivos:

Entender o que Hardening e sua importncia.


Remover programas desnecessrios.
Entender os problemas de permisses Suid Bit.
Aplicar segurana no sistema de arquivos.
Aplicar segurana aos terminais locais.
Gerenciar privilgios.
Entender como o PAM funciona e seus benefcios
Procurar por senhas fracas no sistema.
Aplicar segurana no gerenciador de Boot.
Ver a correlao da Norma ANT NBR ISO 27002 com os assuntos abordados.

1.2. O que Hardening?


Se analisarmos a real traduo da palavra, Hardening significa Endurecer-se, e
exatamente isso que vamos fazer com o nosso sistema. Essa idia fica mais clara se
considerarmos a traduo como Fortalecimento ou, como ns costumamos dizer, Ajuste
Fino.

Existem dois tipos de Hardening: Hardening no Sistema Operacional e Hardening


no Kernel. Nesse curso vamos falar do Hardening no Sistema Operacional.
Muitos administradores sem muita

experincia

em segurana, preparam seu

servidores com uma instalao bsica e depois que suas aplicaes j esto funcionando, eles
a deixam da maneira que est. Eis que muitas vezes surge a seguinte frase: Ah, j est
funcionando, ento est bom!, e ai que est o maior problema: achar que est bom.
O sistema Linux torna-se muito mais seguro quando ele bem trabalhando. por
causa disso que vamos aperfeioar suas configuraes padres. Apesar de ser seguro quando
devidamente configurado, podemos torn-lo ainda mais seguro. Em vez de adotar a frase: J
est bom, pense nesta: O bom inimigo do timo quando falamos de segurana
computacional.
Quando comearmos com nossas tcnicas de Hardening, vamos ter que pensar sempre
em 3 fatores:
1 Segurana
2 Risco
3 Flexibilidade
necessrio saber dosar muito bem esses trs fatores para levar o sistema a uma
tima produtividade e segurana. Neste momento pode vir as seguintes perguntas: O que
devemos dosar? Por acaso, isso uma receita de bolo?. Se analisarmos bem, vamos ver que
um processo semelhante. No possvel ter 100% segurana, mas quanto mais segurana
tivermos, menos riscos vamos correr, mas tambm vamos ter pouca flexibilidade para fazer
algumas tarefas no servidores, ou seja, uma razo inversamente proporcional. Por outro
lado, se possuirmos grande flexibilidade nos servidores, que permita ter qualquer tipo de
acesso ou aplicaes neles, a segurana ficar muito baixa e os riscos vo aumentar.
Observemos a Figura 1.1 para visualizar uma representao grfica desses cenrios.

Segurana

Segurana

RISCO

RISCO

Flexibilidade

Flexibilidade

No existe uma regra direta para a dosagem desses trs fatores representados pela
figura 1.1, isso vai depender de cada situao, de acordo com o tipo de necessidade. Por isso
toda implementao de um servidor deve ser bem definida antes de ser feita, nem que ela
tenha que ser desenhada no papel e analisada vrias vezes.
Devemos lembrar que, embora as tcnicas de Hardening que vamos aplicar sejam
muito boas, talvez elas no se apliquem em todas as situaes. Cada caso um caso.
preciso analisar e descobrir o procedimento que ser mais adequado para a necessidade em
questo.
Quando trabalhamos com segurana de um servidor, podemos pensar em dois
cenrios. O primeiro o que o servidor acabou de ser instalado, esse cenrio mais
tranquilo, pois sabemos exatamente o que esse servidor possu. O segundo cenrio quando
somos contratados para fazer uma auditoria de segurana em servidores que j esto em uso
a um bom tempo, esse cenrio tende ser o mais crtico, pois j pode ter ocorrido uma invaso
a esses servidores. Nas nossas tcnicas de Hardening, leve sempre em considerao o
cenrio mais crtico.

1.3. Programas Desnecessrios


Quanto mais aplicaes temos instaladas em nossos servidores maior a probabilidade
de existir uma falha, principalmente se existem aplicaes desnecessrias, ou seja, aquelas
que ns nem sabemos para que servem. O ideal fazer uma varredura no sistema e verificar
todos os programas que esto instalados. Lembre-se que um servidor no deve conter
programas de Desktop.

1.3.1. Conformidade com a norma


No que diz respeito ao software instalado, a norma ABNT NBR ISO/IEC 27002:2005
diz no item 11.5.4 letra h, que devemos remover todo utilitrio desnecessrio do sistema
aps uma checagem.

1.3.2. Execuo do procedimento

1 A norma enfatiza muito a questo da documentao. Por esse motivo, vamos


criar um diretrio chamado auditoria dentro do /root para armazenar os relatrios
de anlise do sistema e futuras documentaes:

# mkdir /root/auditoria

2 Vamos gerar uma lista com todos os pacotes instalados no sistema, juntamente
com suas verses. Em seguida, enviamos isso a uma lista para ser analisada:
# dpkg -l | awk '{print $2,$3}' | sed '1,5d' > /root/auditoria/pacotes.txt

# rpm -qa > /root/auditoria/pacotes.txt

Com esses comandos, estamos pesquisando todos os pacotes instalados. Com o dpkg,
fazemos um filtro somente na segunda e terceira coluna ($2,$3), que so os nomes dos
programas e suas verses. O sed remover as 5 primeiras linhas que no so importantes
para a nossa pesquisa e direcionar o resultado para o arquivo pacotes_instalados.txt dentro
de /root/auditoria.
3 Agora podemos analisar a lista gerada e ver todos os pacotes instalados:
# vim /root/auditoria/pacotes.txt

A retirada dos programas desnecessrios ser de acordo com a situao que estamos
trabalhando. Pode ser que para um caso especfico seja necessrio a retirada de vrios
programas como por exemplo um servidor de firewall. J outros casos, como por exemplo um
servidor de arquivos, no exigia a retirada de tantos programas quanto um firewall.
importante que esses casos sejam bem analisados antes de tomar uma ao.
4 Depois de analisar os pacotes, podemos remover todos aqueles que no sero
necessrios. Um exemplo o wget:
# aptitude purge wget

1.4. Arquivos com permisso de Suid Bit


Em sistemas Linux, temos as chamadas permisses especiais:
Suid Bit (4): Quando setada, permite que qualquer usurio execute determinado
binrio ou programa, como se fosse o usurio dono.

Sgid Bit (2): Quando setada, permite manter padres de criao de arquivos e
diretrios, possibilitando que qualquer arquivo ou diretrio criado assuma o grupo
dono do diretrio pai como grupo padro.
Sticky Bit (1): Quando setada, impede que um usurio apague o arquivo ou diretrio
do outro, mesmo que o diretrio pai tenha permisses que permitam a excluso.
Entre essas permisses a que mais preocupa, a permisso de Suid Bit, que mal
aplicada, pode causar srios danos aos sistema, e muito utilizada por invasores que tentam
implantar Backdoors no sistema.
Nesse momento, vamos fazer uma varredura pelo sistema para ver quais binrios ou/e
arquivos tem permisso de Suid Bit. Pois podem existir arquivos escondidos com essa
permisso setada, possibilitando que um invasor tenha acesso fcil ao sistema.

1.4.1. Conformidade com a norma


Por recomendao da norma ABNT NBR ISO/IEC 27002:2005, no item 11.6.1, o
acesso informao e s suas funes dos sistemas de aplicaes por usurios e pessoal do
suporte deve ser restrito, de acordo com o definido na poltica de controle de acesso.

1.4.2. Execuo do Procedimento

1 Gerem uma lista com todos os arquivos que tem permisso de Suid Bit no
sistema. Para esta tarefa, vamos usar o script localiza_suid.sh:
# mount /cdrom
# cp /cdrom/bs7799/localiza_suid.sh /root/auditoria
# vim /root/auditoria/localiza_suid.sh

1 #!/bin/bash
2
3 echo "Verificando arquivos com permisso de SUID BIT.."
4
5 find / -perm -4000 > /root/auditoria/lista.suid
6
7 echo -n "Deseja remover o SUID BIT dos arquivos?(S/N):"
8 read acao
9 case $acao in
10 S|s)
11 chmod -Rv -s /
12 echo " Permisses de SUID BIT Removidas!"
13 sleep 3
14 exit ;;
15 N|n)
16 exit ;;
17 *)
18 echo "Opo Invlida!!"
19 sleep 3
20 exit ;;
21 esac

2 Como vai ser a primeira vez que vamos executa-lo, no vamos remover as
permisses de Suid Bit. Vamos primeiro gerar a lista e analisar:
# cd /root/auditoria
# chmod +x localiza_suid.sh
# ./localiza_suid.sh

3 Agora podemos analisar a lista e ver quais binrios possuem a permisso de Suid
Bit:
# vim lista.suid

Nesse momento, devemos pensar onde devamos manter a permisso, e isso pode
variar para cara ambiente.
4 No nosso ambiente, vamos retirar todas as permisses de Suid Bit, e aplicar
somente naqueles que realmente so necessrios:
# ./localiza_suid.sh
# chmod +s /bin/su
# chmod +s /usr/bin/passwd

Dependendo do seu ambiente, alguma aplicao pode parar de funcionar, pelo fato de
termos tirado o Suid Bit de algumas aplicaes.

1.5. Segurana na montagem dos dispositivos


Sempre que instalamos um sistema Linux, as boas prticas de instalaes nos
aconselham particionar o disco e a colocar os principais diretrios em parties separadas.
Isso nos proporciona uma maior segurana, pois cada partio tem sua tabela separada.
Logo, se o diretrio / (barra) est em uma partio e o /home em outra, caso acontea
algum problema no sistema, ou se fizermos uma reinstalao, no perderamos as
informaes do diretrio /home.
Entretanto, a segurana de um particionamento no apenas isso. Todas as parties
criadas, so montadas em diretrios, e nesse processo de montagem da partio, que
podemos ter problemas relacionados a segurana. O comando mount possibilita a utilizao
de algumas opes muito interessantes, que permitem melhorar muito a segurana nas
parties. Caso todos os diretrios estivessem na mesma partio (no caso, o /), no seria
possvel aplicar essas opes e usufruir desses recursos. Por isso que um ponto importante
na segurana de servidores Linux, fazer um particionamento adequado.
Ns vimos n tpico anterior, que podemos retirar a permisso de Suid Bit dos
binrios, mas isso no resolve todo o problema. Vamos cortar o mal pela raiz com essas
opes do comando mount.

1.5.1. Conformidade com a norma


A norma ABNT NBR ISO/IEC 27002:2005 diz no item 10.4.1, que convm que sejam
implantados controles de deteco, preveno e recuperao para proteger contra cdigos
maliciosos, assim como procedimentos para a devida conscientizao dos usurios.

1.5.2. Execuo do procedimento


A primeira opo a ser abordada o NOSUID, que faz com que binrios com
permisso de Suid Bit no tenham efeito na partio na qual esto setados.
1 Adicionem um usurio:
# adduser teste

2 Para fazer um teste real de uma Backdoor simples, vamos copiar todas as Shells
do nosso sistema para o diretrio /tmp e atribuir a elas as permisso de Suid Bit:
# cp /bin/*sh* /tmp
# chmod 4755 /tmp/*sh*

3 Abram outro terminal com o usurio que foi criado e tentem executar uma
dessas shells:
$ cd /tmp
$ ./bash

Vejam se algo mudou com o comando id:


$ id

Testem uma outra shell:

$ exit
$ ./sh
$ id

Na sada do comando id para a shell sh, podemos ver que esse usurio conseguiu
permisses de root.
4 Para resolver o problema, remontemos a partio onde est montando o /tmp,
mas agora com a opo nosuid:
# mount -o remount,rw,nosuid /tmp
# mount

5 Com a partio remontada com nosuid, faam o teste novamente:


$ cd /tmp
$ ./sh
$ id

Podemos ver que a shell foi executada normalmente, porm as permisses de Suid Bit
foram totalmente ignoradas.
Outro ponto altamente recomendado, retirar as Shells que no vo ser utilizadas,
todas elas encontram-se no diretrio /bin.

Outra opo que pode ser utilizada o NOEXEC, que impossibilita a execuo de
qualquer binrio ou arquivo executvel dentro da partinao a qual essa opo est ativada.
1 Remontem a partio com a opo noexec e tente executar uma das shells que
foram copiadas para o /tmp. Esse teste pode ser feito inclusive com o usurio root:

# mount -o remount,rw,noexec /tmp


# monunt
# cd /tmp
# ./sh

No foi possvel executar a shell. Na tentativa de execut-la, retornou a mensagem de


permisso negada.

Essas no so as nicas opes que o comando mount pode oferecer. Para ver todas
as opes possveis, consulte o man do comando mount.

2 Agora que ficou claro o uso dos recursos de montagem, definam as respectivas
polticas para o filesystem proposto, considerando a tabela a seguir:

Ponto de
Montagem

Nosuid Noexec

/home

/usr

/tmp

/var

/var/log

Tabela 1.5.2. Estrutura de parties

Se queremos usar o comando passwd com Suid Bit, ns no podemos aplicar no


nosuid aos /usr, pois o comando se encontra em /usr/bin.
3 Exemplo de como est tabela de ficar no /etc/fstab:
# vim /etc/fstab

1 /dev/sda1

ext3

defaults

2 /dev/sda2

none

swap

sw

3 /dev/sda5

/home ext3

4 /dev/sda7

/tmp

ext3

defaults,nosuid,noexec

5 /dev/sda8

/var

ext3

defaults,nosuid,noexec

6 /dev/sda9

/var/log

ext3

defaults,nosuid,noexec

defaults,nosuid,noexec

O novo formato de montagens de parties pode causar um problema que pode ser
contornado. Os aplicativos aptitude e o debconf (yum no Red Hat), precisam usar o
recurso de execuo nas parties /tmp e /var quando um novo pacote instalado.
4 Para contornar esse problema, criem o script abaixo chamado noexec.sh. Ele
liberara a execuo nestas parties quando necessrio:
# mount /cdrom
# cp /cdrom/bs7799/noexec.sh /root/auditoria
# cd /root/auditoria
# vim noexec.sh

1 #!/bin/bash
7 /dev/sda6

/usr

ext3

defaults

2
3 case $1 in
4 start)
5 mount -o remount,rw,noexec /var
6 mount -o remount,rw,noexec /tmp
7
8 mount
9 echo "Parties SEM permisso de execuo"
10 ;;
11
12 stop)
13 mount -o remount,rw,exec /var
14 mount -o remount,rw,exec /tmp
15
16 mount
17 echo "Parties COM permisso de execuo"
18 ;;
19
20 *) echo "erro use $0 {start|stop}"
21 exit 0
22 ;;
23 esac
24 exit 1

# chmod +x noexecu.sh

5 Para permitir a execuo nas parties, faam:


# ./noexec.sh stop

6 Para tirar a execuo nas parties, faam:


# ./noexec.sh start

1.6. Segurana no Terminal


Quando falamos em segurana, a primeira coisa que vem mente um possvel
ataque remoto. Ento, os nossos servidores que no esto conectados internet no esto
correndo nenhum perigo, certo? Errado, alis, dois fatos errados. No estar conectado
diretamente internet, no quer dizer que se est totalmente seguro, pois, se um cracker
conseguir passar pelo nosso firewall, ele vai conseguir chegar at os outros servidores que
no tem acesso direto internet, j que entrou em nossa rede interna.
O outro fato que um funcionrio mal intencionado pode ter um acesso local (fsico)
aos nossos servidores, diretamente no teclado. Se por algum descuido sairmos da sala do
servidores e deixarmos o terminal logado com o usurio root, esse funcionrio mal
intencionado poder fazer o que quiser, j que ele pode estar fingindo ser uma pessoa que
no entende nada de informtica, mas na verdade pode at ter um conhecimento maior que o
nosso.
Para esse tipo de situao, podemos aplicar alguns procedimentos.

1.6.1. Conformidade com a norma


No que diz respeito a segurana no terminal, a norma ABNT NBR ISO/IEC
27002:2005, diz no item 11.5.5, que convm que sesses inativas sejam encerradas aps um
perodo definido de inatividade. E diz no item 11.5.6, que convm que restries de horrios
de conexo sejam utilizadas para proporcionar segurana adicional para aplicaes de alto
risco.

1.6.2. Execuo do Procedimento


Desabilitar o uso de CTRL+ALT+DEL
Desabilitar o CTRL+ALT+DEL no seu sistema Linux pode ser uma boa idia, pois no
permitir que algum pressione essa sequncia de teclas e faa com que o servidor reinicie.
Isso bom, principalmente quando seu servidor Linux est no mesmo hack que um servidor
com o sistema Windows, assim evita-se que em algum momento voc pressione

CTRL+ALT+DEL no teclado do Linux, pensando que o do Windows.

1 Editem o arquivo /etc/inittab e modifique a seguinte linha:


# vim /etc/inittab

De:
ca:12345:ctrlaltdel:/sbin/shutdown -t1 -a -r now

Para:
ca:12345:ctrlaltdel:/bin/echo Este recurso foi desabilitado

2 Depois das alteraes, necessrio atualizar o arquivo /etc/inittab. Isto feito


com o seguinte comando:
# init q

Bloqueando o terminal com a varivel TMOUT


No sistema Linux existe uma varivel que no vem setada por padro. Essa varivel
a TMOUT, que controla em quanto tempo o terminal ser deslogado.
1 Primeiro, sete manualmente a varivel com tempo pequeno para teste:
# TMOUT=10

Espere 10 segundos sem digitar nada no teclado para o terminal ser deslogado.
2 Para deixar essa varivel fixa e vlida para todos os terminais e usurios, edite o
arquivo /etc/profile:
# vim /etc/profile

1 # /etc/profile: system-wide .profile file for the Bourne shell (sh(1))


2 # and Bourne compatible shells (bash(1), ksh(1), ash(1), ...).
3
4 if [ "`id -u`" -eq 0 ]; then
5 PATH="/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin"
6 else
7 PATH="/usr/local/bin:/usr/bin:/bin:/usr/games"
8 fi
9
10 if [ "$PS1" ]; then
11 if [ "$BASH" ]; then
12 PS1='\u@\h:\w\$ '
13 else
14 if [ "`id -u`" -eq 0 ]; then
15 PS1='# '
16 else
17 PS1='$ '
18 fi
19 fi
20 fi
21
22 TMOUT=300
23
24 export PATH TMOUT
25
26 umask 022

3 Depois, atualizem este arquivo:


# source /etc/profile

1.7. Gerenciamento de Privilgios


Podemos pensar o seguinte: o usurio root o usurio mais conhecido em sistemas

*nix (o termo *nix aborda os sistemas baseados em Unix). Quando algum cracker ou
funcionrio mal intencionado tentar obter um acesso ao nosso sistema, seu foco vai ser
conseguir a senha do usurio root. Se ele tiver sorte e consegui-l, ter acesso total ao nosso
sistema. Como evitar isso?
Vamos adotar alguns procedimentos para evitar que o usurio root tenha acesso direto
ao sistema. Ns seremos obrigados a utilizar nossos usurios comuns para logar e depois
utilizaremos su para virarmos root.
Mas no vamos limitar somente o root, vamos impor limites tambm para os usurios
comuns, permitindo que somente o(s) usurio(s) do(s) administrador(es) possam ter um
pouco mais de privilgios. Assim, no permitiremos que um cracker possa se aproveitar de
um usurio comum tambm.

1.7.1. Conformidade com a norma


Por recomendao da norma ABNT NBR ISO/IEC 27002:2005 no item 11.2.2, a
concesso e o uso de privilgios devem ser restritos e controlados.

1.7.2. Execuo do procedimento


Bloqueando o login de root nos terminais locais
No seguro deixar o login como root habilitado para os terminais texto e remotos
(veremos a parte remota nos prximos captulos). O ideal bloquear o login como root em
todos os terminais, logar como usurio comum e quando dor necessrio a realizao de
alguma tarefa administrativa, virar root usando o comando su.
1 Editem o arquivo /etc/securitty e comentem as seguintes linhas:
# vim /etc/securetty

1 # Standard consoles
2 #tty1
3 #tty2
4 #tty3
5 #tty4
6 #tty5
7 #tty6

Isso vai impedir que o usurio logue nos terminas tty1 tty6, j que esses so os
terminais texto que vem habilitados por padro nos sistemas Linux. Essa opo est
vinculada com configuraes do PAM que veremos nos prximos tpicos.
2 Tentem logar com o usurio root em outro terminal:
microX login:

Determinar datas de expirao para contas de usurios


Se o nosso servidor for alocar uma grande quantidade de usurios, podemos
especificar datas de expirao para as contas dos usurios. Dessa maneira, se um usurio
utiliza a sua conta todos os dias, quando sua senha expirar ele poder modifica-la e renovar a
conta. Mas, se por algum motivo uma conta de um usurio no est sendo utilizada, ela ser
desativada no tempo especificado, dando-nos uma segurana de que essa conta no ser
usada com ms intenes.
Podemos utilizar o comando chage, que modifica os parmetros do arquivo
/etc/shadow, onde so feitos esses controles.
1 Visualizem a configurao padro de de uma conta de um usurio:
# chage -l usuario

2 Agora faam algumas modificaes para esse usurio:

# chage -M 30 -W 5 -I 2 usuario
# chage -l usuario
# cat /etc/shadow | grep usuario

Onde:
-M: Tempo mximo de validade da conta.
-W: Tempo de aviso.
-I: Tempo antes da conta ser desativada, podemos considerar como uma colher de ch.
3 Se for necessrio, pode-se definir uma data de expirao:
# chage -E AAAA-MM-DD usuario
# chage -l
# cat /etc/shadow | grep usuario

Remover Shells vlidas de usurios que no precisam


Usurios que no utilizam shell no tem necessidade de te-la. Vamos remover as shells
vlidas de todos os usurios que no vo executar oficialmente login no sistema atravs do
terminal local (tty) ou remotamente via ssh. Combinando a isso, criaremos um usurio
estratgico pertencente ao grupo de administradores, que tambm criaremos. Os usurios
pertencentes a esse grupo tero permisso para realizar o login e posteriormente usar o su
para se tornar root.
1 Criem o grupo admins e logo em seguida criem um usurio tendo como grupo
primrio o admins:

# groupadd admins
# useradd -g admins -m -s /bin/bash toor
# passwd toor

2 Visualizem o arquivo /etc/passwd e vejam que todos os usurios de sistema


tambm possuem shells vlidas:
# getent passwd | less

3 Criem um script para remover todas as shells vlidas dos usurios, menos
daqueles que forem especificados:
# cd /root/auditoria
# vim invalidos.sh

1 #!/bin/bash
2
3 for USER in $(cat /etc/passwd | cut -f 1 -d ":" | grep -v root | grep -v toor | grep -v usuario)
4
5 do
6
7 usermod -s /bin/false $USER
8
9 done

# chmod +x invalidos.sh

4 Agora executem o script. Se tudo der certo, no aparecer nada na tela:

# ./invalidos.sh

5 Depois da execuo do script, visualizem novamente o arquivo /etc/passwd e


vejam como ficou:
# getent passwd | less

Se necessrio, pode-se adotar uma poltica para que sempre que for criado um novo
usurio, ele automaticamente assuma uma shell invlida. Caso ele precise de uma shell
vlida, o administrador pode colocar no arquivo /etc/passwd.
6 Caso desejem adotar essa poltica, editem o seguinte arquivo para deixar uma
shell invlida por padro:
# vim /etc/adduser.conf
DSHELL=/bin/false

No Red Hat esse parmetro est no arquivo /etc/default/useradd, e est como


SHELL=/bin/bash

7 Ainda nesse arquivo, aproveitem para limitar o acesso aos diretrios pessoais de
cada usurio:
DIR_MODE=0750

Dessa maneira, todo novo usurio criado, adotar a permisso 0750 no seu diretrio
pessoal, evitando que outros usurios acessem o seu diretrio.

1.8. Port Knocking com o Knockd


1.8.1. Consideraes iniciais
Para que o contedo exposto a seguir seja aproveitado necessrio que se disponha

ao menos de um conhecimento bsico de redes, segurana, iptables e que esteja


familiarizado com linha de comando em ambiente linux ou similar.

1.8.2. O knockd
O knockd uma implementao de port-knocking. Resumidamente falando, com ele
podemos deixar todas as portas do servidor fechadas e t-lo configurado para ouvir "batidas"
em algumas portas especficas, sendo que as batidas (corretas) podem gerar a execuo de
uma regra de firewall para abrir uma porta ou executar qualquer outro comando.

1.8.3. Como o knockd trabalha


O knockd trabalha na 2a camada do modelo OSI, a camada de enlace ou link , o que o
torna capaz de realizar a "escuta de batidas" em portas fechadas.
O funcionamento bsico do knockd est na "escuta de batidas" e execuo de
comandos pr-definidos no arquivo de configurao quando uma sequncia de portas
configuradas recebe as "batidas". O IP do host que realizou as batidas pode ser usado no
comando informando %IP%.

1.8.4. Obtendo o knockd


A home do knockd est localizada em http://www.zeroflux.org/projects/knock, onde
podemos obter seu cdigo-fonte, pacotes deb, rpm e client para Windows e Mac. Tambm
pode ser instalado via apt-get, pacotes encontrados via rpmfind, linuxpackages, etc, vai
depender da distribuio e preferncia de cada um.
Uma vez compilado ou instalado a partir de um pacote, temos dois binrios, a saber:
o knockd, que o port-knock server, e o knock, que o port-knock client. Dependendo da
configurao do server podemos utilizar como client um cliente telnet qualquer, sem a
necessidade de, dependendo do local em que estamos, baixar e instalar o knock apenas para
realizar as "batidas".

1.8.5. Exemplo de configurao


O arquivo de configurao padro (prefiro cham-lo de "arquivo exemplo")
localizado, normalmente, em /etc/knockd.conf:
[options]
logfile = /var/log/knockd.log
[openSSH]

sequence = 7000,8000,9000
seq_timeout = 5
command = /usr/sbin/iptables -A INPUT -s %IP% -p tcp --dport 22 -j ACCEPT
tcpflags = syn
[closeSSH]
sequence = 9000,8000,7000
seq_timeout = 5
command = /usr/sbin/iptables -D INPUT -s %IP% -p tcp --dport 22 -j ACCEPT
tcpflags = syn

composto da seo [options] e das sees que contm as sequncias de portas e


suas configuraes, como openSSH e closeSSH do exemplo.
Na seo [options] temos:

logfile: define onde sero geradas as mensagens de log.

Outras configuraes que podemos informar na seo [options]:

usesyslog: diz ao knockd para, alm de logar no arquivo informado em logfile,


logar tambm via syslog (no arquivo /var/log/messages ou equivalente);

pidfile: diz qual ser o pidfile (process id file) usado quando o knockd rodado
como daemon. O padro /var/run/knockd.pid. Assim como com outros
daemons, o pidfile gerado quando o processo (knockd no caso) iniciado e
excludo quando parado. Ele contm o id do processo, o mesmo que pode ser
obtido a partir de um ps;

interface: a interface de rede em que o knockd ficar ouvindo as batidas (eth0,


eth1, wlan0...). Pode ser sobrescrita pela opo -i passada durante a
inicializao (knockd -i eth1 por exemplo). A interface padro utilizada quando
no especificada nem aqui e nem via -i a eth0.

Exemplo de como ficaria esta seo com as possveis opes:


[options]
usesyslog
logfile = /var/log/knockd.log
pidfile = /var/run/knockd/knockd.pid

interface = eth1
...
Obs.: neste caso o caminho /var/run/knockd/ informado na configurao pidfile deve
existir para que o arquivo seja criado quando rodado o knockd em modo daemon (-d/-daemon).
Nas demais sees temos:

sequence: indica a sequncia de portas que devero ser "batidas" para que o
command seja executado. No necessrio nos limitarmos a trs portas apenas,
at 32 so aceitas (knockd.c:55: #define SEQ_MAX 32 /* maximum number of
ports in a knock sequence */). Podemos tambm especificar o protocolo que ser
utilizado por porta (TCP ou UDP), utilizando porta:protocolo (exemplo:
7000:tcp,8000:udp,9000:tcp), sendo o TCP o padro quando no especificado;

seq_timeout: indica o tempo limite para que a sequncia de "batidas" seja


realizada, 5 indica que a partir da "batida" na primeira porta, o host tem 5
segundos para "bater" nas restantes, caso contrrio a sequncia ser invalidada;

command: o comando que ser executado quando a sequncia for realizada


com sucesso. Friamente, command um alias para start_command;

tcpflags: s sero consideradas as "batidas" em que os pacotes contenham


setadas as flags especificadas aqui. Mltiplas flags devem ser separadas por
vrgula. Tambm pode ser utilizado ! para excluir uma flag (como syn,!ack).

Outras configuraes que podemos informar nestas sees:

one_time_sequences: permite que seja informado o caminho de um arquivo


que contm uma sequncia por linha. Quando esta opo utilizada a
configurao sequence ignorada, passando a valer as sequncias contidas no
arquivo informado. Uma vez que uma sequncia realizada com sucesso (as
batidas foram realizadas nas portas da sequncia), o primeiro caracter da linha
correspondente substitudo por um #, portanto interessante deixar um
espao em branco no comeo das linhas.

Deve-se tomar um certo cuidado ao utilizar esta configurao para que as sequncias
no acabem. Com a verso 0.5, se isso acontecer teremos no log:

[2008-02-27 18:57] no more sequences left in the one time sequences file for door
"minhaSecao" --> disabling the door
e o knockd morrer em seguida com um belo Segmentation fault.

start_command: o comando que ser executado quando a sequncia for


realizada com sucesso. Normalmente usada a configurao command, que
um alias para esta;

cmd_timeout: define o tempo, em segundos, aps o qual o comando definido


em stop_command (se tiver sido definido, claro, caso contrrio esta configurao
ser ignorada) seja executado aps a execuo do comando definido em
start_command/command. O padro quando no informado 10 (knockd.c:54:
#define CMD_TIMEOUT 10 /* default timeout in seconds between start and stop
commands */). Se, por exemplo, tivermos em command uma regra de iptables
para liberar acesso porta do SSH e em stop_command uma para remover tal
regra, o host que acertou as batidas tem que realizar a conexo neste intervalo,
caso contrrio encontrar a porta fechada (uma vez realizada a conexo a regra
que liberou pode ser removida que a conexo continua, pois j foi estabelecida);

stop_command: comando que ser executado aps cmd_timeout (ou 10 quando


no informado) segundos da execuo do command. Normalmente utilizado
para desfazer o que foi executado em command, como remover uma regra de
iptables que fora adicionada.

Exemplo de uma seo com algumas configuraes alm das do arquivo de exemplo:
[SSH]
sequence = 9900,7070,8008,5542
seq_timeout = 3
cmd_timeout = 20
command = /usr/sbin/iptables -I INPUT -s %IP% -p tcp --dport $(grep "Port "
/etc/ssh/sshd_config | awk '{print $2}') -j ACCEPT
stop_command = /usr/sbin/iptables -D INPUT -s %IP% -p tcp --dport $(grep "Port "
/etc/ssh/sshd_config | awk '{print $2}') -j ACCEPT tcpflags = syn

Explicando: o host ter 3 segundos (seq_timeout) para bater nas portas 9900, 7070,
8008 e 5542 (sequence). Se conseguir ser adicionada uma regra iptables para liberar
acesso

porta

do

servidor

SSH,

que

obtida

do

arquivo

de

configurao

/etc/ssh/sshd_config. Uma vez executado o comando, o host ter 20 segundos (cmd_timeout)


para acessar o servidor SSH da mquina, decorrido este tempo a regra adicionada ser
removida pelo stop_command.
Jamais utilize o arquivo padro sem alteraes, o mnimo aceitvel alterar ao menos
as portas das sequncias.

1.8.6. Iniciando o knockd para testes


Uma vez realizadas as configuraes podemos iniciar o port-knock server, o knockd.
Se simplesmente chamarmos o knockd sem passar parmetros (e se no estiver configurada
a interface na seo [options] do arquivo de configurao, claro) ele iniciar a "escuta" na
interface eth0, mas como queremos inicialmente fazer alguns testes, torna-se mais
interessante solicit-lo a iniciar na interface de loopback (lo), para isto utilizamos a opo -i
(ou --interface, a qual considero mais apropriada para scripts, facilitando para quem estiver
olhando os fontes) seguida da interface, no caso lo:
# knockd -i lo

Iniciando-o assim o console no ser liberado. Para matar o knockd e liberar o


console basta o velho Ctrl + C. Como estamos inicialmente fazendo testes isso se torna
interessante, facilitando o "restart" aps afinarmos as configuraes. (o clssico Ctrl + C
para matar e seta pra cima [ENTER] para rodar novamente o comando). Quando estiver tudo
do jeito que queremos utilizaremos a opo -d/--daemon para inici-lo como daemon.

1.8.7. Testando e checando o arquivo de log


Com o knockd j iniciado vamos realizar alguns testes.
Para enxergarmos o que est acontecendo enquanto testamos, podemos usar o tail
para ficar exibindo as alteraes no arquivo de log (/var/log/knockd.log caso no tenha
alterado a configurao na seo [options] do arquivo de configurao):
# tail -f /var/log/knockd.log
[2008-01-30 20:11] starting up, listening on lo

Ok, vamos realizar algumas "batidas" e ver o que acontece. Para tal vamos utilizar o
prprio knock (o port-knock client). Estou considerando como exemplo o arquivo de
configurao padro, altere as portas conforme as suas configuraes. Vamos bater na
primeira porta, aguardar pouco mais que 5 segundos e bater na segunda:
$ knock localhost 7000
... aguardamos mais que 5 segundos ...
$ knock localhost 8000
No console que iniciamos o tail veremos:
[2008-01-30 20:13] starting up, listening on lo
[2008-01-30 20:41] 127.0.0.1: openSSH: Stage 1
[2008-01-30 20:41] 127.0.0.1: openSSH: sequence timeout (stage 1)
Repare que a sequncia sofreu timeout, uma vez que acertada a primeira porta da
sequncia, tnhamos 5 segundos (se no foi alterado no arquivo de configurao) para
acertar as demais portas.
Batendo nas portas certas (podemos informar todas as portas de uma vez) no tempo
certo:
$ knock localhost 7000 8000 9000
Resultado no log:
[2008-01-30 21:11] 127.0.0.1: openSSH: Stage 1
[2008-01-30 21:11] 127.0.0.1: openSSH: Stage 2
[2008-01-30 21:11] 127.0.0.1: openSSH: Stage 3
[2008-01-30 21:11] 127.0.0.1: openSSH: OPEN SESAME
[2008-01-30 21:11] openSSH: running command: /usr/sbin/iptables -A INPUT -s
127.0.0.1 -p tcp --dport 22 -j ACCEPT
Todos os "estgios" da sequncia foram completados e o comando foi executado.

1.8.8. Colocando em produo


Realizados os testes e as configuraes conforme nossas necessidades, podemos
colocar o knockd para startar junto com o sistema. O local mais apropriado para isto varia de
distribuio para distribuio, mas considerando para fins de explicao, podemos
simplesmente acrescentar uma linha no rc.local:

# /usr/sbin/knockd --daemon --interface eth1

Neste exemplo o knockd ser sempre iniciado junto com o sistema em modo daemon
e ouvindo na interface eth1 ( minha interface conectada internet).
Lembrando que a interface pode tambm ser especificada no arquivo de configurao
para no termos que informar diretamente no comando.
Para listar as demais opes aceitas pelo knockd, --help:
root@home:~# knockd --help
usage: knockd [options]
options:
-i, --interface <int> network interface to listen on (default "eth0")
-d, --daemon run as a daemon
-c, --config <file> use an alternate config file
-D, --debug output debug messages
-l, --lookup lookup DNS names (may be a security risk)
-v, --verbose be verbose
-V, --version display version
-h, --help this help
A opo -c/--config pode ser til se desejarmos rodar mais de um knockd em
interfaces diferentes com configuraes especficas:
# /usr/sbin/knockd --daemon --config /etc/knockd.local.conf
#/usr/sbin/knockd --daemon --config /etc/knockd.internet.conf

1.8.9. Consideraes de implementao


Seguem algumas coisas interessantes que devemos considerar e algumas dicas para
a implementao:

Mais uma vez: jamais utilize o arquivo padro sem alterar ao menos as portas
das sequncias;

A opo -A do iptables realiza um append de uma regra (ou seja: adiciona no


final) na chain (INPUT no caso do exemplo). Ento se voc utiliza ACCEPT como
poltica padro e no final tem um clssico: iptables -A INPUT -p tcp --syn -j DROP

no vai adiantar nada adicionar uma regra para ACCEPT aps ela (pois isso
que o -A ir fazer), no? Neste caso o comum utilizar a opo -I ao invs de -A,
para realizar um insert no topo de todas as regras da chain ao invs de adicionla no final. Ok, mais detalhes: man iptables;

Utilize portas no sequenciais nas sequncias (soa estranho, no?), ao invs de


4251, 5251, 6251, 7251, utilize 7251, 5251, 4251, 6251, assim se algum estiver
batendo em todas as por cmd_timeout de 2 minutos e 10 segundos e no
stop_command um comando/script para remover o IP da lista) que ser checada
pelo command de uma outra seo com sequncia diferente que far a
liberao. Com um pouco de imaginao d pra fazer coisas absurdas.

Podemos tambm utilizar uma seo com sequncias prximas das que
queremos utilizar realmente (se temos 7000, 9000, 8000 na seo que libera o
acesso, podemos usar 7001, 7002, 7003 nesta) que adiciona o IP numa lista
negra, que checada pelo comando de liberao que no faz nada se achar o IP
nela...;

Mescle, sempre que possvel, TCP com UDP nas sequncias:

[tcp_udp]
sequence = 9001:udp,8001,7001:udp
seq_timeout = 5
command = /usr/bin/echo %IP% >> /tmp/knock_echo
$ knock localhost 9001:udp 8001 7001:udp
TCP o padro, ento no precisamos obrigatoriamente usar :tcp, apenas :udp.

No utilize um mesmo nmero de porta como parte de sequncias de sees


diferentes se no quiser dor-de-cabea;

O uso de one_time_sequences interessante pois evita que um sniffer descubra


a sequncia e consiga realizar um ataque, mas pode ser invivel se tivermos
mais de um administrador que acessa a mquina, alm de termos que
decorar/anotar todas as sequncias. Uma alternativa pode ser a utilizao de
scripts que, viajando um pouco: utilizam o IP ou a data/hora pra fazer algum
clculo e liberar apenas aps um tempo gerado a partir do clculo e por um
pequeno perodo (uns 30 segundos). tas numa sequncias (1000, 1001,
1002....7000, 7001, 7002...) no vai acertar nossa sequncia;

uma boa utilizar scripts que sero executados ao invs de um simples

iptables .... Podemos, por exemplo, implementar uma seo com uma sequncia
que apenas adiciona o IP numa lista aps 2 minutos (e com cmd_timeout de 2
minutos e 10 segundos e no stop_command um comando/script para remover o
IP da lista) que ser checada pelo command de uma outra seo com sequncia
diferente que far a liberao. Com um pouco de imaginao d pra fazer coisas
absurdas.

1.9. Fail2ban
Todos sabemos que nos dias de hoje os ataques a fora bruta (brute force) so muito
comuns e devemos tomar precaues para no sofrermos um ataque dessa espcie. Vamos
conhecer o Fail2ban, disponvel no repositrio da maioria das distribuies Linux.
O Fail2ban uma ferramenta de segurana que tem como funo observar as
tentativas de login em servios como SSH, FTP, SMTP etc.
O que ele faz localizar vrias tentativas de login vindas do mesmo IP, bloqueando-o
e adicionando regras no firewall iptables caso haja vrias tentativas frustradas de login no
servidor.

1.9.1. Instalando e entendendo como funciona


Nas distribuies Linux Debian e Debian-based voc pode instalar via apt-get com o
comando:
$ sudo apt-get install fail2ban

Depois de baix-lo e instal-lo vamos dar uma olhada na sua configurao:


$ sudo vi /etc/fail2ban/jail.conf

Vamos entender as linhas de maior importncia:

Na linha "ignoreip" se encontram os endereos de IPs que no vo ser

bloqueados pelo programa.

Na linha "bantime" se encontra o tempo em que o IP ficar banido/bloqueado


pelo programa (o tempo contado em segundos).

Na linha "maxretry" temos o nmero mximo em que o IP pode tentar logar-se


no seu servidor at ser bloqueado (recomendo que ponha no mximo 3).

A linha "logpath" refere-se ao arquivo de log onde so checadas as tentativas


frustradas de login.

1.9.2. Configurando
Antes de editar o arquivo recomendvel que voc faa o backup do mesmo. Abra-o
com um editor de textos:
$ sudo vi /etc/fail2ban/jail.conf

Na linha ignoreip eu adicionei o ip localhost 127.0.0.1, pois voc no ir bloquear


voc mesmo.
# "ignoreip" can be an IP address, a CIDR mask or a DNS host
ignoreip = 127.0.0.1

Em maxretry eu configurei o bloqueio para cada 4 tentativas de login sem sucesso:


maxretry = 3

Em bantime onde voc controla o tempo de banimento coloquei 300, que ser 5
minutos.
bantime = 300

Salve o arquivo e reinicie o Fail2ban:


$ sudo /etc/init.d/fail2ban restart

Pronto! O programa est configurado e poder ver os IPs bloqueados em


/var/log/fail2ban.log.

1.10. Utilizando o PAM

O significado da sigla PAM1 Mdulos de Autenticao Plugveis.


O PAM utilizado para trazer novas funcionalidades para um programa. Um exemplo
prtico o programa de login do sistema. A funo dele somente checar usurio e senha,
verificar se esto cadastrados no sistema. Mas e se desejarmos que quando um usurio
digitar o nome de login e a senha dela, seja checado se naquele dia e horrio ele pode logar.
O que faremos? Teremos que mudar o cdigo fonte do programa e recompila-lo? A resposta
no.
Podemos utilizar um mdulo do PAM que faz esse gerenciamento de horrios e acessos
dos usurios. Podemos utilizar os mdulos do PAM para vrias outras, como por exemplo:
limitar usurios que podem logar, definir somente alguns grupos que podem fazer su no
sistema, deixar senhas mais seguras e muitas outras coisas.
Os mdulos do PAM podem ser utilizados para qualquer aplicao que tenha suporte
ao PAM. A sintaxe de utilizao dos mdulos dentro de cada arquivo so as seguintes:

<tipos de mdulo> <controle> <mdulo> <argumentos do mdulo>

Os tipos de mdulo que podemos ter so os seguintes:


account: Esse tipo de mdulo trata a conta do usurio, onde pode ser definido
restries ou permisses relacionadas a horrios de acesso, nmero mximo de logins,
expirao de conta e outros controles.

http://www.kernel.org/pub/linux/pam

auth: O mdulo auth trata a autenticao dos usurios, verificando se eles realmente
so quem dizem ser.
password: Esse mdulo utilizado para configuraes relacionadas a senhas e
autenticao.
session: O mdulo session usado para gerenciar sesso de usurios que j
autenticaram.
Os controles que podemos ter so os seguintes:
required: Nesse controle o mdulo deve ser checado para realizar a autenticao.
Caso esse mdulo falhe, o usurio s notificado depois de todos os mdulos de
mesmo tipo serem checados.
requisite: O mdulo tambm deve ser checado para realizar a autenticao, s que se
o mdulo falhar o usurio notificado imediatamente, no checando os outros
mdulos de mesmo tipo.
sufficient: O sucesso de verificao do mdulo o suficiente para satisfazer s
exigncias de autenticao da pilha de mdulos. Quando a verificao de um mdulo
marcado como sufficient for bem sucedida e nenhum mdulo marcado como required
falharem, todos os outros mdulos do mesmo tipo no sero verificados e o usurio
autenticado.
optional: O sucesso ou falha deste mdulo somente importante se for o nico
mdulo na pilha associado com o servio e o tipo de mdulo.
Alguns mdulos sero vistos no decorrer desse tpico.
A maioria das distribuies trabalham com o PAM, as nicas distribuies que no
trabalham com o PAM so as baseadas em Slackware.
A LPI 303 cobra o PAM. importantssimo sabermos a diferenas entre os tipos de
mdulos e os controles. A prova no pergunta a diferena pura entre eles, mas pode
colocar perguntas sobre alguns cenrios de utilizao do PAM, onde as opes de
respostas uma mesma regra s que cada opo usando um controle ou tipo de
mdulo, e termos que responder exatamente qual a regra correta para o cenrio
proposto.

1.10.1. Execuo do procedimento

1 O primeiro passo, descobrir se nossas aplicaes tem suporte a PAM. Para


fazer isso basta consultarmos o diretrio /etc/pam.d:
# ls -l /etc/pam.d

Primeiro necessrio saber se a aplicao est instalada, para depois verificar se o


arquivo relacionado a ela existe em /etc/pam.d. Usem dpkg no Debian ou rpm no
Red Hat para descobrir se a aplicao em questo est instalada.
2 - Tambm podemos verificar se aplicao tem suporte a PAM, usando o comando
ldd:
# ldd /bin/login

10

linux-gate.so.1 => (0xb7f66000)

11

libpam.so.0 => /lib/libpam.so.0 (0xb7f4d000)

12

libpam_misc.so.0 => /lib/libpam_misc.so.0 (0xb7f4a000)

13

libc.so.6 => /lib/i686/cmov/libc.so.6 (0xb7dee000)

14

libdl.so.2 => /lib/i686/cmov/libdl.so.2 (0xb7dea000)

15

/lib/ld-linux.so.2 (0xb7f67000)

3 Vejamos quais mdulos do PAM esto disponveis, consultando o diretrio


/lib/security:
# ls -l /lib/security

Estes so os mdulos que esto disponveis at o momento. Outros mdulos sero


instalados no decorrer do captulo.

1.10.2. Limitar horrios de login


Para limitarmos o login de alguns usurios, vamos utilizar um mdulo do PAM

chamado pam_time.so.
1 O primeiro passo, ativarmos o mdulo na aplicao que queremos controlar o
login. Para isso, editem o arquivo /etc/pam.d/login e descomente a seguinte linha:
# vim /etc/pam.d/login

account

requisite

pam_time.so

Alguns mdulos do PAM, trabalham com argumentos e parmetros, outros mdulos


trabalham com arquivos de configurao, que o caso do mdulo pam_time.so. Esse mdulo
trabalha com o arquivo /etc/security/time.conf.
Vamos criar uma restrio onde determinado usurio s pode logar no servidor de
segunda sexta das 8 s 18.
2 Editem o arquivo /etc/security/time.conf e acrescentem as seguintes linhas:
# vim /etc/security/time.conf

login;*;usuario;Al0800-1800
login;*;usuario;!SaSu0000-2400

Onde:
login: o nome do servio onde o pam_time.so est ativado.
*: Indica os terminais texto (tty) onde a poltica ser aplicada. Nesse caso so todos os
terminais.
usuario: Campo onde informa o usurio onde a poltica ser aplicada.
Al0800-1800: Indica os dias que o usurio poder logar. Esse campo informa que ele
poder logar todos os dias (Al) das 8 s 18 horas (0800-1800).
!SaSu0000-2400: Esse campo para completar o conjunto da regra. Esse campo diz
que o usurio poder logar em todos os dias com exceo (!) dos sbados e domingos
(SaSu) o dia inteiro (0000-2400).
Com a funo das duas regras, cumprimos a tarefa de permitir que o usurio s vai

logar de segunda sexta das 8 s 18 horas.


3 Faamos alguns testes:
Mudem a hora e a data para um horrio que o usurio pode logar e testem em
outro terminal se o login vai ser bem sucedido:
# date MMDDHHmmAAAA

Depois modifiquem para um dia e horrio que ele no pode logar e testem em
outro terminal:
# date MMDDHHmmAAAA

1.10.3. Limitar logins consecutivos


Definam uma poltica para no permitir que um usurio logue em mais de um console
consecutivamente.
1 Precisamos verificar se o mdulo pam_limits.so est ativado no arquivo
/etc/pam.d/login:
# vim /etc/pam.d/login

session

required

pam_limits.so

2 O mdulo pam_limits.so, trabalha com o arquivo limits.conf que est dento de


/etc/security. Editem esse arquivo e acrescentem uma linha para limitar que o
usurio s pode logar em dois terminais consecutivamente:
# vim /etc/security/limits.conf

usuario

hard

maxlogins

3 Para testarmos, loguem com o usurio em um novo terminal, mantenham esse


terminal aberto e loguem em um segundo terminal, mantenha os dois terminais
abertos e tentem logar em um terceiro terminal:

1.10.4. Limitar usurios que podem usar o su


Aproveitando o usurio toor e o grupo admins que criamos, vamos criar uma poltica
que no possibilite o uso do comando su, exceto pelos usurios do grupo admins. Essa
configurao vai ser um pouco diferente das outras, pois o mdulo do PAM que vamos usar,
no precisa de um arquivo de configurao adicional.

1 Primeiro, precisamos saber se o mdulo necessrio est ativado na aplicao su


e ajusta-lo as nossas necessidades:
# vim /etc/pam.d/su

auth

required

pam_wheel.so group=admins

Dessa maneira, somente os usurios que estiverem no grupo admins, podero ter
acesso fazer su.
2 Agora, loguem com o usurio toor e faam um su:
$ su

Por questes de segurana, toda atividade do comando su, deve ser monitorada. Os
procedimentos abaixo servem para registrar em um arquivo de log, o uso do comando su
pelos usurios.
3 Editem o arquivo /etc/login.defs e descomentem a seguinte linha:
# vim /etc/login.defs
SULOG_FILE

/var/log/sulog

4 Deixem o log sulog file aberto em tempo real em um terminal:

# tail -f /var/log/sulog

5 Agora faam testes com o comando su. Testem com usurios que podem fazer o
su e usurios que no podem:
$ su root

6 Voltem at o terminal que o log est aberto e visualizem o que foi registrado. O
que est com o sinal de mais (+), foi um su bem sucedido, um sinal de menos (-),
foi um su mal sucedido:
CTRL+ALT+FX

1.10.5. Trabalhado com senhas mais seguras


Podemos instalar um mdulo do PAM chamado pam_cracklib.so. Como esse mdulo,
podemos mudar a maneira de um usurio criar a sua senha. Com ele podemos definir um
nmero mnimo de caracteres para uma senha, e caso seja uma troca de senha, podemos
definir quantos caracteres precisam diferentes da senha anterior. O mdulo tambm traz
alguns controles prprios, no permitindo que senhas muito simples como 123456 sejam
definidas.
1 Primeiro precisamos instalar o mdulo libpam-cracklib:
# aptitude install libpam-cracklib

# yum install cracklib


Lembrando que ela j vem instalada por padro.
2 Agora faam as seguintes modificaes no arquivo /etc/pam.d/common-password:
# vim /etc/pam.d/common-password

Comentem a seguinte linha:

# password required

pam_unix.so nullok obscure min=4 max=8 md5

Descomentem as duas seguintes:


password

required

pam_cracklib.so retry=3 minlen=8 difok=3

password

required

pam_unix.so use_authok nullok md5

Onde:
retry=3: 3 tentativas de mudana de senha.
minlen=8: Senha com no mnimo 8 caracteres.
difok=3: Uma diferena de pelo menos 3 letras da antiga senha.
3 Loguem como usurio comum e facam os testes de troca de senha para validar
as novas funes:
$ passwd usuario

Lembrem que quando um usurio troca a sua senha, a senha antiga requisitada.

1.10.6. Limitar quais usurios podem logar


Com o PAM, podemos permitir que somente alguns usurios se autentiquem em um
servio. Isso pode ser feito, atravs de um mdulo chamado pam_listfile.so, que faz o
controle de autenticao, baseado em um arquivo que contenha os nomes dos usurios.
O caso mais clssico para isso, em servios FTP.
1 Vamos instalar o servidor FTP vsftpd:
# aptitude install vsftpd

# yum install vsftpd

2 - Podemos verificar que um arquivo chamado vsftpd foi criado dentro de


/etc/pam.d. Vamos editar esse arquivo e entender a funo do pam_listfile.so:
# vim /etc/pam.d/vsftpd

auth required pam_listfile.so item=user sense=deny file=/etc/ftpusers onerr=succeed

Esse mdulo quer dizer que ele vai verificar se existe o determinado usurio que est
tentando logar no ftp (item=user) dentro do arquivo /etc/ftpusers (file=/etc/ftpuser). Caso
esse usurio exista dentro desse arquivo, a ao do mdulo vai ser bloquea-lo (sense=deny).
Se por algum motivo acontecer algum erro, como por exemplo o arquivo /etc/ftpusers no
existir, a ao do mdulo vai ser liberar a autenticao do usurio (onerr=succeed).
3 Para o vsftpd aceitar login de usurios no annimos, descomentem a seguinte
linha no arquivo /etc/vsftpd.conf:
# vim /etc/vsftpd.conf
local_enable=YES
# /etc/init.d/vsftpd restart

4 Primeiro faam um ftp e vejam se o usurio consegue logar normalmente:


# ftp localhost
Connected to localhost.
220 (vsFTPd 2.0.7)
Name (localhost:root):

5 Em seguida, coloquem esse usurio no arquivo /etc/ftpusers e vejam novamente


se ele vai conseguir logar no servidor FTP:

# vim /etc/ftpusers
nobody
usuario

# ftp localhost

Podemos ver que agora o usurio no consegue logar, pois o seu nome foi includo no
arquivo /etc/ftpusers.

6 Para verem se o parmetro onerr=succedd funciona, movam o arquivo ftpusers


para outro diretrio e tentem logar novamente com o usurio:
# mv /etc/ftpusers /root
# ftp localhost

Como a opo succedd, o usurio consegue logar pois ele diz que em caso de
problemas, a ao liberar o login. Para no liberar o login, mesmo que o arquivo
no exista ou acontea algum problema, essa opo deve ficar como fail: onerr=fail.
7 Depois do teste, voltem o arquivo ftpusers para o seu diretrio original
# mv /root/ftpusers /etc

A LPI pode cobrar o funcionamento do mdulo pam_listfile.so. Devemos ficar atentos


ao funcionamento dos parmetros sense e onerr, pois dependendo da pergunta, eles
podem mudar a maneira de serem interpretados. Nas perguntas, o mdulo tambm
pode aparecer sendo usado em outras aplicaes, como por exemplo no prprio login
do sistema. Lembrem-se, os mdulos do PAM podem ser utilizados em qualquer
aplicao que tenham suporte a ele.

1.11. Procurando por senhas fracas


A senha de login de um usurio algo pessoal, e ns administradores normalmente

no ficamos sabendo quais so as senhas dos usurios. Ento, normalmente, quando vamos
cadastrar o usurio no sistema, temos que pedir para o usurio digitar a senha que ele
deseja. Entretanto, muitas vezes, ou na maioria das vezes, o usurio digita uma senha
padro, estilo 123456, ou o nome dele, data de aniversrio ou algo do gnero. Essas so
senhas muito fceis de ser descobertas, que muitas vezes podem ser descobertas na
tentativa e erro ou rapidamente com uma ferramenta de Brute Force (Fora Bruta).
Vamos usar o John the Ripper 2, uma ferramenta de Brute Force local, que tenta
descobrir as senhas dos arquivo /etc/shadow, utilizando uma WordList padro (lista com
senhas e usurios a serem tentados).

1.11.1. Conformidade com a norma


No que diz respeito as senhas a norma ABNT NBR ISO/IEC 27002:2005 diz no item
11.2.3, que convm que a concesso de senhas seja controlada atravs de um processo de
gerenciamento formal.
E diz no item 11.3.1, que convm que os usurios sejam solicitados a seguir boas
prticas de segurana da informao na seleo e uso de senhas.

1.11.2. Execuo do procedimento


1 Creiem outro usurio para testes. Coloque a senha dele como 123456:
# adduser usuario

2 Agora podemos instalar o john:


# aptitude install john

# yum install john

3 - Como o john instalado, entrem no diretrio /usr/share/john e vejam o arquivo de


WordList:

2 http://www.openwall.com/john/doc/

# cd /usr/share/john
# cat password.lst

4 Vamos executar o john de maneira simples para descobrir senhas fracas:


# john /etc/shadow

Depois que o john descobre as senhas, se executarmos ele novamente, ele no s


mostrar novamente. Para visualizarmos as senhas j descobertas, precisamos usar o
parmetro --show.

5 Visualizem as senhas j descobertas:


# john --show /etc/shadow

Se o john foi executado com o usurio root, as senhas encontradas ficam no arquivo
john.pot, dentro de /root/.john.
6 Pode acontecer de o john ser interrompido enquanto tenta quebrar as senhas,
caso isso acontea, podemos usar o parmetro --restore para que ele continue de
onde parou:
# john --restore

7 Se desejarmos, podemos informar outro arquivo de word list a ser usado pelo
john:
# echo 123456 > /root/teste
# john --wordlist:/root/teste /etc/shadow

Captulo 2
Trabalhando com ACLs

Entender as permisses padres dos sistema.


Aprender o que so ACLs.
Entender como as ACLs trabalham com as permisses padres.
Aplicar ACLs de forma efetiva.
Ver a correlao da Norma ANT NBR ISO 27002 com os assuntos abordados.

2.1. O que so as ACLs?


O modelo tradicional de permisses do modelo POSIX 3, define trs grupos de controle
de acesso, que so o usurio dono, grupo dono e outros. Cada um desses trabalham com as
permisses padres do sistema: leitura (r), escrita (x) e execuo. Podemos trabalhar com
esse trio de permisses, para cada um dos trs grupos, definindo o acesso de cada um deles
a um arquivo ou diretrio. Essas permisses trabalham muito bem em ambientes simples,
onde no exige-se um grande controle de acesso a informaes e onde no existe o
compartilhamento de arquivos entre reas e departamentos. Para casos mais complexos
precisamos trabalhar com ACLs4.
ACL significa Access Control List que no portugus Lista de Controle de Acesso.
O nome ACL, pode ser visto em diversas aplicaes. Podemos trabalhar por exemplo
com ACLs na aplicao Proxy Squid, que vai fazer o controle do que pode acessado na
internet. Podemos tambm trabalhar com ACLs no Postfix, OpenLDAP e diversas outras
aplicaes.
No nosso ambiente, vamos trabalhar com ACLs de filesystem. Essas ACLs, vo trazer
novas funcionalidades para termos uma flexibilidade na hora de setar quais usurios e
grupos podem acessar um determinado diretrio ou grupo.
Para trabalharmos com ACLs de filesystem, precisamos que o nosso filesystem tenham
suporte a ACLs, caso contrrio, ser necessrio habilitar essa funo no kernel e recompilalo. A grande maioria dos sistemas Linux, trabalham com o filesystem ext3 como o padro, e o
ext3 possu suporte nativo ACLs. As ACLs, so muito parecidas com as permisses padres
do sistema. A tabela 2.2. mostra quais so os tipos de ACLs que podem ser setadas para um
arquivo ou diretrio.

Tipo

Forma de
uso

Owner

u::rwx

Named user

u:usuario:rwx

http://en.wikipedia.org/wiki/POSIX
4 http://www.suse.de/~agruen/acl/linux-acls/online/

Owning group g::rwx


Named group g:grupo:rwx
Mask

m::rwx

Others

o::rwx
Tabela 2.2.

Todos esses tipos e formas de uso, sero abordados no decorrer do captulo.

2.1.1. Conformidade com a norma


Sobre ACLs e controles de acesso a norma ABNT NBR ISO/IEC 27002:2005, diz no
item 11.6.1 letra b, que convm controlar os direitos de acesso dos usurios, por exemplo,
ler, escrever, excluir e executar.

2.1.2. Execuo do procedimento: Trabalhado com as ACLs


Vamos imaginar o seguinte cenrio: Temos o departamento de contabilidade e o
departamento financeiro dentro da empresa. O funcionrio Vader da contabilidade, precisa
acessar alguns arquivos dentro de um diretrio do diretrio financeiro, porm ele no
precisa ter acesso a todos os arquivos que esto dentro do diretrio financeiro. Da maneira
padro em sistemas Linux, usando as permisses padres, isso no seria possvel, pois ns s
teramos duas alternativas, colocar o usurio Vader no grupo do financeiro e ele teria acesso
a tudo do financeiro, ou deixar ele fora do grupo do financeiro e assim ele no teria acesso a
nada no diretrio do financeiro.
Resolveremos esse problema usando as ACLs de filesystem.
1 - Vamos criar uma nova partio. Vamos usar o dispositivo /dev/sda11:
# cfdisk /dev/sda
# mkfs.ext3 /dev/sda11

2 Para essa partio, criem um diretrio chamado /documentos e montem essa


partio nesse diretrio:

# mkdir /documentos
# mount -t ext3 /dev/sda11 /documentos

3 Para trabalharmos com ACLs de filesystem, precisamos definir que determinada


partio trabalhar com ACLs. Isso pode ser feito atravs do /etc/fstab e remontando
a partio:
# vim /etc/fstab

/dev/sda11

/documentos

ext3

defaults,acl

# mount -o remount /documentos


# mount

4 Criem dois grupos, um chamado financeiro e outro contabilidade. Em seguida,


criem dois usurios, cada um pertencente a um desses grupos:
# groupadd financeiro
# groupadd contabilidade
# useradd -g financeiro -m -s /bin/bash luke
# passwd luke
# useradd -g contabilidade -m -s /bin/bash vader
# passwd vader

5 Dentro do diretrio /documentos, criem um diretrio chamado financeiro e outro


chamado contabilidade:

# mkdir /documentos/financeiro
# mkdir /documentos/contabilidade

Agora, teremos pontos importantes, vamos associar os grupos aos diretrios e vamos
definir as permisses padres do sistema aos diretrios. Esse ponto muito importante, para
no termos conflitos no momento de trabalhar com as ACLs.

6 Associem os grupos aos seus devidos diretrios:


# chown root.contabilidade /documentos/contabilidade
# ls -lhd /documentos/contabilidade
# chown root.financeiro /documentos/financeiro
# ls -lhd /documentos/financeiro

7 Agora podemos definir as permisses padres, imaginando que qualquer um


possa entrar no diretrio /documentos, e somente o pessoal de cada departamento
consiga entrar em seus respectivos diretrios:
# chmod 755 /documentos
# chmod 770 /documentos/contabilidade
# chmod 770 /documentos/financeiro

8 Para trabalharmos com ACLs, precisamos instalar o pacote acl, que vai trazer os
comandos e ferramentas para administrarmos as novas permisses:
# aptitude install acl

# yum install acl

Aps a instalao do pacote acl, vamos ter dois comandos disponveis:


setfacl: Esse o comando utilizado para configurar as ACLs em arquivos e diretrios.

getfacl: Esse o comando utilizado para visualizar as ACLs que esto definidas em
cada arquivo e diretrio.

9 Visualizem como esto as ACLs dos diretrios que criamos:


# getfacl /documentos
# file: documentos
# owner: root
# group: root
user::rwx
group::---

# getfacl /documentos/financeiro
file: documentos/financeiro/
# owner: root
# group: financeiro
user::rwx
group::rwx
other::---

# getfacl /documentos/contabilidade
file: docs/financeiro/
# owner: root
# group: financeiro
user::rwx
group::rwx
other::---

Podemos ver que at o memento o comando getfacl nos mostra somente as permisses
padres, as que j esto definidas para cada diretrio.
10 Agora loguem com o usurio luke, e criem dois arquivos no diretrio do
financeiro:
$ cd /documentos/financeiro
$ touch arq1.txt arq2.txt
$ ls -lh

11 Em outro terminal, loguem com o usurio vader e tentem acessar o diretrio do


financeiro:
$ cd /documentos/financeiro
-su: cd: /documentos/financeiro/: Permission denied

A permisso do diretrio financeiro 770, logo somente o dono do diretrio ou os


usurios que pertencem ao grupo dono do diretrio vo conseguir entrar nele. Precisamos
que o usurio Vader, tenha acesso para entrar nesse diretrio e conseguir ver os arquivos
que tem dentro dele.
12 Vamos definir pelas ACLs, que o usurio Vader pode entrar no diretrio do
financeiro:
# setfacl -m u:vader:r-x /documentos/financeiro

Onde:

-m: Opo para definir ou modificar ACLs.


u: Quer dizer que estamos definindo uma permisso para um usurio.
vader: Nome do usurio que estamos aplicando a ACL.
r-x: Permisses que esto sendo aplicadas para o usurio.
/documentos/financeiro: Diretrio onde a ACL est sendo aplicada.

# getfacl /documentos/financeiro
# file: documentos/financeiro/
# owner: root
# group: financeiro
user::rwx
user:vader:r-x
group::rwx
mask::rwx
other::---

Podemos ver, que o parmetro user:vader:r-x foi adicionado. Isso quer dizer que o
usurio Vader tem permisses para acessar o diretrio.
13 Tentem novamente acessar o diretrio financeiro com o usurio Vader e vejam
se conseguem apagar ou modificar algum arquivo.
$ cd /documentos/financeiro
$ ls -lh
$ echo teste > arq1.txt
$ rm -rf arq1.txt

O usurio Vader tem acesso ao diretrio financeiro, porm ele no pode alterar ou
apagar os documentos, somente visualiza-los.
14 Como podemos ver se determinados diretrios ou arquivos esto com ACLs
ativadas? Podemos usar um simples ls:

# ls -lh /documentos
drwxrwx--- 2 root contabilidade 4.0K xxxx-xx-xx 17:26 contabilidade
drwxrwx---+ 2 root financeiro 4.0K xxxx-xx-xx 20:04 financeiro

Reparem que o diretrio que tem a ACL definida, possu um caracter (+) no final das
permisses.
15 Vamos definir, que o usurio Vader tem acesso de leitura e escrita a todos os
arquivos que esto dentro do diretrio financeiro:
# setfacl -m u:vader:rw /documentos/financeiro/*

# getfacl /documentos/financeiro/*
# file: documentos/financeiro/arq1.txt
# owner: luke
# group: financeiro
user::rwuser:vader:rwgroup::r-mask::rwother::r-# file: documentos/financeiro/arq2.txt
# owner: luke
# group: financeiro
user::rwuser:vader:rwgroup::r-mask::rwother::r--

As permisses para o usurio Vader foram adicionadas, agora ele tem acesso a todos
os arquivos que existem dentro do diretrio financeiro.
16 Vejam se agora o usurio Vader consegue modificar um arquivo dentro do
diretrio financeiro:

$ cd /documentos/financeiro
$ echo teste > arq1.txt
$ cat arq1.txt

At agora, resolvemos um problema, o usurio Vader consegue acessar todos os


arquivos que existem dentro do diretrio financeiro. Mas o que acontece quando um novo
arquivo criado por usurios do grupo financeiro nesse diretrio?
17 Com o usurio Luke, criem um novo arquivo dentro do diretrio financeiro e
vejam se o usurio Vader, tem permisses para alter-lo:
$ cd /documentos/financeiro
$ touch arq3.txt

$ getfacl arq3.txt
# file: arq3.txt
# owner: luke
# group: financeiro
user::rwgroup::r-other::r--

$ su vader
$ cd /documentos/financeiro
$ echo teste > arq3.txt
-su: arq3.txt: Permission denied

Todos os novos arquivos que so criados dentro do diretrio financeiro, no herdam as


ACLs que foram definidas, logo seria necessrio ficar definindo acessos sempre que um novo
arquivo criado, isso se o usurio Vader precisar ter acesso a todos os arquivos dentro do
financeiro, que no o caso.
Mas vamos imaginar, outro cenrio. O usurio Vader, precisa ter acesso total a uma

pasta chamada auditoria, inclusive a os arquivos que vo sendo criados posteriormente.


Para resolver essa situao, podemos definir a permisso default do diretrio, que a
permisso que ser herdada sempre que um novo arquivo ou diretrio for criado.

18 Crei o diretrio auditoria dentro do financeiro, defina as permisses para ele e


a ACL de acesso:
# cd /documentos/financeiro
# mkdir auditoria
# chgrp financeiro auditoria
# chmod 770 auditoria
# setfacl -m u:vader:rwx /documentos/financeiro/auditoria

19 Vamos definir que a permisso default para o usurio Vader. Essa permisso vai
ser de leitura e escrita no diretrio auditoria:
# setfacl -d -m u:vader:rwx /documentos/financeiro/auditoria

# getfacl /documentos/financeiro/auditoria

# file: documentos/financeiro/auditoria
# owner: root
# group: financeiro
user::rwx
user:vader:rwx
group::rwx
mask::rwx
other::--default:user::rwx
default:user:vader:rwx
default:group::rwx
default:mask::rwx
default:other::---

Onde:
-d: Opo para definir as permisses default.
Com essa permisso definida, tudo que for criado dentro do diretrio financeiro,
herdar a permisso rw para o usurio Vader.
Com essas permisses, o usurio vader conseguiria ler e escrever em todos os
arquivos criados no diretrio financeiro, porm se um novo diretrio fosse criado,
essas permisses no seriam adequadas, pois para que o usurio vader conseguisse
entrar em um novo diretrio, ele precisaria da permisso de execuo (x), que para
diretrios serve para liberar a navegao dentro deles.

20 Agora, com o usurio Luke, criem um novo arquivo no diretrio financeiro, e


vejam se o usurio Vader vai ter acesso a ele:
$ cd /documentos/financeiro/auditoria
$ touch arq4.txt

$ getfacl arq4.txt
# file: arq4.txt
# owner: luke
# group: financeiro
user::rwuser:vader:rwx
group::rwx
mask::rwother::---

Um parmetro muito importante nas ACLs o valor de mask. O mask define a


permisso efetiva de acesso de um usurio ou grupo a um determinado arquivo ou
diretrio, evitando que sejam atribudas permisses mal planejadas. A LPI pode
montar cenrios, onde o valor do mask est diferente do padro e pedir para
definirmos qual a permisso efetiva de um usurio.
Falando no parmetro mask, vamos definir que o grupo financeiro tem acesso total ao
diretrio contabilidade, mas vamos colocar algumas restries no mask.

21 Definam os acessos para o grupo financeiro no diretrio contabilidade:


# setfacl -m g:financeiro:rwx /documentos/contabilidade/
# setfacl -d -m g:financeiro:rwx /documentos/contabilidade/

# getfacl /documentos/contabilidade
# file: documentos/contabilidade/
# owner: root
# group: contabilidade
user::rwx
group::rwx
group:financeiro:rwx
mask::rwx
other::--default:user::rwx
default:group::rwx
default:group:financeiro:rwx
default:mask::rwx
default:other::---

Onde:
g: Atributo utilizado para definir permisses para os grupos.
:financeiro: Nome do grupo onde esto sendo aplicas as permisses.
Com essas permisses o grupo financeiro tem acesso total (rwx) ao diretrio
contabilidade. Mas para fazermos um controle real de qual vai ser a permisso do grupo
financeiro ao diretrio, podemos mudar o valor do mask.
22 Ajustem o valor do mask para que ele contenha as permisses de leitura (r) e
execuo (x):
# setfacl -m m::r-x /documentos/contabilidade/
# setfacl -d -m m::r-x /documentos/contabilidade/

# getfacl /documentos/contabilidade
# file: documentos/contabilidade/
# owner: root
# group: contabilidade
user::rwx
group::rwx

#effective:r-x

group:financeiro:rwx

#effective:r-x

mask::r-x
other::--default:user::rwx
default:group::rwx

#effective:r-x

default:group:financeiro:rwx

#effective:r-x

default:mask::r-x
default:other::---

Onde:

m: Atributo utilizado para setar o valor do parmetro mask.


Vejam que o que vale agora, so as permisses efetivas. feito um clculo da
mscara(mask) com as permisses j setadas. Se o mask leitura e execuo (r-x), as outras
permisses tambm vo ser, mesmo que elas contenham a de escrita (w).
Resumindo, um usurio do grupo financeiro, no vai conseguir gravar um novo arquivo
no diretrio contabilidade, mas vai conseguir ler e executar arquivos e entrar em outros
diretrios.
Porm podemos perceber que o parmetro mask tambm aplica-se as permisses do
grupo dono do diretrio, e isso seria um problema pois os usurio do grupo contabilidade
tambm no conseguiriam gravar arquivos dentro do diretrio contabilidade. Por isso que
temos que pensar bem como vamos definir nossas permisses, para no causar conflitos com
o mask definido.

23 Para removermos ACLs podemos usar o parmetro -x:


# setfacl -x u:vader: /documentos/financeiro/
# setfacl -d -x u:vader: /documentos/financeiro/
# getfacl /documentos/financeiro

Nessa questo de permisses a LPI 303 tambm cobra o tema Atributos Estendidos
(Extended Attributes5). Como no algo muito prtico no dia a dia, ele no ser
visto aqui, mas a prova cobra como manusear esses atributos com os comandos
setfattr e getfattr. Mais referncias sobre o assunto podem ser encontradas no site
que est no rodap e nos manuais dos comandos setfattr e getfattr instalando o
pacote attr.

5 http://wiki.linuxquestions.org/wiki/Extended_attributes

Captulo 3
Poltica de utilizao de servios de
Rede

3.1. Objetivos:

Aplicar restries TCP Wrappers.


Aplicar regras de segurana no acesso SSH.
Utilizar acessos com chaves via SSH.
Detectar portas abertas e servios desnecessrios.
Desativar servios desnecessrios.

3.1.1. Conformidade com a norma


No que diz respeito Poltica de utilizao dos servios de Rede, a norma diz, nos
itens 11.4.1, 11.4.2, 11.4.4 e 11.4.6, que convm que usurios somente recebam acesso
para os servios que tenham sido especificamente autorizados a usar. Que sejam utilizados
mtodos apropriados para autenticao de usurios remotos. Convm que sejam controlados
o acesso fsico e lgico das portas de diagnstico e configurao.
No item 11.7.2, a norma diz que convm uma poltica, planos operacionais e
procedimentos sejam desenvolvidos e implementados para atividades de trabalho remoto.
Para a questo de trabalhar com chaves criptografadas no SSH, a norma diz no item
12.3.1 sobre a Poltica para o uso de controles criptogrficose no item 12.3.2 sobre
Gerenciamento de chaves.

3.1.2. Execuo do procedimento: TCP Wrappers:

1 - Instale o servidor ssh:


# aptitude install ssh

# yum install openssh

2 - Bloqueie o servio de ssh para todos:


# vim /etc/hosts.deny
sshd: ALL

3 - Libere para um IP que poder acessar o ssh:


# vim /etc/hosts.allow
sshd: 192.168.200.X

4 - Faa o teste e veja se o IP liberado consegue acessar, e se qualquer outro IP


consegue:
# ssh 192.168.200.X

3.1.3. Segurana no SSH


1 - Edite o arquivo de configurao do servidor e faa as seguintes modificaes:
# vim /etc/ssh/sshd_config

1 Port 65123
2 ListenAddress 192.168.200.X
3 PermitRootLogin no
4 AllowUsers toor@192.168.200.X
5 AllowGroups admins

2 - Feita essas modificaes, reinicie o daemon do ssh:


# /etc/init.d/ssh restart

3 - Faa um teste de conexo:


# ssh -p 65123 toor@192.168.200.X
# ssh -p 65123 teste@192.168.200.X

4 - Pode-se utilizar o mdulo pam_time.so para limitar horrios de acesso ao SSH.


Primeiro edite o arquivo /etc/pam.d/ssh e adicione o mdulo:
# vim /etc/pam.d/sshd
account

required

pam_time.so

5 - Possibilite acesso via ssh somente no horrio das 8:00 s 18:00 de segunda a
sexta:
# vim /etc/security/time.conf
sshd;*;!toor;Al0800-1800
sshd;*;!toor;!SaSu0000-2400

Outra maneira de limitar quais usurios podem acessar via ssh, utilizar o mdulo
pam_listfile.so do PAM, que pode criar um arquivo dos usurios ssh que tm
permisso de acesso.

3.1.4. SSH com autenticao somente com chaves

O objetivo aqui criar um conjunto de chaves no cliente para acessar via ssh
servidores remotos sem ter que digitar a senha e sim digitar uma frase utilizando a
determiada chave, ou seja, estabelecer uma relao de confiana entre cliente e servidor
remoto via chaves pblicas.
Estrutura Cliente:
1 - No cliente, logue-se em um terminal com o usurio toor:
$ id

2 - Com o usurio toor, gere a chave de autenticao RSA com o protocolo SSH:
$ ssh-keygen -t rsa

OBS: Ele ir pedir para gerar o arquivo da chave, deixe o padro. Digite uma frase
para poder ter acesso ao servidor remoto utilizando a chave e a frase.

Sero gerados dois arquivos no home do usurio, no sub-diretrio .ssh, chamados


id_rsa e id_rsa.pub.
O primeiro a chave privada que fica no cliente, o segundo deve ser enviado via
canal seguro para o servidor de acesso, pois o arquivo de chave pblica.
3 - No cliente, entre no diretrio .ssh do usurio toor e envie a chave pblica para o
servidor:
$ cd /home/toor/.ssh
$ ssh-copy-id -i id_rsa.pub toor@192.168.200.X

O usurio deve ser o mesmo no servidor e no cliente.

Estrutura Servidor:
4 - Agora, no servidor, entre no diretrio .ssh no home do usurio toor e veja que o
arquivo authorized_keys foi criado:
# cd /home/toor/.ssh
# ls

5 - Veja que o arquivo authorized_keys possui o contedo da chave pblica do cliente


autorizado a conectar:
# cat authorized_keys

6 - No servidor, edite o arquivo de configurao do ssh para no aceitar conexes


por meio de senhas, s aceitando conexes por chaves:
# vim /etc/ssh/sshd_config
AuthorizedKeysFile %h/.ssh/authorized_keys
PasswordAuthentication no

7 - Reinicie o SSH:

# /etc/init.d/ssh restart

Teste de Acesso Cliente:

8 - No cliente, logado com o usurio toor, acesse o servidor remoto via ssh:
$ ssh -p 65123 192.168.200.X

3.1.5. CheckList de servios Ativos


1 - Verifique no arquivo /etc/services, a associao de portas aos servios:
# cat /etc/services
# cat /etc/services | grep -i ssh

2 - Verifique quais as portas TCP esto ativas no sistema:


# netstat -nlpt

-n: Opo para fazer o netstat no resolver os IP's para nomes;


-l: Listar os Sockets que esto Ouvindo (Listen), ou seja, que esto prontos para
receber uma conexo;
-p: Nmero do processo que est em execuo nessa porta;
-t: Listar somente os Sockets no protocolo TCP;
3 - Verifique quais as portas UDP esto ativas no sistema:
# netstat -nlpu

-u: Lista somente os Sockets no protocolo UDP.


4 - Verifique todos os tipos conexes:

# netstat -na

5 - Agora que se sabe quais sockets esto disponveis, pode-se ver qual processo
(servio) est rodando nesse socket com o comando fuser:
# aptitude install psmisc
# fuser -v 65123/tcp

-v: Modo Verbose.


6 - Para ter certeza que determinado processo no um programa forjado, verifique
o cmdline dele:
# cat /proc/3943/cmdline

Uma coisa que muitos administradores tambm esquecem de olhar so os Raw


Sockets, que no dependem de um protocolo especfico e permitem acesso direto a
protocolos de baixo nvel como ICMP, TCP, UDP, e IP, mas so considerados por
muitos como um potencial foco de problemas de segurana devido ao fato de que
poucos administradores verificam as atividades deles em seus sistemas.
7 - Verifique se existe algum Raw Socket aberto no sistema utilizando o netstat com
outra opo:
# netstat -nlpw

-w: Lista os Raw Sockets.


8 - Exemplo de uma sada de resposta positiva, utilizando o netstat para listar os
Raw Sockets:
Proto Recv-Q Send-Q
raw

Endereo Local

0.0.0.0:255

Endereo Remoto

0.0.0.0:*

Estado

9 - Agora utilize o nmap para verificar Portas TCP de outra mquina:

# aptitude install nmap


# nmap -sT 192.168.200.X

-sT: Varredura de portas TCP completas.

10 - Faa o mesmo teste somente em uma porta:


# nmap -sT -p 65123 192.168.200.x

11 - Verifique as Portas UDP de outra mquina:


# nmap -sU 192.168.200.X

-sU: Varredura de portas UDP.


12 - Em alguns casos, o uso do Nmap pode ser interessante para fazer o checklist de
todas as portas ativas no servidor:
# nmap -sT -F 192.168.200.X

-F: Todas as portas declaradas no services.


13 - Pode-se verificar tambm porta a porta at 65535:
# nmap -sT -p- 192.168.200.x

14 - Verifique os banners dos servios que esto ativos. Para um invasor, essa pode
ser uma informao preciosa:
# nmap -sV -p- 192.168.200.X

Algumas aplicaes tem a opo de desativar os banners direto em arquivos de


configurao, outras somente no cdigo fonte, o que implica modificar o cdigo fonte
a aplicao e recompil-la.

15 - Verifique o Sistema Operacional que est sendo utilizado:


# nmap -O 192.168.200.X

3.1.6. Desativar servios desnecessrios

Agora que se sabe quais os servios que esto ativos no sistema, recomendado que
todos aqueles que no so necessrios no momento, sejam desativados.
1 - Entre no diretrio do nvel de execuo padro do sistema; no caso do Debian,
o /etc/rc2.d, e verifique os servios:
# cd /etc/rc2.d
# ls -l

2 - Desative alguns servios desnecessrios dos nveis de execuo:


# update-rc.d -f portmap remove
# update-rc.d -f exim4 remove
# update-rc.d -f openbsd-inetd remove
# update-rc.d -f nfs-common remove

3 - Aps uma reinicializao do sistema, verifique que agora existem somente os


servios necessrios:
# ps aux
# netstat -nlpt

Captulo 4
Ambiente seguro com chroot

4.1. Objetivos:
Entender o que um sistema enjaulado.
Criar um chroot.
Entender o funcionamento do debootstrap.

4.1.1. Conformidade com a norma.


No que diz respeito ao isolamento de sistemas sensveis, a norma ABNT NBR ISO/IEC
27002:2005 diz no item 11.6.2, que sistemas sensveis devem ter um ambiente
computacional dedicado (isolado).

4.1.2. Execuo do procedimento: Criando o Sistema Chroot


Pode-se utilizar o comando debootstrap para criar um sistema Debian em chroot.
1 - Instale o debootstrap:
# aptitude install debootstrap

2 - Utilize o debootstrap para montar um Debian em chroot:


# mkdir /var/debchroot
# debootstrap lenny /var/debchroot

Como estamos usando um repositrio interno, podemos fazer da seguinte maneira:

# debootstrap lenny /var/debchroot http://192.168.1.1/debian

3 - Monte o diretrio virtual do kernel do sistema original dentro do sistema chroot,


e o diretrio de dispositivos:
# mount --bind /proc/ /var/debchroot/proc
# mount --bind /dev/pts /var/debchroot/dev/pts

4 - Depois, acesse o sistema chroot criado:


# chroot /var/debchroot

5 - Modifique a varivel de prompt para diferenci-lo do sistema original:

# vim /root/.bashrc
export PS1='debchrootXX:\w\$ '

6 - Entre novamente no sistema chroot e atualize a lista de pacotes do apt:


# chroot /var/debchroot
# aptitude update

7 - Para um teste, pare o ssh no sistema original:


# exit
# /etc/init.d/ssh stop

8 - Agora dentro do sistema chroot, instale o ssh:


# chroot /var/debchroot
# aptitude install ssh

9 - Defina uma senha para o usurio root do sistema chroot:


# passwd root

10 No /etc/fstab do chroot, crie a montagem dos dispositivos dos terminais


virtuais:
# vim /etc/fstab
none

/dev/pts

devptsdefaults

# mount -a
# mount

11 - Conecte-se via ssh em qualquer mquina e veja em qual sistema entrar:

# ssh root@192.168.200.X

OBS: Ns prximos cpitulos utilizaremos esse sistema chroot para rodar um


Servidor Web enjaulado.

Captulo 5
Registro de Eventos

5.1. Objetivos:
Entender a necessidade de ter os registro de eventos no sistema.
Importncia que a Norma d para registro de eventos.
Entender o funcionamento do sistema de Logs padro do sistema GNU/Linux.
Aprender como configurar o Syslog-NG.
Montar uma estrutura cliente-servidor para os registros de eventos.

5.2. Conformidade com a norma


A necessidade de registro das atividades dos usurios e servios dos sistemas ,
notoriamente muito importante para os administradores. A importncia tanta, que a norma
NBR ISO/IEC 27002:2005, nos itens 10.10 e 10.10.1, fala sobre detectar e registrar
atividades no autorizadas. Assim, prioridade adotar um poltica de segurana na qual os
registros atendam as seguintes caractersticas:

Identificao dos usurios;

Datas e horrios de entrada (login, logout);

Identidade do terminal, nome da mquina ou IP;

Registro das tentativas de acesso aos aceitos e rejeitados;

Registro das tentativas de acesso a outros recursos e dados aceitos e rejeitados;

Alterao de arquivos;

Uso de privilgios, aplicativos e utilitrios do sistema.


A norma tambm menciona, no item 10.10.3, a proteo das informaes e dos

recursos de registros (logs) que devem ser protegidos contra falsificao e acesso no
autorizados.

5.3. Execuo do procedimento


5.3.1. Syslog-NG

O Syslog-NG o substituto do Syslog e Rsyslog, que so as ferramentas padres de


registros de Logs do Sistema. O Syslog-NG tem mais recursos e traz uma gama maior de
opes de registro de logs para o administrador.
O contedo dos arquivos do Syslog, Rsyslog e Syslog-NG seguem as seguintes regras:

facilidade - usada para especificar que tipo de programa est enviando a


mensagem.

nvel - Especifica o nvel de gravidade da mensagem.

destino - O destino das mensagens pode ser um arquivo, um pipe (se iniciado por um
"|"), um computador remoto (se iniciado por uma "@"), determinados usurios do
sistema (especificando os logins separados por vrgula) ou para todos os usurios
logados via wall (usando "*")
A facilidade e o nvel so separadas por um "." e contm parmetros que definem o

que ser registrado nos arquivos de log do sistema:

auth - Mensagens de segurana/autorizao.

authpriv - Mensagens de segurana/autorizao (privativas).

cron - Servios de agendamento (cron e at).

daemon - Outros servios do sistema que no possuem facilidades especficas.

ftp - Servio de ftp do sistema.

kern - Mensagens do kernel.

lpr - Subsistema de impresso.

local0 a local7 - Reservados para uso local.

mail - Subsistema de e-mail.

news - Subsistema de notcias da USENET.

security - Sinnimo para a facilidade auth.

syslog - Mensagens internas geradas pelo syslogd.

user - Mensagens genricas de nvel do usurio.

uucp - Subsistema de UUCP.

* - Confere com todas as facilidades.

Nveis:

emerg - O sistema est inutilizvel.

alert - Uma ao deve ser tomada imediatamente para resolver o problema.

crit - Condies crticas.

err - Condies de erro.

warning - Condies de alerta.

notice - Condio normal, mas significante.

info - Mensagens informativas.

debug - Mensagens de depurao.

* - Confere com todos os nveis.

none - Nenhuma prioridade.


Alm destes nveis, os seguintes sinnimos esto disponveis:

error - Sinnimo para o nvel err.

panic - Sinnimo para o nvel emerg.

warn - Sinnimo para o nvel warning.

1 - Instale o Syslog-NG:
# aptitude install syslog-ng

# yum install syslog-ng

5.3.2. Criando uma estrutura de Logs Personalizada

O objetivo desta tarefa definir a sua estrutura de logs personalizada, diferente da


padro. um procedimento simples e que aumenta o poder de gerenciamento de Logs.
1 - Faa um backup do arquivo de configurao original:
# cd /etc/syslog-ng
# mv syslog-ng.conf syslog-ng.original

2 - Crie um novo syslog-ng.conf, com a seguinte estrutura personalizada (Esse


arquivo est no CD do curso.):
# vim syslog-ng.conf

1 OPCES GLOBAIS
2 options { long_hostnames(off);};
3 #-----------------------------------------------------------------------------#
4 #OPES DE ORIGEM
5 source src { unix-dgram("/dev/log"); internal(); file("/proc/kmsg" log_prefix("kernel: "));};
6
7 # --------------------------------------------------------------------#
8
9 # OPCES DE FILTRAGEM
10
11 filter f_authpriv { facility(auth, authpriv); };
12 filter f_syslog { not facility(auth, authpriv); };
13 filter f_cron { facility(cron); };
14 filter f_daemon { facility(daemon); };
15 filter f_kern { facility(kern); };
16 filter f_lpr { facility(lpr); };
17 filter f_mail { facility(mail); };
18 filter f_user { facility(user); };
19 filter f_uucp { facility(uucp); };
20 filter f_news { facility(news); };
21 filter f_debug { not facility(auth, authpriv, news, mail); };
22 filter f_messages { level(info .. warn)
23 and not facility(auth, authpriv, cron, daemon, mail, news); };
24 filter f_emergency { level(emerg); };
25 filter f_info { level(info); };
26 filter f_notice { level(notice); };
27 filter f_warn { level(warn); };
28 filter f_crit { level(crit); };
29 filter f_err { level(err); };
30 filter f_cnews { level(notice, err, crit) and facility(news); };
31 filter f_cother { level(debug, info, notice, warn) or facility(daemon, mail); };
32 filter ppp { facility(local2); };
33
34 # --------------------------------------------------------------------#
35 # OPCES DE DESTINO
36 destination d_authlog { file("/var/log/auth.log" owner("root") group("adm") perm(0640)); };

37 destination d_syslog { file("/var/log/syslog" owner("root") group("adm") perm(0640)); };


38 destination d_cron { file("/var/log/cron.log" owner("root") group("adm") perm(0640)); };
39 destination d_daemon { file("/var/log/daemon.log" owner("root") group("adm") perm(0640)); };
40 destination d_kern { file("/var/log/kern.log" owner("root") group("adm") perm(0640)); };
41 destination d_lpr { file("/var/log/lpr.log" owner("root") group("adm") perm(0640)); };
42 destination d_mail { file("/var/log/mail.log" owner("root") group("adm") perm(0640)); };
43 destination d_user { file("/var/log/user.log" owner("root") group("adm") perm(0640)); };
44 destination d_uucp { file("/var/log/uucp.log" owner("root") group("adm") perm(0640)); };
45 destination d_mailinfo { file("/var/log/mail.info" owner("root") group("adm") perm(0640)); };
46 destination d_mailwarn { file("/var/log/mail.warn" owner("root") group("adm") perm(0640)); };
47 destination d_mailerr { file("/var/log/mail.err" owner("root") group("adm") perm(0640)); };
48 destination d_newscrit { file("/var/log/news/news.crit" owner("root") group("adm")
perm(0640)); };

49 destination d_newserr { file("/var/log/news/news.err" owner("root") group("adm")


perm(0640)); };

50 destination d_newsnotice { file("/var/log/news/news.notice" owner("root") group("adm")


perm(0640)); };

51 destination d_debug { file("/var/log/debug" owner("root") group("adm") perm(0640)); };


52 destination d_messages { file("/var/log/messages" owner("root") group("adm") perm(0640)); };
53 destination d_console { usertty("root"); };
54 destination d_console_all { file("/dev/tty8"); };
55 destination d_xconsole { pipe("/dev/xconsole"); };
56 destination d_ppp { file("/var/log/ppp.log" owner("root") group("adm") perm(0640)); };

57 # --------------------------------------------------------------------#
58
59 # OPCES DE LOG ( Montagem do Log)
60
61 log { source(src); filter(f_authpriv); destination(d_authlog); };
62 log { source(src); filter(f_syslog); destination(d_syslog); };
63 log { source(src); filter(f_daemon); destination(d_daemon); };
64 log { source(src); filter(f_kern); destination(d_kern); };
65 log { source(src); filter(f_lpr); destination(d_lpr); };
66 log { source(src); filter(f_mail); destination(d_mail); };
67 log { source(src); filter(f_user); destination(d_user); };
68 log { source(src); filter(f_uucp); destination(d_uucp); };
69 log { source(src); filter(f_mail); filter(f_info); destination(d_mailinfo); };
70 log { source(src); filter(f_mail); filter(f_warn); destination(d_mailwarn); };
71 log { source(src); filter(f_mail); filter(f_err); destination(d_mailerr); };
72 log { source(src); filter(f_news); filter(f_crit); destination(d_newscrit); };
73 log { source(src); filter(f_news); filter(f_err); destination(d_newserr); };
74 log { source(src); filter(f_news); filter(f_notice);destination(d_newsnotice); };
75 log { source(src); filter(f_debug); destination(d_debug); };
76 log { source(src); filter(f_messages); destination(d_messages); };
77 log { source(src); filter(f_emergency); destination(d_console); };
78 log { source(src); filter(f_cnews); destination(d_xconsole); };
79 log { source(src); filter(f_cother); destination(d_xconsole); };
80 log { source(src); filter(ppp); destination(d_ppp); };
81 log { source(src); filter(f_cron); destination(d_cron); };

3 - Reinicialize o Daemon do Syslog-NG:


# /etc/init.d/syslog-ng restart

4 - Faa com que a sada do arquivo de log /var/log/auth.log (arquivo que loga
autenticao em servios) seja visualizada no terminal 12 (/dev/tty12):
# tail -f /var/log/auth.log > /dev/tty12 &

5 - Efetue conexo com seu servidor SSH:


# ssh toor@127.0.0.1

6 - Agora, veja o contedo do arquivo de log no terminal /dev/tty12:


CTRL+ALT+F12

5.3.3. Syslog-NG - Estrutura Servidor e Cliente

Configurando o servidor

1 - Edite o arquivo de configurao do Syslog-NG, e insira uma nova origem para


aceitar pacotes remotos:
# vim /etc/syslog-ng/syslog-ng.conf

# OPCES DE ORIGEM

## Origem Mquinas Remotas

3
4

source maqremotas { udp();};

2 - Ainda no arquivo, insira uma nova entrada de filtro para capturar as informaes
vindas de determinada mquina:
1

#OPES DE FILTRO

## Filtro para mquina Remota

3
4

filter f_maqremota1 { netmask(192.168.200.X); };

OU
1

filter f_maqremota1 { host("maquina1"); };

3 - Pode-se tambm capturar os Logs provenientes do host maquina1 que


contenham a palavra sshd:
1

filter f_maqremota1_ssh { netmask(192.168.200.X) and match("sshd"); };

OU

filter f_maqremota1_ssh { host("maquina1") and match("sshd"); };

4 - Insira agora as opes de destino para a mquina remota:


1

# OPES DE DESTINO

## Destino da mquina1

3
4

destination d_maqremota1 { file("/var/log/maqremota1.log" owner("root") group("adm")

perm(0640)); };

5 - Insira tambm um destino para a palavra sshd provenientes da maquina1:


1

destination d_maqremota1_ssh { file("/var/log/maqremota1_ssh.log" owner("root")

group("adm") perm(0640)); };

6 - Para finalizar, insira as opes de montagem dos Logs:


1

# OPCES DE LOG

## Logs da mquina1

3
4

log { source(maqremotas); filter(f_maqremota1); destination(d_maqremota1); };

5
6

log { source(maqremotas); filter(f_maqremota1_ssh); destination(d_maqremota1_ssh); };

7 - Reinicialize o Syslog-NG:
# /etc/init.d/syslog-ng restart

8 - Faa o check list de conexo na porta 514:


# netstat -nlpu | grep 514

Configurando o cliente

1 - Edite o arquivo de configurao do Syslog-NG e insira uma nova opo de


destino para enviar as informaes para o servidor remoto:

# vim /etc/syslog-ng/syslog-ng.conf

# OPES DE DESTINO

## Destino Servidor de Logs

3
4

destination servlog { udp("192.168.200.X" port(514)); };

2 - Se necessrio, pode-se informar no cliente quais os logs devem ser enviados para
o servidor. Caso contrrio, no ser necessrio especificar um filtro e, dessa forma,
enviar todos os logs:
1

# OPES DE FILTRAGEM

## Filtro dos Logs que devem ser enviados

3
4

filter f_servlog { level(info, warn, err, crit) and facility(auth, authpriv, daemon, mail, news, cron,

user); };

3 - Agora insira as opes para montagem dos logs:


1

# OPES DE LOG

## Montagem dos Logs para o Servidor remoto

3
4

log { source(src); destination(servlog); };

OU
1

log { source(src); filter(f_servlog); destination(servlog); };

4 - Reinicialize o Syslog-NG:
# /etc/init.d/syslog-ng restart

5 - Para fazer o teste, a mquina servidor pode deixar um arquivo de log


constantemente aberto com o comando tail, enquanto a mquina cliente reinicia um
servio ou faz uma autenticao:

5.3.4. Definindo poltica de rotacionamento de LOGS

At agora vimos a importncia do registro de eventos, para isso, criamos uma


estrutura personalizada e uma estrutura servidor/cliente.
Pode acontecer um problema, esses logs vo comear a crescer e se no forem
monitorados, podem crescer at estourar o espao da partio. Para resolver esse tipo de
problema, necessrio trabalhar com o rotacionamento de Logs.
Esse rotacionamento feito pelo Logrotate.

1- Visualize algumas opes globais do LogRotate:


# vim /etc/logrotate.conf

weekly

Essa opo faz com que os logs sejam rotacionados semanalmente.


rotate 4

Rotate 4 define que sero mantidos os 4 ltimos rotacionamentos para no fugirem do


controle.
mail root

Essa opo faz com que, em que casos de erros de no existncia dos logs, sejam
enviados para o usurio root.
create

Com essa opo estamos configurando para que sejam criados novos arquivos de log
(vazios) aps rodar os antigos.
compress

Essa opo faz que as cpias de logs sejam compactadas mantendo sempre o ltimo
rodado descompactado.

include /etc/logrotate.d

Diretrio onde ficam scripts personalizados a serem includos no arquivo principal.

2 - O Syslog-NG cria um script personalizado dentro de /etc/logrotate.d. Edite esse


script e faa a seguinte personalizao em um dos logs:
# cd /etc/logrotate.d
# vim syslog-ng

/var/log/auth.log {

daily

size 3M
sharedscripts

postrotate

/usr/bin/killall -1 syslog-ng

endscript

7
8
9

rotate 5
}

3 - Para fazer um teste de rotacionamento, execute o seguinte comando:


# logrotate /etc/logrotate.conf

4 - Depois, visualize o diretrio de logs e veja o que aconteceu:


# ls -l /var/log

O controle das aes do logrotate feito pelo utilitrio de agendamento de tarefas do


sistema, o cron. Ele possui uma configurao especfica para tarefas que so rodadas
durante um perodo certo (diariamente, mensalmente, etc).
5 - Visualize o script de controle das aes do logrotate no cron:

# cat /etc/cron.daily/logrotate

6 - Verifique qual o horrio que o logrotate ir executar:


# cat /etc/crontab

7 - Para melhorar a segurana, no deixando que o contedo dos scripts sejam


apagados, pode-se colocar um atributo nos arquivos de logs. Edite o script do
logrotate dirio deixando-o da seguinte maneira:
# vim /etc/cron.daily/logrotate

#!/bin/sh

2
3

test -x /usr/sbin/logrotate || exit 0

4
5

chattr -a /var/log/*

/usr/sbin/logrotate /etc/logrotate.conf

chattr +a /var/log/*

8 - Execute o script:
# /etc/cron.daily/logrotate

9 - Visualize os atributos nos logs:


# lsattr /var/log

10 Veja se os arquivos esto sendo rotacionados:


# ls -lh /var/log/auth*

5.4. Auditoria
5.4.1. Conformidade com a norma

Na norma ABNT NBR ISO/IEC 27002:2005, no item 10.10.2, recomenda-se o


monitoramento de acesso aos arquivos. Caso haja alguma criao, excluso e alterao (data,
id, permisso) do arquivo, ele ser checado para que no tenha nenhuma alterao
maliciosa.

5.4.2. Lastcomm
1 - Instale o pacote acct, que o pacote que traz o comando lastcomm:
# aptitude install acct

# yum install psacct

2 - Teste o lastcomm de maneira geral:


# lastcomm

3 - Teste o comando para somente um usurio da seguinte maneira:


# lastcomm root
# lastcomm toor

4 - Pode-se tambm fazer a consulta pelo comando no lugar do usurio:


# lastcomm ls

Todas

as

informaes

do

comando

lastcomm

esto

dentro

do

arquivo

/var/log/account/pacct, e s podem ser visualizadas por meio de comandos, como o


lastcomm.

5.4.3. Snoopy
1 - Instale o snoopy:
# aptitude install snoopy

O Red Hat no tem pacote nativo para o Snoopy, para instar o snoopy em um sistema
baseado

em

Red

Hat,

necessrio

baixar

pacote

desse

site:

http://sourceforge.net/search/?type_of_search=soft&words=snoopy

2 - Quando o snoopy instalado, ele cria uma biblioteca dentro de /lib e a insere
dentro do arquivo /etc/ld.so.preload para que o snoopy funcione:
# cat /etc/ld.so.preload

3 - Com um usurio qualquer, digite alguns comandos e visualize nos logs os


registros do snoopy:
# tail -f /var/log/auth.log

Para desativar o snoopy, basta comentar a linha que foi inserida dentro do arquivo
/etc/ld.so.preload.

Captulo 6
Host-IDS(HIDS)

6.1. Objetivos:
Entender a importncia do uso de ferramentas HIDS.
Conhecer as ferramentas AIDE e OSSEC.
Entender as diferenas entre o AIDE e OSSEC.
Ver a correlao do HIDS com a Norma.

6.2. Conformidade com a norma


Na norma ABNT NBR ISO/IEC 27002:2005, no item 10.4.1, recomenda-se o sobre o
Controle de softwares maliciosos.

6.3. AIDE (Advanced Intrusion Detection Environment)


O AIDE um sistema de deteco de intruso que trabalha por checagem de
integridade dos arquivos.
Quando o AIDE est configurado, necessrio gerar uma base do sistema que
contm todas as informaes do sistema at o momento em que a base foi criada. Quando
algo estranho notificado no sistema, pode-se comparar essa base com o sistema atual, caso
algo tenha sido modificado, o AIDE vai apontar o estado original do arquivo ou diretrio
modificado e estado atual.
O AIDE pode apontar se o tamanho do arquivo est diferente, se a localizao do
arquivo no disco foi modificada, permisses entre outras checagens.

1 - O primeiro passo instalarmos o AIDE no Debian:


# aptitude install aide

# yum install aide

2 - Verifique o man do aide.conf para ver como funcionam as suas checagens:


# man aide.conf

3 - Vamos verificar os arquivos de configurao que foram criados:


# cd /etc/aide
# ls
# cd aide.conf.d
# ls

Onde eles so o seguinte:

aide.conf: Principal arquivo de configurao do AIDE.

aide.conf.d: Diretrios ondes ficam os arquivos de configurao especfico para cada


aplicativo.

4 - Analise o arquivo /etc/aide/aide.conf:


# cd /etc/aide
# vim aide.conf

5 - Em seguida vamos verificar um dos arquivos de configuo dos aplicativos:


# cd /etc/aide/aide.conf.d
# vim 31_aide_apache2

6 - Antes de gerar uma base necessrio validar as alteraes no arquivo de


configurao aide.conf:
# update-aide.conf

Esse comando vai criar uma cpia do arquivo de configurao no diretrio /var/lib/aide
chamado aide.conf.autogenerated que vai ser usado pelo comando gerador de bases do
Aide.

7 - Agora que o AIDE est configurado, e nosso sistema est pronto, podemos gerar
a base do AIDE:
# aideinit

Quando executado, o comando aideinit criar o arquivo /var/lib/aide/aide.db.new e


criar tambm o /var/lib/aide/aide.db.
8 - Aps o comando aideinit, verifique se as bases foram criadas:
# cd /var/lib/aide
# ls

6.3.1. Fazendo um auditoria com o AIDE

Agora que a base est criada, podemos simular algumas modificaes no sistema e ver
como o AIDE vai nos notificar sobre essas modificaes.

1 - Vamos mudar a localizao do binrio rmdir, e criar um outro forjado:


# mv /bin/rmdir /root
# echo teste > /bin/rmdir

2 - Vamos realizar a auditoria:


# aide -C --config=/var/lib/aide/aide.conf.autogenerated | tee /root/auditoria/rel1_aide.txt

3 - O relatrio foi gerado na tela e no arquivo. Verifique o relatrio que ficou


documentado:
# cd /root/auditoria
# vi rel1_aide.txt

No se esquea de colocar o rmdir de volta no /bin. ( cp /root/rmdir /bin ).

6.4. OSSEC
O OSSEC um HIDS que tem muitas funcionalidades, ele tem a capacidade de
trabalhar localmente, ou trabalhar em uma rede como cliente e servidor. Uma das grandes
vantagens dos OSSEC que trabalha com active-response, ou seja, para determinados
tipos de ataques ele pode tomar algumas medidas como bloquear o IP que est atacando por
um determinado tempo e mandar um e-mail alertando sobre o ocorrido.
1 - Primeiro necessrio obter o cdigo-fonte do Ossec no seu site oficial:
www.ossec.net:
# cd /opt
# wget http://www.ossec.net/files/ossec-hids-X.X.tar.gz

2 Agora, descompacte o pacote:


# tar xzvf ossec-hids-X.X.tar.gz
# ls

3 - Instale os pacotes necessrio para fazer a compilao:


# aptitude install make gcc g++

4 - O OSSEC possu um script para ser feita a sua instalao onde sero feitas vrias
perguntas. Instale o OSSEC:
# cd ossec-hids-X.X
# ./install.sh

No primeiro passo da instalao escolha o idioma a ser instalado:

** Para instalao em portugus, escolha [br].


** Fur eine deutsche Installation wohlen Sie [de].
** For installation in English, choose [en].
** Para instalar en Espaol , eliga [es].
** Pour une installation en franais, choisissez [fr]
** Per l'installazione in Italiano, scegli [it].
** Za instalaciju na srpskom, izaberi [sr].
(en/br/cn/de/es/fr/it/jp/pl/ru/sr/tr) [en]:br

Agora escolha o modo como ele vai trabalhar, que pode ser local, cliente e
servidor. O nosso caso local:

1- Que tipo de instalao voc deseja (servidor, cliente, local ou ajuda)? local

Prximo passo escolher onde o OSSEC ser instalado. Aceite o diretrio


proposto:

2- Configurando o ambiente de instalao.


- Escolha onde instalar o OSSEC HIDS [/var/ossec]:

Depois, aceitar para receber notificaes por e-mail:

3- Configurando o OSSEC HIDS.


3.1- Deseja receber notificaes por e-mail? (s/n) [s]:
- Qual o seu endereo de e-mail? seu_email@dominio.com.br
- Seu servidor SMTP foi encontrado como: smtp.dominio.com.br
- Deseja us-lo? (s/n) [s]:

Em seguida, habilite alguns tipos de checagens:

3.2- Deja habilitar o sistema de verificao de integridade? (s/n) [s]:


3.3- Deseja habilitar o sistema de deteco de rootkis? (s/n) [s]:
3.4- Respostas automticas permitem voc executar um comando especfico baseado nos eventos
recebidos. Voc pode bloquear um endereo de IP ou desabilitar o acesso de um usurio
especfico, por exemplo.
Maiores informaes:
http://www.ossec.net/en/manual.html#active-response
- Deseja habilitar o sistema de respostas automticas? (s/n) [s]:
- Deseja habilitar o firewall-drop? (s/n) [s]:
- Deseja adicionar mais algum endereo a essa lista? (s/n)? [n]:

Aps isso o OSSEC ser compilado e instalado.


5 - Com OSSEC instalado, pode inci-lo:
# /etc/init.d/ossec start
# ps ax

6 Visualize onde o OSSEC est instalado e seu arquivo de configurao principal:


# cd /var/ossec
# ls
# cd etc
# vim ossec.conf

Todos os aquivos de configurao do OSSEC esto em um formato XML, que muito


simples de entender.

6.4.1. Testando o OSSEC

Podemos fazer um teste com o OSSEC e ver como o seu active-response trabalha.
Vamos testar utilizando um servidor de e-mail instalado em nosso sistema, utilizaremos o
Postfix nesse exemplo.
1 - Instale o Postfix:
# aptitude install postfix

# yum install postfix

2 - Realize um teste de telnet na porta 25 em outra mquina e veja que seu IP ser
bloqueado na outra mquina, em seguida pea para realizarem o mesmo teste em
sua mquina:
# telnet 192.168.200.X 25
Trying 192.168.200.X...
Connected to 192.168.200.X.
Escape character is '^]'.
220 postfix ESMTP Postfix (Debian/GNU)
helo teste.com.br
mail from: teste@teste.com.br
250 2.1.0 Ok
rcpt to: teste@teste.com.br
554 5.7.1 <teste@teste.com.br>: Relay access denied

Nesse momento a mquina do que est recebendo a conexo j deve ter bloqueado o
seu IP.

3 - Se j tentaram fazer essa conexo em sua mquina, veja se o IP da pessoa que


tentou j est bloqueado:
# iptables -n -L
# vi /etc/hosts.deny

Essa regra ficar setada at passar o tempo que est setado nas regras do OSSEC.

Captulo 7
Network-IDS(NIDS)

7.1. Objetivos:
Entender a importncia de uma ferramenta NIDS.
Configurar um Apache dentro do chroot.
Onde posicionar na rede um NIDS.
Aprender o Snort com suporte a MySQL.
Conhecer e configurar a ferramenta AcidBase.
Configurar certificados SSL e entender a sua importncia.
Colocar o Snort para trabalhar em Bridge.
Ver a correlao da Norma com ferramentas NIDS.
Integrar o Snort com um IPS (Guardian)

7.2. Conformidade com a norma


De acordo com o item 10.6.1, da norma ABNT NBR ISO/IEC 27002:2005, convm que
as redes sejam adequadamente gerenciadas e controladas, de forma a proteg-las contra
ameaas e manter a segurana de sistemas e aplicaes que utilizam estas redes, incluindo a
informao em trnsito.

7.3. SNORT com suporte a MySQL


O Snort realizando sozinho a tarefa de registros de possveis tentativas de ataque em
potencial uma tima soluo e se torna melhor combinado com uma ferramenta para tratar
os logs, tornando a informao ainda mais til para um administrador.
O Snort basicamente formado por 4 componentes:

libpcap Biblioteca utilizada por todas as ferramentas de sniffers. Ela responsvel


por colocar a placa de rede em modo promiscuo, ou seja, o modo que captura todos os
pacotes que passam pela rede.

Pr-processadores - So recursos do Snort que so responsveis por fazer um pr


filtro nos pacotes que esto passando por ele, sendo assim, ele diminui bastante o
processamento da mquina e do Snort e tambm ajuda a evitar os falsos positivos. Se
o pr-processador detecta algum tipo de tentativa de ataque, ele j gera um log no
passando o pacote para as regras do Snort.

Regras do Snort - Depois que os pacotes passam pelos pr-processadores sem gerar
uma tentativa de ataque, eles vo para as regras do Snort, onde feito uma checagem
mais completa conforme as regras que o Snort possu. Caso as regras detectem algo,
gerado um log.

Logs Os logs podem ser gerados tanto na deteco dos pr-processadores quanto
nas regras do Snort. Esses logs por padro so gerados no formato texto, e para
facilitar a visualizao deles, vamos configurar para serem gravados em uma base
MySQL.

7.3.1. Onde o Snort deve ficar?

O mais complexo em uma implementao do servio Snort, no a instalao do


prprio servidor e sim saber onde posicionar o NIDS.
Na figura abaixo, podemos ver um exemplo de onde podemos posicionar o nosso
NIDS(Snort).

Para o caso do Snort que pode ficar entre o Firewall e o Switch, ele est trabalhando
como uma bridge que ser visto no final desse captulo.

7.3.2. Instalao e Configurao do MySQL


1 - Instale o mysql-server:
# aptitude install mysql-server

# yum install mysql-server

2 - Verifique se o MySQL est rodando e se os sockets esto ativos:


# ps aux | grep mysql
# netstat -nlpt

3 Se na instalao no for definido uma senha do usurio root do MySQL, pode-se


fazer com o seguinte comando:
# mysqladmin -u root password nova_senha

Para manter a segurana no acesso da base de dados que ser criada, necessrio
criar um usurio comum para ser o dono dessa base, no comprometendo a
segurana de todo o banco de dados.
4 Crie um usurio chamado snort no banco de dados:
# mysql -u root -p
mysql> grant all privileges on snort.* to snort@192.168.200.X identified by "123456";
mysql> grant all privileges on snort.* to snort@localhost identified by "123456";
mysql> quit

Dessa maneira, o usurio snort ser criado e ter acesso a base snort atravs do IP da

mquina e do hostname.
5 - Agora, conecte no MySQL com o usrio snort e crie a base de dados snort:
# mysql -u snort -p
mysql> show databases;
mysql> create database snort;
mysql> quit

7.3.3. Instalao e Configurao do Snort com suporte a MySQL

1 - Instale o Snort com suporte a MySQL:


# aptitude install snort-mysql

# yum install snort-mysql

2 - Detalhes de configurao:

Faixa de endereo na qual o Snort deve ouvir: 192.168.200.0/24

Deseja configurar uma base de dados para snort-mysql gravar os logs: Sim

3 - necessrio criar as tabelas dentro da base de dados snort. O Snort traz um


exemplo das tabelas na sua documentao. Entre no seguinte diretrio:
# cd /usr/share/doc/snort-mysql

4 - Utilize o arquivo create_mysql.gz para criar as tabelas dentro da base de dados


snort:

# zcat create_mysql.gz | mysql -u snort -h localhost -p snort -D snort

5 - Acesse o servidor MySQL e verifique as tabelas na base de dados snort:


# mysql -u snort -p
mysql> show databases;
mysql> use snort;
mysql> show tables;
mysql> status;
mysql> quit;

6 - Verifique os arquivos de configurao do snort:


# cd /etc/snort
# ls -l

7 - Faa um cpia do snort.conf original e mantenha um novo arquivo sem os


comentrios:
# mv snort.conf snort.conf.original
# cat snort.conf.original | grep -v ^# | grep . > snort.conf

8 - Edite o snort.conf e modifique-o da seguinte maneira:


# vim snort.conf

var HOME_NET 192.168.200.0/24

var EXTERNAL_NET any

var DNS_SERVERS $HOME_NET

var SMTP_SERVERS $HOME_NET

var HTTP_SERVERS $HOME_NET

var SQL_SERVERS $HOME_NET

var TELNET_SERVERS $HOME_NET

var SNMP_SERVERS $HOME_NET

var HTTP_PORTS 80

10

var SHELLCODE_PORTS !80

11

var ORACLE_PORTS 1521

12

var AIM_SERVERS

[64.12.24.0/23,64.12.28.0/23,64.12.161.0/24,64.12.163.0/24,64.12.200.0/24,205.188.3.0/24,205.
188.5.0/24,205.188.7.0/24,205.188.9.0/24,205.188.153.0/24,205.188.179.0/24,205.188.248.0/24]
13

var RULE_PATH /etc/snort/rules

14

dynamicpreprocessor directory /usr/lib/snort_dynamicpreprocessor/

15

dynamicengine /usr/lib/snort_dynamicengine/libsf_engine.so

16

preprocessor flow: stats_interval 0 hash 2

17

preprocessor frag3_global: max_frags 65536

18

preprocessor frag3_engine: policy first detect_anomalies

19

preprocessor stream5_global: max_tcp 8192, track_tcp yes, track_udp no

20

preprocessor stream5_tcp: policy first, use_static_footprint_sizes

21

preprocessor http_inspect: global iis_unicode_map unicode.map 1252

22

preprocessor http_inspect_server: server default profile all ports { 80 8080 8180 }

oversize_dir_length 500
23

preprocessor rpc_decode: 111 32771

24

preprocessor bo

25

preprocessor ftp_telnet: global encrypted_traffic yes inspection_type stateful

26

preprocessor ftp_telnet_protocol: telnet normalize ayt_attack_thresh 200

27

preprocessor ftp_telnet_protocol: ftp server default def_max_param_len 100 alt_max_param_len

200 { CWD } cmd_validity MODE < char ASBCZ > cmd_validity MDTM < [ date
nnnnnnnnnnnnnn[.n[n[n]]] ] string > chk_str_fmt { USER PASS RNFR RNTO SITE MKD }
telnet_cmds yes data_chan
28

preprocessor ftp_telnet_protocol: ftp client default max_resp_len 256 bounce yes telnet_cmds

yes
29

preprocessor smtp: ports { 25 } inspection_type stateful normalize cmds normalize_cmds

{ EXPN VRFY RCPT } alt_max_command_line_len 260 { MAIL } alt_max_command_line_len 300


{ RCPT } alt_max_command_line_len 500 { HELP HELO ETRN } alt_max_command_line_len 255
{ EXPN VRFY }

30

preprocessor sfportscan: proto { all } memcap { 10000000 } sense_level { low }

31

preprocessor dcerpc: autodetect max_frag_size 3000 memcap 100000

32

preprocessor dns: ports { 53 } enable_rdata_overflow

33

output log_tcpdump: tcpdump.log

34

output database: log, mysql, user=snort password=123456 dbname=snort

host=localhost
35

# Comentar a linha include dabases.conf

36

include classification.config

37

include reference.config

38

include $RULE_PATH/local.rules

39

include $RULE_PATH/bad-traffic.rules

40

include $RULE_PATH/exploit.rules

41

include $RULE_PATH/community-exploit.rules

42

include $RULE_PATH/scan.rules

43

include $RULE_PATH/finger.rules

44

include $RULE_PATH/ftp.rules

45

include $RULE_PATH/telnet.rules

46

include $RULE_PATH/rpc.rules

47

include $RULE_PATH/rservices.rules

48

include $RULE_PATH/dos.rules

49

include $RULE_PATH/community-dos.rules

50

include $RULE_PATH/ddos.rules

51

include $RULE_PATH/dns.rules

52

include $RULE_PATH/tftp.rules

53

include $RULE_PATH/web-cgi.rules

54

include $RULE_PATH/web-coldfusion.rules

55

include $RULE_PATH/web-iis.rules

56

include $RULE_PATH/web-frontpage.rules

57

include $RULE_PATH/web-misc.rules

58

include $RULE_PATH/web-client.rules

59

include $RULE_PATH/web-php.rules

60

include $RULE_PATH/community-sql-injection.rules

61

include $RULE_PATH/community-web-client.rules

62

include $RULE_PATH/community-web-dos.rules

63

include $RULE_PATH/community-web-iis.rules

64

include $RULE_PATH/community-web-misc.rules

65

include $RULE_PATH/community-web-php.rules

66

include $RULE_PATH/sql.rules

67

include $RULE_PATH/x11.rules

68

include $RULE_PATH/icmp.rules

69

include $RULE_PATH/netbios.rules

70

include $RULE_PATH/misc.rules

71

include $RULE_PATH/attack-responses.rules

72

include $RULE_PATH/oracle.rules

73

include $RULE_PATH/community-oracle.rules

74

include $RULE_PATH/mysql.rules

75

include $RULE_PATH/snmp.rules

76

include $RULE_PATH/community-ftp.rules

77

include $RULE_PATH/smtp.rules

78

include $RULE_PATH/community-smtp.rules

79

include $RULE_PATH/imap.rules

80

include $RULE_PATH/community-imap.rules

81

include $RULE_PATH/pop2.rules

82

include $RULE_PATH/pop3.rules

83

include $RULE_PATH/nntp.rules

84

include $RULE_PATH/community-nntp.rules

85

include $RULE_PATH/community-sip.rules

86

include $RULE_PATH/other-ids.rules

87

include $RULE_PATH/web-attacks.rules

88

include $RULE_PATH/backdoor.rules

89

include $RULE_PATH/community-bot.rules

90

include $RULE_PATH/community-virus.rules

91

include $RULE_PATH/experimental.rules

92

include threshold.conf

9 - Verifique tambm o arquivo de configurao snort.debian.conf:


# vim snort.debian.conf

10 - Visualize as regras (assinaturas) do Snort dentro do diretrio rules:

# cd rules
# ls

11 - Antes de reiniciar o snort, apague o arquivo de pendncia da configurao do


banco de dados que ele criou dentro de /etc/snort:
# cd /etc/snort
# rm db-pending-config

12 - Inicie o snort:
# /etc/init.d/snort start

7.3.4. Instalao e Configurao do Apache2

A instalao e a configurao do Apache2, PHP5 e AcidBase, sero feitas dentro do


sistema chroot para uma melhor segurana, mantendo essas aplicaes isoladas do sistema
original.
1 - Entre no sistema chroot:
# chroot /var/debchroot

2 - Instale o Apache2:
# aptitude install apache2

# yum install httpd

3 - Edite o arquivo de configurao do apache2 e defina um FQDN:

# vim /etc/apache2/apache2.conf
ServerName 192.168.200.X

4 - Reinicie o Apache2:
# /etc/init.d/apache2 restart

Procedimentos Bsicos de Segurana para o Apache2:


5 - Retire a opo de Indexes para o diretrio padro do Apache2:
# cd /etc/apache2/sites-available
# vim default

<Directory /var/www/>

#Options Indexes FollowSymLinks MultiViews

Options FollowSymLinks MultiViews

AllowOverride None

Order allow,deny

allow from all

</Directory>

6 Desative o banner de pgina do Apache2:


# cd /etc/apache2/conf.d
# vim security
ServerSignature Off

7 - Reinicie o Apache2:
# /etc/init.d/apache2 restart

8 Faa um teste acessando a pgina do seu servidor pelo browser:

http://192.168.200.x

9 - Saia do sistema chroot e crie um script no sistema original para iniciar o


Apache2 dentro do sistema chroot quando a mquina for ligada:
# exit
# vim /etc/init.d/apache2_chroot

#!/bin/bash

2
3

mount --bind /proc /var/debchroot/proc

mount --bind /dev/pts /var/debchroot/dev/pts

chroot /var/debchroot /etc/init.d/apache2 start

# chmod 755 /etc/init.d/apache2_chroot

10 - Crie os links simblicos para os nveis de execuo:


# update-rc.d apache2_chroot start 21 2 3 4 5 .

7.3.5. Instalao e Configurao do PHP5

1- Entre no sistema chroot:


# chroot /var/debchroot

2 - Instale o PHP5 e alguns mdulos necessrios:


# aptitude install php5
# aptitude install php5-mysql
# aptitude install libapache2-mod-php5

3 Crie um arquivo na raiz das paginas servidas do apache, com o nome index.php,
com o seguinte contedo:

# vim /var/www/index.php
<? php phpinfo() ?>

4 Salve o arquivo e reinicie o apache2:


# /etc/init.d/apache2 restart

5 Em um navegador, acesse o contedo que o apache est servindo, com o teste do


php:

Seu servidor foi instalado corretamente, com suporte a php / mysql.

7.3.6. Instalao e Configurao do AcidBase

O AcidBase a ferramenta que ser utilizada para visualizar os eventos de alerta que
sero gerados pelo Snort e gravados dentro do MySQL. Para funcionar, o AcidBase depende
do Apache com PHP pois uma ferramenta Web. O Apache2 e o PHP5 j esto instalados no
sistema chroot, ento, o AcidBase dever ser instalado l tambm.
1 - Entre no sistema chroot:

# chroot /var/debchroot

2 - Instale o Acidbase:
# aptitude install acidbase

O Red Hat e o Debian Weezy, no possuem pacotes para o Acidbase. Nesse caso
necessrio

instalar

para

Red

Hat,

diretamente

pelo

fonte:

https://launchpad.net/debian/sid/+source/acidbase/1.4.53/+files/acidbase_1.4.5.orig.tar.gz
Para

Weezy,

adicionar

seguinte

repositrio

no

debianchroot:

deb

http://ftp.de.debian.org/debian squeeze main

Obs.: No tem problema ser de outra verso a distro debian

Pelo fato da instalao do AcidBase estar sendo feita dentro do sistema chroot, talvez
ele no conseguir criar as tabelas necessrias na base de dados snort, pois na
instalao padro ele entende que o MySQL est na mesma mquina, por isso, devese ignorar a criao das tabelas na base de dados, elas sero feitas posteriormente.
3 - Edite o arquivo de configurao de base de dados do AcidBase, informando os
valores corretos:
# cd /etc/acidbase
# vim database.php

$alert_user='snort';

$alert_password='123456';

$basepath='';

$alert_dbname='snort';

$alert_host='192.168.200.X';

$alert_port='3306';

$DBtype='mysql';

4 - Libere acesso pgina do AcidBase nas configuraes do Apache2:

# cd /etc/acidbase
# vim apache.conf

<IfModule mod_alias.c>

Alias /acidbase "/usr/share/acidbase"

</IfModule>

4
5

<DirectoryMatch /usr/share/acidbase/>

Options +FollowSymLinks

AllowOverride None

order deny,allow

deny from all

10

allow from 192.168.200.0/255.255.255.0

11

allow from 127.0.0.0/255.0.0.0

12

<IfModule mod_php4.c>

13

php_flag magic_quotes_gpc Off

14

php_flag track_vars On

15

php_value include_path .:/usr/share/php

16
17

</IfModule>
</DirectoryMatch>

5 - Crie o link simblico para a pasta do apache2:


# ln -s /etc/acidbase/apache.conf /etc/apache2/conf.d/acidbase.conf

6 - Reinicie o Apache2:
# /etc/init.d/apache2 restart

7 - Saia do sistema chroot:


# exit

8 - Permita que o Mysql trabalhe no IP da mquina e no s em localhost:

# vim /etc/mysql/my.cnf
bind-address = 192.168.200.X

# /etc/init.d/mysql restart

9 - Acesse o AcidBase no browser:


http://192.168.200.X/acidbase/

No primeiro acesso, a interface do AcidBase dar um erro reclamando a falta de


algumas das tabelas que o AcidBase utiliza. Para resolver esse erro, clique em Setup
Page e depois em Create Base AG.

7.3.7. Apache com suporte a SSL

1 - Entre no sistema chroot:


# chroot /var/debchroot

2 - Verifique se o mdulo ssl est ativo:


# apache2ctl -M

OU
# ls -l /etc/apache2/mods-enabled

3 - Se no, ative o mdulo ssl:


# a2enmod ssl

Vai pedir para reiniciar o apache mas antes necessrio fazer mais algumas
modificaes.
4 Confira no arquivo /etc/apache2/ports.conf a porta padro que o protocolo http
sobre TLS/SSL ouve:

# vim /etc/apache2/ports.conf

Nos prximo passos mostraremos o que preciso para criao de um certificado


padro X.509, e como ns mesmos podemos assin-lo. Utilizaremos o programa openssl para
isto.
5 - Verifique se tem o pacote instalado:
# dpkg -l openssl

6 - Instalando o openssl caso no possua:


# aptitude install openssl

# yum install openssl

7 - Crie um diretrio para o certificado:


# mkdir /etc/apache2/ssl
# cd /etc/apache2/ssl

8 Agora, criar um certificado com algoritmo padro que aceito pela maioria dos
browsers:

Primeiro a chave:

# openssl genrsa -out hostname.key 1024

Depois o certificado (sero feitas algumas perguntas):

# openssl req -new -key hostname.key -out hostname.csr

You are about to be asked to enter information that will be incorporated

into your certificate request.

What you are about to enter is what is called a Distinguished Name or a DN.

There are quite a few fields but you can leave some blank

For some fields there will be a default value,

If you enter '.', the field will be left blank.

-----

Country Name (2 letter code) [AU]:BR[ENTER]

State or Province Name (full name) [Some-State]:Rio de Janeiro[ENTER]

10

Locality Name (eg, city) []:Rio de Janeiro[ENTER]

11

Organization Name (eg, company) [Internet Widgits Pty Ltd]:OYS[ENTER]

12

Organizational Unit Name (eg, section) []:Infra[ENTER]

13

Common Name (eg, YOUR name) []:.[ENTER]

14

Email Address []:academia@oys.com.br[ENTER]

15
16

Please enter the following 'extra' attributes

17

to be sent with your certificate request

18

A challenge password []:[ENTER]

19

An optional company name []:[ENTER]

9 - Neste ponto voc tem duas opes, pode tanto enviar seu certificado (CSR) para
uma das vrias autoridades certificadoras para que assinem e tornem seu
certificado vlido ou voc mesmo pode assinar:
# openssl x509 -req -days 365 -in hostname.csr -signkey hostname.key -out hostname.crt

O arquivo hostname.crt o certificado, e o hostname.key a chave.

10 - Adicionando as diretivas necessrias para ativar o SSL:


# cd /etc/apache2/sites-available
# vim default-ssl

#SSL Engine Switch:

#Enable/Disable SSL for this virtual host.

SSLEngine on

4
5

#A self-signed (snakeoil) certificate can be created by installing

#the ssl-cert package. See

#/usr/share/doc/apache2.2-common/README.Debian.gz for more info.

#If both key and certificate are stored in the same file, only the

#SSLCertificateFile directive is needed.

10

SSLCertificateFile /etc/apache2/ssl/hostname.crt

11

SSLCertificateKeyFile /etc/apache2/ssl/hostname.key

11 Ative o site default-ssl:


# a2ensite default-ssl

12 - Reinicie o servio:
# /etc/init.d/apache2 restart

13 - Verifique os processos do Apache2 que foram inicializados:


# ps aux | grep apache2

14 - Confira as portas que foram abertas para o servidor web com https:
# netstat -nltp | grep apache2

7.4. Snort trabalhando como uma ponte(bridge)


Em ambientes onde o Snort precisa ficar transparente na rede, ou em redes onde no
tem a disponibilidade de trabalhar com um Switch com port-mirror, podemos fazer que o
Snort trabalhe como se fosse uma ponte(bridge), onde todo o trfego de rede passar por ele
de forma transparente.

1 - Primeiro necessrio instalar o pacote para criar a bridge entre as interfaces:


# aptitude install bridge-utils

# yum install bridge-utils

2 Agora, criar a interface de bridge:


# brctl addbr br0
# ifconfig -a

3 - Com a interface de bridge criada, necessrio definir quais interfaces vo


pertencer a ela para a ponte ser estabelecida:
# brctl addif br0 eth0
# brctl addif br0 eth1
# brctl show

4 - Para ficar algo transparente, as interfaces no podem ter endereo IP:


# ifconfig eth0 0.0.0.0
# ifconfig eth1 0.0.0.0

5 - Para colocar a bridge em funcionamento necessrio levantar a sua interface:


# ifconfig br0 up

6 - Para deixar essas configuraes fixas, edite o /etc/network/interfaces e deixe da


seguinte maneira:
# vim /etc/network/interfaces

auto lo

iface lo inet loopback

3
4

# The primary network interface

auto eth0

iface eth0 inet manual


address 0.0.0.0

7
8

network 0.0.0.0

broadcast 0.0.0.0

10
11

auto eth1

12

iface eth1 inet manual

13

address 0.0.0.0

14

network 0.0.0.0

15

broadcast 0.0.0.0

16
17

auto br0

18

iface br0 inet manual

19

bridge_ports eth0 eth1

20

bridge_maxwait 0

7 Agora, faa com que o Snort trabalhe na interface da bridge:


# vim /etc/snort/snort.debian.conf

DEBIAN_SNORT_STARTUP="boot"

DEBIAN_SNORT_HOME_NET="192.168.X.0/24"

DEBIAN_SNORT_OPTIONS=""

DEBIAN_SNORT_INTERFACE="br0"

DEBIAN_SNORT_SEND_STATS="true"

DEBIAN_SNORT_STATS_RCPT="root"

DEBIAN_SNORT_STATS_THRESHOLD="1"

8 - E feitas as modificaes, reiniciar o snort:


# /etc/init.d/snort restart

9 - Para desfazer a bridge, faa fazer os seguintes passos:

# ifconfig br0 down


# brctl delif br0 eth0
# brctl delif br0 eth1
# brctl delbr br0
# /etc/init.d/networking restart

Captulo 8
IPS - Intrusion Prevention System

8.1. Objetivos:
Entender a necessidade de ter um IPS.
Vantagens e desvantagens de um IPS.
Ver a integrao de um IPS com NIDS.
Configurar a ferramenta de IPS Guardian.

8.2. Definio de IPS


O IPS o dispositivo que trabalha junto com o NIDS ou HIDS para tomar uma ao
relacionado a determinado evento que o NIDS/HIDS registraram. Em nosso caso o nosso
NIDS Snort, e o IPS que vamos trabalhar o Guardian que foi desenvolvido para trabalhar
exclusivamente com o Snort.
Sua funcionalidade simples, o Guardian fica constantemente analisando os logs do
Snort, quando gerado uma alerta de nvel 2, que o mais alto do Snort, o Guardian criar
automaticamente uma regra com iptables para bloquear o IP que est atacando. Esse IP
pode ficar bloqueado constantemente, ou por um determinado tempo.

8.3. Instalando o Guardian


1 - O Guardian basicamente um script em Perl, e no est em repositrios Debian.
Pode-se obt-lo pelo seguinte site:
http://www.chaotic.org/guardian/

2 - Aps baixar o Guardian, vamos descompacta-lo:


# cd /opt
# tar xzvf guardian-1.X.tar.gz
# cd guardian-1.X

3 Primeiro, modifique o arquivo de configurao guardian.conf e coloque-o no /etc:


# vim guardian.conf

Interface ethX

2
3

LogFile

/var/log/guardian.log

4
5

AlertFile /var/log/snort/alert

6
7

IgnoreFile /etc/guardian.ignore

8
9

TimeLimit 3600

# cp guardian.conf /etc

4 - Pode-se criar o aquivo guardian.ignore, e colocar os IPS que no precisam ser


checados, no caso, podemos colocar o nosso prprio IP:
# vim /etc/guardian.ignore
192.168.200.X

5 Agora, necessrio preparar os scripts que o guardian utilizar par bloquear e


desbloquear os IP's:
# cd scripts
# cp iptables_block.sh /sbin/guardian_block.sh
# cp iptables_unblock.sh /sbin/guardian_unblock.sh

6 - Para colocar o Guardian em funcionamento, coloque o script guardian.pl para


um dos diretrios do PATH:
# cd ..
# cp guardian.pl /sbin

Por uma limitao do Guardian, seu sistema precisa estar com o idioma em ingls,
pois o Guardian se baseia nos parmetros que esto no ifconfig.
7 - Crie o arquivo de log do Guardian:
# touch /var/log/guardian.log

8 Crie o arquivo de Target para incluir os IPs, a serem monitorados:

# vim /etc/guardian.target
192.168.0.21
192.168.1.1
200.x.x.x

9 Incluir na configurao do Snort, a opo de armazenamento de alertas, no


arquivo alert, independente do que for logado no MySQL:
# vim /etc/snort/snort.conf

output alert_full: /var/log/snort/alert


output log_tcpdump: tcpdump.log
output database: log, mysql, user=snort password=123456 dbname=snort host=localhost

10 Inicie o Guardian:
# guardian.pl -c /etc/guardian.conf
# ps ax

11 - Para testar, acompanhe o log do Guardian enquanto outra mquina faz uma
varredura com nmap:
# tail -f /var/log/guardian.log

12 - Pode-se criar um script no nvel de execuo padro para o Guardian ser


iniciado automaticamente no boot do sistema:

# vim /etc/init.d/guardian

#!/bin/bash
test -f /sbin/guardian.pl || exit 0
case "$1" in
start)
guardian.pl -c /etc/guardian.conf
;;
stop)
kill -9 $(pgrep guardian.pl)
;;
*)
echo "Opo invalida. Use start ou stop."
exit 2
;;
esac
exit 0

# chmod 755 /etc/init.d/guardian


# update-rc.d guardian defaults
# /etc/init.d/guardian
# /etc/init.d/guardian stop
# /etc/init.d/guardian start

13 Para testar, execute um nmap no host onde encontra-se instalado o snort /


guardian:

# nmap -sX 192.168.0.21

Captulo 9
Anlise de Vulnerabilidades com o
Nessus

9.1. Objetivos:
Entender o que uma Anlise de Vulnerabilidades.
Instalar e configurar o Nessus Cliente e Servidor.
Fazer varreduras e gerar relatrios.
Ver a correlao com a norma.

9.2. Conformidade com a norma


No que diz respeito anlise de vulnerabilidades, a norma ABNT NBR ISO/IEC
27002:2005 diz, no item 12.6.1, que convm que seja obtida informao em tempo hbil
sobre vulnerabilidades tcnicas dos sistemas de informao em uso.

9.3. Descobrindo Vulnerabilidades em Apache com Nikto


Nikto um script Perl usado para testar a segurana de seu servidor web. Ele faz a
varredura em servidores Apache tanto em busca de vulnerabilidades, quanto de falhas de
configurao, que podem, de alguma forma, expor o servidor explorao por algum
atacante malicioso, j que, se o servidor estiver hospedando algum site ou aplicao de
acesso pblico, o risco de explorao imenso.
Primeiramente baixar o Nikto em http://www.cirt.net/nikto/
Aps descompact-lo num diretrio local, efetuar os passo abaixo:
Para atualizar e executar o Nikto, utilizamos os seguintes comandos:
# ./nikto.pl -update
# ./nikto.pl -h 192.168.131.1 -o 192.168.131.1.txt
Podemos adicionar o sinalizador de evaso, que tenta contornar seus sistemas de
IDS:
# perl nikto.pl -h www.xyz.com.br -evasion 1

Existem 9 opes diferentes para flags de


evaso. 1 para Random URL encoding (non-UTF8).
O processo fcil e descomplicado de instalao
de uma plataforma LAMP (Linux, Apache, MySQL, PHP)
permite a banalizao de servidores web na internet,
configurados com vistas apenas a funcionalidade, sem
considerar questes relativas segurana.

A insegurana do servidor web no depende exclusivamente de falhas de


configurao ou vulnerabilidades de software, muitas vezes

os prprios usurios

(webmasters) comprometem a segurana dos servio.


Quem da rea com certeza j deparou-se com arquivos do tipo site.zip, senhas.txt,
largados no public_html. Muitos acham que pelo fato do diretrio possuir -Indexes (desativar
listagem de arquivos) o arquivo est seguro, BESTEIRA pensar assim, ainda mais se o
arquivo possui nome bem conhecido, webservers scanner adoram procurar esses arquivos.
O nikto permite a realizao de diversos testes, vale uma olhada no diretrio docs/ e
uma lida no help:
# ./nikto.pl -Help | less

9.4. Testando o Sistema com o Nessus


Nessus uma das ferramentas mais conhecidas para descoberta de vulnerabilidades
em redes e sistemas.
Com um conjunto sempre atualizado de plugins, baseado em sua linguagem de script
chamada NASL, ele faz a varredura de todo os IPs definidos em sua configurao, buscando
vulnerabilidades e brechas na configurao dos servios, informando-os em um relatrio
final, onde define o grau de risco das vulnerabilidades encontradas.
Inicialmente o Nessus era um software opensource, mas a partir da verso 3.0
passou a ser uma ferramenta comercial, disponvel gratuitamente apenas para uso
domstico. Portanto, possvel baixar gratuitamente o Nessus em seu site www.nessus.org e
registrar-se para conseguir a chave de ativao, para poder utilizar a ferramenta em testes
particulares.
Vamos ver no tpico a seguir como baixar e configurar o Nessus para sua utilizao
em anlise de vulnerabilidades.

9.5. Instalando e Configurando o Nessus


1.

Acesse o endereo nessus.org/download/

2.

Baixe a verso 5.x do Nessus para Debian 6*

3.

Instale o pacote:

#dpkg -i Nessus-5.0.1-debian6_i386.deb

4.

Adicione um usurio que ser o administrador do Nessus:

#/opt/nessus/sbin/nessus-adduser

* O pacote para Debian 6, tambm compatvel com a verso 7

9.5.1. Registrando e iniciando


1. Acesse www.nessus.org/register
2. Escolha a verso Professional ou Home (a verso Home gratuita)
3. Informe um endereo de e-mail (para onde eles enviaro o nmero de registro)
#/opt/nessus/bin/nessus-fetch --register xxxx-xxxx-xxxx-xxxx
#/opt/nessus/sbin/nessus-update-plugins
#/etc/init.d/nessusd start
4.

Acesse em seu browser: https://seu_ip:8834/


Inicializao do Nessus Web, e tela de login.

Captulo 10
Firewall

10.1. Objetivos:
Entender a importncia de um Firewall.
Caractersticas de um Firewall Iptables.
Conhecer algumas arquiteturas de Firewall.
Entender as Polticas Bsicas de um Firewall Iptables.
Construir um Firewall Home e um Firewall Gateway.
Construir um script de Firewall.
Ver a correlao com a norma ISO 27002.

10.2. Importncia de um Firewall e Conformidade com a norma


Sistemas de Firewalls so importantes num projeto de segurana, todavia, sozinhos,
no tm como garantir a segurana de uma Rede de Computadores. Demanda-se outros
mecanismos como tambm uma administrao pr-ativa.
Mas sua importncia notria a ponto de a norma internacional de Segurana da
Informao BS7799 veiculada no Brasil pela ABNT como NBR ISO/IEC 27002 , na verso de
2005, no item 11.4.6, Controles da Rede, recomenda a segregao da Rede como est
comentada no item 11.4.5. Assim como a implementao de proteo dos servios
disponibilizados contra acessos no autorizados, ou seja, um trabalho para um sistema de
filtros (Firewall), que, mais enfaticamente citado no item 11.4.7 que corresponde a Rota
de rede obrigatria.
Neste treinamento, usaremos o Iptables, a ferramenta que surgiu no Kernel do 2.4 e
foi mantida no Kernel 2.6, que possibilitar ao administrador manipular as capacidades do
Netfilter, o Firewall de tecnologia State Full nativa no Linux.
Nosso objetivo ser compreender como as comunicaes de rede acontecem no
contexto do protocolo, ou seja, trabalhar a matria prima que o TCP/IP por meio de um
mtodo didtico chamando amigavelmente pela equipe de instrutores da OYS de Lego,
devido ao fato de que no processo inicial de aprendizado, tratamos cada ao importante
separadamente, como peas de um quebra-cabea, para no final junt-las com coerncia,
construindo um modelo de polticas de Firewall realmente funcional.

10.3. Caractersticas do Firewall Iptables

Especificao de portas/endereo de origem/destino;

Suporte a protocolos TCP/UDP/ICMP (incluindo tipos de mensagens icmp);

Suporte a interfaces de origem/destino de pacotes;

Manipulao de servios de proxy na rede;

Tratamento de trfego dividido em chains e trfego redirecionado;

Permite um nmero ilimitado de regras por chain;

Muito rpido, estvel e seguro;

Possui mecanismos internos para rejeitar automaticamente pacotes duvidosos ou mal


formados;

Suporte a mdulos externos para expanso das funcionalidades padres oferecidas


pelo cdigo de firewall;

Suporte completo a roteamento de pacotes, tratados em uma rea diferente de


trfegos padres;

Suporte a especificao de tipo de servio para priorizar o trfego de determinados


tipos de pacotes;

Permite especificar excees para as regras ou parte das regras;

Suporte a deteco de fragmentos;

Permite enviar alertas personalizados ao syslog sobre o trfego aceito/bloqueado;

Redirecionamento de portas;

Masquerading;

Suporte a SNAT (modificao do endereo de origem das mquinas para um nico IP


ou faixa de IP's);

Suporte a DNAT (modificao do endereo de destino das mquinas para um nico IP


ou faixa de IP's);

Contagem de pacotes que atravessaram uma interface/regra;


Limitao de passagem de pacotes/conferncia de regra (muito til para criar
protees contra syn flood, ping flood, DoS, etc);

10.4. Arquiteturas de Firewall


Normalmente, as empresas preferem implementar um Firewall baseado apenas em
uma mquina, seja ele um host PC ou um roteador. Entretanto, os Firewalls mais robustos
so compostos de vrias partes.
Veja a seguir algumas arquiteturas:

Roteador com Triagem (Screening Router)

Gateway de Base Dupla (Dual Homed Gateway)

Gateway Host com Triagem (Screened Host Gateway)

Gateway Host com Triagem (Screened Subnet)

10.5. Tipos de Firewall e como eles trabalham na estrutura da


camada OSI

10.5.1. Uma viso a partir do Datagrama

Packet Filter Trata 20 a 24 bytes Ou seja, ele trata todo o cabealho IP (primeiros
20 bytes) e parte do cabealho de transporte no que diz respeito a porta origem e
destino, lembrando que esse campo tem 4 bytes (16 bits 2^16 = total de 65536
portas).

StateLess Trata um pouco mais de 24 bytes, mais isso varia de acordo com a forma
que a ferramenta foi implementada. Em alguns casos analisa o flag de incio de
conexo TCP mas no capaz de tratar o conceito de estado de conexo.

StateFull Trata no mnimo os 40 bytes iniciais, ou seja, todo cabealho IP seja qual
for o protocolo de transporte (UDP, TCP), sabendo tratar estado de conexo.

10.6. Polticas Bsicas


Conforme nossa metodologia, o ideal para o firewall ser fechar todas as polticas para
depois fazer as excees e os controles.
1 - Antes de comear os scripts, visualize como esto as polticas bsicas:
# iptables -n -L

-n -> Opo para no resolver nomes.

-L -> Opo para listar as polticas.

2 - O primeiro passo criar um diretrio onde ficaro os scritps:

# mkdir /etc/firewall
# cd /etc/firewall

3 - Crie um script chamado drop.sh para fechar as polticas bsicas:


# vim drop.sh

#!/bin/bash

2
3

IPT=$(which iptables)

4
5

nega ()

$IPT -P INPUT DROP

$IPT -P OUTPUT DROP

$IPT -P FORWARD DROP

10

11

nega

-P -> Opo de definio do estado da Poltica.

4 - D permisso de execuo ao script, em seguida execute-o:


# chmod 755 drop.sh
# ./drop.sh
# iptables -n -L

5 - Para limpar as regras em todas as chains e voltar com a poltica padro ACCEPT,
crie o script limpa.sh:
# vim limpa.sh

#!/bin/bash

2
3

IPT=$(which iptables)

4
5

limpa ()

$IPT -F

$IPT -F -t nat

$IPT -F -t mangle

10

$IPT -P INPUT ACCEPT

11

$IPT -P OUTPUT ACCEPT

12

$IPT -P FORWARD ACCEPT

13

14

limpa

-F -> Opo que limpa (flush) as regras das tabelas.

-t -> Opo para definir qual tabela est trabalhando, pois a tabela filter a padro e
no precisa ser especfica com a opo -t.

6 - D permisso de execuo ao script, em seguida execute-o:


# chmod 755 limpa.sh
# ./limpa.sh
# iptables -n -L

10.7. Polticas de Excees


Agora que todas as polticas bsicas esto fechadas (DROP), as excees sero as
regras de liberao (ACCEPT).
1 - Com todas as polticas fechadas, tente fazer um ping na interface local
(loopback) da sua mquina e veja se responde normalmente:
# ping 127.0.0.1

2 - Crie um script chamado loop.sh para liberar o acesso interface loopback:

# vim loop.sh

#!/bin/bash

2
3

IPT=$(which iptables)

4
5

LO="127.0.0.1"

6
7

loop ()

$IPT -A INPUT -i lo -d $LO -j ACCEPT

10

$IPT -A OUTPUT -o lo -d $LO -j ACCEPT

11

12

loop

-A -> Opo utilizada para adicionar uma regra a uma chain.

-i -> Opo que define a interface de input (Entrada).

-o -> Opo que define a interface de output (Sada).

-d -> Opo que define o destino.

-j -> A opo -j (jump) define a ao que deve ser tomada.

3 - D permisso de execuo ao script, em seguida execute-o:


# chmod 755 loop.sh
# ./loop.sh
# iptables -n -L

4 - Faa um teste novamente e veja se agora consegue fazer um ping para a


loopback:

# ping 127.0.0.1

5 - Crie o script ping.sh para liberar a entrada de pacotes ICMP Echo Reply e a sada
de pacotes ICMP Echo Request:
# vim ping.sh

#!/bin/bash

2
3

IPT=$(which iptables)

4
5

NET="0/0"

6
7

ET0="192.168.200.X"

8
9

ping ()

10

11

$IPT -A INPUT -p icmp --icmp-type 0 -s $NET -d $ET0 -j ACCEPT

12

$IPT -A OUTPUT -p icmp --icmp-type 8 -s $ET0 -d $NET -j ACCEPT

13

14

ping

-p -> Opo para definir o tipo de protocolo usado.

--icmp-type -> Opo para definir o tipo de ICMP usado.

-s -> Opo para definir origem.

6 - D permisso de execuo ao script, em seguida execute-o:


# chmod 755 ping.sh
# ./ping.sh
# iptables -n -L

7 - Teste e veja se consegue fazer um ping em uma outra mquina:

# ping 192.168.200.X

8 - Crie um script chamado mtr.sh para poder utilizar o programa mtr, que um
programa similar ao traceroute:
# vim mtr.sh

#!/bin/bash

2
3

IPT=$(which iptables)

4
5

NET="0/0"

ET0="192.168.200.X"

7
8

mtr ()

10

$IPT -A INPUT -p icmp --icmp-type 11 -s $NET -d $ET0 -j ACCEPT

11

12

mtr

9 - D permisso de execuo ao script, em seguida execute-o:


# chmod 755 mtr.sh
# ./mtr.sh
# iptables -n -L

10 - Veja se agora consegue traar a rota at um determinado destino:


# mtr 200.176.2.10

11 - Crie um script chamado dns.sh para que haja comunicao com servidores DNS
(Resoluo de Nomes):
# vim dns.sh

#!/bin/bash

2
3

IPT=$(which iptables)

4
5

NET="0/0"

ET0="192.168.200.X"

PA="1024:65535"

8
9

dns ()

10

11

$IPT -A INPUT -p udp -s $NET --sport 53 -d $ET0 --dport $PA -j ACCEPT

12

$IPT -A INPUT -p icmp --icmp-type 3 -s $NET -d $ET0 -j ACCEPT

13

$IPT -A OUTPUT -p udp -s $ET0 --sport $PA -d $NET --dport 53 -j ACCEPT

14

15

dns

--sport --> Opo para definir porta origem.

--dport --> Opo para definir porta destino.

12 - D permisso de execuo ao script, em seguida execute-o:


# chmod 755 dns.sh
# ./dns.sh
# iptables -n -L

13 - Agora faa um teste e veja se sua mquina consegue resolver nomes:


# ping www.oys.com.br

14 - Crie um script chamado web.sh para que haja acesso aos servidores Web:
# vim web.sh

#!/bin/bash

2
3

IPT=$(which iptables)

4
5

NET="0/0"

ET0="192.168.200.X"

PA="1024:65535"

8
9

http ()

10

11

$IPT -A OUTPUT -p 6 -s $ET0 --sport $PA -d $NET --dport 80 -j ACCEPT

12

$IPT -A OUTPUT -p 6 -s $ET0 --sport $PA -d $NET --dport 443 -j ACCEPT

13
14

$IPT -A INPUT -p 6 -s $NET --sport 80 -d $ET0 --dport $PA -j ACCEPT

15

$IPT -A INPUT -p 6 -s $NET --sport 443 -d $ET0 --dport $PA -j ACCEPT

16

17

http

Repare na opo -p, ela pode ser definida por nome ou por nmeros. Os nmeros
correspondentes

aos

protocolos

que

podem

ser

encontrados

dentro

/etc/protocols.

# cat /etc/protocols

15 - D permisso de execuo ao script, em seguida execute-o:


# chmod 755 web.sh
# ./web.sh
# iptables -n -L

16 - Faa um teste e veja se consegue acessar pginas web no seu browser:

de

www.oys.com.br

17 - Crie um script chamado ssh_cliente.sh para que sua mquina consiga conectar
em um servidor ssh:
# vim ssh_cliente.sh

#!/bin/bash

2
3

IPT=$(which iptables)

4
5

NET="0/0"

ET0="192.168.200.X"

PA="1024:65535"

8
9

sshcli ()

10

11

$IPT -A OUTPUT -p tcp -s $ET0 --sport $PA -d $NET --dport 22 -j ACCEPT

12

$IPT -A INPUT -p tcp -s $NET --sport 22 -d $ET0 --dport $PA -j ACCEPT

13

14

sshcli

18 - D permisso de execuo ao script, em seguida execute-o:


# chmod 755 ssh_cliente.sh
# ./ssh_cliente.sh
# iptables -n -L

19 - Agora veja se consegue acessar uma outra mquina via ssh:

# ssh usuario@192.168.200.X

20 - EXERCCIO: Crie um script chamado sshserver.sh para permitir que outra


mquina conecte-se a sua mquina via ssh:
Preste muita ateno na ordem das portas de origem e destino.

21 - Desenvolva um script para abrir uma exceo para que um determinado IP e


seu respectivo MAC Address, consiga acessar o servio de SSH em sua mquina:
# vim mac_ssh.sh

#!/bin/bash

2
3

IPT=$(which iptables)

4
5

ET0="192.168.200.X"

PA="1024:65535"

7
8

mac_ssh()

10

$IPT -A INPUT -p tcp -s 192.168.200.X --sport $PA -d $ET0 --dport 65123 -m mac --mac-source

XX:XX:XX:XX:XX:XX -j ACCEPT
11

$IPT -A OUTPUT -p tcp -s $ET0 --sport 65123 -d 192.168.200.X --dport $PA -j ACCEPT

12

13

mac_ssh

22 - D permisso de execuo ao script, em seguida execute-o:

# chmod 755 mac_ssh.sh


# ./limpa.sh; ./drop.sh; ./ssh_cliente.sh
# ./mac_ssh.sh
# iptables -n -L

23 - Agora veja se consegue acessar uma outra mquina via ssh:


# ssh usuario@192.168.200.X

10.7.1. Tratamento completo de ICMP


Pode-se customizar, por meio de funes em shell scripts, polticas de EXCEO
para tratamento do protocolo ICMP que, devido ao grande nmero de tipo de respostas,
motiva administradores que tm poucos conhecimentos de TCP/IP a criarem polticas no
adequadas. Outro fato que esse protocolo muito utilizado por ataques para a elaborao
de Ataques de Deny of Service (DOS) e tcnicas de Fingerprint.
A tabela a seguir servir de referncia. Mais detalhes, vide RFC 792:
Type

CODE

Description

Echo Reply

Network Unreachable

Host Unreachable

Protocol Unreachable

Port Unreachable

Fragmentation needed but no frag. bit set

Source routing failed

Destination network unknown

Destination host unknown

Source host isolated (obsolete)

Destination network adminis. prohibited

10

Destination host adminis.prohibited

11

Network unreachable for TOS

12

Host unreachable for TOS

13

Commun. adminis. prohibited by filtering

14

Host precedence violation

15

Precedence cutoff in effect

Source quench

Query

Error

Redirect for network

Redirect for host

Redirect for TOS and network

Redirect for TOS and host

Echo request

Router advertisement

10

Route solicitation

11

TTL equals 0 during transit

11

TTL equals 0 during reassembly

12

IP header bad (catchall error)

12

Required options missing

13

Timestamp request (obsolete)

14

Timestamp reply (obsolete)

15

Information request (obsolete)

16

Information reply (obsolete)

17

Address mask request

18

Address maskreply

1 - Elabore um script que defina uma poltica de exceo para alguns desses tipos
de ICMP, limitando a quantidade de pacote por tempo em uma respectiva
comunicao:
# vim icmps.sh

#!/bin/bash

2
3

IPT=$(which iptables)

NET="0/0"

ET0="192.168.200.X"

icmps ()

for tipo in 0 3/0 3/1 3/2 3/3 3/4 4 5 11 12


do

9
10

$IPT -A INPUT -p icmp -s $NET -d $ET0 --icmp-type $tipo -m limit --limit 1/s

11

-j ACCEPT
done

12
13

$IPT -A OUTPUT -p icmp --icmp-type 8 -s $ET0 -d $NET -j ACCEPT

14

15

icmps

-m limit --> Ativa o mdulo do iptables para limitao de pacotes.

--limit 1/s --> Limita a receber somente 1 pacote ICMP por segundo.

2 - D permisso de execuo ao script, em seguida execute alguns scripts para ser


feito o teste:
# chmod 755 icmps.sh
# ./limpa.sh
# ./drop.sh
# ./icmps.sh
# ./dns.sh
# iptables -n -L

3 - Teste se o novo script funcionou corretamente:


# ping 192.168.200.X
# mtr 200.176.2.10

4 - Veja o novo mdulo do iptables que foi carregado com ao -m limit:


# lsmod | less

5 - Verifique o valor para diretriz ip_default_ttl, lembrando que ele pode variar de
acordo com a distribuio Linux e tambm em relao aos outros Sistemas
Operacionais:
# sysctl -a | grep ip_default_ttl

6 - O recomendvel manter o valor genrico de sistemas like Unix, que 255:


# sysctl -w net.ipv4.ip_default_ttl=255

7 - Para que essa diretriz seja definitiva, necessrio inser-la no arquivo


/etc/sysctl.conf:
# vi /etc/sysclt.conf
net.ipv4.ip_default_ttl=255

8 - Agora valide as modificaes feitas no sysctl.conf:


# sysctl -p /etc/sysctl.conf

10.8. Polticas de Controles


Uma tarefa importante do Firewall justamente fazer o registro das atividades que
no so permitidas, para que, por meio dos logs, o administrador possa analisar
comportamentos hostis e antecipar-se quanto atividades de invasores como Script Kiddies,
insider, Black Hats e GrayHat. Os exerccios a seguir tm por objetivo exemplificar a
construo de polticas de controle.
1 - Crie um script para liberar que sua mquina conecte em todas as portas de
servios TCP necessrias:
# vim cliente_tcp.sh

#!/bin/bash

2
3

IPT=$(which iptables)

ET0="192.168.200.X"

PA="1024:65535"

6
7

tcp_cliente ()

for porta in $(cat /etc/firewall/portas_tcp.txt)

10

do

11

$IPT -A INPUT -p tcp -d $ET0 --dport $PA --sport $porta -j ACCEPT

12

$IPT -A OUTPUT -p tcp -s $ET0 --sport $PA --dport $porta -j ACCEPT

13

done

14

15

tcp_cliente

2 - Agora crie o arquivo portas_tcp.txt onde ficaro as portas dos servios a serem
conectados:
# vim portas_tcp.txt

21

22

23

25

110

143

80

443

53

10

65123

3 - D permisso de execuo ao script, em seguida execute-o:


# chmod 755 cliente_tcp.sh
# ./limpa.sh
# ./drop.sh
# ./icmps.sh
# ./dns.sh
# ./cliente_tcp.sh
# iptables -n -L

4 - Faa um teste e veja se sua mquina se conecta a estas portas:


# ssh usuario@192.168.200.X
www.oys.com.br

5 - Desenvolva um script para definir polticas de controles de ataque de pacote com


flags invlidas:
# vim flags.sh

#!/bin/bash

2
3

IPT=$(which iptables)

4
5

flags()

for FLAGS in $(cat /etc/firewall/flags.txt | grep -v ^#)

do

for CHAINS in INPUT FORWARD

10

do

11

$IPT -A $CHAINS -p tcp --tcp-flags $FLAGS $FLAGS -j LOG --log-prefix "flags_$FLAGS"

12

$IPT -A $CHAINS -p tcp --tcp-flags $FLAGS $FLAGS -j DROP

13

done

14

done

15

16

flags

--tcp-flags --> Definio de checagem de Flags.

--log-prefix --> Parmetro para definir o nome do Log que ser gerado.

6 - Agora crie o arquivo de flags invlidas a serem checadas:


# vi flags.txt

SYN,RST

SYN,FIN

SYN,PSH

SYN,URG

FIN,RST

FIN,URG,PSH

7 - D permisso de execuo ao script, em seguida execute-o:

# chmod 755 flags.sh


# ./limpa.sh
# ./drop.sh
# ./flags.sh
# iptables -n -L

8 - Faa um nmap em outra mquina e veja os logs serem registrados nela:


# nmap -sX -p 65123 192.168.200.X

9 - Os logs tambm so registrados dentro do arquivos de logs do kernel:


# cat /var/log/kern.log

10.9. Drop e Reject


Para entender como funciona o Drop e o Reject, ser necessrio entender como as
portas respondem na pilha TCP/IP, quando est em Abertas, Fechadas, em Drop e Reject.
1 - Instale a ferramenta hping3:
# aptitude install hping3

# yum install hping3

2 - Faa um teste em uma mquina utilizando o nmap e o hping e veja como uma
porta Aberta responde:

# nmap -sS -p 22 192.168.200.X


# hping3 --syn -p 22 192.168.200.X

3 - Faa outro teste e veja como uma porta Fechada responde:


# nmap -sS -p 23 192.168.200.X
# hping3 --syn -p 23 192.168.200.X

4 - Faa outro teste e veja como uma porta em Drop responde:

# nmap -sS -p 25 192.168.200.X


# hping3 --syn -p 25 192.168.200.X

5 - Faa outro teste e veja como uma porta em Reject responde:


# nmap -sS -p 111 192.168.200.X
# hping3 --syn -p 111 192.168.200.X

6 - Agora que j sabe como as portas respondem na pilha TCP/IP, entenda a regra

para fazer um Reject:


# ./limpa.sh
# iptables -A INPUT -p tcp -s 0/0 -d 192.168.200.X --dport 65123 -j REJECT
# iptables -n -L

7 - Faa um teste novamente:


# nmap -sS -p 65123 192.168.200.X
# hping3 --syn -p 65123 192.168.200.X

10.10. Poltica de Chains


Em firewalls organizados com um grande nmero de regras, pode-se criar chains
individuais para organizar regras de um mesmo tipo ou que tenham por objetivo analisar um
trfego de uma mesma categoria (interface, endereo de origem, destino, protocolo, etc),
pois podem consumir muitas linhas e tornar o gerenciamento do firewall confuso. O tamanho
mximo de um nome de chain de 31 caracteres e podem conter tanto letras maisculas
quanto minsculas.
1 - Crie uma nova Chain e linha de comando e veja como ela aparece:
# iptables -N TESTE
# iptables -n -L

2 - Agora que a Chain j foi visualizada, apague-a:


# iptables -X TESTE
# iptables -n -L

3 - Desenvolva um script que crie uma Chain que receber somente a entrada de
pacotes ICMP's definidos no script:
# vim icmp_chain.sh

#!/bin/bash

8
9

IPT=$(which iptables)

10
11

$IPT -N ALLOW_ICMP

12
13

NET="0/0"

14

ET0="192.168.200.X"

15

PA="1024:65535"

16
17

icmp_chain()

18

19

$IPT -A ALLOW_ICMP -m limit --limit 1/s -j ACCEPT

20
21

for TIPO in 0 3/0 3/1 3/2 3/3 3/4 4 5 11 12


do

22
23

$IPT -A INPUT -p 1 -s $NET -d $ET0 --icmp-type $TIPO -j ALLOW_ICMP


done

24
25
26

$IPT -A OUTPUT -p 1 -d $NET -s $ETO --icmp-type 8 -j ALLOW_ICMP

27

28

icmp_chain

4 - D permisso de execuo ao script, em seguida execute-o:


# chmod 755 icmp_chain.sh
# ./limpa.sh
# ./icmp_chain.sh
# iptables -n -L

10.11. Script Completo


Agora ser feito um script de Firewall, reunindo todas as funes que julgar
necessrias no script modelo a seguir. Coloque-o para ser carregado durante o boot no nvel
de execuo padro do seu Linux, lembrando que distros like Debian e RedHat seguem o
modelo System V, e Like Slackware segue o modelo BSD. Aqui, o exemplo notoriamente
baseado em System V.
1 - Os scripts a serem adicionados no script geral so os seguintes:
1

drop.sh

limpa.sh

loop.sh

dns.sh

icmps.sh

cliente_tcp.sh

flags.sh

2 - Agora, o contedo desses scripts sero adicionados ao script geral, o modelo do


script geral segue a seguir. A maneira de faz-lo e organizar os scripts dentro dele
ser passado pelo instrutor:
# vim firewall.sh

#!/bin/bash

## FIREWALL PERSONALIZDO - TREINAMENTO HARDENING - OYS

3
4

#------------------------------------------------------------------------------

## Mdulos necessrios

6
7

modprobe ip_conntrack_ftp

modprobe ip_nat_ftp

#------------------------------------------------------------------------------

10
11

# DECLARE AS VARIVEIS AQUI.

12

#-----------------------------------------------------------------------------

13
14

# DECLARE AS REGRAS(FUNES) AQUI.

15
16
17

#-----------------------------------------------------------------------------

18

case $1 in

19

start)

20

# FAA AS CHAMDAS DAS REGRAS(FUNES) DE START AQUI.

21
22

echo " ******* FIREWAL ATIVADO ******* "

23

;;

24

stop)

25

# FAA AS CHAMDAS DAS REGRAS(FUNES) DE STOP AQUI.

26
27

echo " ******* FIREWALL DESATIVADO ******* "

28

;;

29

filter) $IPT -n -L | less

30

;;

31

nat) $IPT -n -L -t nat

32

;;

33

mangle) $IPT -n -L -t mangle

34

;;

35

restart) $0 stop

36

$0 start

37

;;

38

*) echo "erro use $0 {start|stop|filter|nat|mangle|restart}"

39

exit 0

40

;;

41

esac

42

exit 1

3 - Depois que o seu script de firewall estiver pronto, d permisso de execuo a


ele:
# chmod 755 firewall.sh

4 - Teste seu script e veja as opes disponveis:


# ./firewall.sh
# ./firewall.sh start
# ./firewall.sh stop
# ./firewall.sh filter
# ./firewall.sh nat
# ./firewall.sh mangle
# ./firewall.sh restart

5 - Agora, com o script pronto, coloque-o no nvel de execuo padro de seu


sistema da maneira convencional:
# ln -s /etc/firewall/firewall.sh /etc/rc2.d/S01firewall
# ls -l /etc/rc2.d

10.12. Checagens de estado dos pacotes (State Full)


O critrio para filtragem de pacotes mais til provido pela extenso state que
interpreta a anlise do controle da conexo feita pelo mdulo `ip_conntrack'. Essa extenso
altamente recomendada, onde ela trabalhar com estados de conexes. Os estados so:

NEW: Um pacote que cria uma nova conexo;

ESTABLISHED: Um pacote que pertence a uma conexo existente (um pacote de


resposta, saindo por uma conexo na qual j houveram respostas);

RELATED: Um pacote relacionado, mas que no faz parte de uma conexo existente,
como um erro ICMP, ou (com o mdulo FTP carregado) um pacote estabelecendo uma
conexo de dados FTP;

INVALID: Um pacote que no pde ser identificado por alguma razo: isso inclui falta
de memria e erros ICMP;

1 - Crie um script completo para trabalhar como um Firewall State Full:


# vim firewall2.sh

#!/bin/bash

2
3

## Variveis

IPT=$(which iptables)

ET0="192.168.200.X"

LO="127.0.0.1"

NET="0/0"

PA="1024:65535"

#-----------------------------------------------------------------------

10
11

modulos()

12

13

echo "### CARREGANDO MDULOS ###"

14

modprobe ip_conntrack_ftp

15

modprobe ip_nat_ftp

16

17
18

nega()

19

20

echo "### FECHANDO O FIREWALL ###"

21
22

$IPT -P INPUT DROP

23

$IPT -P OUTPUT DROP

24

$IPT -P FORWARD DROP

25

26
27

limpa()

28

29

echo "### ABRINDO O FIREWALL ###"

30
31

$IPT -F

32

$IPT -F -t nat

33

$IPT -F -t mangle

34

$IPT -P INPUT ACCEPT

35

$IPT -P OUTPUT ACCEPT

36

$IPT -P FORWARD ACCEPT

37

38
39

loop()

40

41

echo "### LIBERANDO A LOOP BACK ###"

42
43

$IPT -A INPUT -i lo -d $LO -j ACCEPT

44

$IPT -A OUTPUT -o lo -d $LO -j ACCEPT

45

46
47

input()

48

49

echo "### ESTABILIZANDO AS CONEXES DE INPUT ###"

50
51

$IPT -A INPUT -m state --state ESTABLISHED,RELATED -j ACCEPT

52
53

54
55

output()

56

57

echo "### ESTABILIZANDO AS CONEXES DE OUTPUT ###"

58
59

$IPT -A OUTPUT -m state --state ESTABLISHED,RELATED -j ACCEPT

60

61
62

forward()

63

64

echo "### ESTABILIZANDO AS CONEXES DE FORWARD ###"

65
66

$IPT -A FORWARD -m state --state ESTABLISHED,RELATED -j ACCEPT

67

68
69

icmps()

70

71

echo "### LIBERANDO ICMPS ###"

72
73
74

for TIPO in 0 3/0 3/1 3/2 3/3 3/4 4 5 11 12


do

75

$IPT -A INPUT -p icmp -s $NET -d $ET0 --icmp-type $TIPO -m limit --limit 1/s -j ACCEPT

76

done

77

$IPT -A OUTPUT -p icmp -s $ET0 -d $NET --icmp-type 8 -j ACCEPT

78

79

pt_cliente_tcp()

80

81

echo "### LIBERANDO CONEXES CLIENTE EM PORTAS TCP ###"

82
83

for PORTAS in $(cat /etc/firewall/portas_tcp.txt | grep -v ^#)


do

84
85

$IPT -A OUTPUT -p tcp -m state --state NEW -s $ET0 --sport $PA -d $NET --dport $PORTAS -j

ACCEPT
86

done

87

88
89

pt_cliente_udp()

90

91

echo "### LIBERANDO CONEXES CLIENTE EM PORTAS UDP ###"

92
93

for PORTAS in $(cat /etc/firewall/portas__udp.txt | grep -v ^#)


do

94
95

$IPT -A OUTPUT -p udp -m state --state NEW -s $ET0 --sport $PA -d $NET --dport $PORTAS -j

ACCEPT
96

done

97

98
99

pt_adm_tcp()

100

101

echo "### ATIVANDO CONTROLE DE CONEXES REMOTAS DE IP's AUTORIZAODS ###"

102
103
104

for IP in $(cat /etc/firewall/ip_amigos.txt | grep -v ^#)


do

105

for PORTAS in $(cat /etc/firewall/portas_adm.txt | grep -v ^#)

106

do

107

$IPT -A INPUT -p tcp -m state --state NEW -s $IP --sport $PA -d $ET0 --dport $PORTAS -j

ACCEPT
108
109

done
done

110
111

for PORTAS in $(cat /etc/firewall/portas_adm.txt | grep -v ^#)

112

do

113

$IPT -A INPUT -p tcp -s $NET --sport $PA -d $ET0 --dport $PORTAS -j REJECT --reject-with tcp-

reset

114

done

115

116
117

flags_invalidas()

118
119

120

echo "### ATIVANDO CONTROLE DE FLAGS INVALIDAS ###"

121
122

for FLAGS in $(cat /etc/firewall/flags.txt | grep -v ^#)

123

do

124

for CHAINS in INPUT FORWARD

125
126

do
$IPT -A $CHAINS -p tcp -d $ET0 -m state --state NEW --tcp-flags $FLAGS $FLAGS -j LOG --log-

prefix "FLAG_$FLAGS"
127
128

$IPT -A $CHAINS -p tcp -d $ET0 -m state --state NEW --tcp-flags $FLAGS $FLAGS -j DROP
done

129

done

130

131
132

#-----------------------------------------------------------------------

133

case $1 in

134

start)

135

modulos

136

nega

137

loop

138

input

139

output

140

forward

141

icmps

142

pt_cliente_tcp

143

pt_cliente_udp

144

flags_invalidas

145

pt_adm_tcp

146

flags_invalidas

147
148

echo " ******* FIREWAL ATIVADO ******* "

149

;;

150

stop)

151

limpa

152
153

echo " ******* FIREWALL DESATIVADO ******* "

154

;;

155

filter) $IPT -nL | more

156

;;

157

nat) $IPT -nL -t nat | more

158

;;

159

mangle) $IPT -nL -t mangle | more

160

;;

161

restart) $0 stop
$0 start

162
163

;;

164

*) echo "erro use $0 {start|stop|filter|nat|mangle|restart}"

165

exit 0

166

;;

167

esac

168

exit 1

2 - D permisso de execuo ao seu script e teste-o:


# chmod 755 firewall2.sh
# ./firewall2.sh start
# ./firewall.sh filter

3 - Agora realize alguns testes padres que foram feitos com o outro script de
Firewall e veja se tudo funciona corretamente:

10.13. Trabalhando com a Tabela NAT


Foi visto no comeo desse tpico que a tabela NAT usada para dados que geram
outra conexo (masquerading,

source nat, destination nat, port forwarding, proxy

transparente so alguns exemplos).

10.13.1. Compartilhando a Conexo com a Internet

1 - Segue a estrutura que deve ser feita no laboratrio:

2 - Primeiro ser necessrio configurar os computadores conforme o ambiente


proposto:
As configuraes podem ser feitas diretamente pelo comando ifconfig ou editando o
arquivo de configurao /etc/network/interfaces para deixar as configuraes fixas,
lembrando de reiniciar a rede aps modificar no arquivo de configurao. E no
esquea de colocar as rotas padres (default gateway). Os nicos que no possuem
rotas padres so as mquinas Router.
3 - Aps a configurao dos IP's, ser necessrio habilitar o suporte ao repasse de
pacotes entre as interfaces. Isso feito mudando um parmetro do Kernel
utilizando o comando sysctl:

# sysctl -a | grep ip_forward


# sysctl -w net.ipv4.ip_forward=1

4 - Faa um teste de ping entre as mquinas e veja se agora os pacotes esto sendo
repassados:
# ping 192.168.X.X
# ping 200.X.X.X

5 - Crie um script nos gateways para fazer o compartilhamento de conexo:


# vim nat.sh

#!/bin/bash

2
3

IPT=$(which iptables)

REDE="192.168.X.0/24"

5
6

nat ()

$IPT -t nat -A POSTROUTING -s $REDE -o ethX -j MASQUERADE

10

nat

6 - Esse mesmo script pode ser feito de outra maneira:


# vim nat2.sh

#!/bin/bash

2
3

IPT=$(which iptables)

REDE="192.168.X.0/24"

IP_NET="200.X.X.2"

6
7

nat2 ()

$IPT -t nat -A POSTROUTING -s $REDE -o ethX -j SNAT --to-source $IP_NET

10

11

nat2

-t: Opo utilizada para especificar a tabela em uso.

7 - Para este teste, em um primeiro momento, lembre de abrir o seu firewall:


# ./firewall.sh stop
# ./firewall filter

8 - D permisso aos scripts e execute um dos dois:


# chmod 755 nat.sh
# chmod 755 nat2.sh
# ./nat.sh
# ./nat2.sh
# iptables -n -L -t nat

9 - Das mquinas clientes, tente fazer um ping nas mquinas gateway da outra rede
conectada a sua:
# ping 200.X.X.2

10 - Agora que os clientes conseguem acessar outra rede, feche a chain FORWARD
nos gateways e veja se os clientes ainda conseguem comunicar-se com as outras
redes:
# iptables -P FORWARD DROP
# iptables -n -L
# ping 200.X.X.2

11 - Edite o script de NAT, para adicionar regras de FORWARD para liberar a


comunicao entre as redes:
# vim nat.sh

#!/bin/bash

2
3

IPT=$(which iptables)

REDE="192.168.X.0/24"

NET="0/0"

6
7

nat ()

9
10

$IPT -A FORWARD -s $REDE -d $NET -j ACCEPT

11

$IPT -A FORWARD -s $NET -d $REDE -j ACCEPT

12
13

$IPT -t nat -A POSTROUTING -s $REDE -o ethX -j MASQUERADE

14

15

nat

12 - Limpe suas tabelas, em seguida execute o script de nat novamente:


# iptables -F -t nat
# ./nat.sh
# iptables -t nat -n -L

13 - Teste e veja se a comunicao de clientes para gateways da outra rede voltou a


funcionar:
# ping 200.X.X.2

14 - Agora nos gateways, crie um script para bloquear que um determinado IP com
seu respectivo MAC Address no consiga sair para outra rede:
# vim mac_nat.sh

#!/bin/bash

2
3

IPT=$(which iptables)

4
5

mac_nat()

$IPT -I FORWARD -s 192.168.X.X -m mac --mac-source XX:XX:XX:XX:XX:XX -j DROP

mac_nat

15 - D permisso de execuo ao script e execute-o, lembrando de rodar o NAT com


DROP e depois os com ACCEPT:
# ./limpa.sh
# ./mac_nat.sh
# ./nat.sh
# iptables -t nat -n -L

16 - Agora, teste e veja se a determinada mquina com o IP e MAC Address


especificados no script consegue sair para outra rede:
# ping 200.X.X.2

17 - Veja a atividade do nat por meio do arquivo de kernel:

# tail -f /proc/net/ip_conntrack

10.13.2. Redirecionando Portas

Considerando a mesma estrutura de laboratrio montada para o compartilhamento de


internet, vamos imaginar o seguinte cenrio:
Ns temos um servidor dentro da nossa rede, que est rodando o SSH Server, e
queremos que mquinas externas, conexes vindas da internet consigam acessar esse
servidor SSH diretamente. O problema que o IP vlido da nossa rede est em nosso Bastion
Host que o gateway da rede.
Para resolver isso, temos que usar a chain PREROUTING da tabela nat para
redirecionar as portas de um servidor para o outro.
1 - Vamos criar um script nos Gateway's que vai definir que todas as conexes
externas com destino ao nosso gateway na porta 22 vo ser redirecionadas para um
host interno na porta 22:
# cd /etc/firewall
# vim pre_nat.sh

#!/bin/bash

2
3

IPT=$(which iptables)

4
5

pre_nat ()

$IPT -t nat -A PREROUTING -p tcp -s 0/0 -d 200.X.X.2 --dport 22 -j DNAT --to 192.168.X.2:22

pre_nat

Resumindo a regra, todos os pacotes tcp que vierem de qualquer origem com destino o
IP vlido do nosso gateway, na porta 22, vai ser redirecionado para o host interno
192.168.X.2 na porta 22.
O redirecionamento no precisa ser feito para as mesmas portas, o pacote poderia

chegar na porta 22 do IP vlido e ser redirecionado para o host interno na porta 2222
por exemplo.
2 - Ajuste as permisses do script e execute-o:
# chmod 755 pre_nat.sh
# ./limpa.sh
# ./nat.sh
# ./pre_nat.sh
# iptables -n -L -t nat

3 - Agora podemos fazer um teste, o host cliente vai fazer uma conexo ssh para o IP
vlido do gateway da outra rede, se tudo estiver certo, a conexo tem que ser
redirecionado para o host interno:
# ssh root@200.X.X.2

10.14. Tabela Mangle


Pode-se usar o alvo TOS (-j TOS) na tabela mangle para modificar o tipo de servios
nos pacotes que passam pelas regras do Firewall, usando o argumento set-tos TOS que
define a prioridade dos pacotes.
Os valores aceitos so os seguintes:

Espera Mnima - especificado pelo Minimize-Delay, 16 ou 0x10;

Mximo Processamento - especificado pelo Maximize-Throughput, 8, ou 0x08;

Mxima Confiana - especificado pelo Maximize-Reliability, 4 ou 0x04;

Custo mnimo - Especificado pelo Minimize-Cost, 2 ou 0x02;

Prioridade Normal - Especificado pelo Normal-Service, 0 ou 0x00;

Por padro os pacotes TOS trabalham ajustados com prioridade normal (bits TOS
ajustados para 0x00).
1 - Crie um script para dar prioridade para alguns servios na entrada e na sada do
Firewall:
# vim mangle.sh

#!/bin/bash

2
3

IPT=$(which iptables)

4
5

mangle()

# Saida

$IPT -t mangle -A OUTPUT -o ethX -p tcp --dport 80 -j TOS --set-tos 16

# Entrada

10

$IPT -t mangle -A PREROUTING -i ethX -p tcp --sport 25 -j TOS --set-tos 16

11

12

mangle

2 - D permisso de execuo ao script e execute-o:


# chmod 755 mangle.sh
# ./mangle.sh
# iptables -t mangle -n -L

Captulo 11
VPN

11.1 Objetivos

Criao de Tuneis criptografados, para passagem de dados via softwares.

11.1 Introduo
O conceito de VPN (Virtual Private Network) surgiu da necessidade de se utilizar redes
de comunicao no confiveis para trafegar informaes de forma segura. A VPN uma
conexo na qual o acesso e a troca de dados somente so permitidos aos usurios e/ou s
redes que faam parte de uma mesma comunidade de interesse. O objetivo trafegar dados
entre redes WAN de forma a criar um tnel, onde o mesmo possa manter essas informaes
encriptadas.
As redes virtuais privadas baseiam-se na tecnologia de tunelamento, cuja existncia
anterior s VPNs. Essa tcnica consiste em encapsular um protocolo dentro do outro. O
protocolo de tunelamento encapsula o protocolo que ser transportado e o cabealho do
protocolo que encapsulou que vai ter o destino do pacote.
Um dos software que vamos utilizar para construir VPNs, OpenVPN.
O OpenVPN um software capaz de prover o tunelamento entre duas ou mais redes,
atravs de um tnel virtual criptografado.
O outro software que vamos utilizar para construir tneis, com clientes remos, [e o
PPTP (PopTop).
Este ltimo, prov a facilidade de conexo de vrios clientes remotos, para acesso
rede corporativa.
A forma mais simples de configurar o OpenVPN utilizar chaves estticas, onde
criado um arquivo de 2048 bits utilizado para criptografar os dados transmitidos pelo tnel,
essa chave oferece um nvel de segurana mediano, devido a chave ser esttica e seu
algoritmo no mudar a cada conexo, sempre h a possibilidade de um atacante descobrir a
chave. A soluo mais simples e vivel seria trocas as chaves periodicamente fazendo com
que essas tentativas de invaso se tornem ineficazes.
O OpenVPN um dos softwares de cdigo aberto mais utilizados e seguros para
implementao de uma "Virtual Private Network" ou "Rede Virtual Privada". Isto se deve ao
fato de ser seguro, prtico e de fcil implementao.
Uma VPN tem muitas vantagens em ambientes corporativos ou at mesmo
residenciais. Trata-se de uma forma de compartilhar arquivos, impressoras ou at mesmo um
sistema de gesto de forma segura. Antigamente a nica forma de interligar redes era
utilizando link dedicados com endereos IP pblicos, mas o valor da infra-estrutura muitas

vezes no era justificvel. Com o OpenVPN podemos interligar um nmero de filiais


indefinidos, com custos relativamente baixos e podemos utilizar endereos IP pblicos no
fixos, utilizando o servio de DNS dinmico. Sabemos que nenhuma VPN 100% segura, mas
com os servios bem configurados e um firewall totalmente fechado os riscos de invaso so
pequenos.
Uma observao importante que a VPN cria interfaces virtuais no servidor, sendo
que estas interfaces devem estar com endereo IP diferente dos da rede interna. A seguir
mostrarei um esboo de como ficaro os endereos da rede interna e da VPN. No decorrer
desse captulo veremos que implementar uma VPN uma tarefa simples, desde que fique
bem entendido como seu funcionamento.
Matriz:

eth0 - Velox com endereo DNS dinmico: openvpn.no-ip.info;

eth1 - 192.168.0.1 - rede interna;

tun0 - 10.6.0.1 - endereo IP VPN.

Filial:

eth0 - Velox;

eth1 - 192.168.1.1 - rede interna";

tun0 - 10.6.0.2 - endereo IP VPN.

11.2. Instalando e configurando OpenVPN na matriz


Primeiramente vamos fazer a instalao do OpenVPN na matriz:
# apt-get install openvpn

Agora vamos acrescentar o mdulo tun dentro do arquivo /etc/modules para que ele
seja carregado no kernel a cada boot. O mdulo tun responsvel pelas interfaces virtuais
que o OpenVPN cria:
# echo tun >> /etc/modules

Com o OpenVPN instalado e o mdulo tun carregado no kernel, vamos


configurao. Acesse o diretrio /etc/openvpn/, aqui dentro onde sero criados os arquivos
de configurao e a chave esttica.
A chave criada no servidor depois deve ser copiada para todas as filiais que se
conectaro VPN. Pode-se utilizar as chaves de duas formas, a primeira utilizar uma nica
chave para todos os clientes e a segunda utilizar uma chave para cada cliente. Do ponto de
vista de segurana o ideal seria utilizar uma chave para cada cliente. No caso de um
atacante conseguir obter uma das chaves, conseguir somente se conectar a uma nica filial
e no a todas. Uma alternativa para melhorar a segurana e tornar esses ataques ineficazes
fazer a troca das chaves periodicamente.
Abaixo vamos criar a chave:
# openvpn --genkey --secret chave.key

Agora vamos configurao do OpenVPN:


# vim matriz.conf
# Interface da VPN
dev tun
# Endereo IP servidor/filial
ifconfig 10.6.0.1 10.6.0.2
# Protocolo
proto udp
# Porta VPN
port 1194

# Chave esttica
secret /etc/openvpn/chave.key
# Monitoramento da conexo: primeiro nmero ping, segundo restart da vpn em
segundos
keepalive 10 120
# Compresso de dados
comp-lzo
# Mantm a interface tun carregada quando a vpn reiniciada
persist-tun
# Mantm a chave carregada quando a vpn reiniciada
persist-key
# Caso o IP mude, o tnel continua estabelecido
float
# Nvel do log
verb 3
# Informaes de status da conexo
status /var/log/openvpn/matriz-staus.log
# Arquivo de log
log-append /var/log/openvpn/matriz.log
# Criando rotas
# up /etc/openvpn/rotas.up - Verses anteriores
# Criacao da rota para a rede cliente
route 192.168.0.0 255.255.255.0
# Apagando rotas
# down /etc/openvpn/rotas.down Verses anteriores
Depois de ajustar o arquivo de configurao criaremos os arquivos de log do
OpenVPN, os logs so muito importantes para detectar algum erro de conexo, ver
informaes dos clientes, entre outras informaes.
# mkdir /var/log/openvpn
# touch /var/log/openvpn/matriz-status.log
# touch /var/log/openvpn/matriz.log

Agora vamos iniciar a VPN:


# /etc/init.d/openvpn start

Em caso de alguma mensagem de erro ou aparecer "Failed" ao iniciar a VPN, pode


consultar o log:
# tail -f /var/log/openvpn/matriz.log

11.3 Instalando e configurando OpenVPN na filial


Agora vamos fazer a instalao e configurao do OpenVPN na filial, a configurao
praticamente

igual,

devem

ser

observadas

algumas

configuraes

mnimas.

Primeiramente vamos comear instalando o OpenVPN:


# apt-get install openvpn

Igualmente feito na matriz, devemos adicionar o mdulo tun dentro do arquivo


/etc/modules.
# echo tun >> /etc/modules

Agora devemos copiar a chave esttica criada no servidor para dentro de


/etc/openvpn/, com a chave copiada vamos configurao do OpenVPN:
# vim filial.conf
# Endereo IP servidor
remote openvpn.no-ip.info
# Interface da VPN
dev tun
# Endereo IP filial/servidor
ifconfig 10.6.0.2 10.6.0.1
# Protocolo
proto udp
# Porta VPN
port 1194
# Chave esttica

secret /etc/openvpn/chave.key
# Monitoramento da conexo, primeiro nmero ping, segundo restart da VPN
keepalive 10 120
# Compresso de dados
comp-lzo
# Mantm a interface tun carregada quando a VPN reiniciada
persist-tun
# Mantm a chave carregada quando a VPN reiniciada
persist-key
# Caso o IP mude o tnel continua estabelecido
float
# Nvel do log
verb 3
# Informaes de status da conexo
status /var/log/openvpn/filial-staus.log
# Arquivo de log
log-append /var/log/openvpn/filial.log
# Criando rotas
# up /etc/openvpn/rotas.up verses anteriores
# Criacao da rota para a rede servidora
route 192.168.0.0 255.255.255.0
# Apagando rotas
# down /etc/openvpn/rotas.down verses anteriores

Vamos agora criar os arquivos de log:


# mkdir /var/log/openvpn
# touch /var/log/openvpn/filial-status.log
# touch /var/log/openvpn/filial.log

Agora s iniciar a VPN:


# /etc/init.d/openvpn start

A matriz e a filial esto OK!

Se no tiver nenhum firewall no servidor da matriz e da filial, j pode dar um ping ou


acessar um compartilhamento na mquina da outra rede. Como eu duvido que
ningum que tem um pouco de conhecimento em segurana colocaria uma VPN no ar
sem um firewall, vamos criar algumas regras para liberar a conexo da VPN e o
trfego do tnel.

11.4 Liberando portas no firewall

Bem, como foi dito no incio do artigo, nenhuma VPN 100% segura, devemos
configurar com cuidado todos os servios necessrios para ter uma VPN estvel e sem riscos,
um firewall o mnimo de segurana necessria.
Vamos criar algumas regras de firewall liberando a conexo da VPN e o trfego do
tnel. Estou presumindo que o firewall da matriz e filial esto com o policiamento da chains
INPUT e FORWARD como drop.

Firewall matriz:
# Liberando porta de conexo VPN
iptables -t filter -A INPUT -i ppp0 -p udp --dport 1194 -j ACCEPT
# Liberando trfego do tnel
iptables -t filter -A FORWARD -i tun0 -j ACCEPT
iptables -t filter -A INPUT -i tun0 -j ACCEPT

Firewall filial:
# Liberando porta de conexo VPN
iptables -t filter -A INPUT -i ppp0 -p udp --dport 1194 -j ACCEPT
# Liberando trfego do tnel
iptables -t filter -A FORWARD -i tun0 -j ACCEPT
iptables -t filter -A INPUT -i tun0 -j ACCEPT

11.5 Instalando e configurando o PPTP (servidor e clientes).


Para instalarmos o pptpd server, antes precisamos adquirir o repositrio de pacotes
necessrios, fornecido pelo prprio fabricante do pacote:
wget http://poptop.sourceforge.net/yum/stable/rhel5/pptp-releasecurrent.noarch.rpm
Em seguida, instalamos o pacote:
#rpm -ivh pptp-release-current.noarch.rpm

Aps a concluso da instalao do pacote, e eposterior atualizao do repositrio,


poderemos proceder com a instalao dos pacotes necessrios:
#yum update
# yum install ppp ppp-devel pptpd

Para configurarmos o poptop (pptpd server), basta editar os seguintes


arquivos e acrescentar as linhas:
#vi /etc/pptpd.conf
localip

192.168.2.0.X # IP do servidor remoto

remoteip

192.168.2.100-155 # IPs que sero fornecidos aos hosts remotos

# vi /etc/ppp/options.pptpd
name pptpd
refuse-pap
refuse-chap
refuse-mschap
require-mschap-v2
require-mppe-128
ms-dns 8.8.8.8
ms-dns 8.8.4.4

ms-wins 192.168.2.254
proxyarp
debug
lock
nobsdcomp
novj
novjccomp
nologfd

E por fim, o arquivo /etc/ppp/chap-secrets, para configurao dos usurios e senhas.

#vim /etc/ppp/chap-secrets
# Client

Server

secret

IP

marcio

teste123

Aps a configurao, incie o pptp server:


#/etc/init.d/pptpd start

Para configurar a conexo no windows, basta seguir os passos abaixo:


1) Painel de controle
2) Central de rede e compartilhamento
3) Configurar uma nova conexo ou rede
4) Conectar a um local de trabalho > Avanar
5) Usar minha conexo com a Internet (VPN)
6) Informar IP Remoto e nome da conexo (server VPN) > Avanar
7) Informar nome do usurio e senha > Conectar
Obs.: No se esquecer de liberar a porta 1723 (INPUT), no firewall.

Captulo 12
Criptografia de Disco com Luks e DM
Crypt

12.1. Objetivos

Entender o sistema de criptografia mais utilizado para Linux

Compreender como implementar a criptografia em um disco ou partio

Configurar para que o sistema criptografado seja inicializado automaticamente


durante a inicializao

12.2. Porque criptografar o disco


Quando falamos de segurana da informao, podemos usar vrias tcnicas e
ferramentas para evitar intruses remotas e locais atravs do terminal. Mas ns devemos
pensar em outras possibilidades alm do acesso ao terminal propriamente dito.
Como podemos garantir a segurana do nosso servidor se ele for roubado? E se
algum conseguir clonar o HD? E se roubarem o nosso notebook?
Nessas situaes no teremos o que fazer, o ladro (invasor) vai ter acesso a todas as
nossas informaes.
O que podemos fazer para evitar esse tipo de situao?
Existem duas coisas que podemos fazer:
A primeira ter uma boa proteo fsica aos seus servidores, colocando acessos
atravs de cartes, acessos biomtricos, salas cofres ou pelo menos que a sala fique trancada
e somente pessoas de confiana tenham acesso a eles.
O segundo ponto criptografar o disco, ou melhor dizendo, colocar uma criptografia
nas parties onde ficam as informaes confidencias da empresa.

12.3. Como fazer essa criptografia


Para trabalharmos com criptografia de discos e parties, devemos adotar
primeiramente um mtodo de criptografia. Um mtodo que muito recomendado em
sistemas GNU/Linux o LUKS, que significa Linux Unified Key Setup.
O LUKS foi desenvolvido para implementar uma padro nico de criptografia de
discos, pois outras solues no mantinham uma padronizao de criptografia, o que causava
grandes dores de cabeas aos usurios quando precisavam fazer alguma migrao de verso
ou migrao de ferramentas.

12.3.1. Por que o LUKS?

Por que o LUKS um mtodo padronizado de implementar criptografia de discos.

12.3.2. Qual tipo de padro?


O LUKS se baseia em uma documentao escrita por Clemens Fruhwirth chamada
"TKS1 - An anti-forensic, two level, and iterated key setup scheme". Pode-se dizer que o
LUKS a implementao de prova de conceitos dessa documentao. Para implementarmos
o LUKS em um sistema Linux utilizaremos as seguintes ferramentas:

dm-crypt: o dm-crypt um subsistema de criptografia de discos em kernel


Linux verso 2.6. Ele faz parte do infraestrutura device-mapper (sistema de
mapeamento de dispositivos de blocos). O dm-crypt foi desenvolvido para
trabalhar com vrios modos de criptografia, como CBC, ESSIV, LRW e XTS.
Como o dm-crypt reside na camada de kernel, ele precisa de front-ends para
criar os dispositivos criptografados e manuse-los. Esses front-ends so o
cryptsetup e cryptmount.

cryptsetup: o cryptsetup usado para configurar a criptografia nos dispositivos


utilizando o dm-crypt. Ele possui comandos para trabalhar com e sem o LUKS.

cryptmount:

comando

usado

para

montar/desmontar

dispositivos

criptografados. Ele permite que usurios montem dispositivos criptografados


sem a necessidade do superusurio.

12.3.3. O que a norma da segurana diz sobre criptografia de disco


Em relao ao acesso fsico, a norma ABNT NBR ISO/IEC 27002:2005 diz no item
9.1.1, que convm que sejam utilizados permetros de segurana (barreiras tais como
paredes, portes de entrada controlados por carto ou balces de recepo com
recepcionistas) para proteger as reas que contenham informaes e instalaes de
processamento da informao.
Sobre a criptografia a norma diz no item 12.3.1, na letra C, que convm o uso de
criptografia para a proteo de informaes sensveis transportadas em celulares e PDAs,

mdias removveis ou mveis, dispositivos ou linhas de comunicao.


Essa criptografia feita na instalao do sistema operacional ou depois que ele est
instalado?
Quando trabalhamos com criptografia de discos, podemos escolher se desejamos
fazer na instalao do sistema ou fazer depois que o sistema j est instalado. As
distribuies Debian e Red Hat tem essa opo de fazer a criptografia logo na instalao.
Como ser o nosso trabalho?
No nosso caso, estamos supondo que estamos trabalhando em um servidor que j
estava instalado, ento temos alguns procedimentos a seguir para fazer esse trabalho. Se
vamos fazer em um servidor que j est em produo, qual o primeiro passo a ser feito?
Se vamos criptografar uma partio que j est montada e j contm dados, vamos
ter que fazer um backup, pois na construo do sistema de criptografia os dados sero
perdidos. Caso seja uma partio que ainda no contenha dados esse procedimento mais
tranquilo.
Para o nosso ambiente, vou supor que vocs tem uma partio sobrando, no caso no
meu exemplo, vou usar a /dev/sda10.
Para trabalharmos com o sistema de criptografia dm-crypt precisamos que os
mdulos relacionados a ele estejam ativados:

# modprobe dm_crypt
# modprobe dm_mod
#modprobe aes_x86_64 (para arq 64 bits)
#modprobe sha256
#cat /proc/crypto

Com os mdulos carregados, podemos instalar a ferramenta cryptsetup:


# aptitude install cryptsetup
ou para RedHat
#yum install cryptsetup

Com o cryptsetup instalado, podemos configurar como ser utilizada a criptografia


em nossa partio:
dd if=/dev/urandom of=/dev/sdxx

# cryptsetup -y -v debug create secretfs /dev/sdxx


Enter passphrase:

Parmetros bsicos do cryptsetup:

-y ou --verify-passphrase: faz a checagem da senha digitada.

create:opo para criao da nova partio

secretfs: nome da partio em /dev/mapper

-v: (verbose) para andamento de processo

--debug: para informaes detalhadas de depurao

Nesse momento, outros mdulos de criptografia foram ativados:


# lsmod | grep aes
# cat /proc/crypto

12.4. Ativando o servio e dando os ltimos retoques


Para acessarmos o dispositivo, temos que definir um sistema de arquivos para ele:
# mkfs.ext3 /dev/mapper/secretfs

Agora o nosso dispositivo est pronto para ser usado. Vamos definir um diretrio
onde ele ser montado:
# mdkir /documentos
# mount /dev/mapper/crypt1 /documentos
# ls -l /documentos
# mount | grep documentos

O que devemos fazer para a partio ser montada na inicializao do sistema?


Dessa maneira a nossa partio no vai ser montada na inicializao do sistema. E
quando estamos falando parties criptografadas, no basta apenas acrescentar a partio
ao /etc/fstab. Ele precisa ser configurado em mais um arquivo, que o /etc/crypttab.
Vamos configurar o dispositivo no arquivo /etc/crypttab:
# vim /etc/crypttab
# <target name> <source device> <key file> <options>
secretfs

/dev/sdxx

none

luks

Notem que a key_file est definida como none. Existe a possibilidade de criar um
arquivo ou um dispositivo removvel com a chave para esse dispositivo ser iniciado. No nosso
caso, a senha ser solicitada na inicializao do sistema.
Agora seguindo os moldes padro de sistemas Linux, temos que colocar esse
dispositivo no /etc/fstab:
# vim /etc/fstab
/dev/mapper/secretfs /documentos ext3 defaults 0 2

Agora podemos fazer o teste reinicializando o sistema:


# reboot
Logo na inicializao do sistema ser pedido para digitar a senha do ponto de
montagem criptografado.

Captulo 13
Implementao de Regras de Acesso
com SELinux

13.1 Objetivos

O SELinux

O comando semanage

Os comandos Chcon e Restorecon

Variveis booleanas

O comando Semodule

Auditoria e logs

13.2 O SELinux
O Security-Enhanced Linux SELinux - foi desenvolvido pela Agncia Nacional de Segurana
dos EUA (NSA). Logo no incio, seu objetivo principal era tornar-se um sistema operacional
capaz de fornecer controles avanados de acesso para os rgos militares dos Estados
Unidos.
Porm, com o passar do tempo, a NSA identificou que seria mais lgico aprimorar um
sistema de controle de acesso obrigatrio, e adicion-los a um sistema operacional j
existente.
A opo pelo GNU/Linux surgiu devida facilidade e flexibilidade de incorporar tal
framework ao Kernel do sistema. Logo depois, sistemas que traziam a plataforma Unix,
tambm
usufruram
desta
to
poderosa
ferramenta.
Altamente implementado e refinado em cima da arquitetura MAC (Mandatory Access
Control), provendo maior segurana a arquivos, diretrios, processos, sistema de arquivos,
entre
outros
objetos,
atravs
de
regras
providas
pelo
SELinux.
Vale ressaltar, que este nvel de segurana vai alm da arquitetura DAC (Discretionary
Access Control) que est associada permisso de arquivos e ACLs (Access Control Lists)
do GNU/Linux, como exemplo, as permisses MAC podem ser aplicadas at ao usurio root,
limitando
aes
do
mesmo.
Em um conceito prtico, imaginemos que a conta de sistema associada ao servio HTTP foi
comprometida, o SELinux atravs de regras pr estabelecidas, limita este comprometimento
apenas ao servio HTTP, impossibilitando o comprometimento de outros servios, ou at
mesmo,
do
prprio
sistema
operacional.
Depois

deste

breve

conceito,

vamos

prtica.

Lembrando que mais informaes do SELinux, podem ser obtidas na Wiki do Projeto:

http://selinuxproject.org/page/Main_Page

Ou, na pgina oficial da NSA:

http://www.nsa.gov/research/selinux

13.2.1 Modo de operao do SELinux (conceito e prtica)


Basicamente, o SELinux pode operar em trs tipos diferentes, que so:

Enforcing As regras do SELinux esto aplicadas, e est sendo gerado Logs de todas
as operaes do mesmo;
Permissive As regras do SELinux esto desativadas, porm, est gerando Logs de
todas as operaes do mesmo (til para Troubleshoot de aplicaes);
Disabled - As regras e os Logs do SELinux esto completamente desativados.
Visualizando o status do SELinux:

#sestatus

Sada do comando:
SELinux status:
SELinux mount:
Current mode:
Mode from config file:
Policy version:
Policy from config file:

enabled
/selinux
enforcing
enforcing
24
targeted

Caso se queira visualizar apenas o Current mode do SELinux, utilize o comando:

#getenforce
Sada do comando:
Enforcing

Perceba que este comando traz apenas o modo de operao do SELinux.


Para alterarmos o modo de operao temporrio do SELinux (apenas Enforcing e
Permissive), utilizaremos o seguinte comando:

#setenforce MODO_DE_OPERAO

Ex.:
# setenforce permissive
Logo, visualize o status do SELinux:
# sestatus
SELinux status:
SELinux mount:
Current mode:
Mode from config file:
Policy version:
Policy from config file:

enabled
/selinux
permissive
enforcing
24
targeted

Obs.: Para desabilitar, ou alterar, o 'current mode' do SELinux por completo,


necessrio editar o arquivo de configurao do SELinux (/etc/selinux/config) e
alterar a varivel:

'SELINUX='.
* Apenas como fonte de informao:

Em alguns casos com o SELinux habilitado, podemos nos deparar com servios que,
por algum motivo, no esto funcionando.
Alguns administradores, simplesmente desativam o SELinux por completo (Modo
Disabled), para resolver o "problema".
Porm, para um Troubleshoot eficaz, no necessrio desativar o SELinux por
completo comprometendo a segurana do sistema, e sim, deix-lo em modo
"Permissive"; com isso, as regras sero desativadas, porm, todo registro das
atividades (logs) continuaro sendo armazenadas.

13.2.2 Contextos de segurana


Em uma explicao bsica, um contexto um valor de dado assumido pelos objetos de uma
classe.
Nome, Idade e Peso, so exemplos de contextos do objeto "Pessoa". Cor, Categoria e Modelo,
so possveis contextos do objeto "Carro". No caso, os contextos da arquitetura DAC so:
Tipo, Dono, Grupo e Outros.
Ex.:

# ls ld /etc
Sada do comando:
drwxr-xr-x

Onde:

d= Diretrio (Tipo)
rwx= Permisso para o dono do arquivo (Dono)
r-x= Permisso para o grupo do do arquivo (Grupo)
r-x= Permisso para os outros objetos do sistema (Outros)

No caso da arquitetura MAC, os contextos mudam de caractersticas, conforme: Usurio,


Papel, Tipo e Nvel.
Onde:

Usurio (user_u) O campo usurio, indica o nome do usurio do SELinux, por


exemplo, o usurio "system_u", indica processos, arquivos de configurao e daemons
do sistema.
Papel (role_r) O campo papel, uma forma de agrupar diferentes permisses a um
determinado usurio (uma espcie de grupo).

Tipo (type_t) O campo tipo (tambm conhecido como domnio), indica qual
permisso primria de determinado objeto do SELinux, essa a primeira etapa de
verificao de permisso do sistema MAC.
Nvel (s*:c*) O campo nvel, indica em qual categoria determinado objeto se
encontra, com relao segurana. O mesmo utiliza a politica MCS/MLS (MultiCategory Security/ Multi-Level Security).
Por exemplo, o nvels0:c0 indica um objeto Confidencial para todos os que possurem o
mesmo nvel.

Na prtica, com o mesmo diretrio /etc:

# ls Zd
Sada do comando:
System_u:object_r:etc_t:s0

Onde:

system_u =Usurio SELinux dono do objeto


object_r = Papel (ou papel) do SELinux
etc_t = Domnio (ou tipo) do SELinux
s0 = Nvel de segurana do SELinux

13.2.3 Visualizando contextos MAC nos objetos do sistema


Para visualizar todos os processos que esto rodando no sistema, juntamente com os
contextos do SELinux, vamos utilizar o comando abaixo:

# ps auxZ

Perceba que apenas adicionando a opo "Z" no comando ps, j suficiente para
visualizarmos os contextos de todos os processos do SELinux. Isto vale para outros comandos
tambm, como por exemplo, o comando ls.
Vamos visualizar o contexto de um arquivo ou diretrio qualquer do sistema:

# ls Z /boot
Sada do comando:

system_u:object_r:boot_t:s0

Isso vale tambm para o comando id, que nos traz informaes de um determinado usurio:
Ex.:
# id Z
Sada do comando:
unconfined_u: unconfined_r: unconfined_t:s0-s0:c0.c1023ls

Perceba que neste caso, todo o contexto est definido como: unconfined_*
...Isto indica que o SELinux no ter influncia alguma no objeto correspondente.

13.3 O comando Semanage


Para um bom entendimento do SELinux, necessrio explorar o mesmo por completo, o
comando semanage traz uma srie de opes para que isso acontea.
Primeiro, devemos instalar o conjunto de pacotes, que traz (alm de vrios outros) o
comando Semanage:

# yum install policycoreutils-python


Com o Semanage instalado em nossa mquina, vamos listar todos os usurios, nvel de
MLS/MCS e papis (roles) do SELinux:

# semanage user l
Onde: -l= list
Sada do comando:
Labeling
MLS/
SELinux User
Prefix

MLS/
MCS Level

git_shell_u

s0

guest_u
root
staff_u

user
user
user

user
s0
s0
s0

s0

MCS Range

SELinux Roles
git_shell_r

s0
guest_r
s0-s0:c0.c1023 staff_r sysadm_r system_r unconfined_r
s0-s0:c0.c1023 staff_r sysadm_r system_r unconfined_r

sysadm_u
user
s0
s0-s0:c0.c1023 sysadm_r
system_u
user
s0
s0-s0:c0.c1023 system_r unconfined_r
unconfined_u user s0 s0-s0:c0.c1023 system_r unconfined_r
user_u user s0 s0 user_r
xguest_u user
s0 s0 xguest_r

Pergunta: "ual a funo de cada usurio? Permisso? Acessos e etc...?


Vamos a um overview rpido e objetivo de cada um:

guest_u: Este perfil usado para usurios que precisam ser rigorosamente controlados. O guest_u s
pode fazer login usando o terminal. O mesmo no tem acesso a recursos de rede, programas setuid,
setgid, su, sudo e interface grfica.
xguest_u: Este perfil idntico do 'guest_u'. A exceo que 'xguest_u', os usurios s conseguem
fazer login na interface grfica.
user_u: Assemelha a um usurio comum sem privilgios administrativos. Este usurio pode fazer
login usando interface grfica e terminal, tem acesso aos recursos da rede, mas no pode usar
programas setuid e setgid.staff_u: Este usurio idntico ao 'user_u', exceto que o 'staff_u' pode
acessar os programas setuid e setgid. O 'staff_u' tambm pode fazer STAT em todos os processos do
sistema, entre outros pequenos privilgios extras, em comparao com 'user_u'.
sysadm_u: Este usurio projetado para realizar login como root. Muito utilizado em ambientes
multi nvel de segurana, onde no h o objeto 'unconfined_u'.
unconfined_u: O 'unconfined_u' , em muitas vezes, isentos de regras do SELinux.
Usurios reais do GNU/Linux, exceto o usurio root, no devem ser mapeados para o grupo de
usurios 'unconfined_u'. Em muitos cenrios com que os usurios no so confinados, o mesmos
criam um buraco na segurana do sistema operacional.
system_u: Este perfil de usurio do SELinux est reservado para o sistema. Os usurios do
GNU/Linux no devem ser mapeado para o usurio SELinux 'system_u', geralmente este usurio
esta atrelado a processos, configuraes e daemons.

Agora que j sabemos as reais permisses dos usurios do SELiux, vamos listar todos os
usurios do sistema que esto atrelados aos usurios e permisses do SELinux:

# semanage login l
Sada do comando:
Login Nam
SELinux User MLS/MCS Range
__default__unconfined_u s0-s0:c0.c1023
root unconfined_u s0-s0:c0.c1023
system_u system_u s0-s0:c0.c1023

Apenas como fonte de conhecimento, vamos criar um usurio chamado "teste", e referenci-lo ao usurio
"guest_u" do SELinux:
# useradd c "Usurio Teste" d /home/teste m k /etc/skel s /bin/bash teste
# passwd teste

# semanage login a s guest_u teste


Onde:
-a = add
-s = selinux user

Logo, liste os logins novamente:


# semanage login l

Login Name SELinux User MLS/MCS Range


__default__ unconfined_u s0-s0:c0.c1023
root unconfined_u s0-s0:c0.c1023
system_u system_u s0-s0:c0.c1023
teste guest_u s0

Perceba que agora, o usurio "teste", est atrelado ao usurio do SELinux "guest_u", obtendo
automaticamente as mesmas permisses do mesmo.
Tente logar na rea grfica com o usurio "teste". Depois tente logar com o mesmo usurio,
em algum terminal.
Perceba que as permisses do usurio "guest_u" do SELinux, no permitem o login na rea
grfica, somente no terminal.
Agora, experimente atrelar o usurio "teste" ao usurio "xguest_u". Neste momento, o
usurio "teste" tem as devidas permisses para acessar a rea grfica.
Para remover o usurio "teste" das diretivas do SELinux, basta executar o comando:

# semanage login -d teste


Onde:-d= delete
Continuando com o comando semanage, vamos listar todos os contextos aplicados no sistema:

# semanage fcontext l
Assim, fica muito mais fcil saber se determinado objeto ou servio, est atrelado s politicas MAC do
SELinux.
Mais informaes sobre o comando semanage:
# semanage - -help
13.4 Os comandos Chcon e Restorecon
Diversas vezes, nos deparamos com problemas de permisso de contextos no SELinux, isto
acontece frequentemente, ainda mais em servios que tm uma alta rotatividade de objetos,
como File Servers e FTP.
Para resolver este problema, utilizaremos o comando chcon, sua funo nada mais do que
alterar contextos em objetos.
Para os nossos testes com o chcon, vamos criar um arquivo denominado "teste.txt" dentro do
diretrio /etc:

# touch /etc/teste.txt
Verifique os contextos deste arquivo:
# ls -Z /etc/teste.txt
Sada do comando:
-rw-r--r--. root root unconfined_u:object_r:etc_t:s0 /etc/teste.txt
Perceba que o usurio est definido como "unconfined_u". Imagine agora, que precisamos
alterar (por algum motivo qualquer) para o usurio "user_u". Vamos utilizar o seguinte
comando:

# chcon -u user_u /etc/teste.txt


Onde:-u= user
# ls -Z /etc/teste.txt
Sada do comando:
-rw-r--r--. root root user_u:object_r:etc_t:s0 /etc/teste.txt
Perceba que, agora o arquivo est com o contexto de usurio definido para "user_u".
Caso precisamos (por algum motivo qualquer) alterar o domnio (type) deste objeto, para "tmp_t":
# chcon -t tmp_t /etc/teste.txt

Onde:-t= type
# ls -Z /etc/teste.txt
Sada do comando:
-rw-r--r--. root root user_u:object_r:tmp_t:s0 /etc/teste.txt
Pronto, o arquivo est com seu domnio alterado, assim, todos os objetos que tem acesso ao
domnio "tmp_t", tero acesso ao arquivo/etc/teste.txt.
Em um ltimo teste do comando chcon, imaginamos que voc queira clonar o contexto de
outro objeto?! O chcon tambm faz isso:

# chcon --reference /var /etc/teste.txt


# ls -Z /etc/teste.txt
Sada do comando:
-rw-r--r--. root root system_u:object_r:var_t:s0 /etc/teste.txt

Obs.: Caso voc queira aplicar contextos recursivamente, basta inserir a opo "-R" no
comando chcon.
Em muitos casos, queremos deixar o objeto de acordo com as regras do domnio (type) no
qual o mesmo est armazenado. Poderamos utilizar o chcon e copiar todos os contextos, ou
utilizar um comando que faz exatamente isso. Este comando o restorecon, vamos v-lo em
detalhes:

# restorecon -F /etc/teste.txt
Com este comando, o arquivo "teste.txt" herdar todos os contextos do diretrio /etc (local
onde o mesmo est armazenado). til, no?! =)
Os comandos chcon e restorecon, so extremamente teis e complexos, para um maior
detalhamento dos mesmos, leia a Man Page oficial:

# man chcon
# man restorecon
13.5 Variveis booleanas
As variveis booleanas nada mais so, do que ligar(1) ou desligar(0) determinada ao (seja
temporrio ou no).
Um exemplo seria, imaginamos que determinada aplicao necessita de acesso a gravao
no sistema, caso no existisse as variveis booleanas, teramos que reescrever o cdigo do
SELinux para permitir tal ao!
As mesmas so extremamente teis para qualquer um que queira administrar o SELinux.

Para uma prtica eficiente com as variveis booleanas, s lembrar dos termos 0 e 1, ou
para ficar mais fcil: n0 e s1m. =)
Vamos mais um case!
Vamos instalar um servio de FTP (apenas de exemplo), e gerenciar as variveis booleanas:
# yum install vsftpd
E, adicionar aos nveis de execuo:
# chkconfig --level 2345 vsftpd on
Agora, vamos reiniciar o servio:
# service vsftpd restart
Agora que j temos o servio devidamente instalado, vamos gerenciar as variveis booleanas.
Primeiro, vamos list-las:
# getsebool -a
Onde:-a= all
- Pergunta: Apenas com o nome das variveis, fica difcil saber para que cada uma serve?
- Resposta: Para um maior detalhamento, vamos utilizar o semanage novamente:
# semanage boolean -l
Onde:-l= list
Perceba que agora, temos os nomes das variveis, e tambm uma breve descrio de cada
uma delas.
Vamos filtrar as variveis para tudo que atrela-se ao servio FTP:
# semanage boolean -l | grep ftp
Sada do comando:

ftp_home_dir (off , off) Allow ftp to read and write files in the user home
directories
tftp_anon_write (off , off) Allow tftp to modify public files
used for public file transfer services.
allow_ftpd_full_access (off , off) Allow ftp servers to login
to local users and read/write all files on the system, governed by DAC.
allow_ftpd_use_cifs (off , off) Allow ftp servers to use cifs
used for publicfile transfer services.
allow_ftpd_use_nfs (off , off) Allow ftp servers to use nfs
used for public file transfer services.
allow_ftpd_anon_write off , off) Allow ftp servers to upload files,
used for public file transfer services. Directories must be labeled
public_content_rw_t.
ftpd_use_passive_mode (off , off) Allow ftp servers to use bind to all
unreserved ports for passive mode
ftpd_connect_db(off , off) Allow ftp servers to use connect to mysql
database
httpd_enable_ftp_server (off , off) Allow httpd to act as a FTP server by
listening on the ftp port.

Por padro, o servio VSFTPD no permite o total gerenciamento de arquivos para o usurio
anonymous, isso devido s restries do SELinux!
Caso voc queira dar tal permisso para o usurio anonymous (ou outros usurios), basta
setar a varivel: allow_ftpd_full_access
Com ela possvel dar controle total a qualquer usurio que conecte no FTP (lembrando que
esse apenas mais um teste).
- Pergunta: E como fazer isso?
- Resposta: Simples, utilizaremos o comando setsebool.
# setsebool -P allow_ftpd_full_access 1

Onde:
-P = Indica que ser aplicada alterao permanente, sem a opo '-P' no prximo
reboot, tudo ser restaurado para o seu padro!
1 = Ativa a varivel (lembre-se: s1m e n0)

Pronto! Seu servidor FTP est dando controle total para qualquer usurio. Feliz agora?!
Bom, eu no ficaria, pois estamos abrindo um furo na segurana do sistema. Portanto, vamos
desativar a varivel booleana correspondente:
# setsebool -P allow_ftpd_full_access 0
Onde: 0= Desativar a varivel.

Lembre-se: As variveis booleanas so extremamente importantes para a boa administrao


do SELinux, liste e teste cada uma delas, assim tudo ficara mais fcil. ;)
13.6 O comando Semodule
Assim, como o prprio sistema GNU/Linux, o SELinux opera em formato modular, ou seja,
caso precise adicionar excees, ou aprimoramento, de regras no SELinux para
determinadas aplicaes, como por exemplo um MTA, ou um servidor Web, no ser
necessria a recompilao do prprio sistema SELinux.
E sim, adicionar um cdigo externo (mdulo) que indique tal ao. Este mdulo pode ser
fornecido tanto pela equipe que administra a aplicao, quanto construda pelo prprio
administrador do SELinux.
Obs.: No confunda os mdulos do SELinux com as variveis booleanas. Os mdulos so
funes acrescentadas nas regras de determinada aplicao, j as variveis booleanas, so
permisses referentes comunicao entre aplicao e objetos do sistema.
O comando que gerencia tais mdulos no SELinux, o Semodule, e sua utilizao muito
simples.
Para listar os mdulos do SELinux:

# semodule -l

Onde:-l= list
Sada do comando (resumida):

abrt 1.2.0
accountsd 1.0.0
ada 1.4.0
afs 1.5.3
aiccu 1.0.0
aide 1.5.0
aisexec 1.0.0
amanda 1.12.0
amavis 1.10.3
amtu 1.2.0
apache 2.1.2

apcupsd 1.6.1
arpwatch 1.8.1
asterisk 1.7.1
audioentropy 1.6.0
automount 1.12.
Caso precisemos desabilitar determinado mdulo, como por exemplo, o mdulo do Asterisk,
utilizaremos a seguinte sintaxe do comando semodule:
# semodule -d asterisk
Onde:-d= disable
Agora, vamos listar os mdulos, filtrando apenas o mdulo do Asterisk:
# semodule -l | grep asterisk
Sada do comando:

asterisk1.7.1 Disabled

Perceba que este mdulo est presente, porm sem qualquer funcionalidade.
Para remover o mdulo por completo, utilize o comando:
# semodule -r asterisk
Onde:-r= remove
# semodule -l
Listando novamente os mdulos, perceba que o mesmo no se encontra mais na listagem.
- Pergunta: E se eu precisar do mdulo do Asterisk novamente, o que eu fao?
- Resposta: Por padro, os arquivos de mdulo do SELinux terminam com extenso ".pp"
(Package Policy), portanto, para instalar um mdulo no sistema SELinux, necessrio ter tal
arquivo em mos.
Simples, no?! Agora basta achar tal arquivo ".pp" do Asterisk.
Por padro, o diretrio/usr/share/selinux/targeted/contm diversos arquivos de pacotes de
polticas (*.pp).

Estes arquivos esto inclusos no pacote "selinux-policy", e so utilizados para construir o


arquivo de poltica.
Em diversas distribuies, como o CentOS Red Hat, tais arquivos podem estar compactados,
porm, a descompactao no se faz necessria para instalao.
Como estamos trabalhando com mdulos defaults, o arquivo ".pp" do Asterisk est
armazenado neste diretrio, portanto, vamos reativ-lo:
# cd /usr/share/selinux/targeted/# semodule -i asterisk.pp.bz2

Onde:-i= Install
# semodule -l | grep asterisk
Perceba que no precisamos habilitar o mdulo novamente, apenas com a instalao do
mesmo, ele j fica em modo enable.

Caso o mdulo no fique em modo enable basta executar o comando semodule com a opo
"-e", seguida do nome do mdulo, no nosso caso, seria o "asterisk".
Para mais opes do comando semodule basta executar:
# man semodule
13.7 Auditoria e logs
Com relao auditoria e depurao de Logs, o SELinux lida muito bem com isso, a comear
pelo pacote Setroubleshoot, a juno de diversos aplicativos uma "Me" para qualquer
administrador SELinux. A ferramenta demonstra os alertas de AVC do SELinux, e ainda diz
qual comando pode corrigir o mesmo.
Falando em AVC, sigla para Access Vector Cache (e no para Acidente Vascular Cerebral),
que nada mais do que alertas de acessos bloqueados sejam elas de aplicao ou usurios
do sistema.
Primeiramente, vamos instalar o pacote "Setroubleshoot".
Obs.: Caso tenha interface grfica no servidor, o mesmo ir instalar um pequeno utilitrio,
que alerta toda vez que um AVC acontecer.
# yum install setroubleshoot

Antes de qualquer coisa, vamos gerar o nosso prprio AVC.

Vamos aos testes:


Instale o servio HTTP no Servidor:
# yum install y httpd

Abra o arquivo de configurao:


# vim /etc/httpd/conf/httpd.conf
Altere a seguinte linha do arquivo: Listen 80
Para:
Listen 8888

Logo, reinicie o servio HTTP:


# service httpd restart
Pronto, nosso AVC foi gerado com xito. =)
O primeiro comando para verificao de AVC's, o ausearch
# ausearch m avc | grep httpd

Onde:-m= message

Sada do comando (resumida):

type=AVC msg=audit(1344678620.633:26191): avc: denied { name_bind } for pid=9429


comm="httpd" src=8888 scontext=unconfined_u:system_r:httpd_t:s0
tcontext=system_u:object_r:port_t:s0
tclass=tcp_socket

Perceba que a sada do comando demonstra claramente, o motivo dele ter alarmado tal AVC.
O que aconteceu pela sada do log, mas agora eu quero que a porta 8888 seja padro do
servio HTTP, ir continuar gerando AVC's?
- Resposta: No. Porm para que isso acontea, necessrio informar ao SELinux, que a
porta padro do servio HTTP mudou.

Existem duas maneiras de se fazer isso, uma utilizar o comando semanage com a opo
"port", a outra o que iremos ver abaixo.
Primeiro, vamos utilizar o comando selatert para analisar os logs:

# sealert a /var/log/audit/audit.log | grep httpd


Onde:
-a= Analyze File
/var/log/audit/audit.log= O arquivo que ser analisado

Sada do comando (resumida):


SELinux is preventing /usr/sbin/httpd from name_bind access on the tcp_socket.
If you want to allow /usr/sbin/httpd to bind to network port 8888
where PORT_TYPE is one of the following: ntop_port_t, http_cache_port_t, http_port_t,
puppet_port_t, jboss_messaging_port_t, jboss_management_port_t.
If you believe that httpd should be allowed name_bind access on the tcp_socket by default.
# grep httpd /var/log/audit/audit.log | audit2allow -M mypol

Analisando a sada, perceba que alm de detalhar a possvel causa do AVC, ele sugere (caso
voc realmente queira), indicar a alterao de porta padro do servio HTTPD para 8888 ao
SELinux.
Vamos utilizar o comando que ele sugeriu:
# grep httpd /var/log/audit/audit.log | audit2allow -M mypol
Onde:
grep httpd /var/log/audit/audit.log= Indica que iremos filtrar a palavra httpd,
mediante o arquivo de logs.
audit2allow= Utilizado para Gerar polticas do SELinux para permitir regras, a partir
de logs negados.
-M= Cria um arquivo de Mdulo, com a sada do audit2allow
mypol= Nome do arquivo de Mdulo, podendo ter qualquer nome.

Sada do comando:
******************** IMPORTANT ***********************
To make this policy package active, execute:
semodule -i mypol.pp

Perceba que a sada do comando deixa bem claro que, caso voc queira tornar tal mdulo
ativo, necessrio que voc o instale viasemodule .
Porm, caso voc liste o diretrio corrente, ir perceber que existem 2 arquivos mypol:
# ls
Sada do comando:
mypol.te mypol.pp

O arquivo "mypol.te" indica um tipo de arquivo de execuo (Type Enforcement), ou seja, ele
tem toda instruo do que ser executado/alterado no sistema atravs do arquivo
"mypol.pp".
J o arquivo "mypol.pp", nada mais o que o pacote de politicas (Package Policy), ou o
mdulo propriamente dito.
Agora que sabemos qual arquivo instalar, vamos utilizar o semodule para isso:
# semodule -i mypol.pp

Depois de alguns segundos, o arquivo foi instalado com xito. Ser?


Liste os mdulos, e veja voc mesmo:
# semodule l | grep ^m

Sada do comando:
mailman 1.7.2
matahari 1.0.0
mediawiki 1.0.0
memcached 1.1.2
milter 1.1.1
modemmanager 1.0.1
mono 1.6.1

mozilla 2.1.1
mpd 1.0.0
mplayer 2.1.0
mrtg 1.8.0
munin 1.7.0
mypol 1.0
mysql 1.11.3

Olha s, o nosso modulo "mypol" instalado e habilitado no sistema. Ou seja, funcionou! =D


Vale reforar que, a criao de mdulos com o "audit2allow", s aconselhada caso voc
saiba realmente o que esteja fazendo, utilizar o "audit2allow" apenas para resolver os alertas
de AVC do SELinux, estar causando um grande furo de segurana ao sistema.

Fonte de consulta: http://about.me/brunorochadasilva ;


http://www.vivaolinux.com.br/artigo/SELinux-Seguranca-em-Servidores-GNU-Linux

Você também pode gostar