目录
一、系统安全的加固
1、账号安全的基本措施
1.1 将用户设置为无法登录
操作:将用户的Shell设为/sbin/nologin,就能让该用户无法登录
shell——/sbin/nologin比较特殊,所谓“无法登陆”指的仅是这个用户无法使用bash或其他shell来登陆系统而已,并不是说这个账号就无法使用系统资源
usermod -s /sbin/nologin 用户名 #将非登录用户的shell设为/sbin/nologin
1.2 锁定长期不使用的账号
passwd -l 用户名 #锁定用户账号密码
passwd -u 用户名 #解锁用户账号密码
passwd -S 用户名 #查看用户账号状态
1.3 删除无用的账号
userdel -r 用户名 #删除用户账号
1.4 锁定账号文件passwd、shadow
lsattr /etc/passwd /etc/shadow
#显示 /etc/passwd 和 /etc/shadow 文件的扩展属性,如是否设置了不可更改 (i)、不可删除 (d) 等属性
chattr +i /etc/passwd /etc/shadow #锁定配置文件,所有用户不能修改
chattr -i /etc/passwd /etc/shadow #解锁配置文件
2、密码安全控制
2.1 设置密码有效期
2.1.1 适用于新建用户
vim /etc/login.defs #在/etc/login.defs配置文件里设置
2.1.2 适用于已有用户
chage 选项 用户名
选项 | 说明 |
---|---|
-m | 密码可更改的最小天数,为零时代表任何时候都可以更改密码 |
-M | 密码保持有效的最大天数 |
-w | 用户密码到期前,提前收到警告信息的天数 |
-E | 帐号到期的日期。过了这天,此帐号将不可用 |
-d | 上一次更改的日期 |
-i | 停滞时期。如果一个密码已过期这些天,那么此帐号将不可用 |
-l | 列出当前的设置。由非特权用户来确定他们的密码或帐号何时过期 |
2.2 强制用户下次登录一定修改密码
chage -d 0 用户名 #强制用户下次登录一定修改密码
3、历史命令限制
3.1 临时清除历史指令
history -c #临时清除历史指令
3.2 开机后清除
vim ~/.bashrc
#将清除历史命令写入配置文件中,该文件的修改只会影响到当前用户,即开机后清除,只对当前用户有效
echo " " >~/.bash_history
#开机之前先运行:将空格重定向至~/.bash_history文件中,即清空
3.3 用户退出后清除
vim ~/.bash_logout
#将清除历史命令写入配置文件中,该文件的修改只会影响到当前用户,即退出该用户后清除,只对当前用户有效
echo " " >~/.bash_history
#开机之前先运行:将空格重定向至~/.bash_history文件中,即清空
3.4 终端自动注销
vim /etc/profile #所有用户生效
export TMOUT=60 #设置超时时间,用户闲置后注销
3.5 减少记录的命令条数
vim /etc/profile #所有用户生效
export HISTSIZE=50
#设置最多只记录50条历史命令,export设置环境变量,HISTSIZE历史命令记录条数
4、切换用户
4.1 su
用于切换用户身份的命令
切换用户的方式:
- su UserName:非登录式切换,即不会读取目标用户的配置文件,不改变当前工作目录,即不完全切换
- su - UserName:登录式切换,会读取目标用户的配置文件,切换至自已的家目录,即完全切换
注:管理员用户切换至其他用户无须密码,非管理员用户切换时需要密码
在pam模块中, 主要有pam_ rootok.so和pam_ wheel.so两个模块组合限制用户使用su命令
vim /etc/pam.d/su #打开su的PAM配置文件
注:
- 默认情况下第一行开启、第二行注释:root使用su切换普通用户就不需要输入密码,允许所有用户间使用su命令进行切换
- 两行都注释:允许所有用户都能使用su命令,但root下使用su切换到其他普通用户需要输入密码
- 开启两行:只有root用户和wheel组内的用户才可以使用su命令,whell组是超级管理员的组
- 第一行注释、第二行开启:表示只有wheel组内的用户才能使用su命令,root用户也被禁用su命令,root属于root组
4.2 sudo
4.2.1 概述
sudo
命令允许普通用户以超级用户(root)的身份来执行特定的命令。这是一种安全的方式,可以限制普通用户在系统上执行特权操作的能力
4.2.2 sudo的特性
-
sudo能够授权指定用户在指定主机上运行某些命令。如果未授权用户尝试使用 sudo,会提示联系管理员
-
sudo提供了丰富的日志,详细地记录了每个用户干了什么。它能够将日志传到中心主机或者日志服务器
-
sudo使用时间戳文件来执行类似的“检票”系统。当用户调用sudo并且输入它的密码时,用户获得了一张存活期为5分钟的票
-
sudo的配置文件是sudoers文件,它允许系统管理员集中的管理用户的使用权限和使用的主机。它所存放的位置默认是在/etc/sudoers,属性必须为0440
4.2.3 提权操作
用户提权操作
①原本mimi用户作为普通用户无法挂载
②在/etc/sudoers里添加mimi用户可以使用挂载光盘的命令操作
visudo:推荐使用,自带语法检查功能
注:
输入的命令要与配置文件里添加的命令一致,否则不能识别
③如果普通用户使用sudo命令时不想进行密码验证,需取消密码验证功能,可在配置文件里加上NOPASSWD:
用户组提权操作
%yun ALL= NOPASSWD:/usr/bin/cat /var/log/m*,!/usr/bin/cat /var/log/m* *
此命令代表yun用户组成员只能同时查看一个文件,而不能同时查看多个文件
其中!代表取反,不能执行此命令
,表示可添加多个命令,中间用逗号隔开
4.2.4 别名
sudo别名有四种类型:
-
User_Alias(用户)
-
Runas_Alias(代表用户)
-
Host_Alias(登录主机)
-
Cmnd_Alias(命令)
别名格式:必须大写字母,数字可以使用但是不能放在开头
Host_Alias MYHOSTS = localhost
User_Alias MYUSERS = dh,mimi
Cmnd_Alias MYCMNDS = /usr/bin/*
MYUSERS MYHOSTS=NOPASSWD:MYCMNDS
4.2.5 子目录
可以创建单独的文件来配置sudo
命令的行为,这样可以更好地组织和管理sudo
的权限设置。每个文件中可以包含针对特定用户或用户组的特权配置,这样就可以更灵活地管理sudo的权限
①在/etc/sudoers.d/目录下,建一个专属于单个用户mimi的配置文件
二、PAM安全认证
1、概述
PAM(Pluggable Authentication Modules,可插拔认证模块)是一种在 Unix-like系统中实现身份验证的框架。PAM 允许系统管理员通过配置不同的模块来定义用户身份验证过程,包括密码验证、指纹识别、智能卡等。这种模块化的方法使得系统管理员可以根据需要定制认证过程而无需修改应用程序本身。
在 Linux 中,PAM 用于处理各种认证任务,包括用户登录、密码更改、账号管理等。PAM 的配置文件通常位于 /etc/pam.d/
目录下,每个应用程序或服务都有一个对应的 PAM 配置文件。这些文件定义了认证过程中使用的模块以及它们的顺序和参数。
2、pam相关文件
-
包名: pam
rpm -qi pam #查看当前系统pam
*******************************************
rpm -ql pam #查看模块
-
模块文件目录:/lib64/security/*.so
ls /usr/lib64/security/*.so|wc -l
#统计共有多少个模块文件
-
特定模块相关的设置文件:/etc/security/
man 8 模块名 #可以查看模块的帮助信息
-
应用程序调用PAM模块的配置文件
主配置文件:/etc/pam.conf,默认不存在,一般不使用主配置
为每种应用模块提供一个专用的配置文件:/etc/pam.d/APP_NAME
注:如/etc/pam.d存在,/etc/pam.conf将失效
3、pam工作原理
①应用程序调用PAM库: 当一个应用程序需要进行身份验证(比如用户登录、密码更改等)时,它会调用PAM库,请求进行认证
②PAM配置文件: PAM 的配置文件通常位于 /etc/pam.d/
目录下。每个应用程序或服务都有一个对应的 PAM 配置文件。这些配置文件定义了认证过程中使用的模块以及它们的顺序和参数
③PAM模块堆栈: PAM 模块被组织成一个堆栈,应用程序的 PAM 配置文件指定了这个堆栈中模块的顺序。当进行身份验证时,PAM 将按照指定的顺序调用每个模块,并根据模块的返回状态来决定认证的成功或失败
④模块执行: 在堆栈中,每个模块都有特定的任务,比如密码验证、账号检查等。PAM 框架会将相应的用户提供的信息传递给每个模块,模块则根据配置的规则进行相应的认证操作
⑤返回结果: 每个模块执行完成后都会返回一个状态码,指示认证是否成功。PAM 框架会根据这些状态码来决定是否允许用户继续操作
4、专用配置文件/etc/pam.d/ 格式
第一列内容:type(模块类型)
type:指模块类型,即功能 | |
---|---|
Auth | 账号的认证和授权,比如用户登录时,验证你的用户名存不存在 |
Account | 帐户的有效性,与账号管理相关的非认证类的功能,如:用来限制/允许用户对某个服务的访问时间,限制用户的位置(例如:root用户只能从控制台登录) |
Password | 用户修改密码时密码复杂度检查机制等功能 |
Session | 用户会话期间的控制,如:最多打开的文件数,最多的进程数等 |
-type | 表示因为缺失而不能加载的模块将不记录到系统日志,对于那些不总是安装在系统上的模块有用 |
PAM框架的基本流程包括四个主要阶段:
①认证管理 (authentication management):接受用户名和密码,进而对该用户的密码进行认证
②账户管理(account management):检查帐户是否被允许登录系统,帐号是否已经过 期,帐号的登录是否有时间段的限制等
③密码管理(password management):主要是用来修改用户的密码
④会话管理(session management):主要是提供对会话的管理和记账。 控制类型也可以称做 Control Flags,用于 PAM 验证类型的返回结果
第二列内容:control(控制位)
PAM库该如何处理与该服务相关的PAM模块的成功或失败情况,一个关键词实现
control:PAM库该如何处理与该服务相关的PAM模块的成功或失败情况 | |
---|---|
required | 一票否决,如果失败,最后一定会失败,但是还会继续执行下面操作验证失败仍然会继续,但返回Fail |
requssite | 一票否决,如果失败会立即反馈失败信息,并立即结束认证,返回Fail |
sufficient | 验证成功会立即返回,不再继续,否则忽略结果并继续 |
optional | 不用于验证,只显示信息 |
include | 表示在验证过程中调用其他的 PAM 配置文件 |
第三列内容:module-path(PAM模块): 用来指明本模块对应的程序文件的路径名,模块规定了系统的一些程序应该如何有效操作
第四列内容:Arguments: 用来传递给该模块的参数
5、PAM模块
5.1 shell模块
主要功能是检查有效shell,pam_shells.so模块只允许规定的shell类型通过,使在/etc/shells 文件中存在的类型通过
案例:不允许使用/bin/csh的用户本地登录(借用su模块添加相关配置)
①把/bin/csh从/etc/shells文件中删除,再创建一个/bin/csh类型的用户
②在/etc/pam.d/su的配置文件中启用shell的PAM认证模块
③此时/bin/csh类型的用户mimi将无法登录
5.2 securetty模块
默认情况下centos是不允许用户使用telnet协议(密码明文传输,不安全)远程登录的,该模块功能为只允许root用户在/etc/securetty列出的安全终端上登陆
案例:CentOS 7允许root在telnet登陆
①在客户端和服务端都注释安全模块功能
②模拟远程登录
客户端和服务端同样的操作:
yum install -y telnet-server.x86_64 #安装telnet程序
systemctl start telnet.socket #开启telnet服务
systemctl status telnet.socket #查看telnet服务是否开启
systemctl stop firewalld #关闭防火墙
5.3 pam_nologin.so模块
如果/etc/nologin文件存在,将导致非root用户不能登陆,当该用户登陆时,会显示/etc/nologin文件内容,并拒绝登陆。可运用在维护场景下
要求:默认此模块可以对ssh等登录有效,但不影响su登录
touch /etc/nologin #/etc/nologin文件存在,将导致非root用户不能登陆
echo "系统维护中" > /etc/nologin #设置提示信息
rm -rf /etc/nologin #删除/etc/nologin文件,其他普通用户恢复登录
5.4 limit模块
指 limits.conf
配置文件,它位于 /etc/security/
目录下。这个文件用于设置系统范围内的用户资源限制,包括硬件资源和服务的限制。这些限制可以影响用户会话的各种方面,如 CPU 使用、内存使用、文件打开数等
domain | 用户名 |
@组名 | |
*表示所有用户和组 | |
type | hard:硬限制 |
soft:软限制 | |
—:软硬一起,相当于硬限制 | |
item | core :限制核心文件大小(KB) |
data :最大数据大小(KB) | |
fsize :最大文件大小(KB) | |
memlock :最大锁定在内存中的地址空间(KB) | |
nofile :打开文件描述符的最大数目 | |
rss :最大常驻集大小(KB) | |
stack :最大堆栈大小(KB) | |
cpu :最大cpu时间(MIN) | |
nproc :最大进程数 | |
as :地址空间限制(KB) | |
maxlogins :该用户的最大登录数 | |
maxsyslogins :系统上的最大登录数 | |
priority :带锁运行用户进程的优先级 | |
locks :用户可以持有的最大文件数 | |
sigpending :挂起信号的最大数量 | |
msgqueue : POSIX消息队列使用的最大内存(字节) | |
nice :允许提升的最大优先级(-20~19) | |
rtprio :最大实时优先级 |
案例:限制用户mimi最多可用打开五个进程
6、ulimit命令
- ulimit是linux shell的内置命令,它具有一套参数集,用于对shell进程及其子进程进行资源限制
- ulimit只影响shell进程及其子进程,用户登出后失效
- 可以在profile中加入ulimit的设置,变相的做到永久生效
- 通过
ulimit
命令,系统管理员可以限制用户对系统资源的访问,以提高系统的安全性和稳定性
选项 | 说明 |
---|---|
-H | 设置硬件资源限制 |
-S | 设置软件资源限制 |
-a | 显示当前所有的资源限制 |
-c size | 设置core文件的最大值.单位:blocks |
-d size | 设置数据段的最大值.单位:kbytes |
-f size | 设置创建文件的最大值.单位:blocks |
-l size | 设置在内存中锁定进程的最大值.单位:kbytes |
-m size | 设置可以使用的常驻内存的最大值.单位:kbytes |
-n size | 设置内核可以同时打开的文件描述符的最大值.单位:n |
-p size | 设置管道缓冲区的最大值.单位:kbytes |
-s size | 设置堆栈的最大值.单位:kbytes |
-t size | 设置CPU使用时间的最大上限.单位:seconds |
-u size | 最大用户进程数 |
-v size | 设置虚拟内存的最大值.单位:kbytes |
unlimited | 一个特殊值,用于表示不限制 |
ulimit -a #查看系统的相关资源限制设置
修改tcp最大链接数
ulimit -n 1500 #设置内核最多可以同时打开1500个文件
ab -c2000 -n5000 http://172.16.12.10/ #压测