关于docker:Docker-安全最佳实践和备忘单-IDCF

48次阅读

共计 4140 个字符,预计需要花费 11 分钟才能阅读完成。

容器不是安全设备。这就是为什么咱们策动了一组易于操作的倡议来进步您的 Docker 容器安全性。

多年来,Docker 容器始终是开发人员工具箱的重要组成部分,使他们可能以标准化的形式构建、散发和部署他们的应用程序。

毫无疑问,这种吸引力的减少随同着与容器化技术相干的平安问题的激增。事实上,容器也代表了攻击者的标准化攻打对象。他们能够很容易地利用谬误配置并从容器内逃逸到主机。

此外,“容器”这个词常常被误会,因为许多开发人员偏向于将隔离的概念与谬误的安全感分割起来,认为这项技术实质上是平安的。

这里的要害是容器默认没有任何平安维度。它们的安全性齐全取决于:

  • 反对基础设施(操作系统和平台)
  • 容器自身蕴含的软件组件
  • 运行时配置

容器平安是一个宽泛的话题,但好消息是,许多最佳实际都是唾手可得的成绩,能够疾速缩小其部署的攻击面。

这就是为什么咱们在构建和运行时策动了一组对于 Docker 容器配置的最佳倡议。

留神:在像 Kubernetes 这样的托管环境中,这些设置都能够被平安上下文或其余更高级别的平安规定笼罩。

一、构建配置

1.1 查看镜像

审慎抉择您的根底镜像docker pull image:tag

您应该始终更喜爱应用受信赖的镜像,最好来自 Docker 官网镜像,以加重供应链攻打。如果您须要抉择根底发行版,倡议应用 Alpine Linux,因为它是可用的最轻量级发行版之一,可确保缩小攻打范畴。

我须要应用最新的还是固定的发行版本?

首先,您应该理解 Docker tag 的工作形式从少到多,这就是为什么:python:3.9.6-alpine3.14

python:3.9.6-alpine

python:3.9-alpine

python:alpine

如上所示,根底镜像都是一样的(在撰写本文时)。

通过十分具体并确定一个版本,您能够爱护本人免受将来任何重大更改的影响。另一方面,应用最新版本可确保修补更多破绽。这是一种衡量,但通常倡议固定到稳固版本。

思考到这一点,咱们会抉择 python:3.9-alpine 这里。

留神:这同样实用于在镜像构建过程中安装包。

1.2 始终应用非特权用户

默认状况下,容器内的过程以 root (id=0)身份运行。

为了执行最小权限准则,您应该设置一个默认用户。为此,您有两个抉择:

  • 应用以下选项指定运行容器中不存在的任意用户 ID:docker run -u 4000 <image>

留神:如果您当前须要挂载文件系统,您应该将您应用的用户 ID 与主机用户相匹配,以便拜访文件。

  • 或者通过在 Dockerfile 中创立默认用户来。
FROM <base image>

RUN addgroup -S appgroup \
 && adduser -S appuser -G appgroup
 
USER appuser

... <rest of Dockerfile> ...

肯定要留神查看在根底镜像中创立组和用户的工具

1.3 应用独自的用户 ID 命名空间

默认状况下,Docker 守护程序应用主机的用户 ID 命名空间。因而,容器内权限晋升的任何胜利也意味着对主机和其余容器的 root 拜访。为了升高这种危险,您应该将主机和 Docker 守护程序配置为应用带有该 –userns-remap 选项的独自命名空间。

1.4 小心解决环境变量

你永远不应该在 ENV 指令中以明文模式蕴含敏感信息:它们基本不是一个平安的中央来存储你不想呈现在最初一层的任何信息。例如,如果您认为像这样勾销设置环境变量:

ENV $VAR
RUN unset $VAR

这不是平安的!$VAR 依然会存在于容器中,并且能够随时被获取!

为了避免运行时读取拜访,请应用单个 RUN 命令在单个层中设置和勾销设置变量(不要遗记变量依然能够从镜像中提取)。

RUN export ADMIN_USER="admin" \
    && ... \
    && unset ADMIN_USER

可怜的是,明码常常被硬编码到 docker 镜像中,不过开发能够利用明码扫描引擎来查找 Dockerfile 是否存在明码

1.5 不要裸露 Docker 守护过程套接字

除非你对本人正在做的事件十分有信念,否则永远不要裸露 Docker 正在侦听的 UNIX 套接字:/var/run/docker.sock

这是 Docker API 的次要入口点。授予某人拜访权限等同于授予对您的主机的无限度 root 拜访权限。你永远不应该将它裸露给其余容器:

-v /var/run/docker.sock://var/run/docker.sock

二、特权、能力和共享资源

首先,您的容器不应该以特权身份运行,否则,它将被容许在主机上领有所有 root 权限。为了更平安,倡议明确禁止在应用选项创立容器后增加新权限的可能性 –security-opt=no-new-privileges。

其次,性能是 Docker 应用的一种 Linux 机制,用于将二进制 root/non-root 二分法转变为细粒度的拜访控制系统:您的容器应用一组默认的已启用性能运行,而您很可能不这样做都须要。

倡议删除所有默认性能并独自增加它们:

例如,请参阅默认性能列表,Web 服务器可能只须要 NET_BIND_SERVICE 来绑定到 1024 下的端口(如端口 80)。

第三,不要共享主机文件系统的敏感局部:

  • root (/),
  • device (/dev)
  • process (/proc)
  • virtual (/sys)挂载点

如果您须要拜访主机设施,请小心应用 [r|w|m] 标记(读、写和应用 mknod)有选择地启用拜访选项。

2.1 应用控制组限度对资源的拜访

控制组是用于管制每个容器对 CPU、内存、磁盘 I/O 的拜访的机制。默认状况下,容器与专用 关联 cgroup,但如果 –cgroup-parent 存在该选项,则会将主机资源置于 DoS 攻打的危险中,因为您容许主机和容器之间共享资源。

同样的想法,倡议应用以下选项指定内存和 CPU 使用率

--memory=”400m”--memory-swap=”1g”--cpus=0.5
--restart=on-failure:5
--ulimit nofile=5
--ulimit nproc=5

参考:https://docs.docker.com/confi…

三、文件系统

3.1 只容许读拜访根文件系统

容器应该是短暂的,因而大多是无状态的。这就是为什么您通常能够将挂载的文件系统限度为只读的起因。docker run --read-only <image>

3.2 对非持久性数据应用临时文件零碎

如果您只须要长期存储,请应用适当的选项docker run --read-only --tmpfs /tmp:rw ,noexec,nosuid <image>

3.3 将文件系统用于持久数据

如果您须要与主机文件系统或其余容器共享数据,您有两个抉择:

  • 创立具备无限可用磁盘空间的绑定装置 (–mount type=bind,o=size)为专用分区创立绑定卷 (–mount type=volume)
  • 在任何一种状况下,如果容器不须要批改共享数据,请应用只读选项。
docker run -v <volume-name>:/path/in/container:ro <image>
docker run --mount source=<volume-name>,destination=/path/in/container,readonly <image>

四、联网

4.1 不要应用 Docker 的默认网桥 docker0

docker0 是在启动时创立的网桥,用于将主机网络与容器网络离开。

创立容器时,Dockerdocker0 默认将其连贯到网络。因而,所有容器都相互连接 docker0 并可能互相通信。

您应该通过指定选项禁用所有容器的默认连贯,–bridge=none 而是应用以下命令为每个连贯创立一个专用网络:

docker network create <network_name>

而后用它来拜访主机网络接口

docker run --network=<network_name>

(Docker 联网简略例子)

例如,要创立一个与数据库通信的 Web 服务器(在另一个容器中启动),最佳实际是创立一个桥接网络 WEB 以路由来自主机网络接口的传入流量,并应用另一个 DB 仅用于连贯数据库的桥接器和网络容器。

4.2 不要共享主机的网络命名空间

同样的想法,隔离主机的网络接口:–network 实践上不应应用主机选项。

4.3 日志记录

默认日志级别为 INFO,但您能够应用以下选项指定另一个级别:--log-level="debug"|"info"|"warn"|"error"|"fatal"

鲜为人知的是 Docker 的日志导出能力:如果您的容器化应用程序生成事件日志,您能够应用选项重定向 STDERR 和 STDOUT 流到内部日志服务以进行解耦--log-driver=<logging_driver>

您还能够启用双日志记录以在应用内部服务时保留 docker 对日志的拜访。如果您的应用程序应用专用文件(通常写在 /var/log),您依然能够重定向这些流:请

参阅官网文档:https://docs.docker.com/confi…

五、扫描破绽和明码

最初但并非最不重要的一点是,我心愿您当初分明您的容器只会与它们运行的软件一样平安。为确保您的镜像没有破绽,您须要对已知破绽执行扫描。许多工具可用于不同的用例和不同的模式。

5.1 破绽扫描:

收费选项:

  • Clair
  • Trivy
  • Docker Bench for Security

商业的:

  • Snyk(提供开源和收费选项)
  • Anchore(提供开源和收费选项)
  • JFrog X 射线
  • Qualys

六、明码扫描

  • ggshield(提供开源和收费选项)
  • SecretScanner(收费)

原文:https://blog.gitguadian.com/h…

起源:云原生技术爱好者社区

作者:THOMAS SEGURA
申明:文章取得作者受权在 IDCF 社区公众号(devopshub)转发。优质内容共享给思否平台的技术伙伴,如原作者有其余思考请分割小编删除,致谢。

玩乐高,学麻利,规模化麻利联合作战沙盘之「乌托邦打算」,12 月 25-26 日登陆深圳,将“多团队麻利协同”基因内化在研发流程中,为规模化晋升研发效力保驾护航!!🏰⛴公众号回复“乌托邦”可加入

正文完
 0