当前位置: 首页 > 编程笔记 >

生产环境中安全运行Docker容器

蔡理
2023-03-14
本文向大家介绍生产环境中安全运行Docker容器,包括了生产环境中安全运行Docker容器的使用技巧和注意事项,需要的朋友参考一下

在生产环境中,强化Docker容器的一种方法就是使它们不可变,也就是只读。安全地运行容器的其他方法还包括最小化受攻击面和应用Linux安全过程,标准Linux安全过程和针对容器环境的特定过程都要应用。

在启动容器时传入--read-only标记就可以 在只读模式下运行 它。这可以防止任何进程写入文件系统。任何试图写入的动作都会导致错误。 运行这种不可变的基础设施 也与其他软件部署流水线的最佳实践相吻合。

尽管不可变性可以阻止任何恶意脚本的执行,可以禁止通过在容器里运行的其他软件暴露出来的漏洞而引起的改动。但是在现实生产环境中,这种模式又是不是适用于应用程序呢?比如,要产生的日志文件和要使用数据库的应用程序就需要可写性。

写日志的一个可能的解决方案可以是使用一个集中的日志系统,比如Elasticsearch/Logstash/Kibana(ELK),这样所有的日志都被收集在一个中心节点,可能是在另一个容器中,就不是用户可以直接访问的了。另一种替代的方案是在启动容器时,通过使用--log-driver标记将日志导出到容器之外。对于那些需要对/tmp之类的临时目录有写入权限的应用程序,一种解决办法是在容器里为这些目录 加载一个临时的文件系统 。

终端用户不能直接访问数据库,所以风险较低。然而,这并不排除受到攻击的可能,除非面对用户的应用程序得到了强化。

在不可避免地要有一个可写的文件系统的情况下,Docker提供了审计和变化的回滚功能。在Docker容器里的文件系统是作为一系列层的堆叠。当创建一个新容器时,将在顶部添加一个新层,该层可以写入。Docker存储驱动程序隐藏了这些细节,并将它作为一个普通的文件系统交付给用户。对正在运行的容器的写入将写入此新层。这通常被称为写时拷贝(Copy-On-Write,COW)。

在Docker容器里很容易检测到配置漂移或预期的配置变更。“docker diff”命令可以显示对文件系统的更改——无论更改操作是文件添加、删除还是修改。

除了在可能的情况下运行一个只读容器,我们 还 提出以下 建议 ,以确保在生产环境中容器的安全:

  • 运行一个 Alpine Linux 之类的最小的镜像,Alpine Linux是基于安全思想而设计的。它的内核上打了一个grsecurity的非官方移植的补丁。 Grsecurity 是一套对Linux内核的安全增强方法,它包括权限控制以及消除基于漏洞的内存崩溃的可能,具体方法是将那些使系统可能被攻击的方法减少到最少。
  • 限制对CPU、RAM等资源的使用,以防止DoS攻击。
  • 在操作系统中配置线程和进程限制。
  • 采用sysctl之类标准的Linux内核强化程序。
  • 每个容器中只运行一个应用程序。建议这么做,是因为它减小了受攻击面,即对于一个给定的容器,可能的漏洞数量就只取决于在该容器上运行的应用程序了。
 类似资料:
  • 问题内容: Java 8/9带来了对(带有)的支持。这设置为cgroup内存限制。默认情况下,JVM会分配大约25%的最大RAM,因为默认值为4。 例: 对于仅由单个JVM进程组成的部署,仅使用配额的25%似乎是浪费。因此,现在人们开始设置,因此从理论上讲,JVM可以使用MaxRAM的100%。 对于1g的示例,这通常导致堆大小约为900m。这似乎有点高-JVM或其他东西(如远程Shell或进程外

  • Java 8/9带来了对堆的支持(使用代码),XX:UseCGroupMemoryLimitForHeap(解除锁定实验操作)。这将把-XX:MaxRAM设置为cgroup内存限制。默认情况下,JVM分配大约25%的最大RAM,因为默认值为4。 示例: 对于(通常)由单个JVM进程组成的部署来说,只使用25%的配额似乎是浪费。所以现在人们设置,所以理论上允许JVM使用100%的MaxRAM。 对于

  • 问题是最清楚的,< br >如何在Docker远程容器中启动完整的桌面环境(KDE,XFCE,Gnome无关紧要)。 我在互联网上挖掘,有很多关于相关主题的问题,但不一样,它们都是关于如何运行GUI应用程序,而不是完整的桌面。 我发现: 必要的运行 以某种方式运行例如 Xfce 在该帧缓冲区中 允许 x11vnc 共享正在运行的 X 环境 但是我实际上被困在这里了,总是得到一些错误: 为了达到目标

  • 生产中的EAP EAP在默认的FreeRADIUS安装中开箱即用。但是,也有一些要点需要注意或更改以适应您的环境。在本节中,我们将介绍以下几点: 适当的公钥基础设施(PKI)的重要性 配置内部隧道虚拟服务器 内部和外部隧道识别的问题 禁用未使用的EAP方法 公共密钥基础设施简介公钥基础结构主要用于两件事: 验证某人的身份 通过不安全的连接交换安全数据 为了确保某人是他们声称的人,我们使用证书颁发机

  • 问题内容: Spring Boot的首选部署方法是通过其中包含tomcat的可执行jar文件。 它从简单开始。 现在,我想将该jar部署到EC2上的linux服务器上,是否丢失了某些东西,还是真的需要创建一个初始化脚本来正确地将应用程序作为守护程序启动? 如果我只是简单地调用,则应用程序在注销时死亡。 我可以在屏幕或nohup中启动它,但这不是很优雅,并且在服务器中重新启动会迫使我登录并手动启动该

  • Spring Boot的首选部署方法是通过内部包含tomcat的可执行jar文件。 它由一个简单的开始。 现在,我想将jar部署到EC2上的linux服务器上,是我遗漏了什么,还是我真的需要创建一个init脚本来正确地启动应用程序作为守护进程? 如果我只是调用,那么当我注销时,应用程序就会死亡。 我可以在screen或nohup中启动它,但这不是很好,在服务器中重新启动会迫使我手动登录并启动进程。