摘要

随着容器化成为现代应用部署的标准,Docker 安全已为架构设计核心。本文将聚焦生产级安全实践,为您系统性提升容器运行时的防护能力,构建更加安全的容器环境。

 一、更安全的运行容器(rootless的容器)

         在容器主机上,用户能以根用户或普通用户运行容器。普通用户运行的容器称为无根容器。

         无根容器更安全,但有一些限制。例如,无根容器不能通过容器主机的特权端口(1024以下的端口)发布网络服务

        根 (root) 用户当然可以直接运行容器 (rootful容器) ,但这样会使系统的安全性更弱

  1. 什么是 rootless 容器?

        简单说,就是普通用户也能运行的容器

        平时我们用sudo docker run,容器里的 root 在宿主机上也是 root,一旦容器被入侵,宿主机也会有风险。

        rootless 模式会把容器里的 root,映射成宿主机上的一个普通用户,这样即使容器出问题,也影响不到宿主机。

2. 运行rootless容器时的问题

①以普通用户直接运行容器

​编辑会有报错,这是因为没有安装依赖

然后需要用普通用户进行初始化,之后配置相关的环境变量即可解决

    ②rootless容器访问外网会失败

 这是因为rootless 容器的网络隔离机制和内核权限限制

     

先来确定问题:

 如果报错:nslookup: couldn't get address for 'ns1.baidu.com': Try again

        说明是DNS/网络转发问题

        要先开启内核的用户命名空间限制,也就是给普通用户网络转发权限

        这个参数的作用是:允许普通用户创建更多的用户命名空间,解除网络限制

编辑让参数立即生效

        也可能是宿主机的防火墙 或者 SELinux 拦截,部分 Linux 系统的 firewalld 会拦截 rootless 容器的网络流量。

 我们可以永久开启防火墙的「IP 伪装(masquerade)」功能,然后重新加载防火墙.

二、容器的架构是什么样的?

我们首先要知道容器的几个特性:

1.容器可移植性好。可以容易的从一个环境转移到另一个环境,比如从开发 环境转移到生产环境

2.可以保存容器的多个版本,根据需要快速访问每个版本

3.容器通常是临时 (ephemeral) 的。可将运行中的容器生成的数据永久保存 在持久存储 (persistent storage) 中

4.容器通常在需要时运行,不需要时停止并删除。下一次需要时,将启动一 个新的容器进程

5.可以在单个容器中安装含有多个服务的复杂软件应用。不过,将一个容器 用于多个服务会难以管理

6.更好的设计是在单独的容器中运行每个组件、Web 服务器、数据库和消 息传递系统。这样,更新和维护单个应用组件就不会影响到其他组件或应用堆栈

容器化架构的核心逻辑

在了解到了这些特性后我们就能更清楚的知道容器的架构应该是什么样子的。

容器不是虚拟机,核心是拆分成小服务、独立打包、自动管理,而非把整个系统塞进一个容器。

Logo

汇聚全球AI编程工具,助力开发者即刻编程。

更多推荐