4、权限管理基础:Linux用户与组、文件权限(rwx)、特殊权限(SUID/SGID/Sticky)、ACL与sudo机制
在算能边缘AI设备的部署场景中,权限管理是安全防线中最基础也最容易被忽视的一环。边缘设备通常以Linux为宿主系统,运行着容器服务、模型推理进程、日志采集代理和远程管理通道。若权限配置不当,攻击者一旦获得低权限Shell,便可能通过越权读取模型文件、篡改推理脚本或提权至root,进而控制整台设备。本章从Linux用户与组模型出发,系统讲解文件权限位、特殊权限、ACL访问控制列表以及sudo提权机制,并结合算能设备常见的部署路径给出可落地的配置方法与排障思路。
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身份访问有限资源,无法读取系统密码文件。
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解决权限问题。这在边缘设备上是严重的安全隐患,应改为精确设置属主和属组。
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)各自创建文件,导致其他服务无法读取。解决方案:
- 创建公共组
model-share,将两个服务账户加入该组; - 设置目录属组为
model-share,并赋予SGID位:chown root:model-share /opt/sophon/models,chmod 2770 /opt/sophon/models; - 此后,任何服务在该目录下新建的文件自动继承
model-share组,组内成员均可读取。
该方案避免了频繁使用chmod调整权限,也防止了跨组访问。
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不会自动清除,需要手动检查。
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中,便于事后审计。
NOPASSWD: ALL,这等同于无密码root。即使使用NOPASSWD,也应限定到具体命令。另外,sudo的日志是安全审计的重要来源,建议将/var/log/auth.log同步到远程日志服务器,防止本地日志被篡改。
4.6 综合权限管理策略与复盘
在算能边缘AI设备上,权限管理应遵循“最小权限、按需分配、定期审计”的原则。具体落地时,建议按以下步骤执行:
- 账户梳理:禁用不必要的登录账户,删除默认密码,为每个服务创建独立账户;
- 文件权限基线:模型文件
640、配置640、可执行文件750、日志750、临时目录1777; - 特殊权限排查:定期扫描SUID/SGID文件,移除所有非必要的特殊权限位;
- ACL按需使用:当传统权限无法满足多用户协作时,使用ACL精确授权,并注意默认ACL的继承;
- sudo最小化:仅授予运维人员必要的提权命令,开启日志审计,定期检查sudoers文件;
- 容器权限约束:Docker容器运行时使用
--user参数指定非root用户,并配合--cap-drop移除Linux capabilities。
auditd监控关键路径的权限变更,例如:auditctl -w /opt/sophon/models -p wa -k model_permission。当发现异常权限变更时,及时回溯操作记录,判断是否为恶意行为或误操作。