一,什么是chcon
https://man.he.net/man1/chcon
chcon - 更改文件安全上下文
chcon 是 Linux 系统中的一个命令,全称为 "Change Context",主要用于修改文件或目录的安全上下文(Security Context),这是 SELinux(Security-Enhanced Linux)安全子系统的一个重要概念。
核心作用在 SELinux 机制下,每个文件和进程都有一个安全上下文,用来描述其访问权限和限制。安全上下文通常由四个部分组成:用户:角色:类型:级别(user:role:type:level)。chcon 命令允许管理员为文件或目录分配更具体的安全策略,从而精确控制对它们的访问权限。
二,参数
[root@localhost ~]# chcon --help 用法: chcon [选项]... CONTEXT FILE... 或: chcon [选项]... [-u USER] [-r ROLE] [-l RANGE] [-t TYPE] FILE... 或: chcon [选项]... --reference=RFILE FILE...将每个 FILE 的 SELinux 安全上下文更改为 CONTEXT。使用 --reference 时,将每个 FILE 的安全上下文更改为与 RFILE 相同。长选项的强制参数对于短选项也是强制的。 --dereference 影响每个符号链接的引用目标(这是默认行为), 而不是符号链接本身 -h, --no-dereference 影响符号链接本身,而不是它引用的文件 -u, --user=USER 在目标安全上下文中设置用户 USER -r, --role=ROLE 在目标安全上下文中设置角色 ROLE -t, --type=TYPE 在目标安全上下文中设置类型 TYPE -l, --range=RANGE 在目标安全上下文中设置范围 RANGE --no-preserve-root 不特殊对待 '/'(默认行为) --preserve-root 在 '/' 上递归操作时失败 --reference=RFILE 使用 RFILE 的安全上下文,而不是指定一个 CONTEXT 值 -R, --recursive 递归操作文件和目录 -v, --verbose 为每个处理的文件输出诊断信息以下选项在同时指定 -R 选项时,修改目录层次的遍历方式。如果指定了多个,只有最后一个生效。 -H 如果命令行参数是一个指向目录的符号链接,则遍历它 -L 遍历遇到的每个指向目录的符号链接 -P 不遍历任何符号链接(默认) --help 显示此帮助信息并退出 --version 输出版本信息并退出GNU coreutils 在线帮助: <http://www.gnu.org/software/coreutils/>完整文档,请运行: info coreutils 'chcon invocation'
三,例子
修改单个文件的类型(Type)
场景:将普通文件的上下文类型修改为网络配置文件类型
# 1. 创建测试文件,并查看其默认的安全上下文[root@server ~]# touch test.txt[root@server ~]# chcon -v system_u:object_r:net_conf_t:s0 test.txt[root@server ~]# ls -Z test.txtunconfined_u:object_r:admin_home_t:s0 test.txt # 默认类型是 admin_home_t[root@localhost ctest]# ls -Z test.txt-rw-r--r--. root root system_u:object_r:net_conf_t:s0 test.txt# 2. 使用 chcon 修改类型为 net_conf_t,-v 参数用于显示详细过程[root@server ~]# chcon -v -t net_conf_t test.txt正在更改 '/root/test.txt' 的安全上下文# 3. 验证修改结果[root@server ~]# ls -Z test.txtunconfined_u:object_r:net_conf_t:s0 test.txt # 验证:类型已成功修改为 net_conf_t
参考已有文件修改上下文(Reference)
场景:让新创建的文件完全继承某个系统标准文件的上下文(包括用户、角色、类型等)
# 1. 创建临时文件,查看其默认上下文[root@localhost ctest]# touch temp[root@localhost ctest]# chcon -v system_u:object_r:net_conf_t:s0 temp changing security context of ‘temp’[root@localhost ctest]# ls -Z temp-rw-r--r--. root root system_u:object_r:net_conf_t:s0 temp# 2. 查看参考文件(/var/log/tallylog )的上下文[root@localhost ctest]# ls -Z /var/log/tallylog -rw-------. root root system_u:object_r:faillog_t:s0 /var/log/tallylog[root@localhost ctest]# chcon -v --reference=/var/log/tallylog ./tempchanging security context of ‘./temp’[root@localhost ctest]# ls -Z temp-rw-r--r--. root root system_u:object_r:faillog_t:s0 temp
递归修改目录及子文件(Recursive)
场景:将自定义的 Web 目录及其内部所有文件,批量修改为允许 Nginx/Apache 访问的 Web 内容类型
# 1. 创建自定义网页目录,查看其默认上下文[root@localhost ctest]# mkdir -p /www/nginx[root@localhost ctest]# ls -Zd /www/nginxdrwxr-xr-x root root ? /www/nginx[root@localhost ctest]# chcon -v system_u:object_r:net_conf_t:s0 /www/nginx/changing security context of ‘/www/nginx/’[root@localhost ctest]# ls -Zd /www/nginxdrwxr-xr-x. root root system_u:object_r:net_conf_t:s0 /www/nginx# 2. 使用 -R 递归修改,参考系统默认的 nginx 目录上下文[root@localhost ctest]# chcon -Rv --reference=/var/log/tallylog /www/nginxchanging security context of ‘/www/nginx’[root@localhost ctest]# ls -Zd /www/nginxdrwxr-xr-x. root root system_u:object_r:faillog_t:s0 /www/nginx
四,补充
作者 本文件由Russell Coker和Jim Meyering编写。
报告错误 GNU核心工具在线帮助:<https://www.gnu.org/software/coreutils/> 如发现任何翻译错误,请向<https://translationproject.org/team/>报告
版权 (C) 2020 自由软件基金会股份有限公司。许可证 GPLv3+:GNU GPL 版本 3 或更高版本 <https://gnu.org/licenses/gpl.html>。
这是自由软件:您可以自由修改和重新分发。
在法律允许的范围内,不提供任何担保。
另见 完整文档 <https://www.gnu.org/software/coreutils/chcon> 或可通过以下方式在本地获取:info '(coreutils) chcon invocation'
常见的上下文标识
| | | |
|---|
| | httpd_t | 标识 Web 服务器进程,定义其整体的访问权限范围 |
| | httpd_sys_content_t | |
| | httpd_log_t | |
| | mysqld_t | |
| | mysqld_db_t | 标识数据库的数据文件,仅允许 mysqld_t 等特定进程读写 |
| | sshd_t | |
| | sshd_exec_t | |
| | ssh_port_t | |
| | tmp_t | 标识临时文件,默认限制 httpd_t 等网络服务访问,防止越权 |
| | var_t | |
| | usr_t | |
| | var_log_t | |
| | passwd_file_t | |
五,总结
chcon是更改文件安全上下文,生产环境建议:如果在生产环境中需要永久保留上下文修改,建议在测试好 chcon 命令后,使用 semanage fcontext -a -t <类型> <路径> 将规则写入策略,然后再执行 restorecon -Rv <路径> 使其永久生效。
最后的最后(Last but not least),欢迎交流:
关注公众号留言,或者在下方直接留言: