Passer au contenu principal

SELinux

Web

Autoriser un dossier à être lu par le serveur Web.

chcon -Rt httpd_sys_content_t /path/to/www

Conteneurs

Autoriser un conteneur à accéder à un dossier mappé sur l'hôte (flag Z).

podman run --rm -v /path/to/volume:/data:Z debian

Creer une policy custom (podman):

Extraire les settings du conteneur et run udica dessus :

podman inspect [id/nom du pod] > conteneur.json

udica -j conteneur.json mon_conteneur

Editer le fichier .cil créé, et ajouter/modifier selon ce que vous voulez autoriser

Exemple pour qbittorrent :

(block qbittorrent
    (blockinherit container)
    (blockinherit restricted_net_container)
    (allow process process ( capability ( chown dac_override fowner fsetid kill net_bind_service setfcap setgid setpcap setuid sys_chroot )))
    
    # Autorise a se bind et a contacter tous les ports
    (allow process port_type ( tcp_socket (  name_bind name_connect )))
    (allow process port_type ( udp_socket (  name_bind )))

    # Autorise a acceder aux fichier avec le contexte httpd_user_ra_content_t
    (allow process httpd_user_ra_content_t ( dir ( add_name create getattr ioctl lock open read remove_name rmdir search setattr write )))
    (allow process httpd_user_ra_content_t ( file ( append create getattr ioctl lock map open read rename setattr link unlink write )))
    (allow process httpd_user_ra_content_t ( fifo_file ( getattr read write append ioctl lock open )))
    (allow process httpd_user_ra_content_t ( sock_file ( append getattr open read write link create setattr unlink execute rename )))

    (allow process default_t ( dir ( add_name create getattr ioctl lock open read remove_name rmdir search setattr write )))
    (allow process default_t ( file ( append create getattr ioctl lock map open read rename setattr unlink write )))
    (allow process default_t ( fifo_file ( getattr read write append ioctl lock open )))
    (allow process default_t ( sock_file ( append getattr open read write )))
    (allow process var_t ( dir ( add_name create getattr ioctl lock open read remove_name rmdir search setattr write )))
    (allow process var_t ( file ( append create getattr ioctl lock map open read rename setattr unlink write )))
    (allow process var_t ( fifo_file ( getattr read write append ioctl lock open )))
    (allow process var_t ( sock_file ( append getattr open read write )))
)

Définir le contexte (httpd_user_ra_content_t ici) des dossiers qui sont accedés par le conteneur (et d'autres process éventuels)

semanage fcontext -a -t httpd_user_ra_content_t "/var/opt/qbittorrent/config(/.*)?"
semanage fcontext -a -t httpd_user_ra_content_t "/data/downloads(/.*)?"
restorecon -Rv /var/opt/qbittorrent/config/  # Ajouter l'option -F si ça marche pas
restorecon -Rv /data/downloads/ # Pareil

importer la policy :

semodule -i qbittorrent.cil /usr/share/udica/templates/{base_container.cil,net_container.cil}

relancer le conteneur, verifier les alertes selinux, autoriser ce qui génère les alertes, supprimer et reimporter la policy, relancer le conteneur, repeat until it works...

semodule -r qbittorent  # Supprime la policy
tail -f /var/log/audit/audit.log  # Lookout for les AVC here

HowCustom ToServices createoutside acontainer

Custom policy SELINUX

  • CreerCréer un dossier /root/SELinux/<name>
  • Dans ce dossier générer le template avec sepolicy generate --init <path_de_l'executable>
  • Editer les fichiers nécessaire, puis recompiler la politique avec ./<name>.sh

Le fichier .te contient les régles de "policy type enforcement"

Le fichier .fc contient les "droits" selinux appliqué aux fichiers

Fichier .te

Lale commandefichier permissive bash_t;.te est composé en différentes parties:

Des critefinitions ici:de https://unix.stackexchange.com/questions/542121/what-does-permissive-statement-mean-in-selinux-policy-type-enforcement-te-ftypes:

type gonic_t; : ici on définir le type gonic_t (merci captain obvious)

permissive statement allows type bash_tgonic_file_t;
to run in permissive mode (instead of running whole system in permissive mode). Permissive mode is set with semanage.files_type(gonic_file_t)

on définit le type gonic_file_t, et on dit à SELINUX que ce sera un type pour les fichiers (et dossier)

Des imports de type déja existant:
require {
    type httpd_user_ra_content_t;
	type var_t;
}

Des fonctions

manage_files_pattern(gonic_t, gonic_file_t, gonic_file_t)

Cette fonction peut être découverte via la commande bash suivante: macro-expander "manage_files_pattern(gonic_t, gonic_file_t, gonic_file_t)"

Qui nous donne:

allow gonic_t gonic_file_t:dir { open read getattr lock search ioctl add_name remove_name write };
allow gonic_t gonic_file_t:file { create open getattr setattr read write append rename link unlink ioctl lock watch watch_reads };

en gros, les executables gonic_t pourront lire et ecrire les dossier et fichiers avec gonic_file_t

Quelques fonction utiles:

  • files_read_etc_files(gonic_t) pour lire les fichiers dans /etc
  • corenet_tcp_bind_generic_node(gonic_t)
  • corenet_tcp_bind_generic_port(gonic_t)
  • manage_files_pattern(gonic_t, gonic_file_t, gonic_file_t)"

Des régles:

Les règles commencent par allow puis le type SELINUX gonic_t de l'executable, puis le type SELINUX sur lequel on veut une permission gonic_file_t:dir ou self:unix_stream_socket puis un droit ou plusieurs {read map getattr open}

Par exemple:

  • allow gonic_t httpd_user_ra_content_t:file {read map getattr open}; on autorise gonic_t a 'read, map, getattr et open' sur les fichiers httpd_user_ra_content_t

on peux remplacer le :file par :dir

  • allow gonic_t httpd_user_ra_content_t:dir { getattr search open read};