自定义PAM模块和安全注意事项


8

我正在编写自己的PAM模块,该模块将成为我正在开发的应用程序的一部分,但是我不确定确切的位置。我的模块基本上执行类似于LDAP的网络级身份验证(当然还有其他mojo)。

我的/etc/pam.d/目录中有很多配置文件,我知道大多数服务都可以做什么(除了一对,例如atd,polkit,ppp)。我假设使用PAM堆栈进行身份验证的过程如下:

  1. 根据服务名称运行堆栈(如果存在配置文件)
  2. 如果未通过身份验证,则退回到common- *,其中*是模块类型(身份验证,帐户等)
  3. 返回成功或失败调用应用程序(当然还有其他任何数据)

我对这个假设是否正确? 所有平台都具有通用身份验证,通用帐户,通用密码和通用会话吗?

如果是这样,我正在考虑将其作为sufficient模块放在common- *的顶部,这样在发生故障时,常规PAM堆栈将不受影响。这是特别有利的,因为我可以在软件安装时以编程方式执行此操作。

我是否缺少任何潜在的安全漏洞?

我找不到关于在哪里集成自定义PAM模块或围绕放置模块的安全问题的很好的文档。


2
PAM的全部目的是使实际的身份验证过程与应用程序脱钩,以便让系统管理员分别配置它们。如果您的应用程序依赖于身份验证模块,则可能表明您正在滥用PAM。
Riccardo Murri

好吧,我的应用程序是一个守护程序,如果登录的用户是网络用户,则该守护程序会将用户的帐户与网络同步。我认为,只要我不允许守护程序与PAM模块之间进行通信,就可以了。
beatgammit

Answers:


7

当您调用Linux-PAM进行某些身份验证过程时,总是只有一个且只有一个正在运行的堆栈。

在这些位置查找堆栈定义。第一次成功尝试将确定读取哪个文件:

  1. /etc/pam.d以应用程序“服务名称”命名的文件(例如sshdgdm),或

  2. 该文件(/etc/pam.d/other如果不存在特定于服务的文件),或者

  3. /etc/pam.conf如果目录/etc/pam.d不存在,则为文件。

有关详细信息,请参见函数pam_start的文档。

common- *文件是许多Linux发行版都遵循的约定,但PAM软件本身并不强制使用该文件。它们通常通过@include 语句包含在其他PAM文件中;例如/etc/pam.d/otherDebian上的文件具有以下内容:

# We fall back to the system default in /etc/pam.d/common-*
@include common-auth
@include common-account
@include common-password
@include common-session

@include特定于服务的文件也可以使用相同的语句,并且-实际上-它们是Debian上的默认配置。请注意,这是配置问题:sysadmin可以自由更改文件,/etc/pam.d根本不包含任何common- *文件!

因此:如果您的PAM模块特定于您的应用程序,请创建一个特定于应用程序的服务文件,然后从那里调用该模块。千万不能自动添加一个模块,其他服务PAM文件,也没有向回退others的文件,因为这可能会破坏系统上安装的其他应用程序。PAM软件堆栈的管理是系统管理员而非应用程序开发人员的任务。


这真的为我清除了东西。某些发行版是否将common *文件用作特定于服务的配置文件的备份?当我将模块放入common-auth时,即使在运行sudo时它也已运行。
beatgammit

@tjameson我用common- *文件的更多详细信息更新了答案
Riccardo Murri

好,谢谢!!现在我明白了。我以为我的发行版可能在其PAM版本或其他版本中内置了自定义的后备程序。感谢您清理此问题。
Beatgammit 2011年
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.