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:引用其他的配置文件,把配置权交给引用的文件(引用文件跳出,仅仅跳出子匹配)。

还有另一种语法

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)能够用来设置上面的返回值无法表达的行为。

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时间

参考链接

标签: none

讨论讨论讨论!