PAMPersonalServer

Je vais détailler dans cet article un moyen de mettre en place un système d'ACL pour un petit serveur personnel. L'idée est de pouvoir centraliser un maximum l'authentification, et ce en utilisant le plus les mécanismes fournis par Linux, et plus particulièrement PAM.

De mon cahier des charges:

  • Je veux pouvoir proposer plusieurs services tels que ssh, openvpn, mail, ftp, samba, apache ... et globalement tout ce qui supporte l'authentification par PAM
  • Je veux pouvoir gérer des politiques par défaut, ainsi que pouvoir définir finement qui à le droit de faire quoi.
  • Je veux éviter un maximum la redondance de donnée: utiliser un mot de passe unique, utiliser la gestion des groupes unix (/etc/groups), et éviter la gestion de tout ça par des fichiers supplémentaires (pas de pam_accesslist donc)
  • Je veux pouvoir faire une selection au niveau des groupes au niveau de mon applicatif. Typiquement, on peut vérifier l'appartenance d'un utilisateur à un groupe pour l'authentiifcation Apache, au délà même de l'idenditification.
  • Je veux quelque chose d'élégant et qui s'approche de la philosophie UNIX

La solution technique choisie:

  • Ajout du module pam_access pour les services que je veux controller
  • Définition d'un fichier access-<service>.conf par service. Il n'y a pas vraiment d'autres moyen de faire, c'est dommage.
  • Chaque configuration access va aller vérifier selon ses règles si l'utilisateur appartient bien au group authorisé pour utiliser ce service.

Mise en place des ACLs

Groupes

Création des groupes (/etc/groups):
pam_deny:x:5000: coco
pam_sshd:x:5001:jez
pam_samba:x:5002:jez,coco,chacha
pam_vpn:x:5003:jez
pam_sftp:x:5003:
pam_http_home:5010:jez,coco
pam_http_extra:5011:
pam_http_admin:5012:jez

J'identifie ici mes groupes de services, en suivant la convention que je me suis imposée: pam_<service>_<groupe>:

  1. pam: préfixe mot clé, juste pour dire que ces groupes seront utilisés par PAM. Ca évite de foutre le bordel partout.
  2. <service>: c'est le service qui utilisera ce groupe
  3. <groupe>: quand le service peut vérifier à quel groupe appartient l'utilisateur. ce n'st pas à proprement utiliser par PAM, mais plutot par le service qui demande l'authentification.

J'ai aussi crée un groupe 'pam_deny' qui permet de bloquer l'accès à tous les services à un utilisateur. Au cas où il aurait pas payé son hébergement :-°.

Configuration PAM: services

Au niveau de la conf PAM, il va falloire intervenir sur chaqu'un des services dont on veut gérer l'accès. Typqiement, on va utiliser les règles account, car selon le manuel:

account:
This module type performs non-authentication based account management. It is typically used to restrict/permit access to a service based on the time of day, currently available system resources (maximum number of users) or perhaps the location of the applicant user -- 'root' login only on the console.

Configuration PAM: ACL par services

On va donc placer la conf spécifique pour chacun de nos services /etc/pam.d/sshd, globalement, on placera toujours cette directive en haut de la pile de traitement, car on veut qu'elle soit traitée en premier. Si notre module n'est pas satisfait, ça sert à rien de continuer à traiter les autres modules:
account required        pam_access.so   accessfile=/etc/security/access-sshd.conf 
# OU
account required        pam_access.so   accessfile=/etc/security/access-sshd.conf debug
Concernant le fichier /etc/security/access-sshd.conf debug:
# SSH rules
-: (pam_deny) : ALL
+: root (pam_sshd) : ALL
-: ALL : ALL

L'ordre des directives importe, car c'est la première qui match qui est retournée. Pour expliquer ça:

  1. Si l'utilisateur appartient au groupe pam_deny, il est refusé
  2. Si l'utilisateur est root ou s'il appartient au groupe pam_sshd, il est accepté
  3. Dans tous les autres cas, il est refusé
Page last modified on November 30, 2013, at 08:17 PM EST