本文帮助你开始将 SQL Server 作为基于 Red Hat Enterprise Linux (RHEL) 的 Security-Enhanced Linux (SELinux) 分发上的 受限服务 。
什么是 Security-Enhanced Linux?
Security-Enhanced Linux(SELinux)是 Linux 系统的安全体系结构。 它有助于为系统上的应用程序、进程和文件定义访问控制。 SELinux 使用一组规则(或 安全策略)来定义可以访问或无法访问的内容。 SELinux 为管理员可以更好地控制谁可以访问系统。 有关详细信息,请参阅 什么是 SELinux(Security-Enhanced Linux)。
有关如何为 Red Hat 系统启用 SELinux 的详细信息,请参阅 SELinux 体系结构。 你也可以免费地开始使用启用了 SELinux 的操作系统。
Linux 上的 SQL Server 2022 已正式获得 RHEL 9(截至 2024 年 7 月)的认证,现已正式在 Red Hat 生态系统目录上正式发布。
SQL Server 和 SELinux
使用 SELinux 的受限服务意味着它受到 SELinux 策略中明确定义的安全规则的限制。 对于 SQL Server,SELinux 自定义策略在 mssql-server-selinux 包中定义。
先决条件
启用 SELinux 并将其设置为
enforcing模式。 通过运行sestatus命令检查 SELinux 状态。sestatus下面是预期的输出。
SELinux status: enabled SELinuxfs mount: /sys/fs/selinux SELinux root directory: /etc/selinux Loaded policy name: targeted Current mode: enforcing Mode from config file: enforcing Policy MLS status: enabled Policy deny_unknown status: allowed Memory protection checking: actual (secure) Max kernel policy version: 33安装定义所需自定义策略的
mssql-server-selinux包。
注意
如果未满足任何先决条件,SQL Server 将作为 不受限制的服务运行。
最低 RHEL 次要版本要求
若要在 RHEL 9 中将 SQL Server 作为受限应用程序运行,必须使用最低 RHEL 次要版本。 由于 SELinux 包中存在点发布依赖项,因此存在此要求。 需要在限制模式下运行 SQL Server 的 mssql-server-selinux 包依赖于 selinux-policy 包和 selinux-policy-base 包。
标识最低 RHEL 次要版本的步骤
添加包含
mssql-server-selinux的 SQL Server 存储库。对于 RHEL 9 上的 SQL Server 2025 (17.x):
sudo curl -o /etc/yum.repos.d/mssql-server.repo https://packages.microsoft.com/config/rhel/9/mssql-server-2025.repo对于 RHEL 9 上的 SQL Server 2022 (16.x):
sudo curl -o /etc/yum.repos.d/mssql-server.repo https://packages.microsoft.com/config/rhel/9/mssql-server-2022.repo注意
如果计划在 RHEL 10 上安装,请更改为 RHEL 10 存储库。
运行以下命令以查看 SELinux 策略依赖项:
sudo dnf repoquery --requires --latest-limit=1 mssql-server-selinux | egrep '^selinux-policy(-base)?'输出包括所需的最低 SELinux 策略版本,这是通过后缀(例如
.el9_6)来指示的。 此后缀表示为其构建策略的最低 RHEL 9 次要版本。 例如,.el9_6对应于 RHEL 9.6。如果输出中未显示此类后缀,请参阅 Red Hat 文档以确定与该 SELinux 策略生成关联的最低 RHEL 次要版本。 在下面的示例中,所需的 SELinux 基本版本为
38.1.53-5。sudo dnf repoquery --requires --latest-limit=1 mssql-server-selinux | egrep '^selinux-policy(-base)?'下面是示例输出:
selinux-policy >= 38.1.53-5.el9_6 selinux-policy-base >= 38.1.53-5.el9_6在此示例中,最高次要版本标记要求是
38.1.53-5.el9_6。 因此,至少需要 RHEL 9.6 才能使用 SELinux(mssql-server-selinux)安装 SQL Server,并将其作为受限应用程序在 RHEL 9 上运行。
将 SQL Server 安装为受限服务
默认情况下,mssql-server 包安装 SQL Server 时不包含 SELinux 策略,SQL Server 作为无约束的服务运行。
mssql-server 包安装会自动启用 selinux_execmode 布尔值。 可以使用以下命令验证 SQL Server 是否正在未受限制地运行:
ps -eZ | grep sqlservr
下面是预期的输出。
system_u:system_r:unconfined_service_t:s0 48265 ? 00:00:02 sqlservr
安装 mssql-server-selinux 包时,它会启用限制 sqlservr 进程的自定义 SELinux 策略。 安装此策略时,selinuxuser_execmod 布尔值将被重置,并替换成名为 mssql 的策略。 此策略将 sqlservr 过程限制在新 mssql_server_t 域中。
ps -eZ | grep sqlservr
下面是预期的输出。
system_u:system_r:mssql_server_t:s0 48941 ? 00:00:02 sqlservr
SQL Server 和 SELinux 类型
使用 mssql-server-selinux 包安装可选的 SELinux 策略时,它会定义一些新类型:
| SELinux 策略 | 描述 |
|---|---|
mssql_opt_t |
将 mssql-server 的文件安装到 /opt/mssql |
mssql_server_exec_t |
/opt/mssql/bin/ 中的可执行文件 |
mssql_paldumper_exec_t |
需要特殊权限来管理核心转储的可执行文件和脚本 |
mssql_conf_exec_t |
/opt/mssql/bin/mssql-conf 中的管理工具 |
mssql_var_t |
/var/opt/mssql 中的文件的标签 |
mssql_db_t |
/var/opt/mssql/data 中的数据库文件的标签 |
例子
以下示例演示如何在 SQL Server 作为限制服务运行时更改数据库位置。
创建所需的目录并将其标记为
mssql_db_t。sudo mkdir -p /opt/mydb/ sudo chown mssql:mssql /opt/mydb sudo semanage fcontext -a -t mssql_db_t "/opt/mydb(/.*)?" sudo restorecon -R -v /opt/mydb命令
semanage fcontext管理 SELinux 文件上下文映射。 该-a参数会添加新的文件上下文规则,参数-t定义要应用的 SELinux 类型,在本例中适用于mssql_db_tSQL Server 数据库文件。 最后,该命令指定路径模式(/opt/mydb在此示例中),并包括其中的所有文件和子目录。使用 mssql-conf设置默认数据库位置,并运行安装程序。
sudo /opt/mssql/bin/mssql-conf set filelocation.defaultdatadir /opt/mydb/data sudo systemctl restart mssql-server使用 Transact-SQL 创建新数据库进行验证:
CREATE DATABASE TestDatabase; GO验证是否已使用相应的标签创建新数据库。
sudo ls -lZ /opt/mydb/data/下面是预期的输出。
total 16384 -rw-rw----. 1 mssql mssql system_u:object_r:mssql_db_t:s0 8388608 Aug 2 14:27 TestDatabase_log.ldf -rw-rw----. 1 mssql mssql system_u:object_r:mssql_db_t:s0 8388608 Aug 2 14:27 TestDatabase.mdf在前面的示例中,您可以看到该文件与新创建文件相关联的类型是
mssql_db_t。