web-dev-qa-db-fra.com

Différence entre /etc/security/pam_env.conf et / etc / environment + incitant Sudo à lire pam_env.conf

J'ai du mal à voir la différence entre pam_env.conf et /etc/environment. Pour moi, ils font tous les deux la même chose, avec une syntaxe différente. Les pages de manuel n'étaient d'aucune aide. Alors, quelle est la difference?

De plus, j'aimerais trouver un moyen d'ajouter des chemins d'accès à la variable d'environnement PATH pour tous les utilisateurs. Les ajouter aux deux fichiers susmentionnés fonctionne pour tous les utilisateurs, mais ne fonctionne pas avec Sudo, comme cela peut être vérifié en exécutant Sudo sh -c 'echo $PATH'.

Pour résoudre ce problème, je pense que je devrais modifier le fichier /etc/pam.d/Sudo, mais que dois-je y mettre?

2
Norswap

Il existe 2 différences fondamentales entre /etc/security/pam_env.conf et /etc/environment.

  1. L'ordre dans lequel PAM les traite.

    /etc/environment est analysé en premier, mais tout ce qui est défini ici est remplacé par les définitions de ces mêmes variables si elles existent également dans pam_env.conf. Cependant, il est possible de subsumer + étendre les variables à partir de /etc/environment dans /etc/security/pam_env.conf, par exemple.:

    /etc/security/pam_env.conf
    
    PATH   DEFAULT=${PATH}:/usr/sbin
    
  2. Expansion variable

    une. /etc/environment n'est pas un script, mais un ensemble d'expressions d'affectation, c'est-à-dire ${PATH} n'est pas développé, mais utilisé littéralement.

    b. /etc/security/pam_env.conf est un animal tout à fait différent. Ce n'est pas un script en soi; il s'agit toujours d'un ensemble d'affectations KEY = VALUE, mais PAM peut étendre les variables existantes (ex: ${PATH}, ${DISPLAY}) et d'autres PAM_ITEM (ex: @{PAM_SERVICE}, @{PAM_USER}, etc.). Prenez particulièrement note de $ contre @ ici.

    PAM gère également les variables spéciales @{HOME} et @{Shell}, qui s'étend à tout ce qui est défini dans /etc/passwd. * Remarque: dans la plupart des applications PAM, les variables traditionnelles ${HOME} et ${Shell} (comparer @ contre $) ne sont pas disponibles si tôt dans le flux de PAM.

    En utilisant l'exemple donné dans les commentaires de /etc/security/pam_env.conf, ce comportement de remplacement/expansion peut être utilisé pour modifier la variable DISPLAY pour les sessions de connexion à distance.

    /etc/security/pam_env.conf
    REMOTE_Host     DEFAULT=localhost           OVERRIDE=@{PAM_RHOST}
    DISPLAY         DEFAULT=${REMOTE_Host}:0.0  OVERRIDE=${DISPLAY}
    

Pour le problème spécifique que vous avez décrit ici, les valeurs que vous avez configurées dans /etc/environment n'étaient pas disponibles dans l'environnement temporaire Sudo car la fonction session fournie par la définition d'application PAM pour /etc/pam.d/Sudo n'appelle jamais pam_env.so pour les sessions.

Dans /etc/pam.d/Sudo, les sessions importent uniquement les règles de /etc/pam.d/system-auth. En suivant la piste, en /etc/pam.d/system-auth, la pile de sessions n'a pas d'entrée pour pam_env.so.


Il existe plusieurs façons de personnaliser les variables disponibles dans un environnement Sudo.

Si vous avez besoin d'un ensemble personnalisé de variables d'environnement qui n'existent que dans Sudo-land, c'est assez simple.

  1. Créez un fichier pour contenir vos variables d'environnement exclusives à Sudo.

    /etc/security/Sudo_custom_vars.conf
    GREET   DEFAULT="hello from Sudo land"
    VAR1    DEFAULT="${GREET}"
    _VAR2   DEFAULT="VAR2 not passed to Sudo, ...but"
    VAR2    DEFAULT="${_VAR2} ${GREET}"                 OVERRIDE=${VAR2}
    VAR3    DEFAULT="Nope. Unknown users cannot Sudo."  OVERRIDE=@{PAM_RUSER}
    ...
    
  2. Faites une copie de /etc/pam.d/system-auth, renommez-le sur le modèle de /etc/pam.d/Sudo-environment, et ajoutez une directive au bas de la pile session:

    session     required    pam_unix.so
    session     optional    pam_permit.so
    # Add a line for using pam_env.so
    session     optional    pam_env.so conffile=/etc/security/Sudo_custom_vars.conf
    

    Si vous souhaitez transmettre des variables de l'environnement non Sudo, incluez le user_readenv=1 drapea

    session     optional    pam_env.so      conffile=/etc/security/Sudo_custom_vars.conf    user_readenv=1
    
  3. Dans la définition d'application PAM /etc/pam.d/Sudo, faites le remplacement:

    -   session    include       system-auth
    +   session    include       Sudo-environment
    
  4. Ouvrez un nouveau terminal pour tester

    $ su <your username>                    # Testing PAM without logging out
    $ export VAR1=""
    $ export VAR2="hello from down here"    # Set var in non-Sudo environment
    
    $ echo $VAR1
    <nothing>
    $ Sudo sh -c 'echo $VAR1'               # Test Sudo's DEFAULT value
    hello from Sudo land
    
    $ echo $VAR2
    hello from down here
    $ Sudo sh -c 'echo $VAR2'               # VAR2 not passed to Sudo
    VAR2 not passed to Sudo, ...but hello from Sudo land
    $ Sudo -E su -c 'echo $VAR2'            # VAR2 (and everything else) passed to Sudo
    hello from down here
    $ Sudo env VAR2="inline override" su -c 'echo $VAR2'
    inline override
    
    $ Sudo sh -c 'echo $VAR3'               # Testing we can read a PAM_ITEM
    aaron
    

Une alternative au bricolage avec les modules PAM est d'éditer /etc/sudoers avec # visudo, comme vous l'avez fait. Je me rends compte que c'est une vieille question et un retour en arrière, commentant Default env_reset était la chose à faire.

À l'avenir, la meilleure pratique acceptée lors de l'utilisation de sudoers pour extraire des définitions de variables de l'environnement consiste à ajouter les variables à env_keep. (... c'est-à-dire, sauf si vous avez besoin d'un ensemble unique de variables comme indiqué ci-dessus)

    /etc/sudoers
    Defaults env_keep += "var1 var2, etc..."
2
AaronDanielson

J'ai réussi à obtenir plus ou moins ce que je voulais pour Sudo:

J'ai édité le /etc/sudoers fichier (avec Sudo visudo) et a commenté les lignes Default env_reset et Default secure_path = ....

Maintenant, Sudo utilisera l'environnement de l'utilisateur.

La différence entre pam_env.conf et /etc/environmentmais ce n'est pas clair pour moi, donc la question n'a pas encore de réponse.

2
Norswap