个性化阅读
专注于IT技术分析

如何为生产环境保护Docker?

本文概述

让我们看看如何针对生产环境强化和保护Docker。

尽管Docker使软件开发人员和DevOps工程师能够快速构建和部署应用程序, 但它也为网络黑客提供了巨大的攻击面。

我们将通过以下内容探讨如何在Linux平台上保护Docker。

  • 配置缺陷
  • 远程执行代码
  • 缓冲区溢出
  • 图像伪造等等。

我们将使用以下工具, 例如Docker的公证服务器对映像进行签名, 以及Docker Bench安全性来检查主机, 守护程序配置等。

在继续进行安全保护之前, 让我们先介绍一下基础知识。

什么是容器技术?

容器技术允许开发人员或DevOps工程师打包应用程序, 以便它可以与其他进程隔离的依赖项运行。

市场上有许多容器技术, 例如Apache Mesos, Rocket, lxc和Docker。尽管它们属于容器技术类别, 但是它们的功能有所不同。

VM和VE之间的区别

虚拟机主机与虚拟环境主机完全不同。在虚拟机上, 每个容器化的应用程序都具有自己的一组库和操作系统, 而默认情况下, 在虚拟环境主机(例如lxc)和docker上的应用程序共享Linux内核。

什么是Docker?

Docker是一种容器技术, 数百万人使用它来创建Web应用程序并将其从测试部署到生产环境。

Docker引擎

Docker Engine由三个组件组成。

  • 服务器:该组件是一个长期运行的进程或守护程序, 负责管理映像和容器。
  • REST API:此接口使docker守护程序和docker客户端工具可以进行通信。
  • Docker客户端工具:Docker客户端工具利用REST API组件通知docker守护程序操作容器化的应用程序。

Docker可信注册表

Docker Trusted Registry是Docker提供的用于企业平台业务的图像存储解决方案。它与docker hub不同。 Docker集线器托管在云中, 而Docker可信注册表是Docker企业版的本地存储解决方案。

Docker内容信任

Docker Content Trust提供了将数据签名用于与远程Docker注册表(例如Docker Hub)之间收发的图像的数据签名的功能。

Linux命名空间

Linux名称空间是一种Linux内核功能, 可将虚拟环境主机上运行的容器化应用程序或进程与其他进程隔离开。

Linux控制组(Cgroup)

Linux控制组是一种Linux内核功能, 可让你将资源(例如CPU时间, 网络带宽, 系统内存等)分配给主机上的活动进程。

能力

在Linux中, 内核子系统中有一项安全功能, 可以对其进行设置或强制执行, 以限制特权进程, 例如由具有UID 1的用户执行的进程。尽管特权进程或用户可以绕过任意访问控制权限, 但不能绕过能力规则。

现在, 让我们集中讨论安全性。

保护Docker主机

在本节中, 我们将研究如何保护Docker所在的主机。

扫描Linux内核

在Linux平台上托管Docker之前, 首先需要检查内核。有几种开源工具, 例如Lynis和OpenVAS, 可用于扫描Linux内核。

使用git clone命令从Github复制或克隆Lynis项目。

git clone https://github.com/CISOfy/lynis.git

接下来, 使用下面的命令导航到lynis目录并审核Linux系统。

cd lynis; ./lynis audit system

强化Linux内核

在扫描Linux内核中的基于系统的漏洞之后, 你可以通过grsecurity向内核添加另一个额外的保护层。它提供了以下安全功能。

  • 防止缓冲区溢出开发
  • / tmp竞赛漏洞预防
  • / proc限制, 不会泄漏有关流程所有者的信息。
  • 防止在内核中执行任意代码等。

最初, 你可以从grsecurity免费下载补丁程序并将其应用到当前内核。但它不再允许免费补丁。

在VM中安装Docker

与其直接在Linux主机上安装Docker, 还可以通过将其安装在虚拟机中来增加额外的保护层。这样一来, 即使主机内核存在漏洞问题, 也不会影响Docker容器。

保护根特权

默认情况下, Docker需要root特权才能创建和管理容器。恶意脚本可以利用此攻击面将其升级为Linux主机上的超级用户, 并最终访问敏感的文件/文件夹, 图像, 证书等。

为了防止这种情况, 我们可以使用以下命令。我们可以决定放弃诸如setgid和setuid之类的功能, 以防止其他程序或进程将其GID更改为另一个GID, 从而导致升级特权。你也可以在此处查看Linux功能定义列表。

下面的命令运行apache Web服务器容器, 并通过–cap-drop删除setgid和setuid功能, 以防止apache容器将其GID和UID更改为另一个UID和GID。

在这种情况下, GID和UID分别是指组ID和用户ID。

docker run -d --cap-drop SETGID --cap-drop SETUID apache

Docker用户

除了阻止其他程序或进程外, 你还可以创建用户来管理docker运行之类的docker操作, 而不是通过超级用户进行管理。

你可以通过以下方式添加或创建docker用户:

sudo groupadd docker

上面的命令创建一个名为docker的组

接下来, 使用以下命令创建用户:

sudo useradd mike

最后, 使用以下命令将用户麦克添加到组docker中, 以管理docker操作。

sudo usermod  -aG docker mike

使用Cgroup管理容器

在生产环境中, 你可能有多个容器。

如果你的主机上未安装cgroup, 则可以使用以下命令进行安装, 然后在此处(对于Ubuntu)检查如何配置。

sudo apt-get install cgroup-bin cgroup-lite cgroup-tools cgroupfs-mount libcgroup1

我们可以通过–cpu-shares和–cpuset-cpus将容器分配给有限的CPU资源

以下命令示例显示prodnginx容器进程仅通过–cpuset-cpus在第一个内核上执行, 并通过–cpu-shares分配20个CPU, 而proxnginx容器进程在前两个CPU内核上执行, 并且也被分配20中央处理器。

docker run -d --name prodnginx --cpuset-cpus=0 --cpu-shares=20 nginx
docker run -d --name testnginx --cpuset-cpus=2 --cpu-shares=20 nginx

然后键入命令docker stats查看prodnginx和testnginx容器的CPU使用率

CONTAINER ID        NAME                CPU %               MEM USAGE / LIMIT     MEM %               NET I/O             BLOCK I/O
845bea7263fb        prodnginx            57.69%              1.258MiB / 985.2MiB   0.13%               578B / 0B           1.33MB / 0B 
189ba15e8258        testnginx            55.85%              1.25MiB / 985.2MiB    0.13%               578b / 0B           1.33MB / 0B

当你有多个容器运行时, 为Docker主机定义CPU份额是一个好主意。

使用命名空间管理容器

名称空间可以防止容器以特权用户身份运行, 这可以帮助避免特权升级攻击。

我们可以通过使用/ etc / subuid和/ etc / subgid文件在docker中启用名称空间, 如下所示。

  • 使用adduser命令创建用户
sudo adduser dockremap
  • 为用户dockremap设置一个subuid
sudo sh -c 'echo dockremap:400000:65536 > /etc/subuid'
  • 然后为用户dockremap设置子类别
sudo sh -c 'echo dockremap:400000:65536 > /etc/subgid'
  • 打开daemon.json文件, 并将其填充以下内容, 以将userns-remap属性与用户dockremap相关联
vi   /etc/docker/daemon.json
{ 

 "userns-remap": "dockremap"

}
  • 按:wq保存并关闭daemon.json文件, 最后重启docker以在docker主机上启用命名空间
sudo  /etc/init.d/docker  restart

保护Docker守护程序

还必须配置Docker守护程序, 以确保Docker客户端和Docker守护程序之间通过TLS进行安全通信。

使用以下命令打开daemon.json文件, 然后复制并粘贴以下内容(用你的实际IP替换), 如下所示

vi  daemon.json
{
  "debug": false, "tls": true, "tlscert": "/var/docker/server.pem", "tlskey": "/var/docker/serverkey.pem", "hosts": ["tcp://192.168.16.5:2376"]
}

保护Docker组件

让我们看看如何利用诸如CodeNotary和Notary Server之类的工具对图像进行签名, 以避免图像被伪造。此外, 也有必要扫描图像以确保图像不带有漏洞

我们将利用Docker的公证服务器对图像进行签名和验证, 并使用Anchor Engine扫描图像中的漏洞。

使用公证服务器验证图像

在使用Notary服务器对图像进行签名之前, 我们需要下载并安装docker-compose。我们将使用Docker Compose设置公证服务器。

  • 运行以下命令以下载最新版本的Docker Compose
sudo curl -L "https://github.com/docker/compose/releases/download/1.25.4/docker-compose-$(uname -s)-$(uname -m)" -o /usr/local/bin/docker-compose
  • 将可执行权限应用于docker-compose, 如下所示
sudo chmod 700  /usr/local/bin/docker-compose
  • 你可以通过以下命令测试是否已成功安装docker-compose
docker-compose  --version
  • 现在我们可以通过docker-compose安装公证服务器
git clone https://github.com/theupdateframework/notary.git
  • 上面的命令从公证存储库克隆或复制公证服务器
  • 通过以下命令启动公证服务器和签名者:
docker-compose build
docker-compose up -d
  • 然后使用以下命令将配置和测试证书复制到本地公证目录
mkdir -p ~/.notary && cp cmd/notary/config.json cmd/notary/root-ca.crt ~/.notary
  • 现在运行以下命令将公证服务器连接到Docker客户端
export   DOCKER_CONTENT_TRUST=1
export  DOCKER_CONTENT_TRUST_SERVER=https://notaryserver:4443
  • 通过以下命令生成委托密钥对
docker trust key generate mike --dir ~./docker/trust
  • 现在, 如果存储库不存在, 我们创建一个目标新密钥
docker trust signer add --key ~/.docker/trust/mike.pub mike mikedem0/whalesay
  • 然后, 你可以使用命令docker trust sign对你的docker映像进行签名。你需要从docker hub提取docker镜像, 并分别使用命令docker pull和docker tag进行重新标记。
docker trust sign mikedem0/nginx:latest

你还可以扫描Docker映像中的漏洞和配置缺陷。你可以在此处查看如何使用Anchor Engine扫描漏洞以及如何使用Docker Bench Security来检查配置缺陷。

希望以上内容为你提供有关生产环境的安全性Docker的想法。你可能还想看看有关黑客和保护Docker容器的Udemy课程。

赞(0)
未经允许不得转载:srcmini » 如何为生产环境保护Docker?

评论 抢沙发

评论前必须登录!