Go编译生成文件SELinux上下文与父目录不一致问题排查
Go编译文件SELinux上下文为user_tmp_t的原因及解决办法
原因分析
- Go编译流程导致:
go build不会直接在目标目录生成最终可执行文件,而是先在系统临时目录(比如/tmp)创建中间产物和最终编译文件,最后再将文件移动到指定目录。由于临时目录的SELinux上下文是user_tmp_t,移动后的文件会保留原上下文,不会自动继承目标目录的bin_t。 - SELinux继承规则限制:只有直接在目标目录下新建的文件才会继承父目录的默认上下文,通过移动、复制等方式转移过来的文件会保留原有上下文属性。
解决办法
编译后手动修复上下文
编译完成后,直接给生成的可执行文件重新设置SELinux上下文:sudo restorecon -v /home/backend/你的编译文件名自定义Go编译临时目录
把Go的临时编译目录改到/home/backend下的子目录,确保临时文件的上下文本身就是bin_t,移动后自然保持该属性:- 创建专属临时目录:
mkdir /home/backend/.tmp - 给该目录设置SELinux上下文规则:
sudo semanage fcontext -a -t bin_t "/home/backend/.tmp(/.*)?" - 应用上下文设置:
sudo restorecon -Rv /home/backend/.tmp - 编译前指定临时目录环境变量:
export GOTMPDIR=/home/backend/.tmp go build
- 创建专属临时目录:
内容的提问来源于stack exchange,提问作者Meet
相关产品推荐
相关产品推荐

