我正在编写自己的 PAM 模块,该模块将成为我正在开发的应用程序的一部分,但我不确定到底要把它放在哪里。我的模块基本上执行类似于 LDAP 的网络级身份验证(当然还有其他 mojo)。
我的目录中有很多配置文件/etc/pam.d/
,我知道大多数服务的用途(除了少数几个,例如 atd、polkit、ppp)。我假设 PAM 堆栈的身份验证是这样的:
- 根据服务名称运行堆栈(如果配置文件存在)
- 如果未经过身份验证,则使用 common-*,其中 * 是模块类型(身份验证、帐户等)
- 返回成功或失败调用应用程序(当然还有任何其他数据)
我的这个假设正确吗? 所有平台都有通用身份验证、通用帐户、通用密码和通用会话吗?
如果是这样,我正在考虑将其作为一个模块放在 common-* 的顶部,sufficient
以便在发生故障时常规 PAM 堆栈不会受到影响。这是特别有利的,因为我可以在软件安装时以编程方式执行此操作。
我是否遗漏了任何潜在的安全漏洞?
我找不到关于在哪里集成自定义 PAM 模块或围绕模块放置位置的安全问题的非常好的文档。
答案1
当您调用 Linux-PAM 进行某些身份验证过程时,始终会运行一个且只有一个堆栈。
在这些地方查找堆栈定义;第一次成功的尝试决定读取哪个文件:
/etc/pam.d
以应用程序“服务名称”命名的文件(例如sshd
或gdm
),或/etc/pam.d/other
如果不存在特定于服务的文件,则该文件,或者/etc/pam.conf
如果目录/etc/pam.d
不存在则文件。
功能见文档pam_start了解详情。
common-* 文件是许多 Linux 发行版遵循的约定,但 PAM 软件本身并不强制要求。它们通常以语句的方式包含在其他 PAM 文件中@include
;例如/etc/pam.d/other
Debian 上的文件具有以下内容:
# 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 上的配置。请注意,这是一个配置问题:系统管理员可以随意更改文件以/etc/pam.d
完全不包含任何 common-* 文件!
因此:如果您的 PAM 模块特定于您的应用程序,请创建一个特定于应用程序的服务文件并从那里调用该模块。做不是自动将模块添加到其他服务的 PAM 文件或后备others
文件中,因为这可能会破坏系统上安装的其他应用程序。 PAM 软件堆栈的管理是系统管理员的任务,而不是应用程序开发人员的任务。