Escolar Documentos
Profissional Documentos
Cultura Documentos
Captulo 1
Hardening Ajustes de Segurana
1.1. Objetivos:
experincia
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.
# 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
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
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 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.
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
$ 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
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:
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
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
De:
ca:12345:ctrlaltdel:/sbin/shutdown -t1 -a -r now
Para:
ca:12345:ctrlaltdel:/bin/echo Este recurso foi desabilitado
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
*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 # 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:
# 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
# groupadd admins
# useradd -g admins -m -s /bin/bash toor
# passwd toor
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
# ./invalidos.sh
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
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.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.
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
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 = 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;
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.
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
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.
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
Mais uma vez: jamais utilize o arquivo padro sem alterar ao menos as portas
das sequncias;
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;
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...;
[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.
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.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
Em bantime onde voc controla o tempo de banimento coloquei 300, que ser 5
minutos.
bantime = 300
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.
10
11
12
13
14
15
/lib/ld-linux.so.2 (0xb7f67000)
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
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
Depois modifiquem para um dia e horrio que ele no pode logar e testem em
outro terminal:
# date MMDDHHmmAAAA
session
required
pam_limits.so
usuario
hard
maxlogins
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
# 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
# password required
required
password
required
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.
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
# 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.
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
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).
2 http://www.openwall.com/john/doc/
# cd /usr/share/john
# cat password.lst
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
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/
m::rwx
Others
o::rwx
Tabela 2.2.
# mkdir /documentos
# mount -t ext3 /dev/sda11 /documentos
/dev/sda11
/documentos
ext3
defaults,acl
# 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.
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
getfacl: Esse o comando utilizado para visualizar as ACLs que esto definidas em
cada arquivo e diretrio.
# 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
Onde:
# 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
$ 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
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.
$ getfacl arq4.txt
# file: arq4.txt
# owner: luke
# group: financeiro
user::rwuser:vader:rwx
group::rwx
mask::rwother::---
# 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:
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:
1 Port 65123
2 ListenAddress 192.168.200.X
3 PermitRootLogin no
4 AllowUsers toor@192.168.200.X
5 AllowGroups admins
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.
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.
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
7 - Reinicie o SSH:
# /etc/init.d/ssh restart
8 - No cliente, logado com o usurio toor, acesse o servidor remoto via ssh:
$ ssh -p 65123 192.168.200.X
# 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
Endereo Local
0.0.0.0:255
Endereo Remoto
0.0.0.0:*
Estado
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
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
Captulo 4
Ambiente seguro com chroot
4.1. Objetivos:
Entender o que um sistema enjaulado.
Criar um chroot.
Entender o funcionamento do debootstrap.
# vim /root/.bashrc
export PS1='debchrootXX:\w\$ '
/dev/pts
devptsdefaults
# mount -a
# mount
# ssh root@192.168.200.X
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.
Alterao de arquivos;
recursos de registros (logs) que devem ser protegidos contra falsificao e acesso no
autorizados.
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
Nveis:
1 - Instale o Syslog-NG:
# aptitude install syslog-ng
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)); };
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); };
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 &
Configurando o servidor
# OPCES DE ORIGEM
3
4
2 - Ainda no arquivo, insira uma nova entrada de filtro para capturar as informaes
vindas de determinada mquina:
1
#OPES DE FILTRO
3
4
OU
1
OU
# OPES DE DESTINO
## Destino da mquina1
3
4
perm(0640)); };
group("adm") perm(0640)); };
# OPCES DE LOG
## Logs da mquina1
3
4
5
6
7 - Reinicialize o Syslog-NG:
# /etc/init.d/syslog-ng restart
Configurando o cliente
# vim /etc/syslog-ng/syslog-ng.conf
# OPES DE DESTINO
3
4
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
3
4
filter f_servlog { level(info, warn, err, crit) and facility(auth, authpriv, daemon, mail, news, cron,
user); };
# OPES DE LOG
3
4
OU
1
4 - Reinicialize o Syslog-NG:
# /etc/init.d/syslog-ng restart
weekly
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
/var/log/auth.log {
daily
size 3M
sharedscripts
postrotate
/usr/bin/killall -1 syslog-ng
endscript
7
8
9
rotate 5
}
# cat /etc/cron.daily/logrotate
#!/bin/sh
2
3
4
5
chattr -a /var/log/*
/usr/sbin/logrotate /etc/logrotate.conf
chattr +a /var/log/*
8 - Execute o script:
# /etc/cron.daily/logrotate
5.4. Auditoria
5.4.1. Conformidade com a norma
5.4.2. Lastcomm
1 - Instale o pacote acct, que o pacote que traz o comando lastcomm:
# aptitude install acct
Todas
as
informaes
do
comando
lastcomm
esto
dentro
do
arquivo
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
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.
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
Agora que a base est criada, podemos simular algumas modificaes no sistema e ver
como o AIDE vai nos notificar sobre essas modificaes.
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
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
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
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
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.
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)
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.
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.
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
2 - Detalhes de configurao:
Deseja configurar uma base de dados para snort-mysql gravar os logs: Sim
var HTTP_PORTS 80
10
11
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
14
15
dynamicengine /usr/lib/snort_dynamicengine/libsf_engine.so
16
17
18
19
20
21
22
oversize_dir_length 500
23
24
preprocessor bo
25
26
27
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
30
31
32
33
34
host=localhost
35
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
# cd rules
# ls
12 - Inicie o snort:
# /etc/init.d/snort start
2 - Instale o Apache2:
# aptitude install apache2
# vim /etc/apache2/apache2.conf
ServerName 192.168.200.X
4 - Reinicie o Apache2:
# /etc/init.d/apache2 restart
<Directory /var/www/>
AllowOverride None
Order allow,deny
</Directory>
7 - Reinicie o Apache2:
# /etc/init.d/apache2 restart
http://192.168.200.x
#!/bin/bash
2
3
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() ?>
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
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';
# cd /etc/acidbase
# vim apache.conf
<IfModule mod_alias.c>
</IfModule>
4
5
<DirectoryMatch /usr/share/acidbase/>
Options +FollowSymLinks
AllowOverride None
order deny,allow
10
11
12
<IfModule mod_php4.c>
13
14
php_flag track_vars On
15
16
17
</IfModule>
</DirectoryMatch>
6 - Reinicie o Apache2:
# /etc/init.d/apache2 restart
# vim /etc/mysql/my.cnf
bind-address = 192.168.200.X
# /etc/init.d/mysql restart
OU
# ls -l /etc/apache2/mods-enabled
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
8 Agora, criar um certificado com algoritmo padro que aceito pela maioria dos
browsers:
Primeiro a chave:
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
-----
10
11
12
13
14
15
16
17
18
19
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
SSLEngine on
4
5
#If both key and certificate are stored in the same file, only the
10
SSLCertificateFile /etc/apache2/ssl/hostname.crt
11
SSLCertificateKeyFile /etc/apache2/ssl/hostname.key
12 - Reinicie o servio:
# /etc/init.d/apache2 restart
14 - Confira as portas que foram abertas para o servidor web com https:
# netstat -nltp | grep apache2
auto lo
3
4
auto eth0
7
8
network 0.0.0.0
broadcast 0.0.0.0
10
11
auto eth1
12
13
address 0.0.0.0
14
network 0.0.0.0
15
broadcast 0.0.0.0
16
17
auto br0
18
19
20
bridge_maxwait 0
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"
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.
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
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
# vim /etc/guardian.target
192.168.0.21
192.168.1.1
200.x.x.x
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
# 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
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.
os prprios usurios
2.
3.
Instale o pacote:
#dpkg -i Nessus-5.0.1-debian6_i386.deb
4.
#/opt/nessus/sbin/nessus-adduser
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.
Redirecionamento de portas;
Masquerading;
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.
# mkdir /etc/firewall
# cd /etc/firewall
#!/bin/bash
2
3
IPT=$(which iptables)
4
5
nega ()
10
11
nega
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
11
12
13
14
limpa
-t -> Opo para definir qual tabela est trabalhando, pois a tabela filter a padro e
no precisa ser especfica com a opo -t.
# vim loop.sh
#!/bin/bash
2
3
IPT=$(which iptables)
4
5
LO="127.0.0.1"
6
7
loop ()
10
11
12
loop
# 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
12
13
14
ping
# 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
11
12
mtr
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
12
13
14
15
dns
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
12
13
14
15
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
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
12
13
14
sshcli
# ssh usuario@192.168.200.X
#!/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
CODE
Description
Echo Reply
Network Unreachable
Host Unreachable
Protocol Unreachable
Port Unreachable
10
11
12
13
14
15
Source quench
Query
Error
Echo request
Router advertisement
10
Route solicitation
11
11
12
12
13
14
15
16
17
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 ()
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
14
15
icmps
--limit 1/s --> Limita a receber somente 1 pacote ICMP por segundo.
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
#!/bin/bash
2
3
IPT=$(which iptables)
ET0="192.168.200.X"
PA="1024:65535"
6
7
tcp_cliente ()
10
do
11
12
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
#!/bin/bash
2
3
IPT=$(which iptables)
4
5
flags()
do
10
do
11
12
13
done
14
done
15
16
flags
--log-prefix --> Parmetro para definir o nome do Log que ser gerado.
SYN,RST
SYN,FIN
SYN,PSH
SYN,URG
FIN,RST
FIN,URG,PSH
2 - Faa um teste em uma mquina utilizando o nmap e o hping e veja como uma
porta Aberta responde:
6 - Agora que j sabe como as portas respondem na pilha TCP/IP, entenda a regra
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
20
21
22
23
24
25
26
27
28
icmp_chain
drop.sh
limpa.sh
loop.sh
dns.sh
icmps.sh
cliente_tcp.sh
flags.sh
#!/bin/bash
3
4
#------------------------------------------------------------------------------
## Mdulos necessrios
6
7
modprobe ip_conntrack_ftp
modprobe ip_nat_ftp
#------------------------------------------------------------------------------
10
11
12
#-----------------------------------------------------------------------------
13
14
15
16
17
#-----------------------------------------------------------------------------
18
case $1 in
19
start)
20
21
22
23
;;
24
stop)
25
26
27
28
;;
29
30
;;
31
32
;;
33
34
;;
35
restart) $0 stop
36
$0 start
37
;;
38
39
exit 0
40
;;
41
esac
42
exit 1
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;
#!/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
14
modprobe ip_conntrack_ftp
15
modprobe ip_nat_ftp
16
17
18
nega()
19
20
21
22
23
24
25
26
27
limpa()
28
29
30
31
$IPT -F
32
$IPT -F -t nat
33
$IPT -F -t mangle
34
35
36
37
38
39
loop()
40
41
42
43
44
45
46
47
input()
48
49
50
51
52
53
54
55
output()
56
57
58
59
60
61
62
forward()
63
64
65
66
67
68
69
icmps()
70
71
72
73
74
75
$IPT -A INPUT -p icmp -s $NET -d $ET0 --icmp-type $TIPO -m limit --limit 1/s -j ACCEPT
76
done
77
78
79
pt_cliente_tcp()
80
81
82
83
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
92
93
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
102
103
104
105
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
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
121
122
123
do
124
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
149
;;
150
stop)
151
limpa
152
153
154
;;
155
156
;;
157
158
;;
159
160
;;
161
restart) $0 stop
$0 start
162
163
;;
164
165
exit 0
166
;;
167
esac
168
exit 1
3 - Agora realize alguns testes padres que foram feitos com o outro script de
Firewall e veja se tudo funciona corretamente:
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
#!/bin/bash
2
3
IPT=$(which iptables)
REDE="192.168.X.0/24"
5
6
nat ()
10
nat
#!/bin/bash
2
3
IPT=$(which iptables)
REDE="192.168.X.0/24"
IP_NET="200.X.X.2"
6
7
nat2 ()
10
11
nat2
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
#!/bin/bash
2
3
IPT=$(which iptables)
REDE="192.168.X.0/24"
NET="0/0"
6
7
nat ()
9
10
11
12
13
14
15
nat
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()
mac_nat
# tail -f /proc/net/ip_conntrack
#!/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
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
# Entrada
10
11
12
mangle
Captulo 11
VPN
11.1 Objetivos
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
Filial:
eth0 - Velox;
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
# 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
igual,
devem
ser
observadas
algumas
configuraes
mnimas.
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
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
remoteip
# 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
#vim /etc/ppp/chap-secrets
# Client
Server
secret
IP
marcio
teste123
Captulo 12
Criptografia de Disco com Luks e DM
Crypt
12.1. Objetivos
cryptmount:
comando
usado
para
montar/desmontar
dispositivos
# modprobe dm_crypt
# modprobe dm_mod
#modprobe aes_x86_64 (para arq 64 bits)
#modprobe sha256
#cat /proc/crypto
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
/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
Captulo 13
Implementao de Regras de Acesso
com SELinux
13.1 Objetivos
O SELinux
O comando semanage
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
http://www.nsa.gov/research/selinux
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
#getenforce
Sada do comando:
Enforcing
#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
'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.
# 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)
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.
# ls Zd
Sada do comando:
System_u:object_r:etc_t:s0
Onde:
# 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.
# 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
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
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 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:
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:
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.
# 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).
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
Onde:-m= message
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:
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
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