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?
Il existe 2 différences fondamentales entre /etc/security/pam_env.conf
et /etc/environment
.
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
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.
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}
...
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
Dans la définition d'application PAM /etc/pam.d/Sudo
, faites le remplacement:
- session include system-auth
+ session include Sudo-environment
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..."
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/environment
mais ce n'est pas clair pour moi, donc la question n'a pas encore de réponse.