跳转至

SELinux 安全配置

SELinux(Security-Enhanced Linux)是一种基于 Linux 内核的安全模块,旨在通过强制访问控制(MAC)机制增强系统的安全性。在 Docker 容器环境中,SELinux 可以为容器提供额外的安全隔离层,防止容器逃逸和权限滥用。

SELinux 基本概念

1. SELinux 的核心机制

SELinux 通过以下核心机制实现安全控制:

  • 强制访问控制(MAC):与传统的自主访问控制(DAC)不同,MAC 通过策略文件定义访问规则,确保只有明确允许的操作才能执行。
  • 安全上下文(Security Context):每个进程、文件和资源都有一个安全上下文,包含用户、角色和类型信息。
  • 策略(Policy):SELinux 策略定义了哪些主体(如进程)可以访问哪些对象(如文件或端口)。

2. SELinux 模式

SELinux 有三种运行模式: - Enforcing:强制执行 SELinux 策略,拒绝未授权的操作。 - Permissive:记录未授权的操作但不阻止,适用于调试。 - Disabled:完全禁用 SELinux。

在 Docker 中,建议使用 Enforcing 模式以最大化安全性。

SELinux 在 Docker 中的工作原理

1. Docker 与 SELinux 的集成

Docker 默认支持 SELinux,并通过以下方式与 SELinux 集成:

  • 容器进程的标签:每个容器进程都会被分配一个 SELinux 标签,限制其访问主机资源的权限。
  • 文件系统的标签:Docker 卷和挂载的文件系统也会被标记,确保容器只能访问允许的资源。

2. SELinux 标签

SELinux 标签是 SELinux 安全上下文的一部分,通常格式为:

user:role:type:level
在 Docker 中,主要关注的是 类型(type),它定义了容器进程和资源的访问权限。

启用和配置 SELinux

1. 检查 SELinux 状态

在配置 SELinux 之前,首先检查当前系统的 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

2. 启用 SELinux

如果 SELinux 未启用,可以通过以下步骤启用: 1. 编辑 /etc/selinux/config 文件:

SELINUX=enforcing
SELINUXTYPE=targeted
2. 重启系统以应用更改:
reboot

3. 配置 Docker 使用 SELinux

Docker 默认支持 SELinux,但需要确保 Docker 配置文件中启用了 SELinux 选项: 1. 编辑 /etc/docker/daemon.json 文件:

{
  "selinux-enabled": true
}
2. 重启 Docker 服务:
systemctl restart docker


SELinux 策略配置

1. 自定义 SELinux 策略

Docker 默认使用 container_t 类型来标记容器进程。如果需要更细粒度的控制,可以自定义 SELinux 策略: 1. 安装 SELinux 工具:

yum install selinux-policy-devel
2. 编写自定义策略模块:
module mydocker 1.0;

require {
    type container_t;
    type docker_t;
}

allow docker_t container_t:process transition;
3. 编译并加载策略模块:
checkmodule -M -m -o mydocker.mod mydocker.te
semodule_package -o mydocker.pp -m mydocker.mod
semodule -i mydocker.pp

2. 使用 SELinux 标签

通过 --security-opt 参数可以为容器指定 SELinux 标签:

docker run --security-opt label=type:my_custom_type my_image


常见问题与调试

1. 权限被拒绝

如果容器因 SELinux 权限问题无法启动,可以检查 SELinux 日志:

ausearch -m avc -ts recent
输出示例:
type=AVC msg=audit(1633024800.123:456): avc:  denied  { read } for  pid=1234 comm="nginx" name="index.html" dev="sda1" ino=5678 scontext=system_u:system_r:container_t:s0 tcontext=system_u:object_r:httpd_sys_content_t:s0 tclass=file

2. 临时禁用 SELinux

如果问题难以解决,可以临时将 SELinux 切换到 Permissive 模式:

setenforce 0

总结

通过 SELinux,Docker 容器可以获得额外的安全隔离层,防止容器逃逸和权限滥用。本章节详细介绍了 SELinux 的基本概念、在 Docker 中的工作原理、配置方法以及常见问题的调试技巧。通过合理配置 SELinux 策略和标签,可以为容器环境提供更高级别的安全保障。