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 将作为 不受限制的服务运行。

将 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 类型

当可选的 SELinux 策略随 mssql-server-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 类型,在本例中为 SQL Server 数据库文件 mssql_db_t。 最后,指定路径模式,此示例中 /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(类型)。