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
Compiler une règle te en pp
Compiler une rule te :
$ checkmodule -M -m -o gigix-tlp.mod gigix-tlp.te checkmodule: loading policy configuration from gigix-tlp.te checkmodule: policy configuration loaded checkmodule: writing binary representation (version 17) to gigix-tlp.mod
$ semodule_package -m gigix-tlp.mod -o gigix-tlp.pp
On installe le module :
$ semodule -i gigix-tlp.pp
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
$ sesearch -T -s unconfined_t -t initrc_exec_t Found 1 semantic te rules: type_transition unconfined_t initrc_exec_t : process initrc_t;
$ sesearch -T -s unconfined_t -c process -C
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 des utilsateurs par défaut
$ semanage login -m -S targeted -s "user_u" -r s0 __default__
Pour revenir au mapping original:
$ semanage login -m -S targeted -s "unconfined_u" -r s0-s0:c0.c1023
Créez un nouvel utilisateur SELinux et spécifiez le rôle SELinux par défaut et un rôle d'administrateur confiné supplémentaire
$ semanage user -a -r s0-s0:c0.c1023 -R "default_role_r administrator_r" gigix_user_u
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
seinfo --permissive -x
$ 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
- Pour vérifier le contexte:
$ matchpathcon -V /var/www/html/* /var/www/html/file1 has context unconfined_u:object_r:samba_share_t:s0, should be system_u:object_r:httpd_sys_content_t:s0 /var/www/html/file2 verified. /var/www/html/file3 verified.
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 et leurs rôles:
$ seinfo -u -x Users: 8 user guest_u roles guest_r level s0 range s0; user root roles { staff_r system_r sysadm_r unconfined_r } level s0 range s0 - s0:c0.c1023; user staff_u roles { staff_r system_r sysadm_r unconfined_r } level s0 range s0 - s0:c0.c1023; user sysadm_u roles sysadm_r level s0 range s0 - s0:c0.c1023; user system_u roles { system_r unconfined_r } level s0 range s0 - s0:c0.c1023; user unconfined_u roles { system_r unconfined_r } level s0 range s0 - s0:c0.c1023; user user_u roles user_r level s0 range s0; user xguest_u roles xguest_r level s0 range s0;
- Lister tous les types des rômes:
$ seinfo -r -x
- Lister tous les types d'un attribut :
$ 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 les rôles d'un utilisateur précis :
$ seinfo -usystem_u -x system_u default level: s0 range: s0 - s0:c0.c1023 roles: object_r system_r unconfined_r
- Lister quel sont les domaines d'un rôle :
$ seinfo -ruser_r -x
- Afficher les types d'un attribut :
$ seinfo -avirt_domain -x Type Attributes: 1 attribute virt_domain; svirt_t svirt_tcg_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
sepolicy
sepolicy generate
Générer une policy pour un service:
$ sepolicy generate --init -n myprogram /usr/bin/myprogram
sepolicy transition
Interroger la stratégie SELinux pour voir si un domaine de traitement source peut transitionner vers un domaine de traitement cible:
$ sepolicy transition -s httpd_t
sepolicy network
Interroger les stratégies SELinux relatives aux information réseau:
$ sepolicy network -p 22 22: tcp ssh_port_t 22 22: udp reserved_port_t 1-511 22: tcp reserved_port_t 1-511 22: sctp reserved_port_t 1-511
sepolicy booleans
Interroger la stratégie SELinux pour voir les descriptions des booléens:
$ sepolicy booleans -a $ sepolicy booleans -b user_ping
sepolicy communicate
Interroger la stratégie SELinux pour voir si les domaines peuvent communiquer ensemble:
$ sepolicy communicate -s syslogd_t -t httpd_t -c file
auditd
status
Voir le status d'auditd :
$ auditctl -s
Lister les régles
$ auditctl -l
Scripts
Download and extract and set the variable POLICY_LOCATION.
Add to your ~/.bashrc
:
POLICY_LOCATION="~/refpolicy/"; # sefindif - Find interface definitions that have a string that matches the # given regular expression sefindif() { REGEXP="$1"; pushd ${POLICY_LOCATION}/policy/modules > /dev/null 2>&1; for FILE in */*.if; do awk "/(interface\(|template\()/ { NAME=\$NF; P=0 }; /${REGEXP}/ { if (P==0) {P=1; print NAME}; print };" ${FILE} | sed -e "s:^:${FILE}\: :g"; done popd > /dev/null 2>&1; } # seshowif - Show the interface definition seshowif() { INTERFACE="$1"; pushd ${POLICY_LOCATION}/policy/modules > /dev/null 2>&1; for FILE in */*.if; do grep -A 9999 "\(interface(\`${INTERFACE}'\|template(\`${INTERFACE}'\)" ${FILE} | grep -B 9999 -m 1 "^')"; done popd > /dev/null 2>&1; } # sefinddef - Find macro definitions that have a string that matches the given # regular expression sefinddef() { REGEXP="$1"; grep -H "define(\`.*${REGEXP}.*" ${POLICY_LOCATION}/policy/support/* | sed -e 's:.*\/\([^(]*\):\1:g' } # seshowdef - Show the macro definition seshowdef() { MACRONAME="$1"; pushd ${POLICY_LOCATION}/policy/support > /dev/null 2>&1; for FILE in *.spt; do grep -A 9999 "define(\`${MACRONAME}'" ${FILE} | grep -B 999 -m 1 "')"; done popd > /dev/null 2>&1; } # sefindcon - Find macro definitions for constrains sefindcon() { awk "/(interface\(|template\()/ { NAME=\$NF; P=0 }; /${REGEXP}/ { if (P==0) {P=1; print NAME}; print };" ${POLICY_LOCATION}/policy/constraints | sed -e "s:^:${FILE}\: :g"; } # selist - List all templates/interfaces in the order allowed by refpolicy selist() { pushd ${POLICY_LOCATION}/policy/modules > /dev/null 2>&1; ( egrep '^(interface|template)' kernel/kernel.if | awk -F'`' '{print $2}' | sed -e "s:',::g" | sed -e "s:$: (kernel, kernel):g" | sort; egrep '^(interface|template)' kernel/*.if | grep -v 'kernel/kernel.if' | awk -F'`' '{print $2}' | sed -e "s:',::g" | sed -e "s:$: (kernel, other):g" | sort; egrep '^(interface|template)' system/*.if | awk -F'`' '{print $2}' | sed -e "s:',::g" | sed -e "s:$: (system):g" | sort; egrep '^(interface|template)' admin/*.if apps/*.if roles/*.if services/*.if contrib/*.if | awk -F'`' '{print $2}' | sed -e "s:',::g" | sort; ) | nl | sed -e "s:$: :g"; popd > /dev/null 2>&1; }
$ sefindif 'filetrans.*postfix_etc' services/postfix.if: interface(`postfix_config_filetrans',` services/postfix.if: filetrans_pattern($1, postfix_etc_t, $2, $3, $4)
$ seshowif systemd_tmpfilesd_managed interface(`systemd_tmpfilesd_managed',` gen_require(` type systemd_tmpfiles_t; ') allow systemd_tmpfiles_t $1:$2 { setattr relabelfrom relabelto create }; ')
$ sefinddef 'socket.*create' obj_perm_sets.spt:define(`create_socket_perms', `{ create rw_socket_perms }') obj_perm_sets.spt:define(`create_stream_socket_perms', `{ create_socket_perms listen accept }') obj_perm_sets.spt:define(`connected_socket_perms', `{ create ioctl read getattr write setattr append bind getopt setopt shutdown }') obj_perm_sets.spt:define(`create_netlink_socket_perms', `{ create_socket_perms nlmsg_read nlmsg_write }') obj_perm_sets.spt:define(`rw_netlink_socket_perms', `{ create_socket_perms nlmsg_read nlmsg_write }') obj_perm_sets.spt:define(`r_netlink_socket_perms', `{ create_socket_perms nlmsg_read }') obj_perm_sets.spt:define(`client_stream_socket_perms', `{ create ioctl read getattr write setattr append bind getopt setopt shutdown }')
$ seshowdef manage_files_pattern define(`manage_files_pattern',` allow $1 $2:dir rw_dir_perms; allow $1 $3:file manage_file_perms; ')