jeudi 17 septembre 2020

Linux - split d'un fichier pour transfert sur FAT32

Utilisation de la commande Linux split:

$ split -b 4294967295 fichier.tar split_fichier
[serge@alien1
~]$ ll
-rw-r--r--. 1 serge serge 4358761620 16 sept. 16:30 fichier.tar
-rw-r--r--. 1 serge serge 4294967295 17 sept. 10:15 split_fichieraa
-rw-r--r--. 1 serge serge 63794325 17 sept. 10:15 split_fichierab

Restaurer:

[serge@alien1 ~]$ cat split_fichiera* > fichier.tar


La valeur 429496729 correspond à la taille max d'un fichier avec le système de fichier FAT32.

La valeur est obtenue de cette facon:

[serge@alien1 ~]$ echo "4*(2^30)-1" | bc
4294967295

mercredi 2 septembre 2020

Optimiser la taille d'une VM QEMU au format QCOW2

Dans mon cas, il s'agit d'une machine guest sous WINDOWS avec le système de fichiers en NTFS.

 

Pré-requis:

yum install ntfs-3g

yum install ntfsprogs

yum install libguestfs-tools 

yum install libguestfs-winsupport

 

export LIBGUESTFS_BACKEND=direct

virt-sparsify -v  os_original.qcow2 os_sparsi.qcow2

 

 

jeudi 13 août 2020

Compiler un fichier de règles SELinux ( fichier .te )

 Après avoir créé votre fichier te, il faut le compiler pour pouvoir l'installer sur votre système:

# checkmodule -M -m -o local.mod local.te 
checkmodule: loading policy configuration from local.te
checkmodule: policy configuration loaded
checkmodule: writing binary representation (version 19) to local.mod

Si vous avez l'erreur suivante:

' on line 1:e:1:WARNING 'unrecognized character' at token '

C'est que votre fichier comporte un caractère de fin de ligne non reconnu.

Pour convertir au format unix avec vi:

:set ff=unix

 Après quoi, votre fichier policy module est créé.

Reste à le compiler:

# semodule_package -o local.pp -m local.mod

 Charger le module créé avec une priorité à 300.

# semodule -X 300 -i local.pp

 

mardi 11 août 2020

SELinux - Transition de domaine

Dans cet article, nous allons aborder le concept de transition de domaine.

Une transition de domaine ne peut avoir lieu qu'avec les trois pré-requis suivants:

  1. Le domaine d’origine doit avoir l'autorisation d'exécution sur le fichier.
  2. Le contexte du fichier lui-même est identifié comme un point d'entrée pour le domaine cible
  3. Le domaine d'origine est autorisé à transiter au domaine cible.

Exemple avec la commande passwd

Un utilisateur souhaite changer son mot de passe. Il utilise la commande passwd

Regardons le contexte du fichier exécutable passwd:

[root@alien1 serge]# ls -Z /usr/bin/passwd 
-rwsr-xr-x. root root system_u:object_r:passwd_exec_t:s0 /usr/bin/passwd

Voyons les différents pré-requis cités plus haut pour donner à l'utilisateur la possibilité de faire une transition de domaine vers le fichier des mots de passe (/etc/shadow).

L'utilisateur doit pouvoir exécuter la commande passwd.

La règle suivante autorise user_t a exécuter un appel systeme execve() dans le domaine passwd_exec_t.

[root@alien1 serge]# sesearch -s user_t -t passwd_exec_t -Ad
Found 1 semantic av rules:
allow user_t passwd_exec_t : file { ioctl read getattr map execute execute_no_trans open } ;


La règle suivante autorise un point d'entrée au domaine passwd_t.

Ce point d'entrée (entrypoint) permet de définir quel fichier exécutable peut entrer dans le domaine.

[root@alien1 serge]# sesearch -s passwd_t -t passwd_exec_t -c file  -Ad
Found 1 semantic av rules:
allow passwd_t passwd_exec_t : file { ioctl read getattr lock map execute execute_no_trans entrypoint open } ;

 

Lorsque l'utilisateur lance la commande passwd, le process va transiter vers le domaine passwd_t.

La règle suivante autorise le type user_t à transiter vers le nouveau type passwd_t

[root@alien1 serge]# sesearch -s user_t -t passwd_t -Ad
Found 1 semantic av rules:
allow user_t passwd_t : process transition ;

On pourrait se demander si cela est bien utile car l'utilisateur devrait spécifiquement dire qu'il veut une transition de domaine. C'est là que les règles de transition de type sont utilisées.

 Pour créer une transition de domaine par défaut, la règle suivante est créée:

[root@alien1 serge]# sesearch -T -s user_t -t passwd_exec_t
Found 1 semantic te rules:
type_transition user_t passwd_exec_t : process passwd_t;


La règle type_transition indique que par défaut lors d'un appel système execve (), si le type de domaine du processus appelant est user_t et le type du fichier exécutable est passwd_exec_t, alors une transition de domaine vers un nouveau type de domaine (passwd_t) sera tentée.

Une règle type_transition provoque une tentative de transition de domaine par défaut, mais elle ne le permet pas, c'est pourquoi les 3 autres règles ont dû être créées.

Cet exemple a permis de montrer qu'un utilisateur peut changer son mot de passe dans le fichier /etc/shadow. Sans ces règles, cela n'aurait pas été possible, à part l'utilisateur root.

L'utilisateur ne peut accéder à ce fichier directement, il le fait à travers passwd.

Rappel du contexte SELinux du fichier shadow:

[root@alien1 serge]# ls -Z /etc/shadow
----------. root root system_u:object_r:shadow_t:s0 /etc/shadow


Une règle permet à un process avec le type passwd_t de lire et d'écrire dans les fichiers labelisés avec le type shadow_t:

[root@alien1 serge]# sesearch -s passwd_t -t shadow_t -c file -p read -Ad
Found 1 semantic av rules:
allow passwd_t shadow_t : file { ioctl read write create getattr setattr lock relabelfrom relabelto append map unlink link rename open } ;

 

mercredi 27 mai 2020

The audit system is in immutable mode, no rule changes allowed

Modification des règles auditd - redhat / centos

Si vous voulez modifier les règles d'audit, vous pouvez avoir le message d'erreur suivant:

[root@alien1 ~]# auditctl -a exit,always -F arch=b64 -F euid=0 -S execve -k rootcmd
The audit system is in immutable mode, no rule changes allowed
Aller dans /etc/audit/rules.d
Modifier le fichier "immutable.rules"

[root@alien1 rules.d]# cat immutable.rules 

# Set the audit.rules configuration immutable per security requirements
# Reboot is required to change audit rules once this setting is applied
-e 1
-e 1 #autoriser la modification des règles d'audit.
-e 2 #les règles ne sont pas modifiables

https://connect.ed-diamond.com/GNU-Linux-Magazine/GLMFHS-093/Journalisez-les-actions-de-vos-utilisateurs-avec-Auditd

lundi 9 mars 2020

Ajouter une autorité de certificat dans CENTOS 7

Copier vos certificats à cet endroit:

/etc/pki/ca-trust/source/anchors/
Mettez à jour le magasin de clés en lançant la commande suivante:
update-ca-trust
Nota: les certificats sont copiés à cet emplacement :
/etc/pki/tls/certs/ca-bundle.crt

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.