一、云计算安全
在我们进入云计算与网络安全运维的学习之前,我们需要先建立一个清晰的认知框架:安全运维不是单一技术的堆砌,而是层层设防、环环相扣的一个完整体系。
它既包括对底层系统的加固,也涵盖对网络边界的控制、服务运行的保障,以及对异常行为的发现与响应。
系统安全 —— 安全运维的第一道防线
一切安全的基础,始于系统本身。无论是传统的物理服务器,还是云上的虚拟机、容器实例,操作系统的安全性始终是第一位的。
防火墙系列 —— 网络边界的安全布控
系统层面的安全基础打好之后,接下来就要考虑如何保护我们的网络边界。这正是防火墙发挥作用的地方。
服务安全 —— 内部服务的加固与防护
即便有了系统加固和网络隔离,如果内部运行的服务本身存在漏洞或配置不,依然可能成为攻击入口。
安全网关 —— 多层次安全策略的集中体现
随着业务规模扩大,仅靠单一的防火墙已经难以应对复杂的网络威胁。此时就需要引入安全网关的概念。
安全网关不仅仅是网络设备,更是一种综合性的安全策略中枢。
入侵检测 —— 主动发现威胁的能力
前面都在做“防守”,这则是我们开始具备“反击”能力的关键节点。
在云计算环境中,入侵检测往往结合了主机级和网络级的检测手段,形成多层次的威胁感知体系。
系统安全 ➜ 网络防护 ➜ 服务加固 ➜ 边界控制 ➜ 威胁感知 ➜ 统一监控
二、系统安全介绍
我们谈论云计算安全时,很多人会第一时间想到网络隔离、API 安全、身份认证、数据加密等上层的安全机制。
然而,很少有人意识到:任何云环境,无论它是虚拟机、容器还是无服务器架构,最终都运行在操作系统之上。
而操作系统的安全性,尤其是 Linux 系统的安全机制,构成了整个云平台安全体系的底层基石。
换句话说,没有牢固的系统安全基础,云计算安全就像空中楼阁,缺乏真正的保障。
因此,要真正理解和构建一个完整的云计算安全体系,我们不能忽视对操作系统层面安全机制的学习和掌握。
三、系统安装
选择稳定版操作系统
稳定性高:稳定版本经过长期测试,Bug 较少,适合生产环境。
兼容性好:软硬件驱动支持更完善。
安全性强:通常有官方持续维护和安全更新。
Red Hat Enterprise Linux (RHEL):企业级稳定发行版。
CentOS / AlmaLinux / Rocky Linux:基于 RHEL 源代码构建,免费且稳定的替代品。
Ubuntu LTS(长期支持版):每两年发布一次,支持5年以上。
最小化安装
减少攻击面:安装的软件越少,潜在的安全漏洞越少。
节省资源:占用更少的磁盘空间、内存和CPU资源。
便于管理:系统结构清晰,便于后期维护和升级。
在安装过程中选择“Minimal Install”或“Basic Server”选项(具体名称可能因发行版不同而异)。
不要安装gcc,make
避免不必要的风险:这些工具可以用来编译恶意代码,提升系统被攻击的可能性。
符合最小化原则:不是所有服务器都需要编译功能。
提高性能:不安装非必要的开发工具包,保持系统轻量。
在生产环境中尽量不安装编译工具(如 gcc、make);如果必须使用,应按需临时安装,并在使用后卸载。
安装完系统后更新系统
yum -y update
修复已知漏洞:及时获取最新的安全补丁。
提升稳定性:更新中可能包含内核优化、驱动改进等。
功能增强:有时会引入新特性或对现有功能进行优化。
四、文件基本权限
Linux 系统中文件和目录的访问控制是通过权限位来实现的。
基本权限包括三种类型:读(read)、写(write)、执行(execute),分别对应字符 r
、w
、x
。
默认权限
文件的最大默认权限为 666(rw-rw-rw-)
目录的最大默认权限为 777(rwxrwxrwx)
实际创建时的默认权限由最大权限减去 umask
值决定:
实际权限 = 最大权限 - umask
例如:
umask 022
文件实际权限:666 - 022 = 644 →
-rw-r--r--
目录实际权限:777 - 022 = 755 →
drwxr-xr-x
特殊权限
除了基本权限外,Linux 还提供了三种特殊权限位,用于增强系统的功能性和安全性。
SUID 冒险位
作用对象:可执行的二进制文件
作用效果:运行该文件的用户将以文件拥有者的身份执行程序,而不是以执行者自己的身份运行
这在需要临时提升权限的操作中非常有用,例如
/usr/bin/passwd
就设置了 SUID,使得普通用户可以修改自己的密码(实际上是修改了只有 root 才能写的/etc/shadow
文件)。
chmod 4777 filename
4
表示设置 SUID 位效果为:
-rwsrwxrwx
SGID 强制位
作用对象:文件或目录
对文件:运行该文件的用户将以文件所属组的身份执行
对目录:在此目录下创建的新文件将自动继承该目录的组权限
SGID 在团队协作环境中非常实用,确保不同用户在共享目录中创建的文件都属于同一个组,便于统一管理。
chmod 2777 dirname
2
表示设置 SGID 位效果为:
drwxrwsrwx
Sticky/SBIT(粘滞位)
作用对象:目录
作用效果:即使其他用户对该目录有写权限,也只能删除自己拥有的文件,不能删除别人创建的文件
这种机制常见于像 /tmp
这样的公共目录,防止误删他人数据。
chmod 1777 dirname
1
表示设置 Sticky 位效果为:
drwxrwxrwt
权限类型 | 数值表示 | 作用对象 | 主要作用描述 |
---|---|---|---|
SUID | 4 | 二进制文件 | 以文件拥有者身份运行 |
SGID | 2 | 文件/目录 | 以文件组身份运行 / 新文件继承目录组 |
Sticky | 1 | 目录 | 只有文件拥有者才能删除文件 |
权限组合示例
设置 SUID + rwx:
chmod 4755 file
结果:-rwsr-xr-x
设置 SGID + rwx:
chomd 2777 dir
结果:drwxrwsrwx
设置 Sticky + rwx:
chmod 1777 dir
结果:drwxrwxrwt
同时设置 SUID、SGID、Sticky 和 rwx:
chmod 7777 dir
结果:drwsrwsrwt
五、ACL 访问控制列表
在 Linux 系统中,访问控制列表(ACL, Access Control List)提供了一种更为灵活的权限管理方式。
允许为单个用户或组设置特定的访问权限,而不局限于传统的用户、组和其他人的三类权限模式。
设置和管理 ACL
要查看某个文件或目录的 ACL 设置,可以使用 getfacl
命令:
getfacl 文件名或目录名
例如:
getfacl /path/to/file
要为文件或目录设置 ACL,可以使用 `setfacl` 命令。
为特定用户设置读写权限:
setfacl -m u:用户名:rwx 文件名或目录名
setfacl -m u:john:rwx myfile.txt
为特定组设置只读权限:
setfacl -m g:组名:r 文件名或目录名
setfacl -m g:developers:r mydir
移除特定用户的 ACL 权限:
setfacl -x u:用户名 文件名或目录名
setfacl -x u:john myfile.txt
移除所有 ACL 权限:
setfacl -b 文件名或目录名
setfacl -b myfile.txt
为默认 ACL 设置(仅对目录有效):这会影响未来在此目录下创建的所有文件和子目录。
setfacl -m d:u:用户名:rwx 目录名
setfacl -m d:u:john:rwx mydir
默认权限与递归应用
递归应用 ACL 到现有文件和子目录:
使用 -R
选项可以递归地应用 ACL 到指定目录下的所有文件和子目录。
setfacl -R -m u:用户名:rwx 目录名
setfacl -R -m u:john:rwx mydir
同时设置默认 ACL 和前 ACL:
想要设置一个目录及其所有内容的 ACL,并且希望将来添加到该目录的内容也具有相同的 ACL 时,可以结合 -R
和 -d
选项。
setfacl -Rdm u:用户名:rwx 目录名
setfacl -Rdm u:john:rwx mydir
注意事项
在使用 ACL 之前,请确保文件系统支持 ACL。大多数现代 Linux 文件系统如 ext3、ext4、XFS 都支持 ACL。
要启用 ACL 支持,可能需要在挂载文件系统时加上 acl
选项。可以通过编辑 /etc/fstab
文件来永久启用此功能。
UUID=your-uuid-here /mnt/myfs ext4 defaults,acl 0 2
使用 mount
命令临时检查或挂载文件系统是否启用了 ACL:
mount | grep acl
六、chattr
文件属性
查看文件属性
要查看一个文件前设置了哪些属性,可以使用 lsattr
命令:
chattr 文件名
例如:
chattr /path/to/file
设置文件属性
使用 chattr
命令来设置文件的特殊属性。基本语法如下:
chattr [选项] 文件...
i
(immutable, 不可变):一旦设置了此属性,文件就不能被修改、删除、重命名,甚至不能创建到该文件的链接。
只有 root 用户可以设置或清除这个属性。
设置不可变属性:
chattr +i 文件名
清除不可变属性:
chattr -i 文件名
a
(append only, 仅追加):如果设置了这个属性,文件只能以追加模式打开进行写入操作。
这对于日志文件特别有用,因为它防止了文件内容被篡改或覆盖。
同样,只有 root 用户可以设置或清除这个属性。
设置仅追加属性:
chattr +a 文件名
清除仅追加属性:
chattr -a 文件名
s
(secure deletion, 安全删除):文件被删除时,其数据块会被零填充并写回磁盘。
这对安全性要求高的环境很有用,但会增加删除操作的时间开销。
设置安全删除属性:
chattr +s 文件名
清除安全删除属性:
chattr -s 文件名
u
(undeletable, 可恢复):允许文件在被删除后仍能恢复。
如果设置了此标志,在文件被删除时,系统不会立即释放其存储空间,而是保留一段时间以便可能的恢复。
设置可恢复属性:
chattr +u 文件名
清除可恢复属性:
chattr -u 文件名
组合使用
可以同时设置多个属性。例如,要将某个文件设置为不可变且仅允许追加:
chattr +ia 文件名
应用案例
保护关键配置文件:比如 /etc/passwd
或者重要的服务配置文件,可以通过设置 +i
属性来避免它们被误删或篡改。
chattr +i /etc/passwd
保护日志文件:对于重要的日志文件,可以设置 +a
属性,确保它们只能被追加而不能被修改或删除,从而保证日志的真实性和完整性。
chattr +a /var/log/syslog
注意事项
大多数情况下,只有 root 用户能够设置或更改这些高级属性。
在执行备份或其他需要修改受保护文件的操作之前,记得先移除相应的属性,并在完成后重新应用,以确保系统的正常运行。
某些文件系统可能不支持所有的属性,请根据具体文件系统类型确认支持的特性。
七、umask
umask
的作用是 屏蔽掉某些权限位,也就是说:新建文件/目录的权限 = 默认权限 - umask
它通过从最大默认权限中减去 umask
来确定实际的权限。
理解如何配置和使用 umask
对于确保系统安全非常重要。
配置 umask
全局设置:可以通过编辑 /etc/profile
或 /etc/bashrc
(针对 bash shell)来为所有用户设置默认的 umask
值。
在 /etc/profile
中:
if [ $UID -gt 199 ] && [ "`id -gn`" = "`id -un`" ]; then
umask 002 # 普通用户
else
umask 022 # 超级用户
fi
检查是否是系统用户:
UID ≤ 199:通常是系统账户(如
root
、daemon
、bin
等)UID ≥ 500 或 1000(视发行版而定):是普通用户账户
检查当前用户是否使用的是其默认的私有主组:
id -gn
:显示当前用户的 主组名(group name)
id -un
:显示当前用户的 用户名(user name)
用户级别设置:用户可以在其主目录下的 .bashrc
或 .profile
文件中设置自己的 umask
值。
umask 027
这将导致新创建的文件具有 640
(rw-r-----)权限,而目录则具有 750
(rwxr-x---)权限。
类型 | 默认权限(八进制) | 权限说明 |
---|---|---|
文件 | 0666 |
-rw-rw-rw- |
目录 | 0777 |
drwxrwxrwx |
新建文件不会赋予执行权限(x),这是为了安全考虑。
常见 umask 设置
umask | 文件权限 | 目录权限 | 含义 |
---|---|---|---|
0022 | 644 | 755 | 所有者可读写,其他只读 |
0002 | 664 | 775 | 所有者和组可读写,其他人只读 |
0077 | 600 | 700 | 只有所有者可以读写 |
0007 | 660 | 770 | 所有者和组可读写,其他人无权限 |
八、mount
mount
命令用于挂载文件系统,并允许管理员指定各种挂载选项以增强安全性或控制访问。
正确地使用挂载选项可以防止未经授权的访问、限制功能以及保护敏感数据。
挂载选项
以下是几个与系统安全紧密相关的挂载选项:
noexec
:不允许在这个文件系统上执行任何二进制文件。这对于 /tmp
这样的临时文件系统特别有用。
mount -o noexec /dev/sdb1 /mnt/data
nosuid
:禁止在此文件系统上的文件运行 SUID/SGID 程序。这样可以减少潜在的安全风险。
mount -o nosuid /dev/sdb1 /mnt/data
nodev
:不允许访问此文件系统中的设备文件。这对防止恶意软件利用设备文件进行攻击很有帮助。
mount -o nodev /dev/sdb1 /mnt/data
nodev
是 mount 的一个选项,表示:不允许在这个挂载点上解释设备文件(device files)。换句话说,即使目录中存在设备文件(如
/mnt/data/some_device
),系统也不会把它当作真正的设备来处理。而不是禁止访问整个文件系统!
设置
nodev
并不会阻止用户访问这个文件系统中的普通文件或目录。它只是阻止了设备文件被当作实际设备使用。
场景说明:
假设你有一个挂载点
/mnt/data
,里面可能包含一些用户上传的文件。攻击者可能会故意上传一个伪造的设备文件(比如模仿
/dev/sda
或其他块设备节点),试图通过以下方式攻击系统:
执行类似
dd if=/mnt/data/fake_device ...
的命令;利用某些程序读取这些“伪设备”文件,从而访问真实设备或造成破坏。
使用
nodev
后:即使
/mnt/data
中有看起来像设备的文件,Linux 也不会将它们当作真正的设备处理。这样可以有效防止用户或程序误操作或恶意利用这些文件。
ro
(只读):将文件系统挂载为只读,适用于那些不需要写入操作的场景,如 CD-ROM 或某些备份存储。
mount -o ro /dev/cdrom /mnt/cdrom
acl
:启用访问控制列表支持,提供比传统 UNIX 权限更灵活的权限管理。
mount -o acl /dev/sda1 /data
挂载永久化
为了使这些挂载选项在重启后仍然有效,需要将它们添加到 /etc/fstab
文件中。
/dev/sdb1 /mnt/data ext4 defaults,noexec,nosuid,nodev 0 2
字段 | 内容 | 含义 |
---|---|---|
1. 设备 | /dev/sdb1 |
要挂载的设备 |
2. 挂载点 | /mnt/data |
挂载到哪个目录 |
3. 文件系统类型 | ext4 |
使用的文件系统格式 |
4. 挂载选项 | defaults,noexec,nosuid,nodev |
默认 + 不允许执行程序、不允许 setuid、不允许识别设备文件 |
5. 是否 dump | 0 |
不用 dump 备份 |
6. fsck 检查顺序 | 2 |
开机时由 fsck 检查,但优先级低于根文件系统 |
这里,defaults
包含了 rw
, suid
, dev
, exec
, auto
, nouser
, 和 async
等默认选项。
通过附加 noexec
, nosuid
, 和 nodev
,可以进一步加强该分区的安全性。
九、su
默认情况下,只有知道目标用户密码的用户才能成功使用 su
切换到该用户。
例如,要切换到 root 用户,需要输入 root 用户的密码:
su -
或者指定用户名:
su - username
为了增加安全性,可以通过多种方式限制哪些用户可以使用 su
命令切换到其他用户,尤其是 root 用户。
使用 pam_wheel
模块
pam_wheel
是一个 PAM(Pluggable Authentication Modules)模块,可以用来限制只有特定组的成员才能使用 su
切换到 root 用户。
创建一个专门用于 su
权限的组,通常命名为 wheel
:
groupadd wheel
将允许使用 su
的用户添加到这个组中:
usermod -aG wheel username
编辑 /etc/pam.d/su
文件,启用 pam_wheel
模块。
找到并取消注释或添加以下行:
auth required pam_wheel.so use_uid
这样,只有属于 wheel
组的用户才能使用 su
切换到 root 用户。
配置日志记录
为了监控 su
的使用情况,确保所有尝试使用 su
的操作都被记录下来。这可以通过配置系统日志来实现。
检查 /etc/pam.d/su
文件中是否包含以下行,以确保每次使用 su
都会被记录:
如果没有,请添加或确保相应的 PAM 模块被正确配置。
auth required pam_tally2.so audit silent
查看日志文件(/var/log/secure
),检查 su
操作的日志条目。
禁用直接 root 登录
为了进一步提高安全性,建议禁用直接以 root 用户登录的方式,用户通过自己的账户使用 su
或 sudo
切换到 root。
编辑 /etc/ssh/sshd_config
文件,设置:
PermitRootLogin no
然后重启 SSH 服务使更改生效:
systemctl restart sshd
十、sudo
在 Linux 系统中,sudo
(Superuser Do)是一个非常强大的工具,它允许系统管理员分配更细粒度的权限给普通用户,而不需要他们知道 root 密码。
通过 sudo
,可以指定哪些用户或用户组可以在什么条件下执行哪些命令,从而大大提高了系统的灵活性和安全性。
优势
增强的安全性:与直接使用
su
切换到 root 用户不同,sudo
可以限制用户只能运行特定的命令。详细的日志记录:所有通过
sudo
执行的操作都会被记录下来,便于审计和追踪。减少root密码暴露的风险:用户不需要知道 root 密码就可以执行需要超级用户权限的任务。
配置
sudo
的配置主要通过 /etc/sudoers
文件完成。
这个文件定义了哪些用户可以运行哪些命令,在哪些主机上执行这些操作等权限设置。修改此文件需要特别小心,因为任何语法错误都可能导致
sudo
命令无法正常使用,进而影响系统的管理和维护工作。
建议使用 visudo
命令来编辑该文件,因为它会在保存时检查语法错误,避免因配置错误导致无法使用 sudo
。
sudo visudo
visudo
是一个用于安全编辑 sudoers
文件的命令行工具。
是编辑 sudoers
文件的推荐方式。它会在保存时检查文件的语法正确性,并且在多个管理员同时尝试编辑该文件时提供锁定机制以防止冲突。
sudo visudo -c 检查语法
sudo -k 刷新缓存
授权
核心思想:最小权限原则 —— 只授予完成任务所需的最小权限。
基本授权格式
用户或组名 主机名列表=(目标用户) [NOPASSWD:] 命令列表
用户或组名:
username
表示某个具体用户;%groupname
表示一个用户组(前面加%
)。
主机名列表:
ALL
表示所有主机;也可以指定具体的主机名或 IP 地址。
目标用户:
(ALL)
表示可以切换到任何用户身份;(root)
表示只能以 root 身份运行;(www-data)
表示可以以 www-data 用户身份运行。
NOPASSWD:(可选)
添加后表示该用户执行这些命令时不需要输入密码。
命令列表:
指定用户可以执行的具体命令路径(建议使用绝对路径);
多个命令之间用逗号分隔。
示例说明
设置用户为ALL的时候,默认是以root的身份在执行命令
如果希望默认是以其他用户身份运行某些命令,可以这样做:
sudo -u xx some-command
允许用户 alice
执行所有命令(需要输入密码)
alice ALL=(ALL) ALL
允许用户 bob
不用密码执行所有命令
bob ALL=(ALL) NOPASSWD: ALL
允许用户 john
只能重启服务和查看日志
john ALL=(ALL) /usr/bin/systemctl restart nginx, /usr/bin/journalctl -u nginx
允许 developers
组成员不输密码更新系统
%developers ALL=(ALL) NOPASSWD: /usr/bin/apt update, /usr/bin/apt upgrade
允许用户 deployer
以 www-data
身份运行部署脚本
deployer ALL=(www-data) NOPASSWD: /opt/scripts/deploy.sh
别名简化
可以为用户、主机、命令等创建别名,使配置更清晰易维护。
sudo
支持四种类型的别名:
User_Alias:用户别名,用于定义一组用户。
Runas_Alias:目标用户别名,指定可以以哪些用户身份执行命令。
Host_Alias:主机别名,定义一组主机。
Cmnd_Alias:命令别名,定义一组命令。
# 定义用户别名,包含具体用户和 Linux 组
User_Alias ADMINS = alice, bob, %admin, %jyx# 定义主机别名
Host_Alias DB_SERVERS = db01, db02
Host_Alias WEB_SERVERS = web01, web02# 定义目标用户别名
Runas_Alias OPS = root, deploy# 定义命令别名
Cmnd_Alias SERVICES = /usr/bin/systemctl start *, /usr/bin/systemctl stop *
Cmnd_Alias LOG_VIEW = /usr/bin/journalctl -u *, /var/log/*.log# 定义规则
ADMINS DB_SERVERS=(OPS) SERVICES
ADMINS WEB_SERVERS LOG_VIEW
使用别名配置规则:
ADMINS DB_SERVERS=(ALL) SERVICES
这条规则表示:alice
和 bob
在 db01
和 db02
上可以启动、停止任意服务。
sudo 组授权
简化权限管理:无需逐个为每个用户设置权限。
便于维护和扩展:添加或移除用户时只需修改组成员。
遵循最小权限原则:可以按角色划分权限(如运维组、开发组等)。
增强审计能力:所有操作都可以追踪到具体用户。
步骤一:创建用户组
groupadd adminstaff
步骤二:将用户加入该组
usermod -aG adminstaff user1
usermod -aG adminstaff user2
-aG
表示“追加”到指定组中,不会影响用户已有的其他组。
步骤三:编辑 /etc/sudoers
文件
在文件中添加如下格式的规则:
%组名 主机列表=(目标用户) [NOPASSWD:] 命令列表
示例说明
允许 adminstaff
组执行所有命令(需输入密码)
%adminstaff ALL=(ALL) ALL
允许 developers
组无密码更新系统
%developers ALL=(ALL) NOPASSWD: /usr/bin/apt update, /usr/bin/apt upgrade
允许 deployers
组以 www-data
身份运行部署脚本
%deployers ALL=(www-data) NOPASSWD: /opt/scripts/deploy.sh
限制 monitoring
组只能查看日志
%monitoring ALL=(ALL) NOPASSWD: /usr/bin/journalctl *, /usr/bin/cat /var/log/*.log
查看 sudo 权限
用户可以通过以下命令查看自己被授予了哪些权限:
%jyx ALL=/bin/systemctl restart *
sudo -l
输出示例如下:
Matching Defaults entries for user on this host:
env_reset
User user may run the following commands on this host:
(ALL : ALL) ALL
十一、应用举例
场景一
开发人员需要部署代码
代码由
www-data
用户运行;开发者只需要拉取代码、重启服务。
配置如下:
%developers ALL=(www-data) NOPASSWD: /usr/bin/git pull origin main, /usr/bin/systemctl restart myapp
这样开发者就能以 www-data
的身份运行这两个命令,而不会获得其他权限。
场景二
监控人员只能查看日志
%monitoring ALL=(ALL) NOPASSWD: /usr/bin/journalctl *, /usr/bin/cat /var/log/*.log
防止他们修改系统设置,只允许查看日志内容。
场景三
运维团队管理服务
假设有一个运维团队需要管理多个服务器上的服务,但不需要完整的 root 权限。可以通过以下方式配置:
User_Alias OPS = alice, bob, carol
Host_Alias SERVERS = srv01, srv02, srv03
Cmnd_Alias SERVICE_CMDS = /sbin/service, /sbin/chkconfig
OPS SERVERS=(ALL) SERVICE_CMDS
这样,alice
, bob
和 carol
可以在 srv01
, srv02
, srv03
上管理服务。
场景四
开发团队部署应用
开发团队需要拉取最新代码并重启应用,但不需要其他权限。
User_Alias DEVS = john, jane, %developers
Host_Alias WEBSERVERS = web01, web02
Cmnd_Alias DEPLOY_CMDS = /usr/bin/git pull origin main, /usr/bin/systemctl restart myapp
DEVS WEBSERVERS=(www-data) NOPASSWD: DEPLOY_CMDS
这允许 john
, jane
和 developers
组的所有成员可以在 web01
和 web02
上无密码地执行 Git 拉取操作以及重启应用。
总结
项目 | 推荐做法 |
---|---|
配置方式 | 永远使用 visudo 编辑 /etc/sudoers |
授权粒度 | 尽量精确到具体命令,而非开放全部权限 |
密码验证 | 敏感操作保留密码验证,除非有自动化需求 |
日志记录 | 启用并定期审查 /var/log/auth.log 或 /var/log/secure |
分组策略 | 按照角色分组(如 dev、ops、support) |
审计追踪 | 所有 sudo 操作都应能追溯到具体用户 |
谨慎使用
NOPASSWD
:除非确实有必要自动化某些流程,否则应保留密码验证以增加安全性。限制命令范围:尽量具体化到单个命令,而不是开放广泛权限。
定期审计:检查
/etc/sudoers
文件中的配置,确保没有不必要的宽泛权限。启用日志记录:所有
sudo
操作都应记录在/var/log/auth.log
或/var/log/secure
中,以便追踪和审计。
十二、sudo
日志
在 Linux 系统中,sudo
日志是系统安全审计的重要组成部分。
通过记录用户使用 sudo
执行的命令、执行时间、执行者身份等信息,可以实现对特权操作的追踪和分析。
对于排查安全事件、加强权限管理具有重要意义。
审计用户行为:谁、在什么时间、以什么身份、执行了哪些命令。
追踪异常操作:如非法提权、敏感命令执行等。
满足合规要求:符合企业或行业对系统日志的审计标准(如 ISO27001、GDPR)。
协助故障排查:定位因权限问题导致的服务异常。
日志位置
sudo
的日志记录依赖于系统的日志服务(如 rsyslog
或 journald
),默认情况下会记录到以下文件之一:
系统类型 | 默认日志路径 |
---|---|
Debian/Ubuntu | /var/log/auth.log |
CentOS/RHEL | /var/log/secure |
使用 systemd 的系统 | 可用 journalctl 查看 |
查看日志
直接查看日志文件
Ubuntu/Debian:
grep sudo /var/log/auth.log
CentOS/RHEL:
grep sudo /var/log/secure
示例输出:
Jun 21 15:47:55 localhost sudo: jyx : TTY=pts/0 ; PWD=/root ; USER=root ; COMMAND=/bin/systemctl restart firewalld
字段说明:
user
:执行 sudo 的用户名TTY
:终端设备PWD
:前工作目录USER
:切换的目标用户(通常是 root)COMMAND
:实际执行的命令
使用 journalctl
journalctl _COMM=sudo
或者按用户过滤:
journalctl _COMM=sudo | grep 'jyx'
journalctl
默认不会记录所有sudo
命令的执行内容(除非启用了auditd
或配置了rsyslog
/journald
的详细审计)。而
/var/log/secure
是由sudo
自带的日志机制记录的,它更直接、完整地记录了用户执行的命令。
journalctl
是一款用于查询和展示 systemd
日志的强大工具。
它使得用户能够方便地访问由 systemd-journald
服务收集的日志信息。
这些信息包括系统服务日志、内核日志(如果 journald
配置为读取内核日志)以及通过 syslog
记录的应用程序日志等。
基础使用
查看所有日志
journalctl
这将显示自系统上次启动以来的所有日志条目,默认按时间倒序排列。
实时查看日志,类似于 tail -f
的功能:
journalctl -f
按服务过滤日志
查看特定服务的日志,例如 sshd
:
journalctl -u sshd.service
查看特定时间段的日志
自昨天以来的日志:
journalctl --since "yesterday"
特定日期范围内的日志,比如从2025年6月21日13点到14点:
journalctl --since "2025-06-21 13:00:00" --until "2025-06-21 14:00:00"
进阶用法
查看特定进程的日志(如 sudo
):
journalctl _COMM=sudo
查看特定用户执行的命令:
journalctl _UID=1000
其中 _UID
是用户的ID号。
输出格式化
显示详细输出:
journalctl -o verbose
JSON 格式输出,便于脚本处理:
journalctl -o json
journalctl -o json-pretty # 更易读的JSON格式
管理日志
journald
默认会保留一定量的日志数据。可以手动清理过期的日志:
journalctl --vacuum-time=2weeks # 删除超过两周的日志
journalctl --vacuum-size=500M # 限制日志大小不超过500MB
增强日志记录
虽然 sudo
默认会记录基本的日志信息,但也可以通过配置来增强其记录内容。
记录命令的输入输出(建议用于高安全性场景)
Defaults log_input, log_output
Defaults iolog_dir="/var/log/sudo-io"
注意:启用 log_input
和 log_output
会显著增加日志量,并可能影响性能。
必须配合
iolog_dir
使用;系统需支持
sudo
的 I/O 日志功能(大多数系统支持);
sudo mkdir -p /var/log/sudo-io
sudo chmod 0750 /var/log/sudo-io
sudo chown root:root /var/log/sudo-io
[root@localhost log]# tree sudo-io/
sudo-io/
├── 00
│ └── 00
│ └── 01
│ ├── log
│ ├── stderr
│ ├── stdin
│ ├── stdout
│ ├── timing
│ ├── ttyin
│ └── ttyout
└── seq
这些文件是
sudo
在启用log_input
,log_output
和iolog_dir
后自动生成的完整命令执行记录。它们可以用于回放用户的完整操作过程,包括输入、输出、时间戳等信息。
每次执行
sudo
命令都会生成一个新的子目录(如00/00/01
),每个子目录只记录一次命令的完整执行过程。
为什么设计成“每次一个子目录”?
这是为了确保:
隔离性:每个命令都有独立的日志空间,不会相互干扰;
可回放性:可以使用
sudoreplay
工具逐条还原操作过程;安全性:便于审计和追踪,避免日志被覆盖或篡改。
路径 | 含义 |
---|---|
/var/log/sudo-io |
主日志目录(iolog_dir ) |
00/00/01 |
每次 sudo 执行生成一个唯一子目录,按时间递增编号 |
文件名 | 内容类型 | 描述 |
---|---|---|
log |
元数据 | 包含用户、命令、时间、终端等基本信息 |
stdin |
输入流 | 用户输入的内容(如命令参数、密码等) |
stdout |
输出流 | 命令的标准输出内容 |
stderr |
错误流 | 命令的错误输出内容 |
timing |
时间戳 | 记录每个输入/输出事件发生的时间点(精确到毫秒) |
ttyin , ttyout |
终端输入/输出 | 如果命令是在交互式终端中运行,记录完整的终端交互 |
ttylog (可能有) |
完整终端日志 | 某些配置下会合并 ttyin/ttyout 成一个文件 |
查看log日志文件
1750493177:jyx:root::/dev/pts/0:54:206 <时间戳>:<用户>:<目标用户>::<终端设备>:<会话 UID>:<进程 PID>
/root 当前工作目录
/usr/bin/systemctl restart firewalld 执行的命令
回放日志
sudoreplay -d /var/log/sudo-io 00/00/01
日志分析流程
# 查看最近的 sudo 操作
grep sudo /var/log/secure
# 过滤某个用户的操作
grep "jyx" /var/log/secure | grep sudo
# 查看具体某条命令执行情况
tail -n 100 /var/log/secure | grep "COMMAND"
# 结合 journalctl 查询详细上下文
journalctl _COMM=sudo -u username --since "1 hour ago"
十三、日志管理(高级)
如果希望更高级的日志管理能力,可以集成以下工具:
auditd:Linux 内核级审计工具,可用于监控所有
sudo
命令执行过程。Logwatch / Logrotate:定期分析日志或轮转日志文件。
ELK Stack (Elasticsearch + Logstash + Kibana):集中化日志收集与可视化。
Splunk:强大的商业日志分析平台。
项目 | 建议 |
---|---|
日志保留周期 | 至少保留 90 天以上,满足审计需求 |
日志完整性 | 不允许普通用户修改日志文件 |
权限控制 | 限制 /var/log/auth.log 或 /var/log/secure 的访问权限 |
定期审查 | 指定人员定期检查 sudo 日志,识别可疑行为 |
警告机制 | 配合监控系统,对敏感命令执行发出告警 |
auditd
是 Linux 中的“黑匣子”,可以记录详细的系统行为日志,特别适合用于安全审计、合规审查和故障排查。
审计(Audit)在信息技术领域中指的是对系统、应用程序或网络的活动进行系统的检查和记录,以确保这些操作符合预定的安全策略、合规要求以及最佳实践。
简单来说,审计就是记录和审查系统中的各种活动,以便于后续分析、追踪问题或验证安全状况。
安装 auditd
大多数主流发行版都自带 auditd
,如果没有安装,你可以使用以下命令安装:
CentOS / RHEL / Rocky Linux
sudo yum install audit -y
Ubuntu / Debian
sudo apt install auditd audispd-plugins -y
安装完成后启动并启用服务:
sudo systemctl enable --now auditd
auditctl
是用来添加、查看、删除审计规则的命令行工具。
查看当前所有审计规则:
sudo auditctl -l
默认情况下可能没有规则。
[root@localhost sudo-io]# sudo auditctl -l
No rules
常用规则
审计某个文件或目录的访问/修改(例如 /etc/passwd
)
sudo auditctl -w /etc/passwd -p war -k passwd_access
-w 指定要监控的文件或目录
-p 希望监控的文件系统操作类型
字符 | 操作类型 | 描述 |
---|---|---|
r |
read | 文件被读取(例如使用 cat , less 等命令) |
w |
write | 文件被写入(例如使用 echo , vi 等命令修改文件内容) |
x |
execute | 文件被执行(例如运行脚本或可执行文件) |
a |
attribute change | 文件属性被更改(例如使用 chmod , chown 等命令修改文件权限或所有者) |
-k
:为这个规则设置一个关键字(方便后续查找)
监控
/etc/passwd
文件的读取、写入和属性更改操作,并为这些事件打上标签passwd_access
,方便后续查找和审计。
审计 sudo
命令的执行情况
sudo auditctl -w /usr/bin/sudo -p x -k sudo_command
审计用户登录相关事件(SSH 登录)
sudo auditctl -w /var/log/secure -p war -k secure_log
查询审计日志
ausearch
是查询 auditd
日志的工具。
查找所有与 sudo_command
相关的日志
sudo ausearch -k sudo_command
输出内容如下:
time->Sat Jun 21 17:13:30 2025
type=PROCTITLE msg=audit(1750497210.633:1666): proctitle=7375646F0073797374656D63746C0072657374617274006669726577616C6C64
type=PATH msg=audit(1750497210.633:1666): item=1 name="/lib64/ld-linux-x86-64.so.2" inode=280095 dev=fd:00 mode=0100755 ouid=0 ogid=0 rdev=00:00 obj=system_u:object_r:ld_so_t:s0 objtype=NORMAL cap_fp=0000000000000000 cap_fi=0000000000000000 cap_fe=0 cap_fver=0
type=PATH msg=audit(1750497210.633:1666): item=0 name="/bin/sudo" inode=51541346 dev=fd:00 mode=0104111 ouid=0 ogid=0 rdev=00:00 obj=system_u:object_r:sudo_exec_t:s0 objtype=NORMAL cap_fp=0000000000000000 cap_fi=0000000000000000 cap_fe=0 cap_fver=0
type=CWD msg=audit(1750497210.633:1666): cwd="/var/log/sudo-io"
type=EXECVE msg=audit(1750497210.633:1666): argc=4 a0="sudo" a1="systemctl" a2="restart" a3="firewalld"
type=SYSCALL msg=audit(1750497210.633:1666): arch=c000003e syscall=59 success=yes exit=0 a0=20fdce0 a1=21bc8f0 a2=21c6080 a3=7ffc2a9393a0 items=2 ppid=74427 pid=74480 auid=0 uid=1002 gid=1002 euid=0 suid=0 fsuid=0 egid=1002 sgid=1002 fsgid=1002 tty=pts0 ses=9 comm="sudo" exe="/usr/bin/sudo" subj=unconfined_u:unconfined_r:unconfined_t:s0-s0:c0.c1023 key="sudo_command"
说明:
用户执行了
sudo systemctl restart firewalld
;可以看到完整的命令参数;
还包括时间戳、PID、UID、终端信息等。
生成审计报告
aureport
可以根据审计日志生成各种类型的报告,非常实用。
查看所有命令执行报告
系统中所有被执行的程序的相关审计信息,包括程序名称、执行次数、成功/失败次数等
sudo aureport -x
查看所有登录事件报告
sudo aureport -l
显示的是系统中所有用户的登录和注销事件记录,包括:
用户名;
登录时间;
登录方式(如本地终端、SSH);
登出时间;
是否成功等信息。
sudo aureport -l
查看所有文件访问事件报告
sudo aureport -f
显示的是所有被审计规则监控的文件被访问、修改等操作的记录:
谁读取了
/etc/passwd
?谁修改了
/etc/shadow
?某个脚本被执行过吗?
sudo aureport -f
sudo aureport -f -i | grep /etc/sudoers
持久化规则
上面通过 auditctl
添加的规则在系统重启后会失效。
为了持久化保存,需要将规则写入配置文件:
编辑主配置文件:
sudo vi /etc/audit/audit.rules.d/audit.rules
在里面添加你需要的规则,例如:
-w /etc/passwd -p war -k passwd_access
-w /usr/bin/sudo -p x -k sudo_command
然后重启服务:
sudo systemctl restart auditd
测试你的规则是否生效
sudo systemctl restart firewalld
然后查询审计日志:
sudo ausearch -k sudo_command