使用SELinux¶
Linux内核通过LSM (Linux Security Module)支持安全增强Linux (Security- enhanced Linux, SELinux)。这个模块提供了一种支持强制访问控制策略的方法。SELinux定义了受限进程如何与文件、网络端口、目录、其他进程和其他服务器组件交互。
SELinux策略定义了一组规则类型文件和域对流程。规则决定一个流程如何与另一个类型交互。SELinux根据主题的上下文决定是否允许或拒绝操作,是什么对象发起操作以及什么对象是操作的目标。
标签代表管理员和用户的上下文。
CentOS 7和CentOS 8包含MySQL SELinux策略。雷竞技下载官网用于MySQL的Percona服务器是MySQL的直接替代品,可以使用此策略而无需更改。
SELinux上下文示例¶
要查看SELinux上下文,请添加- z切换到许多实用程序。下面是上下文的示例mysqld:
$ps易之|grepmysqld_t
预期的输出
System_u:system_r:mysqld_t:s0 3356 ?00:00:01 mysqld
上下文具有以下属性:
用户- system_u . User
角色—system_r . properties
类型或域- mysqld_t
敏感级别- s0 3356
大多数SELinux策略规则都基于类型或域。
列出与文件相关的SELinux类型或域¶
SELinux所依赖的安全属性是Type安全属性。类型名通常以a结尾_t.具有相同类型安全值的一组对象属于同一个域。
浏览mysqldb_t与MySQL目录和文件相关联的类型,执行以下命令:
$ls有没有/var/lib/|grepmysql
预期的输出
drwxr-x - x。Mysql system_u:object_r:mysqld_db_t:s0 Mysql drwxr-x——。Mysql Mysql system_u:object_r:mysqld_db_t:s0 Mysql -files drwxr-x——。Mysql Mysql system_u:object_r:mysqld_db_t:s0 Mysql -keyring
请注意
如果策略类型没有为对象定义类型属性,则默认值为unconfined_t.
SELinux模式¶
SELinux有以下模式:
Disabled -不加载SELinux策略模块,禁用策略。没有任何报道。
Permissive——SELinux是活动的,但是策略模块不是强制的。报告了策略违反,但没有停止操作。
执行——SELinux是活跃的,违反行为会被报告和否认。如果没有允许访问受限资源的规则,SELinux将拒绝该访问。
策略类型¶
SELinux有几种策略类型:
有针对性的——大多数流程不受限制地运行。特定的服务包含在安全域中,并由策略定义。
严格-所有进程都包含在安全域中,并由策略定义。
SELinux限制了在某个域中运行的进程,并限制一切,除非明确允许。在无限制域中的无限制进程允许几乎所有的访问。
MySQL是一个受限进程,策略模块定义了读取哪些文件,打开哪些端口,等等。SELinux假设雷竞技下载官网用于MySQL的Percona服务器安装使用默认文件位置和默认端口。
如果更改默认值,还必须编辑策略。如果不更新策略,SELinux将在强制模式下拒绝访问所有非默认资源。
检查SELinux模式¶
要检查当前的SELinux模式,可以使用以下命令之一:
$sestatus
预期的输出
SELinux status: enabled SELinuxfs mount: /sys/fs/ SELinux SELinux根目录:/etc/ SELinux加载的策略名称:targeted当前模式:强制配置文件中的模式:强制policy MLS status: enabled policy deny_unknown status: allowed内存保护检查:actual (secure)最大内核策略版本:31
或
$grep^ SELINUX=/etc/selinux/config
预期的输出
SELINUX =执行
请注意
添加- b参数sestatus显示政策的布尔值.显示了每个参数的布尔值。的例子b参数为:
$sestatus- b|grepmysql
预期的输出
Mysql_connect_any off selinuxuser_mysql_connect_enabled
的/etc/selinux/config文件控制SELinux是禁用还是启用,如果启用,则SELinux是在强制模式还是允许模式下运行。
禁用SELinux¶
如果您计划在其他时间使用强制模式,请使用许可模式,而不是禁用SELinux。在禁用SELinux期间,系统可能包含错误标记的对象或没有标签的对象。如果重新启用SELinux并计划将SELinux设置为强制,则必须按照以下步骤重新标记整个文件系统。
在引导时,要禁用SELinux,请设置selinux = 0内核选项。内核不加载SELinux基础结构。选项的效果与更改禁用SELINUX =指令,然后重新启动系统。
其他SELinux工具¶
安装SELinux管理工具,例如semanage或sesearch,如有需要。
在RHEL 7或兼容的操作系统上,以root用户执行如下命令:
$百胜可能是安装policycoreutils-python
在RHEL 8或兼容的操作系统上,以root用户执行如下命令:
$百胜可能是安装policycoreutils-python-utils
请注意
您可能需要root权限来运行SELinux管理命令。
在配置文件中切换模式¶
在故障排除或修改规则时切换模式可能会有所帮助。
要永久地更改模式,请编辑/etc/selinux/config文件并更改SELINUX =价值。您还应该验证更改。
$猫/etc/selinux/config|grepSELINUX=|grep- v^ #
预期的输出
SELINUX =执行SELINUX =执行
$sudosed-我/ ^ SELINUX =。* / SELINUX =宽容/ g '/etc/selinux/config美元猫/etc/selinux/config|grepSELINUX=|grep- v^ #
预期的输出
SELINUX =宽容SELINUX =宽容
更改后重新启动系统。
如果从禁用模式或允许模式切换到强制模式,请参见重新标记整个文件系统。
切换模式,直到下次重新启动¶
如果要更改模式,请以root身份使用以下命令之一:
$setenforce执行
或
$setenforce1
以下setenforce可选参数:
| setenforce参数 | 也允许 |
|---|---|
| 0 | 宽容的 |
| 1 | 执行 |
用户可以通过以下命令查看当前模式:
$getenforce
预期的输出
执行
或
$sestatus|grep-我模式
预期的输出
当前模式:permit配置文件中的模式:强制执行
切换服务模式¶
您可以将一个或多个服务移动到允许域中。其他服务保持强制模式。
以root用户执行如下命令,将服务添加到允许域。
$sudosemanage宽容的——一个mysqld_t
使用实例列出当前允许访问的域。
$sudosemanage宽容的- l
预期的输出
...mysqld_t内置允许类型
使用实例从允许域删除服务。
$sudosemanage宽容的- dmysqld_t
服务返回到系统的SELinux模式。请确保按照步骤重新标记整个文件系统。
重新标记整个文件系统¶
从禁用或允许切换到强制需要额外的步骤。强制模式需要正确的上下文或标签才能正常工作。允许模式允许用户和进程错误地标记文件和系统对象。禁用模式不加载SELinux基础结构,也不标记资源或进程。
RHEL和兼容系统,使用fixfiles申请重新贴标签。您可以重新标记整个文件系统或应用程序的文件上下文。
对于单个应用,执行如下命令:
$fixfiles- rmysqld恢复
使用实例在不重启系统的情况下重新标记文件系统。
$fixfiles- f- f重新用标签标明
另一个选项是在重新引导期间重新标记文件系统。您可以添加一个触摸文件,在重新引导操作期间读取,或者配置内核引导参数。重新贴标签操作完成后自动删除触摸文件。
将触摸文件添加为root:
$触摸/ .autorelabel
要配置内核,请添加autorelabel = 1引导参数列表中的内核参数。该参数强制系统重新标记。在允许模式下重新启动以允许流程完成,然后再更改为强制。
请注意
重新标记整个文件系统需要时间。重标签完成后,系统重新启动。
设置自定义数据目录¶
如果不使用默认设置,处于强制模式的SELinux将阻止对系统的访问。
以安装过程中所做的配置为例:
datadir = / var / lib / mysqlcustom插座= / var / lib / mysqlcustom / mysql.sock
重新启动服务。
$服务mysqld重新启动
预期的输出
重定向到/bin/systemctl重新启动mysqld。mysqld的service Job。服务failed because the control process exited with error code. See "systemctl status mysqld.service" and "journalctl -xe" for details.
检查日志以查看错误代码。
$journalctlxe
预期的输出
...SELinux阻止mysqld访问/var/lib/mysqlcustom/ibdata1. ...文件
检查SELinux类型/var/lib/mysqlcustom.
ls1阿兹/var/lib/mysqlcustom
预期的输出
总计164288 drwxr-x—x。6 mysql mysql system_u:object_r:var_lib_t:s0 4096 12月2日07:58。drwxr-xr-x。38 root root system_u:object_r:var_lib_t:s0 4096 Dec 1 14:29 .. ...-rw-r——1 mysql mysql system_u:object_r:var_lib_t:s0 12582912 Dec 1 14:29 ibdata1…
解决方法如下:
设置正确的标签
mysqlcustom文件更改mysqld SELinux策略以允许mysqld访问
var_lib_t文件。
建议设置合适的标签。下面的过程假设您已经创建并设置了自定义数据目录位置的所有权:
要更改SELinux上下文,请使用
semanage fcontext.在这一步中,定义SELinux如何处理自定义路径:$semanagefcontext——一个- e/var/lib/mysql/var/lib/mysqlcustomSELinux应用在mysqld策略中定义的相同标签模式
/var/lib/mysql目录到自定义目录。在自定义目录中创建的文件被标记,就像它们在目录中一样/var/lib/mysql.来
restorecon命令应用更改。$restorecon- r- v/var/lib/mysqlcustom重启mysqld服务:
$服务mysqld开始
设置自定义日志位置¶
如果不使用默认设置,SELinux将在强制模式下阻止对该位置的访问。将日志位置更改为my.cnf中的自定义位置:
日志错误= / logs / mysqld.log
使用以下命令验证日志位置:
$ls有没有/
预期的输出
...drwxrwxrwx。2 root root unconfined_u:object_r:default_t:s0 6 Dec 2 09:16 logs…
启动MySQL将返回以下消息:
$服务mysql开始
预期的输出
重定向到/bin/systemctl启动mysql。mysqld的service Job。服务failed because the control process exited with error code. See "systemctl status mysqld.service" and "journalctl -xe" for details. $ journalctl -xe ... SELinux is preventing mysqld from write access to the directory logs. ...
默认的SELinux策略允许mysqld将日志写入标记为var_log_t,即/var/log的位置。可以通过以下两种方式解决:
标签的
/日志位置正确编辑SELinux策略以允许mysqld访问所有目录。
标记自定义/日志定位是推荐的方法,因为它锁定了访问。运行以下命令标记自定义位置:
$semanagefcontext——一个- tvar_log_t美元/日志restorecon- v/日志
你可能无法改变/日志目录标签。例如,其他具有自己规则的应用程序使用相同的目录。
在共享目录时调整SELinux策略,请执行以下步骤:
创建本地策略:
ausearch -c 'mysqld'——raw | audit2allow -M my-mysqld该命令生成my-mysqld. conf文件。Te和my-mysqld。页文件。mysqld。Te是类型强制策略文件。my-mysqld。pp是作为二进制文件加载到SELinux子系统中的策略模块。
命令my-myslqd. exe的示例。te文件:
模块my-mysqld 1.0;需要{*类型mysqld_t*;类型var_lib_t;*类型default_t *;类文件getattr;*类目录写*} #============= mysqld_t ============== * 允许mysqld_t default_t: dir写*;允许mysqld_t var_lib_t:file getattr;策略包含自定义数据目录和自定义日志目录的规则。我们已经为数据目录位置设置了适当的标签,应用这个自动生成的策略将通过允许mysqld访问来放松我们的加固
var_lib_t标签。selinux生成的事件被转换为规则。生成的策略可能包含针对最近违规的规则,也可能包含不相关的规则。不相关的规则是由与日志目录不相关的操作生成的,例如更改数据目录位置。添加
——开始参数,以便在特定时间后使用日志事件过滤掉不需要的事件。当时间戳等于指定时间或更晚时,此参数捕获事件。SELinux为当前操作生成一个策略。$ausearch——开始10: 00:00- c“mysqld”——生|audit2allow- mmy-mysqld这个策略允许mysqld写入标记的目录。打开my_mysqld文件:
模块my-mysqld 1.0;需要{类型mysqld_t;类型default_t;类目录写入;} #============= mysqld_t ============== 允许mysqld_t default_t: dir写;安装SELinux策略模块:
$semodule-我my-mysqld.pp
重新启动服务。如果出现故障,请检查日志并遵循相同的步骤。
如果SELinux阻止mysql在目录中创建日志文件。您可以通过将SELinux模式更改为来查看所有的违规宽容的然后运行mysqld。所有违规行为都记录在日志中。运行之后,您可以生成一个本地策略模块,安装它,并将SELinux切换回执行模式。请遵循以下步骤:
卸载当前本地my-mysqld策略模块:
$semodule- rmy-mysqld您可以将单个域设置为允许模式。系统上的其他域保持强制模式。使用
semanage宽容与——一个参数将mysqld_t更改为允许模式:$semanage宽容的——一个mysqld_t验证模式更改:
$semdule- l|grep宽容的预期的输出
...permissive_mysqld_t……为了更容易地搜索日志,返回时间:
$日期启动服务。
$服务mysqld开始MySQL启动,SELinux将违规记录在日志中。检查日志:
$journalctlxe停止服务:
$服务mysqld停止使用步骤4返回的时间生成一个本地mysqld策略:
$ausearch——开始< date-c“mysqld”——生|audit2allow- mmy-mysqld检查策略(您生成的策略可能不同):
$猫my-mysqld.te预期的输出
模块my-mysqld 1.0;需要{类型default_t;类型mysqld_t;类dir {add_name write};类文件{追加创建开放};} #============= mysqld_t ============== 允许mysqld_t default_t: dir {add_name写};允许mysqld_t default_t:file {append create open};安装策略:
$semodule-我my-mysqld.pp使用
semanage宽容与- d参数,该参数删除服务的允许域:$semanage宽容的- dmysqld_t重新启动服务:
$服务mysqld开始
请注意
使用此过程调整本地mysqld策略模块。您应该检查生成的更改,以确保规则不是太宽容。
集secure_file_priv目录¶
的SELinux标记更新/var/lib/mysql-files /目录,用于选择……到输出文件或类似的操作,如果需要。服务器只需要对目标目录进行读/写访问。
设置secure_file_priv要使用该目录,运行以下命令设置上下文:
$semanagefcontext——一个- tmysqld_db_t“/ var / lib / mysql-files /(/ . *) ?”$restorecon房车/var/lib/mysql-files
如果需要,编辑不同位置的路径。