Разница между /etc/security/pam_env.conf и / etc / environment + заставляет sudo читать pam_env.conf

Мне трудно увидеть разницу между pam_env.conf и /etc/environment. Для меня они оба делают одно и то же, с разным синтаксисом. Справочные страницы не помогли. Так в чем же разница?

Кроме того, я хотел бы найти способ добавить пути к переменной среды PATH для всех пользователей. Добавление их в два вышеупомянутых файла работает для всех пользователей, но не работает с sudo, что можно проверить с помощью команды sudo sh -c 'echo $PATH'.

Чтобы решить эту проблему, я считаю, что мне нужно отредактировать файл /etc/pam.d/sudo, но что мне туда добавить?

2
задан 4 January 2013 в 17:29

2 ответа

Существует 2 принципиальных различия между /etc/security/pam_env.conf и /etc/environment.

  1. Порядок, в котором PAM обрабатывает их.

    /etc/environment анализируется сначала, но что-либо определенное здесь переопределяется определениями для тех тех же переменных, если они также существуют в pam_env.conf. Однако возможно включить в категорию +, расширяют переменные от /etc/environment в /etc/security/pam_env.conf, например:

    /etc/security/pam_env.conf
    
    PATH   DEFAULT=${PATH}:/usr/sbin
    
  2. Переменное расширение

    a. /etc/environment не сценарий, но ряд выражений присваивания, т.е. ${PATH} не расширяется, но используется буквально.

    b. /etc/security/pam_env.conf другое животное в целом. Это не сценарий по сути; это - все еще просто ряд присвоений KEY=VALUE, но PAM может развернуть существующие переменные (исключая: ${PATH}, ${DISPLAY}) и другой PAM_ITEMs (исключая: @{PAM_SERVICE}, @{PAM_USER}, и т.д.). Обратите особое внимание на $ по сравнению с @ здесь.

    PAM также обрабатывает специальные переменные @{HOME} и @{SHELL}, которые расширяются до того, что определяется в /etc/passwd. *Примечание: в большинстве приложений PAM, традиционных переменных ${HOME} и ${SHELL} (сравните @ по сравнению с $) не доступны это рано в потоке PAM.

    Используя пример, данный в комментариях /etc/security/pam_env.conf, это поведение замены/расширения может использоваться для изменения DISPLAY переменная для сессий удаленного входа в систему.

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

К определенной проблеме Вы описали здесь, значения, в которых Вы настроили /etc/environment не были доступны в sudo временная среда, потому что session средство, данное определением приложения PAM для /etc/pam.d/sudo никогда вызовы pam_env.so для сессий.

В /etc/pam.d/sudo, сессии только импортируют правила из /etc/pam.d/system-auth. После следа, в /etc/pam.d/system-auth, стопка сессии не имеет записи для pam_env.so.


Существует несколько способов настроить переменные, доступные в a sudo среда.

При необходимости в некотором пользовательском наборе переменных среды, которые только существуют на sudo-земле, это довольно просто.

  1. Создайте файл для содержания exclusive-to-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. Сделайте копию /etc/pam.d/system-auth, переименуйте его вроде /etc/pam.d/sudo-environment, и добавьте директиву к нижней части 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
    

    Если Вы хотите переменные передачи от non-sudo среды, включаете user_readenv=1 флаг

    session     optional    pam_env.so      conffile=/etc/security/sudo_custom_vars.conf    user_readenv=1
    
  3. В определении приложения PAM /etc/pam.d/sudo, сделайте замену:

    -   session    include       system-auth
    +   session    include       sudo-environment
    
  4. Откройте новый терминал для тестирования

    $ 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
    

Альтернатива лужению вокруг с модулями PAM должна отредактировать /etc/sudoers с # visudo, как Вы сделали. Я понимаю, что это - старый вопрос и way-back-when, комментируя Default env_reset был нужно.

Продвижение, принятая лучшая практика при использовании sudoers вытягивать в определениях переменной от среды означает добавить переменные к env_keep. (... то есть, если Вам не нужен уникальный набор переменных как показано выше),

    /etc/sudoers
    Defaults env_keep += "var1 var2, etc..."
2
ответ дан 4 January 2013 в 17:29

Мне удалось получить более или менее то, что я хотел для sudo:

Я отредактировал файл /etc/sudoerssudo visudo) и закомментировал строки Default env_reset и Default secure_path = .... ]

Теперь sudo будет использовать пользовательскую среду.

Разница между pam_env.conf и /etc/environment все еще не ясна для меня, поэтому вопрос еще не дан.

0
ответ дан 4 January 2013 в 17:29

Другие вопросы по тегам:

Похожие вопросы: