Version : 2024.01

Dernière mise-à-jour : 2024/10/22 10:15

RH13404 - Gestion de la Sécurité

Contenu du Module

  • RH13404 - Gestion de la Sécurité
    • Contenu du Module
    • LAB #1 - Les Droits Unix Avancés
      • 1.1 - Les ACL
      • 1.2 - Les Attributs Étendus
    • LAB #2 - Mise en place de SELinux pour sécuriser le serveur
      • 2.1 - Introducton
      • 2.2 - 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
      • 3.1 - Copier et Déplacer des Fichiers
      • 3.2 - Vérifier les SC des Processus
      • 3.3 - Visualiser la SC d'un Utilisateur
      • 3.4 - Vérifier la SC d'un fichier
      • 3.4 - La commande chcon
      • 3.5 - La commande restorecon
      • 3.6 - Le fichier /.autorelabel
      • 3.7 - La commande semanage
      • 3.8 - La commande audit2allow
    • LAB #4 - Le Pare-feu Netfilter/iptables
      • 4.1 - La Configuration par firewalld
      • 4.2 - La Configuration de Base de firewalld
      • 4.3 - La Commande firewall-cmd
      • 4.4 - La Configuration Avancée de firewalld
      • 4.5 - Le mode Panic de firewalld

LAB #1 - Les Droits Unix Avancés

1.1 - Les ACL

Au delà des droits étendus d'Unix, Linux utilise un système d'ACL pour permettre une meilleure gestion des droits sur des fichiers.

Pour connaître les ACL positionnés sur un fichier, il convient d'utiliser la commande getfacl :

[root@redhat9 ~]# touch tux.jpg

[root@redhat9 ~]# getfacl tux.jpg
# file: tux.jpg
# owner: root
# group: root
user::rw-
group::r--
other::r--

Pour positionner des ACL sur un fichier, il convient d'utiliser la commande setfacl :

[root@redhat9 ~]# setfacl --set u::rwx,g::rx,o::-,u:trainee:rw tux.jpg

[root@redhat9 ~]# getfacl tux.jpg
# file: tux.jpg
# owner: root
# group: root
user::rwx
user:trainee:rw-
group::r-x
mask::rwx
other::---

Important - Veuillez noter l'apparition de la ligne mask. Le mask indique les permissions maximales qui peuvent être acccordées à un utilisateur ou un groupe tiers.

Regardez maintenant l'effet des ACL sur un répertoire. Créez le répertoire /home/trainee/rep1 :

[root@redhat9 ~]# mkdir rep1

Positionnez des ACL le répertoire avec la commande setfacl :

[root@redhat9 ~]# setfacl --set d:u::r,d:g::-,d:o::- rep1

Notez l'utilisation de la lettre d pour indiquer une permission par défaut.

Créez maintenant un fichier appelé fichier1 dans /root/rep1 :

[root@redhat9 ~]# touch rep1/fichier1

Utilisez la commande getfacl pour visualiser le résultat :

[root@redhat9 ~]# getfacl rep1
# file: rep1
# owner: root
# group: root
user::rwx
group::r-x
other::r-x
default:user::r--
default:group::---
default:other::---

[root@redhat9 ~]# getfacl rep1/fichier1
# file: rep1/fichier1
# owner: root
# group: root
user::r--
group::---
other::---

Notez que le fichier créé possède les ACL positionnés sur le répertoire rep1.

Dernièrement, les systèmes de sauvegarde classiques sous Linux ne peuvent pas sauvegarder les ACL, sauf l'outil star. Si vous n'utilisez pas star, il convient donc de sauvegarder les ACL dans un fichier grâce à la commande suivante :

[root@redhat9 ~]# cd rep1

[root@redhat9 rep1]# getfacl -R --skip-base . > backup.acl

[root@redhat9 rep1]# cat backup.acl
# file: .
# owner: root
# group: root
user::rwx
group::r-x
other::r-x
default:user::r--
default:group::---
default:other::---

La restauration des ACL se fait avec la commande setfacl :

# setfacl --restore=backup.acl [Entrée]
Options des Commandes

Les options de la commande getfacl sont :

[root@redhat9 rep1]# getfacl --help
getfacl 2.3.1 -- get file access control lists
Usage: getfacl [-aceEsRLPtpndvh] file ...
  -a, --access            display the file access control list only
  -d, --default           display the default access control list only
  -c, --omit-header       do not display the comment header
  -e, --all-effective     print all effective rights
  -E, --no-effective      print no effective rights
  -s, --skip-base         skip files that only have the base entries
  -R, --recursive         recurse into subdirectories
  -L, --logical           logical walk, follow symbolic links
  -P, --physical          physical walk, do not follow symbolic links
  -t, --tabular           use tabular output format
  -n, --numeric           print numeric user/group identifiers
      --one-file-system   skip files on different filesystems
  -p, --absolute-names    don't strip leading '/' in pathnames
  -v, --version           print version and exit
  -h, --help              this help text

Les options de la commande setfacl sont :

[root@redhat9 rep1]# setfacl --help
setfacl 2.3.1 -- set file access control lists
Usage: setfacl [-bkndRLP] { -m|-M|-x|-X ... } file ...
  -m, --modify=acl        modify the current ACL(s) of file(s)
  -M, --modify-file=file  read ACL entries to modify from file
  -x, --remove=acl        remove entries from the ACL(s) of file(s)
  -X, --remove-file=file  read ACL entries to remove from file
  -b, --remove-all        remove all extended ACL entries
  -k, --remove-default    remove the default ACL
      --set=acl           set the ACL of file(s), replacing the current ACL
      --set-file=file     read ACL entries to set from file
      --mask              do recalculate the effective rights mask
  -n, --no-mask           don't recalculate the effective rights mask
  -d, --default           operations apply to the default ACL
  -R, --recursive         recurse into subdirectories
  -L, --logical           logical walk, follow symbolic links
  -P, --physical          physical walk, do not follow symbolic links
      --restore=file      restore ACLs (inverse of `getfacl -R')
      --test              test mode (ACLs are not modified)
  -v, --version           print version and exit
  -h, --help              this help text

1.2 - Les Attributs Etendus

Les attributs s'ajoutent aux caractéristiques classiques d'un fichier dans un système de fichiers Ext2/Ext3/Ext4, JFS, ReiserFS, XFS et Btrfs.

Les principaux attributs sont :

Attribut Description
a Fichier journal - uniquement l'ajout de données au fichier est permis. Le fichier ne peut pas détruit
i Le fichier ne peut ni être modifié, ni être détruit, ni être déplacé. Le placement d'un lien sur le fichier n'est pas permis
s Le fichier sera physiquement détruit lors de sa suppression
D Répertoire synchrone
S Fichier synchrone
A La date et l'heure de dernier accès ne seront pas mises à jour

Important - Un fichier synchrone et un répertoire synchrone impliquent que les modifications seront immédiatement inscrites sur disque.

Les commandes associées avec les attributs sont :

Commande description
chattr Modifie les attributs
lsattr Visualise les attributs

Pour mieux comprendre, créez le répertoire /root/attributs/rep :

[root@redhat9 rep1]# cd ..
[root@redhat9 ~]# mkdir -p attributs/rep

Créez ensuite les fichier fichier et rep/fichier1 :

[root@redhat9 ~]# touch attributs/fichier
[root@redhat9 ~]# touch attributs/rep/fichier1

Modifiez les attributs d'une manière récursive sur le répertoire attributs :

[root@redhat9 ~]# chattr +i -R attributs/

Visualisez les attributs de l'arborescence attributs :

[root@redhat9 ~]# lsattr -R attributs
----i----------------- attributs/rep

attributs/rep:
----i----------------- attributs/rep/fichier1

----i----------------- attributs/fichier

Important - Notez que l'attribut e sous Ext4 indique l'utilisation des Extents. Cet attribut ne peut pas être enlever avec la commande chattr. Les Extents seront couverts dans le cours Gestion des Disques, des Systèmes de Fichiers et le Swap.

Essayez maintenant de déplacer le fichier fichier. Vous obtiendrez un résultat similaire à celui-ci :

[root@redhat9 ~]# cd attributs; mv /root/attributs/fichier /root/attributs/rep/fichier
mv: cannot move '/root/attributs/fichier' to '/root/attributs/rep/fichier': Operation not permitted

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

2.1 - 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.

2.2 - 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 RedHat 9, le fichier /etc/selinux/targeted/setrans.conf contient la correspondance entre les niveaux et leurs valeurs compréhensibles par l'utilisateur :

[root@redhat9 attributs]# 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@redhat9 attributs]# /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       *

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@redhat9 attributs]# ls -lR /etc/selinux/ | more
/etc/selinux/:
total 8
-rw-r--r--. 1 root root 1187 Oct 19  2023 config
-rw-r--r--. 1 root root 2668 Dec 14  2023 semanage.conf
drwxr-xr-x. 5 root root  133 Sep 25 12:04 targeted

/etc/selinux/targeted:
total 16
-rw-r--r--. 1 root root 2367 Jun  5 11:17 booleans.subs_dist
drwxr-xr-x. 4 root root 4096 Sep 25 11:58 contexts
drwxr-xr-x. 2 root root    6 Jun  5 11:17 logins
drwxr-xr-x. 2 root root   23 Sep 25 12:04 policy
-rw-r--r--. 1 root root  607 Jun  5 11:17 setrans.conf
-rw-r--r--. 1 root root   73 Sep 25 12:04 seusers

/etc/selinux/targeted/contexts:
total 72
-rw-r--r--. 1 root root  262 Sep 25 11:58 customizable_types
-rw-r--r--. 1 root root  195 Jun  5 11:17 dbus_contexts
-rw-r--r--. 1 root root 1111 Jun  5 11:17 default_contexts
-rw-r--r--. 1 root root  114 Jun  5 11:17 default_type
-rw-r--r--. 1 root root   29 Jun  5 11:17 failsafe_context
drwxr-xr-x. 2 root root 4096 Sep 25 12:04 files
--More--

Afin d'utiliser SELinux en ligne de commande sous RedHat 9, il est nécessaire d'installer le paquet setools-console :

[root@redhat9 attributs]# dnf install setools-console -y

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

[root@redhat9 attributs]# seinfo
Statistics for policy file: /sys/fs/selinux/policy
Policy Version:             33 (MLS enabled)
Target Policy:              selinux
Handle unknown classes:     allow
  Classes:             135    Permissions:         457
  Sensitivities:         1    Categories:         1024
  Types:              5155    Attributes:          259
  Users:                 8    Roles:                15
  Booleans:            360    Cond. Expr.:         393
  Allow:             65813    Neverallow:            0
  Auditallow:          176    Dontaudit:          8692
  Type_trans:       272792    Type_change:          94
  Type_member:          37    Range_trans:        6164
  Role allow:           40    Role_trans:          419
  Constraints:          70    Validatetrans:         0
  MLS Constrain:        72    MLS Val. Tran:         0
  Permissives:           5    Polcap:                6
  Defaults:              7    Typebounds:            0
  Allowxperm:            0    Neverallowxperm:       0
  Auditallowxperm:       0    Dontauditxperm:        0
  Ibendportcon:          0    Ibpkeycon:             0
  Initial SIDs:         27    Fs_use:               35
  Genfscon:            109    Portcon:             665
  Netifcon:              0    Nodecon:               0

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@redhat9 attributs]# 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.
# See also:
# https://docs.fedoraproject.org/en-US/quick-docs/getting-started-with-selinux/#getting-started-with-selinux-selinux-states-and-modes
#
# NOTE: In earlier Fedora kernel builds, SELINUX=disabled would also
# fully disable SELinux during boot. If you need a system with SELinux
# fully disabled instead of SELinux running with no policy loaded, you
# need to pass selinux=0 to the kernel command line. You can use grubby
# to persistently set the bootloader to boot with selinux=0:
#
#    grubby --update-kernel ALL --args selinux=0
#
# To revert back to SELinux enabled:
#
#    grubby --update-kernel ALL --remove-args selinux
#
SELINUX=enforcing
# SELINUXTYPE= can take one of these three 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@redhat9 attributs]# getenforce
Enforcing

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

[root@redhat9 attributs]# setenforce permissive

[root@redhat9 attributs]# getenforce
Permissive

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

root@redhat9 attributs]# 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
Memory protection checking:     actual (secure)
Max kernel policy version:      33

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@redhat9 attributs]# 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
Memory protection checking:     actual (secure)
Max kernel policy version:      33

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

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@redhat9 attributs]# 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
colord_use_nfs --> off
condor_tcp_network_connect --> off
conman_can_network --> off
conman_use_nfs --> off
container_connect_any --> off
container_manage_cgroup --> off
container_read_certs --> off
container_use_cephfs --> off
container_use_devices --> off
container_use_dri_devices --> on
container_use_ecryptfs --> off
container_user_exec_content --> on
cron_can_relabel --> off
cron_system_cronjob_use_shares --> off
cron_userdomain_transition --> on
cups_execmem --> off
cvs_read_shadow --> off
daemons_dontaudit_scheduling --> on
daemons_dump_core --> off
daemons_enable_cluster_mode --> off
daemons_use_tcp_wrapper --> off
daemons_use_tty --> off
dbadm_exec_content --> on
dbadm_manage_user_files --> off
dbadm_read_user_files --> off
deny_bluetooth --> off
deny_execmem --> off
deny_ptrace --> off
dhcpc_exec_iptables --> off
dhcpd_use_ldap --> off
dnsmasq_use_ipset --> off
domain_can_mmap_files --> off
--More--

ou la commande sestatus -b :

[root@redhat9 attributs]# 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
Memory protection checking:     actual (secure)
Max kernel policy version:      33

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
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
colord_use_nfs                              off
condor_tcp_network_connect                  off
conman_can_network                          off
conman_use_nfs                              off
container_connect_any                       off
container_manage_cgroup                     off
container_read_certs                        off
container_use_cephfs                        off
container_use_devices                       off
container_use_dri_devices                   on
container_use_ecryptfs                      off
container_user_exec_content                 on
cron_can_relabel                            off
cron_system_cronjob_use_shares              off
cron_userdomain_transition                  on
cups_execmem                                off
cvs_read_shadow                             off
daemons_dontaudit_scheduling                on
daemons_dump_core                           off
daemons_enable_cluster_mode                 off
--More--

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

[root@redhat9 attributs]# setsebool antivirus_can_scan_system 1

[root@redhat9 attributs]# getsebool antivirus_can_scan_system
antivirus_can_scan_system --> on

[root@redhat9 attributs]# setsebool antivirus_can_scan_system 0

[root@redhat9 attributs]# 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@redhat9 attributs]# semodule -DB

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

[root@redhat9 attributs]# seinfo
Statistics for policy file: /sys/fs/selinux/policy
Policy Version:             33 (MLS enabled)
Target Policy:              selinux
Handle unknown classes:     allow
  Classes:             135    Permissions:         457
  Sensitivities:         1    Categories:         1024
  Types:              5145    Attributes:          259
  Users:                 8    Roles:                15
  Booleans:            356    Cond. Expr.:         385
  Allow:             65504    Neverallow:            0
  Auditallow:          176    Dontaudit:             0
  Type_trans:       271770    Type_change:          94
  Type_member:          37    Range_trans:        5931
  Role allow:           40    Role_trans:          417
  Constraints:          70    Validatetrans:         0
  MLS Constrain:        72    MLS Val. Tran:         0
  Permissives:           5    Polcap:                6
  Defaults:              7    Typebounds:            0
  Allowxperm:            0    Neverallowxperm:       0
  Auditallowxperm:       0    Dontauditxperm:        0
  Ibendportcon:          0    Ibpkeycon:             0
  Initial SIDs:         27    Fs_use:               35
  Genfscon:            109    Portcon:             665
  Netifcon:              0    Nodecon:               0

3.1 - 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@redhat9 attributs]# exit
logout

[trainee@redhat9 ~]$ touch file1 file2

[trainee@redhat9 ~]$ ls -Z file*
unconfined_u:object_r:user_home_t:s0 file1
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@redhat9 ~]$ cp file1 /tmp

[trainee@redhat9 ~]$ ls -Z /tmp/file1
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@redhat9 ~]$ mv file2 /tmp

[trainee@redhat9 ~]$ ls -Z /tmp/file2
unconfined_u:object_r:user_home_t:s0 /tmp/file2

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

3.2 - Vérifier les SC des Processus

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

[trainee@redhat9 ~]$ 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  0.2 175884 21416 ?        Ss   Oct21   0:47 /usr/lib/systemd/systemd rhgb --switched-root --
system --deserialize 31
system_u:system_r:kernel_t:s0   root           2  0.0  0.0      0     0 ?        S    Oct21   0:00 [kthreadd]
system_u:system_r:kernel_t:s0   root           3  0.0  0.0      0     0 ?        I<   Oct21   0:00 [rcu_gp]
system_u:system_r:kernel_t:s0   root           4  0.0  0.0      0     0 ?        I<   Oct21   0:00 [rcu_par_gp]
system_u:system_r:kernel_t:s0   root           5  0.0  0.0      0     0 ?        I<   Oct21   0:00 [slub_flushwq]
system_u:system_r:kernel_t:s0   root           6  0.0  0.0      0     0 ?        I<   Oct21   0:00 [netns]
system_u:system_r:kernel_t:s0   root           8  0.0  0.0      0     0 ?        I<   Oct21   0:00 [kworker/0:0H-events_highpri]
system_u:system_r:kernel_t:s0   root          10  0.0  0.0      0     0 ?        I<   Oct21   0:00 [mm_percpu_wq]
system_u:system_r:kernel_t:s0   root          12  0.0  0.0      0     0 ?        I    Oct21   0:00 [rcu_tasks_kthre]
system_u:system_r:kernel_t:s0   root          13  0.0  0.0      0     0 ?        I    Oct21   0:00 [rcu_tasks_rude_]
system_u:system_r:kernel_t:s0   root          14  0.0  0.0      0     0 ?        I    Oct21   0:00 [rcu_tasks_trace]
system_u:system_r:kernel_t:s0   root          15  0.0  0.0      0     0 ?        S    Oct21   0:00 [ksoftirqd/0]
system_u:system_r:kernel_t:s0   root          16  0.0  0.0      0     0 ?        I    Oct21   0:01 [rcu_preempt]
system_u:system_r:kernel_t:s0   root          17  0.0  0.0      0     0 ?        S    Oct21   0:00 [migration/0]
system_u:system_r:kernel_t:s0   root          18  0.0  0.0      0     0 ?        S    Oct21   0:00 [idle_inject/0]
system_u:system_r:kernel_t:s0   root          20  0.0  0.0      0     0 ?        S    Oct21   0:00 [cpuhp/0]
system_u:system_r:kernel_t:s0   root          21  0.0  0.0      0     0 ?        S    Oct21   0:00 [cpuhp/1]
system_u:system_r:kernel_t:s0   root          22  0.0  0.0      0     0 ?        S    Oct21   0:00 [idle_inject/1]
system_u:system_r:kernel_t:s0   root          23  0.0  0.0      0     0 ?        S    Oct21   0:00 [migration/1]
system_u:system_r:kernel_t:s0   root          24  0.0  0.0      0     0 ?        S    Oct21   0:00 [ksoftirqd/1]
system_u:system_r:kernel_t:s0   root          27  0.0  0.0      0     0 ?        S    Oct21   0:00 [cpuhp/2]
system_u:system_r:kernel_t:s0   root          28  0.0  0.0      0     0 ?        S    Oct21   0:00 [idle_inject/2]
system_u:system_r:kernel_t:s0   root          29  0.0  0.0      0     0 ?        S    Oct21   0:00 [migration/2]
system_u:system_r:kernel_t:s0   root          30  0.0  0.0      0     0 ?        S    Oct21   0:00 [ksoftirqd/2]
system_u:system_r:kernel_t:s0   root          32  0.0  0.0      0     0 ?        I<   Oct21   0:00 [kworker/2:0H-events_highpri]
system_u:system_r:kernel_t:s0   root          33  0.0  0.0      0     0 ?        S    Oct21   0:00 [cpuhp/3]
system_u:system_r:kernel_t:s0   root          34  0.0  0.0      0     0 ?        S    Oct21   0:00 [idle_inject/3]
system_u:system_r:kernel_t:s0   root          35  0.0  0.0      0     0 ?        S    Oct21   0:00 [migration/3]
--More--

3.3 - Visualiser la SC d'un Utilisateur

Utilisez l'option -Z avec la commande id :

[trainee@redhat9 ~]$ 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@redhat9 ~]$ id root
uid=0(root) gid=0(root) groups=0(root)

[trainee@redhat9 ~]$ id -Z root
id: cannot print security context when user specified

3.4 - Vérifier la SC d'un fichier

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

[trainee@redhat9 ~]$ cd /etc

[trainee@redhat9 etc]$ ls -Z l* -d
unconfined_u:object_r:ld_so_cache_t:s0 ld.so.cache                system_u:object_r:etc_t:s0 libssh
            system_u:object_r:etc_t:s0 ld.so.conf                 system_u:object_r:etc_t:s0 libuser.conf
            system_u:object_r:etc_t:s0 ld.so.conf.d            system_u:object_r:locale_t:s0 locale.conf
            system_u:object_r:etc_t:s0 libaudit.conf           system_u:object_r:locale_t:s0 localtime
            system_u:object_r:etc_t:s0 libblockdev                system_u:object_r:etc_t:s0 login.defs
            system_u:object_r:etc_t:s0 libibverbs.d               system_u:object_r:etc_t:s0 logrotate.conf
            system_u:object_r:etc_t:s0 libnl                      system_u:object_r:etc_t:s0 logrotate.d
            system_u:object_r:etc_t:s0 libpaper.d                 system_u:object_r:etc_t:s0 lsm
            system_u:object_r:etc_t:s0 libreport              system_u:object_r:lvm_etc_t:s0 lvm

3.5 - 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 :

3.6 - La commande chcon

La commande chcon permet de modifier temporairement une SC.

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@redhat9 etc]$ su -
Password: fenestros

[root@redhat9 ~]# mkdir /www
[root@redhat9 ~]# touch /www/index.html

Installez maintenant le serveur Apache :

[root@redhat9 ~]# dnf install httpd

Activez et démarrez le service httpd :

[root@redhat9 ~]# systemctl status httpd
○ httpd.service - The Apache HTTP Server
     Loaded: loaded (/usr/lib/systemd/system/httpd.service; disabled; preset: disabled)
     Active: inactive (dead)
       Docs: man:httpd.service(8)
[root@redhat9 ~]# systemctl enable --now httpd
Created symlink /etc/systemd/system/multi-user.target.wants/httpd.service → /usr/lib/systemd/system/httpd.service.
[root@redhat9 ~]# systemctl status httpd
● httpd.service - The Apache HTTP Server
     Loaded: loaded (/usr/lib/systemd/system/httpd.service; enabled; preset: disabled)
     Active: active (running) since Tue 2024-10-22 10:15:49 CEST; 3s ago
       Docs: man:httpd.service(8)
   Main PID: 101100 (httpd)
     Status: "Started, listening on: port 80"
      Tasks: 177 (limit: 48800)
     Memory: 34.5M
        CPU: 86ms
     CGroup: /system.slice/httpd.service
             ├─101100 /usr/sbin/httpd -DFOREGROUND
             ├─101101 /usr/sbin/httpd -DFOREGROUND
             ├─101102 /usr/sbin/httpd -DFOREGROUND
             ├─101103 /usr/sbin/httpd -DFOREGROUND
             └─101104 /usr/sbin/httpd -DFOREGROUND

Oct 22 10:15:49 redhat9.ittraining.loc systemd[1]: Starting The Apache HTTP Server...
Oct 22 10:15:49 redhat9.ittraining.loc httpd[101100]: Server configured, listening on: port 80
Oct 22 10:15:49 redhat9.ittraining.loc systemd[1]: Started The Apache HTTP Server.

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

[root@redhat9 ~]# vi /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@redhat9 ~]# vi /www/index.html

[root@redhat9 ~]# 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@redhat9 ~]# chown -R apache:apache /www

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

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

Redémarrez maintenant le service httpd :

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

Installez le paquet lynx :

[root@redhat9 ~]# dnf install lynx -y

Consultez le site localhost en utilisant lynx :

[root@redhat9 ~]# lynx localhost

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

[root@redhat9 ~]# sealert -a /var/log/audit/audit.log > /root/mylogfile.txt

Consultez le fichier /root/mylogfile.txt :

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

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

SELinux is preventing /usr/bin/pkla-check-authorization from using the noatsecure access on a process.

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

If you believe that pkla-check-authorization should be allowed noatsecure access on processes labeled policykit_auth_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 'pkla-check-auth' --raw | audit2allow -M my-pklacheckauth
# semodule -X 300 -i my-pklacheckauth.pp


Additional Information:
Source Context                system_u:system_r:policykit_t:s0
Target Context                system_u:system_r:policykit_auth_t:s0
Target Objects                /lib64/ld-linux-x86-64.so.2 [ process ]
Source                        pkla-check-auth
Source Path                   /usr/bin/pkla-check-authorization
Port                          <Unknown>
Host                          <Unknown>
Source RPM Packages           polkit-pkla-compat-0.1-21.el9.x86_64
Target RPM Packages           glibc-2.34-100.el9_4.3.x86_64
SELinux Policy RPM            selinux-policy-targeted-38.1.35-2.el9_4.2.noarch
Local Policy RPM              selinux-policy-targeted-38.1.35-2.el9_4.2.noarch
Selinux Enabled               True
Policy Type                   targeted
Enforcing Mode                Permissive
Host Name                     redhat9.ittraining.loc
Platform                      Linux redhat9.ittraining.loc
                              5.14.0-427.37.1.el9_4.x86_64 #1 SMP
                              PREEMPT_DYNAMIC Fri Sep 13 12:41:50 EDT 2024
                              x86_64 x86_64
Alert Count                   10
First Seen                    2024-10-22 10:01:01 CEST
Last Seen                     2024-10-22 10:33:01 CEST
Local ID                      344c2abc-bac6-4064-ae22-411f0ce680cd

Raw Audit Messages
type=AVC msg=audit(1729585981.217:17543): avc:  denied  { noatsecure } for  pid=102284 comm="polkitd" scontext=system_u:system_r:policykit_t:s0 tco
ntext=system_u:system_r:policykit_auth_t:s0 tclass=process permissive=1


type=AVC msg=audit(1729585981.217:17543): avc:  denied  { rlimitinh } for  pid=102284 comm="pkla-check-auth" scontext=system_u:system_r:policykit_t
:s0 tcontext=system_u:system_r:policykit_auth_t:s0 tclass=process permissive=1


--More--(1%)

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

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

If you believe that httpd should have the net_admin capability 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 -X 300 -i my-httpd.pp


Additional Information:
Source Context                system_u:system_r:httpd_t:s0
Target Context                system_u:system_r:httpd_t:s0
Target Objects                Unknown [ capability ]
Source                        httpd
Source Path                   /usr/sbin/httpd
Port                          <Unknown>
Host                          <Unknown>
Source RPM Packages           httpd-core-2.4.57-11.el9_4.1.x86_64
Target RPM Packages           
SELinux Policy RPM            selinux-policy-targeted-38.1.35-2.el9_4.2.noarch
Local Policy RPM              selinux-policy-targeted-38.1.35-2.el9_4.2.noarch
Selinux Enabled               True
Policy Type                   targeted
Enforcing Mode                Permissive
Host Name                     redhat9.ittraining.loc
Platform                      Linux redhat9.ittraining.loc
                              5.14.0-427.37.1.el9_4.x86_64 #1 SMP
                              PREEMPT_DYNAMIC Fri Sep 13 12:41:50 EDT 2024
                              x86_64 x86_64
Alert Count                   9
First Seen                    2024-10-22 10:15:49 CEST
Last Seen                     2024-10-22 10:32:34 CEST
Local ID                      15ae5915-d5a6-4849-b0d1-e4829bfcb57e

Raw Audit Messages
type=AVC msg=audit(1729585954.475:17532): avc:  denied  { net_admin } for  pid=101828 comm="httpd" capability=12  scontext=system_u:system_r:httpd_
t:s0 tcontext=system_u:system_r:httpd_t:s0 tclass=capability permissive=1


type=SYSCALL msg=audit(1729585954.475:17532): arch=x86_64 syscall=setsockopt success=yes exit=0 a0=9 a1=1 a2=20 a3=7ffeb581bbe4 items=0 ppid=1 pid=
101828 auid=4294967295 uid=0 gid=0 euid=0 suid=0 fsuid=0 egid=0 sgid=0 fsgid=0 tty=(none) ses=4294967295 comm=httpd exe=/usr/sbin/httpd subj=system
_u:system_r:httpd_t:s0 key=(null)ARCH=x86_64 SYSCALL=setsockopt AUID=unset UID=root GID=root EUID=root SUID=root FSUID=root EGID=root SGID=root FSG
ID=root

Hash: httpd,httpd_t,httpd_t,capability,net_admin

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@redhat9 ~]# ls -Z /www/index.html
unconfined_u:object_r:default_t:s0 /www/index.html
[root@redhat9 ~]# ls -Z /var/www/html/index.html
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@redhat9 ~]# chcon -Rv --type=httpd_sys_content_t /www
changing security context of '/www/index.html'
changing security context of '/www'

[root@redhat9 ~]# ls -Z /www/index.html
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@redhat9 ~]# semanage fcontext -a -t httpd_sys_content_t "/www(/.*)?"

Les options de la commande chcon sont :

[root@redhat9 ~]# chcon --help
Usage: chcon [OPTION]... CONTEXT FILE...
  or:  chcon [OPTION]... [-u USER] [-r ROLE] [-l RANGE] [-t TYPE] FILE...
  or:  chcon [OPTION]... --reference=RFILE FILE...
Change the SELinux security context of each FILE to CONTEXT.
With --reference, change the security context of each FILE to that of RFILE.

Mandatory arguments to long options are mandatory for short options too.
      --dereference      affect the referent of each symbolic link (this is
                         the default), rather than the symbolic link itself
  -h, --no-dereference   affect symbolic links instead of any referenced file
  -u, --user=USER        set user USER in the target security context
  -r, --role=ROLE        set role ROLE in the target security context
  -t, --type=TYPE        set type TYPE in the target security context
  -l, --range=RANGE      set range RANGE in the target security context
      --no-preserve-root  do not treat '/' specially (the default)
      --preserve-root    fail to operate recursively on '/'
      --reference=RFILE  use RFILE's security context rather than specifying
                         a CONTEXT value
  -R, --recursive        operate on files and directories recursively
  -v, --verbose          output a diagnostic for every file processed

The following options modify how a hierarchy is traversed when the -R
option is also specified.  If more than one is specified, only the final
one takes effect.

  -H                     if a command line argument is a symbolic link
                         to a directory, traverse it
  -L                     traverse every symbolic link to a directory
                         encountered
  -P                     do not traverse any symbolic links (default)

      --help     display this help and exit
      --version  output version information and exit

GNU coreutils online help: <https://www.gnu.org/software/coreutils/>
Full documentation <https://www.gnu.org/software/coreutils/chcon>
or available locally via: info '(coreutils) chcon invocation'

3.7 - La commande restorecon

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

[root@redhat9 ~]# cd /tmp ; touch copy.html move.html

[root@redhat9 tmp]# ls -Z | grep html
 unconfined_u:object_r:user_tmp_t:s0 copy.html
 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@redhat9 tmp]# cp copy.html /var/www/html/

[root@redhat9 tmp]# mv move.html /var/www/html/

[root@redhat9 tmp]# ls -Z /var/www/html
unconfined_u:object_r:httpd_sys_content_t:s0 copy.html            unconfined_u:object_r:user_tmp_t:s0 move.html
unconfined_u:object_r:httpd_sys_content_t:s0 index.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@redhat9 tmp]# restorecon -v /var/www/html/move.html
Relabeled /var/www/html/move.html from unconfined_u:object_r:user_tmp_t:s0 to unconfined_u:object_r:httpd_sys_content_t:s0

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

3.8 - 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@redhat9 tmp]# touch /.autorelabel

[root@redhat9 tmp]# shutdown -r now

3.9 - La commande semanage

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 :

[trainee@redhat9 ~]$ su -
Password: fenestros

[root@redhat9 ~]# 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      80, 81, 443, 488, 8008, 8009, 8443, 9000
pegasus_http_port_t            tcp      5988
pegasus_https_port_t           tcp      5989

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@redhat9 ~]# 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@redhat9 ~]# 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

Les options semanage sont :

[root@redhat9 ~]# semanage –help usage: semanage [-h] {import,export,login,user,port,ibpkey,ibendport,interface,module,node,fcontext,boolean,permissive,dontaudit} …

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

positional arguments:

{import,export,login,user,port,ibpkey,ibendport,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
  ibpkey              Manage infiniband ibpkey type definitions
  ibendport           Manage infiniband end 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:

  1. h, –help show this help message and exit

3.10 - La commande audit2allow

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@redhat9 ~]# mkdir /www1

[root@redhat9 ~]# touch /www1/index.html

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

[root@redhat9 ~]# vi /etc/httpd/conf/httpd.conf
[...]
#DocumentRoot "/var/www/html"
DocumentRoot "/www1"
[...]

Ajoutez les section <Directory “/www1”>:

...
<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@redhat9 ~]# vi /www1/index.html

[root@redhat9 ~]# 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@redhat9 ~]# chown -R apache:apache /www1

Redémarrez le service httpd :

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

Consultez le site localhost en utilisant lynx :

[root@redhat9 ~]# lynx --dump localhost
                                  Red Hat Logo
                       Red Hat Enterprise Linux Test Page

   This page is used to test the proper operation of the HTTP server after
   it has been installed. If you can read this page, it means that the
   HTTP server installed at this site is working properly.
     __________________________________________________________________

If you are a member of the general public:

   The fact that you are seeing this page indicates that the website you
   just visited is either experiencing problems, or is undergoing routine
   maintenance.

   If you would like to let the administrators of this website know that
   you've seen this page instead of the page you expected, you should send
   them e-mail. In general, mail sent to the name "webmaster" and directed
   to the website's domain should reach the appropriate person.

   For example, if you experienced problems while visiting
   www.example.com, you should send e-mail to "webmaster@example.com".

   For information on Red Hat Enterprise Linux, please visit the [1]Red
   Hat, Inc. website. The documentation for Red Hat Enterprise Linux is
   [2]available on the Red Hat, Inc. website.
     __________________________________________________________________

If you are the website administrator:

   You may now add content to the webroot directory. Note that until you
   do so, people visiting your website will see this page, and not your
   content.

   For systems using the Apache HTTP Server: You may now add content to
   the directory /var/www/html/. Note that until you do so, people
   visiting your website will see this page, and not your content. To
   prevent this page from ever being used, follow the instructions in the
   file /etc/httpd/conf.d/welcome.conf.

   For systems using NGINX: You should now put your content in a location
   of your choice and edit the root configuration directive in the nginx
   configuration file /etc/nginx/nginx.conf.
   [3][ Powered by Red Hat Enterprise Linux ] [ Powered by Red Hat
   Enterprise Linux ]

   [4]Apache™ is a registered trademark of [5]the Apache Software
   Foundation in the United States and/or other countries.
   [6]NGINX™ is a registered trademark of [7]F5 Networks, Inc..

References

   1. http://www.redhat.com/
   2. http://www.redhat.com/docs/manuals/enterprise/
   3. https://access.redhat.com/products/red-hat-enterprise-linux
   4. https://apache.org/
   5. https://apache.org/
   6. https://nginx.com/
   7. https://www.f5.com/

Notez que cette fois SELinux est en mode enforcing :

[root@redhat9 ~]# getenforce
Enforcing

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

[root@redhat9 ~]# cat /var/log/audit/audit.log | grep AVC | tail
type=AVC msg=audit(1729587121.979:17697): avc:  denied  { noatsecure } for  pid=102767 comm="polkitd" scontext=system_u:system_r:policykit_t:s0 tcontext=system_u:system_r:policykit_auth_t:s0 tclass=process permissive=1
type=AVC msg=audit(1729587121.979:17697): avc:  denied  { rlimitinh } for  pid=102767 comm="pkla-check-auth" scontext=system_u:system_r:policykit_t:s0 tcontext=system_u:system_r:policykit_auth_t:s0 tclass=process permissive=1
type=AVC msg=audit(1729587121.979:17697): avc:  denied  { siginh } for  pid=102767 comm="pkla-check-auth" scontext=system_u:system_r:policykit_t:s0 tcontext=system_u:system_r:policykit_auth_t:s0 tclass=process permissive=1
type=AVC msg=audit(1729587426.204:17741): avc:  denied  { net_admin } for  pid=102906 comm="systemd-tmpfile" capability=12  scontext=system_u:system_r:systemd_tmpfiles_t:s0 tcontext=system_u:system_r:systemd_tmpfiles_t:s0 tclass=capability permissive=1
type=AVC msg=audit(1729587481.218:17751): avc:  denied  { noatsecure } for  pid=102921 comm="polkitd" scontext=system_u:system_r:policykit_t:s0 tcontext=system_u:system_r:policykit_auth_t:s0 tclass=process permissive=1
type=AVC msg=audit(1729587481.218:17751): avc:  denied  { rlimitinh } for  pid=102921 comm="pkla-check-auth" scontext=system_u:system_r:policykit_t:s0 tcontext=system_u:system_r:policykit_auth_t:s0 tclass=process permissive=1
type=AVC msg=audit(1729587481.218:17751): avc:  denied  { siginh } for  pid=102921 comm="pkla-check-auth" scontext=system_u:system_r:policykit_t:s0 tcontext=system_u:system_r:policykit_auth_t:s0 tclass=process permissive=1
type=AVC msg=audit(1729587592.855:17788): avc:  denied  { siginh } for  pid=102990 comm="bash" scontext=system_u:system_r:init_t:s0 tcontext=system_u:system_r:initrc_t:s0 tclass=process permissive=1
type=AVC msg=audit(1729588933.891:326): avc:  denied  { getattr } for  pid=2749 comm="httpd" path="/www1/index.html" dev="dm-0" ino=34189841 scontext=system_u:system_r:httpd_t:s0 tcontext=unconfined_u:object_r:default_t:s0 tclass=file permissive=0
type=AVC msg=audit(1729588933.891:327): avc:  denied  { getattr } for  pid=2749 comm="httpd" path="/www1/index.html" dev="dm-0" ino=34189841 scontext=system_u:system_r:httpd_t:s0 tcontext=unconfined_u:object_r:default_t:s0 tclass=file permissive=0

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@redhat9 ~]# 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@redhat9 ~]# cat httpdlocal.te

module httpdlocal 1.0;

require {
        type httpd_t;
        type default_t;
        class capability net_admin;
        class file { getattr map open read };
}

#============= httpd_t ==============
allow httpd_t default_t:file { getattr open read };

#!!!! This avc can be allowed using the boolean 'domain_can_mmap_files'
allow httpd_t default_t:file map;

#!!!! This avc has a dontaudit rule in the current policy
allow httpd_t self:capability net_admin;

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

[root@redhat9 ~]# 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@redhat9 ~]# semodule -i httpdlocal.pp

Vérifiez que le module est chargé :

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

Consultez le site localhost en utilisant lynx :

[root@redhat9 ~]# lynx --dump localhost
   www test page

Les options audit2allow sont :

[root@redhat9 ~]# 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
  -x, --xperms          generate extended permission rules
  -w, --why             Translates SELinux audit messages into a description
                        of why the access was denied

LAB #4 - Le Pare-feu Netfilter/iptables

Netfilter est composé de 5 hooks :

  • NF_IP_PRE_ROUTING
  • NF_IP_LOCAL_IN
  • NF_IP_LOCAL_OUT
  • NF_IP_FORWARD
  • NF_IP_POSTROUTING

Ces hooks sont utilisés par deux branches, la première est celle concernée par les paquets qui entrent vers des services locaux :

  • NF_IP_PRE_ROUTING > NF_IP_LOCAL_IN > NF_IP_LOCAL_OUT > NF_IP_POSTROUTING

tandis que la deuxième concerne les paquets qui traversent la passerelle:

  • NF_IP_PRE_ROUTING > NF_IP_FORWARD > NF_IP_POSTROUTING

Si IPTABLES a été compilé en tant que module, son utilisation nécessite le chargement de plusieurs modules supplémentaires en fonction de la situation:

  • iptable_filter
  • iptable_mangle
  • iptable_net
  • etc

Netfilter est organisé en tables. La commande iptables de netfilter permet d'insérer des policies dans les chaines:

  • La table FILTER
    • La chaîne INPUT
      • Concerne les paquets entrants
        • Policies: ACCEPT, DROP, REJECT
    • La chaîne OUTPUT
      • Concerne les paquets sortants
        • Policies: ACCEPT, DROP, REJECT
    • La chaîne FORWARD
      • Concerne les paquets traversant le par-feu.
        • Policies: ACCEPT, DROP, REJECT

Si aucune table n'est précisée, c'est la table FILTER qui s'applique par défaut.

  • La table NAT
    • La chaîne PREROUTING
      • Permet de faire la translation d'adresse de destination
        • Cibles: SNAT, DNAT, MASQUERADE
    • La chaîne POSTROUTING
      • Permet de faire la translation d'adresse de la source
        • Cibles: SNAT, DNAT, MASQUERADE
    • Le cas spécifique OUTPUT
      • Permet la modification de la destination des paquets générés localement
  • La table MANGLE
    • Permet le marquage de paquets générés localement (OUTPUT) et entrants (PREROUTING)

Les policies sont:

  • ACCEPT
    • Permet d'accepter le paquet concerné
  • DROP
    • Permet de rejeter le paquet concerné sans générer un message d'erreur
  • REJECT
    • Permet de rejeter le paquet concerné en générant une message d'erreur

Les cibles sont:

  • SNAT
    • Permet de modifier l'adresse source du paquet concerné
  • DNAT
    • Permet de modifier l'adresse de destination du paquet concerné
  • MASQUERADE
    • Permet de remplacer l'adresse IP privée de l'expéditeur par un socket public de la passerelle.

IPTABLES peut être configuré soit par des outils tels shorewall, soit en utilisant des lignes de commandes ou un script. Dans ce dernier cas, la ligne prend la forme:

# IPTABLES --action CHAINE --option1 --option2

Les actions sont:

Action Abréviation Déscription
- -append -A Ajouter une règle à la fin de la chaîne spécifiée
- -delete -D Supprimer une règle en spécifiant son numéro ou la règle à supprimer
- -replace -R Permet de remplacer la règle spécifée par son numéro
- -insert -I Permet d'insérer une règle à l'endroit spécifié
- -list -L Permet d'afficher des règles
- -flush -F Permet de vider toutes les règles d'une chaîne

Les options sont:

Option Abréviation Déscription
- -protocol -p Permet de spécifier un protocol - tcp, udp, icmp, all
- -source -s Permet de spécifier une adresse source
- -destination -d Permet de spécifier une adresse de destination
- -in-interface -i Permet de spécifier une interface réseau d'entrée
- -out-interface -o Permet de spécifier une interface réseau de sortie
- -fragment -f Permet de ne spécifier que les paquets fragmentés
- -source-port -sport Permet de spécifier un port source ou une plage de ports source
- -destination-port -dport Permet de spécifier un port de destination ou une plage de ports de destination
- -tcp-flags s/o Permet de spécifier un flag TCP à matcher - SYN, ACK, FIN, RST, URG, PSH, ALL, NONE
- -icmp-type s/o Permet de spécifier un type de paquet ICMP
- -mac-source s/o Permet de spécifier une adresse MAC

Les options spécifiques à NET sont:

- -to-destination s/o Permet de spécifier l'adresse de destination d'une translation
- -to-source s/o Permet spécifier l'adresse source d'une translation

Les options spécifiques aux LOGS sont:

- -log-level s/o Permet de spécifier le niveau de logs
- -log-prefix s/o Permet de spécifier un préfix pour les logs

L'option spécifique au STATEFUL est:

- -state s/o Permet de spécifier l'état du paquet à vérifier

Ce dernier cas fait référence au STATEFUL. Le STATEFUL est la capacité du par-feu à enregistrer dans une table spécifique, l'état des différentes connexions. Cette table s'appelle une table d'état. Le principe du fonctionnement de STATEFUL est simple, à savoir, si le paquet entrant appartient à une communication déjà établie, celui-ci n'est pas vérifié.

Il existe 4 états:

  • NEW
    • Le paquet concerne une nouvelle connexion et contient donc un flag SYN à 1
  • ESTABLISHED
    • Le paquet concerne une connexion déjà établie. Le paquet ne doit contenir ni flag SYN à 1, ni flag FIN à 1
  • RELATED
    • Le paquet est d'une connexion qui présente une relation avec une autre connexion
  • INVALID
    • La paquet provient d'une connexion anormale.

4.1 - La Configuration par firewalld

Firewalld utilise des zones - des jeux de règles pré-définis dans lesquels sont placés les interfaces :

  • trusted - un réseau fiable. Dans ce cas tous les ports sont autorisés,
  • work, home, internal - un réseau partiellement fiable. Dans ce cas quelques ports sont autorisés,
  • dmz, public, external - un réseau non fiable. Dans ce cas peu de ports sont autorisés,
  • block, drop - tout est interdit. La zone drop n'envoie pas de messages d'erreurs.

Important - Une interface ne peut être que dans une zone à la fois tandis que plusieurs interfaces peuvent être dans la même zone.

Le service firewalld doit toujours être lancé :

[root@redhat9 ~]# systemctl status firewalld.service
● firewalld.service - firewalld - dynamic firewall daemon
     Loaded: loaded (/usr/lib/systemd/system/firewalld.service; enabled; preset: enabled)
     Active: active (running) since Tue 2024-10-22 11:02:04 CEST; 32min ago
       Docs: man:firewalld(1)
   Main PID: 795 (firewalld)
      Tasks: 2 (limit: 48800)
     Memory: 44.6M
        CPU: 510ms
     CGroup: /system.slice/firewalld.service
             └─795 /usr/bin/python3 -s /usr/sbin/firewalld --nofork --nopid

Oct 22 11:02:01 redhat9.ittraining.loc systemd[1]: Starting firewalld - dynamic firewall daemon...
Oct 22 11:02:04 redhat9.ittraining.loc systemd[1]: Started firewalld - dynamic firewall daemon.

4.2 - La Configuration de Base de firewalld

La configuration par défaut de firewalld se trouve dans /usr/lib/firewalld :

[root@redhat9 ~]# ls -l /usr/lib/firewalld/
total 20
drwxr-xr-x. 2 root root 4096 Sep 25 12:05 helpers
drwxr-xr-x. 2 root root 4096 Sep 25 12:05 icmptypes
drwxr-xr-x. 2 root root   23 Sep 25 12:05 ipsets
drwxr-xr-x. 2 root root   33 Sep 25 12:05 policies
drwxr-xr-x. 2 root root 8192 Sep 25 12:06 services
drwxr-xr-x. 2 root root  184 Sep 25 12:05 zones

[root@redhat9 ~]# ls -l /usr/lib/firewalld/zones/
total 40
-rw-r--r--. 1 root root 312 Nov  6  2023 block.xml
-rw-r--r--. 1 root root 306 Nov  6  2023 dmz.xml
-rw-r--r--. 1 root root 304 Nov  6  2023 drop.xml
-rw-r--r--. 1 root root 317 Nov  6  2023 external.xml
-rw-r--r--. 1 root root 410 Nov  6  2023 home.xml
-rw-r--r--. 1 root root 425 Nov  6  2023 internal.xml
-rw-r--r--. 1 root root 729 Feb 22  2024 nm-shared.xml
-rw-r--r--. 1 root root 356 Nov  6  2023 public.xml
-rw-r--r--. 1 root root 175 Nov  6  2023 trusted.xml
-rw-r--r--. 1 root root 352 Nov  6  2023 work.xml

[root@redhat9 ~]# ls -l /usr/lib/firewalld/services/
total 884
-rw-r--r--. 1 root root 352 Nov  6  2023 afp.xml
-rw-r--r--. 1 root root 399 Nov  6  2023 amanda-client.xml
-rw-r--r--. 1 root root 427 Nov  6  2023 amanda-k5-client.xml
-rw-r--r--. 1 root root 283 Nov  6  2023 amqps.xml
-rw-r--r--. 1 root root 273 Nov  6  2023 amqp.xml
-rw-r--r--. 1 root root 285 Nov  6  2023 apcupsd.xml
-rw-r--r--. 1 root root 301 Nov  6  2023 audit.xml
-rw-r--r--. 1 root root 436 Nov  6  2023 ausweisapp2.xml
-rw-r--r--. 1 root root 320 Nov  6  2023 bacula-client.xml
-rw-r--r--. 1 root root 346 Nov  6  2023 bacula.xml
-rw-r--r--. 1 root root 390 Nov  6  2023 bareos-director.xml
-rw-r--r--. 1 root root 255 Nov  6  2023 bareos-filedaemon.xml
-rw-r--r--. 1 root root 316 Nov  6  2023 bareos-storage.xml
-rw-r--r--. 1 root root 429 Nov  6  2023 bb.xml
-rw-r--r--. 1 root root 339 Nov  6  2023 bgp.xml
-rw-r--r--. 1 root root 275 Nov  6  2023 bitcoin-rpc.xml
-rw-r--r--. 1 root root 307 Nov  6  2023 bitcoin-testnet-rpc.xml
-rw-r--r--. 1 root root 281 Nov  6  2023 bitcoin-testnet.xml
-rw-r--r--. 1 root root 244 Nov  6  2023 bitcoin.xml
-rw-r--r--. 1 root root 410 Nov  6  2023 bittorrent-lsd.xml
-rw-r--r--. 1 root root 222 Nov  6  2023 ceph-exporter.xml
-rw-r--r--. 1 root root 294 Nov  6  2023 ceph-mon.xml
-rw-r--r--. 1 root root 329 Nov  6  2023 ceph.xml
-rw-r--r--. 1 root root 168 Nov  6  2023 cfengine.xml
-rw-r--r--. 1 root root 234 Nov  6  2023 checkmk-agent.xml
-rw-r--r--. 1 root root 211 Nov  6  2023 cockpit.xml
-rw-r--r--. 1 root root 296 Nov  6  2023 collectd.xml
-rw-r--r--. 1 root root 260 Nov  6  2023 condor-collector.xml
-rw-r--r--. 1 root root 343 Nov  6  2023 cratedb.xml
-rw-r--r--. 1 root root 296 Nov  6  2023 ctdb.xml
-rw-r--r--. 1 root root 981 Nov  6  2023 dds-multicast.xml
-rw-r--r--. 1 root root 947 Nov  6  2023 dds-unicast.xml
-rw-r--r--. 1 root root 574 Nov  6  2023 dds.xml
-rw-r--r--. 1 root root 305 Nov  6  2023 dhcpv6-client.xml
-rw-r--r--. 1 root root 234 Nov  6  2023 dhcpv6.xml
-rw-r--r--. 1 root root 227 Nov  6  2023 dhcp.xml
-rw-r--r--. 1 root root 205 Nov  6  2023 distcc.xml
-rw-r--r--. 1 root root 318 Nov  6  2023 dns-over-tls.xml
-rw-r--r--. 1 root root 346 Nov  6  2023 dns.xml
-rw-r--r--. 1 root root 374 Nov  6  2023 docker-registry.xml
-rw-r--r--. 1 root root 391 Nov  6  2023 docker-swarm.xml
-rw-r--r--. 1 root root 228 Nov  6  2023 dropbox-lansync.xml
-rw-r--r--. 1 root root 338 Nov  6  2023 elasticsearch.xml
-rw-r--r--. 1 root root 304 Nov  6  2023 etcd-client.xml
-rw-r--r--. 1 root root 304 Nov  6  2023 etcd-server.xml
-rw-r--r--. 1 root root 224 Nov  6  2023 finger.xml
-rw-r--r--. 1 root root 270 Nov  6  2023 foreman-proxy.xml
-rw-r--r--. 1 root root 408 Nov  6  2023 foreman.xml
-rw-r--r--. 1 root root 709 Nov  6  2023 freeipa-4.xml
-rw-r--r--. 1 root root 489 Nov  6  2023 freeipa-ldaps.xml
-rw-r--r--. 1 root root 488 Nov  6  2023 freeipa-ldap.xml
-rw-r--r--. 1 root root 242 Nov  6  2023 freeipa-replication.xml
-rw-r--r--. 1 root root 657 Nov  6  2023 freeipa-trust.xml
-rw-r--r--. 1 root root 361 Nov  6  2023 ftp.xml
-rw-r--r--. 1 root root 292 Nov  6  2023 galera.xml
-rw-r--r--. 1 root root 184 Nov  6  2023 ganglia-client.xml
-rw-r--r--. 1 root root 176 Nov  6  2023 ganglia-master.xml
-rw-r--r--. 1 root root 212 Nov  6  2023 git.xml
-rw-r--r--. 1 root root 406 Nov  6  2023 gpsd.xml
-rw-r--r--. 1 root root 218 Nov  6  2023 grafana.xml
-rw-r--r--. 1 root root 119 Nov  6  2023 gre.xml
-rw-r--r--. 1 root root 608 Nov  6  2023 high-availability.xml
-rw-r--r--. 1 root root 336 Nov  6  2023 http3.xml
-rw-r--r--. 1 root root 448 Nov  6  2023 https.xml
-rw-r--r--. 1 root root 353 Nov  6  2023 http.xml
-rw-r--r--. 1 root root 293 Nov  6  2023 ident.xml
-rw-r--r--. 1 root root 372 Nov  6  2023 imaps.xml
-rw-r--r--. 1 root root 327 Nov  6  2023 imap.xml
-rw-r--r--. 1 root root 315 Nov  6  2023 ipfs.xml
-rw-r--r--. 1 root root 454 Nov  6  2023 ipp-client.xml
-rw-r--r--. 1 root root 427 Nov  6  2023 ipp.xml
-rw-r--r--. 1 root root 895 Nov  6  2023 ipsec.xml
-rw-r--r--. 1 root root 255 Nov  6  2023 ircs.xml
-rw-r--r--. 1 root root 247 Nov  6  2023 irc.xml
-rw-r--r--. 1 root root 264 Nov  6  2023 iscsi-target.xml
-rw-r--r--. 1 root root 358 Nov  6  2023 isns.xml
-rw-r--r--. 1 root root 213 Nov  6  2023 jenkins.xml
-rw-r--r--. 1 root root 182 Nov  6  2023 kadmin.xml
-rw-r--r--. 1 root root 272 Nov  6  2023 kdeconnect.xml
-rw-r--r--. 1 root root 233 Nov  6  2023 kerberos.xml
-rw-r--r--. 1 root root 384 Nov  6  2023 kibana.xml
-rw-r--r--. 1 root root 249 Nov  6  2023 klogin.xml
-rw-r--r--. 1 root root 221 Nov  6  2023 kpasswd.xml
-rw-r--r--. 1 root root 182 Nov  6  2023 kprop.xml
-rw-r--r--. 1 root root 242 Nov  6  2023 kshell.xml
-rw-r--r--. 1 root root 308 Nov  6  2023 kube-apiserver.xml
-rw-r--r--. 1 root root 204 Nov  6  2023 kube-api.xml
-rw-r--r--. 1 root root 289 Nov  6  2023 kube-controller-manager-secure.xml
-rw-r--r--. 1 root root 280 Nov  6  2023 kube-controller-manager.xml
-rw-r--r--. 1 root root 560 Nov  6  2023 kube-control-plane-secure.xml
-rw-r--r--. 1 root root 537 Nov  6  2023 kube-control-plane.xml
-rw-r--r--. 1 root root 244 Nov  6  2023 kubelet-readonly.xml
-rw-r--r--. 1 root root 212 Nov  6  2023 kubelet-worker.xml
-rw-r--r--. 1 root root 239 Nov  6  2023 kubelet.xml
-rw-r--r--. 1 root root 224 Nov  6  2023 kube-nodeport-services.xml
-rw-r--r--. 1 root root 328 Nov  6  2023 kube-scheduler-secure.xml
-rw-r--r--. 1 root root 319 Nov  6  2023 kube-scheduler.xml
-rw-r--r--. 1 root root 374 Nov  6  2023 kube-worker.xml
-rw-r--r--. 1 root root 232 Nov  6  2023 ldaps.xml
-rw-r--r--. 1 root root 199 Nov  6  2023 ldap.xml
-rw-r--r--. 1 root root 385 Nov  6  2023 libvirt-tls.xml
-rw-r--r--. 1 root root 389 Nov  6  2023 libvirt.xml
-rw-r--r--. 1 root root 269 Nov  6  2023 lightning-network.xml
-rw-r--r--. 1 root root 468 Nov  6  2023 llmnr-client.xml
-rw-r--r--. 1 root root 410 Nov  6  2023 llmnr-tcp.xml
-rw-r--r--. 1 root root 463 Nov  6  2023 llmnr-udp.xml
-rw-r--r--. 1 root root 519 Nov  6  2023 llmnr.xml
-rw-r--r--. 1 root root 349 Nov  6  2023 managesieve.xml
-rw-r--r--. 1 root root 432 Nov  6  2023 matrix.xml
-rw-r--r--. 1 root root 424 Nov  6  2023 mdns.xml
-rw-r--r--. 1 root root 245 Nov  6  2023 memcache.xml
-rw-r--r--. 1 root root 334 Nov  6  2023 minidlna.xml
-rw-r--r--. 1 root root 237 Nov  6  2023 mongodb.xml
-rw-r--r--. 1 root root 473 Nov  6  2023 mosh.xml
-rw-r--r--. 1 root root 211 Nov  6  2023 mountd.xml
-rw-r--r--. 1 root root 296 Nov  6  2023 mqtt-tls.xml
-rw-r--r--. 1 root root 287 Nov  6  2023 mqtt.xml
-rw-r--r--. 1 root root 170 Nov  6  2023 mssql.xml
-rw-r--r--. 1 root root 180 Nov  6  2023 ms-wbt.xml
-rw-r--r--. 1 root root 242 Nov  6  2023 murmur.xml
-rw-r--r--. 1 root root 171 Nov  6  2023 mysql.xml
-rw-r--r--. 1 root root 250 Nov  6  2023 nbd.xml
-rw-r--r--. 1 root root 309 Nov  6  2023 nebula.xml
-rw-r--r--. 1 root root 262 Nov  6  2023 netbios-ns.xml
-rw-r--r--. 1 root root 243 Nov  6  2023 netdata-dashboard.xml
-rw-r--r--. 1 root root 342 Nov  6  2023 nfs3.xml
-rw-r--r--. 1 root root 324 Nov  6  2023 nfs.xml
-rw-r--r--. 1 root root 293 Nov  6  2023 nmea-0183.xml
-rw-r--r--. 1 root root 247 Nov  6  2023 nrpe.xml
-rw-r--r--. 1 root root 389 Nov  6  2023 ntp.xml
-rw-r--r--. 1 root root 368 Nov  6  2023 nut.xml
-rw-r--r--. 1 root root 335 Nov  6  2023 openvpn.xml
-rw-r--r--. 1 root root 260 Nov  6  2023 ovirt-imageio.xml
-rw-r--r--. 1 root root 343 Nov  6  2023 ovirt-storageconsole.xml
-rw-r--r--. 1 root root 235 Nov  6  2023 ovirt-vmconsole.xml
-rw-r--r--. 1 root root 869 Nov  6  2023 plex.xml
-rw-r--r--. 1 root root 433 Nov  6  2023 pmcd.xml
-rw-r--r--. 1 root root 474 Nov  6  2023 pmproxy.xml
-rw-r--r--. 1 root root 544 Nov  6  2023 pmwebapis.xml
-rw-r--r--. 1 root root 460 Nov  6  2023 pmwebapi.xml
-rw-r--r--. 1 root root 357 Nov  6  2023 pop3s.xml
-rw-r--r--. 1 root root 348 Nov  6  2023 pop3.xml
-rw-r--r--. 1 root root 181 Nov  6  2023 postgresql.xml
-rw-r--r--. 1 root root 509 Nov  6  2023 privoxy.xml
-rw-r--r--. 1 root root 226 Nov  6  2023 prometheus-node-exporter.xml
-rw-r--r--. 1 root root 213 Nov  6  2023 prometheus.xml
-rw-r--r--. 1 root root 261 Nov  6  2023 proxy-dhcp.xml
-rw-r--r--. 1 root root 262 Nov  6  2023 ps2link.xml
-rw-r--r--. 1 root root 173 Nov  6  2023 ps3netsrv.xml
-rw-r--r--. 1 root root 424 Nov  6  2023 ptp.xml
-rw-r--r--. 1 root root 414 Nov  6  2023 pulseaudio.xml
-rw-r--r--. 1 root root 297 Nov  6  2023 puppetmaster.xml
-rw-r--r--. 1 root root 273 Nov  6  2023 quassel.xml
-rw-r--r--. 1 root root 520 Nov  6  2023 radius.xml
-rw-r--r--. 1 root root 183 Nov  6  2023 rdp.xml
-rw-r--r--. 1 root root 212 Nov  6  2023 redis-sentinel.xml
-rw-r--r--. 1 root root 268 Nov  6  2023 redis.xml
-rw-r--r--. 1 root root 381 Nov  6  2023 RH-Satellite-6-capsule.xml
-rw-r--r--. 1 root root 556 Nov  6  2023 RH-Satellite-6.xml
-rw-r--r--. 1 root root 214 Nov  6  2023 rpc-bind.xml
-rw-r--r--. 1 root root 213 Nov  6  2023 rquotad.xml
-rw-r--r--. 1 root root 310 Nov  6  2023 rsh.xml
-rw-r--r--. 1 root root 311 Nov  6  2023 rsyncd.xml
-rw-r--r--. 1 root root 350 Nov  6  2023 rtsp.xml
-rw-r--r--. 1 root root 329 Nov  6  2023 salt-master.xml
-rw-r--r--. 1 root root 339 Nov  6  2023 samba-client.xml
-rw-r--r--. 1 root root 782 Nov  6  2023 samba-dc.xml
-rw-r--r--. 1 root root 382 Nov  6  2023 samba.xml
-rw-r--r--. 1 root root 324 Nov  6  2023 sane.xml
-rw-r--r--. 1 root root 283 Nov  6  2023 sips.xml
-rw-r--r--. 1 root root 496 Nov  6  2023 sip.xml
-rw-r--r--. 1 root root 299 Nov  6  2023 slp.xml
-rw-r--r--. 1 root root 231 Nov  6  2023 smtp-submission.xml
-rw-r--r--. 1 root root 577 Nov  6  2023 smtps.xml
-rw-r--r--. 1 root root 550 Nov  6  2023 smtp.xml
-rw-r--r--. 1 root root 359 Nov  6  2023 snmptls-trap.xml
-rw-r--r--. 1 root root 390 Nov  6  2023 snmptls.xml
-rw-r--r--. 1 root root 308 Nov  6  2023 snmptrap.xml
-rw-r--r--. 1 root root 342 Nov  6  2023 snmp.xml
-rw-r--r--. 1 root root 405 Nov  6  2023 spideroak-lansync.xml
-rw-r--r--. 1 root root 275 Nov  6  2023 spotify-sync.xml
-rw-r--r--. 1 root root 173 Nov  6  2023 squid.xml
-rw-r--r--. 1 root root 421 Nov  6  2023 ssdp.xml
-rw-r--r--. 1 root root 463 Nov  6  2023 ssh.xml
-rw-r--r--. 1 root root 631 Nov  6  2023 steam-streaming.xml
-rw-r--r--. 1 root root 287 Nov  6  2023 svdrp.xml
-rw-r--r--. 1 root root 231 Nov  6  2023 svn.xml
-rw-r--r--. 1 root root 297 Nov  6  2023 syncthing-gui.xml
-rw-r--r--. 1 root root 414 Nov  6  2023 syncthing-relay.xml
-rw-r--r--. 1 root root 350 Nov  6  2023 syncthing.xml
-rw-r--r--. 1 root root 496 Nov  6  2023 synergy.xml
-rw-r--r--. 1 root root 444 Nov  6  2023 syslog-tls.xml
-rw-r--r--. 1 root root 329 Nov  6  2023 syslog.xml
-rw-r--r--. 1 root root 393 Nov  6  2023 telnet.xml
-rw-r--r--. 1 root root 252 Nov  6  2023 tentacle.xml
-rw-r--r--. 1 root root 424 Nov  6  2023 tftp.xml
-rw-r--r--. 1 root root 221 Nov  6  2023 tile38.xml
-rw-r--r--. 1 root root 336 Nov  6  2023 tinc.xml
-rw-r--r--. 1 root root 771 Nov  6  2023 tor-socks.xml
-rw-r--r--. 1 root root 244 Nov  6  2023 transmission-client.xml
-rw-r--r--. 1 root root 264 Nov  6  2023 upnp-client.xml
-rw-r--r--. 1 root root 593 Nov  6  2023 vdsm.xml
-rw-r--r--. 1 root root 475 Nov  6  2023 vnc-server.xml
-rw-r--r--. 1 root root 443 Nov  6  2023 warpinator.xml
-rw-r--r--. 1 root root 310 Nov  6  2023 wbem-https.xml
-rw-r--r--. 1 root root 352 Nov  6  2023 wbem-http.xml
-rw-r--r--. 1 root root 285 Nov  6  2023 wireguard.xml
-rw-r--r--. 1 root root 355 Nov  6  2023 ws-discovery-client.xml
-rw-r--r--. 1 root root 320 Nov  6  2023 ws-discovery-tcp.xml
-rw-r--r--. 1 root root 375 Nov  6  2023 ws-discovery-udp.xml
-rw-r--r--. 1 root root 357 Nov  6  2023 ws-discovery.xml
-rw-r--r--. 1 root root 323 Nov  6  2023 wsmans.xml
-rw-r--r--. 1 root root 316 Nov  6  2023 wsman.xml
-rw-r--r--. 1 root root 329 Nov  6  2023 xdmcp.xml
-rw-r--r--. 1 root root 509 Nov  6  2023 xmpp-bosh.xml
-rw-r--r--. 1 root root 488 Nov  6  2023 xmpp-client.xml
-rw-r--r--. 1 root root 264 Nov  6  2023 xmpp-local.xml
-rw-r--r--. 1 root root 545 Nov  6  2023 xmpp-server.xml
-rw-r--r--. 1 root root 314 Nov  6  2023 zabbix-agent.xml
-rw-r--r--. 1 root root 315 Nov  6  2023 zabbix-server.xml
-rw-r--r--. 1 root root 242 Nov  6  2023 zerotier.xml

[root@redhat9 ~]# ls -l /usr/lib/firewalld/icmptypes/
total 180
-rw-r--r--. 1 root root 385 Nov  6  2023 address-unreachable.xml
-rw-r--r--. 1 root root 258 Nov  6  2023 bad-header.xml
-rw-r--r--. 1 root root 293 Nov  6  2023 beyond-scope.xml
-rw-r--r--. 1 root root 279 Nov  6  2023 communication-prohibited.xml
-rw-r--r--. 1 root root 222 Nov  6  2023 destination-unreachable.xml
-rw-r--r--. 1 root root 173 Nov  6  2023 echo-reply.xml
-rw-r--r--. 1 root root 210 Nov  6  2023 echo-request.xml
-rw-r--r--. 1 root root 261 Nov  6  2023 failed-policy.xml
-rw-r--r--. 1 root root 280 Nov  6  2023 fragmentation-needed.xml
-rw-r--r--. 1 root root 266 Nov  6  2023 host-precedence-violation.xml
-rw-r--r--. 1 root root 257 Nov  6  2023 host-prohibited.xml
-rw-r--r--. 1 root root 242 Nov  6  2023 host-redirect.xml
-rw-r--r--. 1 root root 239 Nov  6  2023 host-unknown.xml
-rw-r--r--. 1 root root 247 Nov  6  2023 host-unreachable.xml
-rw-r--r--. 1 root root 229 Nov  6  2023 ip-header-bad.xml
-rw-r--r--. 1 root root 355 Nov  6  2023 neighbour-advertisement.xml
-rw-r--r--. 1 root root 457 Nov  6  2023 neighbour-solicitation.xml
-rw-r--r--. 1 root root 250 Nov  6  2023 network-prohibited.xml
-rw-r--r--. 1 root root 248 Nov  6  2023 network-redirect.xml
-rw-r--r--. 1 root root 239 Nov  6  2023 network-unknown.xml
-rw-r--r--. 1 root root 247 Nov  6  2023 network-unreachable.xml
-rw-r--r--. 1 root root 239 Nov  6  2023 no-route.xml
-rw-r--r--. 1 root root 328 Nov  6  2023 packet-too-big.xml
-rw-r--r--. 1 root root 225 Nov  6  2023 parameter-problem.xml
-rw-r--r--. 1 root root 233 Nov  6  2023 port-unreachable.xml
-rw-r--r--. 1 root root 256 Nov  6  2023 precedence-cutoff.xml
-rw-r--r--. 1 root root 249 Nov  6  2023 protocol-unreachable.xml
-rw-r--r--. 1 root root 185 Nov  6  2023 redirect.xml
-rw-r--r--. 1 root root 244 Nov  6  2023 reject-route.xml
-rw-r--r--. 1 root root 241 Nov  6  2023 required-option-missing.xml
-rw-r--r--. 1 root root 227 Nov  6  2023 router-advertisement.xml
-rw-r--r--. 1 root root 223 Nov  6  2023 router-solicitation.xml
-rw-r--r--. 1 root root 248 Nov  6  2023 source-quench.xml
-rw-r--r--. 1 root root 236 Nov  6  2023 source-route-failed.xml
-rw-r--r--. 1 root root 253 Nov  6  2023 time-exceeded.xml
-rw-r--r--. 1 root root 233 Nov  6  2023 timestamp-reply.xml
-rw-r--r--. 1 root root 228 Nov  6  2023 timestamp-request.xml
-rw-r--r--. 1 root root 258 Nov  6  2023 tos-host-redirect.xml
-rw-r--r--. 1 root root 257 Nov  6  2023 tos-host-unreachable.xml
-rw-r--r--. 1 root root 272 Nov  6  2023 tos-network-redirect.xml
-rw-r--r--. 1 root root 269 Nov  6  2023 tos-network-unreachable.xml
-rw-r--r--. 1 root root 293 Nov  6  2023 ttl-zero-during-reassembly.xml
-rw-r--r--. 1 root root 256 Nov  6  2023 ttl-zero-during-transit.xml
-rw-r--r--. 1 root root 259 Nov  6  2023 unknown-header-type.xml
-rw-r--r--. 1 root root 249 Nov  6  2023 unknown-option.xml

Ces fichiers sont au format xml, par exemple :

[root@redhat9 ~]# cat /usr/lib/firewalld/zones/home.xml
<?xml version="1.0" encoding="utf-8"?>
<zone>
  <short>Home</short>
  <description>For use in home areas. You mostly trust the other computers on networks to not harm your computer. Only selected incoming connections are accepted.</description>
  <service name="ssh"/>
  <service name="mdns"/>
  <service name="samba-client"/>
  <service name="dhcpv6-client"/>
  <service name="cockpit"/>
  <forward/>
</zone>

La configuration de firewalld ainsi que les définitions et règles personnalisées se trouvent dans /etc/firewalld :

[root@redhat9 ~]# ls -l /etc/firewalld/
total 8
-rw-r--r--. 1 root root 2483 Nov  6  2023 firewalld.conf
drwxr-x---. 2 root root    6 Nov  6  2023 helpers
drwxr-x---. 2 root root    6 Nov  6  2023 icmptypes
drwxr-x---. 2 root root    6 Nov  6  2023 ipsets
-rw-r--r--. 1 root root  271 Nov  6  2023 lockdown-whitelist.xml
drwxr-x---. 2 root root    6 Nov  6  2023 policies
drwxr-x---. 2 root root    6 Nov  6  2023 services
drwxr-x---. 2 root root   46 Nov  6  2023 zones

[root@redhat9 ~]# ls -l /etc/firewalld/zones/
total 8
-rw-r--r--. 1 root root 356 Oct 19  2023 public.xml
-rw-r--r--. 1 root root 356 Oct 19  2023 public.xml.old

[root@redhat9 ~]# ls -l /etc/firewalld/services/
total 0

[root@redhat9 ~]# ls -l /etc/firewalld/icmptypes/
total 0

Le fichier de configuration de firewalld est /etc/firewalld/firewalld.conf :

[root@redhat9 ~]# cat /etc/firewalld/firewalld.conf
# firewalld config file

# default zone
# The default zone used if an empty zone string is used.
# Default: public
DefaultZone=public

# Clean up on exit
# If set to no or false the firewall configuration will not get cleaned up
# on exit or stop of firewalld.
# Default: yes
CleanupOnExit=yes

# Clean up kernel modules on exit
# If set to yes or true the firewall related kernel modules will be
# unloaded on exit or stop of firewalld. This might attempt to unload
# modules not originally loaded by firewalld.
# Default: no
CleanupModulesOnExit=no

# Lockdown
# If set to enabled, firewall changes with the D-Bus interface will be limited
# to applications that are listed in the lockdown whitelist.
# The lockdown whitelist file is lockdown-whitelist.xml
# Default: no
Lockdown=no

# IPv6_rpfilter
# Performs a reverse path filter test on a packet for IPv6. If a reply to the
# packet would be sent via the same interface that the packet arrived on, the
# packet will match and be accepted, otherwise dropped.
# The rp_filter for IPv4 is controlled using sysctl.
# Note: This feature has a performance impact. See man page FIREWALLD.CONF(5)
# for details.
# Default: yes
IPv6_rpfilter=yes

# IndividualCalls
# Do not use combined -restore calls, but individual calls. This increases the
# time that is needed to apply changes and to start the daemon, but is good for
# debugging.
# Default: no
IndividualCalls=no

# LogDenied
# Add logging rules right before reject and drop rules in the INPUT, FORWARD
# and OUTPUT chains for the default rules and also final reject and drop rules
# in zones. Possible values are: all, unicast, broadcast, multicast and off.
# Default: off
LogDenied=off

# FirewallBackend
# Selects the firewall backend implementation.
# Choices are:
#       - nftables (default)
#       - iptables (iptables, ip6tables, ebtables and ipset)
# Note: The iptables backend is deprecated. It will be removed in a future
# release.
FirewallBackend=nftables

# FlushAllOnReload
# Flush all runtime rules on a reload. In previous releases some runtime
# configuration was retained during a reload, namely; interface to zone
# assignment, and direct rules. This was confusing to users. To get the old
# behavior set this to "no".
# Default: yes
FlushAllOnReload=yes

# RFC3964_IPv4
# As per RFC 3964, filter IPv6 traffic with 6to4 destination addresses that
# correspond to IPv4 addresses that should not be routed over the public
# internet.
# Defaults to "yes".
RFC3964_IPv4=yes

4.3 - La Commande firewall-cmd

firewalld s'appuie sur netfilter. Pour cette raison, l'utilisation de firewall-cmd est incompatible avec l'utilisation des commandes iptables et system-config-firewall.

Important - firewall-cmd est le front-end de firewalld en ligne de commande. Il existe aussi la commande firewall-config qui lance un outi de configuration graphique.

Pour obtenir la liste de toutes les zones prédéfinies, utilisez la commande suivante :

[root@redhat9 ~]# firewall-cmd --get-zones
block dmz drop external home internal nm-shared public trusted work

Pour obtenir la liste de toutes les services prédéfinis, utilisez la commande suivante :

[root@redhat9 ~]# firewall-cmd --get-services
RH-Satellite-6 RH-Satellite-6-capsule afp amanda-client amanda-k5-client amqp amqps apcupsd audit ausweisapp2 bacula bacula-client bareos-director bareos-filedaemon bareos-storage bb bgp bitcoin bitcoin-rpc bitcoin-testnet bitcoin-testnet-rpc bittorrent-lsd ceph ceph-exporter ceph-mon cfengine checkmk-agent cockpit collectd condor-collector cratedb ctdb dds dds-multicast dds-unicast dhcp dhcpv6 dhcpv6-client distcc dns dns-over-tls docker-registry docker-swarm dropbox-lansync elasticsearch etcd-client etcd-server finger foreman foreman-proxy freeipa-4 freeipa-ldap freeipa-ldaps freeipa-replication freeipa-trust ftp galera ganglia-client ganglia-master git gpsd grafana gre high-availability http http3 https ident imap imaps ipfs ipp ipp-client ipsec irc ircs iscsi-target isns jenkins kadmin kdeconnect kerberos kibana klogin kpasswd kprop kshell kube-api kube-apiserver kube-control-plane kube-control-plane-secure kube-controller-manager kube-controller-manager-secure kube-nodeport-services kube-scheduler kube-scheduler-secure kube-worker kubelet kubelet-readonly kubelet-worker ldap ldaps libvirt libvirt-tls lightning-network llmnr llmnr-client llmnr-tcp llmnr-udp managesieve matrix mdns memcache minidlna mongodb mosh mountd mqtt mqtt-tls ms-wbt mssql murmur mysql nbd nebula netbios-ns netdata-dashboard nfs nfs3 nmea-0183 nrpe ntp nut openvpn ovirt-imageio ovirt-storageconsole ovirt-vmconsole plex pmcd pmproxy pmwebapi pmwebapis pop3 pop3s postgresql privoxy prometheus prometheus-node-exporter proxy-dhcp ps2link ps3netsrv ptp pulseaudio puppetmaster quassel radius rdp redis redis-sentinel rpc-bind rquotad rsh rsyncd rtsp salt-master samba samba-client samba-dc sane sip sips slp smtp smtp-submission smtps snmp snmptls snmptls-trap snmptrap spideroak-lansync spotify-sync squid ssdp ssh steam-streaming svdrp svn syncthing syncthing-gui syncthing-relay synergy syslog syslog-tls telnet tentacle tftp tile38 tinc tor-socks transmission-client upnp-client vdsm vnc-server warpinator wbem-http wbem-https wireguard ws-discovery ws-discovery-client ws-discovery-tcp ws-discovery-udp wsman wsmans xdmcp xmpp-bosh xmpp-client xmpp-local xmpp-server zabbix-agent zabbix-server zerotier

Pour obtenir la liste de toutes les types ICMP prédéfinis, utilisez la commande suivante :

[root@redhat9 ~]# firewall-cmd --get-icmptypes
address-unreachable bad-header beyond-scope communication-prohibited destination-unreachable echo-reply echo-request failed-policy fragmentation-needed host-precedence-violation host-prohibited host-redirect host-unknown host-unreachable ip-header-bad neighbour-advertisement neighbour-solicitation network-prohibited network-redirect network-unknown network-unreachable no-route packet-too-big parameter-problem port-unreachable precedence-cutoff protocol-unreachable redirect reject-route required-option-missing router-advertisement router-solicitation source-quench source-route-failed time-exceeded timestamp-reply timestamp-request tos-host-redirect tos-host-unreachable tos-network-redirect tos-network-unreachable ttl-zero-during-reassembly ttl-zero-during-transit unknown-header-type unknown-option

Pour obtenir la liste des zones de la configuration courante, utilisez la commande suivante :

[root@redhat9 ~]# firewall-cmd --get-active-zones
public
  interfaces: ens18

Pour obtenir la liste des zones de la configuration courante pour une interface spécifique, utilisez la commande suivante :

[root@redhat9 ~]# firewall-cmd --get-zone-of-interface=ens18
public

Pour obtenir la liste des services autorisés pour la zone public, utilisez la commande suivante :

[root@redhat9 ~]# firewall-cmd --zone=public --list-services
cockpit dhcpv6-client ssh

Pour obtenir toute la configuration pour la zone public, utilisez la commande suivante :

[root@redhat9 ~]# firewall-cmd --zone=public --list-all
public (active)
  target: default
  icmp-block-inversion: no
  interfaces: ens18
  sources: 
  services: cockpit dhcpv6-client ssh
  ports: 
  protocols: 
  forward: yes
  masquerade: no
  forward-ports: 
  source-ports: 
  icmp-blocks: 
  rich rules: 

Pour obtenir la liste complète de toutes les zones et leurs configurations, utilisez la commande suivante :

[root@redhat9 ~]# firewall-cmd --list-all-zones
block
  target: %%REJECT%%
  icmp-block-inversion: no
  interfaces: 
  sources: 
  services: 
  ports: 
  protocols: 
  forward: yes
  masquerade: no
  forward-ports: 
  source-ports: 
  icmp-blocks: 
  rich rules: 

dmz
  target: default
  icmp-block-inversion: no
  interfaces: 
  sources: 
  services: ssh
  ports: 
  protocols: 
  forward: yes
  masquerade: no
  forward-ports: 
  source-ports: 
  icmp-blocks: 
  rich rules: 

drop
  target: DROP
  icmp-block-inversion: no
  interfaces: 
  sources: 
  services: 
  ports: 
  protocols: 
  forward: yes
  masquerade: no
  forward-ports: 
  source-ports: 
  icmp-blocks: 
  rich rules: 

external
  target: default
  icmp-block-inversion: no
  interfaces: 
  sources: 
  services: ssh
  ports: 
  protocols: 
  forward: yes
  masquerade: yes
  forward-ports: 
  source-ports: 
  icmp-blocks: 
  rich rules: 

home
  target: default
  icmp-block-inversion: no
  interfaces: 
  sources: 
  services: cockpit dhcpv6-client mdns samba-client ssh
  ports: 
  protocols: 
  forward: yes
  masquerade: no
  forward-ports: 
  source-ports: 
  icmp-blocks: 
  rich rules: 

internal
  target: default
  icmp-block-inversion: no
  interfaces: 
  sources: 
  services: cockpit dhcpv6-client mdns samba-client ssh
  ports: 
  protocols: 
  forward: yes
  masquerade: no
  forward-ports: 
  source-ports: 
  icmp-blocks: 
  rich rules: 

nm-shared
  target: ACCEPT
  icmp-block-inversion: no
  interfaces: 
  sources: 
  services: dhcp dns ssh
  ports: 
  protocols: icmp ipv6-icmp
  forward: no
  masquerade: no
  forward-ports: 
  source-ports: 
  icmp-blocks: 
  rich rules: 
        rule priority="32767" reject

public (active)
  target: default
  icmp-block-inversion: no
  interfaces: ens18
  sources: 
  services: cockpit dhcpv6-client ssh
  ports: 
  protocols: 
  forward: yes
  masquerade: no
  forward-ports: 
  source-ports: 
  icmp-blocks: 
  rich rules: 

trusted
  target: ACCEPT
  icmp-block-inversion: no
  interfaces: 
  sources: 
  services: 
  ports: 
  protocols: 
  forward: yes
  masquerade: no
  forward-ports: 
  source-ports: 
  icmp-blocks: 
  rich rules: 

work
  target: default
  icmp-block-inversion: no
  interfaces: 
  sources: 
  services: cockpit dhcpv6-client ssh
  ports: 
  protocols: 
  forward: yes
  masquerade: no
  forward-ports: 
  source-ports: 
  icmp-blocks: 
  rich rules:

Pour changer la zone par défaut de public à work, utilisez la commande suivante :

[root@redhat9 ~]# firewall-cmd --set-default-zone=work
success

[root@redhat9 ~]# firewall-cmd --get-active-zones
work
  interfaces: ens18

Pour ajouter l'interface ip_fixe à la zone work, utilisez la commande suivante :

[root@redhat9 ~]# firewall-cmd --zone=work --add-interface=ip_fixe
success

[root@redhat9 ~]# firewall-cmd --get-active-zones
work
  interfaces: ens18 ip_fixe

Pour supprimer l'interface ip_fixe à la zone work, utilisez la commande suivante :

[root@redhat9 ~]# firewall-cmd --zone=work --remove-interface=ip_fixe
success

[root@redhat9 ~]# firewall-cmd --get-active-zones
work
  interfaces: ens18

Pour ajouter le service http à la zone work, utilisez la commande suivante :

[root@redhat9 ~]# firewall-cmd --zone=work --add-service=http
success

[root@redhat9 ~]# firewall-cmd --zone=work --list-services
cockpit dhcpv6-client http ssh

Pour supprimer le service http de la zone work, utilisez la commande suivante :

[root@redhat9 ~]# firewall-cmd --zone=work --remove-service=http
success

[root@redhat9 ~]# firewall-cmd --zone=work --list-services
cockpit dhcpv6-client ssh

Pour ajouter un nouveau bloc ICMP, utilisez la commande suivante :

[root@redhat9 ~]# firewall-cmd --zone=work --add-icmp-block=echo-reply
success

[root@redhat9 ~]# firewall-cmd --zone=work --list-icmp-blocks
echo-reply

Pour supprimer un bloc ICMP, utilisez la commande suivante :

[root@redhat9 ~]# firewall-cmd --zone=work --remove-icmp-block=echo-reply
success

[root@redhat9 ~]# firewall-cmd --zone=work --list-icmp-blocks

[root@redhat9 ~]#

Pour ajouter le port 591/tcp à la zone work, utilisez la commande suivante :

[root@redhat9 ~]# firewall-cmd --zone=work --add-port=591/tcp
success

[root@redhat9 ~]# firewall-cmd --zone=work --list-ports
591/tcp

Pour supprimer le port 591/tcp à la zone work, utilisez la commande suivante :

[root@redhat9 ~]# firewall-cmd --zone=work --remove-port=591/tcp
success

[root@redhat9 ~]# firewall-cmd --zone=work --list-ports

[root@redhat9 ~]#

Pour créer un nouveau service, il convient de :

  • copier un fichier existant se trouvant dans le répertoire /usr/lib/firewalld/services vers /etc/firewalld/services,
  • modifier le fichier,
  • recharger la configuration de firewalld,
  • vérifier que firewalld voit le nouveau service.

Par exemple :

[root@redhat9 ~]# cp /usr/lib/firewalld/services/http.xml /etc/firewalld/services/filemaker.xml

[root@redhat9 ~]# vi /etc/firewalld/services/filemaker.xml

[root@redhat9 ~]# cat /etc/firewalld/services/filemaker.xml
<?xml version="1.0" encoding="utf-8"?>
<service>
  <short>FileMakerPro</short>
  <description>fichier de service firewalld pour FileMaker Pro</description>
  <port protocol="tcp" port="591"/>
</service>

[root@redhat9 ~]# firewall-cmd --reload
success

[root@redhat9 ~]# firewall-cmd --get-services | grep filemaker
RH-Satellite-6 RH-Satellite-6-capsule afp amanda-client amanda-k5-client amqp amqps apcupsd audit ausweisapp2 bacula bacula-client bareos-director bareos-filedaemon bareos-storage bb bgp bitcoin bitcoin-rpc bitcoin-testnet bitcoin-testnet-rpc bittorrent-lsd ceph ceph-exporter ceph-mon cfengine checkmk-agent cockpit collectd condor-collector cratedb ctdb dds dds-multicast dds-unicast dhcp dhcpv6 dhcpv6-client distcc dns dns-over-tls docker-registry docker-swarm dropbox-lansync elasticsearch etcd-client etcd-server filemaker finger foreman foreman-proxy freeipa-4 freeipa-ldap freeipa-ldaps freeipa-replication freeipa-trust ftp galera ganglia-client ganglia-master git gpsd grafana gre high-availability http http3 https ident imap imaps ipfs ipp ipp-client ipsec irc ircs iscsi-target isns jenkins kadmin kdeconnect kerberos kibana klogin kpasswd kprop kshell kube-api kube-apiserver kube-control-plane kube-control-plane-secure kube-controller-manager kube-controller-manager-secure kube-nodeport-services kube-scheduler kube-scheduler-secure kube-worker kubelet kubelet-readonly kubelet-worker ldap ldaps libvirt libvirt-tls lightning-network llmnr llmnr-client llmnr-tcp llmnr-udp managesieve matrix mdns memcache minidlna mongodb mosh mountd mqtt mqtt-tls ms-wbt mssql murmur mysql nbd nebula netbios-ns netdata-dashboard nfs nfs3 nmea-0183 nrpe ntp nut openvpn ovirt-imageio ovirt-storageconsole ovirt-vmconsole plex pmcd pmproxy pmwebapi pmwebapis pop3 pop3s postgresql privoxy prometheus prometheus-node-exporter proxy-dhcp ps2link ps3netsrv ptp pulseaudio puppetmaster quassel radius rdp redis redis-sentinel rpc-bind rquotad rsh rsyncd rtsp salt-master samba samba-client samba-dc sane sip sips slp smtp smtp-submission smtps snmp snmptls snmptls-trap snmptrap spideroak-lansync spotify-sync squid ssdp ssh steam-streaming svdrp svn syncthing syncthing-gui syncthing-relay synergy syslog syslog-tls telnet tentacle tftp tile38 tinc tor-socks transmission-client upnp-client vdsm vnc-server warpinator wbem-http wbem-https wireguard ws-discovery ws-discovery-client ws-discovery-tcp ws-discovery-udp wsman wsmans xdmcp xmpp-bosh xmpp-client xmpp-local xmpp-server zabbix-agent zabbix-server zerotier

4.4 - La Configuration Avancée de firewalld

La configuration de base de firewalld ne permet que la configuration des zones, services, blocs ICMP et les ports non-standard. Cependant firewalld peut également être configuré avec des Rich Rules ou Règles Riches. Rich Rules ou Règles Riches évaluent des critères pour ensuite entreprendre une action.

Les Critères sont :

  • source address=“<adresse_IP>“
  • destination address=”<adresse_IP>“,
  • rule port port=”<numéro_du_port>“,
  • service name=<nom_d'un_sevice_prédéfini>.

Les Actions sont :

  • accept,
  • reject,
    • une Action reject peut être associée avec un message d'erreur spécifique par la clause type=”<type_d'erreur>,
  • drop.

Saisissez la commande suivante pour ouvrir le port 80 :

[root@redhat9 ~]# firewall-cmd --add-rich-rule='rule port port="80" protocol="tcp" accept'
success

Important - Notez que la Rich Rule doit être entourée de caractères '.

Important - Notez que la Rich Rule a créé deux règles, une pour IPv4 et une deuxième pour IPv6. Une règle peut être créée pour IPv4 seul en incluant le Critère family=ipv4. De la même façon, une règle peut être créée pour IPv6 seul en incluant le Critère family=ipv6.

Cette nouvelle règle est écrite en mémoire mais non pas sur disque. Pour l'écrire sur disque dans le fichier zone se trouvant dans /etc/firewalld, il faut ajouter l'option –permanent :

[root@redhat9 ~]# firewall-cmd --add-rich-rule='rule port port="80" protocol="tcp" accept' --permanent
success

[root@redhat9 ~]# cat /etc/firewalld/zones/work.xml
<?xml version="1.0" encoding="utf-8"?>
<zone>
  <short>Work</short>
  <description>For use in work areas. You mostly trust the other computers on networks to not harm your computer. Only selected incoming connections are accepted.</description>
  <service name="ssh"/>
  <service name="dhcpv6-client"/>
  <service name="cockpit"/>
  <rule>
    <port port="80" protocol="tcp"/>
    <accept/>
  </rule>
  <forward/>
</zone>

Important - Attention ! La règle ajoutée avec l'option –permanent n'est pas prise en compte imédiatement mais uniquement au prochain redémmarge. Pour qu'une règle soit appliquée immédiatement et être écrite sur disque, il faut saisir la commande deux fois dont une avec l'option –permanent et l'autre sans l'option –permanent.

Redémarrez le service firewalld :

[root@redhat9 ~]# systemctl restart firewalld.service

Pour visualiser cette règle dans la configuration de firewalld, il convient de saisir la commande suivante :

[root@redhat9 ~]# firewall-cmd --zone=work --list-all
work (active)
  target: default
  icmp-block-inversion: no
  interfaces: ens18
  sources: 
  services: cockpit dhcpv6-client ssh
  ports: 
  protocols: 
  forward: yes
  masquerade: no
  forward-ports: 
  source-ports: 
  icmp-blocks: 
  rich rules: 
        rule port port="80" protocol="tcp" accept

Notez que la Rich Rule est créée dans la Zone par Défaut. Il est possible de créer une Rich Rule dans une autre zone en utilisant l'option –zone=<zone> de la commande firewall-cmd :

[root@redhat9 ~]# firewall-cmd --zone=public --add-rich-rule='rule port port="80" protocol="tcp" accept'
success

[root@redhat9 ~]# firewall-cmd --zone=public --list-all
public
  target: default
  icmp-block-inversion: no
  interfaces: 
  sources: 
  services: cockpit dhcpv6-client ssh
  ports: 
  protocols: 
  forward: yes
  masquerade: no
  forward-ports: 
  source-ports: 
  icmp-blocks: 
  rich rules: 
        rule port port="80" protocol="tcp" accept

Pour supprimer une Rich Rule, il faut copier la ligne entière la concernant qui se trouve dans la sortie de la commande firewall-cmd –list-all-zones :

[root@redhat9 ~]# firewall-cmd --zone=public --remove-rich-rule='rule port port="80" protocol="tcp" accept'
success

[root@redhat9 ~]# firewall-cmd --zone=public --list-all
public
  target: default
  icmp-block-inversion: no
  interfaces: 
  sources: 
  services: cockpit dhcpv6-client ssh
  ports: 
  protocols: 
  forward: yes
  masquerade: no
  forward-ports: 
  source-ports: 
  icmp-blocks: 
  rich rules: 

4.5 - Le mode Panic de firewalld

Le mode Panic de firewalld permet de bloquer tout le trafic avec une seule commande. Pour connaître l'état du mode Panic, utilisez la commande suivante :

[root@redhat9 ~]# firewall-cmd --query-panic
no

Pour activer le mode Panic, il convient de saisir la commande suivante :

# firewall-cmd --panic-on

Pour désactiver le mode Panic, il convient de saisir la commande suivante :

# firewall-cmd --panic-off

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

Menu