Linux 网络安全运维与文件权限控制和日志操作

发布于:2025-09-05 ⋅ 阅读:(25) ⋅ 点赞:(0)

一、云计算安全

在我们进入云计算与网络安全运维的学习之前,我们需要先建立一个清晰的认知框架:安全运维不是单一技术的堆砌,而是层层设防、环环相扣的一个完整体系。

它既包括对底层系统的加固,也涵盖对网络边界的控制、服务运行的保障,以及对异常行为的发现与响应。

系统安全 —— 安全运维的第一道防线

一切安全的基础,始于系统本身。无论是传统的物理服务器,还是云上的虚拟机、容器实例,操作系统的安全性始终是第一位的。

防火墙系列 —— 网络边界的安全布控

系统层面的安全基础打好之后,接下来就要考虑如何保护我们的网络边界。这正是防火墙发挥作用的地方。

服务安全 —— 内部服务的加固与防护

即便有了系统加固和网络隔离,如果内部运行的服务本身存在漏洞或配置不,依然可能成为攻击入口。

安全网关 —— 多层次安全策略的集中体现

随着业务规模扩大,仅靠单一的防火墙已经难以应对复杂的网络威胁。此时就需要引入安全网关的概念。

安全网关不仅仅是网络设备,更是一种综合性的安全策略中枢。

入侵检测 —— 主动发现威胁的能力

前面都在做“防守”,这则是我们开始具备“反击”能力的关键节点。

在云计算环境中,入侵检测往往结合了主机级和网络级的检测手段,形成多层次的威胁感知体系。

系统安全 ➜ 网络防护 ➜ 服务加固 ➜ 边界控制 ➜ 威胁感知 ➜ 统一监控

二、系统安全介绍

我们谈论云计算安全时,很多人会第一时间想到网络隔离、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),分别对应字符 rwx

默认权限

  • 文件的最大默认权限为 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:通常是系统账户(如 rootdaemonbin 等)

  • 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 用户登录的方式,用户通过自己的账户使用 susudo 切换到 root。

编辑 /etc/ssh/sshd_config 文件,设置:

PermitRootLogin no

然后重启 SSH 服务使更改生效:

systemctl restart sshd

十、sudo

在 Linux 系统中,sudo(Superuser Do)是一个非常强大的工具,它允许系统管理员分配更细粒度的权限给普通用户,而不需要他们知道 root 密码。

通过 sudo,可以指定哪些用户或用户组可以在什么条件下执行哪些命令,从而大大提高了系统的灵活性和安全性。

优势

  1. 增强的安全性:与直接使用 su 切换到 root 用户不同,sudo 可以限制用户只能运行特定的命令。

  2. 详细的日志记录:所有通过 sudo 执行的操作都会被记录下来,便于审计和追踪。

  3. 减少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

允许用户 deployerwww-data 身份运行部署脚本

deployer ALL=(www-data) NOPASSWD: /opt/scripts/deploy.sh

别名简化

可以为用户、主机、命令等创建别名,使配置更清晰易维护。

sudo 支持四种类型的别名:

  1. User_Alias:用户别名,用于定义一组用户。

  2. Runas_Alias:目标用户别名,指定可以以哪些用户身份执行命令。

  3. Host_Alias:主机别名,定义一组主机。

  4. 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

这条规则表示:alicebobdb01db02 上可以启动、停止任意服务。

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, bobcarol 可以在 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, janedevelopers 组的所有成员可以在 web01web02 上无密码地执行 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 的日志记录依赖于系统的日志服务(如 rsyslogjournald),默认情况下会记录到以下文件之一:

系统类型 默认日志路径
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_inputlog_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_outputiolog_dir 后自动生成的完整命令执行记录。

它们可以用于回放用户的完整操作过程,包括输入、输出、时间戳等信息。

每次执行 sudo 命令都会生成一个新的子目录(如 00/00/01),每个子目录只记录一次命令的完整执行过程。

为什么设计成“每次一个子目录”?

这是为了确保:

  1. 隔离性:每个命令都有独立的日志空间,不会相互干扰;

  2. 可回放性:可以使用 sudoreplay 工具逐条还原操作过程;

  3. 安全性:便于审计和追踪,避免日志被覆盖或篡改。

路径 含义
/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

网站公告

今日签到

点亮在社区的每一天
去签到