通过


SELinux 上的 SQL Server 入门

本文帮助你开始将 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 包中定义。

先决条件

  1. 启用 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
    
  2. 安装定义所需自定义策略的 mssql-server-selinux 包。

注意

如果未满足任何先决条件,SQL Server 将作为 不受限制的服务运行。

最低 RHEL 次要版本要求

若要在 RHEL 9 中将 SQL Server 作为受限应用程序运行,必须使用最低 RHEL 次要版本。 由于 SELinux 包中存在点发布依赖项,因此存在此要求。 需要在限制模式下运行 SQL Server 的 mssql-server-selinux 包依赖于 selinux-policy 包和 selinux-policy-base 包。

标识最低 RHEL 次要版本的步骤

  1. 添加包含 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 存储库。

  2. 运行以下命令以查看 SELinux 策略依赖项:

    sudo dnf repoquery --requires --latest-limit=1 mssql-server-selinux | egrep '^selinux-policy(-base)?'
    
  3. 输出包括所需的最低 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 作为限制服务运行时更改数据库位置。

  1. 创建所需的目录并将其标记为 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_t SQL Server 数据库文件。 最后,该命令指定路径模式( /opt/mydb 在此示例中),并包括其中的所有文件和子目录。

  2. 使用 mssql-conf设置默认数据库位置,并运行安装程序。

    sudo /opt/mssql/bin/mssql-conf set filelocation.defaultdatadir /opt/mydb/data
    sudo systemctl restart mssql-server
    
  3. 使用 Transact-SQL 创建新数据库进行验证:

    CREATE DATABASE TestDatabase;
    GO
    
  4. 验证是否已使用相应的标签创建新数据库。

    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