目录
一、账号安全控制
(一)基本安全措施
- 系统账号清理
在 Linux 系统里,除了手动创建的账号,还有很多随系统或程序安装产生的账号。像 bin、daemon、adm、lp、mail 这些非登录用户账号,主要用于维持系统运行、启动或保持服务进程,通常不允许登录。查看这些账号的登录 Shell 是否为 /sbin/nologin(禁止终端登录),可使用命令:
grep "/sbin/nologin" /etc/passwd
输出结果类似:
bin:x:1:1:bin:/bin:/sbin/nologin
daemon:x:2:2:daemon:/sbin:/sbin/nologin
adm:x:3:4:adm:/var/adm:/sbin/nologin
lp:x:4:7:lp:/var/spool/lpd:/sbin/nologin
为防止 /etc/passwd 和 /etc/shadow 文件被随意修改,增强系统安全性,可执行:
chattr +i /etc/passwd /etc/shadow
此时若尝试新增用户,如:
useradd billgate
会出现报错信息,提示无法打开 /etc/passwd 文件,这表明文件的保护机制生效。
2. 密码安全控制
为降低密码在不安全网络环境中被猜出或暴力破解的风险,用户应养成定期更改密码的习惯。管理员可在服务器端设置用户密码的最大有效天数。
对于新建用户,编辑 /etc/login.defs 文件,找到并修改PASS_MAX_DAYS
的值为 30(即设置密码有效期为 30 天):
vi /etc/login.defs
在文件中找到PASS_MAX_DAYS
这一行,修改为:
PASS_MAX_DAYS 30
对于已有用户(例如 lisi),使用 chage 命令来设置密码有效期为 30 天:
chage -M 30 lisi
在某些特殊情况下,如要求批量创建的用户初次登录时必须自设密码,或统一要求所有用户更新密码,管理员可执行强制策略。以强制用户 zhangsan 下次登录时重设密码为例,执行:
chage -d 0 zhangsan
当 zhangsan 登录系统时,会收到强制修改密码的提示:
Localhost login: zhangsan
password:
You are required to change your password immediately (root enforced)
Changing password for zhangsan.
(current) UNIX password:
New password:
Retype new password:
- 命令历史、自动注销
在 Bash 终端环境中,历史命令的记录条数由变量 HISTSIZE 控制,默认是 1000 条。为减少因命令历史记录带来的安全风险,可修改该变量值。
若想影响系统中的所有新登录用户,编辑 /etc/profile 文件:
vi /etc/profile
找到HISTSIZE
变量,将其值修改为 200(即最多只记录 200 条历史命令):
HISTSIZE=200
对于当前用户,可直接在命令行执行:
export HISTSIZE=200
另外,还能通过修改用户宿主目录中的~/.bash_logout 文件,实现用户退出 Bash 环境时自动清空历史命令。编辑该文件:
vi ~/.bash_logout
在文件中添加:
history -c
clear
Bash 终端环境可设置闲置超时时间,由变量 TMOUT 控制,默认单位为秒(s)。同样在 /etc/profile 文件中进行设置,以设置闲置超时时间为 600 秒(10 分钟)为例:
vi /etc/profile
添加或修改:
export TMOUT=600
对于当前用户,执行:
export TMOUT=600
不过,在执行耗时较长的操作(如程序代码编译、修改系统配置等)时,应避免设置 TMOUT 变量,必要时可执行:
unset TMOUT
取消 TMOUT 变量设置。
(二)用户切换与提权
- su 命令的用法
使用 su 命令可切换为指定的另一个用户,从而获取该用户的所有权限。从普通用户 jerry 切换为 root 用户,执行:
[jerry@localhost ~]$ su - root
密码:
[root@localhost ~]#
这里的选项 “-” 等同于 “--login” 或 “-l”,表示切换用户后进入目标用户的登录 Shell 环境;若缺少此选项,仅切换身份,不切换用户环境。并且从 root 用户切换为其他用户时,无需验证密码。
默认情况下,任何用户都能使用 su 命令,这存在安全风险。借助 pam_wheel 认证模块,可加强对 su 命令的使用控制。先将授权使用 su 命令的用户添加到 wheel 组,例如添加用户 tsengyia:
[root@localhost ~]# gpasswd -a tsengyia wheel
正在将用户"tsengyia"加入到"wheel"组中
确认 wheel 组成员:
[root@localhost ~]# grep wheel /etc/group
wheel:x:10:tsengyia
接着修改 /etc/pam.d/su 认证配置文件,启用 pam_wheel 认证:
[root@localhost ~]# vi /etc/pam.d/su
找到#auth required pam_wheel.so use_uid
这一行,去掉开头的 “#” 号。
启用 pam_wheel 认证后,未加入 wheel 组的用户尝试使用 su 命令切换用户时,会提示 “拒绝权限”。如用户 jerry 尝试切换为 root 用户:
[jerry@localhost ~]$ su - root
密码:
su:拒绝权限
[jerry@localhost ~]$
使用 su 命令切换用户的操作会被记录到安全日志 /var/log/secure 文件中,可根据需要查看:
tail -f /var/log/secure
- PAM 认证
PAM(Pluggable Authentication Modules)是 Linux 系统的可插拔认证模块,是一种高效且灵活便利的用户级认证方式,广泛应用于 login、远程登录(telnet、rlogin、ssh、ftp)、su 等应用程序中。
PAM 认证的一般顺序是:Service(服务)→PAM(配置文件)→pam_*.so。即首先确定要认证的服务,然后加载相应的 PAM 配置文件(位于 /etc/pam.d 下),最后调用认证文件(位于 /lib/security 下)进行安全认证。
查看某个程序是否支持 PAM 认证,以 su 为例,使用命令:
ls /etc/pam.d/|grep su
输出结果可能包含 su、sudo、sudo - i 等,表明这些程序支持 PAM 认证。
查看 su 的 PAM 配置文件内容:
[root@localhost ~]# cat /etc/pam.d/su
#%PAM - 1.0
auth sufficient pam_rootok.so
# Uncomment the following line to implicitly trust users in the "wheel" group. #auth sufficient pam_wheel.so trust use_uid
# Uncomment the following line to require a user to be in the "wheel" group.
#auth required pam_wheel.so use_uid
auth substack system - auth
auth include postlogin
account sufficient pam_succeed_if.so uid=0 use_uid quiet
account include system - auth
password include system - auth
session include system - auth
session include postlogin
session optional pam_xauth.so
配置文件中每一行都是一个独立的认证过程,分为认证类型、控制类型、PAM 模块及其参数三个字段。认证管理负责验证用户名和密码;帐户管理检查帐户是否允许登录系统、是否过期等;密码管理用于修改用户密码;会话管理提供对会话的管理和记账。
控制类型(Control Flags)用于处理 PAM 验证类型的返回结果:
- required:验证失败时仍然继续,但返回 Fail。
- requisite:验证失败则立即结束整个验证过程,返回 Fail。
- sufficient:验证成功则立即返回,不再继续,否则忽略结果并继续。
- optional:不用于验证,只是显示信息(通常用于 session 类型)。
- sudo 命令 —— 提升执行权限
- 在配置文件 /etc/sudoers 中添加授权
sudo 机制的配置文件是 /etc/sudoers,默认权限为 440,需使用专门的 visudo 工具进行编辑(若使用 vi 编辑,保存时必须执行 “:w!” 命令强制操作,否则系统会提示为只读文件而拒绝保存)。
授权记录的基本配置格式为:user MACHINE=COMMANDS
,分别表示授权哪些人在哪些主机上执行哪些命令。
例如,授权用户 jerry 能够执行 ifconfig 命令来修改 IP 地址,以及 wheel 组的用户无需验证密码即可执行任何命令,操作如下:
[root@localhost ~]# visudo
在文件中添加:
jerry localhost=/sbin/ifconfig
%wheel ALL=NOPASSWD:ALL
当使用相同授权的用户较多,或者授权的命令较多时,可以采用集中定义的别名。用户、主机、命令部分都可以定义为别名(必须为大写),分别通过关键字 User_Alias、Host_Alias、Cmnd_Alias 来进行设置。
例如,允许用户 jerry、tom、tsengyia 在主机 smtp、pop 中执行 rpm、yum 命令,操作如下:
[root@localhost ~]# visudo
在文件中添加:
User_Alias OPERATORS=jerry,tom,tsengyia
Host_Alias MAILSVRS=smtp,pop
Cmnd_Alias PKGTOOLS=/bin/rpm,/usr/bin/yum
OPERATORS MAILSVRS=PKGTOOLS
sudo 配置记录的命令部分允许使用通配符 “*”、取反符号 “!”。比如,授权用户 syrianer 可以执行 /sbin/ 目录下除 ifconfig、route 以外的其他所有命令程序,操作如下:
[root@localhost ~]# visudo
在文件中添加:
syrianer localhost=/sbin/*,!/sbin/ifconfig,!/sbin/route
默认情况下,通过 sudo 方式执行的操作并不记录。若要启用 sudo 日志记录以备管理员查看,在 /etc/sudoers 文件中增加 “Defaults logfile” 设置:
[root@localhost ~]# visudo
查找 Defaults,在前面添加一行内容:
Defaults logfile="/var/log/sudo"
- 通过 sudo 执行特权命令
对于已获得授权的用户,通过 sudo 方式执行特权命令时,将正常的命令行作为 sudo 命令的参数,且特权命令程序通常位于 /sbin、/usr/sbin 等目录下,需使用绝对路径。
例如,用户 jerry 执行修改 IP 地址操作,未使用 sudo 时:
[jerry@localhost ~]$ /sbin/ifconfig ens33:0 192.168.1.11/24
SIOCSIFADDR:不允许的操作
SIOCSIFFLAGS:不允许的操作
SIOCSIFNETMASK:不允许的操作
使用 sudo 时:
[jerry@localhost ~]$ sudo /sbin/ifconfig ens33:0 192.168.1.11/24
[sudo] password for jerry:
输入 jerry 的密码后,即可成功执行命令。查看执行结果:
[jerry@localhost ~]$ /sbin/ifconfig ens33:0
ens33:0: flags=4163<UP,BROADCAST,RUNNING,MULTICAST> mtu 1500
inet 192.168.1.11 netmask 255.255.255.0 broadcast 192.168.1.255
ether 00:0c:29:3b:ff:76 txqueuelen 1000 (Ethernet)
在当前会话过程中,第一次通过 sudo 执行命令时,必须以用户自己的密码(不是 root 用户或其他用户的密码)进行验证。此后再次通过 sudo 执行命令时,只要与前一次 sudo 操作的间隔时间不超过 5min(分),则不再重复验证。
若要查看用户自己获得哪些 sudo 授权,执行:
sudo -l
未授权的用户将会得到 “may not run sudo” 的提示,已授权的用户则可以看到自己的 sudo 配置。例如,用户 syrianer 查看授权:
[syrianer@localhost ~]$ sudo -l
[sudo] password for syrianer:
用户syrianer可以在该主机上运行以下命令:
(root) /sbin/*,(root)!/sbin/ifconfig,(root)!/sbin/route
如果已经启用 sudo 日志,则可以从 /var/log/sudo 文件中看到用户的 sudo 操作记录:
[root@localhost ~]# tail /var/log/sudo
Aug 24 23:59:44 :jerry : TTY=pts/0 ;PWD=/home/jerry ; USER=root ; COMMAND=/sbin/ifconfig ens33:0 192.168.1.11/24
Aug 25 00:00:46 : syrianer:TTY=pts/1;PWD=/home/syrianer;USER=root;COMMAND=list
二、系统引导和登录控制
(一)开关机安全控制
在 Linux 系统中,使用 grub2 - mkconfig 命令生成新的 grub.cfg 配置文件:
[root@localhost ~]# grub2 - mkconfig -o /boot/grub2/grub.cfg
执行该命令后,系统会显示类似如下信息:
grub configuration file
Found linux image: /boot/vmlinuz - 3.10.0 - 514.e17.x86_64
Found initrd image: /boot/initramfs - 3.10.0 - 514.e17.x86_64.img
Found linux image: /boot/vmlinuz - 0 - rescue - b15df1eb8205483f9f70c79709810abc
Found initrd image: /boot/initramfs - 0 - rescue - b15df1eb8205483f9f70c79709810abc.img
done
通过上述配置,重新开机进入 GRUB 菜单时,按 E 键将无法修改引导参数。若要获得编辑权限,必须根据提示输入正确的 GRUB 密码。注意,为 GRUB 设置密码时,“grub.pbkdf2.sha512..” 部分可替换为明文的密码字符串(如 “123456”),但安全性稍差,不建议使用。
(二)终端及登录控制
- 禁止 root 用户登录
在 Linux 系统中,login 程序会读取 /etc/securetty 文件,以决定允许 root 用户从哪些终端(安全终端)登录系统。若要禁止 root 用户从指定的终端(如 tty5、tty6)登录,修改 /etc/securetty 文件:
[root@localhost ~]# vi /etc/securetty
找到 tty5、tty6 对应的行,在前面添加 “#” 号进行注释:
#tty5
#tty6
- 禁止普通用户登录
当服务器正在进行备份或调试等维护工作时,不希望再有新的用户登录系统,可建立 /etc/nologin 文件:
[root@localhost ~]# touch /etc/nologin
此时,login 程序会检查 /etc/nologin 文件是否存在,如果存在,则拒绝普通用户登录系统(root 用户不受限制)。该方法利用了 shutdown 延迟关机的限制机制,只建议在服务器维护期间临时使用。当手动删除 /etc/nologin 文件或者重新启动主机以后,即可恢复正常登录。
[root@localhost ~]# rm /etc/nologin
三、弱口令检测、端口扫描
(一)弱口令检测
- 工具:John the Ripper 是一款常用的开源密码分析工具,支持字典式暴力破解,通过对 shadow 文件的口令分析来检测密码强度1。
- 检测步骤7:
- 安装:从官网下载 John the Ripper,解压后进入源码目录执行
make clean linux - x86 - 64
,在run
子目录下会生成名为john
的可执行程序。 - 准备文件:将
/etc/shadow
文件复制到其他位置,如cp /etc/shadow /root/a.txt
。 - 直接检测:执行
./john /root/a.txt
进行暴力破解,可使用./john --show /root/a.txt
查看已破解出的账户列表。 - 使用字典文件检测:John the Ripper 默认提供的字典文件为
password.lst
,也可使用其他字典文件。执行./john --wordlist=./password.lst /root/a.txt
,使用指定字典文件进行破解。
- 安装:从官网下载 John the Ripper,解压后进入源码目录执行
(二)端口扫描
- NMAP
- 简介:NMAP 是一个强大的端口扫描类安全评测工具,支持多种扫描技术,如 ping 扫描、多端口检测、OS 识别等1。
- 常用选项与扫描类型4:
- -p:指定扫描的端口,如
nmap -p 80,443 192.168.1.100
,扫描目标主机的 80 和 443 端口。 - -n:禁用反向 DNS 解析,加快扫描速度。
- -sS:TCP 的 SYN 扫描(半开扫描),只向目标发出 SYN 数据包,收到 SYN/ACK 响应包则认为目标端口正在监听,立即断开连接。如
nmap -sS 192.168.1.100
。 - -sT:TCP 连接扫描,建立完整的 TCP 连接,成功则认为目标端口正在监听服务。例如
nmap -sT 127.0.0.1
查看本机开放的 TCP 端口。 - -sU:UDP 扫描,探测目标主机提供的 UDP 服务,速度较慢,如
nmap -sU 192.168.1.100
。 - -sP:ICMP 扫描,类似 ping 检测,快速判断目标主机是否存活,不做其他扫描。
- -Pn:跳过 ping 检测,认为所有目标主机存活,当对方不响应 ICMP 请求时使用,避免因无法 ping 通而放弃扫描。
- -v:显示扫描过程。
- -oN/-oX/-oG:将报告写入文件,分别为正常、XML、grepable 三种格式,如
nmap -oN scan_result.txt 192.168.1.100
。
- -p:指定扫描的端口,如
- netstat5
- 简介:用于查看系统网络连接状态、路由表等信息。
- 常用选项:
- -a:显示主机中所有活动的网络连接信息,包括监听、非监听状态的服务端口。
- -n:以数字形式显示相关的主机地址、端口等信息。
- -t:查看 TCP 相关信息,如
netstat -natp
查看正在运行的使用 TCP 协议的网络状态信息。 - -u:显示 UDP 协议相关信息,
netstat -naup
查看正在运行的使用 UDP 协议的网络状态信息。 - -p:显示与网络连接相关联的进程号、进程名称信息,需 root 权限。
- -l:显示处于监听状态的网络连接及端口信息。