Skip to content

Test des règles OSSEC "CIS Debian Linux 11 Benchmark v1.0.0"

Maintenant que j'ai un script capable de tester les règles OSSEC sous Debian, j'ai pris une VM en Debian 11 et je veux vérifier que chacune des règles affiche le résultat attendu.

Règles

J'ai pris les règles une à une pour vérifier, en faisant les commandes ou en regardant le contenu des fichiers testés que le résultat du script était bien le résultat auquel je m'attendais.

Plus bas, j'ai rempli un tableau avec (presque) toutes les règles et les résultats obtenus et attendus (qui sont les mêmes après correctif en principe) et, dans les paragraphes suivants, je détaille les règles qui ne donnaient pas le bon résultat et le correctif que j'y ai apporté.

Règle 25525 - stderr

La commande systemctl is-enabled autofs affichait le texte attendu sur sdterr donc il n'était pas capturé.

Corrigé en modifiant la ligne d'exécution d'une commande de cette façon :

$output = Invoke-Expression -Command "$command 2>&1"

Règle 29526 - ${...} interprété

Avec une commande dpkg-query -W -f='${binary:Package}\t${Status}\t${db:Status-Status}\n' aide, les ${...} étaient interprétés par Powershell et, donc, remplacé par des chaines vides. Du coup, le résultat de la commande n'était pas celui attendu.

Corrigé en remplaçant les " par des ' dans l'initialisation de la variable $rules :

    $rules = @'
__PUT_RULES_HERE__
'@

Les regex sont case insensitives

Attention en cherchant à contrôler une règle : les regex après r: sont case insensitive donc faire des recherches avec grep -i comme celle-ci :

root@test-rules-debian11:~# sshd -T | grep -i PermitUserEnvironment
permituserenvironment no

Règles OK alors que le répertoire n'existent pas

J'ai toute une séries de règles sur les audits qui sont vertes alors qu'elles ne le devraient pas sur le principe.

Comme celle-ci :

[Ensure audit configuration files belong to group root.] [all] []
not c:sh -c "stat -Lc \"%n %G\" /etc/audit/*.rules" -> r:^/etc/audit && !r:root;
not c:sh -c "stat -Lc \"%n %G\" /etc/audit/*.conf" -> r:^/etc/audit && !r:root;

Les commandes échouent :

root@test-rules-debian11:~# sh -c "stat -Lc \"%n %G\" /etc/audit/*.rules"
stat: cannot statx '/etc/audit/*.rules': No such file or directory
root@test-rules-debian11:~# sh -c "stat -Lc \"%n %G\" /etc/audit/*.conf"
stat: cannot statx '/etc/audit/*.conf': No such file or directory

Donc, avec les négations, la règle est verte.

Les règles concernées :

✔ Ensure audit configuration files are 640 or more restrictive.
  Plus d'information : https://dev.cywise-ui.myapps.addapps.io/home?tab=sca&policy=cis_debian11&check=29624
✔ Ensure audit configuration files are owned by root.
  Plus d'information : https://dev.cywise-ui.myapps.addapps.io/home?tab=sca&policy=cis_debian11&check=29625
✔ Ensure audit configuration files belong to group root.
  Plus d'information : https://dev.cywise-ui.myapps.addapps.io/home?tab=sca&policy=cis_debian11&check=29626
...
✔ Ensure audit tools are 755 or more restrictive.
  Plus d'information : https://dev.cywise-ui.myapps.addapps.io/home?tab=sca&policy=cis_debian11&check=29627
✔ Ensure audit tools are owned by root.
  Plus d'information : https://dev.cywise-ui.myapps.addapps.io/home?tab=sca&policy=cis_debian11&check=29628
✔ Ensure audit tools belong to group root.
  Plus d'information : https://dev.cywise-ui.myapps.addapps.io/home?tab=sca&policy=cis_debian11&check=29629

Double * dans les regex

Deux règles contiennent des regex avec **, par exemple :

  • r:\.*ACCEPT\.*all\.*lo\.**\.*::/0\.*::/0
  • r:\.*DROP\.*all\.**\.**\.*127.0.0.0/8\.*0.0.0.0/0

Les deux règles en question :

✘ Ensure ip6tables loopback traffic is configured.
  Plus d'information : https://dev.cywise-ui.myapps.addapps.io/home?tab=sca&policy=cis_debian11&check=29596
✘ Ensure iptables loopback traffic is configured.
  Plus d'information : https://dev.cywise-ui.myapps.addapps.io/home?tab=sca&policy=cis_debian11&check=29594

Dans la base de données (SELECT id, uid, requirements FROM ynh_ossec_checks WHERE requirements like '%**%' ORDER BY uid ASC), J'ai 20 règles au total, toutes policy confondues. La plupart ont les mêmes regex que ci-dessus pour tester des réglages iptables ou ip6tables. Probablement les mêmes règles mais pour d'autres OS ou versions d'OS. Sauf une : r:^\\s*\\t**.* @@\\.+ qui teste /etc/rsyslog.conf et où le fichier doit contenir *.*.

Donc, probablement, un oubli d'échappement de * quand on veut le trouver.

Je ne change rien de mon côté.

Par contre, une "mauvaise" regex provoque une exception comme celle-ci :

MethodInvocationException: /tmp/d5Zs6T5Z.ps1:311
Line |
 311 |      return [regex]::IsMatch($value, $pattern, [System.Text.RegularExp …
     |             ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
     | Exception calling "IsMatch" with "3" argument(s): "Invalid pattern
     | '\.*ACCEPT\.*all\.*lo\.**\.*0.0.0.0/0\.*0.0.0.0/0' at offset 24. Nested quantifier '*'."
MethodInvocationException: /tmp/d5Zs6T5Z.ps1:311
Line |
 311 |      return [regex]::IsMatch($value, $pattern, [System.Text.RegularExp …
     |             ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
     | Exception calling "IsMatch" with "3" argument(s): "Invalid pattern
     | '\.*ACCEPT\.*all\.*lo\.**\.*0.0.0.0/0\.*0.0.0.0/0' at offset 24. Nested quantifier '*'."
✘ Ensure iptables loopback traffic is configured.
  Plus d'information : https://dev.cywise-ui.myapps.addapps.io/home?tab=sca&policy=cis_debian11&check=29594

J'ai capturé les exceptions pour afficher un message à l'utilisateur.

Commande inconnue

Quand une règle tente d'exécuter une commande qui n'existe pas, non installée, cela provoque une exception comme celle-ci :

MethodInvocationException: /tmp/d5Zs6T5Z.ps1:267
Line |
 267 |          ($ctx['execute'].Invoke($_) | Where-Object { MatchExpression  …
     |          ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
     | Exception calling "Invoke" with "1" argument(s): "The term 'nft' is not recognized as a name of a
     | cmdlet, function, script file, or executable program. Check the spelling of the name, or if a path
     | was included, verify that the path is correct and try again."
✘ Ensure a nftables table exists.
  Plus d'information : https://dev.cywise-ui.myapps.addapps.io/home?tab=sca&policy=cis_debian11&check=29585

J'ai capturé les exceptions pour afficher un message à l'utilisateur.

Décompte des vérifications

Nous avons décidé de compter à part les tests qui provoquent une exception. J'ai ajouté un compteur "erreurs" pour ça que j'affiche en plus des tests échoués et des tests réussis. Et pour le score sur 100, je les compte avec les tests échoués i.e. note = 100 x (tests réussis / (tests réussis + tests échoués + tests en erreur)).

Tableau récapitulatif pour ma VM sous Debian 11

# Règle Résultat Attendu
25525 Disable Automounting
29696 Ensure /etc/shadow password fields are not empty
29500 Ensure /tmp is a separate partition
29526 Ensure AIDE is installed
29535 Ensure AppArmor is enabled in the bootloader configuration
29534 Ensure AppArmor is installed
29532 Ensure Automatic Error Reporting is not enabled
29556 Ensure Avahi Server is not installed
29557 Ensure CUPS is not installed
29558 Ensure DHCP Server is not installed
29561 Ensure DNS Server is not installed
29562 Ensure FTP Server is not installed
29544 Ensure GNOME Display Manager is removed
29566 Ensure HTTP Proxy Server is not installed
29563 Ensure HTTP server is not installed
29564 Ensure IMAP and POP3 server are not installed
29575 Ensure LDAP client is not installed
29559 Ensure LDAP server is not installed
29560 Ensure NFS is not installed
29571 Ensure NIS Client is not installed
29568 Ensure NIS Server is not installed
29576 Ensure RPC is not installed
29567 Ensure SNMP Server is not installed
29664 Ensure SSH AllowTcpForwarding is disabled
29656 Ensure SSH HostbasedAuthentication is disabled
29670 Ensure SSH Idle Timeout Interval is configured
29659 Ensure SSH IgnoreRhosts is enabled
29653 Ensure SSH LogLevel is appropriate
29669 Ensure SSH LoginGraceTime is set to one minute or less
29666 Ensure SSH MaxAuthTries is set to 4 or less
29668 Ensure SSH MaxSessions is set to 10 or less
29667 Ensure SSH MaxStartups is configured
29654 Ensure SSH PAM is enabled
29657 Ensure SSH PermitEmptyPasswords is disabled
29658 Ensure SSH PermitUserEnvironment is disabled
29660 Ensure SSH X11 forwarding is disabled
29652 Ensure SSH access is limited
29655 Ensure SSH root login is disabled
29665 Ensure SSH warning banner is configured
29565 Ensure Samba is not installed
29555 Ensure X Window System is not installed
29545 Ensure XDCMP is not enabled
29585 Ensure a nftables table exists
29677 Ensure access to the su command is restricted
29695 Ensure accounts in /etc/passwd use shadowed passwords
29605 Ensure actions as another user are always logged
29537 Ensure all AppArmor Profiles are enforcing
29536 Ensure all AppArmor Profiles are in enforce or complain mode
... ... ... ...