SELinux 原创 Linux平台 2022年3月4日 15:30 夏至未至 887 当前内容 7786 字,在路上,马上到,马上到 ### 何为selinux 安全增强型 Linux(Security-Enhanced Linux)简称 SELinux,它是一个 Linux 内核模块,也是 Linux 的一个安全子系统。2.6 及以上版本的 Linux 内核都已经集成了 SELinux 模块。SELinux 的核心是安全上下文,进程和文件的安全上下文对应上了,进程才能访问文件。文件安全上下文由文件创建的位置和创建文件的进程所决定。而且系统有一套默认值,用户也可以对默认值进行设定。单纯的移动文件操作并不会改变文件的安全上下文。 ### 为何使用selinux SELinux 能最大限度地减小系统中服务进程可访问的资源。这属于访问控制,其分类如下: #### 自主访问控制 DAC:在没有使用 SELinux 的操作系统中,决定一个资源是否能被访问的因素是:某个资源是否拥有对应用户的权限(读、写、执行)。只要访问这个资源的进程符合以上的条件就可以被访问。但 root 用户不受任何管制,系统上任何资源都可以无限制地访问。这种权限管理机制的主体是用户,也称为自主访问控制(DAC)。 #### 强制访问控制 MAC:在使用了 SELinux 的操作系统中,决定一个资源是否能被访问的因素除了上述因素之外,还需要判断每一类进程是否拥有对某一类资源的访问权限。这样,即使进程是以 root 身份运行的,也需要判断这个进程的类型以及允许访问的资源类型才能决定是否允许访问某个资源。进程的活动空间也可以被压缩到最小。即使是以 root 身份运行的服务进程,一般也只能访问到它所需要的资源。即使程序出了漏洞,影响范围也只有在其允许访问的资源范围内。安全性大大增加。这种权限管理机制的主体是进程,也称为强制访问控制(MAC)。 在 DAC 模式下,只要相应目录有相应用户的权限,就可以被访问。而在 MAC 模式下,还要受进程允许访问目录范围的限制。 ### selinux状态管理 SELinux 工作状态可以在 /etc/selinux/config 中设定。 #### 关闭 1、临时关闭(不用重启机器): setenforce 0 2、修改配置文件(需要重启机器): vim /etc/selinux/config SELINUX=enforcing 改为 SELINUX=disabled ### selinux基本操作 #### 安全上下文结构 安全上下文有四个字段,分别用冒号隔开。形如: system_u:object_r:admin_home_t:s0。 #### 查询文件安全上下文 ls -Z <文件> ls -Zd <目录> 用法举例 [root@localhost mysql_load_file]# ll -Z codecomeon.jpg -rwxrwxrwx. root root unconfined_u:object_r:mysqld_db_t:s0 codecomeon.jpg [root@localhost mysql_load_file]# [root@localhost mysql_load_file]# #### 查询进程的安全上下文 ps auxZ | grep -v grep | grep <进程名> 用法举例 [root@localhost /]# ps auxZ | grep -v grep | grep mysql system_u:system_r:mysqld_t:s0 mysql 45408 0.0 17.6 1124388 175360 ? Sl 02:00 0:00 /usr/sbin/mysqld --daemonize --pid-file=/var/run/mysqld/mysqld.pid [root@localhost /]# #### 修改文件安全上下文 chcon <选项> <文件或目录 1> [<文件或目录 2>...] 选项功能: - -u <值>修改安全上下文的用户字段 - -r <值>修改安全上下文的角色字段 - -t <值>修改安全上下文的类型字段 - -l <值>修改安全上下文的级别字段 - --reference <文件或目录>修改与指定文件或目录相一致的安全上下文 - -R递归操作 - -h修改软链接的安全上下文(不加此选项则修改软链接对应文件) 用法举例 chcon -u 123_u -r 456_r -t 789_t test #### 恢复默认安全上下文 restorecon [选项] <文件或目录 1> [<文件或目录 2>...] 选项功能: - -v打印操作过程 - -R递归操作 用法举例 // 添加一些网页文件到 Nginx 服务器的目录之后,为这些新文件设置正确的安全上下文。 restorecon -R /usr/share/nginx/html/ #### 修改默认安全上下文 semanage fcontext -a -t <文件安全上下文中的类型字段> "<目录(后面不加斜杠)>(/.*)?" semanage命令常用选项及含义: - -a 添加默认安全上下文配置。 - -d 删除指定的默认安全上下文。 - -m 修改指定的默认安全上下文。 - -t 设定默认安全上下文的类型 举例: 【例 1】查询默认安全上下文: [root@localhost /]# semanage fcontext -l | grep "/mysql_load_file" /mysql_load_file(/.*)? all files system_u:object_r:mysqld_db_t:s0 [root@localhost /]# 能够看到 `mysql_load_file` 目录下所有内容的默认安全上下文都是 `mysqld_db_t`,所以,一旦对 `mysql_load_file` 目录下文件的安全上下文进行了修改,就可以使用 restorecon 命令进行恢复,因为默认安全上下文已经明确定义了。 【例 2】修改默认安全上下文: [root@localhost /]# mkdir /data 新建/data/目录,改变其安全上下文,使得mysql能访问: [root@localhost /]# ls -Zd /data/ drwxrwxrwx. root root unconfined_u:object_r:default_t:s0 /data/ [root@localhost /]# 而这个目录的安全上下文类型是`default_t`,那么`mysql`进程当然就不能访问和使用/data/目录了 这时我们可以直接设置 /data/ 目录的安全上下文类型为 `mysqld_db_t`,但是为了以后管理方便,我打算修改 /data/ 目录的默认安全上下文类型。先查询一下 /data/ 目录的默认安全上下文类型,命令如下: [root@localhost /]# semanage fcontext -l | grep "/data" 查询结果如下: [root@localhost /]# semanage fcontext -l | grep "/data" /var/lib/rt(3|4)/data/RT-Shredder(/.*)? all files system_u:object_r:httpd_var_lib_t:s0 /etc/ntp/data(/.*)? all files system_u:object_r:ntp_drift_t:s0 /var/named/data(/.*)? all files system_u:object_r:named_cache_t:s0 /var/lib/dspam/data(/.*)? all files system_u:object_r:dspam_rw_content_t:s0 /var/lib/openshift/.*/data(/.*)? all files system_u:object_r:openshift_rw_file_t:s0 /var/www/moodle/data(/.*)? all files system_u:object_r:httpd_sys_rw_content_t:s0 /var/lib/stickshift/.*/data(/.*)? all files system_u:object_r:openshift_rw_file_t:s0 /var/lib/pgsql/data/pg_log(/.*)? all files system_u:object_r:postgresql_log_t:s0 /var/www/html/owncloud/data(/.*)? all files system_u:object_r:httpd_sys_rw_content_t:s0 /var/www/html/nextcloud/data(/.*)? all files system_u:object_r:httpd_sys_rw_content_t:s0 /var/named/chroot/var/named/data(/.*)? all files system_u:object_r:named_cache_t:s0 /opt/mysql/data(/.*)? all files system_u:object_r:mysqld_db_t:s0 [root@localhost /]# 查询出了结果,但是并没有 /data/ 目录的默认安全上下文,因为这个目录是手工建立的,并不是系统默认目录,所以并没有默认安全上下文,需要我们手工设定。命令如下: [root@localhost /]# semanage fcontext -a -t mysqld_db_t "/data(/.*)?" 这条命令会给 /data/ 目录及目录下的所有内容设定默认安全上下文类型是 `mysqld_db_t` 再次查询: [root@localhost /]# [root@localhost /]# semanage fcontext -l | grep "/data" /var/lib/rt(3|4)/data/RT-Shredder(/.*)? all files system_u:object_r:httpd_var_lib_t:s0 /etc/ntp/data(/.*)? all files system_u:object_r:ntp_drift_t:s0 /var/named/data(/.*)? all files system_u:object_r:named_cache_t:s0 /var/lib/dspam/data(/.*)? all files system_u:object_r:dspam_rw_content_t:s0 /var/lib/openshift/.*/data(/.*)? all files system_u:object_r:openshift_rw_file_t:s0 /var/www/moodle/data(/.*)? all files system_u:object_r:httpd_sys_rw_content_t:s0 /var/lib/stickshift/.*/data(/.*)? all files system_u:object_r:openshift_rw_file_t:s0 /var/lib/pgsql/data/pg_log(/.*)? all files system_u:object_r:postgresql_log_t:s0 /var/www/html/owncloud/data(/.*)? all files system_u:object_r:httpd_sys_rw_content_t:s0 /var/www/html/nextcloud/data(/.*)? all files system_u:object_r:httpd_sys_rw_content_t:s0 /var/named/chroot/var/named/data(/.*)? all files system_u:object_r:named_cache_t:s0 /opt/mysql/data(/.*)? all files system_u:object_r:mysqld_db_t:s0 /data(/.*)? all files system_u:object_r:mysqld_db_t:s0 [root@localhost /]# /data/目录的默认安全上下文出现了,这时已经设定好了 /data/ 目录的默认安全上下文类型为:`mysqld_db_t`。 [root@localhost /]# ls -Zd /data/ drwxrwxrwx. root root unconfined_u:object_r:default_t:s0 /data/ [root@localhost /]# 但是查询发现 /data/ 目录的安全上下文并没有进行修改,那是因为我们只修改了默认安全上下文,而没有修改目录的当前安全上下文,修改即可: [root@localhost /]# restorecon -Rv /data/ restorecon reset /data context unconfined_u:object_r:default_t:s0->unconfined_u:object_r:mysqld_db_t:s0 restorecon reset /data/codecomeon.jpg context unconfined_u:object_r:default_t:s0->unconfined_u:object_r:mysqld_db_t:s0 restorecon reset /data/ning.txt context unconfined_u:object_r:default_t:s0->unconfined_u:object_r:mysqld_db_t:s0 restorecon reset /data/ning context unconfined_u:object_r:default_t:s0->unconfined_u:object_r:mysqld_db_t:s0 restorecon reset /data/ning/ning.txt context unconfined_u:object_r:default_t:s0->unconfined_u:object_r:mysqld_db_t:s0 [root@localhost /]# [root@localhost /]# ls -Zd /data/ drwxrwxrwx. root root unconfined_u:object_r:mysqld_db_t:s0 /data/ [root@localhost /]# [root@localhost /]# cd data/ [root@localhost data]# ls -Z * -rwxr-xr-x. root root unconfined_u:object_r:mysqld_db_t:s0 codecomeon.jpg [root@localhost data]# 恢复一下 /data/ 目录的默认安全上下文,发现类型已经被修改为 `mysqld_db_t`。至此基本就会使用了。 本文标题: SELinux 本文作者: 夏至未至 发布时间: 2022年3月4日 15:30 最近更新: 2022年3月7日 19:06 原文链接: 许可协议: 署名-非商业性-禁止演绎 4.0 国际(CC BY-NC-ND 4.0) 请按协议转载并保留原文链接及作者 SELinux(1) 上一个 MySQL错误日志时间和系统时间不同解决 下一个 Linux多库并行多表并行造MySQL大数据 当前文章评论暂未开放,请移步至留言处留言。