Chinaunix首页 | 论坛 | 博客

分类: LINUX

2009-01-18 13:46:37

  PAM 模组:/etc/nologin, /etc/securetty

  当一个使用者想要登入 Linux 主机时,他受到什么限制呢?我们说, 他除了必须要通过 /etc/passwd 及 /etc/shadow 的验证并取得相关的权限资料, 最后获得一个 shell 之外,事实上,他在登入系统之前,就得要通过 PAM (Pluggable Authentication Modules, 嵌入式模组) 的验证才行。

  PAM 模组的用途非常的多,除了可以在使用者登入时进行身份的验证之外, 也可以辅助一些应用程式的验证之用喔!举例来说,我们前面提到的密码修改程式‘ passwd ’ ,当我们执行密码修订的时候,这个程式不是会告诉我们您输入的密码是否合于规范吗? 如果是记录在字典当中的密码,或者是与帐号相同的密码,那么就会被 PAM 模组打回票, 也就无法通过验证了!

  那么 PAM 怎么运作呢?我们同样以 /usr/bin/passwd 这支程式来作为简单的说明好了:

  1. 使用者开始执行 /usr/bin/passwd 这支程式,并输入密码;
  2. passwd 开始呼叫 PAM 模组,PAM 模组会搜寻 passwd 程式的 PAM 相关设定档案, 这个设定档一般是在 /etc/pam.d/ 里面的与程式同名的档案,所以,在本例中, PAM 会去搜寻 /etc/pam.d/passwd 这个设定档;
  3. 经由 /etc/pam.d/passwd 设定档的资料,取用 PAM 所提供的相关模组来进行验证;
  4. 将验证结果回传给 passwd 这支程式,而 passwd 这支程式会根据 PAM 回传的结果决定下一个动作 (重新输入新密码或者通过验证!)

  这个过程提供我们几个重要的资讯:

  * PAM 的设定档放置在 /etc/pam.d/ 这个目录中;
  * 至于更多的环境相关设定则放置在 /etc/security/* 内;
  * PAM 是透过自己提供的相关模组来进行验证,模组放置在 /lib/security/* 内。

  至于 PAM 相关模组的运作,有兴趣的话,您可以前往您 Linux 主机的: /usr/share/doc/pam* 目录去瞧一瞧,里面有相当多丰富的资讯可以提供给你参考。 我们这里仅就使用者登入相关的模组来进行一些简单的说明而已喔。

  # PAM 的设定档设定范例:
  反正 PAM 模组就是让程式呼叫用的,而当程式呼叫时, PAM 就会利用相对应的设定档来进行一些验证就是了。我们还是举 passwd 为例好了, 如果你去观察一下 /etc/pam.d/passwd 的内容时,他是这样的:

  [root@linux ~]# cat /etc/pam.d/passwd
  #%PAM-1.0
  auth       required     pam_stack.so service=system-auth
  account    required     pam_stack.so service=system-auth
  password   required     pam_stack.so service=system-auth

  基本上,在这个档案内,每一行都是一个动作,而每个动作都分为四个栏位,分别是:

  验证的类别   验证的控制标准   使用的PAM模组   该模组的能使用的参数

  验证的类别 (Module type) 共分为四种类,分别说明:

  * auth
  这种类别主要用来检验使用者的身份验证,所以这种类别通常是需要密码来检验的。

  * account
  这种类别则主要在检验使用者是否具有正确的使用权限,举例来说,当你使用一个过期的密码来登入时, 当然就无法正确的登入了。

  * session
  这种类别主要在管理当使用者正确的使用该程式时的环境设定。举例来说,我们登入 Linux 其实使用的是 /bin/login 这个程式的相关功能的,所以,当实际登入后,在操作 shell 的过程中,都是受 session 这种类别的设定所控制的喔!另外,如果使用 session 这种类别时, 则该程式在正式使用之前与使用结束之后,都会有相关纪录被记到登录档当中喔!

  * password
  至于这种类别,则主要在提供验证的修订工作,举例来说,就是修改/变更密码啦!

  那么‘验证的控制标准(control flag)’又是什么?简单的说,他就是‘验证通过的标准’啦! 总共也有四种方式,分别是:

  * required
  当模组设定为这种控制标准时,该模组的验证必须要成功,否则就会回传一个 failure 的讯息。 不过,不论此一动作的模组是否成功,接下去的模组都还会继续动作! 而若有 failure 的讯息时,也会在后续的动作都进行完毕之后,才会回传给原程式。 比底下的 requisite 还要优秀的地方,在于该模组底下的动作可能具有登录档纪录 (log) 的举动,则错误的讯息才会被纪录起来喔!

  * requisite
  当模组设定为 requisite 时,该模组的认证要求同样的需要成功才行。 不过,如果该模组没有通过验证,那么 PAM 会‘立刻’回报程式一个 failure 的值, 也就是说,若该次动作的模组后续还有其他模组时,其他模组的动作将不会被启用。

  * optional
  这个模组控制项目大多是在显示讯息而已,并不是用在验证方面的。

  * sufficient
  这个模组控制标准也挺有趣的,相对于 requisite 是‘发生错误时,立刻回报原执行程式 failure , 并且中断 PAM 的运作’, sufficient 则是‘顺利通过验证时,立刻回报原程式通过的讯息, 并且中断 PAM 的运作’。呵呵!完全相反喔!

  至于 PAM 的模组方面,目前我们的 FC4 提供的 PAM 模组真的够多了, 这些模组实际上都放置在 /lib/security/ 目录中,FC4 相关的 PAM 说明文件则放置在 /usr/share/doc/pam-*/* 里面,您可以根据每个不同的模组去讨论他的用途, 鸟哥在这里仅针对我们登入时所使用的 login 这个程式的 PAM 设定档,也就是 /etc/pam.d/login 这个档案的内容来稍做说明:

  [root@linux ~]# cat /etc/pam.d/login
  #%PAM-1.0
  auth       required    pam_securetty.so
  auth       required    pam_stack.so service=system-auth
  auth       required    pam_nologin.so
  account    required    pam_stack.so service=system-auth
  password   required    pam_stack.so service=system-auth
  # pam_selinux.so close should be the first session rule
  session    required    pam_selinux.so close
  session    required    pam_stack.so service=system-auth
  session    optional    pam_console.so
  # pam_selinux.so open should be the last session rule
  session    required    pam_selinux.so multiple open

  在我们登入 Linux 的时候,使用到的 login 这个程式时,他使用的 PAM 设定档大多是 required 的控制标准,所以必须要通过上述的几个 PAM 模组的验证后,才能够判定是否登入 Linux 。 需要留意的是,我们会看到 session 的模组类型,这表示我们在实际使用 Linux 的资源之前,以及登出 Linux 主机后,相关的资料都会被纪录到登录档当中。 嘿嘿!所以啰,如果您仔细的看过 /var/log/messages 与 /var/log/secure , 就能够发现你的一举一动其实是有被纪录下来的喔! ^_^

  另外,在上面表格当中的模组中,比较有趣的是被鸟哥注明特殊字体的部分, 这两个模组: pam_securetty.so 及 pam_nologin 是挺有趣的喔! 我们就额外来谈一谈这两个关于登入环境的验证模组吧!

  # /etc/securetty
  这个 pam_securetty 模组是干嘛用的?其实他最主要的功能就是在预防不安全的登入环境啦! 而且主要是针对 root 这个使用者的身份喔! 这个模组在被启用时,会去读取 /etc/securetty 这个档案, 我们‘可以将被认定是安全的终端机 (terminal) 环境写入这个档案中, 则 root 仅可以在那几个终端机环境下登入’的啦!

  一般来说,我们会认定在主机前面的环境是安全的,而使用网路登入的环境则比较危险。 因此,一般 /etc/securetty 的内容大多是这样:

  tty1
  tty2
  tty3
  tty4
  ...

  而没有 pts/0 这类的网路登入的终端介面。这也就是说, root 仅能经由 tty1 这种终端机登入的啦!支援 login 程式的软体有 telnet 服务与本机前面的 tty1~tty6 的 login, 这也是我们提到的,为何使用传统的 telnet 连线主机连线到 Linux 时,预设无法使用 root 身份登入的主要原因啰。

  那么如何克服呢?其实也很简单啦,就将这个模组的验证移除即可! 主要有两种方式:

  * 将 /etc/pam.d/login 内,关于 pam_securetty.so 模组的那一行注解掉;
  * 将 /etc/securetty 这个档案移除。

  如此一来,当我们使用 telnet 连线到 Linux 主机时,就能够直接使用 root 的身份登入了。 不过,鸟哥不建议这么做喔!不过或许您又会问啦,那为什么我使用 ssh 连线时, 就可以直接使用 root 登入呢?呵呵!这是因为 ssh 没有用到这个模组ㄇㄟ! 不相信吗?仔细自己去查阅一下 /etc/pam.d/sshd 就知道啦! ^_^。

  # /etc/nologin
  那么 pam_nologin 又是在搞什么咚咚啊?其实,这个模组也是在控制使用者登入用的。 不过,这个模组只针对一般身份使用者有效,对 root 是没有效果的。这个模组必须要与 /etc/nologin 搭配使用,注意喔,是 /etc/nologin ,而不是 /etc/nologin.txt , 这两个档案的用途是不相同的喔! ^_^。

  当 /etc/nologin 档案存在时,则任何一个一般身份帐号在尝试登入时, 都仅会获得 /etc/nologin 内容的资讯,而无法登入主机。举例来说,当我建立 /etc/nologin ,并且内容设定为‘This Linux server is maintaining....’, 那么任何人尝试登入时,都仅会看到上面提到的这段讯息,而且无法登入喔! 一直要到 /etc/nologin 被移除后,一般身份使用者才能够再次的登入啊!

  # /etc/security/*
  事实上,更多的 PAM 模组设定资讯您可以参考 /etc/security/* 里面的档案设定, 尤其是针对使用者利用 Linux 系统资源的 limits.conf 以及时间的 time.conf 。 我们知道使用者利用系统资源的指令是 ulimit ,那么假如我想要让 dmtsai 仅能存取 10MBytes (10240KBytes) 的档案大小,那么我可以这样做:

  [root@linux ~]# vi /etc/security/limits.conf
  # 新增这两行
  dmtsai          hard    fsize   10240
  @users          hard    fsize   10240
  # 注意到,帐号前面加上 @ 表示为‘群组!’

  那么下次 dmtsai 或者是属于 users 的群组的使用者登入这个 Linux 主机时, 你可以利用 ulimit -a 去察看一下,嘿嘿!他们能用的资源就减小很多了! 更多的用法您可以自行参考一下该档案内的说明啊! ^_^ (记得测试完毕要将资料改回来~否则....以后就麻烦了!)

阅读(2290) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~