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

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

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

我的目录中有很多配置文件/etc/pam.d/,我知道大多数服务的用途(除了少数几个,例如 atd、polkit、ppp)。我假设 PAM 堆栈的身份验证是这样的:

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

我的这个假设正确吗? 所有平台都有通用身份验证、通用帐户、通用密码和通用会话吗?

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

我是否遗漏了任何潜在的安全漏洞?

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

答案1

当您调用 Linux-PAM 进行某些身份验证过程时,始终会运行一个且只有一个堆栈。

在这些地方查找堆栈定义;第一次成功的尝试决定读取哪个文件:

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

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

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

功能见文档pam_start了解详情。

common-* 文件是许多 Linux 发行版遵循的约定,但 PAM 软件本身并不强制要求。它们通常以语句的方式包含在其他 PAM 文件中@include ;例如/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 上的配置。请注意,这是一个配置问题:系统管理员可以随意更改文件以/etc/pam.d完全不包含任何 common-* 文件!

因此:如果您的 PAM 模块特定于您的应用程序,请创建一个特定于应用程序的服务文件并从那里调用该模块。做不是自动将模块添加到其他服务的 PAM 文件或后备others文件中,因为这可能会破坏系统上安装的其他应用程序。 PAM 软件堆栈的管理是系统管理员的任务,而不是应用程序开发人员的任务。

相关内容