审计加固socket文件权限的核心是确保仅授权进程或用户能访问,需依次识别定位关键socket文件、检查当前权限与上下文、从源头控制创建行为、运行时防护验证,覆盖路径、权限、属主属组、selinux/xattrs及启动配置。

审计和加固系统内部通信使用的 Socket 文件权限,核心是确保只有授权进程或用户能访问这些通信端点,防止未授权读写、劫持或提权。Unix 域套接字(AF_UNIX)以文件形式存在于文件系统(如 /run/myapp.sock 或 /tmp/xxx.sock),其文件权限、属主属组、创建上下文及运行时行为都需检查。
一、识别并定位关键 Socket 文件
先确认哪些进程在使用 Unix 域套接字,并找出对应路径:
- 用
ss -xl | grep -v '@'列出所有监听中的 Unix 套接字(排除抽象命名空间) - 结合
lsof -U查看每个 socket 对应的进程 PID 和路径 - 检查服务配置(如 systemd service 文件中的
SocketPath=、应用日志或源码中bind()调用的路径) - 常见高风险位置:
/tmp/、/var/run/、/run/、/dev/shm/—— 尤其注意非 root 进程创建在全局可写目录下的 socket
二、检查 Socket 文件当前权限与上下文
对已知 socket 路径(如 /run/dbus/system_bus_socket),执行:
-
ls -l /path/to/socket:关注权限(如srw-rw-rw-表示所有用户可读写,极不安全)、属主(root最佳)、属组(如dbus可接受) -
getfattr -d /path/to/socket(如启用 xattrs):检查是否标记了security.capability或 SELinux 标签(如system_u:object_r:dbusd_var_run_t:s0) -
stat -c "%U %G %a %n" /path/to/socket:批量获取属主、属组、八进制权限
⚠️ 风险典型模式:srwxrwxrwx(全开)、属主为普通用户但权限宽松、属组为 wheel 或 users 却未限制组访问。
三、从源头加固:控制创建行为
权限问题多源于进程启动时未显式设置 umask 或 chmod。加固需从服务启动阶段介入:
-
systemd 服务:在
.socket单元中用SocketMode=0600、SocketUser=root、SocketGroup=dbus;或在.service中通过UMask=0077限制默认掩码 -
手动 bind 的应用:确保调用
bind()后立即执行chmod(2)设置严格权限(如0600或0660),并在listen()前完成 -
避免使用 /tmp:改用
/run/(tmpfs,root 挂载,自动清理),并通过RuntimeDirectory=(systemd)或mkdir -m 0750 /run/myapp预创建受控目录
四、运行时防护与验证
加固后需验证有效性并持续监控:
- 重启服务,确认 socket 文件权限符合预期(如
srw-------或srw-rw----且属组可信) - 用非授权用户尝试连接:
sudo -u nobody socat - UNIX-CONNECT:/run/myservice.sock,应失败 - 加入定期检查脚本(如 cron 每小时运行):
find /run /var/run -name "*.sock" -perm /007 -ls报告权限过宽项 - 在支持环境中启用 SELinux/AppArmor:为 socket 路径定义类型,限制仅特定域可 connectto
不复杂但容易忽略的是:很多服务依赖第三方库创建 socket(如 libsystemd),必须查阅其文档确认是否支持权限配置,否则需包裹启动逻辑或打补丁。










