使用 SELinux 保护您的容器

通过破解您的系统来理解为什么配置 SELinux 作为容器的第一道防线如此重要。
126 位读者喜欢这篇文章。
unspoken blockers

Opensource.com

当您的 Linux 环境中出现问题时,最简单的方法是禁用安全增强型 Linux (SELinux)。 突然,一切都开始工作了,然后您就忘记了它——但这是一种常见的陷阱,意味着您失去了一个非常强大的安全工具。

随着容器、微服务和分布式架构的兴起,威胁也在增加。 这是由于一个古老而众所周知的问题:速度。 容器的优势在于它们使您能够快速移动、做更多的事情并快速更改。 这意味着容器的采用率急剧上升,但是它所提供的速度也意味着您会遇到更多的问题和漏洞。 当您更快,更迅速地做更多的事情时,自然会发生这种情况。

如何减轻威胁

正如孙子所说:“善战者不战。” 当涉及到容器的基本防御时,这句话真的很有道理。 为了避免问题(战斗),请确保您的容器主机是安全的,并且可以使用 SELinux 作为您的第一道防线。

SELinux 是一个开源项目,于 2000 年发布,并于 2003 年集成到 Linux 内核中。 根据 Red Hat 的解释,“SELinux 是 Linux 系统的安全架构,允许管理员更好地控制谁可以访问系统。 它最初由美国国家安全局 (NSA) 开发,作为使用 Linux 安全模块 (LSM) 对 Linux 内核 的一系列补丁。”

开始使用

当您想到容器时,首先想到的可能是 Docker。 Docker 在 2013 年出现后,引发了一场容器采用革命。 它是容器受欢迎程度激增的主要原因之一,但如上所述,高度的采用增加了用户对安全风险的脆弱性。

在您可以使用 SELinux 保护您的 Docker 容器之前,您需要进行一些设置。

前提条件

  • 已安装并配置 CentOS 8/RHEL 8
  • 已安装并配置 Docker CE
  • 创建了两个帐户:root 和非 root(以下示例中的 mcalizo

如果您需要在 RHEL 8/CentOS 8 服务器上设置 Docker,可以按照这些 说明 进行操作。 如果您运行的是 RHEL 8,则需要在开始之前删除预安装的 Podman 和 runc 软件包。

首先,确保 SELinux 已启用

[mcalizo@Rhel82 ~]$ 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:      31
[mcalizo@Rhel82 ~]$ 

然后,验证您的操作系统版本以及 Docker 是否正在运行。 以 root 用户身份登录并运行

[root@rhel82 ~]# cat /etc/redhat-release 
Red Hat Enterprise Linux release 8.2 (Ootpa)
[root@rhel82 ~]# 

[root@rhel82 ~]# systemctl status docker
● docker.service - Docker Application Container Engine
   Loaded: loaded (/usr/lib/systemd/system/docker.service; enabled; vendor preset: disabled)
   Active: active (running) since Wed 2020-10-28 19:10:14 EDT; 15s ago
     Docs: https://docs.docker.net.cn
 Main PID: 30768 (dockerd)
    Tasks: 8
   Memory: 39.0M
   CGroup: /system.slice/docker.service
           └─30768 /usr/bin/dockerd -H fd:// --containerd=/run/containerd/containerd.sock

Oct 28 19:10:13 rhel82.home.labs.com dockerd[30768]: time="2020-10-28T19:10:13.889602941-04:00" level=error msg=">
Oct 28 19:10:13 rhel82.home.labs.com dockerd[30768]: time="2020-10-28T19:10:13.903413613-04:00" level=warning msg>
Oct 28 19:10:13 rhel82.home.labs.com dockerd[30768]: time="2020-10-28T19:10:13.903427451-04:00" level=warning msg>
Oct 28 19:10:13 rhel82.home.labs.com dockerd[30768]: time="2020-10-28T19:10:13.903538271-04:00" level=info msg="L>
Oct 28 19:10:14 rhel82.home.labs.com dockerd[30768]: time="2020-10-28T19:10:14.132060506-04:00" level=info msg="D>
Oct 28 19:10:14 rhel82.home.labs.com dockerd[30768]: time="2020-10-28T19:10:14.308943088-04:00" level=info msg="L>
Oct 28 19:10:14 rhel82.home.labs.com dockerd[30768]: time="2020-10-28T19:10:14.319438549-04:00" level=info msg="D>
Oct 28 19:10:14 rhel82.home.labs.com dockerd[30768]: time="2020-10-28T19:10:14.319570298-04:00" level=info msg="D>
Oct 28 19:10:14 rhel82.home.labs.com dockerd[30768]: time="2020-10-28T19:10:14.333419209-04:00" level=info msg="A>
Oct 28 19:10:14 rhel82.home.labs.com systemd[1]: Started Docker Application Container Engine

检查您的 Docker 版本

[root@rhel82 ~]# docker --version
Docker version 19.03.13, build 4484c46d9d

破解您的主机

理解问题的最佳方法之一是体验它。 因此,我将向您展示如果您的安全设置不正确,将恶意代码注入到 Docker 主机中有多么容易。

为了能够在 Docker 主机上做一些坏事,恶意的非 root 用户(本教程中的 mcalizo)必须是能够实例化 Docker 容器的组的成员。

首先,确认 mcalizo 用户属于哪个组

[root@Rhel82 ~]# groups mcalizo
mcalizo : mcalizo

输出显示 mcalizo 仅属于其自己的组。 这意味着 mcalizo 无法实例化 Docker 容器,如果尝试,将收到此错误

[mcalizo@Rhel82 ~]$ docker run -it --rm centos:latest /bin/sh
docker: Got permission denied while trying to connect to the Docker daemon socket at unix:///var/run/docker.sock: Post http://%2Fvar%2Frun%2Fdocker.sock/v1.40/containers/create: dial unix /var/run/docker.sock: connect: permission denied.
See 'docker run --help'.

要允许 mcalizo 实例化容器,请将用户添加到 docker

[root@Rhel82 ~]# usermod -G docker -a mcalizo
[root@Rhel82 ~]# groups mcalizo
mcalizo : mcalizo docker

接下来,部署一个 fedora:latest 容器,并登录到实例化的容器以进行探索

[mcalizo@Rhel82 ~]$ docker run -it --rm fedora:latest /bin/sh
Unable to find image 'fedora:latest' locally
latest: Pulling from library/fedora
ee7e89337106: Pull complete 
Digest: sha256:b9ec86d36fca7b1d3de39cd7c258e8d90c377d312c21a7748071ce49069b8db4
Status: Downloaded newer image for fedora:latest
sh-5.0# cat /etc/redhat-release
Fedora release 33 (Thirty Three)

当您登录到新创建的容器时,您会发现您会自动以 root 用户身份登录

sh-5.0# whoami
root
sh-5.0#

作为 root 用户,您可以在此容器中执行任何操作,这意味着您可以利用容器主机并造成大量破坏。 因为您可以实例化一个容器,所以即使您不是主机 sudoers 帐户的一部分,也可以对主机执行操作。

退出您刚刚创建的容器,并创建一个新容器来演示该漏洞利用

[mcalizo@Rhel82 ~]$ docker run -it --rm -v /:/exploit fedora:latest /bin/bash
[root@131043f2e306 /]#

-v option 将 Docker 主机的 / 目录挂载到容器的 /exploit 目录下

[root@131043f2e306 /]#ls exploit/
bin  boot  dev  etc  home  lib  lib64  media  mnt  opt  proc  root  run  sbin  srv  sys  tmp  usr  var

由于已挂载,因此您可以在 Docker 主机上执行任何操作。 例如,您可以删除文件、编辑特定配置以危害系统,甚至安装特洛伊木马应用程序或其他恶意软件来窃取重要信息。

为什么会发生这种情况?

您可能想知道为什么会发生这种情况,因为 SELinux 处于强制模式。 更深入地研究 SELinux,看看哪里出了问题。

验证 SELinux 是否具有 Docker 上下文

[mcalizo@Rhel82 ~]$ ps -eZ | grep docker
system_u:system_r:container_runtime_t:s0 30768 ? 00:00:04 dockerd
[mcalizo@Rhel82 ~]$

正如预期的那样,它确实有。 这意味着 SELinux 管理 Docker 守护程序。 检查 Docker 守护程序以查看是否默认启用 SELinux

[mcalizo@Rhel82 ~]$ docker info | grep Security -A3
 Security Options:
  seccomp
   Profile: default
 Kernel Version: 4.18.0-193.el8.x86_64

默认情况下启用 SELinux。 这就是问题所在! 要解决此问题,请启用 SELinux 以控制和管理 Docker,方法是更新或创建文件 /etc/docker/daemon.json,如 此处所述(您必须具有 root 访问权限才能执行此操作)

[root@Rhel82 ~]# cat /etc/docker/daemon.json 
{
  "selinux-enabled": true
}
[root@Rhel82 ~]# 
[root@Rhel82 ~]# systemctl restart docker

创建或更新文件并重新启动 Docker 后,您应该会看到 Docker 守护程序中已启用 SELinux 支持

[root@Rhel82 ~]# systemctl restart docker
[mcalizo@Rhel82 root]$ docker info | grep Security -A3
 Security Options:
  seccomp
   Profile: default
  selinux
[mcalizo@Rhel82 root]$ 

虽然仍然可以在 Docker 主机上将特定文件系统挂载到 Docker 容器上,但不再允许更新或访问该文件

[mcalizo@Rhel82 root]$ docker run -it --rm -v /:/exploit fedora:latest /bin/bash
[root@ecb5836da1f6 /]# touch /exploit/etc/shadow.sh
touch: cannot touch '/exploit/etc/shadow.sh': Permission denied
[root@ecb5836da1f6 /]# 

了解更多

容器世界中的第一道防线取决于您设置容器主机操作系统的强度。 有许多方法可以实现 Linux 安全性,包括市场上可用的选项,以增强您的安全态势。

SELinux 是默认构建到 Linux 发行版 中的额外安全层。 为了利用它并保护您的系统免受入侵,请确保 SELinux 保持启用状态。

如果您想了解更多信息,请参阅

接下来读什么

使用 SELinux 保持系统安全

Linux 世界中很少有东西能像 SELinux(Linux 的安全增强功能)一样引起强烈的反响。 在 LinuxCon 上,Susan Lauber 希望缓和这种反应,并向人们展示…

(校友, Red Hat)
2015 年 8 月 12 日

编排和自动化有什么区别?

这两个术语都意味着事情的发生无需您的直接干预。 但是,您获得这些结果的方式以及您用来实现这些结果的工具是不同的。

标签
ID
Mike Calizo 是 Elastic.co 的首席客户成功经理,专注于政府客户,常驻澳大利亚堪培拉。 Mike 认为“数据就是力量”,利用这种力量可以改善组织,从而利用他们自己的见解通过创新实现差异化,并通过成本优化策略提高效率。

评论已关闭。

Creative Commons License本作品根据 Creative Commons Attribution-Share Alike 4.0 International License 许可。
© . All rights reserved.