¿Una forma de desencadenar una violación de la política de SELinux?

12

Estoy estudiando el funcionamiento básico de SELinux y sería útil desencadenar una negación. Mi máquina de prueba ejecuta CentOS 7, es una instalación básica del servidor sin ningún servicio adicional, y getenforce dice 'Enforcing'. Así que me sentí seguro de que hacer que / root sea legible en todo el mundo e intentar leer archivos desde allí como un usuario sin privilegios haría el truco. Pero no hay suerte! ¿Alguien puede sugerir algunas pruebas rápidas? Intentar acceder a rutas o abrir puertos, etc.

Idealmente, estoy buscando comandos de shell directos que un DAC no hubiera restringido, pero un MAC lo notará y lo negará. Como tal, no estoy buscando compilar programas a medida o instalar servicios específicos (como un servidor web) para lograr esto. Esto es valioso ya que proporciona una forma genérica y clara de ver a SELinux en acción.

No tengo problemas para modificar el DAC (es decir, los permisos del sistema de archivos) para que sean menos restrictivos de lo que serían por defecto como parte de una prueba.

Pensativo
fuente
1
Saber cómo activar sus sistemas de protección para que pueda verificar que funcionan es un paso vital y muchas veces omitido.
gowenfawr
Estoy votando para cerrar esta pregunta como fuera de tema porque pertenece a Unix y Linux SE.
Marque

Respuestas:

3

Para demostrar la utilidad de SELinux en la detección de errores para terceros / su propio código de desarrollador, aquí hay una prueba de protección de memoria (modificando el primer ejemplo de código aquí ):

#include <fcntl.h>
#include <stdio.h>
#include <sys/mman.h>

int main (void) {
  // open file read-write, get a memory-mapped pointer with private access, write permission
  int fd = open ("file_to_test", O_RDWR);
  char *p = mmap (NULL, 42, PROT_READ | PROT_WRITE, MAP_PRIVATE, fd, 0);

  p[0] = 'a';   // put something

  // Update protection mode; SELinux response depends on sebool: allow_execmod
  int r = mprotect (p, 42, PROT_READ | PROT_EXEC);

  // Display mprotect result
  printf ("mprotect = %d\n", r);

  close(fd);
  return 0;
}
Compila y muestra el valor predeterminado (no capturado)
$ echo "test data" > file_to_test
$ gcc execmod.c 

$ ./a.out 
mprotect = 0

$ sudo aureport -a

AVC Report
========================================================
# date time comm subj syscall class permission obj event
========================================================
<no events of interest were found>

Cambie los booleanos para detectar el problema:

$ sudo getsebool allow_execmod
allow_execmod --> on

$ sudo setsebool allow_execmod 0
$ ./a.out 
mprotect = -1

$ sudo aureport -a

AVC Report
========================================================
# date time comm subj syscall class permission obj event
========================================================
1. 04/30/2015 12:26:41 a.out unconfined_u:unconfined_r:unconfined_t:s0-s0:c0.c1023 10 file execmod unconfined_u:object_r:user_home_t:s0 denied 3612
ǝɲǝɲbρɯͽ
fuente
Esto es definitivamente útil y bien documentado (+1), aunque no soy un programador y realmente no entiendo el código. Idealmente, me gustaría ver un ejemplo obvio de SELinux negando un intento de abrir un puerto o acceder a una ruta, usando herramientas simples de línea de comandos como el shell, netcat, telnet, etc. Editaré la pregunta para aclarar esto.
Pensativo
Tuve que buscar partes del código yo mismo. Me alegra que hayas agregado una prueba de bash a continuación. Dejé de lado los errores de Snort y postfix (tal vez palomar) en CentOS7 porque son paquetes, son más trabajosos de instalar, pueden repararse más tarde y es solo más configuración. Si ya va por ese camino, es útil para la práctica de generación de políticas.
3bρɯͽ
3

Esto demuestra claramente una política MAC en la que un DAC equivalente podría haberse omitido en una instalación base de CentOS 7.

  1. Por defecto (en CentOS en el momento de la escritura) los usuarios no privilegiados, que no son del sistema, inician sesión como el rol 'nonfined_u'. Sin embargo, podemos cambiar nuestro sistema para que nuestro usuario no privilegiado 'alice' se coloque en el rol 'user_u' en su lugar. Las políticas predeterminadas se pueden hacer para restringir claramente esta función con solo una pequeña cantidad de configuración adicional.

    [root]# echo "alice:user_u:s0-s0:c0.c1023" >> /etc/selinux/targeted/seusers
    
  2. Ahora apague la capacidad de estos usuarios para ejecutar archivos ubicados en sus directorios de inicio y / tmp. Una vez más, el valor predeterminado es permitir este comportamiento. Este comando puede tardar un momento en completarse .

    [root]# setsebool -P user_exec_content off
    
  3. Ahora (con nuestro usuario no privilegiado) podemos iniciar sesión e intentar ejecutar algo en una de estas áreas prohibidas. Como puede ver, se nos niega.

    [alice]$ cp /bin/ls /tmp/
    [alice]$ /tmp/ls
    -bash: /tmp/ls: Permission denied
    
  4. Finalmente, podemos ver el registro AVC para ver nuestra negación SELinux.

    [root]# aureport -a
    
    AVC Report
    ========================================================
    # date time comm subj syscall class permission obj event
    ========================================================
    1. 02/05/15 21:08:33 bash user_u:user_r:user_t:s0 59 file execute user_u:object_r:user_tmp_t:s0 denied 693
    
Pensativo
fuente
Oye, sí, eso funciona! Me gusta específicamente que haya elegido este enfoque de "contenido no ejecutivo", ya que esto definitivamente debería entenderse. He tendido a preferir el auditado para evitar la creación de ejecutables en primer lugar, pero también me gusta. Un caso de uso: uso un servicio común basado en la nube que dificulta la instalación de un nuevo software (debe usar su administrador de paquetes y no hay sudo), pero no tiene mucho sentido; no bloquean la creación ni la ejecución y son entornos de desarrollo ... así que simplemente elimino / scp los paquetes que necesito y los compilo . +1
3bρɯͽ
1

A menos que haya cambiado sus políticas en la pestaña Booleana de system-config-selinux (o en / etc / selinux / policy), el valor predeterminado debería responder a lo siguiente (NB, es posible que también desee instalar setroubleshoot para una inmersión más profunda) :

mkdir -m 755 -p / install / ks

cp /root/anaconda-ks.cfg / install / ks

chmod 644 /install/ks/anaconda-ks.cfg

Luego, reinicie su servidor web e intente acceder a http: // localhost / ks con su navegador web. Debería ver un mensaje "Prohibido". Si está siguiendo /var/log/audit/audit.logo si está ejecutando ausearch -m avc -ts recent, entonces debería poder ver el mensaje:type=AVC msg=audit(1391277951.222:266): avc: denied { read } for pid=1731 comm="httpd" name="ks" dev=sda1 ino=22351 scontext=system_u:system_r:httpd_t:s0 tcontext=unconfined u:object r:default t:s0 tclass=dir

Luego puede cambiar el contexto de SELinux chcon -Rv --reference /var/www/html /install/kssi no desea deshabilitar SELinux pero puede acceder al recurso.

EDITAR: lo siento, no vi que dijiste "no es un servidor web". Intente chcon -u fake_u <filename>usar una cuenta sin privilegios en un archivo del sistema.

atdre
fuente
No pude hacer funcionar su segunda sugerencia (usando un usuario recién creado). También prefiero una prueba que sea más genérica, un ejemplo de un MAC intensificando donde el DAC lo hubiera permitido: mientras que esto prueba qué tan bien SELinux puede proteger contra los cambios administrativos en el etiquetado de SELinux.
Pensativo
0

instale dos paquetes pequeños, sin dependencias

  yum install -y vsftpd lftp

iniciar un servidor FTP

  systemctl start vsftpd

crear un archivo en la casa de root

  touch ~/tux.tch

pasar de la raíz al directorio FTP.
nota: mover, no copiar, o el texto del archivo cambiará

  mv ~/tux.tch /var/ftp/pub

inicie sesión en su servidor FTP como usuario del cliente FTP e intente acceder al nuevo archivo.
nota: la finalización automática de pestañas no funcionará aquí

  lftp localhost
    ls pub/tux.tch
    exit

ver la negación en los registros sin procesar

  grep AVC /var/log/audit/audit.log

o si has setroubleshoot*instalado

  grep sealert /var/log/messages
infinito-etcétera
fuente