Anda di halaman 1dari 12

Taller 10: firewall Bastion Host y SELINUX

################################################################################
######
Firewalls en Linux
################################################################################
#################
- El firewall de host (FIREWALL BASTION HOST) solo protege a la maquina local o
servidor
- El firewall de red (FIREWALL PERIMETRAL) protege a la maquina local y redes qu
e pudieran estar detras de ella

Esquema de un firewall Bastion Host


################################################################################
#
Firewall Bastion Host como servidor
-------------------------------------------------------------------------------HOST
Servidor
________

HOST
Cliente
________

|
|
|
|
|
|
|

|<-----------------------------|
|
ssh | -A INPUT -p tcp --dport 22 |
|
tcp | -m state --state
|
|
22 | NEW,ESTABLISHED,RELATED
|
|
|
|
|
|
|
|
|----------------------------->|
|
-------- -A OUTPUT -p tcp --sport 22 ---------m state --state
ESTABLISHED,RELATED

* Restriccin de origen
INPUT: -s IPoHost

OUTPUT: -d IPoHost

Firewall Bastion Host como cliente


-------------------------------------------------------------------------------HOST
Cliente
________
|
|
|
|
|
|
|

HOST
Servidor
________

|----------------------------->|
|
ssh | -A OUPUT -p tcp --dport 22 | ssh
|
tcp | -m state --state
| tcp
|
22 | NEW,ESTABLISHED,RELATED
| 22
|
|
|
|
|
|
|
|<-----------------------------|
|
-------- -A INPUT -p tcp --sport 22 ---------m state --state
ESTABLISHED,RELATED

* Restriccin de destino
OUTPUT: -d IPoHost

INPUT: -d IPoHost

Configuracin del Firewall Bastion Host


###############################################################################
tareas principales de un firewall

1.- Filtrado de paquetes--------------------->firewall bastion


Tabla FILTER
----------------------------------------------------------- INPUT paquete que entra al host
- OUTPUT paquete que salen del host
- FORWARD paquetes que pasa por el host (Firewall de permetro)
2.- Nat (Firewall de permetro)
Tabla NAT
-----------------------------------------------------------PREROUTING, permite asignar NAT de Destino (DNAT)
-POSTROUTING, permite asignar NAT Fuente (SNAT)
-INPUT
-OUTPUT
3.- Ruteo Avanzado y QoS
Tabla MANGLE
---------------------------------------------------------- PREROUTING
- POSTROUTING
- INPUT
- OUTPUT
- FORWARD
IPTABLES
################################################################
Opciones del comando:
-P policy (politica por defecto) DROP, ACCEPT
-i
input interface
-o
output interface
-p
protocol (tcp,udp,icmp
-s
source address (IP o red de origen)
-d
destination address (IP o red de destino)
-t
table (tabla: filter, nat)
-A
Append (agrega una regla en una chain cadena; al final)
filter: INPUT, OUTPUT, FORDWARD
nat: PREROUTING, POSTROUTING
-I Insert (agrega una regla en una chain al inicio)
-X Borra una regla en una chain
-F Borra todas las reglas de un chain
--sport source port (puerto de origen)
--dport destination port (puerto de destino)
-m
module (modulo adiccional cargado)
ejemplo
-m multiport me da opciones
--sports (multiples puertos de origen)
-j
jump (indica que hacer con el paquete) (DROP, ACCEPT, REJECT, DNAT,SNAT,
LOG)
----------------------------------------------------L
lista las reglas definidas (apesta)
-S lista las reglas definidas (formato legible)
-n
no resuelve nombres de host
-N crea una nueva cadena

===============================
$> iptables -L -n ----------------------> muestra las reglas de la tabla de filt
rado
$> iptables -S --> muestra las reglas de filtrado
$> iptables -L -n -t nat
-t nat ---------------> muestra las reglas del
tabla NAT
$> iptables -S -t nat --> muestra las reglas de filtrado de la tabla NAT
$> systemctl stop firewalld (detiene el firewalld de CentOS y borra todas las re
glas)
$> iptables -S
LUEGO DEBEMOS CONTROLAR LAS POLITICAS POR DEFECTO
(forma mas segura)
$> iptables -P INPUT DROP
|
$> iptables -P OUTPUT DROP
|
deniega todo
$> iptables -P FORWARD DROP
|
* Primera prueba
$> ping 127.0.0.1
DAR ACCESO A LOS SERVICIOS QUE SE EJECUTAN EN EL SERVIDOR
$> iptables -A INPUT -i lo -j ACCEPT
$> iptables -A OUTPUT -o lo -j ACCEPT
dando permiso total de entrada y salida al lookback
* Prueba del ping
$> ping 127.0.0.1
DANDO ACCESO AL SERVIDOR SSH
$> iptables -A INPUT -p tcp --dport 22 -m state --state NEW,ESTABLISHED,RELATED
-j ACCEPT
$> iptables -A OUTPUT -p tcp --sport 22 -m state --state ESTABLISHED,RELATED -j
ACCEPT
DANDO ACCESO A NUESTRA MAQUINA COMO CLIENTE
permitir conectarnos a cualquier servidor SSH, http,ftp,https
$> iptables -A OUTPUT -p tcp -m multiport --dports 20,21,22,80,443 -m state --st
ate NEW,ESTABLISHED,RELATED -j ACCEPT
$> iptables -A INPUT -p tcp -m multiport --sports 20,21,22,80,443 -m state --sta
te ESTABLISHED,RELATED -j ACCEPT
permitir conectarnos a un servidor DNS
$> iptables -A OUTPUT -p udp --dport 53 -m state --state NEW,ESTABLISHED,RELATED
-j ACCEPT
$> iptables -A INPUT -p udp --sport 53 -m state --state ESTABLISHED,RELATED -j A
CCEPT
* prueba de ping
$> ping www.google.com
HABILITAR ICMP para la salida de paquetes
$> iptables -A OUTPUT -p icmp --icmp-type echo-request -m state --state NEW,ESTA
BLISHED,RELATED -j ACCEPT

$> iptables -A INPUT -p icmp --icmp-type echo-reply -m state --state ESTABLISHED


,RELATED -j ACCEPT
* prueba de ping
$> ping www.google.com
Creando un firewall Bastion Host
################################################################################
########3
Instalamos el servicio iptables para reemplazar a firewalld
$> yum -y install iptables-services
$> systemctl enable iptables
Creando el script de firewall
################################################################################
####
$> vim firewall-bastion
--------------------------------------------------------------------------------#!/bin/bash
# Firewall Bastion Adiestra
# 2014
echo "limpiando todas las reglas, deshabilitando firewalld"
systemctl stop firewalld
systemctl disable firewalld
systemctl stop iptables
echo "Estableciendo la politica por defecto a DROP"
iptables -P INPUT DROP
iptables -P OUTPUT DROP
iptables -P FORWARD DROP
echo "configurando INPUT y OUTPUT"
echo "dando acceso total al loopback"
# todo lo que entra y sale desde el loopback se acepta
iptables -A INPUT -i lo -j ACCEPT
iptables -A OUTPUT -o lo -j ACCEPT
################ Nuestro host como SERVIDOR ###################################
###################3
echo "permitiendo acceso al servidor SSH (protocolo tcp, puerto 22) desde cualqu
ier origen "
iptables -A INPUT -p tcp --dport 22 -m state --state NEW,ESTABLISHED,RELATED -j
ACCEPT
iptables -A OUTPUT -p tcp --sport 22 -m state --state ESTABLISHED,RELATED -j ACC
EPT
# ejemplo permitir SSH solo a la LAN
# iptables -A INPUT -i eth0 -p tcp -s 192.168.130.0/24 --dport 22 -m state --sta
te NEW,ESTABLISHED,RELATED -j ACCEPT
# iptables -A OUTPUT -o eth0 -p tcp -d 192.168.130.0/24 --sport 22 --m state --s
tate ESTABLISHED,RELATED -j ACCEPT
############### Nuestro host como cliente

####################################

#########################
echo "habilitando navegacion a internet desde nuestro host hacia los puertos SSH
,FTP,HTTP y HTTPS"
iptables -A OUTPUT -p tcp -m multiport --dports 20,21,22,80,443 -m state --state
NEW,ESTABLISHED,RELATED -j ACCEPT
iptables -A INPUT -p tcp -m multiport --sports 20,21,22,80,443 -m state --state
ESTABLISHED,RELATED -j ACCEPT
echo "habilitando las consultas DNS desde nuestro host"
iptables -A OUTPUT -p udp --dport 53 -m state --state NEW,ESTABLISHED,RELATED -j
ACCEPT
iptables -A INPUT -p udp --sport 53 -m state --state ESTABLISHED,RELATED -j ACCE
PT
############### Reglas de Ping ################################################
#########################
echo "permitiendo el ping desde la LAN a nuestro host"
iptables -A INPUT -p icmp --icmp-type echo-request -s 192.168.130.0/24 -m stat
e --state NEW,ESTABLISHED,RELATED -j ACCEPT
iptables -A OUTPUT -p icmp --icmp-type echo-reply -d 192.168.130.0/24 -m state
--state ESTABLISHED,RELATED -j ACCEPT
echo "haciendo ping desde nuestro host a la cualquier destino"
iptables -A OUTPUT -p icmp --icmp-type echo-request -m state --state NEW,ESTABLI
SHED,RELATED -j ACCEPT
iptables -A INPUT -p icmp --icmp-type echo-reply -m state --state ESTABLISHED,R
ELATED -j ACCEPT
#Guardando permanente las reglas
/usr/libexec/iptables/iptables.init save
------------------------------------------------------------------------------------------------------Dando permisos de ejecucin y ejecutando el firewall
$> chmod 755 firewall-bastion
$> ./firewall-bastion
$> iptables -S
Reiniciando el firewall para verificar las reglas guardadas
$> systemctl restart iptables
$> iptables -S

SELINUX
------------------------------------------------------------------------------------Selinux nos permite establecer restricciones de acceso a archivos procesos y pue
rtos
con el uso de contextos y boleanos
SELINUX utiliza dos modelos de seguridad:
MAC - Control de Acceso Mandatorio
RBAC - Control de Acesso Basado en Roles
Por Defecto Linux usa el modelo de seguridad DAC (Control de Acceso Discreto)
La principal ventaja de MAC es que maneja la seguridad en los objetos
(Archivos y Directorios) y sujetos (procesos del sistema)

Cuando un sujeto, tal como una aplicacin, intenta acceder a un objeto tal como
a un archivo, el servidor de aplicacin de polticas verifica un cach de vector
de acceso (AVC), donde se registran los permisos de objeto y del sujeto. Si no s
e
puede tomar una decisin basado en los datos en el AVAC, la peticin continua al
servidor de seguridad, el cual busca el contexto de seguridad de la aplicacin y
del archivo en una matriz. Los permisos son entonces otorgados o negados,
con un mensaje de avc: denied detallado en /var/log/messages.
Los sujetos y objetos reciben su contexto de seguridad a partir de la poltica
instalada, que tambin proporciona informacin para llenar la matriz de seguridad
del servidor.
Adems de ejecutarse en un modo impositivo (Enforcing), SELinux puede ejecutarse
en un modo permisivo (Permissive), donde el AVC es verificado y se registran los
rechazos, pero SELinux no hace cumplir esta poltica.
Modo de Ejecucin de SELINUX
------------------------------------------------------------------------------------Permissive 0 (no ejecuta bloqueos, solo loguea en /var/log/audit/audit.log)
Enforcing 1
(ejecuta bloqueos activamente)
Saber el modo de ejecucin de SELINUX
$> getenforce
$> sestatus
Establecer SELINUX en modo permisivo
$> setenforce 0

$> setenforce Permissive


Establecer SELINUX en modo reforzado
$> setenforce 1

$> setenforce Enforcing


Tipo de Ejecucin de Bloqueo
-------------------------------------------------------------------------------------strict
---> Todos los procesos se protegen activamente (requiere un mayor c
ontrol)
targeted
---> Slo los procesos y archivos marcados son protegidos
Archivo general de configuracin
--------------------------------------------------------------$> vim /etc/sysconfig/selinux
# This file controls the state of SELinux on the system.
# SELINUX= can take one of these three values:
# enforcing - SELinux security policy is enforced.
# permissive - SELinux prints warnings instead of enforcing.
# disabled - SELinux is fully disabled.
SELINUX=enforcing
# SELINUXTYPE= type of policy in use. Possible values are:
# targeted - Only targeted network daemons are protected.
# strict - Full SELinux protection.
SELINUXTYPE=targeted
Contextos en SELINUX
-----------------------------------------------------------------------

Los contextos se aplican a procesos y archivos; cada proceso tiene


un contexto y muchas veces los archivos tienen que coincidir
con los contextos definidos para un proceso
Los comandos ps, ls, cp, mkdir, etc soportan la opcin -Z
que permite visualizar los contextos
Procesos y sus contextos
----------------------------------------------------------------------$> ps axZ (todos los procesos con sus contextos)
$> ps axZ | grep tty2
-------> usuario ------> dominio
|
|
system_u:system_r:getty_t:s0
1859 tty2
Ss+
0:00 /sbin/mingetty /dev/tt
y2
|
|
|
|
----> rango de influencia
-------------------> proceso
|
(s0 todos)
---> rol
Instalamos apache
-------------------------$> yum -y install httpd
$> systemctl start httpd
$> systemctl enable httpd
$> ps -ZC httpd
-------> rol de sistema
|
unconfined_u:system_r:httpd_t:s0 4151 ?
00:00:00 httpd
unconfined_u:system_r:httpd_t:s0 4154 ?
00:00:00 httpd
|
|
|
------------> dominio httpd_t
---> usuario no confinado
Archivos y sus contextos
----------------------------------------------------------------------$> ls -Z /home

-------> dominio
|
drwx------. alumno alumno unconfined_u:object_r:user_home_dir_t:s0 alumno
drwx------. tuxito tuxito unconfined_u:object_r:user_home_dir_t:s0 tuxito
$> ls -Z /var/www
drwxr-xr-x.
drwxr-xr-x.
drwxr-xr-x.
drwxr-xr-x.

root
root
root
root

root
root
root
root

-----------> dominio
|
system_u:object_r:httpd_sys_script_exec_t:s0 cgi-bin
system_u:object_r:httpd_sys_content_t:s0 error
system_u:object_r:httpd_sys_content_t:s0 html
system_u:object_r:httpd_sys_content_t:s0 icons

Cambiando los contextos


--------------------------------------------------------------------------------------Instalaremos los paquetes policycoreutils y policycoreutils-python para disponer

de los
comandos restorecon y semanage
$> yum -y install policycoreutils policycoreutils-python
Vamos a hacer una prueba con el servidor web
$> cd
Verificamos el contexto del Document Root
$> ls -Zd /var/www/html
------> usuario
|
drwxr-xr-x. root root system_u:object_r:httpd_sys_content_t:s0 /var/www/html
|
---------> dominio
Creamos un archivo dento del raiz web
$> touch /var/www/html/index.html
Verificamos el contexto del archivo creado; vemos que ha heredado el dominio del
directorio
contenedor; pero no el usuario
$> ls -Z /var/www/html/index.html
-rw-r--r--. root root unconfined_u:object_r:httpd_sys_content_t:s0 /var/www/html
/index.html
Creamos 2 archivos en el /tmp
$> touch /tmp/prueba1
$> touch /tmp/prueba2
Verificamos los contextos de los archivos creados
$> ls -lZ /tmp/prueba*
-rw-r--r--. root root unconfined_u:object_r:user_tmp_t:s0 /tmp/prueba1
-rw-r--r--. root root unconfined_u:object_r:user_tmp_t:s0 /tmp/prueba2
Ahora copiamos prueba1 y movemos prueba2 al directorio raiz web
$> cp /tmp/prueba1 /var/www/html
$> mv /tmp/prueba2 /var/www/html
Verificamos los contextos de los archivos
$> ls -lZ /var/www/html/prueba*
-rw-r--r--. root root unconfined_u:object_r:httpd_sys_content_t:s0 /var/www/html
/prueba1
-rw-r--r--. root root unconfined_u:object_r:user_tmp_t:s0 /var/www/html/prueba2
Vemos que en el caso del archivo movido, mantiene el dominio original.
Si
$>
$>
$>

intentamos descargar el archivo prueba2 nos denegar


wget http://localhost
wget http://localhost/prueba1
wget http://localhost/prueba2

Esto se debe a que los contextos (usuario,rol y dominio) deben ser iguales a los
del i
directorio contenedor

Si queremos cambiar en forma especfica el contexto de un archivo ejecutamos chcon


$> chcon system_u:object_r:httpd_sys_content_t:s0 /var/www/html/prueba2
otra forma de cambiar los contextos
es restablecer todos los contextos; acorde a los contextos del directorio padre
$> restorecon -RFvv /var/www/html/
restorecon reset /var/www/html/index.html context unconfined_u:object_r:httpd_sy
s_content_t:s0->system_u:object_r:httpd_sys_content_t:s0
restorecon reset /var/www/html/prueba2 context unconfined_u:object_r:user_tmp_t:
s0->system_u:object_r:httpd_sys_content_t:s0
restorecon reset /var/www/html/prueba1 context unconfined_u:object_r:httpd_sys_c
ontent_t:s0->system_u:object_r:httpd_sys_content_t:s0
Intentamos descargar los archivos web y ya funciona
$> wget http://localhost
$> wget http://localhost/prueba1
$> wget http://localhost/prueba2
* Para saber todos los contextos marcados en archivos y directorios; ejecutamos
$> semanage fcontext -l
* para saber los contextos de los directorios web
$> semanage fcontext -l | grep httpd
Definiendo un contexto determinado a un directorio
--------------------------------------------------------------------------Imaginemos que queremos crear un directorio para un dominio virtual en apache
en una ruta diferente a los directorios web; entonces ser necesario, definir
un contexto similar al que tiene el directorio web /var/www/html
Definimos el virtual host en apache
$> vim /etc/httpd/conf.d/vhosts.conf
NameVirtualHost *:80
<VirtualHost *:80>
ServerName www.server.com
DocumentRoot "/var/www/html"
<Directory "/var/www/html">
Options Indexes FollowSymLinks
DirectoryIndex index.html index.php
AllowOverride All
Order allow,deny
Allow from all
Require all granted
</Directory>
</VirtualHost>
<VirtualHost *:80>
ServerName www.dominio1.com
DocumentRoot "/dominio1"
<Directory "/dominio1">
Options Indexes FollowSymLinks
DirectoryIndex index.html index.php
AllowOverride All
Order allow,deny
Allow from all

Require all granted


</Directory>
</VirtualHost>
$> mkdir /dominio1
$> echo "hola mundo" > /dominio1/index.html
Agregamos www.dominio1.com al /etc/hosts (agregar al final)
$> vim /etc/hosts
192.168.130.X www.server.com
192.168.130.X www.dominio1.com
Reiniciamos
$> systemctl restart httpd
Accedemos a www.dominio1.com
$> wget www.dominio1.com
Verificamos los contextos del directorio y archivo creado
$> ls -Zd /dominio1
drwxr-xr-x. root root unconfined_u:object_r:default_t:s0 /dominio1
$> ls -Z /dominio1
-rw-r--r--. root root unconfined_u:object_r:default_t:s0 /dominio1/index.html
Necesitamos que los contextos sean similares a los del drectorio /var/www/html
$> ls -Zd /var/www/html
drwxr-xr-x. root root system_u:object_r:httpd_sys_content_t:s0 /var/www/html
Modificamos el contexto del directorio /dominio1
$> semanage fcontext -a -t httpd_sys_content_t "/dominio1(/.*)?"
|
|
|
------> tipo de contexto
|
-----> agregar
El contexto es httpd_sys_content_t que establece que el usuario:system_u y domin
io:httpd_sys_content_t
Restablecemos los contextos correctos para el servicio apache
$> restorecon -RFvv /dominio1/
restorecon reset /dominio1 context unconfined_u:object_r:default_t:s0->system_u:
object_r:httpd_sys_content_t:s0
restorecon reset /dominio1/index.html context unconfined_u:object_r:default_t:s0
->system_u:object_r:httpd_sys_content_t:s0
Verificamos el contexto del directorio /dominio1
$> ls -Zd /dominio1
drwxr-xr-x. root root system_u:object_r:httpd_sys_content_t:s0 /dominio1/
$> ls -Z /dominio1
-rw-r--r--. root root system_u:object_r:httpd_sys_content_t:s0 index.html
Accedemos de nuevo a www.dominio1.com
$> wget www.dominio1.com
$> cat index.html
Boleanos de SELINUX

---------------------------Los servicios tienen unos determinados boleanos asociados; algunos de estos


bienen deshabilitados; por eso podemos habilitarlos dependiendo como los
necesitemos
Lista los boleanos y su descripcin
$> semanage boolean -l
Para listar todos los boleanos y sus flags de estado
$> getsebool -a
.
.
.
xguest_connect_network --> on
xguest_mount_media --> on
xguest_use_bluetooth --> on
xserver_object_manager --> off
$> getsebool httpd_enable_cgi
httpd_enable_cgi --> on
Lista el boleano httpd_enable_cgi y para que sirve
$> semanage boolean -l | grep httpd_enable_cgi
Deshabilitar los cgis en forma temporal
$> setsebool httpd_enable_cgi off
Deshabilitar los cgis en forma permanente
$> setsebool -P httpd_enable_cgi off
$> getsebool httpd_enable_cgi
httpd_enable_cgi --> off
Ej: Acabo de instalar php como mdulo de Apache y subo un
script en php que enva correo desde un servidor smtp en otro
host
Visualizo los booleanos relacionados a httpd
$> semanage boolean -l| grep httpd | less
De ellos verifico que necesito habilitar 2 booleanos
httpd_can_network_connect
httpd_can_sendmail
Ejecuto entonces
$> setsebool -P httpd_can_network_connect on
$> setsebool -P httpd_can_sendmail on
y pruebo el script
Depuracin de bloqueos y logs de errores de SELINUX
----------------------------------------------------------Para poder depurar los errores de SELinux usamos las utilidades
sethroubleshoot
$> yum install setroubleshoot-server setroubleshoot setroubleshoot-plugins
$> systemctl restart rsyslog
$> systemctl restart auditd

$> systemctl enable rsyslog


$> systemctl enable auditd
vamos a crear un archivo test.html
$> cd
$> touch test.html
Lo movemos al raiz web
$> mv test.html /var/www/html
Descargamos
$> wget http://localhost/test.html
--2012-01-05 14:15:17-- http://localhost/test.html
Resolviendo localhost... 127.0.0.1
Connecting to localhost|127.0.0.1|:80... conectado.
Peticin HTTP enviada, esperando respuesta... 403 Forbidden
2012-01-05 14:15:17 ERROR 403: Forbidden.
Visualizamos los logs
--------------------------------------------------------$> tail -f /var/log/audit/audit.log
type=AVC msg=audit(1325791061.177:642): avc: denied { getattr } for pid=4161
comm="httpd" path="/var/www/html/test.html" dev=sda1 ino=793811 scontext=unconfi
ned_u:system_r:httpd_t:s0 tcontext=unconfined_u:object_r:admin_home_t:s0 tclass=
file
type=SYSCALL msg=audit(1325791061.177:642): arch=c000003e syscall=6 success=no e
xit=-13 a0=7ff0db1a4588 a1=7fffa1de5100 a2=7fffa1de5100 a3=1 items=0 ppid=4151 p
id=4161 auid=0 uid=48 gid=48 euid=48 suid=48 fsuid=48 egid=48 sgid=48 fsgid=48 t
ty=(none) ses=20 comm="httpd" exe="/usr/sbin/httpd" subj=unconfined_u:system_r:h
ttpd_t:s0 key=(null)
analizamos los logs con sealert
$> sealert -a /var/log/audit/audit.log | less
/test.html
Si queremos hacerlo en modo grfico (Requiere RHEL 6.2) bug 625468
$> sealert -b
Podemos ver tambien el ID de una alerta de un bloqueo (RHEL 6.2)
$> tail -f /var/log/messages
..... For conplete SELINUX messages, run sealer -l e6e1d4dd5df1e-3e4d--ff3fcfdf0
9gg
Podemos ubicarlo tambien por el nombre de archivo test.html
$> grep test.html /var/log/messages
Para ver el detalle del error y su solucin ejecutamos
$> sealert -l e6e1d4dd5df1e-3e4d--ff3fcfdf09gg

Anda mungkin juga menyukai