1.前言
作为一个开放源代码的操作系统,Linux 服务器以其安全、高效和稳定的显著优势而得以广泛应用。下面主要从账户安全、系统引导、登录控制等角度演示如何优化 Linux 系统的安全性。
2.账号安全与控制
2.1 将非登录用户的 Shell 设为/sbin/nologin
grep "/sbin/nologin" /etc/passwd
usermod -s /sbin/nologin testuser
2.2 锁定长期不使用的账号
usermod -L testuser(-U 解锁)
passwd -l testuser(-u 解锁)
2.3 删除无用账号
userdel testuser
2.4 锁定账号文件 passwd、shadow
chattr +i /etc/passwd /etc/shadow #锁定文件
chattr -i /etc/passwd /etc/shadow #解锁文件
lsattr ... #查看文件属性
示例:
[root@c7-1 ~]#touch test
[root@c7-1 ~]#lsattr test
---------------- test
[root@c7-1 ~]#chattr +i test
[root@c7-1 ~]#echo "123456" >> test
-bash: test: 权限不够
[root@c7-1 ~]#lsattr test
----i----------- test
[root@c7-1 ~]#chattr -i test
[root@c7-1 ~]#echo "123456" >> test
[root@c7-1 ~]#cat test
123456
[root@c7-1 ~]#lsattr test
---------------- test
2.5 设置密码有效期
#新建用户遵循此规则,密码有效期为 30 天或 90 天
vim /etc/login.defs
修改 PASS_MAX_DAYS 30/90
#修改已存在的用户密码有效天数,chage -l user 查看
chage -M 30/90 testuser
#强制用户下次登录时修改密码
chage -d 0 testuser
2.6 历史命令设置
#永久减少记录的命令条数
vim /etc/profile #第46行(末行输入 :46| 跳转)
HISTSIZE=10 或者 export HISTSIZE=10
source /etc/profile #使配置文件永久生效
#登录时自动清空命令历史
vim ~/.bash_logout
history -c #该命令临时清除历史命令
#手动清除存放历史命令的配置文件
echo > ~/.bash_history
#重启永久清除历史命令
vim ~/.bashrc
echo > ~/.bash_history
2.7 设置终端自动注销
vim ~/.bash_profile
export TMOUT=600 #设置无操作 600 秒后终端自动注销
2.8 su 命令管理
su(switch user)命令将有效用户 id 和组 id 更改为 user 的 id。单个 - 视为 -l。如果未指定 user,将默认为 root。
格式:su [选项] [-] [USER [参数]…]
参数 | 含义 |
---|---|
-m / -p | 不重置环境变量 |
-g | 指定主组 |
-G | 指定一个辅助组 |
- / -l | 使 shell 成为登录 shell |
-c | 使用 -c 向 shell 传递一条命令 |
-f | 向 shell 传递 -f 选项(csh 或 tcsh) |
-s | 若 /etc/shells 允许,则运行 shell |
示例:
[root@c7-1 ~]#su - syhj
上一次登录:日 8月 22 13:07:23 CST 2021pts/1 上
[syhj@c7-1 ~]$exit
登出
[root@c7-1 ~]#su syhj
[syhj@c7-1 /root]$exit
exit
[root@c7-1 ~]#su - syhj
上一次登录:日 8月 22 16:27:30 CST 2021pts/2 上
[syhj@c7-1 ~]$su -c ls root
密码:
test3 test4
[syhj@c7-1 ~]$whoami
syhj
[syhj@c7-1 ~]$pwd
/home/syhj
# su 切换用户更换了用户身份,但是 shell 仍然是当前用户 shell;su - 不仅更换用户也更换 shell
(1) 限制使用 su 命令的用户
#将允许使用 su 命令的用户加入 wheel 组
#启用 pam_wheel 认证模块
gpasswd -a user1 wheel #将 user1 用户加入 wheel 组里
grep "wheel" /etc/group
gpasswd -d user1 wheel #从 wheel 组中删除 user1 用户
vim /etc/pam.d/su
auth sufficient pam_rootok.so
auth required pam_wheel.so use_uid #去掉注释开启此模块
#启用 pam wheel 认证以后,未加入到 wheel 组内的其他用户将无法使用 su 命令,尝试进行切换时将提示"拒绝权限",从而将切换用户的权限控制在最小范围内。
#如果注释第一行,开启第二行,表示只有 wheel 组内的用户才能使用 su 命令,root 用户也被禁用 su 命令。
tail -f /var/log/secure #查看安全日志文件
(2) PAM 安全认证
#通过 pam 模块防止暴力破解 ssh
vim /etc/pam.d/sshd
#在第一行下面添加
auth required pam_tally2.so deny=3 unlock_time=600 even_deny_root root_unlock_time=1200
#说明:尝试登陆失败超过 3 次,普通用户 600 秒解锁,root 用户 1200 秒解锁
#sudo机制提升权限
vim /etc/sudoers
......
%wheel ALL=(ALL) ALL # % 代表用户组的意思,ALL 代表所有主机名,这个配置表示 wheel 组成员有和 root 用户一样的最高权限
......
#示例
useradd zhangsan
echo "123456" | passwd --stdin zhangsan
su - zhangsan
useradd lisi #创建失败,权限不足
exit
vim /etc/sudoers
zhangsan kgc=(root) /usr/sbin/useradd,/usr/sbin/ifconfig
#张三用户获得了 useradd 命令的使用权限,sudo useradd lisi 成功
#张三用户获得 ifconfig 命令权限,sudo ifconfig ens33:0 192.168.10.50/24
Host_Alias MYHOSTS = kgc,localhost
User_Alias MYUSERS = lisi,wangwu #也可以加组
Cmnd_Alias MYCMNDS= /usr/sbin/useradd,/usr/sbin/usermod,/usr/bin/rm,/usr/bin/passwd,!/sbin/init,!/sbin/reboot,!/usr/sbin/poweroff
MYUSERS MYHOSTS=MYCMNDS #调用别名
su - lisi
sudo useradd wangliu #可以添加用户,输入密码
vim /etc/sudoers
MYUSERS MYHOSTS=NOPASSWD:MYCMNDS
#配置此模块后再创建用户不需要输入密码
sudo reboot/init/poweroff #没有权限
#定义使用 rm 命令需要输入密码
Cmnd_Alias MYCMNDS = PASSWD:/usr/sbin/rm
#启用 sudo 操作日志
visudo
Defaults logfile = "/var/log/sudo"
tail -f /var/log/sudo
3.系统引导与登录控制
3.1 开关机安全控制
(1) 调整 BIOS 引导设置
- 将第一引导设备设为当前系统所在硬盘
- 禁止从其他设备(光盘、U盘、网络)引导系统
- 将安全基本设为 setup,并设置管理员密码
(2) GRUB限制(以 centos7 为例)
grub2-mkpasswd-pbkdf2 #生成加密算法口令,从 grub.pbkdf2.sha512 开始
cd /boot/grub2/ && cp grub.cfg grub.cfg.bak && cp /etc/grub.d/00_header /etc/grub.d/00_header.bak
#备份原 grub.cfg 和 00_header 配置文件
vim /etc/grub.d/00_header
#在最后添加如下内容,shift + G 可以跳转到文档末尾
cat << EOF
set superusers="root"
password pbkdf2 root grub.pbkd2.sha512........... #上面生成的一长串加密算法口令
EOF
#保存退出
grub2-mkconfig -o /boot/grub2/grub.cfg #生成新的 grub.cfg 配置文件
init 6 #重启虚拟机
在 VMware 虚拟机界面按 e 进入编辑,需要输入用户和密码(root <自己设的密码>)
进入内核文件菜单
3.2 终端登录安全控制
(1) 限制 root 只能在安全终端登录
vim /etc/securetty
......
tty1 #图形界面
tty2-tty6 #字符界面
禁止从哪个终端登录就将其注释掉
#tty*
(2) 禁止普通用户登录
touch /etc/nologin #建立该文件后普通用户不可登录系统
rm -rf /etc/nologin #删除文件即可恢复正常
4.弱口令检测
通过 JR 软件(John the Ripper)检测口令强度
- JR 是一款密码分析工具,支持字典式的暴力破解
- 通过对 shadow 文件的口令分析,可以检测密码强度
- 官方网站: http://www.openwall.com/john/
操作顺序:安装 JR 工具 -> 检测弱口令账号 -> 密码文件的暴力破解
示例:
#网络下载工具包
wget http://www.openwall.com/john/j/john-1.8.0.tar.gz
#解压工具包
tar zxvf john-1.8.0.tar.gz -C /opt
#安装编译工具
yum -y install gcc gcc-c++ make
#进行编译安装
cd /opt/john-1.8.0/src && make clean linux-x86-64
#准备待破解的密码文件
cp /etc/shadow /opt/shadow.txt
#执行暴力破解
cd /opt/john-1.8.0/run
/opt/john-1.8.0/run/john /opt/shadow.txt
#查看已破解出的账户列表
/opt/john-1.8.0/run/john --show /opt/shadow.txt
#使用密码字典文件
> john.pot #清空已破解的账户列表,以便重新分析
#使用指定的字典文件 password.lst 进行破解
./john --wordlist=./password.lst /opt/shadow.txt
#手动添加密码
vim password.lst
5.端口扫描 – nmap
nmap 是一个强大的端口扫描类安全评测工具,支持 ping 扫描、多端口检测等多种技术。
# nmap 软件包安装
rpm -qa | grep nmap
yum -y install nmap
常用参数选项:
-p:指定扫描的端口
-n:禁用反向 DNS 解析(加快扫描速度)
-sS:TCP 的 SYN 扫描(半开扫描),只向目标发出 SYN 数据包,如果收到 SYN/ACK 响应包就认为目标端口正在监听,并立即断开连接;否则认为目标端口并未开放
-sT:TCP 连接扫描,这是完整的 TCP 扫描方式(默认扫描类型),用来建立一个 TCP 连接,如果成功则认为目标端口正在监听服务,否则认为目标端口并未开放
-sF:TCP 的 FIN 扫描,开放的端口会忽略这种数据包,关闭的端口会回应 RST 数据包。许多防火墙只对 SYN 数据包进行简单过滤,而忽略了其他形式的 TCP 攻击包。这种类型的扫描可间接检测防火墙的健壮性
-sU:UDP 扫描,探测目标主机提供哪些 UDP 服务,UDP 扫描的速度会比较慢
-sP:ICMP 扫描,类似于 ping 检测,快速判断目标主机是否存活,不做其他扫描
-P0:跳过 ping 检测,这种方式认为所有的目标主机是存活的,当对方不响应 ICMP 请求时,使用这种方式可以避免因无法 ping 通而放弃扫描
TCP 控制位类型:
SYN 建立连接
ACK 确认数据包传输状况
FIN 关闭连接
PSH 推送位
RST 重置
URG 紧急
示例:
#分别查看本机开放的 TCP 端口、UDP 端口
nmap -sT 127.0.0.1
nmap -sU 127.0.0.1
#检测 192.168.80.0/24 网段有哪些主机提供 HTTP 服务
nmap -p 80 192.168.80.0/24
#检测 192.168.80.0/24 网段有哪些存活主机
nmap -n -sP 192.168.80.0/24
6. 总结
在Linux系统中,一些的数据糅杂堆积会造成磁盘不够用的情况,所以需要对于账号的一些管理,以达到磁盘的剩余空间的富余。