Linux-PAM鉴权模块

介绍

PAM全称叫作Pluggable Authentication Modules,译为可插拔验证模块。1995年起源于sun公司,PAM是一个框架,通过PAM框架提供的接口,应用程序可以不关心基层具体的实现过程,直接调用接口实现身份验证功能。PAM还有一个功能就是在用户空间就是先对用户的资源进行限制。

PAM不是Linux内核的一个模块,而是一个许多Linux发行版系统的标准组件,使用这个组件为系统和应用程序提供身份验证的框架。

身份验证管理

创建配置文件

要使用PAM模块来实现对应用程序的身份验证进行管理,需要在/etc/pam.d/目录中创建一个和程序同名的配置文件

一般情况下也不上去创建什么配置文件,首先程序得支持pam,常见对应得文件才会生效。对于一些简单的使用,会修改pam自带的一些配置文件进行相关身份验证管理就行了。

例如:SSH服务的PAM配置文件是/etc/pam.d/sshd

配置详解

PAM的配置文件格式是:
操作类型 控制标志 模块名称 模块参数

  1. 验证类别
    表明定义的这条PAM规则是用来做什么的。

    • auth: 验证用户身份。
    • account: 验证用户是否有权进行所请求的操作。
    • password: 密码管理(修改密码)。
    • session: 设置用户登录前后的会话环境,使用前后都会有记录。
  2. 控制的标志
    描述了当关联的模块执行失败时应如何处理。

    • required: 当使用此控制标志时,当验证失败时仍然会继续进行其下的验证过程,它会返回一个错误信息,但是由于它不会由于验证失败而停止继续验证过程,因此用户不会知道是哪个规则项验证失败。
    • requisite: 与required 的验证方式大体相似,但是只要某个规则项验证失败则立即结束整个验证过程,并返回一个错误信息。使用此关键字可以防止一些通过暴力猜解密码的攻击,但是由于它会返回信息给用户,因此它也有可能将系统的用户结构信息透露给攻击者。
    • sufficient: 只要有此控制标志的一个规则项验证成功,那么 PAM 构架将会立即终止其后所有的验证,并且不论其前面的 required 标志的项没有成功验证,它依然将被忽略然后验证通过。
    • optional: 表明对验证的成功或失败都是可有可无的,所有的都会被忽略。(通常用于session类型)
    • include: 将其他配置文件中的流程栈包含在当前的位置,就好像将其他配置文件中的内容复制粘贴到这里一样。
    • substack: 运行其他配置文件中的流程,并将整个运行结果作为该行的结果进行输出。该模式和 include 的不同点在于认证结果的作用域:如果某个流程栈 include 了一个带 requisite 的栈,这个 requisite 失败将直接导致认证失败同时退出栈;而某个流程栈 substack 了同样的栈时,requisite 的失败只会导致这个子栈返回失败信号,母栈并不会在此退出。

常用模块说明(/usr/lib64/security/)

  1. pam_access登陆访问限制模块

它主要用于对访问进入管理,提供基于登录名、主机名或域名、公网 IP 地址或网络号,以及非网络登录时的 tty 名称的访问控制。

该验证模块一般与account验证(Type)类型一同使用, 它主要是根据/etc/security/access.conf配置文件中的内容,来进行相应的验证工作的。

配置文件说明(/etc/security/access.conf):

每一行都由如下三个字段构成
permission:users:origins

  • permission:(权限)字段可以用 + 即表示允许访问, - 禁止访问来表示相应的权限。
  • users/groups:(用户或组)字段可以是一个或几个登录名、组名及 ALL (表示任何人)的一个清单。
  • origins:(来源)字段可以是非网络登录时的 tty 名称、主机名、域名(以.开始)、主机地址、网络号(以.结束)、带有子网掩码的公网 IP 地址,以及 ALL 表示任何主机和 LOCAL 只要不包含.的所有字符。

基础示例:

# 1.Disallow non-root logins on tty1
# EXCEPT表示排除
-:ALL EXCEPT root:tty1  


# 2.除了少数帐户,不允许控制台登录所有帐户
-:ALL EXCEPT wheel shutdown sync:LOCAL

# 3.有些ws相关帐户不允许从任何地方登录:
-:wsbscaro wsbsecr wscosor wstaiwde:ALL

# 4.用户root应该被允许从ip地址的主机访问。
+:root:192.168.200.1 192.168.200.4 192.168.200.9
# 下面的192.168.201.也可以使用192.168.201.0/24或者192.168.201.0/255.255.255.0
+:root:192.168.201.  

# 5.用户root应该能够从域访问。也使用字符串匹配。
+:root:.foo.bar.org

注意:如果 access.conf 文件不在缺省的 /etc/security/ 目录,你可以在其后使用 accessfile 参数指定自定义配置文件的绝对路径。

  1. pam_cracklib密码策略验证模块

该模块通常与password验证类型一起使用,通过插入 password 堆栈为特殊的应用提供可插入式密码强度性检测,它是PAM 配置接口的基本模块。

它的工作方式就是先提示用户输入密码,然后使用一个系统字典和一套规则来检测输入的密码是否不能满足强壮性要求。

密码的强度检测分二次进行:
(1)第一次只是检测密码是否是提供的对比字典中的一部分
(2)如果检测结果是否定的,那么就会提供一些附加的检测来进一步检测其强度,(例如检测新密码中的字符占旧密码字符的比例,密码的长度,所用字符大小写状况,以及是否使用了特殊字符等等)。

pam_cracklib选项:

  • debug:此选项表示将模块信息写入系统日志;
  • type=xxx:此选项用来修改缺省的密码提示文本;(默认是 "New UNIX password: " and "Retype UNIX password: ")
  • retry=N:定义用户在重试输入多少次密码后,返回一个错误信息,然后不准继续输入;(缺省一次)
  • difok=N:此选项用来定义新密码中必须有几个字符要与旧密码不同,缺省是1/2以上的字符与旧密码不同时就OK;
  • maxlen=N:此选项用来设置新密码的最大长度
  • minlen=N:此选项用来设置新密码的最小长度。
  • dcredit=N:此选项用来设定新密码中可以包含数字的最大数目。
  • ucredit=N:此选项用来设定新密码中可以包含的大写字母的最大数目。
  • lcredit=N:此选项用来设定新密码中可以包含的小写字母的最大数目。
  • ocredit=N:此选项用来设定新密码中可以包含的特殊字符的最大数目。
  • minclass=N:此选项用来规定新密码中的字符类别的最小数目,字符一般有四种类别:数字、大写字母、小写字母,以及特殊字符。
  • dictpath=/path/to/dict:指定 cracklib 目录路径。
  • use_authtok:在某个与密码相关的验证模块后使用此选项,例如 pam_unix.so 验证模块,可以强迫此模块不提示输入密码而使用上面设置的另一种方式;
  1. pam_limit资源服务限制模块

该模块通常与session验证类别一同使用,它主要用来限制用户在会话过程中对系统资源的使用,即使 UID=0 的用户也受它的限制。

默认独立的配置文件: /etc/security/limits.conf

模块参数选项: conf选项指定自定义配置文件即
sudo:session required pam_limits.so conf=/etc/custom_limits.conf

配置文件格式如下:
<domain> <type> <item> <value>

  • <domain>:可以是用户名、采用@group 语法的组名,还可以用通配符 * 来表示任何用户, 以及使用 “%” 通配符来只限制 maxlogins ,并可以采用 %group 的语法格式。

  • <type>

    • soft:用来设置对系统资源的软限制,它允许用户所使用的系统资源可以在设定的硬限制值的规定范围来上下浮动。
    • hard:用来设置对系统资源的硬限制,这些硬限制由超级用户设置,并由系统内核来执行。(普通用户对系统资源的使用率不能超过设置的硬限制设定值)
    • “-”:表示无限制系统资源。
  • <item> <value>: 两者总是成对使用的,"Item"表示某类具体的系统资源,而"Value"就是"Item"的值。

    • as:地址空间限制( KB )
    • core:核心文件的大小 (KB)
    • data:最大的数据包大小 (KB)
    • fsize:最大的文件大小 (KB)
    • memlock:最大可用的内存空间 (KB)
    • rss:最大的可驻留空间 (KB)
    • stack:最大的堆栈空间 (KB)
    • cpu:最大的 CPU 占用时间( minutes )
    • nproc:最大允许运行的进程数量
    • maxlogins:用户可以登录到系统的最多次数, UID=0 的用户除外
    • priority:优先运行的用户进程(负值越高的进程优先)
    • sigpending:最大数量的等待信号( Linux2.6 及以上内核)
    • msqqueue:POSIX 信息队列的最大可使用的内存( bytes )( Linux2.6 及以上内核)
    • nofile:最大可以打开的文件数量
    • locks:最大可锁定文件的数目( Linux2.4 及以上内核的系统)
注意事项:
1.上面item项目中是一些对系统资源使用情况非常有用的但它仅仅是一部分,可能随着内核的升级会加入某些新的item,你可以通过查看其帮助文档来了解。
2.十分注意用户的限制优先级要高于组的限制,如果你为一个组设置了某种系统资源限制,但是其中的某个用户设置了另一级别的系统资源限制,那么系统将会优先按用户级别的限制处理。
  1. pam_time日期时间终端限制模块

该模块通常与 account 验证类型一起使用,它并不对用户提供验证服务,而是用来限制用户在指定的日期、时间及终端线路上对系统或特定应用程序进行访问。

默认配置文件路径:/etc/security/time.conf

配置文件语法格式:
最初主要基于shadow package (shadow-960129)。
基础语法:
services;ttys;users;times

  • services:表示应用 PAM 功能的服务名称。
  • ttys:应用此规则的终端名,可以*号表示任何终端,!表示非。
  • users:应用此规则的用户名单或网络组名,可以 “*” 号表示任何用户,!表示非。
  • times:指定时间,通常使用日期 / 时间范围的格式来表示
    • 日期:Mo 、 Tu 、 We 、 Th 、 Fr 、 Sa 、 Su 、 Wk 、 Wd 、 Al , Mo 到 Su 分别指从星期一到星期天(Wk 指每一天/Wd 指周末/ Al 也指每一天),
    • 时间:采用 24 小时制,即 HHMM (时分)的形式

    日期/时间范围前可有 ! 表表除此以外的所有日期/时间,还可以用"-"连接指定的时间范围。

示例:

#示例1. MoMo 表示任何一天都没有,Al1800-0800 就是指每天下午 6 点整到第二天的早晨 8 点整。
xsh;tty*;root;!MoMo1800-0600

#实例2.用户'root'被拒绝xsh访问终端,在周末和星期1
xsh;ttyp*;root;!WdMo0000-2400

#示例3.在tty*(任何ttyXXX设备)上运行用户you和me一直被拒绝服务
blank;tty* & !ttyp*;you|me;!Al0000-2400
  1. pam_listfile文件服务访问验证模块

该验证模块通常与 auth 验证类型一起使用,此模块提供根据某个指定的文件来允许或禁止用户访问某个应用程序或服务的功能,这些被指定的文件必需事先存在,然后通过 file 参数来指定该文件。

该模块可以根据用户名、 tty 、 rhost 、 ruser 、用户组、使用的 shell 来对用户进行访问控制。

模块选项:

  • item=[tty|user|rhost|ruser|group|shell]:设置访问控制的对象类型。
  • apply=[user|@group]:用指定使用非用户和组类别时,这些规则所适用的对象。当item=[user|ruser|group]时该选项没有任何意义,只有当item=[tty|rhost|shell]时才有意思。
  • sense=allow|deny:用来指定当在保存 “item” 对象的文件中找不到 item 指定的对象时的动作方式,如果在文件中找不到相应的对象则执行相反的动作。
  • onerr=succeed|fail:用来指定当某类事件(如无法打开配置文件)发生时的返回值。
  • file=filename:指定保存有 “item” 对象的文件位置。

示例:

#示例1.auth验证类型依赖于pam_listfile.so(如有错误继续执行),访问对象为user组且与ftpusers文件中的用户一一对应否则阻止,当产生某类事件时候返回succeed;
vsftpd:auth       required      pam_listfile.so item=user sense=deny file=/etc/vsftpd/ftpusers onerr=succeed
  1. pam_unix认证类型验证模块

该模块提供基于 /etc/passwd 和 /etc/shadow 文件的类 UNIX 风格的认证,它适用所有的验证类型,包括: auth 、 account 、 password 、 session。

模块选项:

  • debug:将调试信息写入系统日志,当pam_unix 验证模块与所有验证类别使用时都有效。
  • audit:提供比 debug 更多诊断调试,它只有当与auth 、 account 及 password 验证类型使用时有效。
  • nullok:默认情况下如果密码为空那么就不允许用户访某项服务,而使用此项后将则覆盖这个默认动作。它只有当与 auth 、和 password 验证类型使用时有效。
  • nodelay:当用户验证失败后,系统在给出错误信息时会有一个延迟,默认为 2 秒钟。当使用此选项后,将取消这个延迟。它只有当与 auth 验证类型使用时有效
  • use_first_pass:当与 auth 验证类型一起使用时,使用该选项将在提示用户输入密码前,直接使用以往的密码验证方式来对用户进行验证。而当与 password 验证类型一起使用时,该选项主要用来防止用户新设定的密码与前面 password 提供的密码相同。
  • try_first_pass:当与 auth 验证类型一起使用时,使用该选项将在提示用户输入密码前,尝试使用以往的密码验证方式来对用户进行验证。而当与 password 验证类型一起使用时,该选项主要用来防止用户新设定的密码与以前的旧密码相同
  • use_authok:当用户修改时使用此选项强制用户使用前面堆叠验证模块提供的密码,例如由 pam_cracklib 验证模块提供的新密码。当与 password 验证类型一起使用时有效。
  • md5:采用 md5 对用户密码进行加密,当与 password 验证类型一起使用时有效。
  • shadow:使用用 shadow 密码,当与 password 验证类型一起使用时有效。
  • sha256:使用此选项,当下次修改密码时将用 SHA256 算法加密,如果 SHA256 的 libcrypt 不存在,就会重新使用 MD5 加密密码。
  • Sha512:与此选项相同,只是加密强大不同而已。当与 password 验证类型一起使用时有效。
  • rounds=n:用来指定使用 SHA256 和 SHA512 算法加密密码时重复哈希算法的次数。当与 password 验证类型一起使用时有效。
  • remember=n:使用此选项将会将 n 个使用过的旧密码,以 MD5 的方式加密后保存到 /etc/security/opasswd 文件中。当与 password 验证类型一起使用时有效。

示例:

#登陆时尝试使用以往的密码验证方式来对用户进行验证,可以输入空密码
system-auth-ac:auth        sufficient    pam_unix.so nullok try_first_pass
system-auth-ac:account     required      pam_unix.so
#使用512加密方式的 shadow 密码,并用户修改时使用此选项强制用户使用前面堆叠验证模块提供的密码
system-auth-ac:password    sufficient    pam_unix.so sha512 shadow nullok try_first_pass use_authtok
system-auth-ac:session     required      pam_unix.so
注意事项:
1. 与 auth 验证类型一起使用时,此模块可以使用的选项有 debug 、 audit 、 use_first_pass 、 try_first_pass 、 nullok 和 nodelay ,主要功能是验证用户密码的有效性,在缺省情况下(即不带任何参数时),该模块的主要功能是禁止密码为空的用户提供服务;
2. 在作为 account 类型使用时,此时该模块可识别的参数有 debug 、 audit ,该模块主要执行建立用户帐号和密码状态的任务,然后执行提示用户修改密码,用户采用新密码后才提供服务之类的任务;
3. 在作为 password 类型使用时,此时该模块可识别的参数有 debug 、  audit 、  nullok; 、 not_set_pass 、 use_authtok 、 try_first_pass 、 use_first_pass 、 md5 、 bigcrypt 、 shadow 、 nis 、remember ,该模块完成让用户更改密码的任务;
4. 在作为 session 类型使用时,此时该模块没有可识别的参数,该模块仅仅完成记录用户名和服务名到日志文件的工作。
  1. pam_deny配置访问验证模块

该验证模块可以用来禁止所有的访问,当你设置 PAM 配置文件时,为了安全,在开始的行可以使用它来禁止所有的访问,以减少错误配置引起的安全风险。

相反pam_permit 验证模块却总是允许所有的访问,你要谨慎的使用此验证模块。它们都适用于所有的验证类型。

  1. pam_rootok验证模块

该验证模块允许 /etc/pam.d/su 中的用户不需要任何验证就可以登录系统。因此你应当小心设置 /etc/pam.d/su 文件,并且在使用时要与 pam_wheel 验证模块一同使用,以保证 root 权限只允许在 pam_wheel 的限制中进行。它只适用于 auth 验证类型。

$ cat /etc/pam.d/su
#%PAM-1.0
auth            sufficient      pam_rootok.so
# Uncomment the following line to implicitly trust users in the "wheel" group.
#auth           sufficient      pam_wheel.so trust use_uid
# Uncomment the following line to require a user to be in the "wheel" group.
#auth           required        pam_wheel.so use_uid

9。 pam_security验证模块

该验证模块只对 root 用户有影响。当 root 用户登录时, pam_security 验证模块会参考 /etc/securetty 目录中的控制终端列表,来保证 root 用户不会从不安全的终端登录,它一般与 auth 验证类型一现使用。

$ cat /etc/securetty
console
vc/1
vc/2
vc/3
vc/4
vc/5
vc/6
vc/7
vc/8
vc/9
vc/10
vc/11
tty1
tty2
tty3
tty4
tty5
tty6
tty7
tty8
tty9
tty10
tty11
ttyS0
ttysclp0
sclp_line0
3270/tty1
hvc0
hvc1
hvc2
hvc3
hvc4
hvc5
hvc6
hvc7
hvsi0
hvsi1
hvsi2
xvc0
  1. pam_nologin验证模块

该验证模块如果 /etc/nologin 文件存在,此模块将禁止所有的登录。它一般与 auth 和 account 验证类型一同使用。

  1. pam_echo验证模块

该验证模块用来给用户显示通过 file 选项指定的文件中的内容,它适用于所有的验证类型。

  1. pam_motd 验证模块

允许将 /etc/motd 文件中的内容显示给用户,它只适用于 session 验证类型。

  1. pam_lastlog验证模块

显示用户上次登录的日期和时间,它主要通过读取 /var/log/lastlog 文件来显示。它只适用与 session 验证类型。

  1. pam_warn验证模块

将刚登录的信息记录到系统日志当中,它一般与 auth 和 password 验证类型一同使用。

  1. pam_wheel验证模块

当使用此验证模块后,只有加入到了一个 wheel group 中的的根用户,并且提交的密码有效,才能访问指定的服务或系统。将它与 pam_rootok 一同使用能增加对根用户的限制。它只适用于 auth 和 account 验证类型。

  1. pam_passwdqc密码策略验证模块

该模块与pam_cracklib差不多,主要用来设置Linux用户密码的复杂度;

模块选项说明:

  • mix:设置口令字最小长度,默认值是 mix=disabled 。
  • max:设置口令字的最大长度,默认值是 max=40 。
  • passphrase:设置口令短语中单词的最少个数,默认值是 passphrase=3 ,如果为 0 则禁用口令短语。
  • atch:设置密码串的常见程序,默认值是 match=4 。
  • similar:设置当我们重设口令时,重新设置的新口令能否与旧口令相似,它可以是permit 允许相似或 eny 不允许相似。
  • random:设置随机生成口令字的默认长度。默认值是 random=42 ,设为 0 则禁止该功能。
  • retry:设置用户输入口令字时允许重试的次数,默认值是 retry=3
  • enforce:设置约束范围
    • enforce=none 表示只警告弱口令字,但不禁止它们使用;
    • enforce=users 将对系统上的全体非根用户实行这一限制;
    • enforce=everyone 将对包括根用户在内的全体用户实行这一限制。
  • non-unix:它告诉这个模块不要使用传统的 getpwnam 函数调用获得用户信息,
  • 6
    点赞
  • 14
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值