Les fichiers d'initialisation utilisateur doivent appartenir à l'utilisateur primaire
Garantit que les fichiers cachés (par ex. .bashrc, .profile) à la racine du home de chaque utilisateur interactif appartiennent à cet utilisateur.
Vérifié sur les métadonnées d’un chemin, mode, propriétaire, groupe, SUID/SGID.
Un mapping est une référence croisée vers l’endroit où chaque norme situe cette exigence, ancrée et recoupée, pas une affirmation d’équivalence. Un check réussi est une preuve vers ces références, comment le lire.
Pourquoi cette règle
Les fichiers d'initialisation locaux configurent l'environnement shell à la connexion. Si un fichier caché appartient à un autre utilisateur, celui-ci peut le réécrire et faire exécuter du code arbitraire dans la session de la victime au prochain logon. Une appartenance étrangère de ces fichiers est aussi un signe classique de compromission.
Ce que vérifie Pavois
Pavois déduit l'UID et le home de chaque utilisateur interactif depuis le /etc/passwd réel, puis exécute find -maxdepth 1 -type f -name '.[^.]*' ! -uid "$u" sur le home existant. En comparant à l'UID effectif du propriétaire du compte, il détecte tout fichier caché appartenant à autrui, exactement ce qu'un attaquant déposerait, sans se fier à une hypothèse de paquet ou de squelette.
describe command('awk -F: \'($3>=1000 && $3!=65534 && $6!="/"){print $3":"$4":"$6}\' /etc/passwd | while IFS=: read u g h; do [ -d "$h" ] && timeout 60 find -P "$h" -maxdepth 1 -type f -name \'.[^.]*\' ! -uid "$u" -print 2>/dev/null; done | head -1') do
its('exit_status') { should_not cmp 124 } # timeout killed the scan: no evidence, not a pass
its('stdout.strip') { should eq '' }
endComment vérifier qu’elle est appliquée
Pour un utilisateur, exécutez find ~user -maxdepth 1 -type f -name '.[^.]*' ! -uid $(id -u user) -printf '%p %u\n'. Attendu : aucune sortie (chaque fichier caché appartient à l'utilisateur).
Inspecter et investiguer
L'appartenance est inspectée directement, non journalisée. Auditez avec ls -la ~user | grep '^\.' ou stat -c '%U %n' ~user/.*. Avec l'audit d'intégrité des fichiers activé, les opérations chown sur ces chemins apparaissent dans /var/log/audit/audit.log sous la clé de surveillance concernée.
Remédiation
Aucune remédiation automatique n'est fournie (remediation est vide) : appliquez manuellement. Pour chaque utilisateur signalé, reprenez la propriété de ses fichiers cachés de premier niveau, par ex. find ~user -maxdepth 1 -type f -name '.[^.]*' ! -uid $(id -u user) -exec chown $(id -un user) {} +. Cherchez pourquoi un UID étranger les possédait, cela peut révéler une compromission plutôt qu'une simple erreur.
Pavois applique ceci avec son propre moteur harden, le plan ci-dessous, pas un script shell :
| command | # Dot-files in a home must be owned by that user. List offenders, then chown deliberately. for d in $(awk -F: '($3>=1000){print $6}' /etc/passwd); do find "$d" -maxdepth 1 -name '.*' ! -user "$(stat -c %U "$d")" 2>/dev/null; done |
|---|---|
| reason | fixing dot-file ownership is per-user, verify before chowning a user's files |
| resource | manual |
pavois harden plan localoù la cible est local, un alias SSH user@hôte, ou un conteneur , Docs
Impact & précautions
Des fichiers d'initialisation appartenant à autrui permettent un détournement de session au logon et peuvent masquer une intrusion. Précautions avant application : avant d'exécuter chown, relevez le propriétaire actuel (stat -c '%U %n') pour l'investigation, et confirmez que le home appartient bien au compte listé, une collision d'UID après migration peut faire passer des fichiers légitimes pour étrangers. Évitez de récurser au-delà du premier niveau pour limiter l'impact.
Mapping des normes
| Norme | Référence | Type | Version | Confiance |
|---|---|---|---|---|
| ANSSI BP-028 | R50 | direct | 2.0 | haute |
| CIS | 7.2.10, 7.2.9 | direct | per OS, see the benchmark table | haute |
Chaque référence est une référence croisée ancrée dans le benchmark amont et recoupée avec le SCAP Security Guide et ansible-lockdown, pas une affirmation d’équivalence. Direct = une exigence prescriptive au niveau de la ligne ; support = une famille de contrôle abstraite (NIST) vers laquelle le check apporte une preuve. Comment lire un mapping.