• 首页
  • 关于
    • 北境程序猿 photo

      北境程序猿

    • 详细
    • Email
    • Twitter
    • Facebook
    • Google+
    • LinkedIn
    • Instagram
    • Github
    • StackOverflow
    • Steam
    • SoundCloud
    • Weibo
    • Hacker News
  • 文章
    • 所有文章
    • 所有标签

Linux-PAM的简单指南

26 Nov 2019

Reading time ~3 minutes


使用Linux-PAM,系统管理员可以使用相同的用户数据库登录到所有服务,而不会减慢速度。


PAM(可插拔的身份验证模块)是位于Linux应用程序和Linux本地身份验证系统之间的管理层。

您的系统中有许多使用PAM模块的程序,比如SU、密码、SSH、登录和其他服务。我们将讨论其中的一些。

PAM可以为您做很多事情,但是主要的重点是对用户进行身份验证。

Linux中的身份验证是通过比较/etc/shadow文件中的加密密码来完成的,但是每个需要身份验证的程序都实现自己的身份验证机制。

我们有很多需要身份验证服务在我们的系统,如SSH、FTP、TELNET、IMAP,和许多其他服务,所以我们会有很多的认证文件除了/etc/shadow维护——它可能是一个严重的问题,如果这些认证文件之间有任何不一致的数据。

PAM来了!使用Linux-PAM,如果系统管理员愿意,他可以使用相同的用户数据库登录到所有服务。

您可以检查程序是否使用Linux-PAM。

$ ldd /bin/su
        linux-vdso.so.1 =>  (0x00007ffc50bd3000)
        libpam.so.0 => /lib64/libpam.so.0 (0x00007f2a111f6000)
        libpam_misc.so.0 => /lib64/libpam_misc.so.0 (0x00007f2a10ff2000)
        libc.so.6 => /lib64/libc.so.6 (0x00007f2a10c24000)
        libaudit.so.1 => /lib64/libaudit.so.1 (0x00007f2a109fb000)
        libdl.so.2 => /lib64/libdl.so.2 (0x00007f2a107f7000)
        /lib64/ld-linux-x86-64.so.2 (0x00007f2a1160d000)
        libcap-ng.so.0 => /lib64/libcap-ng.so.0 (0x00007f2a105f1000)

您应该可以看到libpam.so 库。


Linux-PAM配置

可以通过两种方式配置Linux-PAM。您可以将所有内容作为/etc/pam.conf放在一个文件中,也可以在目录中使用/etc/pam.d/服务分割配置。

最后一种方法更好,因为它使单独处理每个服务变得更容易。

请记住,如果/etc/pam忽略/etc/pam.conf,则Linux-PAM将忽略/etc/pam.d目录中存在。

有些PAM模块需要在PAM配置旁边的配置文件才能操作。这些特定于模块的配置文件存储在/etc/security中。

如果PAM配置错误,您的环境很容易被破坏。


PAM服务

Linux-PAM依赖于动态加载的模块(SO文件)。模块可以提供从任何后端(如文件/etc/passwd或数据库)验证用户身份的机制。

其中一个Linux PAM模块是PAM服务模块。PAM服务模块是一个库,它为登录或FTP等应用程序提供身份验证和其他安全服务。

PAM服务有四种类型:

  1. 身份验证服务模块
  2. 账户管理模块
  3. 会话管理模块
  4. 密码管理模块

任何需要身份验证的应用程序都可以使用服务名称在PAM中注册。

您可以检查使用Linux-PAM的Linux服务。

$ ls -l /etc/pam.d/
total 124
-rw-r--r--. 1 root root  192 Aug  9 11:09 chfn
-rw-r--r--. 1 root root  192 Aug  9 11:09 chsh
-rw-r--r--. 1 root root  232 Apr 11  2018 config-util
-rw-r--r--. 1 root root  287 Aug  9 07:07 crond
lrwxrwxrwx. 1 root root   19 Jul 26 03:30 fingerprint-auth -> fingerprint-auth-ac
-rw-r--r--. 1 root root  702 Jul 26 03:30 fingerprint-auth-ac
-rw-r--r--. 1 root root  796 Aug  9 11:09 login
-rw-r--r--. 1 root root  154 Apr 11  2018 other
-rw-r--r--. 1 root root  188 Aug  9 09:39 passwd
lrwxrwxrwx. 1 root root   16 Jul 26 03:30 password-auth -> password-auth-ac
-rw-r--r--. 1 root root 1033 Jul 26 03:30 password-auth-ac
-rw-r--r--. 1 root root  510 Oct 19 00:05 pluto
-rw-r--r--. 1 root root  155 Sep 14 02:09 polkit-1
lrwxrwxrwx. 1 root root   12 Jul 26 03:30 postlogin -> postlogin-ac
-rw-r--r--. 1 root root  330 Jul 26 03:30 postlogin-ac
-rw-r--r--. 1 root root  681 Aug  9 11:09 remote
-rw-r--r--. 1 root root  143 Aug  9 11:09 runuser
-rw-r--r--. 1 root root  138 Aug  9 11:09 runuser-l
lrwxrwxrwx. 1 root root   17 Jul 26 03:30 smartcard-auth -> smartcard-auth-ac
-rw-r--r--. 1 root root  752 Jul 26 03:30 smartcard-auth-ac
lrwxrwxrwx. 1 root root   25 Jul 26 03:28 smtp -> /etc/alternatives/mta-pam
-rw-r--r--. 1 root root   76 Oct 31  2018 smtp.postfix
-rw-r--r--. 1 root root  904 Aug  9 09:40 sshd
-rw-r--r--. 1 root root  540 Aug  9 11:09 su
-rw-r--r--. 1 root root  238 Oct 24 23:27 sudo
-rw-r--r--. 1 root root  216 Oct 24 23:27 sudo-i
-rw-r--r--. 1 root root  137 Aug  9 11:09 su-l
lrwxrwxrwx. 1 root root   14 Jul 26 03:30 system-auth -> system-auth-ac
-rw-r--r--. 1 root root 1031 Jul 26 03:30 system-auth-ac
-rw-r--r--. 1 root root  129 Oct 19 00:48 systemd-user
-rw-r--r--. 1 root root   84 Oct 31  2018 vlock

如果打开任何服务文件,您将看到该文件被分成三列。第一列是管理组,第二列是控制标志,第三列是使用的模块(SO文件)。

cat /etc/pam.d/sshd:需要特殊照顾的账户。

account是管理组,required是控制标志,使用的模块是pam_nologin.so。

在某些行中,您将看到第四列,即模块参数。


管理组

您将在PAM服务文件中看到四个管理组:

  1. Auth group: 提供两个函数。首先,可以验证用户(即用户提供真实性的证明)。第二,凭证由auth管理组授予。
  2. Account group: 控制对服务的访问,比如每周多次使用某个服务。
  3. Session group: 给定服务的环境由会话管理组构建,当您停止使用某个服务时,会话组将放下该环境。
  4. Password group: 仅当用户希望更新密码时使用。

控制标志

我们在服务文件中有四个控制标志:

  1. Requisite: 最强的旗帜。如果模块被标记为必需的,并且它失败了,PAM将返回到调用应用程序并报告失败。
  2. Required: 在失败的情况下,执行不会停止,而是继续到下一个模块。如果在执行完所有模块之后,有一个或多个模块失败,PAM将把失败返回给调用应用程序。
  3. Sufficient: 如果有足够的模块返回OK,则停止对模块的处理。
  4. Optional: 在失败的情况下,模块的堆栈将继续执行,而返回代码将被忽略。

模块顺序

逐个测试堆栈中的Linux-PAM模块。

顺序很重要,因为一个模块的效果是下一个模块正常工作所必需的。

下面的登录配置将正常工作:

auth required pam_unix.so

auth optional pam_deny.so

但是如果你像这样改变顺序:

auth optional pam_deny.so

auth required pam_unix.so

没有人可以登录,所以顺序很重要。

请记住,pam_deny模块可以作为故障安全解决方案包含在每个服务的任何堆栈中的最后一个模块中。


PAM模块

您的系统中有PAM内置的模块,您应该了解这些模块,以便能够完美地使用它们。

Pam_succeed_if模块

此模块可用于限制访问,以便只有列出的组才能登录。可以这样验证用户帐户:auth required pam_succeed_if。所以gid = 1000, 2000。

如果用户不是ID为1000或2000的两个组中的任何一个组的成员,则不允许该用户登录。

您可以使用UID代替用户ID: auth pam_succeed_if。uid >= 1000。

在本例中,大于或等于1000的任何用户ID都可以登录。

您还可以将它与ingroup参数一起使用,如下所示:auth required pam_succeed_if。用户ingroup mygroup。

只有名为mygroup的组中的人可以登录。

Pam_nologin 模块

如果文件/etc/nologin存在,此模块只允许根用户登录。

如果/etc/nologin不存在,有效用户可以登录:auth required pam_nologin.so。

您可以使用这一行更改登录服务文件,并创建一个/etc/nologin文件,以便只有根用户可以登录。

此模块与验证和帐户管理组一起使用。

Pam_access 模块

pam_access模块可以用来获得与pam_succeed_if模块相同的功能,但是pam_access模块主要用于从网络主机登录,而pam_succeed_if模块没有提示用户来自何处:account required pam_access。所以accessfile = / etc /安全/ access.conf。

这个限制是在/etc/security/access.conf文件中配置的

你可以像这样在access.conf文件中编写规则:

+:mygroup

-:ALL:ALL

Pam_deny 模块

该模块能够限制用户对系统的访问。它总是返回non-OK。

它总是在验证堆栈的末尾使用,以防止由于错误配置而导致的弱点。

您可以通过在模块堆栈的顶部添加pam_deny模块来禁用服务,如下所示:

auth required pam_deny.so

auth required pam_unix.so

我们在这里使用auth管理组的模块。但是,如果在密码管理组中使用该模块,则会阻止用户更改密码。

此模块与身份验证、帐户、会话和密码管理组一起使用。

Pam_unix 模块

此模块用于针对/etc/shadow文件作为后端验证用户:auth要求pam_unix.so。

您将在系统中的许多服务中看到这个模块。

此模块与验证、会话和密码管理组一起使用。

Pam_localuser 模块

此模块用于检查用户是否在/etc/passwd: account sufficient pam_localuser.so中列出。

此模块与验证、会话、密码和帐户管理组一起使用。

Pam_mysql 模块

pam_mysql模块可用于使用存储在数据库中的凭据对用户进行身份验证

你可以像这样使用这个模块:

auth sufficient pam_mysql.so 
USER=myuser passwd=mypassword host=localhost db=mydb 
TABLE=users usercolumn=username passwdcolumn=password

pam_mysql的参数用于使用MySQL数据库中的数据验证用户。

如果它不在你的系统上,你可以安装:$ yum install libpam-mysql。

此模块与验证、会话、密码和帐户管理组一起使用。

Pam_cracklib 模块

弱密码可能会导致系统崩溃。此模块确保您将使用强密码:密码需要pam_cracklib。所以retry=3 minlen=12 difok=3。

本例确保密码至少为6个字符,至少为3个字符。在密码程序中止之前,您有三次机会选择合适的密码。

此模块与密码管理组一起使用。

Pam_rootok 模块

此模块检查用户ID是否为0。这意味着只有root用户才能运行这个服务:验证充分的pam_root .so。

可以使用此模块确保只允许根用户使用特定的服务。

此模块与auth管理组一起使用。

Pam_limits 模块

此模块用于设置系统资源的限制,即使根用户也会受到这些限制的影响。

这些限制是从/etc/security/limit .conf文件中提取的,然后是/etc/security/limits.d/ directory: session required pam_limits.so。

您可以使用这个模块来保护您的系统资源。此模块与会话管理组一起使用。conf文件中的限制可以是硬的,也可以是软的。

  • 硬限制Hard limits由超级用户设置,由内核执行。用户不能更改值。
  • 软限制Soft limits是指用户可以在任何预先存在的硬限制允许的范围内向上或向下移动。

限制可能是fsize、cpu、nproc、数据和许多其他方面。

@mygroup        hard    nproc           50

myuser          hard    cpu           5000

mygroup成员的第一个限制将每个进程的数量设置为50个。

名为myuser的用户的第二个限制将cCPUtime限制为5,000分钟。

您可以在/etc/pam.d/中编辑任何PAM服务文件并使用您想要的模块以您想要的方式保护您的服务。

望您觉得使用Linux PAM模块很容易,也很有用!



计算机软件 Share Tweet +1