目录

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

nsswitch.jpg

来看看它的语法: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(查看所有)

libnss.PNG

关于域名解析成 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 表示方法

example2.PNG

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 中的配置。

pam-d.PNG

下面我们看下 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 时间

参考资料

最近更新:

发布时间:

摆哈儿龙门阵