一文搞懂PAM对linux访问控制原理


1.虚拟终端

我们知道linux是一个多用户多任务类型的操作系统。在linux中的登录终端通常是虚拟终端,除了虚拟终端之外,还有伪终端,串联终端以及设备终端等等,终端清单在/etc/securetty中呈现。在此文件中不难发现linux系统为我们提供的12种虚拟终端,但是我们默认能访问的只有6个终端?这是因为虚拟终端的开放是受/etc/systemd/logind.conf文件控制的,该文件用于控制systemd-logind.service登录管理器的行为。

详见:
http://www.jinbuguo.com/systemd/logind.conf.html 译。

[root@bogon ~]# cat  /etc/systemd/logind.conf 
#  This file is part of systemd.
#
#  systemd is free software; you can redistribute it and/or modify it
#  under the terms of the GNU Lesser General Public License as published by
#  the Free Software Foundation; either version 2.1 of the License, or
#  (at your option) any later version.
#
# Entries in this file show the compile time defaults.
# You can change settings by editing this file.
# Defaults can be restored by simply deleting this file.
#
# See logind.conf(5) for details.

[Login]
#NAutoVTs=6  #表示默认最多可以自动启动多少个虚拟终端。注意,ReserveVT= 中的虚拟终端 总会被自动启动, 即使这些终端并不在 NAutoVTs= 的范围内。
#ReserveVT=6   #表示无条件的为该终端从 autovt@.service 模版实例化一个服务单元
#KillUserProcesses=no 
#KillOnlyUsers=
#KillExcludeUsers=root
#InhibitDelayMaxSec=5
#HandlePowerKey=poweroff
#HandleSuspendKey=suspend
#HandleHibernateKey=hibernate
#HandleLidSwitch=suspend
#HandleLidSwitchDocked=ignore
#PowerKeyIgnoreInhibited=no
#SuspendKeyIgnoreInhibited=no
#HibernateKeyIgnoreInhibited=no
#LidSwitchIgnoreInhibited=yes
#IdleAction=ignore
#IdleActionSec=30min
#RuntimeDirectorySize=10%
#RemoveIPC=no
#UserTasksMax=

2.限制用户登录

2.1PAM可插拔身份认证模块

可插拔身份认证模块(Pluggable Authentication Module,PAM)主要作用于管理工具和相关命令。PAM包含了一组动态可加载的库模块,这些模块控制单个应用程序如何验证用户。可修改PAM配置文件,为不同管理使用工具自定义安全要求。

2.1.1 配置文件

一般的,PAM配置文件都保存在/etc/pam.d目录里。

大多的情况下,一个配置文件将在对应一个PAM模块。这些模块大多在/usr/lib64/security下。在
/usr/share/doc/pam-1.1.8/txts/以及html子目录下是每个模块的详细描述。

配置文件的第一列:type,表示服务类型

第二列:control_flag,控制标记

第三列:module_name,模块名

第四列:[arguments],参数(可选)

2.1.2 控制标记

PAM提供了4种不同类型的服务:

身份验证管理(auth):验证用户身份。例如,PAM auth规则验证用户是否提供了有效的用户名和口令凭证。

账户管理(account):依据账户策略允许或拒绝访问。例如,PAM account规则可依据时间,口令有效期限或者受限用户的列表来拒绝访问。

口令管理(password):管理口令变更的策略。例如,PAM password规则可以强制用户试图变更口令时需要输入的口令的最小长度。

会话管理(session):将设置应用于引用程序会话。例如,PAM session 规则可设置登录控制台的默认设置

控制标签确定模块成功或者失败,PAM该怎么办。

以running配置文件为例:

[root@localhost security]# cat /etc/pam.d/runuser
#%PAM-1.0
auth        sufficient  pam_rootok.so
#auth检查pam_rootok.so模块,若根用户运行runner命令,该规则将通过并且会执行runner命令。因为#control_flag是sufficient。

session     optional    pam_keyinit.so revoke
#当退runuser进程时,清除该进程的会话秘钥环,control_flag是optional,意味着该规则的结果不会影响其他#session规则

session     required    pam_limits.so
#在runuser程序的实例运行时,设置在/etc/security/limits.conf中定义的资源限制。因为control_flag是#required,所以如果不设置限制就会导致命令会话失败。

session     required    pam_unix.so
#pam_unix.so模块记录每个命令会话在开始和结束时的用户名和服务类型。

2.2 PAM模块控制

2.2.1 基于pam_securetty.so模块控制

对于本地访问的控制通常是在/etc/securetty文件中,它默认包含11个虚拟控制台的访问指令。

etc/securetty文件指定了允许root登录的tty设备,由/bin/login程序读取。

Centos7系统默认开启6个虚拟终端,均容许root本地登录。为了安全起见,如何对本地的root用户 登录做限制?

/etc/securetty文件中列出的虚拟控制台确定根管理用户可以登录的控制台。如果让该文件中的指令以注释的形式存在,管理员将无法直接登录到根账户。此时必须 登录到一般账户,使用su或sudo命令进行管理。

注意:若置空该文件,则禁止任何终端root访问;若删除该终端,则容许任何终端root访问。




示例 1-1:修改本地访问控制列表限制root本地登录

实验条件:(1) 确保root用户可以登录到虚拟终端1到6上的标准控制台

(2) 确保系统上有普通用户可登录

实验环境: centos7u4 最小化安装

实验目的:(1) 验证本地访问控制列表文件/etc/securetty文件置空,将使得各终端root用户无法登录。

(2) 验证删除本地访问控制列表文件/etc/securetty文件,所有终端均可root登录。

(3) 验证只有存在于访问控制列表文件/etc/securetty文件中的虚拟终端,方可容许root登录。

实验步骤与过程:

(1)登录系统,确保开放的所有终端(centos7 默认1-6)切化正常(切换方法Ctrl+Alt+F1,F2,...,F6),且能root访问。

(2)备份/etc/securetty文件,并将全文注释

[root@localhost ~]# cp -p /etc/securetty{,.bak}
[root@localhost ~]# vim /etc/securetty
:% s/^/#/g    #vim的末行模式注释全文

(3)退出6个终端,重新root用户登录。在普通用户登录后,执行su - root 。

(4)删除/etc/securetty该文件

[root@localhost ~]# rm -rf /etc/securetty

(5)退出6个终端,重新root用户登录。在普通用户登录后,执行su - root 。

(6)从备份恢复/etc/securetty该文件

[root@localhost ~]# cp -p /etc/securetty.bak securetty

(7)修改/etc/securetty文件,保留tty1,其余注释。

(8)退出6个终端,重新root用户登录。在普通用户登录后,执行su - root 。

实验结论:

(1)实验第(3)步骤中6个终端,root均不可登录,只能普通用户通过su - root切换

(2)实验第(5)步骤中6个终端,root,普通用户均可登录。

(3)实验第(8)步骤中6个终端,只有tty1可接受root登录,其余终端均不能root登录,只能普通用户登录后 su - root切换。




2.2.1 基于pam_listfile.os模块控制

用PAM来限制访问指定用户,这种安全特性的关键是pam_listfile.os模块。

比如安装了vsftpd服务器,在/etc/pam.d/vsftpd文件就包含了该模块。

[root@localhost ~]# vim /etc/pam.d/vsftpd 
#%PAM-1.0
session    optional     pam_keyinit.so    force revoke
#在会话关闭时将初始化和清除任何现有的秘钥环

auth       required     pam_listfile.so item=user sense=deny file=/etc/vsftpd/ftpusers onerr=succeed
#控制用户登录的方式:
#item:限制对终端(tty)、用户(user)和组(group)等的访问。
#sense:在File中有用,指定File指定的文件是白名单还是黑名单,有allow和deny两个值。
#File:文件路径,列出用户,组等。
#onerr:如果有问题,则告诉模块怎么做,有succeed和fail两个值。

auth       required     pam_shells.so
auth       include      password-auth
account    include      password-auth
session    required     pam_loginuid.so
session    include      password-auth




实例 2-1:使用PAM限制用户访问

通过PAM可以对用户的访问做控制,提高系统安全性。可以使用PAM系统pam_nologin.so模块来限制访问所有的一般用户,亦可以使用pam_listfile.so模块制作用户的黑白名单,来控制部分用户的访问。

实验条件:

(1)系统上存在至少三个普通用户。

(2) 在现有的虚拟终端上,root和普通用户登录正常。

实验环境:centos7u4 最小化文本安装

实验目的:

(1)使用pam_nologin.so模块控制普通用户本地登录

(2)使用pam_listfile.so模块制作用户的黑白名单,来控制部分用户的访问。

实验步骤:

(1)在/etc/pam.d/login文件中添加以下内容:

account    required     pam_nologin.so

(2)在创建文件/etc/nologin:

[root@localhost myuser]# vim /etc/nologin 
#
sorroy,you are not root...

(3)返回到虚拟终端上,分别用root用户,普通用户登录。

(4)注释(2)添加的内容,再添加一下内容:

auth       required     pam_listfile.so item=user sense=deny file=/etc/myuser/user onerr=succeed

(5)创建文件/etc/myuser/user,并写入两普通用户,例如:test01,test02

(6)返回到虚拟终端,分别用root账号,test01账号,test02账号,和另外的账号比如test03登录。

实验结论:

(1)实验第(3)步骤中,root用户可正常登录,普通被拒绝登录。但是同时都提示“sorroy,you are not root...”。

(2)实验第(6)步骤中,root用户,test03用户都登录正常,test01,test02用户则不能登录。是因为test01,test02在黑名单列表中。




2.2.2 基于pam_access.so模块控制

一般的,/etc/securetty文件控制的是root的登录终端。比此文件更强大的是/etc/security/access.conf文件,他控制所有用户的访问以及访问位置。

为了使用access.conf,必须在文件/etc/pam.d/login中加入下面行:

account required pam_access.so

access.conf文件的格式:

permission : users : origins
其中:
  permission:可以是 “+”或”-”,表示允许或拒绝。
  user:可以是用户名、用户组名,如果是all则表示所有用户。
  origins:登录地点。local表示本地,all表示所有地点,console表示控制台。另外,origins也可以是某一网络。
  后面两个域中加上 except是”除了”的意思。例如:除了用户wheel、shutdown、sync禁止所有的控制台登录:
  -:ALL EXCEPT wheel shutdown sync:console

root账户的登录地点不在access.conf文件中控制,而是由/etc/securetty文件控制。




示例 2-2:配置用户访问控制

实验条件:

(1)系统上存在至少两个普通用户,例如test01,test02。

(2) 在现有的虚拟终端上,root和普通用户登录正常。

实例环境:centos7u4 最小化文本安装

实验目的:

(1)验证pam_access.so模块对用户访问控制

(2)验证pam_access.so模块对用户访问位置的控制

实验步骤:

(1)在/etc/pam.d/login中添加以下行:

account    required     pam_access.so

(2)修改access.conf文件:添加一下字段(注意实际添加是去掉注释)

+:root:ALL #root从任意位置连入系统
+:test01:192.168.42.  #test01只能从192.168.42这个网段连入
-:ALL:ALL #其余DENY

(3)在/etc/pam.d/sshd中添加以下行:

account    required     pam_access.so

(4)分别以root,test01,test02在192.168.42.1的终端,以及虚拟终端上登录。

实验结论:

(1)root可从任何虚拟终端,伪终端登录系统。

(2)test01只能存在于192.168.42.1上的ssh客户端登录系统。

(3)test02在任意的虚拟终端,伪终端上不能登录系统。




练习:

(1)限制test01用户至多3-1次ssh登录系统。

提示:在/etc/security/limits.conf ,加入redhat – maxlogins 3,然后 # vi /etc/pam.d/sshd,加入这一行session required pam_limits.so

(2)限制test01用户每星期二晚上22:00-22:30不能使用SSH来login系统。

提示:在/etc/security/time.conf加入以下一行sshd;*;redhat;!Tu2200-2230,在vi /etc/pam.d/sshd 加入以下一行,account required pam_time.so

原文链接:,转发请注明来源!