切勿将配置或机密信息嵌入Docker镜像中。相反,在构建Docker镜像时,期望使用业务流程运行时将配置和机密的信息提供给容器,这些包含:Kubernetes Secrets,Docker Secrets。而外部工具或环境变量(对于非敏感性)用于非敏感数据。但仍需注意,不要无意中在镜像层的隐藏层中包含机密信息。

I. 概述

容器镜像应该是可重用且安全的。当镜像层包含嵌入式配置或机密信息时,它违反了此规则,并且不可重用或不安全。这些值不属于镜像,它们仅属于正在运行的容器中。当凭据保留在Docker镜像中时,可能会出现未知的安全隐患。

在生产中运行Docker容器应该是具有各种配置和密码信息的镜像的组合。如果你在Docker,Kubernetes,Swarm或其他业务流程层中运行此容器并不重要,编排平台应负责通过将这些部件组装到正在运行的容器中来创建容器。如我上述所提到的,secrets,configmap等。

II. Docker镜像的类型

Component image

Docker镜像通常是可重用的组件,可与不同的基础架构共享,并可在各种环境中运行。这种类型的image的一个例子是Postgres,Redis或NSQ。这些组件通常需要一些凭证来引导。凭证应由容器提供,而不是内置于镜像中。

官方MySQL镜像就是一个很好的例子。如果你运行MySQL Docker镜像而不为某些配置提供初始值,则容器将退出:

[root@linuxea.com ~]# docker run mysql

error: database is uninitialized and password option is not specified

You need to specify one of MYSQL_ROOT_PASSWORD, MYSQL_ALLOW_EMPTY_PASSWORD and MYSQL_RANDOM_ROOT_PASSWORD

MySQL镜像可以很好地显示缺少的值并给出建议,查看docker-entrpoint.sh脚本。再试一次,键入密码:

MYSQL_ROOT_PASSWORD=www.linuxea.com

[root@linuxea.com ~]# docker run -e MYSQL_ROOT_PASSWORD=www.linuxea.com mysql

Initializing database

2019-03-04T07:53:38.390516Z 0 [Warning] [MY-011070] [Server] 'Disabling symbolic links

......

Warning: Unable to load '/usr/share/zoneinfo/zone1970.tab' as time zone. Skipping it.

2019-03-04T07:54:19.457699Z 0 [System] [MY-010910] [Server] /usr/sbin/mysqld: Shutdown complete (mysqld 8.0.15) MySQL Community Server - GPL.

MySQL init process done. Ready for start up.

2019-03-04T07:54:19.847135Z 0 [Warning] [MY-011070] [Server] 'Disabling symbolic links using --skip-symbolic-links (or equivalent) is the default. Consider not using this option as it' is deprecated and will be removed in a future release.

....

2019-03-04T07:54:20.734608Z 0 [System] [MY-010931] [Server] /usr/sbin/mysqld: ready for connections. Version: '8.0.15' socket: '/var/run/mysqld/mysqld.sock' port: 3306 MySQL Community Server - GPL.

2019-03-04T07:54:20.756534Z 0 [System] [MY-011323] [Server] X Plugin ready for connections. Socket: '/var/run/mysqld/mysqlx.sock' bind-address: '0.0.0.0' port: 33060

这一次,提供了一些配置选项,它可以工作。MySQL镜像是可重用且安全的,因为它可以配置为在大多数环境中工作,并且没有嵌入到镜像中的密码。

Application image

镜像可以包含应用程序。应用程序镜像的示例是静态站点或API。这些镜像旨在为用户而非其他组件提供请求。通常,这些应用程序镜像需要认证,例如API密钥或数据库凭证,或者这些需要特定于环境的数据,例如要连接的其他端点。除了dev模式默认值之外,在镜像本身中存储这些认证是一种不好的做法,应该避免使用。认证信息应始终由容器提供,而不是内置于镜像中。

如:ELK的前段是Kibana,Kibana容器需要一些配置, 至少它必须能够找到要连接的Elasticsearch服务器。elastic.co团队认为默认链接端口9200上名为elasticsearch的主机,并理所当然的为此配置了默认密码,因为这在docker-compose(dev)环境中运行良好。但希望没有人使用用户名“elastic”和密码“changeme”在生产中运行Elasticsearch集群!

隐藏层

最后,重要的是不要在镜像的隐藏层中包含机密的信息。如果Dockerfile配置不正确,则在创建镜像时可能会发生这种情况。当删除Dockerfile中的内容时(秘密,文件,源代码,等),并不总是意味着这个密码没有被包含在最终图像中。它可能存在于父层中,但仍可访问。当用户运行docker pull命令时,将传递所有基础层。

FROM marksugar:nginx

RUN git clone http://USERNAME:PASSWORD@git.linuxea.com -o /usr/local/www

WORKDIR /usr/local/www

RUN go build -o /data/wwwroot/

RUN rm -rf /usr/local/www

ENTRYPOINT [/data/wwwroot]

这个Dockerfile的开发人员希望在Docker构建过程中创建一个特殊的构建环境。在构建时,需要将源代码添加到image中,构建二进制文件然后删除源代码。问题是Dockerfile中的每一行都会生成一个新层,每当拉出最终镜像时候时都会pull该层。创建此Dockerfile的过程也会将源代码泄漏给任何提取此镜像的人。

III. 为什么这些很重要?

Docker镜像应该功能齐全,一致,可重用(可共享和可发现),小巧,安全,可在企业环境中工作并可调试

可重复使用

应用程序可移植性是部署容器的最大好处之一。当应用程序组件可移植时,可以更轻松地跨各种云提供程序和环境部署不可变基础结构。具有内置配置和包含机密的信息的容器不可移植,它们可能需要为每个环境提供不同的镜像。

安全

嵌入密码的镜像不安全。任何有权访问镜像的人都可以拉动和查看密码信息,即使它们处于不可见面图层中。这是未经审计的密码信息查看方式,应该避免。

企业兼容

一个好的的容器镜像包含运行组件时的所有最佳实践。从容器镜像中删除配置将允许企业用户从容器中包含的最佳实践中受益,并且仍然与其审计和安全策略及其工作流程兼容。内置配置将要求企业使用创建私有镜像并失去原始镜像中已有的最佳实践的大部分好处。

可调试

具有嵌入式配置的镜像调试起来要困难得多。如果镜像具有嵌入式配置,则通过简单docker run命令从镜像启动可调试容器通常更加困难。

IV. 建议

有许多方法可以在运行时为容器提供机密的信息和配置:

环境变量

配置文件

etcd或其他配置管理服务

Docker的secrets个config(依赖于swarm)

外部secret管理解决方案

即使构建的image仅在内部使用且仅在单个服务器上使用,也应该使用一种更好的方式创建镜像。切勿在镜像中提供默认的硬密码,也不要添加其他的机密信息,而是在运行容器时为它们提供。而这些方式参考以上5种,而最常见的是环境变量和配置文件。

V. 更多阅读

有关如何将密码信息传递到容器的更多信息的一些建议是:

VI. 学习更多

学习如何使用Docker CLI命令,Dockerfile命令,使用这些命令可以帮助你更有效地使用Docker应用程序。查看Docker文档和我的其他帖子以了解更多信息。

除非另有说明,否则本站上的内容根据以下许可进行许可: CC署名-非商业性使用-相同方式共享4.0国际许可协议4.0进行许可

本文作者:www.linuxea.com for Mark

文章链接:http://www.linuxea.com/2310.html (转载请注明本文出处和本章链接)

docker中linux用户名密码,linuxea:尽可能不在docker镜像中嵌入配置或者密码相关推荐

  1. docker显示linux桌面,怎样在桌面上安装 Docker CE?

    按照这些简单的步骤在你的 Linux.Mac 或 Windows 桌面上安装 Docker CE. 在上一篇文章中,我们学习了容器世界的一些基本术语.当我们运行命令并在后续文章中使用其中一些术语时,这 ...

  2. 修改了ubantu系统的/etc/passwd文件中的用户名后重启无法登录(密码不匹配)的解决办法

    最近从公司调换了一台高配电脑,无奈电脑是之前同事用过的,所以登录账号是之前同事的,有点强迫症的我就去etc/passwd中将原来账号名和家目录都改了,然后一个reboot,以为完美了,结果再次登录的时 ...

  3. Docker在linux下的安装

    Table of Contents Ubuntu Docker 安装 卸载旧版本 使用 Docker 仓库进行安装 设置仓库 安装 Docker Engine-Community 使用 Shell 脚 ...

  4. docker in docker (dind)、all in one (aino),关于docker和Linux的一些另类用法

    docker in docker (dind).all in one (aino),关于docker和Linux的一些另类用法.以为 docker in docker 只会在Jenkins等其他场景中 ...

  5. 【Docker】Linux各系统安装Docker,Docker-compose方式汇总

    目录 CentOS7.x CentOS8.x Alibaba Cloud Linux 2: CentOS7.x: 添加yum源. [root@ecs-5c03 opt]# yum install ep ...

  6. 用docker在linux上安装qq和微信

    用docker在linux上安装qq和微信 安装docker 查看docker镜像 重新启动docker服务 docker换源 查看docker当前运行状态 pull微信QQ镜像 创建脚本 qq单独脚 ...

  7. linux用户名和密码6,Linux系统中(CentOS 7)的用户和权限管理

    用户和组 用户信息文件 /etc/passwd (1 2 3 4 5 6 7) root:x:0:0:root:/root:/bin/bash 用户信息,以 : 分割字段 daemon:x:2:2:d ...

  8. 如何在 Git 中保存用户名和密码?

    问: 我想在 Git Extensions.Sourcetree 或任何其他 Git GUI 中自动使用推送和拉取功能,而无需每次都在提示中输入我的用户名和密码. 那么如何在 Git 中保存我的凭据呢 ...

  9. 如何在Git中保存用户名和密码?

    本文翻译自:How to save username and password in Git? I want to use a push and pull automatically in GitEx ...

最新文章

  1. 剑指offer--day07
  2. 动物模型:急性肝脏损伤模型的构建及选择
  3. js控制图像等比例缩放
  4. 《调制解调算法》专栏导航贴
  5. php微信小程序多图上传,tp5实现微信小程序多图片上传到服务器功能
  6. Session监听器
  7. 配置NTP网络时间服务
  8. Futter基础第4篇: 实现基础列表组件、 水平列表组件 、 图标组件【ListView、Axis.vertical、Axis.horizontal】
  9. 从nexus下载所有jar包方法 迁移到其他nexus中
  10. 浙江大学深蓝质感简约答辩PPT模板
  11. oracle学习之oracle基础
  12. python打开ie浏览器_python-IE浏览器调用
  13. python第三方库批量安装_使用Python批量安装第三方库
  14. Coremail2022Q4邮件安全报告:暴力破解骤降,盗号问题有所缓解?
  15. 周周周报报报(药店管理系统)
  16. PHP unlink的使用
  17. 【图像识别】【读论文】纸币图像特征提取和识别问题
  18. CentOS——nfs服务
  19. android 美团多渠道打包方案
  20. 关于短信验证码报错和解决问题

热门文章

  1. POJ 2239 匈牙利算法
  2. 【Trie】【HDU1247】【Hat’s Wordsfd2】
  3. 安装更新Lenovo Solution Center更新失败!具体问题看内容!要是等官方技术人员解决,估计要等上好一段时间!...
  4. Javascript 钩子机制——开会得出的结论
  5. CUDA编译器nvcc的用法用例与问题简答
  6. 黑马2018年JavaEE课程大纲
  7. 某些数组和字符串类型转换(转)
  8. 【转载】堆和栈的内存分配
  9. 递推DP URAL 1119 Metro
  10. 挖一挖C#中那些我们不常用的东西之系列(2)——IsXXX 系列方法