zoukankan      html  css  js  c++  java
  • TCP_Wrappers & PAM & Nsswitch服务

    cpwrapper:工作在第四层(传输层),能够对有状态连接的服务进行安全检测并实现访问控制的工具。部分功能上跟iptables重叠。

         对于进出本主机访问某特定服务的连接基于规则进行检查的一个访问控制工具,这个访问控制工具以库文件形式实现;某进程是否接受libwrap的控制取决于发起此进程的程序编译是否针对libwrap进行编译的。

            tcpwrapper的作用是对基于tcp的程序进行安全控制。它通过使用/usr/sbin/tcpd这样一个进程来代为监听任何一个使用了tcpwrapper的发起连接的tcp请求。假设sshd接受tcpwrapper的验证,当有一个连接发起ssh连接时先有tcpwrapper进行身份验证,如果通过了验证,则将连接转向sshd,否则直接拒绝连接。

            tcpwrapper只能为tcp的连接进行验证。它实际是通过库文件libwrap.so来实现控制的,并不是所有的tcp连接都接受其控制。其次,主要针对基于tcp并且在编译(两种编译方式:静态和动态)时链接到libwrap库上的程序才能生效。

    所以tcpwrapper的功能并没有iptables强大。

    一、如何判断一个程序是否可以tcpwrapper控制:

    判断一个二进制程序是否接受tcpwrapper的控制,只需检查二进制程序在编译的时候是否依赖libwrap.so库

    [root@station39 ~]# ldd `which sshd` | grep libwrap

            libwrap.so.0 => /lib/libwrap.so.0 (0x00c5a000)

    某些二进制文件在编译时直接以静态的方式将对libwrap库的依赖性编译到文件中去,此时需要使用string来检查

    [root@station39 ~]# strings `which sshd` | grep hosts

    [root@station39 ~]# strings `which portmap` | grep hosts     //**提供RPC服务的进程

    hosts_access_verbose

    hosts_allow_table

    hosts_deny_table

    /etc/hosts.allow

    /etc/hosts.deny

    链接到libwrap.so的独立进程有:sendmail,slapd,sshd,stunnel,xinetd,gdm,gnome-session,vsftpd,

    portmap等等。

    二、配置文件介绍

       1.TCP Wrappers配置文件

       要决定一个客户是否被允许连接一项服务,TCP Wrappers会参考以下两个文件,这两个文件通常被称为主机访问文件:
                    /etc/hosts.allow
                    /etc/hosts.deny
       当一个TCP Wrappers接收到一个客户请求时,它会运行以下几个步骤:
           A.检查/etc/hosts.allow.TCP会绕服务会循序地解释/etc/hosts.allow文件并应用第一个为这个服务所指定的规则.如果找到了一个匹配的规则,则允许连接.如果找不到匹配的规则,就会进行下一个步骤.
           B.检查/etc/hosts.deny.TCP会绕的服务会循序地来解释/etc/hosts.deny文件.如果找到一个匹配的规则,则拒绝这个连接.如果找不到匹配的规则,则允许连接到这个服务.
       
       在使用TCP Wrappers保护网络服务时应该考虑以下几个要点:
           A.因为hosts.allow中的规则会首先被应用,所以比hosts.deny中指定的规则有优先权.因此,如果访问一项服务在hosts.allow中设置为允许,那么在hosts.deny中同一项服务的拒绝访问设置则被忽略.
           B.每个文件中的各项规则是由上到下被读取的,第一个匹配的规则是唯一被应用的规则.因此,规则的排列顺序极其重要.
           C.如果在这两个文件中都没有找到匹配的规则,或这两个文件都不存在,那么就授予访问这项服务的权限.
           D.TCP会绕的服务并不缓存主机访问文件中的规则,因此对hosts.allow或hosts.deny的配置改变都无需重新启动网络服务便会马上起作用.
     
       2.格式化访问规则
       /etc/hosts.allow和/etc/hosts.deny文件的格式是完全相同的.每个规则都必须位于其正确的行位.空行或以井字号(#)开始的行会被忽略.
       每条规则都使用以下基本格式来对网络服务的访问进行控制:
             <daemon list>: <client list> [: <option>: <option>: ...]
       字段解释如下:
          <daemon list>,一个由逗号分隔的进程名(不是服务名)列表,或ALL通配符.守护进程列表也接受运算符来提供更大的灵活性.
          <client list>,一个由逗号分隔的主机名,主机IP地址,特殊模式或通配符列表,该列表用来识别受这项规则影响的主机.客户列表也接受运算符来允许更大的灵活性.
           <option>,这项规则被触发时要运行一个动作选项或由冒号分隔开动作列表.选项领域支持扩展式,发布shell命令,允许或拒绝访问以及修改日志记录.
       下面是一个基本的主机访问规则示例:
            vsftpd : .example.com
       这条规则指示TCP Wrappers监测在example.com域内的任何主机向FTP守护进程(vsftpd)发出的连接.如果这条规则出现在hosts.allow 中,连接则被接受.如果这条规则出现在hosts.deny中,连接则被拒绝.
       下面的主机访问规则比较复杂,而且使用两个选项领域:
            sshd : .example.com  :spawn /bin/echo `/bin/date` access denied>>/var/log/sshd.log :deny
       请注意每个选项领域前面都有反斜线().使用反斜线可以防止由于规则太长而造成失败.
       这个范例规定如果example.com中的某个主机试图向SSH守护进程(sshd)发出连接请求,那么执行echo命令来将这次尝试添加到一个专用日志文件里,并且拒绝该连接.因为使用了命令选项 deny,这一行拒绝访问,即使它出现在 hosts.allow 文件里.
     
      3.通配符
      通配符使TCP Wrappers更容易匹配各种守护进程或主机.使用通配符最频繁的是在访问规则的客户列表领域内.
      以下是可以被使用的通配符:
             ALL,完全匹配,可以用在守护进程列表和客户列表中.
             LOCAL,与任何不包括圆点(.)的主机匹配,如localhost.
             KNOWN,与任何带有已知主机名和主机地址或已知用户的主机匹配.
             UNKNOWN,与任何带有未知主机名和主机地址或未知用户的主机匹配.
             PARANOID,与任何带有主机名和主机地址不相匹配的主机匹配.
     
      4.模式
      模式可以用在访问规则的客户领域里,从而更准确地给客户主机指定分组.
      下面是一个常用模式列表:
           A.主机名以圆点(.)开始,如果在一个主机名的开始放置一个圆点,那么就与所有共享这个主机名中列出的相同组成部分的主机匹配.如:.example.com适用于example.com域内的任何主机.
           B.IP地址以圆点(.)结束,如果在一个IP地址的末尾放置一个圆点,那么就与所有共享一个IP地址的起始数值组的主机匹配.如:192.168.适用于192.168.x.x网络内的任何主机.
           C.IP地址/网络掩码对,网络掩码表达式也可以作为一个模式用来控制对某一组特定的IP地址的访问.如:192.168.0.0 /255.255.254.0适用于地址区间从192.168.0.0到192.168.1.255的任何主机.
           D.[IPv6地址]/前缀长度对,[网]/前缀长度对也可以作为一种模式用来控制对某一组特定的IPv6地址的访问.如: [3ffe:505:2:1::]/64适用于地址区间从3ffe:505:2:1::到 3ffe:505:2:1:ffff:ffff:ffff:ffff的任何主机.
           E.星号(*),星号可以用来匹配整个不同组别的主机名或IP地址,只要在含有其它模式类型的客户列表中这些组不混杂在一起的话.如:*.example.com适用于example.com域内的任何主机.
           F.斜线(/),如果一个客户列表以斜线开始,这个列表就被当作一个文件名对待.若是需要指定很大数量主机的各种规则的话,这一点就很有用处.
       更多TCP Wrappers所接受的其它用到的模式.可参阅hosts_access man 5 page.

       5.Portmap(端口映射器)和TCP Wrappers
        实施TCP Wrappers的Portmap不支持主机查找,也就是说portmap命令不能用主机名来识别相应的主机.因此,在hosts.allow或 hosts.deny中对portmap的访问控制规则必须使用IP地址来特指某主机,或用关键词ALL.
        对portmap访问控制规则的修改可能不会立即起作用.可能得重新启动portmap服务.
        像NIS和NFS一样的被广泛使用的服务都有赖于portmap来进行运作,所以要了解这些局限性.
     
       6.算子(Operators)
        目前,访问控制规则接受一个算子EXCEPT,这个算子可以用在一个规则的守护程序列表中,也可以用在客户列表中.
        这个EXCEPT算子允许特定的例外以用来在同一个规则中拓宽匹配的范围.
        下面的例子来自一个hosts.allow文件,除cracker.example.com之外,允许所有example.com主机连接所有的服务
            ALL: .example.com EXCEPT cracker.example.com
        hosts.allow文件内的另一个例子中,来自192.168.0.x网络的所有客户都可以使用除FTP之外的所有服务
            ALL EXCEPT vsftpd: 192.168.0.
        从组织结构上来说,避免使用EXCEPT算子更简易一些.因为这样可以让其他的系统管理员能很快地扫描相关的文件以便查看哪些主机被允许或被拒绝访问服务,而无须通过EXCEPT算子来进行排序.
        同样, EXCEPT可以进行嵌套,
        ‘a EXCEPT b EXCEPT c´ would parse as ‘(a EXCEPT (b EXCEPT c))´
     
       7.记录日志
        通过使用severity命令,其选项领域让系统管理员能够很容易地改变一个规则的日志设施和优先级别.
        在下面的例子中,example.com域内的任何主机向SSH守护进程发出的各种连接会登录到默认的authprivsyslog设施内(因为没有具体指明设施参数值),并且以emerg优先:
              sshd : .example.com : severity emerg
        使用severity选项也可以指定某个设施.下面的例子将来自example.com 主机的任何SSH连接意图登录到local0设施,并以alert优先.
                    sshd : .example.com : severity local0.alert
            实际操作中,这个例子直到syslog守护进程(syslogd)被配置为登录到local0设施才会起作用.
     
        8.访问控制
        选项领域也允许系统管理员通过添加allow或deny作为命令的最后选项来明确地以单个规则方式允许或拒绝主机.
        例如,下面的两个规则允许来自client-1.example.com的SSH连接但却拒绝来自client-2.example.com的连接
           sshd : client-1.example.com : allow
           sshd : client-2.example.com : deny
        访问控制以每个规则为基础,这样选项领域就允许系统管理员把所有访问规则写成一个单一文件,要么是hosts.allow,要么是hosts.deny.有些系统管理员认为这样组织访问规则更容易一些.
     
        9.Shell命令
        选项领域允许访问规则通过下面两个指令发出shell命令:
           (1).spawn,作为子进程发出一个shell命令.这个命令可以使用/usr/sbin/safe_finger来获取发出请求客户的更多信息,或使用 echo命令来创建专用日志文件.在下面的例子中,试图访问来自example.com 域的Telnet服务的客户被俏俏地登录到一个专用文件.
                 in.telnetd : .example.com  : spawn /bin/echo `/bin/date` from %h>>/var/log/telnet.log : allow
           (2).twist,把要求进行的服务转换成特定的命令.这个命令经常用来给外侵者设立陷阱(也叫"蜜罐儿").也可以用来向预连接的客户发送信息.这个 twist命令必须出现在该规则命令行的末尾.在下面的例子中,试图访问来自example.com域的FTP服务的客户接收到用echo命令发送的一个 讯息.
                vsftpd : .example.com : twist /bin/echo "421 This domain has been black-listed. Access denied!"
     
        10.扩展式
        扩展式命令与spawn和twist命令一起使用时,可以提供关于客户/服务器以及相关进程的信息.
          下面是一个支持扩展式的命令列表:
                 %a,返回用户的IP地址.
                 %A,返回服务器的IP地址.
                 %c,返回大量的客户信息,比如用户名和主机名,或用户名和IP地址.
                 %d,返回守护进程的名称.
                 %h,返回客户的主机名(或IP地址,如果主机名没有提供的话).
                 %H,返回服务器的主机名(或IP地址,如果主机名没有提供的话).
                 %n,返回客户的主机名.如果主机名没有提供的话,屏幕上会显示unknown.如果客户的主机名和主机地址不匹配的话,屏幕上会显示paranoid.
                 %N,返回服务器的主机名.如果主机名没有提供的话,屏幕上会显示unknown.如果服务器的主机名和主机地址不匹配的话,屏幕上会显示paranoid.
                 %p,返回守护进程的进程ID.
                 %s,返回各种不同类型的服务器信息,比如守护进程的进程和服务器的主机或IP地址.
                 %u,返回客户的用户名.如果没有提供的话,屏幕上会显示unknown.
       下面用来示范的规则与spawn命令一起使用了一个扩展式来在一个定制的日志文件中确认客户主机.
       当来自example.com域的一个主机向SSH守护进程(sshd)发出连接意图时,执行echo命令来把这次包括客户主机名(通过使用%h扩展式)的连接尝试信息记录到一个专用文件中.
          sshd : .example.com : spawn /bin/echo `/bin/date` access denied to %h>>/var/log/sshd.log : deny
       同样的,扩展式也可以用来把个性化的讯息返回给客户.在下面的例子中,试图访问来自example.com域的FTP服务的客户们得到通知,他们的访问被服务器取缔了.
          vsftpd : .example.com : twist /bin/echo "421 %h has been banned from this server!"
            有关可用扩展式的更完全的解释,以及对附加的访问控制选项的更完全的解释,可参阅man page的第五部分,查看hosts_access(man 5 hosts_access)和hosts_options.
     
      11.连接旗帜(Connection Banners)
       当用户连接到服务器时,用合适的旗帜标示显示其连接是一种很好的方式,可以让潜在的袭击者知道本系统管理员很有警惕性.同时也可以控制关于系统什么样的信 息可以呈现给用户.要想为一项服务设置一个TCP Wrappers旗帜标示,可使用banner选项。
       这个例子为vsftpd设置一个旗帜标示.首先,创建一个旗帜标示文件,可以储存在系统的任何地方,但必须与其守护进程同名.例如,该文件命名为/etc/banners/vsftpd并包含下面一行:
            220-Hello, %c 220-All activity on ftp.example.com is logged. 220-Inappropriate use will result in your access privileges being removed. 
         %c权标可提供客户的多种信息,比如用户名和主机名,或用户名和IP地址,也许这样会使该连接更让人觉得有胁迫感。
         要想使该旗帜在有外来连接进入时显示,可在/etc/hosts.allow文件上加上下面一行:
               vsftpd : ALL : banners /etc/banners/

    三、举例说明:

    allow  : 允许访问
    deny   : 拒绝访问
    spwan  : 拒绝访问 并且在自己这边执行后面自定义的命令或脚本
    twist  : 拒绝访问 并且在访问者那边执行后面自定义的命令或脚本
    serverity : 将来访者的信息记录到日志中,然后继续和后面的规则做比对
    banners : 显示指定文件中的信息给client端
    例如:
    vsftpd : 192.168.0. : swpan /bin/echo $(date) %c %d >> /var/log/tcpwrap.log
    vsftpd : 192.168.1. : twist /bin/echo “421 Connection prohibited.”
    vsftpd : 192.168.2. : banners /var/banners
    第一条规则,是拒绝192.168.0的网段访问,并且将日期和来访者的信息记录到tcpwrap.log中
    第二条规则,是拒绝192.168.1的网段访问,并且在来访者客户端的那边显示提示信息”421 Connection prohibited.”
    第三条规则,当192.168.2的网段访问,在客户端那边显示提示信息,信息内容由 /var/banners文件来指定。

       (1). ALLOW/DENY: 可以在/etc/hosts.deny或/etc/hosts.allow 中被当做一个选项来使用。

    例:编辑/etc/hosts.allow

    in.telnetd: 192.168.1.

    in.telnetd: ALL: DENY

       (2). spawn:在匹配到规则时重新发起一个额外的命令来执行其他的动作,可使用特殊展开。

    在子进程中执行,并不影响当前进程。

    in.telnetd: ALL : spawn echo "login  attempt  from  %c  to  %s"  | mail -s waring  root

       (3). twist:启动一个额外的命令来取代当前规则中定义的服务。

    sshd: 192.168.0. twist /bin/echo "421 Connection prohibited."

         通过一个例子来说明二者区别:

         编辑/etc/hosts.allow

              in.telnetd: 192.168.0.: spawn /bin/echo `date`  %c accessd %d &gt;&gt; /var/log/tcpwrap.log

         可以正常访问,我们来查看下日志:

         [root@station39 xinetd.d]# cat /var/log/tcpwrap.log

               Wed Mar 23 12:26:29 CST 2011 192.168.0.1 accessd in.telnetd

         我们使用twist来试一下:/etc/hosts.allow

               in.telnetd: 192.168.0.: twist /bin/echo "421 connetcion deny!"

         使用物理机访问,被拒绝:

       (4). severity [facility.] priority

           定义访问某个服务时的日志级别,默认authpriv.info级别

                      in.telnetd:ALL: serverity local7.info

       (5). banners

           访问某个服务时返回的信息

                      in.telnetd: ALL: banners  /some/directory

           编辑/etc/hosts.allow

                      in.telnetd: ALL: banners /var/tcpwrap

           举例:

                      [root@station39 xinetd.d]# mkdir  /var/tcpwrap

                      [root@station39 xinetd.d]# vim /var/tcpwrap/in.telnetd

           "Welcome to 192.168.0.39"

           使用物理机访问一下:

     
    tcpwapper:     
           工作在传输层、对于进出本机访问某特定服务的连接基于规则进行检查的一个访问控制工具,
           以库文件的形式,某进程是否接受libwrap的控制取决于发起此进程的程序时是否针对libwarp进行编译的
           
           命令:
                  ldd  查看是否有libwrap.iso文件 或
                  strings which portmap | grep hosts
                         显示有hosts.allow和hosts.deny就表示接受tcpwapper的控制
           配置文件:
                  /etc/hosts.allow |hosts.deny
           格式:
                  进程列表daemon-list:client-list [:options] <--可选 多个选项有:隔开
                         sshd:192.168.1.0
           规则:
                  系统先检查allow文件再是deny文件,默认为allow
                  写服务要是可执行的二进制程序,不是服务本身 多个服务有,隔开
                         sshd,in.telnetd: 192.168.1.0| 192.168.1.
                  client-list:    可以使用ip 具体主机  网段
                                网络:长格式的 192.168.1.0/255.255.255.0
                                主机名称:www.a.com 或 a.com(前一个字符通配)
                                基于NIS域: @netexample
    tcpwarpper上的telnet:
                  telnet:  tcp  23 非独立守护进程 依赖于xinetd超级守护进程
                  区别:独立 :一旦启动将永驻内存直到关闭
                        非独立:启动慢 节省资源
                  接受xinetd管理的非独立进程:
                         /etc/xinetd.d/
                  配置:
                         yum install xinetd  telnet-server
                         service xinetd start
                         chkconfig xinetd on
                         chkconfig telnet on
                         chkconfig --list
                         service telnet restart 启动之前xinetd必须启动
                         测试: 关闭selinux
                                vim /etc/hosts
                                192.168.0.124  station124.example.com  station124
                                物理机上telnet 192.168.0.124     
                                登陆时默认root不能直接登陆 要用普通用户
                  telnet访问控制:
                                /etc/hosts.deny
                                in.telnetd: 192.168.0. 拒绝192.168.0.0网段访问该服务
                                in.telnetd: 192.168.0. EXCEPT 192.168.0.124  只允许192.168.0.0网段的124访问
                                会立即生效
                                /etc/hosts.allow 
                                in.telnetd: 192.168.0.124 只允许192.168.0.0网段的124访问
                         例子:
                                /etc/hosts.deny
                                       in.telnetd: ALL EXPECT 192.168.0.0 EXCEPT 192.168.0.3
                                              拒绝192.168.0.0网段的3访问其他允许
                  规则参数:
                         /etc/hosts.allow
                                in.telnetd: 192.168.1. :DENY 直接拒绝192.168.1.0访问
                         仅允许192.168.1.0访问:hosts.allow中定义
                                in.telnetd: 192.168.1.
                                in.telnetd: ALL:DENY
                         spawn: 子进程运行的 匹配到时不按照默认规则执行 而是安额外的命令执行 shell命令
                                in.telnetd:192.168.0.:spawn /bin/echo `date` %c %d >>/var/log/tcpwrap.log
                                %c : 来自于客户端信息
                                %d : 守护进程的名字
                                %s : 主机上的服务
                                %h :仅匹配客户端的主机名
                                %p :客户端的pid
                         twist:登陆服务将该进程时转换成发起的命令 起到禁止使用服务的功能
                                /etc/hosts.allow
                                in.telnetd:192.168.0.: twist /bin/echo "421 not connection "
                         severity 记录级别修改allow
                                默认日志记录在/var/log/sucure
                                in.telnet: ALL: severity local7.info
                                 查看在etc/syslog.conf在/var/log/boot.log中
                         banner 欢迎信息
                                in.telnetd:ALL: banners /var/tcpwapper/in.telnetd
                                文件要与服务二进制文件对应
    PAM
    https://www.cnblogs.com/ilinuxer/p/5087447.html
    https://www.jianshu.com/p/ac3e7009a764
    https://www.cnblogs.com/taosim/articles/2020984.html
    https://www.cnblogs.com/hftian/p/6944133.html
    https://www.ibm.com/developerworks/cn/linux/l-cn-ulimit/index.html
     
     
    PAM(Pluggable Authentication Modules )是由Sun提出的一种认证机制。它通过提供一些
    动态链接库和一套统一的API,将系统提供的服务 和该服务的认证方式分开,使得系统管理
    员可以灵活地根据需要给不同的服务配置不同的认证方式而无需更改服务程序,同时也便于
    向系 统中添加新的认证手段。
    PAM最初是集成在Solaris中,目前已移植到其它系统中,如Linux、SunOS、HP-UX 9.0等。

    一、PAM的结构

    PAM的整个框架结构如下图所示:


    系统管理员通过PAM配置文件来制定认证策略,即指定什么服务该采用什么样的认证方法;应
    用程序开发者通过在服务程序中使用PAM API而实现对认证方法的调用;而PAM服务模块(se
    rvice module)的开发者则利用PAM SPI(Service Module API)来编写认证模块(主 要是
    引出一些函数pam_sm_xxxx( )供libpam调用),将不同的认证机制(比如传统的UNIX认证方
    法、Kerberos等)加入到系统中;PAM核 心库(libpam)则读取配置文件,以此为根据将服
    务程序和相应的认证方法联系起来。
    二、PAM支持的四种管理界面:

    1、认证管理(authentication management)
    主要是接受用户名和密码,进而对该用户的密码进行认证,并负责设置用户的一些秘密
    信息。
    2、帐户管理(account management)
    主要是检查帐户是否被允许登录系统,帐号是否已经过期,帐号的登录是否有时间段的
    限制等等。
    3、密码管理(password management)
    主要是用来修改用户的密码。
    4、会话管理(session management)
    主要是提供对会话的管理和记账(accounting)。
    nns负责名称解析,认证的过程是pam来处理。2套系统是独立运行的。

    认证本身也可以不借用nss,自己去找对应的解析库。


    以用户登陆为例:
        用户名的解析 :
            USERNAME--> nsswitch.conf --> passwd : file--> /etc/passwd 

        密码的解析:
            PASSWORD --> nsswitch.conf --> shadow : file --> /etc/shadow

        认证:
            USERNAME -->compare (通过和解析到的用户名进行比较)
            PASSWORD --> md5(salt ) -->compare(通过和解析到的密码进行比较)

    认证的手段:
        md5
        mysql 
        ldap
        nis
        kerberos

    pam:
        中间层,和nss类似。通过库文件为应用程序认证提供手段。

        库文件:
            /lib/security/*
            /lib64/security/*


        栈(stack):
            用来提供pam验证过程中不同的功能。

            auth 检查用户输入的账号密码是否匹配
            account 审核用户账号是否在有效期内
            password 用户修改密码时检查修改这个动作动作是否被允许
            session 设定会话的相关属性



        配置文件:
            /etc/pam.conf 主配置文件,默认不存在。
                格式如下:
                    SERVERNAME TYPE CONTROL MODPATH MODARGS

            /etc/pam.d/* 各个服务的配置文件
                格式如下:
                    TYPE  CONTROL MODPATH MODARGS

                注意:other 这个文件使用来定义默认规则的。程序在认证的时候会先找到自己的配置文件,若无任何匹配和结果,则会使用other来认证。

            配置文件详解:
                SERVERNAME:服务二进制程序的文件名,必须全部小写。
                TYPE: stack的类型
                CONTROL:
                    返回值对应的处理动作。
                    格式为[VALUE1=ACTION1 VALUE2=ACTION2 ...]

                    VALUE
                        success 成功
                        ignore 忽略
                        default 失败

                    ACTION:
                        ok 此模块通过,继续检测
                        done 此模块通过,返回最终结果给应用程序
                        bad 此模块没通过,继续检测
                        die 此模块没通过,返回最终结果给应用程序
                        ignore 忽略结果
                        reset 忽略此前的所有结果,进行最终检查
                    
                    处理动作的组合很多,有部分固定组合的可以使用以下几个替代:

                    required
                        有一票否决权,若匹配不通过则不通过。交给同stack中其他模块的进行匹配。
                        success=ok new_authtok_reqd=ok ignore=ignore default=bad

                    requisite
                        绝对一票否决,若匹配不通过则不通过,不进行本stack中的后续匹配。
                        success=ok new_authtok_reqd=ok ignore=ignore default=die

                    sufficient
                        绝对一票确定,若通过匹配则通过,后续不需要匹配。若匹配失败则继续进行后续匹配
                        success=done new_authtok_reqd=ok default=ignore

                    optional
                        陪衬性质,无实质作用
                        success=ok new_authtok_reqd=ok default=ignore

                    include
                        将判定的权利移交其他指定库文件,自己不做判定。

                MODPATH 模块路径:
                    MODNAME.so
                    默认相对路径,相对于/lib/security/和/lib64/security/。若是其他路径则钥匙用绝对路径。

                            pam_unix.so 传统的密码验证,使用md5方式验证。
                                nullok
                                shadow
                                md5
                                
                            pam_permit.so 总是允许访问,并没有什么作用

                            pam_deny.so 用来拒绝访问,通常用在other当中

                            pam_cracklib.so  依据字典来检查密码,用在用户修改密码使验证弱口令
                                minlen 密码的最小长度
                                difok 密码是否和以前相同
                                dcredit=NUM 密码中要包含的数字位输
                                ucredit=NUM 密码中包含大写字母位数
                                lcredit=NUM 密码中包含小写字母位数
                                ocredit=NUM 密码中包含特殊字符的位数
                                retry=NUM 重试次数为NUM次

                            pam_shell.so 用户登录时检测合法登陆shell,只能使用/etc/shells中有存在的shell登陆

                            pam_securetty.so 限定root用户只能通过限定的shell登陆,限定的文件为/etc/securetty。

                            pam_listfile.so 到指定的文本文件中验证用户是否可以登陆
                                    item =tty|user|rhost|ruser|group|shell  文件条目的类型
                                    sense=allow|deny 
                                    file=FILE
                                    onen=successd|fail 一旦出现错误的处理机制,例如文件不存在或者是选项有错误。如果设定为successd,则返回PAM_SUCCESS,若设定为fail,则返回PAM_AUTH_ERR或者是PAM_SERVICE_ERR。 
                                    apply=user|@group
                                    quiet

                            pam_rootok.so 只要uid=0直接通过

                            pam_limits.so 在一次用户会话中,能使用的资源数的限定。默认情况下使用配置文件/etc/security/limits.conf和/etc/security/limits.d/*.conf进行限定。普通用户只能调整软限定。临时调整使用#ulimit命令完成。

                            pam_env.so 设置或撤销环境变量的。默认配置文件在/etc/security/pam_env.conf。也可以编辑/etc/enviroment。

                            pam_while.so 限定哪些用户可以su到root。只有在wheel组中的用户可以切换root。

                            pam_time.so 根据时间限定登陆。配置文件/etc/security/time.conf。
                                格式为:
                                    SERVICENAME;TTYS;USERS;TIMES

                MOADARGS 模块的参数:
                    try_first_pass 若此前用户已输入过密码,则再次验证时尝试使用使用上次输入过的密码

                    use_first_pass 直接使用用户以前输入的密码

                    shadow 使用shadow方式读取或写入密码

                    md5 加密方式为md5
                    sha256 加密方式为sha256
                    sha512 加密方式为512

                    nullok 允许为空。默认情况下是禁止密码为空。

                    use_authok 当密码修改的时候强制使用指定模块中设定的密码

    Nsswitch服务

    nsswitch简介

    nsswitch全称为: network service switch,其是一个通用框架,与各种类型存储交互的公共实现,实现名称解析服务. 例如: 用户名到ID,或者ID到用户名,再或者IP到域名的查找方式. nsswitch加载了各存储的api接口,并以模块方式装载进nsswitch中,当程序发起nsswitch的api调用时,ns会自动完成到各存储中查找内容.

    nsswitch的各种与存储连接的模块

    /usr/lib64/libnss*
    /lib64/libnss*
    libnss_files-2.17.so库文件就是实现查找文件时, 其应该调用的库文件
    nsswitch的配置文件

    /etc/nsswitch.conf
    定义格式为:
    passwd: files sss
    解析库的类型:

    文件
    关系型数据库管理系统
    NIS
    LDAP
    DNS
    查找结果的状态

    Success : 成功
    Notfound : 文件存在,但没有找到记录
    anavail : 服务不可用
    tryagain : 重试
    每个状态结果的行为(action)
    return : 返回
    continue : 继续找下一个
    示例:
    hosts: files nis[notfound=return] dns

    只要nis服务存在,就会执行return,只有nis服务不可用的时候, 才会再找dns服务
    getent命令

    从nisswitch库中查找记录

    使用格式: getent database [key]
    示例:
    getent passwd root : 到/etc/passwd文件中查找root用户,并返回文件中的记录
    getent passwd 0 : 到/etc/passwd文件中查找ID为0的用户,并返回文件中的记录

    作者:魏镇坪
    链接:https://www.jianshu.com/p/bb3d1f6f6f3b
    來源:简书
    简书著作权归作者所有,任何形式的转载都请联系作者获得授权并注明出处。

     
  • 相关阅读:
    图文详解 Android Binder跨进程通信机制 原理
    支链氨基酸怎么吃
    C#泛型约束
    树状结构 Tree data structure in C#
    wrap ConcurrentDictionary in BlockingCollection
    ConcurrentBag扩展 批量加入
    Dictionary GetOrAdd
    ConcurrentDictionary AddOrUpdate
    object pool
    C# 结构体定义 转换字节数组 z
  • 原文地址:https://www.cnblogs.com/aftree/p/9381114.html
Copyright © 2011-2022 走看看