如何为R环境配置最严格AppArmor Profile以保障Shiny应用运行安全
符合要求的最严格AppArmor Profile及说明
profile r-sandbox flags=(attach_disconnected,mediate_deleted) { # 加载最小依赖抽象规则,避免重复写基础系统调用权限 #include <abstractions/base> #include <abstractions/nameservice> # 基础proc权限,R运行必需 @{PROC}/[0-9]*/attr/current r, @{PROC}/sys/kernel/random/uuid r, @{PROC}/cpuinfo r, @{PROC}/meminfo r, # 仅允许R运行必需的系统二进制,禁止其他任意/bin、/usr/bin下文件执行 /bin/bash rix, /bin/sh rix, /usr/bin/R rix, /usr/bin/Rscript rix, # 设备与基础系统配置读权限,无写权限 /dev/tty r, /dev/urandom r, /etc/R/** r, /etc/fonts/** mr, /etc/resolv.conf r, /etc/ssl/certs/** r, /etc/xml/** r, # R核心运行目录权限,全部设为只读+执行,禁止修改 /usr/lib/R/** mr, /usr/lib/R/bin/exec/R rix, /usr/lib{,32,64}/lib*.so* mr, # 预设许可包专属权限,仅开放允许调用的包目录读权限 # 可按实际需保留的包按需新增路径,例如gdistance: /usr/local/lib/R/site-library/gdistance/** mr, /usr/local/lib/R/site-library/[其他允许的包名]/** mr, # 临时目录仅允许当前进程读写,禁止执行,避免上传恶意二进制运行 /tmp/ rw, /tmp/** rw, deny /tmp/** x, # 全局拒绝规则:覆盖所有未显式允许的路径 # 禁止访问用户家目录、其他R包目录、Docker映射的宿主机目录(可按需单独放开) deny /** w, deny /home/** rwxl, deny /root/** rwxl, deny /usr/local/lib/R/site-library/*/ w, deny /usr/lib/R/site-library/*/ w, }
规则核心逻辑说明
- 权限收紧:删除了原宽松配置中
/bin/* rix、/usr/bin/* rix、/usr/local/lib/R/** mr这类过宽的权限,仅显式放开R运行必需的二进制和依赖库 - 禁止安装新包:所有R包安装目录均设为只读,全局拒绝未显式允许的路径写权限,用户无权限向任何R库目录写入文件
- 恶意代码防护:临时目录禁止执行权限,避免用户上传恶意二进制文件后调用执行;默认拒绝所有用户目录、未授权R包目录的访问权限
- 自定义适配:如果需要新增允许调用的R包,只需在预设许可包权限段新增对应包的目录规则即可;如果需要开放特定Docker映射目录的读写权限,单独新增对应路径的
rw权限规则即可
部署前需先在调试模式下运行AppArmor,将沙箱运行的拒绝日志导出,补充遗漏的R基础依赖路径,避免规则过严导致核心功能异常。
内容的提问来源于stack exchange,提问作者user
相关产品推荐
相关产品推荐

