Ceci est une ancienne révision du document !
Table des matières
Selinux
Sources
Description
Security-Enhanced Linux, abrégé SELinux, est un LSM (Linux security module), qui permet de définir une politique d'accès MAC (mandatory access control) aux éléments d'un système basé sur Linux.
Les Modes
- Enforcing : il s'agit du mode proposé par défaut à l'installation de Fedora. Dans ce mode, les accès sont restreints en fonction des règles SELinux en vigueur sur la machine.
- Permissive : ce mode est généralement à considérer comme un mode de déboguage. En mode permissif, les règles SELinux seront interrogées, les erreurs d'accès logguées, mais l'accès ne sera pas bloqué. Ce mode peut être utile pour constater l'ensemble des erreurs SELinux posées par un processus particulier, par exemple.
- Disabled : SELinux est désactivé. Rien ne sera restreint, rien ne sera loggué
Contexte SELinux
Chaque processus est confiné à un (voire plusieurs) domaine, et les fichiers sont étiquetés en conséquence. Pour simplifier, un processus ne peut accéder qu'aux fichiers étiquetés pour le domaine auquel il est confiné.
Un contexte SELinux est présenté de la manière suivante :
utilisateur:rôle:type:niveau
Pour le contexte du dossier /var/www/html
:
system_u:object_r:httpd_sys_content_t:s0 html
Nous avons donc :
- l'utilisateur system_u
- le rôle object_r
- le type httpd_sys_content_t
- et le niveau s0
Utilisateurs
Tout utilisateur Linux est mappé à un utilisateur SELinux par la politique actuelle. Ce mappage permet l'héritage des droits et restrictions de l'utilisateur SELinux correspondant.
La liste des utilisateurs SELinux peut être obtenue avec la commande semanage login -l :
$ semanage login -l Nom pour l'ouverture de session Identité SELinux Intervalle MLS/MCS Service __default__ unconfined_u s0-s0:c0.c1023 * root unconfined_u s0-s0:c0.c1023 * system_u system_u s0-s0:c0.c1023 *
Rôles
Les rôles sont l'intermédiaire entre les utilisateurs et les domaines SELinux. Les domaines sont accessibles par des rôles définis, et les rôles sont eux-mêmes accessibles par des utilisateurs définis.
Types
Un type SELinux est en quelque sorte un regroupement d'objets sur leur similarité d'un point de vue sécurité ; qui ne sont donc pas liés à un contexte ou à un fichier particulier. Par exemple, les dossiers personnels des utilisateurs peuvent contenir des contenus très différents, donc la particularité commune est d'appartenir à un utilisateur ; on trouvera dans ce cas précis le type home_user_t.
Niveau
Interface graphique
Une interface graphique est disponible pour la gestion des différents paramètres de SELinux. Normalement, l'interface est installée par défaut, si tel n'était pas le cas, faites simplement :
$ yum -y install policycoreutils-gui
Relabeliser l'OS
$ touch /.autorelabel
audit2allow
Ajouter des régles
Voir : http://selinuxproject.org/page/Audit2allowRecipe
- Créer un fichier pour un module test :
$ grep smtpd_t /var/log/audit/audit.log | audit2allow -m test > test.te $ cat test.te module test 1.0; require { type postfix_smtpd_t; type postfix_spool_t; type initrc_t; class sock_file write; class unix_stream_socket connectto; } #============= postfix_smtpd_t ============== allow postfix_smtpd_t initrc_t:unix_stream_socket connectto; allow postfix_smtpd_t postfix_spool_t:sock_file write;
- Ajouter la règle directement :
$ grep smtpd_t /var/log/audit/audit.log | audit2allow -M test
- On active le module :
$ semodule -i test.pp
Analyser les bloquages
$ audit2allow -a -w
$ audit2allow -la #============= ifconfig_t ============== #!!!! WARNING 'ifconfig_t' is not allowed to write or create to var_run_t. Change the label to ifconfig_var_run_t. #!!!! $ semanage fcontext -a -t ifconfig_var_run_t /run/tlp/lock_tlp #!!!! $ restorecon -R -v /run/tlp/lock_tlp #!!!! The file '/run/tlp/lock_tlp' is mislabeled on your system. #!!!! Fix with $ restorecon -R -v /run/tlp/lock_tlp allow ifconfig_t var_run_t:file write; #============= tlp_t ============== #!!!! WARNING 'tlp_t' is not allowed to write or create to var_run_t. Change the label to tlp_var_run_t. allow tlp_t var_run_t:file { getattr lock open read write };
Il y a aussi la log /var/log/audit/audit.log
qui renseigne les blocages.
- Voir les blocage httpd :
$ ausearch -m avc -c httpd
- Voir les blocages de la journée :
$ ausearch -m avc -ts today
- Voir les blocages des 10 dernière minutes :
$ ausearch -m avc -ts recent
- Voir tous les problèmes :
$ aureport -a
- Transformer une date auditd :
$ date -d @1363292159.532 jeu. mars 14 21:15:59 CET 2013
man
Générer les man à l'aide de sepolicy :
$ sepolicy manpage -a -p /usr/share/man/man8 $ mandb $ man -k _selinux $ man httpd_selinux
audit2why
Comprendre pourquoi il y a eu un blocage :
$ /usr/sbin/audit2why < /var/log/audit/audit.log type=KERNEL msg=audit(1115316408.926:336418): avc: denied { getattr } for path=/home/sds dev=hda5 ino=1175041 scontext=root:secadm_r:secadm_t:s0-s9:c0.c127 tcontext=user_u:object_r:user_home_dir_t:s0 tclass=dir Was caused by: Missing or disabled TE allow rule. Allow rules may exist but be disabled by boolean settings; check boolean settings. You can see the necessary allow rules by running audit2allow with this audit message as input. type=KERNEL msg=audit(1115320071.648:606858): avc: denied { append } for name=.bash_history dev=hda5 ino=1175047 scontext=user_u:user_r:user_t:s1-s9:c0.c127 tcontext=user_u:object_r:user_home_t:s0 tclass=file Was caused by: Constraint violation. Check policy/constraints. Typically, you just need to add a type attribute to the domain to satisfy the constraint.
sealert
Afficher les solutions pour une alerte :
$ journalctl --no-pager -t setroubleshoot
$ sealert -l 8f01dd48-8337-4ee9-b5d6-952da4422b14 SELinux is preventing iw from write access on the file /run/tlp/lock_tlp. ***** Plugin restorecon (99.5 confidence) suggests ************************ If vous souhaitez corriger l'étiquette. L'étiquette par défaut de /run/tlp/lock_tlp devrait être tlp_var_run_t. Then vous pouvez exécuter restorecon. Do # /sbin/restorecon -v /run/tlp/lock_tlp ***** Plugin catchall (1.49 confidence) suggests ************************** If vous pensez que iw devrait être autorisé à accéder write sur lock_tlp file par défaut. Then vous devriez rapporter ceci en tant qu'anomalie. Vous pouvez générer un module de stratégie local pour autoriser cet accès. Do allow this access for now by executing: # ausearch -c 'iw' --raw | audit2allow -M my-iw # semodule -X 300 -i my-iw.pp Additional Information: Source Context system_u:system_r:ifconfig_t:s0-s0:c0.c1023 Target Context system_u:object_r:var_run_t:s0 Target Objects /run/tlp/lock_tlp [ file ] Source iw Source Path iw Port <Unknown> Host portable.localdomain Source RPM Packages Target RPM Packages Policy RPM selinux-policy-3.13.1-225.13.fc25.noarch Selinux Enabled True Policy Type targeted Enforcing Mode Enforcing Host Name portable.localdomain Platform Linux portable.localdomain 4.10.11-200.fc25.x86_64 #1 SMP Tue Apr 18 17:25:01 UTC 2017 x86_64 x86_64 Alert Count 14 First Seen 2017-03-20 11:18:00 CET Last Seen 2017-04-27 20:40:40 CEST Local ID 8f01dd48-8337-4ee9-b5d6-952da4422b14 Raw Audit Messages type=AVC msg=audit(1493318440.152:161): avc: denied { write } for pid=1297 comm="iw" path="/run/tlp/lock_tlp" dev="tmpfs" ino=29849 scontext=system_u:system_r:ifconfig_t:s0-s0:c0.c1023 tcontext=system_u:object_r:var_run_t:s0 tclass=file permissive=0
Modules
Description des permissions
Fichier de configuration
Commandes OS
- Voir les permissions des processus :
$ ps fauxZwww
- Voir les permissions des fichiers :
$ ls -lZ
- Voir les permission pour sa session courante :
$ id -Z
Commandes selinux
getenforce
La commande getenforce vous informera sur le mode actuellement actif sur votre machine :
$ getenforce Permissive
sestatus
Pour connaître l'état général (activé ou désactivé, mode courant, politique chargée, etc…), utilisez la commande sestatus :
$ sestatus SELinux status: enabled SELinuxfs mount: /sys/fs/selinux SELinux root directory: /etc/selinux Loaded policy name: targeted Current mode: permissive Mode from config file: enforcing Policy MLS status: enabled Policy deny_unknown status: allowed Max kernel policy version: 29 Process contexts: Current context: unconfined_u:unconfined_r:unconfined_t:s0-s0:c0.c1023 Init context: system_u:system_r:init_t:s0 File contexts: Controlling terminal: unconfined_u:object_r:user_devpts_t:s0 /etc/passwd system_u:object_r:passwd_file_t:s0 /etc/shadow system_u:object_r:shadow_t:s0 /bin/bash system_u:object_r:shell_exec_t:s0 /bin/login system_u:object_r:login_exec_t:s0 /bin/sh system_u:object_r:bin_t:s0 -> system_u:object_r:shell_exec_t:s0 /sbin/agetty system_u:object_r:getty_exec_t:s0 /sbin/init system_u:object_r:bin_t:s0 -> system_u:object_r:init_exec_t:s0 /usr/sbin/sshd system_u:object_r:sshd_exec_t:s0
setenforce
La commande setenforce permet de basculer de façon temporaire (la modification ne sera pas prise ne compte au prochain redémarrage de votre machine) entre les modes Appliqué et Permissif. Si vous souhaitez rendre la modification permanente, utilisez setenforce 1 pour activer le mode Appliqué ou setenforce 0 pour activer le mode Permissif.
Editer le fichier /etc/selinux/config
pour une modification définitive.
$ touch /.autorelabel'puis redémarrez votre système. Au démarrage, l'intégralité de vos fichiers sera ré-étiquettée, cela peut prendre un certain temps ; à plus forte raison si vous avez beaucoup de fichiers.
sesearch
Il est possible de connaître la liste des contextes auxquels peut accéder un processus à l'aide de la commande sesearch.
$ sesearch --allow -s httpd_t -c file -p write WARNING: This policy contained disabled aliases; they have been removed. Found 29 semantic av rules: allow httpd_t httpd_t : file { ioctl read write getattr lock append } ; allow httpd_t httpd_var_lib_t : file { ioctl read write create getattr setattr lock append unlink link rename open } ; allow httpd_t httpd_var_run_t : file { ioctl read write create getattr setattr lock append unlink link rename open } ; allow httpd_t httpd_lock_t : file { ioctl read write create getattr setattr lock append unlink link rename open } ; allow @ttr2119 xdm_home_t : file { ioctl read write getattr lock append } ; allow httpd_t @ttr2306 : file { ioctl read write create getattr setattr lock append unlink link rename open } ; allow httpd_t squirrelmail_spool_t : file { ioctl read write create getattr setattr lock append unlink link rename open } ; allow httpd_t httpd_cache_t : file { ioctl read write create getattr setattr lock append unlink link rename open } ; allow httpd_t httpd_tmpfs_t : file { ioctl read write create getattr setattr lock append unlink link rename open } ; allow httpd_t httpd_tmp_t : file { ioctl read write create getattr setattr lock append unlink link rename open } ; allow httpd_t httpd_squirrelmail_t : file { ioctl read write create getattr setattr lock append unlink link rename open } ; allow @ttr2119 user_tmp_t : file { ioctl write getattr lock append } ; allow httpd_t httpd_squid_content_rw_t : file { ioctl read write create getattr setattr lock append unlink link rename open } ; allow httpd_t httpd_awstats_content_rw_t : file { ioctl read write create getattr setattr lock append unlink link rename open } ; allow httpd_t httpd_apcupsd_cgi_content_rw_t : file { ioctl read write create getattr setattr lock append unlink link rename open } ; allow httpd_t public_content_rw_t : file { ioctl read write create getattr setattr lock append unlink link rename open } ; allow httpd_t httpd_prewikka_content_rw_t : file { ioctl read write create getattr setattr lock append unlink link rename open } ; allow @ttr2119 root_t : file { ioctl read write create getattr setattr lock append unlink link rename open } ; allow httpd_t httpd_w3c_validator_content_rw_t : file { ioctl read write create getattr setattr lock append unlink link rename open } ; allow httpd_t cifs_t : file { ioctl read write create getattr setattr lock append unlink link rename open } ; allow httpd_t nfs_t : file { ioctl read write create getattr setattr lock append unlink link rename open } ; allow httpd_t httpd_user_content_rw_t : file { ioctl read write create getattr setattr lock append unlink link rename open } ; allow httpd_t @ttr0804 : file { ioctl read write create getattr setattr lock append unlink link rename open } ; allow httpd_t httpd_munin_content_rw_t : file { ioctl read write create getattr setattr lock append unlink link rename open } ; allow httpd_t httpd_bugzilla_content_rw_t : file { ioctl read write create getattr setattr lock append unlink link rename open } ; allow httpd_t httpd_nagios_content_rw_t : file { ioctl read write create getattr setattr lock append unlink link rename open } ; allow httpd_t httpd_sys_content_rw_t : file { ioctl read write create getattr setattr lock append unlink link rename open } ; allow httpd_t httpd_sys_content_rw_t : file { ioctl read write create getattr setattr lock append unlink link rename open } ; allow httpd_t httpd_cvs_content_rw_t : file { ioctl read write create getattr setattr lock append unlink link rename open } ;
Tout fichier qui ne serait pas étiqueté avec l'un des contextes listés ne serait pas accessible par le processus httpd ; donc votre serveur apache n'aurait pas le droit de lire le fichier, et ce même si les droits unix le lui permettent.
- Voir ce que httpd_t peut faire vers le contexte user_home_t (les champs entre crochets sont des booléens) :
$ sesearch -s httpd_t -t user_home_t -AC Found 7 semantic av rules: allow daemon user_home_t : file { getattr append } ; allow httpd_t file_type : filesystem getattr ; allow httpd_t file_type : dir { getattr search open } ; DT allow httpd_t user_home_type : file { ioctl read getattr lock open } ; [ httpd_read_user_content ] DT allow httpd_t user_home_type : dir { getattr search open } ; [ httpd_enable_homedirs ] DT allow httpd_t user_home_type : dir { ioctl read getattr lock search open } ; [ httpd_read_user_content ] DT allow httpd_t user_home_type : lnk_file { read getattr } ; [ httpd_enable_homedirs ]
- Voir ce que fait le booléen httpd_can_sendmail :
$ sesearch -b httpd_enable_homedirs -AC
$ sesearch --auditallow
matchpathcon
La commande matchpathcon vous indique quel contexte devrait posséder votre fichier :
$ matchpathcon /var/www/html/gigix.html /var/www/html/gigix.html system_u:object_r:httpd_sys_content_t:s0 $ ll -Z /var/www/html/gigix.html -rw-r--r--. 1 root root unconfined_u:object_r:user_tmp_t:s0 0 8 août 15:00 /var/www/html/gigix.html
Dans notre cas, le contexte qui aurait du être appliqué est httpd_sys_content_t. On peut utiliser la commande restorecon pour restaurer le contexte.
restorecon
restorecon permet de restaurer le(s) contexte(s) original(aux) du ou des chemins spécifiés.
$ restorecon -v /var/www/html/gigix.html restorecon reset /var/www/html/gigix.html context unconfined_u:object_r:user_tmp_t:s0->unconfined_u:object_r:httpd_sys_content_t:s0
On voit ici que le contexte de notre fichier erroné est passé de user_tmp_t à httpd_sys_content_t.
chcon
chcon permet de changer le contexte SELinux d'un fichier ou dossier donné, mais pas de façon permanente. Au prochain ré-étiquetage du disque ou à la prochaine utilisation de restorecon sur le fichier ou sur ses parents, le fichier sera ré-étiqueté avec le contexte de son plus proche parent pour lequel un contexte spécifique est défini.
$ chcon -t httpd_sys_content_t /var/www/html/gigix.html
Pour modifier de façon définitive, il faut utiliser semanage.
semanage
Mapping entre utilisateurs Linux et utilisateurs SELinux
$ semanage login -l
Ajoute l'utilisateur
$ useradd myuser $ semanage login -a -s user_u myuser
Ou
$ useradd -Z user_u test
Mapping entre utilisateurs SELinux et les rôles SELinux
$ semanage user -l
Explication des rôles / utilisateurs selinux
Voir : http://selinuxproject.org/page/RefpolicyBasicRoleCreation
Réseau
Voir : http://selinuxproject.org/page/NetworkStatements
semanage port controls the port number to port type defitions. Lister les ports :
$ semanage port -l
Si vous souhaitez par exemple faire tourner apache sur le port 81, il va falloir le rajouter dans la liste des contextes :
$ semanage port -a -t http_port_t -p tcp 81
semanage interface controls the labels assigned to network interfaces. Lister les interfaces :
$ semanage interface -l
semanage node controls the ipaddress to node type definitions. Lister les nodes :
$ semanage node -l
Policy modules
Permet de gérer les Policy Modules. Voir aussi semodule
- Lister les policy modules chargés :
$ semanage module -l
- Lister les modules modifiés :
$ semanage module -lC
Permissive mode
- Vous avez également le choix de ne désactiver qu'un domaine si vous le souhaitez. Nous allons prendre par exemple Apache :
$ semanage permissive -a httpd_t
- Pour le supprimer :
$ semanage permissive -d httpd_t
- Pour lister les domaine désactivé :
$ semanage permissive -l
$ semodule -l | grep permissive permissive_httpd_t 1.0 permissivedomains 21
log
Si vous ne voyez rien dans les logs et que audit2allow ne vous aide pas non plus, vous pouvez demander à SELinux de tout logger :
$ semanage dontaudit off
On peut aussi le faire de cette manière :
$ semodule -DB $ semodule -B
Il ne vous reste plus qu'à regarder dans les logs : /var/log/audit/audit.log
et /var/log/messages
:
$ grep "SELinux is preventing" /var/log/messages
$ grep "denied" /var/log/audit/audit.log
Voir ce qui ne log pas pour apache :
$ sesearch --dontaudit -s httpd_t
Context
semanage ne vous permet pas de modifier directement le contexte d'un fichier ou d'un dossier comme le fait chcon, mais de définir un contexte par défaut qui sera appliqué par restorecon ou lors d'un ré-étiquetage du système de fichiers. Cette solution est donc à privilégier lorsque l'on souhaite placer un contexte qui restera (si vous vous bornez à utiliser chcon pour corriger un problème, il y a des chances que dans quelque temps le contexte soit réinitialisé et que vous vous demandiez pourquoi).
/etc/selinux/targeted/contexts/files/file_contexts.local
.
- Exemple : si je décide de déplacer mon fichier le fichier
gigix.html
dans/srv/gigix
et qu'on applique restorecon il change de contexte :
$ mkdir /srv/gigix $ mv gigix.html /srv/gigix/ $ restorecon -R -v /srv/gigix/ restorecon reset /srv/gigix/gigix.html context unconfined_u:object_r:httpd_sys_content_t:s0->unconfined_u:object_r:var_t:s0
- Pour qu'il garde le contexte voulu :
$ semanage fcontext -a -t httpd_sys_content_t '/srv/gigix(/.*)?' $ restorecon -R -v /srv/gigix/ restorecon reset /srv/gigix context unconfined_u:object_r:var_t:s0->unconfined_u:object_r:httpd_sys_content_t:s0 restorecon reset /srv/gigix/gigix.html context unconfined_u:object_r:var_t:s0->unconfined_u:object_r:httpd_sys_content_t:s0
$ cat /etc/selinux/targeted/contexts/files/file_contexts.local # This file is auto-generated by libsemanage # Do not edit directly. /srv/gigix(/.*)? system_u:object_r:httpd_sys_content_t:s0
- Pour le retirer :
$ semanage fcontext -d -t httpd_sys_content_t '/srv/gigix(/.*)?' $ restorecon -R -v /srv/gigix/ restorecon reset /srv/gigix context unconfined_u:object_r:httpd_sys_content_t:s0->unconfined_u:object_r:var_t:s0 restorecon reset /srv/gigix/gigix.html context unconfined_u:object_r:httpd_sys_content_t:s0->unconfined_u:object_r:var_t:s0
- On aurait également pu copier le contexte de cette façon :
$ semanage fcontext -a -e /var/www /srv/www $ semanage fcontext -m -e /var/www/html /srv/gigix
- Pour voir l'ensemble des règles :
$ semanage fcontext -l
Booléen
Les booléens permettent de modifier une politique SELinux, sans avoir la moindre connaissance ou compétence sur le sujet de la rédaction de politiques. L'activation ou la désactivation d'un booléen ne requiert pas la compilation ou le rechargement d'un module.
Pour les lister, et obtenir quelques informations sur l'utilité de chacun, utilisez :
$ semanage boolean -l
Pour simplement lister les booléens, sans aucune information complémentaire : getsebool
Pour activer un booléen :
$ semanage boolean -m --on httpd_can_sendmail
Voir les booléens modifiés :
$ semanage boolean -l -C
getsebool
Pour simplement lister les booléens, sans aucune information complémentaire :
$ getsebool -a
Pour plus d'informations :
$ semanage boolean -l
setsebool
Permet d'activer un booléen :
$ setsebool -P httpd_can_sendmail on
L'option -P permet de rendre la directive permanente, et donc de la conserver en cas de ré-amorçage du système.
semodule
Permet de gérer les module SELinux.
Lister les modules :
$ semodule -l
seinfo
Permet de voir un certain nombre de choses sur SELinux.
$ seinfo Statistics for policy file: /sys/fs/selinux/policy Policy Version & Type: v.29 (binary, mls) Classes: 83 Permissions: 254 Sensitivities: 1 Categories: 1024 Types: 4617 Attributes: 356 Users: 8 Roles: 14 Booleans: 302 Cond. Expr.: 353 Allow: 95893 Neverallow: 0 Auditallow: 154 Dontaudit: 8395 Type_trans: 17478 Type_change: 74 Type_member: 35 Role allow: 30 Role_trans: 414 Range_trans: 5667 Constraints: 103 Validatetrans: 0 Initial SIDs: 27 Fs_use: 28 Genfscon: 101 Portcon: 579 Netifcon: 0 Nodecon: 0 Permissives: 14 Polcap: 2
- Lister tous les utilisateurs SELinux :
$ seinfo -adomain -u domain Users: 8 sysadm_u system_u xguest_u root guest_u staff_u user_u unconfined_u
- Lister tous les types d'utilisateurs :
$ seinfo -auserdomain -x userdomain logadm_t secadm_t sysadm_t webadm_t dbadm_t user_wine_t auditadm_t staff_wine_t xguest_t guest_t staff_t user_t unconfined_t
- Lister quel utilisateur SELinux appartient à quel rôle :
$ seinfo -usystem_u -x system_u default level: s0 range: s0 - s0:c0.c1023 roles: object_r system_r unconfined_r
- Lister tous les domaines :
$ seinfo -adomain -r domain Roles: 14 auditadm_r dbadm_r guest_r staff_r user_r logadm_r object_r secadm_r sysadm_r system_r webadm_r xguest_r nx_server_r unconfined_r
- Lister quel sont les domaines d'un rôle :
$ seinfo -ruser_r -x
- Afficher tous les types :
$ seinfo -adomain -t
- Afficher les info sur le type httpd_sys_content_t :
$ seinfo -thttpd_sys_content_t -x httpd_sys_content_t file_type exec_type entry_type httpdcontent non_security_file_type httpd_content_type non_auth_file_type Aliases httpd_fastcgi_content_t httpd_httpd_sys_script_ro_t httpd_fastcgi_script_ro_t
- Tout afficher :
$ seinfo --all -x | less
runcon
Lancer un programme dans un contexte donnée :
$ runcon system_u:system_r:crond_t:s0:c0.c255 /bin/bash
auditd
status
Voir le status d'auditd :
$ auditctl -s
Lister les régles
$ auditctl -l