Cómo crear una etiqueta SELinux personalizada

11

Escribí un servicio / aplicación binaria única que estoy tratando de ejecutar en Fedora 24, se ejecuta utilizando systemd, el binario se implementa en /srv/bot

Este servicio / aplicación que escribí necesita crear / abrir / leer y renombrar archivos en este directorio.

Primero comencé a crear una nueva política basada en SELinux: permitir un proceso para crear cualquier archivo en un determinado directorio

pero cuando mi aplicación necesitaba cambiar el nombre, la salida tenía una advertencia:

#!!!! WARNING: 'var_t' is a base type.
allow init_t var_t:file rename;

Busqué en Google y descubrí que debería usar una etiqueta SELinux más específica que un tipo base, pero todos los ejemplos en línea muestran etiquetas existentes de httpd / nginx / etc.

¿Hay alguna manera de crear una etiqueta personalizada solo para mi propia aplicación?

Mi idea es crear algo como myapp_var_t, usar

semanage fcontext -a -t my_app_var_t '/srv/bot(/.*)?'
restorecon -R -v /srv/bot

y un .pparchivo personalizado que usará este tipo personalizado

Si hay una mejor manera de resolverlo, eso también funciona.

Gracias

Actualizar

Después de más búsquedas, creo que el término apropiado para lo que quiero hacer es crear nuevas typesque me llevaron a https://docs.fedoraproject.org/en-US/Fedora/13/html/SELinux_FAQ/index.html#id3036916

que básicamente dice, corre

sepolgen /path/to/binary

y pude obtener una plantilla que luego puedo compilar en un archivo pp y cargar, todavía recibo algunos errores pero parece que estoy más cerca de lo que quiero hacer.

Si lo hago funcionar, actualizaré esta publicación

fmpwizard
fuente

Respuestas:

11

Con el punto de partida de la carrera.

sepolgen /path/to/binary

que te da:

app.fc
app.sh
app.if
app.spec
app.te

Para crear una nueva SELinux file contextaplicación a un directorio principal que contiene sus archivos de programa / demonio va a modificar, editar el archivo app.te y agrega:

type app_var_t;
files_type(app_var_t)

La primera línea declara el nuevo tipo y la segunda línea llama a una macro que hace algo de magia y lo convierte en un tipo de archivo (resulta que no puede usar una línea de contexto de proceso app_exec_t en un archivo o directorio), consulte "Tipos revisados ​​de SELinux" para obtener más información. información sobre los diferentes tipos

Una vez que haya declarado el tipo, debe decirle a SELinux que su aplicación puede usarlo, en mi caso agregué

allow app_t app_var_t:dir { add_name remove_name write search};
allow app_t app_var_t:file { unlink create open rename write read };

Esas dos líneas básicamente dicen: permitir que el tipo app_t, que es el dominio de mi aplicación, escriba / busque / etc directorios con el contexto app_var_ty le permita crear / abrir / eliminar / etc archivos con el contexto app_var_t

La última parte del rompecabezas es decirle de alguna manera a SELinux qué carpeta (s) y archivo (s) deben tener cada tipo, esto se hace editando el app.fcarchivo (fc => contexto del archivo)

este archivo solo tiene dos líneas en mi caso:

/srv/bot/app        --  gen_context(system_u:object_r:app_exec_t,s0)
/srv/bot(/.*)?          gen_context(system_u:object_r:app_var_t,s0)

la primera línea apunta directamente al binario desplegado en mis servidores, por lo que este obtiene el contexto app_exec_t.

La segunda línea significa:

Aplique app_var_t al directorio / srv / bot y también a todos los archivos dentro del directorio / srv / bot

Tenga en cuenta cómo la primera línea tiene --entre la ruta y la llamada a gen_context. --significa, aplicar esto solo a archivos. en el segundo caso no tenemos nada (solo espacios), lo que significa que se aplica a todos los directorios y archivos coincidentes, que es lo que quería, otra opción es tener -dque aplicar solo directorios.

Ahora tengo una política de trabajo, puedo implementar mi aplicación con una política personalizada y todo funciona. (mi política tiene muchas más entradas en el .tearchivo pero está fuera del alcance de esta pregunta).

Material de lectura adicional que me ayudó a llegar a esta solución:

Hacer las cosas más fáciles con sepolgen

Piensa antes de auditar ciegamente2allow -M mydomain

SELinux PARA DESARROLLADORES DE SOMBREROS ROJOS (PDF largo)

Un módulo SElinux (1): tipos y reglas

Política de muestra (especialmente el postgresql)

Comprensión de los archivos de contextos de archivo

fmpwizard
fuente
O use CIL
Jakuje
sepolgen /path/to/binaryescupe un error de sintaxis para mí. Estoy en RHEL 7.6. ¿Creo que sepolgen --application /path/to/binaryes la sintaxis adecuada si su objetivo es escribir una política para una aplicación en particular?
jayhendren
Su .tearchivo también genera un error de sintaxis para mí al compilar el módulo: app.te:5:ERROR 'This block has no require section.' at token 'files_type' on line 5:. Y si agrego una requiresección, obtengo:ERROR 'syntax error' at token 'files_type' on line 13:
jayhendren
Lo siento, ya no tengo acceso a una máquina Fedora para probarlo, pero podría ser que desde la versión 24, cambiaron la sintaxis.
fmpwizard