bash如何创建仅当前运行的脚本进程可访问的文件
解答
Linux 系统的权限模型决定了 root 用户默认拥有所有文件的访问权限,无法做到完全屏蔽 root 对该文件的访问,以下方案可以实现除 root 外,仅当前运行的 bash 脚本进程可访问文件的需求,尽可能降低泄露风险。
方案1:基础权限限制
通过设置 umask 确保新创建文件的默认权限为仅所有者可读写,其余用户无任何权限,适合需要保留文件实体在磁盘的场景。# 设置umask为077,后续新建文件默认权限为600,新建目录默认权限为700 umask 077 # 创建目标文件 touch /your/disk/path/target_file # 可选:二次设置权限避免环境异常导致umask不生效 chmod 0600 /your/disk/path/target_file该方案下仅脚本运行用户和root可以访问文件,其余普通用户无任何访问权限。
方案2:无入口临时文件(更安全,推荐)
利用Linux「进程持有文件描述符时,即使文件从文件系统删除,持有进程仍可正常读写」的特性,创建临时文件后立即删除文件系统入口,同用户的其他进程也无法找到文件路径访问,仅当前脚本持有的文件描述符可操作文件。# 在内存文件系统/dev/shm创建随机名称临时文件,mktemp默认生成权限为600的文件 tmp_file=$(mktemp /dev/shm/script_tmp.XXXXXX) # 给当前脚本打开文件描述符3,绑定到该临时文件,支持读写 exec 3<>"$tmp_file" # 立即删除文件系统入口,其他进程无法通过路径搜索到该文件 rm -f "$tmp_file" # 使用示例:往文件写入内容 echo "your sensitive content" >&3 # 读取文件全部内容 cat <&3 # 脚本退出前可主动关闭文件描述符,进程退出时系统也会自动回收 exec 3>&-该方案下仅root用户可以通过
/proc/<脚本进程PID>/fd/3路径访问到文件内容,其余所有普通用户(包括和脚本同运行用户的其他进程)都无法访问该文件。
注意:所有方案都无法阻止root用户访问文件,这是Linux系统设计的固有特性,root用户可绕过所有常规权限校验。
内容的提问来源于stack exchange,提问作者Victor Lee
相关产品推荐
相关产品推荐

