========================================================================================================================================= nsswitch:network service switch(网络服务转换) 作用:调整网络服务名称解析机制 1、在Linux上,需要使用框架性服务的有名称解析和认证服务,例如用户登录程序(login)输入用户名,主机需要将用户名解析成用户ID, 以便后续的认证,这个过程需要名称解析;用户输入密码需要验证密码的正确性,这个过程用到了认证的服务。 2、名称解析的背后,一定有名称和值的一个文件或者数据库,用来解析名称,这样的文件或数据库,我们称为解析库。解析库的存储方式 可以是文本文件,也可以是 MySQL、NIS、LDAP、DNS 等。应用程序的运行需要名称解析时,可以选择任意一种解析库的存储方式,这带来 一个问题就是,程序员开发程序的过程中,必须提供对这几种解析库存储方式的支持。这无疑对程序的通用性大打折扣。所以,nsswitch 作为一个通用框架对所有程序提供一个统一接口,由 nsswitch 负责对不同类型解析库的支持。 nsswitch通用框架以库的形式存在 /usr/lib64/libnss3.so , nsswitch 通用框架还提供了与各种类型的解析库交互的库例如: /usr/lib64/libnss_db.so、/usr/lib64/libnss_nis-2.17.so、/usr/lib64/libnss_dns.so 等。 3、测试解析 从管理数据库中解析条目,例如: /etc/passwd /etc/groups /etc/hosts getent DATABASE ENTRY(条目) getent passwd root getent services http 4、配置文件 /etc/nsswith.conf 1、解析查找结果的状态:STATUS: success | notfound | unavail | tryagain success 默认处理动作是 return,其余状态的默认动作是都 contnue 对每种状态的处理动作:ACTION:return | continue 示例:host: files nis [NOTFOUND=return] dns # 在files和nis中都 notfound 时,直接返回,不在查找 dns STATUS=ACTION # 表示如果状态是 STATUS 则 ACTION ========================================================================================================================================= pam:Pluggable Authentication Modules(可插拔认证模块) 作用:用于系统级的用户认证 1、和 nsswitch 类似,pam 也是提供了一个框架,使的程序开发与认证方式细节分离,程序运行时调用认证模块完成认证 工作。pam 将应用程序和鉴别模块分离开来,pam 充当应用程序和鉴别模块联系的中间层。 2、认证的过程需要认证库,认证库可是以文本文件、MySQL、LDAP 等存储形式。 pam 提供了很多支持各种存储形式的库支持。 库文件 /lib64/sercurity/ 目录内。 3、配置文件 模块配置文件通常是 /etc/pam.d/NAME 文件,NAME是使用模块的应用程序的名称,每个应用程序一个单独的配置文件。 每个配置文件中每一行定义一种检查规则。通常使用pam认证的应用程序会指定对其负责认证的pam认证配置文件,例如: vsftpd服务中,在他配置文件中会有定义:pam_service_name=vsftpd 环境相关的设置:/etc/security/ 4、配置文件语法格式 [module_type] [control] [module-path] [module-arguments] module_type:指明程序所用PAM底层模块的类型 auto # 鉴别类模块,用户、密码的认证和授权检查 account # 账户类模块,与账号管理相关认证,验证账号是否有效。例如:用户登录的位置、访问时间等 password # 口令类,例如修改密码。例如修改密码时密码复杂度检查机制等 session # 会话类模块,用户获得服务之前或使用服务完成之后,要进行的一些附加性操作。 -[module_type] # 表示因为缺失而不能加载的模块将不记录到系统日志,对于那些不总是暗转在系统上的模块有用 control:规定如何处理模块的成功和失败情况,配置文件中各模块的地位与出错时的处理由control栏的取值决定, 单个应用程序可调用多个模块 两种实现机制: 1、使用一个关键词定义 required # 只有当对应于应用程序的所有带 required 标记的模块全部成功后,该程序才能通过鉴别。 如果任何带 required 标记 的模块出现了错误,PAM 并不立刻将错误消息返回给应用程序,而是在所有模块都调用完毕后才将错误消息返回调用 它的程序。 ---> "一票否决" requisite # Requisite-- 它与 required 相仿,只有带此标记的模块返回成功后,用户才能通过鉴别,不同之处在于其一旦失 败就不再执行堆中后面的其它模块,并且鉴别过程到此结束,如果此条目中的模块检查失败,则立即返回失败,后续 检查则不在检查。 ---> "一票否决" sufficient # 只要标记为 sufficient 的模块一旦成功,那么 PAM 便立即向应用程序返回成功而不必尝试任何其他模块。 当标记为 sufficient 的模块失败时,sufficient 模块当做 optional 对待。 optional # 它表示即便该模块失败,用户仍能通过鉴别。在 PAM 体系中,带有该标记的模块失败后将继续处理下一模块 include # 将其他文件中相同类型的文件包含进来 2、使用一个或多个键值对组合表示 格式:[status1 = action1 status2 = action2.....] status:返回状态值 action: ok 模块通过,继续检查  done 模块通过,返回最后结果给应用  bad 结果失败,继续检查  die 结果失败,返回失败结果给应用  ignore 结果忽略,不影响最后结果  reset 忽略已经得到的结果 module-path:模块路径,如果模块在 /lib64/sercurity/ 下,可使用相对路径 module-arguments:模块参数 5、模块引用 pam_shells.so pam_deny.so pam_permit.so pam_rootok.so pam_limits.so # 此模块通过读取配置文件完成用户对系统资源的使用 6、PAM认证机制 它提供了对所有服务进行认证的中央机制,适用于login,远程登录(telnet,rlogin,fsh,ftp,点对点协议(PPP)),su等应用程序中。 系统管理员通过 PAM 配置文件来制定不同应用程序的不同认证策略;应用程序开发者通过在服务程序中使用PAM API(pam_xxxx( )) 来实现对认证方法的调用;而PAM服务模块的开发者则利用 PAM SPI 来编写模块(主要是引出一些函数pam_sm_xxxx( )供PAM接口库调用), 将不同的认证机制加入到系统中;PAM接口库(libpam)则读取配置文件,将应用程序和相应的PAM服务模块联系起来。 7、PAM认证过程 PAM认证一般遵循这样的顺序 Service(服务) → PAM(配置文件) → pam_*.so PAM认证首先要确定那一项服务,然后加载相应的PAM的配置文件(位于/etc/pam.d下),最后调用认证文件(位于/lib/security下) 进行安全认证  PAM认证过程: 1.使用者执行/usr/bin/passwd 程序,并输入密码 2.passwd 开始呼叫 PAM 模块,PAM 模块会搜寻 passwd 程序的 PAM 相关设定文件,这个设定文件一般是在 /etc/pam.d/ 里 边的与程序同名的文件,即 PAM 会搜寻 /etc/pam.d/passed 这个设置文件 3.经由/etc/pam.d/passwd设定文件的数据,取用PAM所提供的相关模块来进行验证 4.将验证结果回传给passwd这个程序,而passwd这个程序会根据PAM回传的结果决定下一个动作(重新输入密码或者通过验证) 8、/etc/pam.d/NAME sshd # 定义使用ssh连接的验证 login # 登录验证 su # su 指令认证 remote # 限制远程登录 9、常用模块 pam_shells.so # 限制用户登录shell,在 /etc/shells 文件中的列表为安全shell pam_securetty.so # 限制 root 在指定的 tty 上登录,/etc/securetty 上为安全的 tty pam_nologin.so # 限制非root用户登录,/etc/nologin 文件存在,则普通用户不能登录,并显示 /etc/nologin.txt 文件的提示内容 pam_limits.so # 在用户级别实现对其可使用的资源的限制,例如:可打开的文件数量,可运行的进程数量,可用内存空间 在session验证类型验证 10、PAM模块示例 1、pam_time.so pam_time.so默认模块配置文件 /etc/security/time.conf 帮助文档:man -k pam_ pam文档:/usr/share/doc/pam-*/ pam模块应用举例参考:http://www.infoq.com/cn/articles/linux-pam-two?utm_source=infoq&utm_campaign=user_page&utm_medium=link =========================================================================================================================================