在护网行动与蓝队应急响应过程中,Linux 服务器往往是攻击者重点利用的目标。大量安全事件表明,弱口令、不安全权限配置、SSH 暴露以及敏感文件泄露等问题,极易成为攻击者横向移动与权限提升的突破口。
本文围绕 Linux 系统常见安全风险,从用户权限排查、远程连接加固、SUID/SGID 权限检查以及敏感数据防护等多个方面,对常见安全隐患及加固方法进行了整理,可作为日常安全巡检、护网值守以及应急排查的基础参考。
文章目录
-
- Linux系统安全加固
- [1.1 用户及权限安全排查](#1.1 用户及权限安全排查)
- [1.2 远程连接安全配置](#1.2 远程连接安全配置)
- [1.3 SUID/SGID文件权限排查](#1.3 SUID/SGID文件权限排查)
- [1.4 敏感数据排查与防护](#1.4 敏感数据排查与防护)
-
- [(1)寻找任何用户都有写权限的文件 /文件夹](#(1)寻找任何用户都有写权限的文件 /文件夹)
- (2)查询系统隐藏文件
- (3)控制history命令的记录数
- 总结
Linux系统安全加固
Linux 系统在实际运行过程中曾出现过大量安全问题,其中相当一部分问题并非来源于系统本身的漏洞,而是由于管理员配置不当、权限设置不合理或安全策略缺失等不安全配置所导致。只有在保障 Linux 系统本身安全的基础上,才能进一步确保其所承载业务与服务的数据安全。
本节将对几种常见的 Linux 系统不安全配置问题进行介绍,并结合实际情况给出相应的修复措施与安全加固方法。
1.1 用户及权限安全排查
Linux系统是多用户操作系统,也就意味着一个系统上可存在多个用户的信息;但实际上Linux并不能"认识"特定的用户名,而是根据用户ID进行分辨:

Linux系统将所有用户的名称与ID的对应关系都存储在/etc/passwd目录中,passwd文件中记录的用户信息的各字段含义;
(1)查询系统新增的用户名,有两种方法:
bash
- 通过查询passwd文件中新增的用户名
- cat /etc/passwd
- 通过awk指令查询UID=0和UID≥500的用户名
- awk -F: '($3==0 || $3>=500) {print $1}' /etc/passwd
得到结果如下:

(2)UID为0的用户拥有系统的最高权限,通过判断UID是否为0可排查系统中是否存在特权用户
执行如下命令:
bash
awk -F: '($3==0){print $1}' /etc/passwd
这里就可以得到root用户以及其他特权用户(UID=0的用户):

(3)在passwd文件中,用户密码是被保护的状态,即使用**×** 来隐藏,实际的密码内容加密后保存在/etc/shadow目录中
bash
beta@beta:~$ sudo awk -F ":" '($2==""){print $1}' /etc/shadow
snail
test
beta@beta:~$ su snail
# id
用户id=0(root) 组id=1001(snail) 组=1001(snail)
1.2 远程连接安全配置
传统的远程传输协议(如FTP、Telnet)在本质上都是不安全的,传输内容是明文,容易遭受 "中间人"攻击 。因此,在管理远程服务器时,最常使用的是SSH远程连接协议(因为SSH传输的数据是加密的)
但是,SSH的不安全配置在一定程度上也会造成一系列安全问题:
- 弱口令枚举
- 特权用户登录等
(1)修改SSH服务默认端口
系统SSH协议开启的端口号,默认端口为22;
此时可通过修改sshd_config配置文件的Port参数指定需要设定的SSH服务端口,并重启SSH服务使其生效;
bash
# 查看配置文件中ssh服务的默认端口
cat /etc/ssh/sshd_config |grep "Port"
结果如下:

(2)隐藏SSH服务类型
通过Nmap等端口探测工具,利用目标端口返回的指纹信息进行快速比对,可快速探测目标服务开启的SSH服务的端口号:
bash
nmap -sS -p 22 -A -Pn 192.168.44.131

应对措施:
- 为避免被端口探测工具识别系统信息,可以通过两种方式隐藏 SSH 指纹:一是在
sshd_config配置文件中添加DebianBanner no,隐藏系统版本信息; - 二是利用
sed -i命令修改 SSH 返回的版本内容,从而降低系统被识别的风险。
bash
# 编辑sshd配置文件
vim /etc/ssh/sshd_config
# 添加
DebianBanner no
# 保存后重启 SSH 服务
systemctl restart sshd
# 利用 sed -i 命令直接修改 SSH 服务版本信息
sed -i 's/OpenSSH.*/OpenSSH/g' /etc/ssh/sshd_config
成功隐藏"主机信息":

(3)是否允许特权用户登陆
查询当前Linux系统的SSH协议是否允许特权用户登录,可以通过查询SSH服务sshd_config 配置文件PermitRootLogin参数:
yes为允许特权用户登录;no为不允许特权用户登录;
bash
cat /etc/ssh/sshd_config |grep "PermitRootLogin"
结果如下:

为了主机安全,一般需要将其修改为"no",然后重启SSH服务,则可以禁止特权用户远程登录。
(4)对远程登录主机进行限制
SSH服务默认是没有对远程登录来源进行有效限制的,有可能造成SSH弱口令枚举攻击等。
(1)限制SSH服务非法登录来源
此时可以通过修改Linux系统的hosts.allow和hosts.deny两个文件,对访问来源进行有效的访问控制:
- 在hosts.deny文件中添加
sshd:ALL,可阻止所有远程主机访问; - 在hosts.allow文件中增加允许远程主机访问的IP地址列表,如
sshd:172.16.213.12- 表示只允许IP地址为172.16.213.12的主机使用SSH协议进行远程连接;
(2)限制SSH服务非法登录次数
为防止SSH服务弱口令枚举攻击,可以通过修改/etc/pam.d/目录下的login 和sshd文件,,增加SSH服务非法登录次数限制:
例如:当用户错误输入口令3次以上时,会暂时锁定当前用户1min。在login文件中添加以
下内容:
配置的核心是 login文件 中添加的 pam_tally2.so 模块规则:
bash
auth required pam_tally2.so onerr=fail deny=1 unlock_time=30 even_deny_root root_unlock_time=30
deny=1:密码错误1次就触发锁定unlock_time=30:锁定后30秒自动解锁even_deny_root:对 root 用户也生效锁定root_unlock_time=30:root 用户同样锁定30秒
在sshd文件中添加以下内容:
bash
auth required pam_tally2.so onerr=fail deny=1 unlock_time=30 even_deny_root root_unlock_time=30 account required pam_tally2.so
auth required pam_tally2.so ...auth:表示这是"认证阶段"的规则,在用户输入密码时生效onerr=fail:模块执行出错时,直接判定认证失败deny=1:密码错误1次就触发账号锁定unlock_time=30:锁定后30秒自动解锁even_deny_root:对root用户也应用锁定规则root_unlock_time=30:root 用户同样锁定30秒
问题:这两个配置看起来一样,只配置一个文件不行吗?
两个文件的作用完全不同:
| 配置文件 | 对应登录场景 | 典型登录方式 |
|---|---|---|
/etc/pam.d/login |
本地登录/控制台登录 | 服务器物理终端登录、串口登录、su 切换用户 |
/etc/pam.d/sshd |
SSH 远程登录 | ssh 客户端远程连接、SFTP 登录 |
它们是两个独立的认证入口,PAM 不会互相读取配置,所以只改一个文件,只能限制对应的场景。
1.3 SUID/SGID文件权限排查
rwx权限详解
Linux 系统主要分为管理员用户 与普通用户 ,其权限控制依赖于文件和目录的权限属性。当系统存在不安全配置时,容易引发权限提升问题,其中最典型的就是 SUID 提权。
Linux 文件常见权限包括可读(r)、可写(w)和可执行(x)。当文件所有者权限位出现 s 标识时,表示该文件具有 SUID 权限,例如:
bash
-rwsr-xr-x
此时,普通用户在执行该程序时,将临时获得文件所有者的权限。如果文件属主为 root,则可能以 root 权限执行相关操作,从而造成权限提升风险。

因此,需要定期排查系统中的 SUID/SGID 文件,及时移除不必要的特殊权限,并对高危程序进行安全加固,以降低权限提升带来的安全风险。
利用如下find命令查询Linux系统中具有SUID权限的文件:
bash
find / -perm -u=s -type f 2>/dev/null
效果如图:

这里也有我之前写过的SUID提取文章:
- Ripper靶机详细横向渗透过程(rips扫描文件,水平横向越权,Webmin直接获取root权限)
- pyexpvm靶机详细提权过程(MSF框架,Hydra数据库爆破,SUDO提权)
- 应急响应------知攻善防靶场Linux-1详细应急过程
1.4 敏感数据排查与防护
在渗透测试中,信息搜集是攻击链的关键环节。攻击者通过收集目标资产与系统的敏感信息(如账号密码、配置文件、历史命令、网络拓扑等),逐步扩大攻击面,最终达成目标。
在网络安全竞赛中,flag 信息搜集也是核心考点,这类信息常隐藏于服务配置、系统隐藏文件或历史命令中。本节将介绍敏感数据的搜集方法,并针对信息泄露风险提供修复与加固方案。
(1)寻找任何用户都有写权限的文件 /文件夹
find命令可查询系统中任何用户都有写权限的文件夹

(2)查询系统中任何用户都有写权限的文件

具体命令:
bash
# 目录权限排查
find / -xdev -mount -type d \( -perm -0002 -a ! -perm -1000 \)
# 文件权限排查脚本
for PART in `grep -v ^# /etc/fstab | awk '($6 != "0") {print $2}'`; do
find $PART -xdev -type f \( -perm -0002 -a ! -perm -1000 \) -print
done
(2)查询系统隐藏文件
通过如下find命令可查询系统隐藏文件,结果如下所示:
bash
beta@beta:/$ find / -name ".*" -print -xdev
find: warning: you have specified the global option -xdev after the argument
ified before it as well as those specified after it. Please specify global
/opt/flag/.flag
/opt/DVWA/.github
/opt/DVWA/.htaccess
/opt/DVWA/.gitignore
/home/beta/.bashrc
/home/beta/.bash_logout
/home/beta/.profile
/home/beta/.viminfo
/home/beta/.cache
/home/beta/.sudo_as_admin_successful
/home/beta/.gnupg
/home/beta/.ssh
/home/beta/.config
/home/beta/.local
(3)控制history命令的记录数
执行history命令可查询Linux系统的bash命令历史记录,执行history-c命令,可清除bash命令历史记录:

清除命令后:

为保证系统的敏感数据安全,可以通过修改系统的$HISTSIZE临时修改系统允许记录的历史命令行数,但当系统重启后,会恢复系统的默认值,不能长久记录。
重点
可以通过修改/etc/profile目录文件的方式,实现长久变更允许记录的历史命令行数,只需修改profile文件中的HISTSIZE值为3
bash
# 查询当前历史命令记录行数
echo $HISTSIZE
# 临时修改(当前会话生效,重启失效)
HISTSIZE=3
# 永久修改(写入全局配置文件,所有用户生效)
echo "HISTSIZE=3" >> /etc/profile
# 使配置立即生效
source /etc/profile

总结
Linux 系统安全加固是护网行动与日常安全运维中的重要环节。通过对用户权限、SSH 远程连接、SUID/SGID 特殊权限以及敏感数据等内容进行排查与加固,可以有效降低系统被入侵、提权以及数据泄露的风险。实际安全工作中,应结合最小权限原则、定期安全巡检以及日志审计机制,持续完善系统安全配置,及时发现并修复潜在安全隐患,从而提升 Linux 系统整体安全防护能力。