/etc/security/pam_env.conf和/ etc / environment之间的区别+使sudo读取pam_env.conf

我很难看到pam_env.conf/etc/environment之间的区别。 对我来说,他们都做同样的事情,语法不同。 这些联机帮助没有帮助。 那么区别是什么呢?

另外,我想找到一种方法为所有用户添加PATH环境变量的PATH 。 将它们添加到上述两个文件适用于所有用户,但不能与sudo一起使用,因为可以通过运行sudo sh -c 'echo $PATH'来validation。

为了解决这个问题,我相信我应该编辑文件/etc/pam.d/sudo ,但是我应该把它放在那里?

/etc/security/pam_env.conf/etc/environment之间存在两个根本区别。

  1. PAM处理它们的顺序。

    首先解析/etc/environment ,但是如果这些相同变量的定义也存在于pam_env.conf则此处定义的任何内容都会被覆盖。 但是,可以在/etc/security/pam_env.conf包含+扩展/etc/environment中的变量,例如:

     /etc/security/pam_env.conf PATH DEFAULT=${PATH}:/usr/sbin 
  2. 可变扩展

    一个。 /etc/environment不是一个脚本,但是一组赋值表达式,即${PATH}不会扩展,而是按字面意思使用。

    /etc/security/pam_env.conf是一个完全不同的动物。 它本身不是一个脚本; 它仍然只是一组KEY = VALUE赋值,但PAM可以扩展现有变量(例如: ${PATH}${DISPLAY} )和其他PAM_ITEM(例如: @{PAM_SERVICE}@{PAM_USER}等)。 请特别注意$ vs @ here。

    PAM还处理特殊变量@{HOME}@{SHELL} ,它们扩展为/etc/passwd定义的任何变量。 *注意:在大多数PAM应用程序中,传统变量${HOME}${SHELL} (比较@ vs $ )在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临时环境中不可用,因为/etc/pam.d/sudo的PAM应用程序定义给出的session工具从不调用pam_env.so对于会议。

/etc/pam.d/sudo ,会话仅从/etc/pam.d/sudo导入规则。 跟踪路径后,在/etc/pam.d/system-auth ,会话堆栈没有pam_env.so的条目。


有几种方法可以自定义sudo环境中可用的变量。

如果您需要一些仅存在于sudo-land中的自定义环境变量集,那么它非常简单。

  1. 创建一个文件以包含您的独家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 

    如果要从非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  # Testing PAM without logging out $ export VAR1="" $ export VAR2="hello from down here" # Set var in non-sudo environment $ echo $VAR1  $ 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模块修补的另一种方法是使用#visudo编辑/etc/sudoers ,就像你一样。 我意识到这是一个古老的问题和回归时,评论Default env_reset是要做的事情。

env_keep ,使用sudoers从环境中提取变量定义时接受的最佳实践是将变量附加到env_keep 。 (…也就是说,除非您需要一组唯一的变量,如上所示)

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

我设法得到了或多或少我想要的sudo:

我编辑了/etc/sudoers文件(使用sudo visudo )并注释掉了行Default env_resetDefault secure_path = ...

现在sudo将使用用户的环境。

pam_env.conf/etc/environment之间的区别对我来说仍然不明确,所以这个问题还没有回答。