HVV应急溯源基础——Linux 系统安全加固配置指南(一)

在护网行动与蓝队应急响应过程中,Linux 服务器往往是攻击者重点利用的目标。大量安全事件表明,弱口令、不安全权限配置、SSH 暴露以及敏感文件泄露等问题,极易成为攻击者横向移动与权限提升的突破口。

本文围绕 Linux 系统常见安全风险,从用户权限排查、远程连接加固、SUID/SGID 权限检查以及敏感数据防护等多个方面,对常见安全隐患及加固方法进行了整理,可作为日常安全巡检、护网值守以及应急排查的基础参考。

文章目录


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.allowhosts.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/目录下的loginsshd文件,,增加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提取文章:


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 系统整体安全防护能力。

相关推荐
武子康1 小时前
调查研究-167 Docker Compose 详解:从单容器到多服务编排的工程化入口
运维·docker·云原生·容器·kubernetes·k8s·docker-compose
RisunJan1 小时前
Linux命令-perl (perl语言解释器)
linux·perl
github_czy1 小时前
更加优雅的类型检查与传参---mcp源码分析
java·服务器·开发语言
旅僧2 小时前
Ubantu docker环境配置(前置)
运维·docker·容器
guyuyiqi2 小时前
糖精钠检测技术科普
科技·安全·制造
vortex52 小时前
Linux日志轮转管理:logrotate 完全指南
linux·运维·服务器
ggaofeng2 小时前
如何通过uboot加载硬盘
linux·qemu·uboot
尔染君子2 小时前
嵌入式Linux驱动开发(按键驱动)
linux·驱动开发
条俐开水喉2 小时前
液冷服务器与U位资产管理的依存共生关系深度分析
运维·ai算力服务器·u位资产管理·液冷服务器