Linux - 认证机制 nsswitch 和 PAM
目录
nsswitch
我们知道用户登录时会把用户名转换为 UID
,怎么转的?今天来了解一下。
在 Linux 中有三种认证机制称之为 3A:
- authentication,认证机制,资源申请者证明自己本身的一个过程
- authorization,授权机制,用户是否可以访问一个服务或文件,用户访问服务或文件的能力
- audition,审计机制
把字符解析成数字或把数字解析成字符这种过程叫 名称解析
。解析用户名和密码会用到 /etc/passwd
文件,解析网址会用到 DNS
或 /etc/hosts
文件,在 Web 中进行登录使用到数据库(db)、ldap(轻量级目录访问协议)。
那在 shell 里输入 passwd 命令它怎么找到 /etc/shadow
文件,应用程序会去调用 nsswitch(name services switch) 对应的库,它的配置文件在 /etc/nsswitch.conf
来看看它的语法:info:method[[action]] method[[action]]
info
- automount 自动挂载(/etc/auto.master和/etc/auto.misc)
bootparams 无盘引导选项和其他引导选项(参见bootparam的手册页)
ethers MAC地址
group 用户所在组(/etc/group)
hosts 系统信息(/etc/hosts)
networks 网络信息(/etc/networks)
passwd 用户信息(/etc/passwd)
protocols 协议信息(/etc/protocols)
publickey 用于安全模式下运行的NFS
rpc RPC名称和编号(/etc/rpc)
services 服务信息(/etc/services)
shadow 映射口令信息(/etc/shadow)
method
- files:搜索本地文件,如/etc/passwd和/etc/hosts
nis:搜索NIS数据库,nis还有一个别名,即yp
dns:查询DNS(只查询主机)
active
status
- notfound:方法已经执行,但是并没有找到待搜索的值。默认的动作是continue
- SUCCESS:方法已经执行,并且已经找到待搜索的值,没有返回错误。默认动作是return。
- UNAVAIL:方法失败,原因是永久不可用。举例来说,所需的文件不可访问或者所需的服务器可能停机。默认的动作是continue。
- TRYAGAIN:方法失败,原因是临时不可用。举例来说,某个文件被锁定,或者某台服务器超载。默认动作是continue。
- 也就是说除了成功return,没有找到都continue
action
- return:返回到调用例程,带有返回值,或者不带返回值。
- continue:继续执行下一个方法。任何返回值都会被下一个方法找到的值覆盖。
搜索顺序
- 如果你想优先查找谁,就尽量往左放,左边优先级大于右边。
前面介绍完语法了来看看几个例子吧
# Example:
#passwd: db files nisplus nis
#shadow: db files nisplus nis
#group: db files nisplus nis
db files nisplus(nis增强版,是 sun 公司商业软件) nis(network infomation service,一个开源软件),表示从这些文件中从左向右寻找,也就是它的方法,语法中的 action 是对 method 的返回状态的响应。怎么找到相应的 files/service/db?libnss 库(.so)帮我们完成,在 /lib64/
中
我们要查看这些 .so 文件,要用 readelf
命令加上选项 -a(查看所有)
关于域名解析成 ip,第一个是 files,会在 host 文件当中会优先寻找 /etc/hosts,从左向右进行寻找,找到即停止 return 值找不到则继续向右寻找,全部都找不到返回 myhostname。
#hosts: db files nisplus nis dns
hosts: files dns myhostname
这是另一种语法,当中的 #services
是 info,nisplus
为方法, [NOTFOUND=return]
表示对前一个方法的响应,如果 stat 为 notfound 就继续向下查找,files 表示方法
PAM 验证
在登录时调用 login 应用程序再交给 PAM 嵌入式认证模块进行验证。PAM 它本身不会执行验证,需要借助策略和模块来验证,我们用 ldd Service_Path
来看它所需要的库,有的话说明它支持 PAM。
[root@localhost ~]# ldd /usr/bin/login | grep libpam
libpam.so.0 => /lib64/libpam.so.0 (0x00007f587d389000)
libpam_misc.so.0 => /lib64/libpam_misc.so.0 (0x00007f587d185000)
在 pam.d 下存放着系统支持 pam 的服务配置文件,其中的 ohter 文件是系统中支持的服务没匹配到任何条目时,会匹配 other 中的配置。
下面我们看下 login 文件。
[root@localhost pam.d]# cat login
#%PAM-1.0
auth [user_unknown=ignore success=ok ignore=ignore default=bad] pam_securetty.so
auth substack system-auth
auth include postlogin
account required pam_nologin.so
account include system-auth
password include system-auth
# pam_selinux.so close should be the first session rule
session required pam_selinux.so close
session required pam_loginuid.so
session optional pam_console.so
# pam_selinux.so open should only be followed by sessions to be executed in the user context
session required pam_selinux.so open
session required pam_namespace.so
session optional pam_keyinit.so force revoke
session include system-auth
session include postlogin
-session optional pam_ck_connector.so
第一行 #%PAM-1.0
是 PAM 版本。这个文件有三列,第一列是 type,第二列是 control,第三列是 modules,还有第四个没用到的是 [modules_args]。
type:
- auth(authentication),是身份验证,验证用户名和密码正确性
- account,检查用户名和密码有效性(过期,禁用等)
- password,修改密码时,密码是否符合安全性(长度,大小写等)
- session,用户会话相关属性
control:
- required,如果匹配失败了不返回错误信息,继续匹配下面的条目直到完成。
- requirest,如果匹配失败,不匹配下面的条目直接返回错误信息。
- sufficient,如果匹配成功,不匹配下面的条目直接返回成功信息。
- optional,不影响最终结果(有没有都一样)
- include,引用其他的配置文件,把配置权交给引用的文件(引用文件跳出,则整个匹配结束)。
- substack,引用其他的配置文件,把配置权交给引用的文件(引用文件跳出,仅仅跳出子匹配)。
control 还有另一种语法,就是 [user_unknown=ignore success=ok ignore=ignore default=bad]
,格式是:
value1 = action1 value2 = action2 ……
其中 value 可以是下列 Linux PAM 库的返回值:
- success
- open_err
- symbol_err
- service_err
- system_err
- buf_err
- perm_denied
- auth_err
- cred_insufficient
- authinfo_unavail
- user_unknown
- maxtries
- new_authtok_reqd
- acct_expired
- session_err
- cred_unavail
- cred_expired
- cred_err
- no_module_data
- conv_err
- authtok_err
- authtok_recover_err
- authtok_lock_busy
- authtok_disable_aging
- try_again
- ignore
- abort
- authtok_expired
- module_unknown
- bad_item和default。
最后一个 [... default=bad]
能够用来设置上面的返回值无法表达的行为,例如:
required [success=ok new_authtok_reqd=ok ignore=ignore default=bad]
requisite [success=ok new_authtok_reqd=ok ignore=ignore default=die]
sufficient [success=done new_authtok_reqd=done default=ignore]
optional [success=ok new_authtok_reqd=op default=ignore]
对应 action 值:
- ignore,忽略执行结果
- bad,如果失败,结果被用于整个执行栈,后续栈继续执行。
- die,和 bad 相似,失败直接返回结果,后续栈不执行。
- ok,如果 PAM_SUCCESS 覆盖之前的值
- done,和 OK 相似,但是栈直接返回结果
- reset,重置栈当前状态
modules 匹配认证模块
我系统是 64 位,认证模块在 /lib64/security/
下,/etc/security
下有其他支持PAM模块的配置文件比如 access.conf,/usr/share/doc/pam-版本/txts
存放着 PAM 说明文件。每个模块功能不一样,
常用模块:
- pam_env.so,设置环境变量的模块,如果需要额外的环境变量,可以使用 pam_env.so 进行设置,配置文件在 /etc/security/pam.env.conf
- pam_unix.so,提供验证阶段的验证功能,也可提供授权管理
- pam_secruetty.so,限制系统管理员只能从安全的终端登录,配置文件在 /etc/securetty
- pam_nologin.so,限制普通使用者能否登录主机进行使用,当 /etc/nologin 文件存在时,所有的普通用户都无法登录。
- pam_cracklib.so,可以限制恶意攻击,检查密码强度
- pam_pwquality.so,完全兼容 pam_cracklib.so,检查密码,包括设置的密码是否在字典里
- pam_rootok.so,如果 UID 为 0,直接通过,如 root 用户 su 到普通用户使用此模块
- pam_listfile.so,验证时使用其他的文件
- pam_access.so,控制访问的模块,默认配置 /etc/security/access.conf
- pam_limits.so,限制使用者打开文件数量和单个文件大小等
ulimit [options] 限额:
- -H,hard limit 严格的限制,必能超过设置的数值
- -S,soft limit 警告的限制,超过设定数值系统会发出警告,通常 soft 比 hard 小
- -a,选项后面不加参数,可以列出系统中所有的限制数值
- -c,当某个用户程序发生错误的时候,系统会将内存中的应用程序写为文件,这种文件为核心文件(core file),限制每个核心文件的最大容量
- -f,此 shell 可以创建的文件的大小,针对当前 shell(单位kb)
- -l,可以锁定的内存量
- -u,单一用户可以使用的最大进程量
- -t,可以使用的最大的 CPU 时间
参考资料
最近更新:
发布时间: