feat: give higher priority to pam_sss module

With default priority (128), pam-auth-update put module pam_sss after
module pam_unix in /etc/pam.d/common-auth, and then a user with a
local account and local password synchronized with AD password will
never be granted a Kerberos TGT on session opening.
This commit is contained in:
Michel Decima
2021-10-20 00:09:54 -07:00
parent af60473e89
commit ccb17c7352
5 changed files with 110 additions and 22 deletions

54
Notes_pam.md Normal file
View File

@@ -0,0 +1,54 @@
D'apres [PAMConfigFrameworkSpec], `pam_sss` devrait avoir une priorité
>= 512, puisqu'il s'agit d'un profil qui "authenticates against a central
network service, with rules to exclude administrative/system accounts". Or sa
priorité définie dans `/usr/share/pam-configs/sss` est 128 ... pourquoi ?
=> chercher dans le bugtracker ?
On dirait vraiment que `pam_sss` est conçu et configuré pour des
utilisateurs qui sont enregistrés dans un LDAP et pas en local (dans ce
cas ça marche direct). Moi je veux bien, c'est parfait pour un poste
fixe qui est toujours connecté au réseau, mais que se passe-t'il avec
un laptop déconnecté, si on n'a pas de mot de passe local ?
On pourrait envisager de désactiver le profil `pam_unix`, comme cela il
ne reste que `pam_sss` et le problème disparait, mais je soupçonne qu'il
va y avoir des effets de bord ;-)
Pour passer `pam_sss` en premier, il faut augmenter sa priorité. On peut
faire cela en modifiant le fichier `/usr/share/pam-configs/sss` à la
volée depuis le `postinst` avec `sed`, mais c'est très moche, et cela ne
résiste pas à une mise à jour du paquet `libpam-sss`, il faudrait mettre
en place un `trigger` ou mieux encore un `divert` ... ça reste du bricolage.
Autre solution, plus propre:
- ajouter un fichier `/usr/share/pam-configs/sss-yourdev`, copie de `sss`
- modifier sa propriété `Name` et augmenter la valeur de `Priority`
- rajouter une propriété `Conflicts: sss`
- dans le `postinst`, activer `sss-yourdev` et désactiver `sss`
Important: ne pas utiliser --force dans les scripts, seulement --package
Important: bien verifier uid >= 1000 et users interdits.
Note: les deux profils `sss` et `sss-yourdev` sont en conflit, mais leur
propriété `Default` vaut `yes`, ce qui a une conséquence particulière
: quand on lance `pam-auth-update` une première fois en mode interactif,
sans avoir exécuté la configuration automatique via le `postinst`, alors
les deux profils sont sélectionnés dans le dialogue `debconf`. Si on
valide à ce moment, le dialogue se plaint qu'il y a conflit, et refuse de
valider la sélection. Il faut modifier et choisir l'un ou l'autre. Ensuite,
le dialogue se souvient du choix qui a été fait.
Références
----------
- [pam.conf(5)]
- [pam-auth-update(8)]
- [PAMConfigFrameworkSpec]
[PAMConfigFrameworkSpec]: https://wiki.ubuntu.com/PAMConfigFrameworkSpec
[pam.conf(5)]: https://manpages.debian.org/bullseye/libpam-runtime/pam.conf.5.en.html
[pam-auth-update(8)]: https://manpages.debian.org/bullseye/libpam-runtime/pam-auth-update.8.en.html

30
debian/postinst vendored
View File

@@ -3,7 +3,7 @@ set -e
case "$1" in case "$1" in
configure) configure)
# enable GDM customization # Enable GDM customization
if command -v /usr/bin/dconf >/dev/null ; then if command -v /usr/bin/dconf >/dev/null ; then
dconf update dconf update
fi fi
@@ -18,7 +18,7 @@ case "$1" in
cat /usr/share/ca-certificates/orange/*.crt \ cat /usr/share/ca-certificates/orange/*.crt \
> /etc/sssd/pki/sssd_auth_ca_db.pem > /etc/sssd/pki/sssd_auth_ca_db.pem
# configure pam-pkcs11 # Configure pam-pkcs11
if [ -d /etc/pam_pkcs11 ] ; then if [ -d /etc/pam_pkcs11 ] ; then
# add Orange certificates # add Orange certificates
mkdir -p /etc/pam_pkcs11/cacerts mkdir -p /etc/pam_pkcs11/cacerts
@@ -31,28 +31,14 @@ case "$1" in
# a config file in dir /usr/share/pam-configs. # a config file in dir /usr/share/pam-configs.
fi fi
# Configure PAM for credential cache # Configure PAM
apt-mark manual libpam-ccreds >/dev/null || true pam-auth-update --package \
if [ -e /usr/share/pam-configs/ccreds-check ] ; then --remove sss krb5 \
pam-auth-update --package --enable ccreds-check ccreds-save || true --enable yourdev ccreds-check ccreds-save || true
fi
# Configure PAM for Kerberos # Fix sssd configuration permissions
if [ -e /usr/share/pam-configs/sss ] ; then
# Use pam-sss if present and disable pam-krb5
echo "Using pam-sss ..."
pam-auth-update --package --enable sss || true
pam-auth-update --package --remove krb5 || true
elif [ -e /usr/share/pam-configs/krb5 ] ; then
echo "Using pam-krb5 ..."
pam-auth-update --package --enable krb5 || true
else
echo "Warning: no PAM config for Kerberos found!"
fi
# fix sssd configuration permissions
chmod 600 /etc/sssd/sssd.conf || true chmod 600 /etc/sssd/sssd.conf || true
# restart services # Restart services
deb-systemd-invoke restart sssd.service || true deb-systemd-invoke restart sssd.service || true
;; ;;

1
debian/postrm vendored
View File

@@ -8,6 +8,7 @@ case "$1" in
dconf update dconf update
fi fi
;; ;;
remove|upgrade|failed-upgrade|abort-install|abort-upgrade|disappear) remove|upgrade|failed-upgrade|abort-install|abort-upgrade|disappear)
;; ;;

24
debian/prerm vendored Normal file
View File

@@ -0,0 +1,24 @@
#!/bin/sh
set -e
case "$1" in
remove)
pam-auth-update --package --remove yourdev || true
;;
upgrade|deconfigure)
;;
failed-upgrade)
;;
*)
echo "prerm called with unknown argument \`$1'" >&2
exit 1
;;
esac
#DEBHELPER#
exit 0

View File

@@ -0,0 +1,23 @@
Name: Yourdev authentication (SSSD)
Default: no
Priority: 512
Conflicts: sss
Auth-Type: Primary
Auth:
[success=end default=ignore] pam_sss.so use_first_pass
Auth-Initial:
[success=end default=ignore] pam_sss.so forward_pass
Account-Type: Additional
Account:
sufficient pam_localuser.so
[default=bad success=ok user_unknown=ignore] pam_sss.so
Session-Type: Additional
Session-Interactive-Only: yes
Session:
optional pam_sss.so
Password-Type: Primary
Password:
sufficient pam_sss.so use_authtok
Password-Initial:
sufficient pam_sss.so