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