4、权限管理基础:Linux用户与组、文件权限(rwx)、特殊权限(SUID/SGID/Sticky)、ACL与sudo机制

在算能边缘AI设备的部署场景中,权限管理是安全防线中最基础也最容易被忽视的一环。边缘设备通常以Linux为宿主系统,运行着容器服务、模型推理进程、日志采集代理和远程管理通道。若权限配置不当,攻击者一旦获得低权限Shell,便可能通过越权读取模型文件、篡改推理脚本或提权至root,进而控制整台设备。本章从Linux用户与组模型出发,系统讲解文件权限位、特殊权限、ACL访问控制列表以及sudo提权机制,并结合算能设备常见的部署路径给出可落地的配置方法与排障思路。

用户与组 root (UID 0) sophon (UID 1000) nobody (UID 65534) docker (UID 999) /etc/passwd, /etc/group 主组 + 附加组 文件权限 (rwx) -rw-r--r-- 1 root root model.bmodel 属主(u): rw- 属组(g): r-- 其他(o): r-- chmod / chown / chgrp 数字法: 644 / 755 / 600 符号法: u+x, g-w, o=r 特殊权限 / ACL / sudo SUID(4) SGID(2) Sticky(1) ACL: setfacl / getfacl sudo: /etc/sudoers, visudo 最小权限 + 审计 身份认证 权限判定 操作审计 访问控制链路:用户 → 权限位/ACL → 文件/设备/进程 模型文件: 640 root:sophon 推理进程: sophon用户运行 容器: --user 非root 设备节点: /dev/sophon sudo: 仅限特定命令 日志: /var/log/auth.log

4.1 Linux用户与组模型:身份是权限判定的起点

核心原理

Linux系统中,每个进程都关联着三个身份标识:真实用户ID(RUID)、有效用户ID(EUID)和保存用户ID(SUID)。权限判定时,内核以EUID为准。用户账户信息存储在/etc/passwd中,密码散列存储在/etc/shadow中,组信息存储在/etc/group中。每个用户至少属于一个主组(primary group),同时可以加入多个附加组(supplementary groups)。在算能边缘设备上,常见的用户包括:root(UID 0,系统管理员)、sophon(算能SDK默认创建的服务账户)、nobody(UID 65534,常用于无特权服务)以及容器运行时创建的docker用户。

判断方法与操作流程

部署边缘AI服务前,应首先梳理设备上的用户与组关系。使用以下命令进行排查:

# 查看当前用户身份
id
# 查看所有用户
cat /etc/passwd | grep -v nologin
# 查看所有组
cat /etc/group
# 查看指定用户所属组
groups sophon

创建专用服务账户时,建议使用useradd并指定家目录和Shell策略:

# 创建无登录Shell的服务账户
sudo useradd -r -s /usr/sbin/nologin -d /opt/sophon sophon
# 将用户加入docker组(仅当需要直接调用docker命令时)
sudo usermod -aG docker sophon

案例拆解:边缘设备用户规划

某算能SE5设备部署人脸识别服务,初始状态所有进程均以root运行。安全审计发现,模型推理进程一旦被漏洞利用,攻击者可直接读取/etc/shadow并植入后门。整改方案如下:

  • 创建专用账户faceai,主组为faceai,附加组为video(用于访问摄像头设备节点);
  • 将模型文件属主设为root:faceai,权限设为640,确保只有属主可写、属组可读;
  • 推理服务通过systemd单元文件以User=faceai启动,禁止root运行;
  • 日志目录/var/log/faceai属主设为faceai:faceai,权限750。

整改后,即使推理进程被攻破,攻击者也只能以faceai身份访问有限资源,无法读取系统密码文件。

风险提示:不要为了省事将所有服务都放在root下运行。边缘设备通常无人值守,一旦被入侵,root权限意味着设备完全失控。即使开发阶段使用root,生产部署前也必须切换到最小权限账户。

4.2 文件权限(rwx):理解三位一体的访问控制

核心原理

Linux文件权限由三组三元组构成:属主(u)、属组(g)、其他用户(o),每组包含读(r=4)、写(w=2)、执行(x=1)三个权限位。对于普通文件,读权限决定能否查看内容,写权限决定能否修改内容,执行权限决定能否作为程序运行。对于目录,读权限决定能否列出目录内容,写权限决定能否在目录中创建或删除文件,执行权限决定能否进入目录(即能否通过路径访问其中的文件)。

权限位 文件含义 目录含义 数值
r 读取文件内容 列出目录条目 4
w 修改文件内容 创建/删除目录中的文件 2
x 执行文件(脚本/二进制) 进入目录(cd、访问子路径) 1

判断方法与操作流程

使用ls -l查看权限位,第一字符表示文件类型(-普通文件、d目录、l符号链接、b块设备、c字符设备)。修改权限有两种方式:

# 数字法:将model.bmodel设为属主读写、属组读、其他无权限
chmod 640 model.bmodel

# 符号法:给属主增加执行权限,移除其他用户的读权限
chmod u+x,o-r model.bmodel

# 修改属主和属组
chown root:sophon model.bmodel

# 递归修改目录权限(注意不要随意使用-R)
chmod -R 750 /opt/sophon/models

常见误区与总结复盘

  • 误区一:认为目录的写权限与文件本身的写权限等价。实际上,只要对目录有写权限,即使文件是只读的,也可以删除该文件(因为删除操作针对的是目录条目)。
  • 误区二:对脚本文件只设置读权限而不设置执行权限,导致无法运行。脚本需要同时具备读和执行权限。
  • 误区三:使用chmod -R 777解决权限问题。这在边缘设备上是严重的安全隐患,应改为精确设置属主和属组。
经验建议:模型文件(.bmodel)建议使用640 root:sophon,推理可执行文件使用750 root:sophon,配置文件使用640 root:sophon。日志目录使用750 sophon:sophon,临时目录使用1777(带Sticky位)。

4.3 特殊权限:SUID、SGID与Sticky Bit

核心原理

除常规rwx权限外,Linux还提供三个特殊权限位:

  • SUID(Set User ID,数值4):仅对可执行文件有效。当用户执行该文件时,进程的EUID临时变为文件属主的UID。典型例子是/usr/bin/passwd,普通用户执行它时能以root身份修改密码文件。
  • SGID(Set Group ID,数值2):对可执行文件,进程的EGID变为文件属组的GID;对目录,在该目录下新建的文件自动继承目录的属组,常用于团队协作目录。
  • Sticky Bit(粘滞位,数值1):仅对目录有效。在带Sticky位的目录中,只有文件属主、目录属主或root才能删除或重命名文件。/tmp目录即设置了Sticky位。

判断方法与操作流程

# 查看特殊权限(s/S出现在x位置,t/T出现在其他用户x位置)
ls -l /usr/bin/passwd
# 输出: -rwsr-xr-x 1 root root 68208 ... /usr/bin/passwd

# 设置SUID(注意:数字法用4开头)
chmod 4755 /opt/sophon/tools/sophonctl

# 设置SGID(数字法用2开头)
chmod 2770 /opt/sophon/shared

# 设置Sticky Bit(数字法用1开头)
chmod 1777 /tmp

# 移除特殊权限
chmod 0755 /opt/sophon/tools/sophonctl

案例拆解:SGID在模型共享目录中的应用

算能设备上多个服务需要共享同一份模型文件目录/opt/sophon/models。初始配置中,不同服务账户(faceai、ocrsvc)各自创建文件,导致其他服务无法读取。解决方案:

  1. 创建公共组model-share,将两个服务账户加入该组;
  2. 设置目录属组为model-share,并赋予SGID位:chown root:model-share /opt/sophon/models,chmod 2770 /opt/sophon/models;
  3. 此后,任何服务在该目录下新建的文件自动继承model-share组,组内成员均可读取。

该方案避免了频繁使用chmod调整权限,也防止了跨组访问。

安全警告:SUID权限是提权攻击的高发点。在边缘设备上,应定期排查系统中所有带SUID/SGID位的文件:find / -perm -4000 -type f 2>/dev/null。对于非必要保留SUID位的程序(如自定义工具),应立即移除。

4.4 ACL访问控制列表:细粒度权限管理

核心原理

传统POSIX权限只能设置一个属主、一个属组和其他用户三类规则。ACL(Access Control List)允许为任意用户或组单独设置权限,突破了“一个文件只能有一个属组”的限制。在算能设备上,当多个服务账户需要以不同权限访问同一模型文件时,ACL是比SGID更灵活的方案。

操作流程

# 查看文件ACL
getfacl /opt/sophon/models/face_det.bmodel

# 为指定用户设置权限(r--)
setfacl -m u:ocrsvc:r-- /opt/sophon/models/face_det.bmodel

# 为指定组设置权限(rw-)
setfacl -m g:model-share:rw- /opt/sophon/models/face_det.bmodel

# 移除指定用户的ACL
setfacl -x u:ocrsvc /opt/sophon/models/face_det.bmodel

# 递归设置目录ACL(默认ACL,新文件自动继承)
setfacl -m d:u:ocrsvc:r-- /opt/sophon/models/

判断方法与注意事项

使用ls -l查看带ACL的文件时,权限位末尾会出现+号。ACL的优先级高于传统权限位:当ACL存在时,group权限位显示的是ACL mask值,而非实际属组权限。修改文件属主或属组后,ACL不会自动清除,需要手动检查。

实战要点:ACL在NFS或某些容器文件系统上可能不被支持。在算能设备上使用ACL前,先确认文件系统类型(df -T /opt/sophon),ext4和xfs原生支持ACL。若使用overlayfs(Docker默认),需在挂载时指定acl选项。

4.5 sudo机制:受控的提权通道

核心原理

sudo允许授权用户以其他用户(通常是root)身份执行命令,同时记录审计日志。与直接使用su切换用户不同,sudo不需要共享root密码,且可以精确控制“谁能执行什么命令、以什么身份执行”。配置文件为/etc/sudoers,必须使用visudo命令编辑以避免语法错误。

配置方法与判断流程

# 编辑sudoers文件
sudo visudo

# 常见配置示例
# 允许sophon用户执行所有命令(不推荐)
sophon ALL=(ALL) ALL

# 允许sophon用户无需密码重启服务
sophon ALL=(ALL) NOPASSWD: /usr/bin/systemctl restart sophon

# 允许sophon用户以root身份执行特定脚本
sophon ALL=(root) /opt/sophon/bin/update_model.sh

# 允许docker组用户执行docker命令
%docker ALL=(ALL) /usr/bin/docker

案例拆解:边缘设备sudo最小化配置

某算能设备运维需求:现场工程师需要重启推理服务、查看系统日志、更新模型文件,但不能修改系统配置或添加用户。初始sudoers配置为engineer ALL=(ALL) ALL,权限过大。整改后:

命令类别 允许的命令 是否需要密码
服务管理 systemctl restart sophon 是
日志查看 journalctl --since "1 hour ago" 否
模型更新 /opt/sophon/bin/update_model.sh 是
系统配置 禁止 —

配置后,工程师无法执行visudo、useradd等敏感命令,所有sudo操作均记录在/var/log/auth.log中,便于事后审计。

风险提示:sudo配置中避免使用NOPASSWD: ALL,这等同于无密码root。即使使用NOPASSWD,也应限定到具体命令。另外,sudo的日志是安全审计的重要来源,建议将/var/log/auth.log同步到远程日志服务器,防止本地日志被篡改。

4.6 综合权限管理策略与复盘

在算能边缘AI设备上,权限管理应遵循“最小权限、按需分配、定期审计”的原则。具体落地时,建议按以下步骤执行:

  1. 账户梳理:禁用不必要的登录账户,删除默认密码,为每个服务创建独立账户;
  2. 文件权限基线:模型文件640、配置640、可执行文件750、日志750、临时目录1777;
  3. 特殊权限排查:定期扫描SUID/SGID文件,移除所有非必要的特殊权限位;
  4. ACL按需使用:当传统权限无法满足多用户协作时,使用ACL精确授权,并注意默认ACL的继承;
  5. sudo最小化:仅授予运维人员必要的提权命令,开启日志审计,定期检查sudoers文件;
  6. 容器权限约束:Docker容器运行时使用--user参数指定非root用户,并配合--cap-drop移除Linux capabilities。
复盘要点:权限管理不是一次性配置,而是持续的过程。建议在设备上线前完成权限基线设置,每次版本更新后重新审查模型文件、脚本和配置文件的权限。使用auditd监控关键路径的权限变更,例如:auditctl -w /opt/sophon/models -p wa -k model_permission。当发现异常权限变更时,及时回溯操作记录,判断是否为恶意行为或误操作。