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
Para este procedimiento de ejemplo, prepare un demonio simple que abra el archivo
/var/log/messages
para escribir:Cree un nuevo archivo y ábralo en un editor de texto de su elección:
$ vi mydaemon.c
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); } }
Compilar el archivo:
$ gcc -o mydaemon mydaemon.c
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
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.
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
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
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 ...
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
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
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 ...
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 ...
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)
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',
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) ') ...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
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
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 ...
Pasos de verificación
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
Compruebe que su aplicación personalizada no causa ninguna denegación de SELinux:
# ausearch -m AVC -ts recent <no matches>
Recursos adicionales
-
Para más información, consulte las páginas de manual
sepolgen(8)
,ausearch(8)
,audit2allow(1)
,audit2why(1)
,sealert(8)
yrestorecon(8)
.