7.2. Creación y aplicación de una política SELinux para una aplicación personalizada


Este procedimiento de ejemplo proporciona los pasos para confinar un simple demonio mediante SELinux. Sustituya el demonio por su aplicación personalizada y modifique la regla de ejemplo según los requisitos de esa aplicación y su política de seguridad.

Requisitos previos

  • El paquete policycoreutils-devel y sus dependencias están instalados en su sistema.

Procedimiento

  1. Para este procedimiento de ejemplo, prepare un demonio simple que abra el archivo /var/log/messages para escribir:

    1. Cree un nuevo archivo y ábralo en un editor de texto de su elección:

      $ vi mydaemon.c
      Copy to Clipboard Toggle word wrap
    2. Inserte el siguiente código:

      #include <unistd.h>
      #include <stdio.h>
      
      FILE *f;
      
      int main(void)
      {
      while(1) {
      f = fopen("/var/log/messages","w");
              sleep(5);
              fclose(f);
          }
      }
      Copy to Clipboard Toggle word wrap
    3. Compilar el archivo:

      $ gcc -o mydaemon mydaemon.c
      Copy to Clipboard Toggle word wrap
    4. Cree un archivo de unidad systemd para su demonio:

      $ vi mydaemon.service
      [Unit]
      Description=Simple testing daemon
      
      [Service]
      Type=simple
      ExecStart=/usr/local/bin/mydaemon
      
      [Install]
      WantedBy=multi-user.target
      Copy to Clipboard Toggle word wrap
    5. Instalar e iniciar el demonio:

      # cp mydaemon /usr/local/bin/
      # cp mydaemon.service /usr/lib/systemd/system
      # systemctl start mydaemon
      # systemctl status mydaemon
      ● mydaemon.service - Simple testing daemon
         Loaded: loaded (/usr/lib/systemd/system/mydaemon.service; disabled; vendor preset: disabled)
         Active: active (running) since Sat 2020-05-23 16:56:01 CEST; 19s ago
       Main PID: 4117 (mydaemon)
          Tasks: 1
         Memory: 148.0K
         CGroup: /system.slice/mydaemon.service
                 └─4117 /usr/local/bin/mydaemon
      
      May 23 16:56:01 localhost.localdomain systemd[1]: Started Simple testing daemon.
      Copy to Clipboard Toggle word wrap
    6. Comprueba que el nuevo demonio no está limitado por SELinux:

      $ ps -efZ | grep mydaemon
      system_u:system_r:unconfined_service_t:s0 root 4117    1  0 16:56 ?        00:00:00 /usr/local/bin/mydaemon
      Copy to Clipboard Toggle word wrap
  2. Generar una política personalizada para el demonio:

    $ sepolicy generate --init /usr/local/bin/mydaemon
    Created the following files:
    /home/example.user/mysepol/mydaemon.te # Type Enforcement file
    /home/example.user/mysepol/mydaemon.if # Interface file
    /home/example.user/mysepol/mydaemon.fc # File Contexts file
    /home/example.user/mysepol/mydaemon_selinux.spec # Spec file
    /home/example.user/mysepol/mydaemon.sh # Setup Script
    Copy to Clipboard Toggle word wrap
  3. Reconstruya la política del sistema con el nuevo módulo de política utilizando el script de configuración creado por el comando anterior:

    # ./mydaemon.sh
    Building and Loading Policy
    + make -f /usr/share/selinux/devel/Makefile mydaemon.pp
    Compiling targeted mydaemon module
    Creating targeted mydaemon.pp policy package
    rm tmp/mydaemon.mod.fc tmp/mydaemon.mod
    + /usr/sbin/semodule -i mydaemon.pp
    ...
    Copy to Clipboard Toggle word wrap

    Tenga en cuenta que el script de configuración reetiqueta la parte correspondiente del sistema de archivos mediante el comando restorecon:

    restorecon -v /usr/local/bin/mydaemon /usr/lib/systemd/system
    Copy to Clipboard Toggle word wrap
  4. Reinicie el demonio, y compruebe que ahora se ejecuta confinado por SELinux:

    # systemctl restart mydaemon
    $ ps -efZ | grep mydaemon
    system_u:system_r:mydaemon_t:s0 root        8150       1  0 17:18 ?        00:00:00 /usr/local/bin/mydaemon
    Copy to Clipboard Toggle word wrap
  5. Dado que el demonio está ahora confinado por SELinux, éste también le impide acceder a /var/log/messages. Muestra el mensaje de denegación correspondiente:

    # ausearch -m AVC -ts recent
    ...
    type=AVC msg=audit(1590247112.719:5935): avc:  denied  { open } for  pid=8150 comm="mydaemon" path="/var/log/messages" dev="dm-0" ino=2430831 scontext=system_u:system_r:mydaemon_t:s0 tcontext=unconfined_u:object_r:var_log_t:s0 tclass=file permissive=1
    ...
    Copy to Clipboard Toggle word wrap
  6. También puede obtener información adicional utilizando la herramienta sealert:

    $ sealert
    SELinux is preventing mydaemon from open access on the file /var/log/messages.
    
     Plugin catchall (100. confidence) suggests *
    
    If you believe that mydaemon should be allowed open access on the messages file by default.
    Then you should report this as a bug.
    You can generate a local policy module to allow this access.
    Do
    allow this access for now by executing:
    # ausearch -c 'mydaemon' --raw | audit2allow -M my-mydaemon
    # semodule -X 300 -i my-mydaemon.pp
    
    Additional Information:
    Source Context                system_u:system_r:mydaemon_t:s0
    Target Context                unconfined_u:object_r:var_log_t:s0
    Target Objects                /var/log/messages [ file ]
    Source                        mydaemon
    
    ...
    Copy to Clipboard Toggle word wrap
  7. Utilice la herramienta audit2allow para sugerir cambios:

    $ ausearch -m AVC -ts recent | audit2allow -R
    
    require {
    	type mydaemon_t;
    }
    
    #============= mydaemon_t ==============
    logging_write_generic_logs(mydaemon_t)
    Copy to Clipboard Toggle word wrap
  8. Dado que las reglas sugeridas por audit2allow pueden ser incorrectas para ciertos casos, utilice sólo una parte de su salida para encontrar la interfaz de política correspondiente:

    $ grep -r "logging_write_generic_logs" /usr/share/selinux/devel/include/ | grep .if
    /usr/share/selinux/devel/include/system/logging.if:interface(logging_write_generic_logs',
    Copy to Clipboard Toggle word wrap
  9. Compruebe la definición de la interfaz:

    $ cat /usr/share/selinux/devel/include/system/logging.if
    ...
    interface(logging_write_generic_logs',
            gen_require(`
                    type var_log_t;
            ')
    
            files_search_var($1)
            allow $1 var_log_t:dir list_dir_perms;
            write_files_pattern($1, var_log_t, var_log_t)
    ')
    ...
    Copy to Clipboard Toggle word wrap
  10. En este caso, puede utilizar la interfaz sugerida. Añada la regla correspondiente a su archivo de aplicación de tipos:

    $ echo "logging_write_generic_logs(mydaemon_t)" >> mydaemon.te
    Copy to Clipboard Toggle word wrap

    También puede añadir esta regla en lugar de utilizar la interfaz:

    $ echo "allow mydaemon_t var_log_t:file { open write getattr };" >> mydaemon.te
    Copy to Clipboard Toggle word wrap
  11. Vuelva a instalar la política:

    # ./mydaemon.sh
    Building and Loading Policy
    + make -f /usr/share/selinux/devel/Makefile mydaemon.pp
    Compiling targeted mydaemon module
    Creating targeted mydaemon.pp policy package
    rm tmp/mydaemon.mod.fc tmp/mydaemon.mod
    + /usr/sbin/semodule -i mydaemon.pp
    ...
    Copy to Clipboard Toggle word wrap

Pasos de verificación

  1. Compruebe que su aplicación se ejecuta confinada por SELinux, por ejemplo:

    $ ps -efZ | grep mydaemon
    system_u:system_r:mydaemon_t:s0 root        8150       1  0 17:18 ?        00:00:00 /usr/local/bin/mydaemon
    Copy to Clipboard Toggle word wrap
  2. Compruebe que su aplicación personalizada no causa ninguna denegación de SELinux:

    # ausearch -m AVC -ts recent
    <no matches>
    Copy to Clipboard Toggle word wrap

Recursos adicionales

  • Para más información, consulte las páginas de manual sepolgen(8), ausearch(8), audit2allow(1), audit2why(1), sealert(8) y restorecon(8).
Volver arriba
Red Hat logoGithubredditYoutubeTwitter

Aprender

Pruebe, compre y venda

Comunidades

Acerca de la documentación de Red Hat

Ayudamos a los usuarios de Red Hat a innovar y alcanzar sus objetivos con nuestros productos y servicios con contenido en el que pueden confiar. Explore nuestras recientes actualizaciones.

Hacer que el código abierto sea más inclusivo

Red Hat se compromete a reemplazar el lenguaje problemático en nuestro código, documentación y propiedades web. Para más detalles, consulte el Blog de Red Hat.

Acerca de Red Hat

Ofrecemos soluciones reforzadas que facilitan a las empresas trabajar en plataformas y entornos, desde el centro de datos central hasta el perímetro de la red.

Theme

© 2025 Red Hat