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\.*::/0r:\.*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 | ✔ | ✔ |
| ... | ... | ... | ... |