17.14. Implementando un ambiente seguro con MAC

La siguiente demostración implementará un ambiente seguro utilizando varios módulos MAC con políticas configuradas correctamente. Esta solamente es una prueba y no debe ser considerada una respuesta completa a las aflicciones de seguridad de todos. Solamente implementar una política e ignorarla nunca funciona y puede ser desastroso en un ambiente en producción.

Antes de iniciar este proceso, la opción multilabel debe ser aplicada a cada archivo del sistema como se declaró al principio de este capítulo. No hacerlo resultará en errores.

17.14.1. Crear una clase de usuario insegura

Inicie el procedimiento agregando la siguiente clase de usuario al archivo /etc/login.conf:

insecure:\
:copyright=/etc/COPYRIGHT:\
:welcome=/etc/motd:\
:setenv=MAIL=/var/mail/$,BLOCKSIZE=K:\
:path=~/bin:/sbin:/bin:/usr/sbin:/usr/bin:/usr/local/sbin:/usr/local/bin
:manpath=/usr/share/man /usr/local/man:\
:nologin=/usr/sbin/nologin:\
:cputime=1h30m:\
:datasize=8M:\
:vmemoryuse=100M:\
:stacksize=2M:\
:memorylocked=4M:\
:memoryuse=8M:\
:filesize=8M:\
:coredumpsize=8M:\
:openfiles=24:\
:maxproc=32:\
:priority=0:\
:requirehome:\
:passwordtime=91d:\
:umask=022:\
:ignoretime@:\
:label=partition/13,mls/5:

Y añadiendo la siguiente línea a la clase de usuario por omisión:

:label=mls/equal,biba/equal,partition/15:

Una vez que esto se ha completado, el siguiente comando debe ejecutarse para reconstruir la base de datos:

# cap_mkdb /etc/login.conf

17.14.2. Arrancar con los módulos correctos

Agregue las siguientes líneas al archivo /boot/loader.conf para que los módulos requeridos sean cargados durante la inicialización del sistema:

mac_biba_load="YES"
mac_mls_load="YES"
mac_seeotheruids_load="YES"
mac_partition_load="YES"

17.14.3. Configure todos los usuarios a inseguro

Todas la cuentas de usuarios que no sean root o usuarios de sistema ahora requerirán una clase de login. Esta clase de login es requerida o de otra manera a los usuarios se les negará acceso a comandos comunes como vi(1). El siguiente script de sh debe hacer el truco:

# for x in `awk -F: '($3 >= 1001) && ($3 != 65534) { print $1 }' \
    /etc/passwd`; do pw usermod $x -L insecure; done;

El comando cap_mkdb necesitará ser ejecutado en /etc/master.passwd despues de este cambio.

17.14.4. Complete la configuración

Un archivo de contexto debe ser creado ahora; el siguiente ejemplo fué tomado del ejemplo de política de Robert Watson y debe ser colocado en /etc/policy.contexts.

# Esta es la política BIBA/MLS por omisión para este sistema.

.*                              biba/high,mls/high
/sbin/dhclient                  biba/high(low),mls/high(low)
/dev(/.*)?                      biba/equal,mls/equal
# This is not an exhaustive list of all "privileged" devices.
/dev/mdctl                      biba/high,mls/high
/dev/pci                        biba/high,mls/high
/dev/k?mem                      biba/high,mls/high
/dev/io                         biba/high,mls/high
/dev/agp.*                      biba/high,mls/high
(/var)?/tmp(/.*)?               biba/equal,mls/equal
/tmp/\.X11-unix                 biba/high(equal),mls/high(equal)
/tmp/\.X11-unix/.*              biba/equal,mls/equal
/proc(/.*)?                     biba/equal,mls/equal
/mnt.*                          biba/low,mls/low
(/usr)?/home                    biba/high(low),mls/high(low)
(/usr)?/home/.*                 biba/low,mls/low
/var/mail(/.*)?                 biba/low,mls/low
/var/spool/mqueue(/.*)?         biba/low,mls/low
(/mnt)?/cdrom(/.*)?             biba/high,mls/high
(/usr)?/home/(ftp|samba)(/.*)?  biba/high,mls/high
/var/log/sendmail\.st           biba/low,mls/low
/var/run/utmp                   biba/equal,mls/equal
/var/log/(lastlog|wtmp)         biba/equal,mls/equal

Esta política impondrá seguridad activando restricciones tanto de bajada como de subida en el flujo de información en relación a los directorios y utilidades listadas en la izquierda.

Esto puede ahora ser leído hacia nuestro sistema ejecutando el siguiente comando:

# setfsmac -ef /etc/policy.contexts /
# setfsmac -ef /etc/policy.contexts /usr

Nota: El esquema de sistema de archivos de arriba puede ser diferente dependiendo del ambiente.

El archivo /etc/mac.conf requiere las siguientes modificaciones en la secci6oacute;n principal:

default_labels file ?biba,?mls
default_labels ifnet ?biba,?mls
default_labels process ?biba,?mls,?partition
default_labels socket ?biba,?mls

17.14.5. Probando la configuración

Agregue un usuario con el comando adduser y coloque a ese usuario en la clase insecure para estas pruebas.

Los ejemplos de abajo mostrarán una mezcla de root y usuarios regulares de prueba; utilice el prompt para distinguie entre los dos.

17.14.5.1. Pruebas de etiquetamiento básico

% getpmac
biba/15(15-15),mls/15(15-15),partition/15
# setpmac partition/15,mls/equal top

Nota: El proceso top será asesinado antes de iniciar otro proceso top.

17.14.5.2. Pruebas MAC Seeotheruids

% ps Zax
biba/15(15-15),mls/15(15-15),partition/15  1096 #C:  S      0:00.03 -su (bash)
biba/15(15-15),mls/15(15-15),partition/15  1101 #C:  R+     0:00.01 ps Zax

No se debe permitir ver procesos propiedad de otros usuarios.

17.14.5.3. Prueba MAC Partition

Deshabilitar la política MAC seeotheruids para el resto de estas pruebas:

# sysctl security.mac.seeotheruids.enabled=0
% ps Zax
LABEL                                                   PID  TT  STAT      TIME COMMAND
  biba/equal(low-high),mls/equal(low-high),partition/15  1122 #C:  S+     0:00.02 top
  biba/15(15-15),mls/15(15-15),partition/15              1096 #C:  S      0:00.05 -su (bash)
  biba/15(15-15),mls/15(15-15),partition/15              1123 #C:  R+     0:00.01 ps Zax

Todos los usuarios deben tener permitido ver todos los procesos en su partición.

17.14.5.4. Probando etiquetas Biba y MLS

# setpmac partition/15,mls/equal,biba/high\(high-high\) top
% ps Zax
LABEL                                                   PID  TT  STAT    TIME   COMMAND
  biba/high(high-high),mls/equal(low-high),partition/15   1251 #C:  S+     0:00.02 top
  biba/15(15-15),mls/15(15-15),partition/15               1096 #C:  S      0:00.06 -su (bash)
  biba/15(15-15),mls/15(15-15),partition/15               1157 #C:  R+     0:00.00 ps Zax

La política Biba nos permite leer objetos etiquetados más alto.

# setpmac partition/15,mls/equal,biba/low top
% ps Zax
LABEL                                       PID  TT  STAT      TIME COMMAND
  biba/15(15-15),mls/15(15-15),partition/15  1096 #C:  S      0:00.07 -su (bash)
  biba/15(15-15),mls/15(15-15),partition/15  1226 #C:  R+     0:00.01 ps Zax

La política Biba no permite que objetos etiquetados como inferiores sean leídos; de todas maneras, MLS si lo permite.

% ifconfig bge0 | grep maclabel
maclabel biba/low(low-low),mls/low(low-low)
% ping -c 1 192.0.34.166
PING 192.0.34.166 (192.0.34.166): 56 data bytes
ping: sendto: Permission denied

Los usuarios son incapaces de dar un ping a example.com, o cualquier dominio.

Para prevenir que ocurra este error, ejecute el siguiente comando:

# sysctl security.mac.biba.trust_all_interfaces=1

Esto configura la etiqueta por omisión de interfaces a modo inseguro, con ello la política Biba por omisió no será impuesta.

# ifconfig bge0 maclabel biba/equal\(low-high\),mls/equal\(low-high\)
% ping -c 1 192.0.34.166
PING 192.0.34.166 (192.0.34.166): 56 data bytes
64 bytes from 192.0.34.166: icmp_seq=0 ttl=50 time=204.455 ms
--- 192.0.34.166 ping statistics ---
1 packets transmitted, 1 packets received, 0% packet loss
round-trip min/avg/max/stddev = 204.455/204.455/204.455/0.000 ms

Configurando una etiqueta más correcta, podemos ejecutar peticiones de ping.

Ahora para crear algunos archivos para procedimientos de prueba de lectura y escritura:

# touch test1 test2 test3 test4 test5
# getfmac test1
test1: biba/equal,mls/equal
# setfmac biba/low test1 test2; setfmac biba/high test4 test5; \
  setfmac mls/low test1 test3; setfmac mls/high test2 test4
# setfmac mls/equal,biba/equal test3 && getfmac test?
test1: biba/low,mls/low
test2: biba/low,mls/high
test3: biba/equal,mls/equal
test4: biba/high,mls/high
test5: biba/high,mls/equal
# chown testuser:testuser test?

Todos estos archivos deben ser ahora propiedad de nuestro usuario testuser. Y ahora para algunas pruebas de lectura:

% ls
test1   test2   test3   test4   test5
% ls test?
ls: test1: Permission denied
ls: test2: Permission denied
ls: test4: Permission denied
test3   test5

No deberíamos tener permitido observar pares; ejemplo: (biba/low,mls/low), (biba/low,mls/high) y (biba/high,mls/high). Y por supuesto, el acceso de lectura debe estar denegado. Ahora para algunas pruebas de escritura:

% for i in `echo test*`; do echo 1 > $i; done
-su: test1: Permission denied
-su: test4: Permission denied
-su: test5: Permission denied

Como con las pruebas de lectura, el acceso de escritura no debe ser permitido para escribir pares; ejemplo: (biba/low,mls/high) y (biba/equal,mls/equal).

% cat test?
cat: test1: Permission denied
cat: test2: Permission denied
1
cat: test4: Permission denied

Y ahora como root:

# cat test2
1

Éste y otros documentos pueden obtenerse en ftp://ftp.FreeBSD.org/pub/FreeBSD/doc/.

Para preguntas acerca de FreeBSD, leer la documentación antes de contactar con la lista <questions@FreeBSD.org>.
Para preguntas acerca de esta documentación, e-mail a <doc@FreeBSD.org>.