Ceci est une ancienne révision du document !


Version : 2020.01

Dernière mise-à-jour : 2020/12/21 16:25

LCF407 - System Hardening

Contenu du Module

  • LCF407 - System Hardening
    • Contenu du Module
    • System Hardening Manuel
      • Les compilateurs
      • Les paquets
      • Les démons et services
      • Les fichiers .rhosts
      • Les fichiers et les repertoires sans proprietaire
      • Interdire les connexions de root via le réseau
      • Limiter le delai d'inactivite d'une session shell
      • Renforcer la securite d'init
        • Les Distributions SysVInit
        • Les Distributions Upstart
      • Renforcer la sécurité du Noyau
      • La commande sysctl
    • LAB #1 - System Hardening à l'aide de l'outil Bastille
      • Présentation
      • Installation
      • Utilisation
    • LAB #2 - Mise en place de SELinux pour sécuriser le serveur
      • Introducton
      • Définitions
        • Security Context
        • Domains et Types
        • Roles
        • Politiques de Sécurité
        • Langage de Politiques
          • allow
          • type
        • type_transition
        • Décisions de SELinux
          • Décisions d'Accès
          • Décisions de Transition
        • Commandes SELinux
        • Les Etats de SELinux
        • Booléens
    • LAB #3 - Travailler avec SELinux
      • Copier et Déplacer des Fichiers
      • Vérifier les SC des Processus
      • Visualiser la SC d'un Utilisateur
      • Vérifier la SC d'un fichier
      • Troubleshooting SELinux
        • La commande chcon
      • La commande restorecon
      • Le fichier /.autorelabel
      • La commande semanage
      • La commande audit2allow

System Hardening Manuel

Les compilateurs

Afin d'empêcher un pirate de créer des exécutables sur le serveur vous devez modifier les permissions sur les compilateurs éventuellement présents afin que seulement root puisse les exécuter.

Les paquets

Il convient dans ce cas de passer en revue la liste des paquets installes puis de supprimer ceux qui sont juges être inutiles :

[root@centos7 ~]# rpm -qa | more
libtalloc-2.1.9-1.el7.x86_64
gnome-contacts-3.22.1-1.el7.x86_64
lrzsz-0.12.20-36.el7.x86_64
NetworkManager-team-1.8.0-11.el7_4.x86_64
opus-1.0.2-6.el7.x86_64
libsss_certmap-1.15.2-50.el7_4.11.x86_64
m17n-db-1.6.4-3.el7.noarch
expat-2.1.0-10.el7_3.x86_64
gvfs-mtp-1.30.4-3.el7.x86_64
hypervfcopyd-0-0.30.20161211git.el7.x86_64
perl-parent-0.225-244.el7.noarch
libreport-centos-2.1.11-38.el7.centos.x86_64
pixman-0.34.0-1.el7.x86_64
alsa-plugins-pulseaudio-1.1.1-1.el7.x86_64
libreoffice-graphicfilter-5.0.6.2-15.el7_4.x86_64
libreport-rhel-anaconda-bugzilla-2.1.11-38.el7.centos.x86_64
libXext-1.3.3-3.el7.x86_64
libtool-ltdl-2.4.2-22.el7_3.x86_64
NetworkManager-ppp-1.8.0-11.el7_4.x86_64
osinfo-db-20170423-2.el7.noarch
fftw-libs-double-3.3.3-8.el7.x86_64
kernel-tools-libs-3.10.0-693.21.1.el7.x86_64
e2fsprogs-libs-1.42.9-10.el7.x86_64
--More--

Les démons et services

Il convient dans ce cas de passer en revue la liste des démons et services actives puis de supprimer ceux qui sont juges être inutiles;

  • ps aux
  • chkconfig –list
  • systemctl list-unit-files
[root@centos7 ~]# ps aux | more
USER       PID %CPU %MEM    VSZ   RSS TTY      STAT START   TIME COMMAND
root         1  0.0  0.9 128172  4768 ?        Ss   14:58   0:11 /usr/lib/systemd/systemd --swit
ched-root --system --deserialize 21
root         2  0.0  0.0      0     0 ?        S    14:58   0:00 [kthreadd]
root         3  0.0  0.0      0     0 ?        S    14:58   0:13 [ksoftirqd/0]
root         5  0.0  0.0      0     0 ?        S<   14:58   0:00 [kworker/0:0H]
root         6  0.0  0.0      0     0 ?        S    14:58   0:00 [kworker/u2:0]
root         7  0.0  0.0      0     0 ?        S    14:58   0:00 [migration/0]
root         8  0.0  0.0      0     0 ?        S    14:58   0:00 [rcu_bh]
root         9  0.0  0.0      0     0 ?        S    14:58   0:09 [rcu_sched]
root        10  0.0  0.0      0     0 ?        S    14:58   0:00 [watchdog/0]
root        12  0.0  0.0      0     0 ?        S    14:58   0:00 [kdevtmpfs]
root        13  0.0  0.0      0     0 ?        S<   14:58   0:00 [netns]
root        14  0.0  0.0      0     0 ?        S    14:58   0:00 [khungtaskd]
root        15  0.0  0.0      0     0 ?        S<   14:58   0:00 [writeback]
root        16  0.0  0.0      0     0 ?        S<   14:58   0:00 [kintegrityd]
root        17  0.0  0.0      0     0 ?        S<   14:58   0:00 [bioset]
root        18  0.0  0.0      0     0 ?        S<   14:58   0:00 [kblockd]
root        19  0.0  0.0      0     0 ?        S<   14:58   0:00 [md]
root        25  0.0  0.0      0     0 ?        S    14:58   0:03 [kswapd0]
root        26  0.0  0.0      0     0 ?        SN   14:58   0:00 [ksmd]
root        27  0.0  0.0      0     0 ?        S<   14:58   0:00 [crypto]
root        35  0.0  0.0      0     0 ?        S<   14:58   0:00 [kthrotld]
--More--
[root@centos7 ~]# chkconfig --list

Note: This output shows SysV services only and does not include native
      systemd services. SysV configuration data might be overridden by native
      systemd configuration.

      If you want to list systemd services use 'systemctl list-unit-files'.
      To see services enabled on particular target use
      'systemctl list-dependencies [target]'.

livesys        	0:off	1:off	2:off	3:on	4:on	5:on	6:off
livesys-late   	0:off	1:off	2:off	3:on	4:on	5:on	6:off
netconsole     	0:off	1:off	2:off	3:off	4:off	5:off	6:off
network        	0:off	1:off	2:off	3:off	4:off	5:off	6:off
snortd         	0:off	1:off	2:on	3:on	4:on	5:on	6:off
[root@centos7 ~]# systemctl list-unit-files
UNIT FILE                                     STATE   
proc-sys-fs-binfmt_misc.automount             static  
dev-hugepages.mount                           static  
dev-mqueue.mount                              static  
proc-fs-nfsd.mount                            static  
proc-sys-fs-binfmt_misc.mount                 static  
sys-fs-fuse-connections.mount                 static  
sys-kernel-config.mount                       static  
sys-kernel-debug.mount                        static  
tmp.mount                                     enabled 
var-lib-nfs-rpc_pipefs.mount                  static  
brandbot.path                                 disabled
cups.path                                     enabled 
systemd-ask-password-console.path             static  
systemd-ask-password-plymouth.path            static  
systemd-ask-password-wall.path                static  
session-33.scope                              static  
abrt-ccpp.service                             enabled 
abrt-oops.service                             enabled 
abrt-pstoreoops.service                       disabled
abrt-vmcore.service                           enabled 
abrt-xorg.service                             enabled 
abrtd.service                                 enabled 
lines 1-23

Les fichiers .rhosts

Le systeme rhosts presente une faille de securite importante pour un serveur Linux. Pour cette raison, il convient de supprimer les fichiers .rhosts des utilisateurs. Utilisez la commande suivante:

# find / -name "\.rhosts" -exec rm -f \{\} \; [Entree]

Les fichiers et les repertoires sans proprietaire

Afin de dresser la liste des fichiers et des groupes sans proprietaires sur le serveur, il convient d'utiliser les deux commandes suivantes:

# find / -nouser -exec ls -l \{\} \; 2> sans_pro.txt [Entree]
# find / -nogroup -exec ls -l \{\} \; 2>> sans_pro.txt[Entree]

Ces commandes produiront une liste éventuelle dans le fichier sans_pro.txt.

L'examen de cette liste pourrait dévoiler des anomalies au quel cas il conviendrait de:

  • modifier le propriétaire a root
  • modifier le groupe a root
  • modifier les permissions a 700

Interdire les connexions de root via le reseau

Le fichier de configuration des connexions de root est /etc/securetty :

[root@centos7 ~]# cat /etc/securetty
console
vc/1
vc/2
vc/3
vc/4
vc/5
vc/6
vc/7
vc/8
vc/9
vc/10
vc/11
tty1
tty2
tty3
tty4
tty5
tty6
tty7
tty8
tty9
tty10
tty11
ttyS0
ttysclp0
sclp_line0
3270/tty1
hvc0
hvc1
hvc2
hvc3
hvc4
hvc5
hvc6
hvc7
hvsi0
hvsi1
hvsi2
xvc0

Afin d'empêcher une connexion de root directement via le réseau et donc d'obliger une connexion en utilisant un compte d'utilisateur normal avant de passer en root grâce à la commande su, ce fichier ne doit pas contenir des entrees du type ttysX ou X = 0,1,2 etc.

Limiter le delai d'inactivite d'une session shell

Une session de shell laissee ouverte inutilement et d'une maniere sans surveillance est un risque de securite. Verifiez donc le contenu du fichier /etc/profile :

[root@centos7 ~]# cat /etc/profile
# /etc/profile

# System wide environment and startup programs, for login setup
# Functions and aliases go in /etc/bashrc

# It's NOT a good idea to change this file unless you know what you
# are doing. It's much better to create a custom.sh shell script in
# /etc/profile.d/ to make custom changes to your environment, as this
# will prevent the need for merging in future updates.

pathmunge () {
    case ":${PATH}:" in
        *:"$1":*)
            ;;
        *)
            if [ "$2" = "after" ] ; then
                PATH=$PATH:$1
            else
                PATH=$1:$PATH
            fi
    esac
}


if [ -x /usr/bin/id ]; then
    if [ -z "$EUID" ]; then
        # ksh workaround
        EUID=`/usr/bin/id -u`
        UID=`/usr/bin/id -ru`
    fi
    USER="`/usr/bin/id -un`"
    LOGNAME=$USER
    MAIL="/var/spool/mail/$USER"
fi

# Path manipulation
if [ "$EUID" = "0" ]; then
    pathmunge /usr/sbin
    pathmunge /usr/local/sbin
else
    pathmunge /usr/local/sbin after
    pathmunge /usr/sbin after
fi

HOSTNAME=`/usr/bin/hostname 2>/dev/null`
HISTSIZE=1000
if [ "$HISTCONTROL" = "ignorespace" ] ; then
    export HISTCONTROL=ignoreboth
else
    export HISTCONTROL=ignoredups
fi

export PATH USER LOGNAME MAIL HOSTNAME HISTSIZE HISTCONTROL

# By default, we want umask to get set. This sets it for login shell
# Current threshold for system reserved uid/gids is 200
# You could check uidgid reservation validity in
# /usr/share/doc/setup-*/uidgid file
if [ $UID -gt 199 ] && [ "`/usr/bin/id -gn`" = "`/usr/bin/id -un`" ]; then
    umask 002
else
    umask 022
fi

for i in /etc/profile.d/*.sh ; do
    if [ -r "$i" ]; then
        if [ "${-#*i}" != "$-" ]; then 
            . "$i"
        else
            . "$i" >/dev/null
        fi
    fi
done

unset i
unset -f pathmunge

A ce fichier doivent etre ajoutées les deux lignes suivantes:

Readonly TMOUT=300
Export TMOUT

Par cette action, vous définissez le délai d’inactivité d'une session shell a une durée de 5 minutes.

Dernièrement, afin de se protéger contre des permissions trop permissives lors de la création de fichiers et de répertoires, il convient de passer la valeur d'umask à 077 dans le fichier /etc/profile.

Renforcer la securite d'init

Les Distributions SysVInit

Le fichier /etc/inittab est utilise pour configurer le démarrage de votre serveur.

La première modification à effectuer est de spécifier le niveau d’exécution par défaut a 3 au lieu de 5. Ceci permet de ne pas lancer les sessions graphiques sur une serveur de production. Cherchez donc la ligne suivante:

id:5:initdefault:

Modifiez-la en:

id:3:initdefault:

Le mode single user de démarrage de Linux n'est pas habituellement protégé par un mot de passe. Afin de remédier a cela, ajoutez les lignes suivantes:

# Single user mode
~~:S:wait:/sbin/sulogin

Dernièrement, afin d'empêcher une personne a redémarrer le serveur à l'aide des touches ctrl+alt+supp, il convient de mettre en commentaire la ligne correspondante:

# ca::ctrlaltdel:/sbin/shutdown -t3 -r now

Les Distributions Upstart

Afin d'empêcher une personne à redémarrer le serveur à l'aide des touches ctrl+alt+supp, éditez le fichier /etc/init/control-alt-delete.conf en modifiant la ligne suivante :

exec /sbin/shutdown -r now "Control-Alt-Delete pressed"

en

#exec /sbin/shutdown -k now "Control-Alt-Delete pressed"

Renforcer la sécurité du Noyau

La commande sysctl

Les fichiers dans le répertoire /proc/sys peuvent être administrés par la commande sysctl en temps réel.

La commande sysctl applique les règles consignés dans le fichier /etc/sysctl.conf au démarrage de la machine.

Saisissez la commande :

[root@centos7 ~]# cat /etc/sysctl.conf
# System default settings live in /usr/lib/sysctl.d/00-system.conf.
# To override those settings, enter new settings here, or in an /etc/sysctl.d/<name>.conf file
#
# For more information, see sysctl.conf(5) and sysctl.d(5).

[root@centos7 ~]# cat /usr/lib/sysctl.d/00-system.conf
# Kernel sysctl configuration file
#
# For binary values, 0 is disabled, 1 is enabled.  See sysctl(8) and
# sysctl.conf(5) for more details.

# Disable netfilter on bridges.
net.bridge.bridge-nf-call-ip6tables = 0
net.bridge.bridge-nf-call-iptables = 0
net.bridge.bridge-nf-call-arptables = 0

# Controls the maximum shared segment size, in bytes
kernel.shmmax = 4294967295

# Controls the maximum number of shared memory segments, in pages

[root@centos7 ~]# ls -l /etc/sysctl.d/
total 0
lrwxrwxrwx. 1 root root 14 Jun  4 09:54 99-sysctl.conf -> ../sysctl.conf

[root@centos7 ~]# cat /etc/sysctl.d/99-sysctl.conf 
# System default settings live in /usr/lib/sysctl.d/00-system.conf.
# To override those settings, enter new settings here, or in an /etc/sysctl.d/<name>.conf file
#
# For more information, see sysctl.conf(5) and sysctl.d(5).
Options de la commande

Les options de la commande sysctl sont :

[root@centos7 ~]# sysctl --help

Usage:
 sysctl [options] [variable[=value] ...]

Options:
  -a, --all            display all variables
  -A                   alias of -a
  -X                   alias of -a
      --deprecated     include deprecated parameters to listing
  -b, --binary         print value without new line
  -e, --ignore         ignore unknown variables errors
  -N, --names          print variable names without values
  -n, --values         print only values of a variables
  -p, --load[=<file>]  read values from file
  -f                   alias of -p
      --system         read values from all system directories
  -r, --pattern <expression>
                       select setting that match expression
  -q, --quiet          do not echo variable set
  -w, --write          enable writing a value to variable
  -o                   does nothing
  -x                   does nothing
  -d                   alias of -h

 -h, --help     display this help and exit
 -V, --version  output version information and exit

For more details see sysctl(8).

Important : Consultez la page de la traduction du manuel de sysctl ici pour comprendre la commande.

LAB #1 - System Hardening à l'aide de l'outil Bastille

Présentation

Bastille Linux est un script interactif de renforcement de la sécurité pour certaines distributions de Linux dont RHEL, CentOS et Debian.

Installation

Installez le dépôt EPEL :

[root@centos7 ~]# wget http://dl.fedoraproject.org/pub/epel/epel-release-latest-7.noarch.rpm
[root@centos7 ~]# rpm -ivh epel-release-latest-7.noarch.rpm

Commencez par installer la dépendance de Bastille :

[root@centos7 ~]# yum install perl-Curses

Téléchargez et installez Bastille :

[root@centos7 ~]# wget https://www.dropbox.com/s/l3na5dt48mspa9w/Bastille-3.0.9-1.0.noarch.rpm
[root@centos7 ~]# yum localinstall Bastille-3.0.9-1.0.noarch.rpm --nogpgcheck

Dernièrement créez un lien symbolique :

[root@centos7 /]# ln -s /usr/lib/Bastille /usr/lib64/

Utilisation

Pour démarrez bastille en mode texte, saisissez la commande suivante :

# /usr/sbin/bastille -c [Entrée]

Pour démarrez bastille en mode graphique, saisissez la commande suivante :

# /usr/sbin/bastille -x [Entrée]

A Faire - Lancez Bastille et répondez aux questions posées. Ré-amorcez votre machine virtuelle et testez le résultat.

LAB #2 - Mise en place de SELinux pour sécuriser le serveur

Introducton

L'approche SELinux (Security Enhanced Linux) à la sécurité est une approche de type TE. Elle essaie aussi d'intégrer les notions des approches de type RBAC, MAC et MLS sous la forme de MCS : ur

Type de Sécurité Nom Description
TE Type enforcement Chaque objet a une étiquette appelé type pour un fichier et domaine pour un processus. La politique de sécurité définit l'interaction entre les types et les domaines.
RBAC Role Based Access Control Un utilisateur a un ou plusieurs rôles. Les droits sont attribués aux rôles.
MAC Mandatory Access Control L'accès aux objets est en fonction de la classification de l'objet (Très secret, Secret, Confidentiel, Public). L'administrateur définit la politique de sécurité et les utilisateurs s'y conforment.
MLS Multi-Level Security Les politiques de sécurité imposent que qu'un sujet doit dominer un objet pour pouvoir le lire tandis que l'objet doit dominer le sujet pour que ce dernier puisse y écrire.

Même quand le modèle SELinux de sécurité est actif, la sécurité type DAC est toujours active. Cependant dans le cas où la sécurité du type DAC autorise une action, SELinux va évaluer cette action par rapport à ses propres règles avant de l'autoriser.

SELinux évalue toujours des actions tentées par des sujets sur des objets.

Dans le contexte de SELinux :

  • un sujet est toujours un processus,
  • un objet peut être un fichier, un répertoire, un autre processus ou une ressource système,
  • une action est une permission.

Chaque classe d'objet possède un jeu de permissions possibles ou actions qui peuvent être uniques à la classe ou bien héritées d'autres classes.

Définitions

Security Context

SELinux associe un Security Context (SC) à chaque objet et sujet du système.

Un SC prend la forme identité:rôle:type:niveau :

Nom Descriptions
Identité Le nom du propriétaire de l'objet. Une identité est associée à des rôles. Par défaut l'utilisateur à une identité de user_u.
Rôle Essentiellement appliqué aux processus, le rôle est appelé une domaine. Dans le cas d'un rôle de fichier, celui-ci est toujours object_r. Un rôle se termine généralement par _r.
Type Définit la classification de sécurité de l'objet. Un type se termine généralement par _t.
Niveau Un niveau est un attribut de MLS et MCS. Une plage MLS est une paire de niveaux exprimée en utilisant la syntaxe niveaubas-niveauhaut. Chaque niveau est une paire exprimée en tant que sensibilitéhaut-sensibilitébas:catégoriehaut:catégoriebas par exemple s0-s0:c0.c1023. Il est important de noter que s0-s0 s'exprime aussi s0 et c0, c1, c2, c3 est exprimé c0.c3.

Sous RHEL/CentOS 7, le fichier /etc/selinux/targeted/setrans.conf contient la correspondance entre les niveaux et leurs valeurs compréhensibles par l'utilisateur :

[root@centos7 /]# cat /etc/selinux/targeted/setrans.conf
#
# Multi-Category Security translation table for SELinux
# 
# Uncomment the following to disable translation libary
# disable=1
#
# Objects can be categorized with 0-1023 categories defined by the admin.
# Objects can be in more than one category at a time.
# Categories are stored in the system as c0-c1023.  Users can use this
# table to translate the categories into a more meaningful output.
# Examples:
# s0:c0=CompanyConfidential
# s0:c1=PatientRecord
# s0:c2=Unclassified
# s0:c3=TopSecret
# s0:c1,c3=CompanyConfidentialRedHat
s0=SystemLow
s0-s0:c0.c1023=SystemLow-SystemHigh
s0:c0.c1023=SystemHigh

Dans le contexte d'un SC pour un sujet, le champ identité indique les privilèges de l'utilisateur SELinux utilisés par le sujet.

Dans le contexte d'un SC pour un objet, le champ identité indique à quel utilisateur SELinux appartient l'objet.

SELinux maintient sa propre liste d'utilisateurs, différente de la liste DAC de Linux. Il existe cependant une correspondance entre les deux listes de façon à ce que les utilisateurs MAC puissent être soumissent aux restrictions de SELinux :

[root@centos7 /]# /usr/sbin/semanage login -l

Login Name           SELinux User         MLS/MCS Range        Service

__default__          unconfined_u         s0-s0:c0.c1023       *
root                 unconfined_u         s0-s0:c0.c1023       *
system_u             system_u             s0-s0:c0.c1023       *  

Domains et Types

Le Domain est l'endroit d'exécution d'un processus. Chaque processus a un Domain. Le Domain détermine les accès du processus.

Le Domain contient des objets et des sujets qui interagissent ensemble. Ce modèle, où chaque sujet se voit attribué à un Domain et où uniquement certaines opérations sont permises, est appelé Type Enforcement.

Dans SELinux on utilise le mot :

  • Domain pour un processus,
  • Type pour un fichier.

Roles

Un Rôle est comme un utilisateur dans le système de sécurité DAC de Linux. Chaque utilisateur autorisé peut assumer l'identité du Rôle afin d'exécuter les commandes liées au Rôle.

Politiques de Sécurité

Une politique de sécurité définit les SC de chaque application. Elle définit des droits d'accès des domaines aux types. Il y a deux types de politique possible :

Politique Description
targeted Les politiques de sécurité ne s'appliquent qu'à certaines applications
mls Multi Level Security protection

Les politiques de sécurité se trouvent dans le répertoire /etc/selinux :

[root@centos7 /]# ls -lR /etc/selinux/ | more
/etc/selinux/:
total 12
-rw-r--r--. 1 root root  547 Dec 10  2015 config
drwx------. 2 root root    6 Apr 23 16:24 final
-rw-r--r--. 1 root root 2321 Aug  4  2017 semanage.conf
drwxr-xr-x. 7 root root 4096 Apr 23 16:24 targeted
drwxr-xr-x. 2 root root    6 Aug  4  2017 tmp

/etc/selinux/final:
total 0

/etc/selinux/targeted:
total 24
drwx------. 3 root root 4096 Apr 23 16:24 active
-rw-r--r--. 1 root root 2623 Mar  7 15:19 booleans.subs_dist
drwxr-xr-x. 4 root root 4096 Apr 23 16:20 contexts
drwxr-xr-x. 2 root root    6 Mar  7 15:19 logins
drwxr-xr-x. 3 root root   19 Apr 23 16:41 modules
drwxr-xr-x. 2 root root   22 Apr 23 16:41 policy
-rw-------. 1 root root    0 Mar  7 14:52 semanage.read.LOCK
-rw-------. 1 root root    0 Mar  7 14:52 semanage.trans.LOCK
-rw-r--r--. 1 root root  607 Mar  7 15:19 setrans.conf
-rw-r--r--. 1 root root  176 Apr 23 16:24 seusers
--More--

Afin d'utiliser SELinux en ligne de commande sous RHEL/CentOS 7, il est nécessaire d'installer le paquet setools-console :

[root@centos7 ~]# yum install setools-console

Pour consulter les statistiques de la politique, il convient d'utiliser la commande seinfo :

[root@centos7 ~]# seinfo

Statistics for policy file: /sys/fs/selinux/policy
Policy Version & Type: v.28 (binary, mls)

   Classes:            94    Permissions:       262
   Sensitivities:       1    Categories:       1024
   Types:            4747    Attributes:        251
   Users:               8    Roles:              14
   Booleans:          307    Cond. Expr.:       356
   Allow:          101746    Neverallow:          0
   Auditallow:        155    Dontaudit:        8846
   Type_trans:      17759    Type_change:        74
   Type_member:        35    Role allow:         39
   Role_trans:        416    Range_trans:      5697
   Constraints:       109    Validatetrans:       0
   Initial SIDs:       27    Fs_use:             29
   Genfscon:          105    Portcon:           602
   Netifcon:            0    Nodecon:             0
   Permissives:         6    Polcap:              2

Important : Notez ici le grand nombre de la catégorie Dontaudit.

Langage de Politiques

Un politique est composé de centaines de directives. Les principales directives sont :

allow

allow autorise l'accès d'un processus d'un domaine à des fichiers appartenant à un type donné. Le format de la directive est :

allow user_t domaine_t : file (read execute getattr) ;

Dans cette directive :

  • user_t est le type de fichier,
  • domaine_t est le domaine des processus qui sont autorisés par allow,
  • file (droit1 droit2 etc) est la liste des permissions accordées.

Les permissions possibles sont :

  • read
  • write
  • append
  • execute
  • getattr
  • setattr
  • lock
  • link
  • unlink
  • rename
  • ioctl
type

La directive type définit un type SELinux. Le type se termine généralement par _t.

auditallow, dontaudit

La directive auditallow demande l'écriture d'un message de type avc dans les journaux. Elle n'est associée à aucune restriction.

L'inverse peut être obtenue avec dontaudit, à savoir, cette directive demande à ce qu'il n'y ait pas de journalisation après une interdiction.

type_transition

Normalement quand un fichier est créé, il hérite du SC du répertoire parent. De même quand un processus SELinux active un nouveau processus, ce dernier s'exécute dans le même domaine que son parent. La directive type_transition permet de modifier ce comportement.

Décisions de SELinux

Il existe deux types de décisions auxquelles SELinux doit faire face :

  • Décisions d'Accès
  • Décisions de Transition
Décisions d'Accès

Dans ce type de décision SELinux doit décider d'accorder ou non la permission à :

  • un sujet de faire quelque chose à un objet existant,
  • un sujet de créer de nouvelles choses dans le Domain.
Décisions de Transition

Dans ce type de décision SELinux doit décider d'accorder ou non la permission :

  • d'invoquer un processus dans un Domain différent du Domain courant du sujet,
  • de créer des objets dans différents Types que le répertoire parent de l'objet.

Commandes SELinux

Commande Description
chcon Changer le SC d'un fichier
audit2allow Générer la source de la règle de sécurité à l'origine d'une erreur
restorecon Restaurer le SC par défaut à un ou plusieurs fichiers
setfiles -n Vérifier si les SC sont corrects
semodule Gèrer les modules de politiques
semodule -i Installer un module de politiques
checkmodule Compiler un module
semodule_package Créer un module installable par semodule
semanage Administrer une politique
audit2allow -M Créer un module à partir d'un message d'audit
sesearch Recherche des règles SELinux
seinfo Effectuer des recherches dans la politique
getsebool Affiche l'état d'un booléen
getsebool -a Affiche l'état de l'ensemble des booléens
sestatus -b Affiche l'état de l'ensemble des booléens
setsebool Modifie l'état d'un booléen
togglesebool Bascule la valeur d'un booléen

Les Etats de SELinux

SELinux connait trois états :

Etat Description
disabled SELinux est inactif.
permissive SELinux est actif mais tout est permis. Des interdictions ne font que de générer des messages d'erreurs dans les logs.
enforcing SELinux est actif.

L'examen du contenu du fichier /selinux/enforce révèle une de deux valeurs qui correspondent à l'état de SELinux :

Valeur Description
0 SELinux est en mode permissive
1 SELinux est en mode enforcing

La configuration de l'activation de SELinux ainsi que son état est effectuée grâce au fichier /etc/selinux/config :

[root@centos7 /]# cat /etc/selinux/config

# This file controls the state of SELinux on the system.
# SELINUX= can take one of these three values:
#     enforcing - SELinux security policy is enforced.
#     permissive - SELinux prints warnings instead of enforcing.
#     disabled - No SELinux policy is loaded.
SELINUX=enforcing
# SELINUXTYPE= can take one of three two values:
#     targeted - Targeted processes are protected,
#     minimum - Modification of targeted policy. Only selected processes are protected. 
#     mls - Multi Level Security protection.
SELINUXTYPE=targeted 

Afin de connaître l'état de SELinux, il convient d'utiliser la commande getenforce :

[root@centos7 /]# getenforce
Enforcing

Pour modifier l'état de SELinux, il convient d'utiliser la commande setenforce :

[root@centos7 /]# setenforce permissive
[root@centos7 /]# getenforce
Permissive

La commande sestatus vous informe sur la configuration de SELinux et notamment sur la version de la politique utilisée :

[root@centos7 /]# 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:      28

Les différentes versions de politiques évolue en même temps que le noyau Linux.

La commande sestatus peut aussi prendre l'option -v :

[root@centos7 /]# sestatus -v
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:      28

Process contexts:
Current context:                unconfined_u:unconfined_r:unconfined_t:s0-s0:c0.c1023
Init context:                   system_u:system_r:init_t:s0
/usr/sbin/sshd                  system_u:system_r:sshd_t:s0-s0:c0.c1023

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
/lib/libc.so.6                  system_u:object_r:lib_t:s0 -> system_u:object_r:lib_t:s0
/lib/ld-linux.so.2              system_u:object_r:lib_t:s0 -> system_u:object_r:ld_so_t:s0

Booléens

Les booléens permettent à des ensembles de règles d'être utilisées d'une manière alternative.

Pour visualiser l'état l'ensemble des booléens, il convient d'utiliser la commande getsebool -a :

[root@centos7 /]# getsebool -a | more
abrt_anon_write --> off
abrt_handle_event --> off
abrt_upload_watch_anon_write --> on
antivirus_can_scan_system --> off
antivirus_use_jit --> off
auditadm_exec_content --> on
authlogin_nsswitch_use_ldap --> off
authlogin_radius --> off
authlogin_yubikey --> off
awstats_purge_apache_log_files --> off
boinc_execmem --> on
cdrecord_read_content --> off
cluster_can_network_connect --> off
cluster_manage_all_files --> off
cluster_use_execmem --> off
cobbler_anon_write --> off
cobbler_can_network_connect --> off
cobbler_use_cifs --> off
cobbler_use_nfs --> off
collectd_tcp_network_connect --> off
condor_tcp_network_connect --> off
conman_can_network --> off
container_connect_any --> off
--More--

ou la commande sestatus -b :

[root@centos7 /]# sestatus -b | more
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:      28

Policy booleans:
abrt_anon_write                             off
abrt_handle_event                           off
abrt_upload_watch_anon_write                on
antivirus_can_scan_system                   off
antivirus_use_jit                           off
auditadm_exec_content                       on
authlogin_nsswitch_use_ldap                 off
authlogin_radius                            off
authlogin_yubikey                           off
awstats_purge_apache_log_files              off
boinc_execmem                               on
cdrecord_read_content                       off
--More--

Pour fixer l'état d'un booléen, il convient d'utiliser la commande setsebool :

[root@centos7 /]# setsebool antivirus_can_scan_system 1
[root@centos7 /]# getsebool antivirus_can_scan_system
antivirus_can_scan_system --> on
[root@centos7 /]# setsebool antivirus_can_scan_system 0
[root@centos7 /]# getsebool antivirus_can_scan_system
antivirus_can_scan_system --> off

LAB #3 - Travailler avec SELinux

Afin reconstruire la politique actuelle sans les règles dontaudit, utilisez la commande semodule :

[root@centos7 ~]# semodule -DB

Vérifiez qu'il ne reste aucune règle de type dontaudit :

[root@centos7 ~]# seinfo

Statistics for policy file: /sys/fs/selinux/policy
Policy Version & Type: v.28 (binary, mls)

   Classes:            94    Permissions:       262
   Sensitivities:       1    Categories:       1024
   Types:            4747    Attributes:        251
   Users:               8    Roles:              14
   Booleans:          307    Cond. Expr.:       356
   Allow:          101746    Neverallow:          0
   Auditallow:        155    Dontaudit:           0
   Type_trans:      17759    Type_change:        74
   Type_member:        35    Role allow:         39
   Role_trans:        416    Range_trans:      5697
   Constraints:       109    Validatetrans:       0
   Initial SIDs:       27    Fs_use:             29
   Genfscon:          105    Portcon:           602
   Netifcon:            0    Nodecon:             0
   Permissives:         6    Polcap:              2

Copier et Déplacer des Fichiers

Créez deux fichiers file1 et file2 en tant que l'utilisateur trainee puis visualisez les SC des fichiers :

[root@centos7 /]# exit
logout
[trainee@centos7 ~]$ touch file1 file2
[trainee@centos7 ~]$ ls -Z file*
-rw-rw-r--. trainee trainee unconfined_u:object_r:user_home_t:s0 file1
-rw-rw-r--. trainee trainee unconfined_u:object_r:user_home_t:s0 file2

Notez que le type des deux fichiers est user_home_t.

Copiez maintenant le fichier file1 vers /tmp en utilisant la commande cp et visualiser son SC :

[trainee@centos7 ~]$ cp file1 /tmp
[trainee@centos7 ~]$ ls -Z /tmp/file1
-rw-rw-r--. trainee trainee unconfined_u:object_r:user_tmp_t:s0 /tmp/file1

Notez que le fichier ainsi copié a hérité du type du répertoire parent, à savoir tmp_t.

Déplacez maintenant le fichier file2 dans le répertoire /tmp et contrôlez son SC :

[trainee@centos7 ~]$ mv file2 /tmp
[trainee@centos7 ~]$ ls -Z /tmp/file2
-rw-rw-r--. trainee trainee unconfined_u:object_r:user_home_t:s0 /tmp/file2

Notez que la commande mv maintient le type d'origine.

Vérifier les SC des Processus

Il convient d'utiliser l'option Z avec la commande ps :

[trainee@centos7 ~]$ ps auxZ | more
LABEL                           USER       PID %CPU %MEM    VSZ   RSS TTY      STAT START   TIME COMMAND
system_u:system_r:init_t:s0     root         1  0.0  1.2  46140  6456 ?        Ss   juin17   0:27 /usr/lib/systemd/systemd --system --
deserialize 24
system_u:system_r:kernel_t:s0   root         2  0.0  0.0      0     0 ?        S    juin17   0:00 [kthreadd]
system_u:system_r:kernel_t:s0   root         3  0.0  0.0      0     0 ?        S    juin17   0:25 [ksoftirqd/0]
system_u:system_r:kernel_t:s0   root         5  0.0  0.0      0     0 ?        S<   juin17   0:00 [kworker/0:0H]
system_u:system_r:kernel_t:s0   root         6  0.0  0.0      0     0 ?        S    juin17   0:00 [kworker/u2:0]
system_u:system_r:kernel_t:s0   root         7  0.0  0.0      0     0 ?        S    juin17   0:00 [migration/0]
system_u:system_r:kernel_t:s0   root         8  0.0  0.0      0     0 ?        S    juin17   0:00 [rcu_bh]
system_u:system_r:kernel_t:s0   root         9  0.0  0.0      0     0 ?        S    juin17   0:17 [rcu_sched]
system_u:system_r:kernel_t:s0   root        10  0.0  0.0      0     0 ?        S    juin17   0:01 [watchdog/0]
system_u:system_r:kernel_t:s0   root        12  0.0  0.0      0     0 ?        S    juin17   0:00 [kdevtmpfs]
system_u:system_r:kernel_t:s0   root        13  0.0  0.0      0     0 ?        S<   juin17   0:00 [netns]
system_u:system_r:kernel_t:s0   root        14  0.0  0.0      0     0 ?        S    juin17   0:00 [khungtaskd]
system_u:system_r:kernel_t:s0   root        15  0.0  0.0      0     0 ?        S<   juin17   0:00 [writeback]
system_u:system_r:kernel_t:s0   root        16  0.0  0.0      0     0 ?        S<   juin17   0:00 [kintegrityd]
system_u:system_r:kernel_t:s0   root        17  0.0  0.0      0     0 ?        S<   juin17   0:00 [bioset]
system_u:system_r:kernel_t:s0   root        18  0.0  0.0      0     0 ?        S<   juin17   0:00 [kblockd]
system_u:system_r:kernel_t:s0   root        19  0.0  0.0      0     0 ?        S<   juin17   0:00 [md]
system_u:system_r:kernel_t:s0   root        25  0.0  0.0      0     0 ?        S    juin17   0:05 [kswapd0]
system_u:system_r:kernel_t:s0   root        26  0.0  0.0      0     0 ?        SN   juin17   0:00 [ksmd]
system_u:system_r:kernel_t:s0   root        27  0.0  0.0      0     0 ?        S<   juin17   0:00 [crypto]
system_u:system_r:kernel_t:s0   root        35  0.0  0.0      0     0 ?        S<   juin17   0:00 [kthrotld]
system_u:system_r:kernel_t:s0   root        37  0.0  0.0      0     0 ?        S<   juin17   0:00 [kmpath_rdacd]
system_u:system_r:kernel_t:s0   root        38  0.0  0.0      0     0 ?        S<   juin17   0:00 [kpsmoused]
system_u:system_r:kernel_t:s0   root        39  0.0  0.0      0     0 ?        S<   juin17   0:00 [ipv6_addrconf]
system_u:system_r:kernel_t:s0   root        59  0.0  0.0      0     0 ?        S<   juin17   0:00 [deferwq]
system_u:system_r:kernel_t:s0   root        94  0.0  0.0      0     0 ?        S    juin17   0:00 [kauditd]
system_u:system_r:kernel_t:s0   root       226  0.0  0.0      0     0 ?        S<   juin17   0:00 [ata_sff]
system_u:system_r:kernel_t:s0   root       238  0.0  0.0      0     0 ?        S    juin17   0:00 [scsi_eh_0]
system_u:system_r:kernel_t:s0   root       240  0.0  0.0      0     0 ?        S<   juin17   0:00 [scsi_tmf_0]
system_u:system_r:kernel_t:s0   root       241  0.0  0.0      0     0 ?        S    juin17   0:00 [scsi_eh_1]
system_u:system_r:kernel_t:s0   root       242  0.0  0.0      0     0 ?        S    juin17   0:02 [kworker/u2:2]
system_u:system_r:kernel_t:s0   root       243  0.0  0.0      0     0 ?        S<   juin17   0:00 [scsi_tmf_1]
system_u:system_r:kernel_t:s0   root       244  0.0  0.0      0     0 ?        S    juin17   0:00 [scsi_eh_2]
--Plus--

Visualiser la SC d'un Utilisateur

Utilisez l'option -Z avec la commande id :

[trainee@centos7 ~]$ id -Z
unconfined_u:unconfined_r:unconfined_t:s0-s0:c0.c1023

Notez que vous ne pouvez pas consulter le SC d'un autre utilisateur :

[trainee@centos7 ~]$ id root
uid=0(root) gid=0(root) groupes=0(root)
[trainee@centos7 ~]$ id -Z root
id: impossible d'afficher le contexte de sécurité quand un utilisateur est indiqué

Vérifier la SC d'un fichier

Il convient d'utiliser la commande ls avec l'option -Z :

[trainee@centos7 ~]$ cd /etc
[trainee@centos7 etc]$ ls -Z l* -d
-rw-r--r--. root root unconfined_u:object_r:ld_so_cache_t:s0 ld.so.cache
-rw-r--r--. root root system_u:object_r:etc_t:s0       ld.so.conf
drwxr-xr-x. root root system_u:object_r:etc_t:s0       ld.so.conf.d
-rw-r-----. root root system_u:object_r:etc_t:s0       libaudit.conf
drwxr-xr-x. root root system_u:object_r:etc_t:s0       libnl
drwxr-xr-x. root root system_u:object_r:etc_t:s0       libreport
-rw-r--r--. root root unconfined_u:object_r:etc_t:s0   libuser.conf
-rw-r--r--. root root unconfined_u:object_r:locale_t:s0 locale.conf
lrwxrwxrwx. root root unconfined_u:object_r:locale_t:s0 localtime -> ../usr/share/zoneinfo/Europe/Paris
-rw-r--r--. root root unconfined_u:object_r:etc_t:s0   login.defs
-rw-r--r--. root root system_u:object_r:etc_t:s0       logrotate.conf
drwxr-xr-x. root root system_u:object_r:etc_t:s0       logrotate.d
drwxr-xr-x. root root system_u:object_r:etc_t:s0       lsm
drwxr-xr-x. root root system_u:object_r:lvm_etc_t:s0   lvm

Troubleshooting SELinux

L'interprétation des messages journalisés de SELinux est souvent la clef d'un dépannage efficace et rapide.

Si le démon auditd est démarré, les messages de SELinux sont consignés dans le fichier /var/log/audit/audit.log. Dans le cas contraire, les mêmes messages sont consignés dans le fichier /var/log/messages. Dans les deux cas, chaque message de SELinux contient le mot clef AVC :

La commande chcon

La commande chcon permet de modifier temporairement une SC.

[trainee@centos7 etc]$ cd ~
[trainee@centos7 ~]$ chcon --help
Utilisation : chcon [OPTION]... CONTEXT FILE...
         ou : chcon [OPTION]... [-u USER] [-r ROLE] [-l RANGE] [-t TYPE] FILE...
         ou : chcon [OPTION]... --reference=RFILE FILE...
Modifier le contexte de sécurité SELinux de chaque FILE en CONTEXT.
Avec --reference, modifier le contexte de sécurité de chaque FILE à
celui de RFILE.

Les arguments obligatoires pour les options longues le sont aussi pour les
options courtes.
      --dereference      affecter le référent de chaque lien symbolique (par
                           défaut), au lieu du lien symbolique lui-même
  -h, --no-dereference   affecter les liens symboliques au lieu des fichiers
                           référencés
  -u, --user=USER        définir l'utilisateur USER dans le contexte de
                           sécurité cible
  -r, --role=ROLE        définir le rôle ROLE dans le contexte de sécurité cible
  -t, --type=TYPE        définir le type TYPE dans le contexte de sécurité cible
  -l, --range=RANGE      définir l'intervalle RANGE dans le contexte de
                         sécurité cible
      --no-preserve-root ne pas traiter « / » de manière spéciale (par défaut)
      --preserve-root    bloquer le traitement récursif sur « / »
      --reference=RFILE  utiliser le contexte de sécurité de RFILE au lieu
                           d'indiquer une valeur CONTEXT
  -R, --recursive        opérer récursivement sur les fichiers et répertoires
  -v, --verbose          afficher un diagnostic pour chaque fichier traité

Les options suivantes modifient la façon de parcourir la hiérarchie lorsque
l'option -R est aussi indiquée. Si plusieurs options sont indiquées, seule la
dernière sera prise en compte.

  -H                     si l'argument en ligne de commande est un lien
                           symbolique vers un répertoire, le parcourir
  -L                     parcourir tous les liens symboliques menant à un
                           répertoire
  -P                     ne parcourir aucun lien symbolique (par défaut)

      --help     afficher l'aide et quitter
      --version  afficher des informations de version et quitter

Aide en ligne de GNU coreutils : <http://www.gnu.org/software/coreutils/>
Signalez les problèmes de traduction de « chcon » à : <traduc@traduc.org>
Utilisez « info coreutils 'chcon invocation' » pour toute la documentation

Prenons le cas de la création d'un répertoire à la racine du système de fichiers afin d'y stocker les pages web du serveur apache :

[trainee@centos7 ~]$ su -
Mot de passe : 
Dernière connexion : dimanche 17 juin 2018 à 20:21:42 CEST sur pts/1
[root@centos7 ~]# mkdir /www
[root@centos7 ~]# touch /www/index.html

Installez maintenant le serveur Apache :

[root@centos7 ~]# yum install httpd

Modifiez ensuite la directive DocumentRoot dans le fichier /etc/httpd/conf/httpd.conf :

[...]
#DocumentRoot "/var/www/html"
DocumentRoot "/www"
[...]

Ajoutez les section <Directory “/www”>:

...
<Directory "/var/www">
    AllowOverride None
    # Allow open access:
    Require all granted
</Directory>

<Directory "/www">
	Options Indexes FollowSymLinks
	AllowOverride None
	Require all granted
</Directory>

# Further relax access to the default document root:
<Directory "/var/www/html">
...

Créez le fichier /www/index.html :

[root@centos7 ~]# vi /www/index.html
[root@centos7 ~]# cat /www/index.html
<html>
<title>
This is a test
</title>
<body>
www test page
</body>
</html>

Modifiez ensuite le propriétaire et le groupe du répertoire /www et son contenu :

[root@centos7 ~]# chown -R apache:apache /www

Dernièrement, créez un fichier index.html vide dans le répertoire /var/www/html/ :

[root@centos7 ~]# touch /var/www/html/index.html

Redémarrez maintenant le service httpd :

[root@centos7 ~]# systemctl restart httpd.service

Consultez le site localhost en utilisant lynx :

[root@centos7 ~]# lynx localhost

Pour consulter les messages d'alerte de SELinux, vous disposez de la commande sealert du paquet setroubleshoot-server.

Installez donc ce paquet :

[root@centos7 ~]# yum install setroubleshoot-server

La commande sealert possède à la fois une interface graphique et un mode en ligne de commande :

[root@centos7 ~]# sealert -a /var/log/audit/audit.log > /root/mylogfile.txt
type=AVC msg=audit(1524491216.546:616): avc:  denied  { getattr } for  pid=15389 comm="gssproxy" name="/" dev="sda2" ino=128 scontext=system_u:system_r:gssproxy_t:s0 tcontext=system_u:object_r:fs_t:s0 tclass=filesystem
 
**** Invalid AVC allowed in current policy ***

type=AVC msg=audit(1524491220.766:622): avc:  denied  { getattr } for  pid=15459 comm="gssproxy" name="/" dev="sda2" ino=128 scontext=system_u:system_r:gssproxy_t:s0 tcontext=system_u:object_r:fs_t:s0 tclass=filesystem
 
**** Invalid AVC allowed in current policy ***

Consultez le fichier /root/mylogfile.txt :

[root@centos7 ~]# more /root/mylogfile.txt 

found 3 alerts in /var/log/audit/audit.log
--------------------------------------------------------------------------------

SELinux is preventing /usr/libexec/dbus-1/dbus-daemon-launch-helper from using the rlimitinh access on a process.

*****  Plugin catchall (100. confidence) suggests   **************************

you believe that dbus-daemon-launch-helper should be allowed rlimitinh access on processes labeled unconfined_service_t 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 'dbus-daemon-lau' --raw | audit2allow -M my-dbusdaemonlau
# semodule -i my-dbusdaemonlau.pp


Additional Information:
Source Context                system_u:system_r:system_dbusd_t:s0-s0:c0.c1023
Target Context                system_u:system_r:unconfined_service_t:s0-s0:c0.c1
                              023
Target Objects                Unknown [ process ]
Source                        dbus-daemon-lau
Source Path                   /usr/libexec/dbus-1/dbus-daemon-launch-helper
Port                          <Unknown>
Host                          <Unknown>
Source RPM Packages           dbus-1.10.24-13.el7_6.x86_64
Target RPM Packages           
Policy RPM                    selinux-policy-3.13.1-166.el7_4.9.noarch
Selinux Enabled               True
Policy Type                   targeted
Enforcing Mode                Permissive
Host Name                     centos7.fenestros.loc
Platform                      Linux centos7.fenestros.loc
                              3.10.0-693.21.1.el7.x86_64 #1 SMP Wed Mar 7
                              19:03:37 UTC 2018 x86_64 x86_64
Alert Count                   1
First Seen                    2020-01-23 16:04:33 CET
Last Seen                     2020-01-23 16:04:33 CET
--More--(4%)

Cherchez dans le fichier la chaine Plugin catchall de la section concernant apache :

*****  Plugin catchall (17.1 confidence) suggests   **************************

you believe that httpd should be allowed getattr access on the index.html 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 'httpd' --raw | audit2allow -M my-httpd
# semodule -i my-httpd.pp


Additional Information:
Source Context                system_u:system_r:httpd_t:s0
Target Context                unconfined_u:object_r:default_t:s0
Target Objects                /www/index.html [ file ]
Source                        httpd
Source Path                   /usr/sbin/httpd
Port                          <Unknown>
Host                          <Unknown>
Source RPM Packages           httpd-2.4.6-90.el7.centos.x86_64
Target RPM Packages
Policy RPM                    selinux-policy-3.13.1-166.el7_4.9.noarch
Selinux Enabled               True
Policy Type                   targeted
Enforcing Mode                Permissive
Host Name                     centos7.fenestros.loc
Platform                      Linux centos7.fenestros.loc
                              3.10.0-693.21.1.el7.x86_64 #1 SMP Wed Mar 7
                              19:03:37 UTC 2018 x86_64 x86_64
Alert Count                   1
First Seen                    2020-01-23 16:04:30 CET
Last Seen                     2020-01-23 16:04:30 CET
Local ID                      096941d6-1c72-49bd-862b-9bfc3aad32e5

Raw Audit Messages
type=AVC msg=audit(1579791870.276:244): avc:  denied  { getattr } for  pid=1728 comm="httpd" path="/www/index.html" dev="sda2" ino=2240172 scontext=system_u:system_r:httpd_t:s0 tcontext=unconfined_u:object_r:default_t:s0 tclass=file


type=SYSCALL msg=audit(1579791870.276:244): arch=x86_64 syscall=stat success=yes exit=0 a0=56255c9727b8 a1=7ffd44466030 a2=7ffd44466030 a3=7f3a4d9ab712 items=0 ppid=1722 pid=1728 auid=4294967295 uid=48 gid=48 euid=48 suid=48 fsuid=48 egid=48 sgid=48 fsgid=48 tty=(none) ses=4294967295 comm=httpd exe=/usr/sbin/httpd subj=system_u:system_r:httpd_t:s0 key=(null)

Hash: httpd,httpd_t,default_t,file,getattr

Ce message a été généré parce que le repertoire /www ainsi que le fichier index.html ne possèdent pas le type nécessaire pour que le service apache puisse les utiliser :

[root@centos6 ~]# ls -Z /www/index.html
-rw-r--r--. root root unconfined_u:object_r:default_t:s0 /www/index.html
[root@centos7 ~]# ls -Z /var/www/html/index.html
-rw-r--r--. root root unconfined_u:object_r:httpd_sys_content_t:s0 /var/www/html/index.html

L'exemple ci-dessus nous montre clairement que le type pour /www/index.html est default_t or apache a besoin du type httpd_sys_content_t pour pouvoir accéder au fichier.

Modifiez donc la SC de /www et /www/index.html en utilisant la commande chcon :

[root@centos7 ~]# chcon -Rv --type=httpd_sys_content_t /www
changing security context of ‘/www/index.html’
changing security context of ‘/www’

[root@centos7 ~]# ls -Z /www/index.html
-rw-r--r--. root root unconfined_u:object_r:httpd_sys_content_t:s0 /www/index.html

Afin de maintenir ces SC lors d'une restauration des SC par défaut, il convient d'utiliser la commande semanage afin d'appliquer la modification d'une manière définitive :

[root@centos7 ~]# semanage fcontext -a -t httpd_sys_content_t "/www(/.*)?"

La commande restorecon

usage:  restorecon [-iFnrRv] [-e excludedir ] [-o filename ] [-f filename | pathname... ]

Pour illustrer l'utilisation de cette commande, créez les fichiers copy.html et move.html dans le répertoire /tmp :

[root@centos7 ~]# cd /tmp ; touch copy.html move.html
[root@centos7 tmp]# ls -Z | grep html
-rw-r--r--. root root unconfined_u:object_r:user_tmp_t:s0 copy.html
-rw-r--r--. root root unconfined_u:object_r:user_tmp_t:s0 move.html

Copiez le fichier copy.html vers /var/www/html et déplacez le fichier move.html vers la même cible :

[root@centos7 tmp]# cp copy.html /var/www/html/
[root@centos7 tmp]# mv move.html /var/www/html/
[root@centos7 tmp]# ls -Z /var/www/html
-rw-r--r--. root root unconfined_u:object_r:httpd_sys_content_t:s0 copy.html
-rw-r--r--. root root unconfined_u:object_r:httpd_sys_content_t:s0 index.html
-rw-r--r--. root root unconfined_u:object_r:user_tmp_t:s0 move.html

Important : Notez ici que copy.html a pris le type du répertoire de destination tandis que move.html retient le type obtenu lors de la création.

Restaurez maintenant la SC par défaut de move.html compte tenu de son emplacement en utilisant la commande restorecon :

[root@centos7 tmp]# restorecon -v /var/www/html/move.html
restorecon reset /var/www/html/move.html context unconfined_u:object_r:user_tmp_t:s0->unconfined_u:object_r:httpd_sys_content_t:s0

[root@centos7 tmp]# ls -Z /var/www/html
-rw-r--r--. root root unconfined_u:object_r:httpd_sys_content_t:s0 copy.html
-rw-r--r--. root root unconfined_u:object_r:httpd_sys_content_t:s0 index.html
-rw-r--r--. root root unconfined_u:object_r:httpd_sys_content_t:s0 move.html

Le fichier /.autorelabel

En cas de besoin il est intéressant de pouvoir restaurer les SC par défaut sur l'ensemble des objets du système. Cette procédure est très simple à mettre en oeuvre. Il convient de créer le fichier .autorelabel à la racine et de redémarrer le système :

[root@centos7 tmp]# touch /.autorelabel
[root@centos7 tmp]# shutdown -r now

La commande semanage

La commande semanage peut prendre plusieurs options :

[root@centos7 tmp]# semanage --help
usage: semanage [-h]
                
                {import,export,login,user,port,interface,module,node,fcontext,boolean,permissive,dontaudit}
                ...

semanage is used to configure certain elements of SELinux policy with-out
requiring modification to or recompilation from policy source.

positional arguments:
  {import,export,login,user,port,interface,module,node,fcontext,boolean,permissive,dontaudit}
    import              Import local customizations
    export              Output local customizations
    login               Manage login mappings between linux users and SELinux
                        confined users
    user                Manage SELinux confined users (Roles and levels for an
                        SELinux user)
    port                Manage network port type definitions
    interface           Manage network interface type definitions
    module              Manage SELinux policy modules
    node                Manage network node type definitions
    fcontext            Manage file context mapping definitions
    boolean             Manage booleans to selectively enable functionality
    permissive          Manage process type enforcement mode
    dontaudit           Disable/Enable dontaudit rules in policy

optional arguments:
  -h, --help            show this help message and exit

Pour illustrer l'utilisation de cette commande, considérez le besoin de mettre le service apache à l'écoute du port 8090 au lieu du port standard.

SELinux gère aussi l'accès aux ports par les différents serveurs. La liste complète des ports autorisés par serveur puet être visualiser à l'aide de la commande semanage :

[root@centos7 tmp]# semanage port -l
SELinux Port Type              Proto    Port Number

afs3_callback_port_t           tcp      7001
afs3_callback_port_t           udp      7001
afs_bos_port_t                 udp      7007
afs_fs_port_t                  tcp      2040
afs_fs_port_t                  udp      7000, 7005
afs_ka_port_t                  udp      7004
afs_pt_port_t                  tcp      7002
afs_pt_port_t                  udp      7002
afs_vl_port_t                  udp      7003
agentx_port_t                  tcp      705
agentx_port_t                  udp      705
amanda_port_t                  tcp      10080-10083
amanda_port_t                  udp      10080-10082
amavisd_recv_port_t            tcp      10024
amavisd_send_port_t            tcp      10025
amqp_port_t                    tcp      15672, 5671-5672
amqp_port_t                    udp      5671-5672
aol_port_t                     tcp      5190-5193
aol_port_t                     udp      5190-5193
apc_port_t                     tcp      3052
apc_port_t                     udp      3052
apcupsd_port_t                 tcp      3551
apcupsd_port_t                 udp      3551
apertus_ldp_port_t             tcp      539
apertus_ldp_port_t             udp      539
asterisk_port_t                tcp      1720
asterisk_port_t                udp      2427, 2727, 4569
audit_port_t                   tcp      60
auth_port_t                    tcp      113
bacula_port_t                  tcp      9103
bacula_port_t                  udp      9103
bctp_port_t                    tcp      8999
bctp_port_t                    udp      8999
bgp_port_t                     tcp      179, 2605
bgp_port_t                     udp      179, 2605
boinc_client_port_t            tcp      1043
boinc_client_port_t            udp      1034
boinc_port_t                   tcp      31416
brlp_port_t                    tcp      4101
certmaster_port_t              tcp      51235
chronyd_port_t                 udp      323
clamd_port_t                   tcp      3310
clockspeed_port_t              udp      4041
cluster_port_t                 tcp      5149, 40040, 50006-50008
cluster_port_t                 udp      5149, 50006-50008
cma_port_t                     tcp      1050
cma_port_t                     udp      1050
cobbler_port_t                 tcp      25151
collectd_port_t                udp      25826
commplex_link_port_t           tcp      4331, 5001
commplex_link_port_t           udp      5001
commplex_main_port_t           tcp      5000
commplex_main_port_t           udp      5000
comsat_port_t                  udp      512
condor_port_t                  tcp      9618
condor_port_t                  udp      9618
conman_port_t                  tcp      7890
conman_port_t                  udp      7890
connlcli_port_t                tcp      1358
connlcli_port_t                udp      1358
couchdb_port_t                 tcp      5984, 6984
couchdb_port_t                 udp      5984, 6984
ctdb_port_t                    tcp      4379
ctdb_port_t                    udp      4379
cvs_port_t                     tcp      2401
cvs_port_t                     udp      2401
cyphesis_port_t                tcp      6767, 6769, 6780-6799
cyphesis_port_t                udp      32771
cyrus_imapd_port_t             tcp      2005
daap_port_t                    tcp      3689
daap_port_t                    udp      3689
dbskkd_port_t                  tcp      1178
dcc_port_t                     udp      6276, 6277
dccm_port_t                    tcp      5679
dccm_port_t                    udp      5679
dey_keyneg_port_t              tcp      8750
dey_keyneg_port_t              udp      8750
dey_sapi_port_t                tcp      4330
dhcpc_port_t                   tcp      68, 546, 5546
dhcpc_port_t                   udp      68, 546, 5546
dhcpd_port_t                   tcp      547, 548, 647, 847, 7911
dhcpd_port_t                   udp      67, 547, 548, 647, 847
dict_port_t                    tcp      2628
distccd_port_t                 tcp      3632
dns_port_t                     tcp      53
dns_port_t                     udp      53
dnssec_port_t                  tcp      8955
dogtag_port_t                  tcp      7390
echo_port_t                    tcp      7
echo_port_t                    udp      7
efs_port_t                     tcp      520
embrace_dp_c_port_t            tcp      3198
embrace_dp_c_port_t            udp      3198
ephemeral_port_t               tcp      32768-61000
ephemeral_port_t               udp      32768-61000
epmap_port_t                   tcp      135
epmap_port_t                   udp      135
epmd_port_t                    tcp      4369
epmd_port_t                    udp      4369
fac_restore_port_t             tcp      5582
fac_restore_port_t             udp      5582
fingerd_port_t                 tcp      79
flash_port_t                   tcp      843, 1935
flash_port_t                   udp      1935
fmpro_internal_port_t          tcp      5003
fmpro_internal_port_t          udp      5003
freeipmi_port_t                tcp      9225
freeipmi_port_t                udp      9225
ftp_data_port_t                tcp      20
ftp_port_t                     tcp      21, 989, 990
ftp_port_t                     udp      989, 990
gatekeeper_port_t              tcp      1721, 7000
gatekeeper_port_t              udp      1718, 1719
gdomap_port_t                  tcp      538
gdomap_port_t                  udp      538
gds_db_port_t                  tcp      3050
gds_db_port_t                  udp      3050
gear_port_t                    tcp      43273
gear_port_t                    udp      43273
geneve_port_t                  tcp      6080
giftd_port_t                   tcp      1213
git_port_t                     tcp      9418
git_port_t                     udp      9418
glance_port_t                  tcp      9292
glance_port_t                  udp      9292
glance_registry_port_t         tcp      9191
glance_registry_port_t         udp      9191
gluster_port_t                 tcp      38465-38469, 24007-24027
gluster_port_t                 udp      24007-24027
gopher_port_t                  tcp      70
gopher_port_t                  udp      70
gpsd_port_t                    tcp      2947
hadoop_datanode_port_t         tcp      50010
hadoop_namenode_port_t         tcp      8020
hddtemp_port_t                 tcp      7634
hi_reserved_port_t             tcp      512-1023
hi_reserved_port_t             udp      512-1023
howl_port_t                    tcp      5335
howl_port_t                    udp      5353
hplip_port_t                   tcp      1782, 2207, 2208, 8290, 8292, 9100, 9101, 9102, 9220, 9221, 9222, 9280, 9281, 9282, 9290, 9291, 50000, 50002
http_cache_port_t              tcp      8080, 8118, 8123, 10001-10010
http_cache_port_t              udp      3130
http_port_t                    tcp      80, 81, 443, 488, 8008, 8009, 8443, 9000
...

Notez par exemple que le serveur apache est autorisé d'utiliser les ports suivants :

http_port_t                    tcp      80, 81, 443, 488, 8008, 8009, 8443, 9000

Dans le cas où on souhaite qu'apache utilise le port 8090 par exemple, il est nécessaire de créer la règle adéquate avec la commande semanage :

[root@centos7 ~]# semanage port -a -t http_port_t -p tcp 8090

Vous noterez que le port 8090 a été ajouté à la liste des ports reconnus comme valides par SELinux :

[root@centos7 tmp]# semanage port -l | grep http
http_cache_port_t              tcp      8080, 8118, 8123, 10001-10010
http_cache_port_t              udp      3130
http_port_t                    tcp      8090, 80, 81, 443, 488, 8008, 8009, 8443, 9000
pegasus_http_port_t            tcp      5988
pegasus_https_port_t           tcp      5989

La commande audit2allow

[root@centos7 tmp]# audit2allow --help
Usage: audit2allow [options]

Options:
  --version             show program's version number and exit
  -h, --help            show this help message and exit
  -b, --boot            audit messages since last boot conflicts with -i
  -a, --all             read input from audit log - conflicts with -i
  -p POLICY, --policy=POLICY
                        Policy file to use for analysis
  -d, --dmesg           read input from dmesg - conflicts with --all and
                        --input
  -i INPUT, --input=INPUT
                        read input from <input> - conflicts with -a
  -l, --lastreload      read input only after the last reload
  -r, --requires        generate require statements for rules
  -m MODULE, --module=MODULE
                        set the module name - implies --requires
  -M MODULE_PACKAGE, --module-package=MODULE_PACKAGE
                        generate a module package - conflicts with -o and -m
  -o OUTPUT, --output=OUTPUT
                        append output to <filename>, conflicts with -M
  -D, --dontaudit       generate policy with dontaudit rules
  -R, --reference       generate refpolicy style output
  -N, --noreference     do not generate refpolicy style output
  -v, --verbose         explain generated output
  -e, --explain         fully explain generated output
  -t TYPE, --type=TYPE  only process messages with a type that matches this
                        regex
  --perm-map=PERM_MAP   file name of perm map
  --interface-info=INTERFACE_INFO
                        file name of interface information
  --debug               leave generated modules for -M
  -w, --why             Translates SELinux audit messages into a description
                        of why the access was denied

La création d'un module de politique personnalisé se fait en utilisant la commande audit2allow. L'administrateur de sécurité à recours à la création de modules quand, et uniquement quand :

  • la résolution du problème n'est pas possible en utilisant une des commandes précédemment citées,
  • il n'existe pas de booléen capable de régler le problème.

Pour illustrer l'utilisation de cette commande, créez un nouveau répertoire pour les documents d'apache ainsi que la page d'accueil :

[root@centos7 tmp]# mkdir /www1
[root@centos7 tmp]# touch /www1/index.html

Éditez le fichier /etc/httpd/conf/httpd.conf :

[...]
#DocumentRoot "/var/www/html"
DocumentRoot "/www1"
[...]

Ajoutez les section <Directory “/www”>:

...
<Directory "/var/www">
    AllowOverride None
    # Allow open access:
    Require all granted
</Directory>

<Directory "/www1">
	Options Indexes FollowSymLinks
	AllowOverride None
	Require all granted
</Directory>

# Further relax access to the default document root:
<Directory "/var/www/html">
...

Créez le fichier /www1/index.html :

[root@centos7 ~]# cd ~
[root@centos7 ~]# vi /www1/index.html
[root@centos7 ~]# cat /www1/index.html
<html>
<title>
This is a test
</title>
<body>
www test page
</body>
</html>

Modifiez ensuite le propriétaire et le groupe du répertoire /www1 et son contenu :

[root@centos7 ~]# chown -R apache:apache /www1

Redémarrez le service httpd :

[root@centos7 ~]# systemctl restart httpd.service 

Consultez le site localhost en utilisant lynx :

[root@centos7 ~]# lynx localhost

Le fichier /var/log/audit/audit.log contient maintenant des notifications de type AVC :

[root@centos7 ~]# cat /var/log/audit/audit.log | grep AVC
type=USER_AVC msg=audit(1462020229.957:425): pid=1 uid=0 auid=4294967295 ses=4294967295 subj=system_u:system_r:init_t:s0 msg='avc:  received policyload notice (seqno=2)  exe="/usr/lib/systemd/systemd" sauid=0 hostname=? addr=? terminal=?'
type=AVC msg=audit(1524491216.546:616): avc:  denied  { getattr } for  pid=15389 comm="gssproxy" name="/" dev="sda2" ino=128 scontext=system_u:system_r:gssproxy_t:s0 tcontext=system_u:object_r:fs_t:s0 tclass=filesystem
type=AVC msg=audit(1524491220.766:622): avc:  denied  { getattr } for  pid=15459 comm="gssproxy" name="/" dev="sda2" ino=128 scontext=system_u:system_r:gssproxy_t:s0 tcontext=system_u:object_r:fs_t:s0 tclass=filesystem
type=AVC msg=audit(1529418883.052:818): avc:  denied  { getattr } for  pid=10071 comm="httpd" path="/www/index.html" dev="sda2" ino=35670335 scontext=system_u:system_r:httpd_t:s0 tcontext=unconfined_u:object_r:default_t:s0 tclass=file
type=AVC msg=audit(1529418883.052:819): avc:  denied  { getattr } for  pid=10071 comm="httpd" path="/www/index.html" dev="sda2" ino=35670335 scontext=system_u:system_r:httpd_t:s0 tcontext=unconfined_u:object_r:default_t:s0 tclass=file
type=AVC msg=audit(1529418919.091:822): avc:  denied  { getattr } for  pid=10385 comm="httpd" path="/www/index.html" dev="sda2" ino=35670335 scontext=system_u:system_r:httpd_t:s0 tcontext=unconfined_u:object_r:default_t:s0 tclass=file
type=AVC msg=audit(1529418919.092:823): avc:  denied  { getattr } for  pid=10385 comm="httpd" path="/www/index.html" dev="sda2" ino=35670335 scontext=system_u:system_r:httpd_t:s0 tcontext=unconfined_u:object_r:default_t:s0 tclass=file
type=AVC msg=audit(1529418954.500:826): avc:  denied  { getattr } for  pid=10669 comm="httpd" path="/www/index.html" dev="sda2" ino=35670335 scontext=system_u:system_r:httpd_t:s0 tcontext=unconfined_u:object_r:default_t:s0 tclass=file
type=AVC msg=audit(1529418954.500:827): avc:  denied  { getattr } for  pid=10669 comm="httpd" path="/www/index.html" dev="sda2" ino=35670335 scontext=system_u:system_r:httpd_t:s0 tcontext=unconfined_u:object_r:default_t:s0 tclass=file
type=AVC msg=audit(1529419054.949:865): avc:  denied  { getattr } for  pid=10670 comm="httpd" path="/www/index.html" dev="sda2" ino=35670335 scontext=system_u:system_r:httpd_t:s0 tcontext=unconfined_u:object_r:default_t:s0 tclass=file
type=AVC msg=audit(1529419054.949:866): avc:  denied  { getattr } for  pid=10670 comm="httpd" path="/www/index.html" dev="sda2" ino=35670335 scontext=system_u:system_r:httpd_t:s0 tcontext=unconfined_u:object_r:default_t:s0 tclass=file
type=USER_AVC msg=audit(1529421001.608:919): pid=1 uid=0 auid=4294967295 ses=4294967295 subj=system_u:system_r:init_t:s0 msg='avc:  received policyload notice (seqno=2)  exe="/usr/lib/systemd/systemd" sauid=0 hostname=? addr=? terminal=?'
type=USER_AVC msg=audit(1529421602.007:946): pid=1 uid=0 auid=4294967295 ses=4294967295 subj=system_u:system_r:init_t:s0 msg='avc:  received policyload notice (seqno=3)  exe="/usr/lib/systemd/systemd" sauid=0 hostname=? addr=? terminal=?'
type=AVC msg=audit(1529422368.058:1019): avc:  denied  { getattr } for  pid=1755 comm="httpd" path="/www1/index.html" dev="sda2" ino=53579496 scontext=system_u:system_r:httpd_t:s0 tcontext=unconfined_u:object_r:default_t:s0 tclass=file
type=AVC msg=audit(1529422368.058:1020): avc:  denied  { getattr } for  pid=1755 comm="httpd" path="/www1/index.html" dev="sda2" ino=53579496 scontext=system_u:system_r:httpd_t:s0 tcontext=unconfined_u:object_r:default_t:s0 tclass=file

A l'aide de la commande grep, il convient maintenant d'envoyer les messages d'erreurs en provenance du fichier /var/log/audit/audit.log sur l'entrée standard de la commande audit2allow afin de permettre celle-ci de créer des règles permettant l'autorisation de ce qui a été précédemment interdit par SELinux :

[root@centos7 ~]# grep httpd_t /var/log/audit/audit.log | audit2allow -m httpdlocal > httpdlocal.te

L'examen du fichier httpdlocal.te révèle la création de ces règles :

[root@centos7 ~]# cat httpdlocal.te

module httpdlocal 1.0;

require {
	type httpd_t;
	type default_t;
	class file getattr;
}

#============= httpd_t ==============

#!!!! WARNING: 'default_t' is a base type.
#!!!! The file '/www/index.html' is mislabeled on your system.  
#!!!! Fix with $ restorecon -R -v /www/index.html
allow httpd_t default_t:file getattr;

L'audit du fichier terminé, il faut maintenant utiliser audit2allow pour fabriquer un module de politique :

[root@centos7 ~]# grep httpd_t /var/log/audit/audit.log | audit2allow -M httpdlocal
******************** IMPORTANT ***********************
To make this policy package active, execute:

semodule -i httpdlocal.pp

Chargez maintenant le module dans la politique SELinux :

[root@centos7 ~]# semodule -i httpdlocal.pp

Vérifiez que le module est chargé :

[root@centos7 ~]# semodule -l | grep httpd
httpdlocal	1.0

Redémarrez le service httpd :

[root@centos7 ~]# systemctl restart httpd.service 

Videz le fichier /var/log/audit/audit.log :

[root@centos7 ~]# vi /var/log/audit/audit.log

Consultez le site localhost :

[root@centos7 ~]# lynx localhost

Constatez que la consultation ne génère plus de messages de type AVC :

[root@centos7 ~]# cat /var/log/audit/audit.log
[root@centos7 ~]# 

<html>

Copyright © 2020 Hugh Norris.<br><br>

</html>

Menu