jeudi 6 février 2020

UNIFI sous docker avec macvlan

Contenu du docker-compose.yml:

version: '2.3'
services:
  controller:
    image: "jacobalberty/unifi:stable"
    container_name: unifi_controller
    init: true
    networks:
      unifinet:
          ipv4_address: "192.168.1.200"
    restart: always
    volumes:
      - ./data:/unifi/data
      - ./log:/unifi/log
    environment:
      TZ: "Europe/Paris"
      RUNAS_UID0: "false"
      UNIFI_UID: 1000
      UNIFI_GID: 1000
    ports:
      - "3478:3478/udp" # STUN
      - "6789:6789/tcp" # Speed test
      - "8080:8080/tcp" # Device/ controller comm.
      - "8443:8443/tcp" # Controller GUI/API as seen in a web browser
      - "8880:8880/tcp" # HTTP portal redirection
      - "8843:8843/tcp" # HTTPS portal redirection
      - "10001:10001/udp" # AP discovery

networks:
  unifinet:
      name: unifinet
      driver: macvlan
      driver_opts:
         parent: "em1"
      ipam:
         config:
            - subnet: 192.168.1.0/24
              gateway: 192.168.1.1
              ip_range: 192.168.1.200/30

SELINUX - CENTOS 7

SElinux - pour « Security-Enhanced Linux »


En résumé:

Chaque processus est confiné à un domaine.
Les fichiers sont étiquetés par rapport à ce domaine. De fait, les processus confinés à un domaine n'ont accès qu'aux fichiers étiquetés pour ce domaine.
Si un processus est corrompu, alors ce processus ne pourra pas avoir accès qu'aux fichiers étiquetés pour celui-ci. Et non aux autres fichiers.

L'exemple montre que le processus avec le domaine httpd_t accède aux fichiers /var/www/html avec le type de contexte httpd_sys_content_t  mais ne peut accéder aux fichiers /data/mysql avec le type de contexte mysqld_db_t. De meme, le processus MariaDB ne peut acceder aux fichiers /var/www/html. Ce confinement est réalisé par des règles SELinux.

Quelques liens intéressant:
Trois modes:
  • Enforcing : SELinux est activé
  • Permissive : SELinux est en mode debug. Ce mode permet d'avoir les logs sans mettre en place les restrictions
  • Disabled : SELinux est désactivé. Aucun log.
Connaitre l'état  actuel:
# getenforce
Enforcing
 Utiliser l'utilitaire setenforce pour changer le mode entre "permissive" et "enforcing".

# setenforce 0
# getenforce
Permissive
# setenforce 1
# getenforce
Enforcing 
Il est possible de définir un domaine avec le mode "permissive" avec un système focntionnant avec le mode "enforcing".
# semanage permissive -a httpd_t

Bon à savoir:

Si SELinux est en mode permissif ou désactivé, tous nouveaux fichiers créées n'auront pas d'étiquettes. Donc, pensez à re-étiqueter l'intégralité des fichiers avant d'activer SELinux.

# fixfiles -F onboot
# reboot

Exemple de contexte SELinux pour /var/www.html
[root@alien1 www]# ls -laZ
drwxr-xr-x. root root system_u:object_r:httpd_sys_content_t:s0 .
drwxr-xr-x. root root system_u:object_r:var_t:s0       ..
drwxr-xr-x. root root system_u:object_r:httpd_sys_script_exec_t:s0 cgi-bin
drwxr-xr-x. root root system_u:object_r:httpd_sys_content_t:s0 html
Un contexte est représenté de cette façon:
utilisateur:rôle:type:niveau
Utilisateurs
# semanage login -l

Nom pour l’ouverture de session Identité SELinux     Intervalle MLS/MCS   Service

__default__          unconfined_u         s0-s0:c0.c1023       *
root                 unconfined_u         s0-s0:c0.c1023       *
system_u             system_u             s0-s0:c0.c1023       *
Rôles
# semanage user -l

                Étiquetage MLS/       MLS/                          
Identité SELinux Préfixe    Niveau MCS Intervalle MCS                 Rôles SELinux

guest_u         user       s0         s0                             guest_r
root            user       s0         s0-s0:c0.c1023                 staff_r sysadm_r system_r unconfined_r
staff_u         user       s0         s0-s0:c0.c1023                 staff_r sysadm_r system_r unconfined_r
sysadm_u        user       s0         s0-s0:c0.c1023                 sysadm_r
system_u        user       s0         s0-s0:c0.c1023                 system_r unconfined_r
unconfined_u    user       s0         s0-s0:c0.c1023                 system_r unconfined_r
user_u          user       s0         s0                             user_r
xguest_u        user       s0         s0                             xguest_r
Types:
# seinfo -t
Un domaine n'est qu'un type qui s'applique aux processus. Les domaines sont suffixés par un _t comme les types affectés aux objets.

Niveau:
# cat /etc/selinux/targeted/setrans.conf
Permet de définir des catégries à des process et fichiers. Cet fonctionnalité a pour nom le Multi-Category Security (MCS). Rarement utilisé.

 

Mise en application:

Comme nous avons vu, chaque processus est confiné à son domaine et donc ne pourra pas accéder aux fichiers n'ayant pas le bon contexte. On peut connaitre la liste des contextes pour un processus donné avec la commande sesearch (yum install setools)

Prenons l'exemple du processus httpd:
[root@alien1 www]# sesearch --allow -s httpd_t -c file -p read
Found 283 semantic av rules:
   allow nsswitch_domain samba_var_t : file { ioctl read getattr lock open } ; 
   allow httpd_t smokeping_var_lib_t : file { ioctl read getattr lock open } ; 
   allow httpd_t httpd_var_lib_t : file { ioctl read write create getattr setattr lock append unlink link rename open } ; 
   allow httpd_t nagios_log_t : file { ioctl read getattr lock open } ;
   ...
   allow httpd_t httpd_sys_content_t : file { ioctl read getattr lock map open } ; 
   ...
Cela donne la liste des contextes que le fichier doit avoir pour permettre une lecture seule au processus httpd. En changeant l'option -p , on peut lister d'autres permissions. ( ioctl read write create getattr setattr lock append unlink link rename open)


On constate que le processus httpd avec le domaine httpd_t peut accéder en lecture aux fichiers avec le type httpd_sys_content_t

Contexte SELinux du répertoire /var/www
# ls -lZ /var/www/
drwxr-xr-x. root root system_u:object_r:httpd_sys_script_exec_t:s0 cgi-bin
drwxr-xr-x. root root system_u:object_r:httpd_sys_content_t:s0 html
Contexte de sécurité du processus httpd
# ps -axZ | grep httpd
system_u:system_r:httpd_t:s0     8550 ?        Ss     0:00 /usr/sbin/httpd -DFOREGROUND
system_u:system_r:httpd_t:s0     8554 ?        S      0:00 /usr/sbin/httpd -DFOREGROUND
system_u:system_r:httpd_t:s0     8555 ?        S      0:00 /usr/sbin/httpd -DFOREGROUND
system_u:system_r:httpd_t:s0     8556 ?        S      0:00 /usr/sbin/httpd -DFOREGROUND
system_u:system_r:httpd_t:s0     8557 ?        S      0:00 /usr/sbin/httpd -DFOREGROUND
system_u:system_r:httpd_t:s0     8558 ?        S      0:00 /usr/sbin/httpd -DFOREGROUND

Connaitre le contexte que le fichier ou le répertoire devrait avoir:
# matchpathcon /var/www/html
/var/www/html system_u:object_r:httpd_sys_content_t:s0
Liste des contextes:
# semanage fcontext -l | grep snmpd_var_lib
/var/agentx(/.*)?                                  all files          system_u:object_r:snmpd_var_lib_t:s0 
/var/net-snmp(/.*)                                 all files          system_u:object_r:snmpd_var_lib_t:s0 
/var/lib/snmp(/.*)?                                all files          system_u:object_r:snmpd_var_lib_t:s0 
/var/net-snmp(/.*)?                                all files          system_u:object_r:snmpd_var_lib_t:s0 
/var/lib/net-snmp(/.*)?                            all files          system_u:object_r:snmpd_var_lib_t:s0 
/var/spool/snmptt(/.*)?                            all files          system_u:object_r:snmpd_var_lib_t:s0 
/usr/share/snmp/mibs/\.index                       regular file       system_u:object_r:snmpd_var_lib_t:s0 

 Activer SELinux:

Il est préférable de configurer le mode permissive avant d'activer le mode enforcing afin d'être sur de ne pas avoir de  message denied.

Vérifier qu'il n'existe aucune erreur d'accès SELinux:

# grep "SELinux is preventing" /var/log/messages
Si aucun message SElinux est affiché, alors on peut activer SELinux:

On positionne la commande  SELINUX=enforcing dans /etc/selinux/config
# # This file controls the state of SELinux on the system.
# SELINUX= can take one of these three values:
#       enforcing - SELinux security policy is enforced.
#       permissive - SELinux prints warnings instead of enforcing.
#       disabled - No SELinux policy is loaded.
SELINUX=enforcing
# SELINUXTYPE= can take one of these two values:
#       targeted - Targeted processes are protected,
#       mls - Multi Level Security protection.
SELINUXTYPE=targeted

Résumé des commandes SELINUX

  • Consultation :
    • sestatus : afficher le status actuel de SELinux ;
    • getenforce : obtenir le mode SELinux courant de votre machine ;
    • ls -Z : afficher la liste des fichiers et dossiers ainsi que leur contexte SELinux avec la commande ls (pour plus d'options, consultez le man ls) ;
    • ps -Z : afficher la liste des processus ainsi que leur contexte SELinux avec la commande ps (pour plus d'options, consultez le man pas) ;
    • sesearch : effectuer une recherche dans la politique actuellement configurée pour votre machine ;
    • getsebool : obtenir des informations sur les booléens ;
    • matchpathcon : afficher le contexte que devrait posséder un fichier.
  • Modification :
    • setenforce : modifier le mode SELinux de votre machine ;
    • setsebool : modifier la valeur d'un booléen ;
    • restorecon : restaurer un contexte en fonction de la politique courante ;
    • chcon : modifier le contexte SELinux d'un fichier ;
    • semanage : gérer les politiques SELinux.