标签: docker-secrets

为什么Docker Secrets比环境变量更安全?

我正在阅读Docker Secrets,并继续阅读Docker的人故意选择将秘密存储在文件中,/run/secrets而不是使用环境变量.但无处我就一直能够找到一个解释,为什么.

所以我问:为什么使用Docker Secrets机制比将环境变量注入我的容器(via -e或a --env-file)更安全?

security environment-variables docker docker-secrets

7
推荐指数
1
解决办法
1676
查看次数

设计不可知的配置服务

为了好玩,我正在使用微服务架构设计一些Web应用程序.我正在尝试确定进行配置管理的最佳方法,我担心我的配置方法可能会有一些巨大的陷阱和/或更好的存在.

为了解决这个问题,假设我有一个用c ++编写的身份验证服务,用rust写的身份服务,用haskell编写的分析服务,用scala编写的一些middletier,以及用javascript编写的前端.还有相应的身份DB,auth DB,分析数据库,(可能是会话的redis缓存)等...我正在使用docker swarm部署所有这些应用程序.

每当部署其中一个应用程序时,它必须发现所有其他应用程序.由于我使用的是docker swarm,因此只要所有节点共享必需的覆盖网络,发现就不是问题.

但是,每个应用程序仍然需要上游服务host_addr,可能是端口,某些数据库或密封服务的凭据等...

我知道docker secrets可以让应用程序从容器中读取配置,但是我需要为每个服务用每种语言编写一些配置解析器.这看起来很乱.

我宁愿做的是拥有一个configuration service,它维护着如何配置所有其他服务的知识.因此,每个应用程序都会从​​一些RPC调用开始,这些调用旨在在运行时获取应用程序的配置.就像是

int main() {
    AppConfig cfg = configClient.getConfiguration("APP_NAME");
    // do application things... and pass around cfg
    return 0;
}
Run Code Online (Sandbox Code Playgroud)

AppConfig将在IDL中定义,因此该类将立即可用且与语言无关.

这似乎是一个很好的解决方案,但也许我真的错过了这里的重点.即使在规模上,一些配置服务也可以轻松地提供数万个节点,因此我不会预见到任何扩展问题.再一次,它只是一个爱好项目,但我喜欢考虑"假设"场景:)

如何在微服务架构中处理配置方案?这看起来像是一种合理的方法吗?Facebook,谷歌,LinkedIn,AWS等主要参与者都做了什么?

architecture configuration docker-secrets

7
推荐指数
1
解决办法
229
查看次数

如何以安全的方式将 Github Secret 传递给 Dockerfile

我想在 github 操作的 docker 构建中设置 gcloud sdk。因此我需要将 service-account.json 传递给 dockerfile。

我知道我可以将构建参数传递给 dockerfile,当然我可以在这里传递 Github 秘密。但现在我听说了 Docker 秘密,它阻止了在 docker 日志中读取秘密。真的必须为秘密提供一条道路吗?我不想将秘密保存在存储库中,我更愿意使用 github 秘密。

那么,有什么想法可以将 gh 操作中的 github 秘密传递给 dockerfile 进行构建的最佳和最安全的方法吗?

docker docker-secrets github-actions

7
推荐指数
0
解决办法
2964
查看次数

如何使用 docker 秘密设置“spring.datasource.password”?

目前,我在 datasource.properties 文件中有以下内容用于本地连接到数据源...

//datasource.properties
spring.datasource.password=${DB_PASSWORD}
Run Code Online (Sandbox Code Playgroud)

这对于本地来说非常有用,但现在我正在尝试创建一个 docker 映像。为了存储数据,我宁愿使用秘密而不是环境变量(或者甚至可能是秘密然后是未找到的环境变量)。我当前在本地 docker 映像中设置了秘密,但我无法弄清楚如何使用代码而不是属性来设置 spring.datasource.password 。

如何使用 docker 秘密设置“spring.datasource.password”?

spring spring-data-jpa docker spring-boot docker-secrets

6
推荐指数
1
解决办法
3873
查看次数

在 Spring Boot 应用程序中提取 docker 秘密而不是使用属性文件

我正在 docker swarm 堆栈上运行 spring boot 应用程序,并且想使用 docker 密钥作为令牌密钥、api 密钥等...创建密钥并使其在我正在运行的 docker 容器中可用是没有问题的以下撰写文件:

version: "3.7"
services:
  app:
    image: myimage
    environment:
      tokenSecret: /run/secrets/tokenSecret
      apiKey: /run/secrets/apiKey
    secrets:
      - tokenSecret
      - apiKey

  frontend:
    .....

  db:
    .....

secrets:
  tokenSecret:
    external: true
  apiKey:
    external: true
Run Code Online (Sandbox Code Playgroud)

这些秘密是由printf some_secret | docker secret create tokenSecret -

在使用 docker Secret 之前,我将属性存储在我的application.properties文件中:

tokenSecret: some_secret
apiKey: some_key
Run Code Online (Sandbox Code Playgroud)

并可以通过以下方式访问它们:

@Component
public class AppProperties {

    private Environment environment;

    @Autowired
    public void setEnvironment(Environment environment) {
        this.environment = environment;
    }

    public String getTokenSecret(){ …
Run Code Online (Sandbox Code Playgroud)

spring docker-swarm docker-secrets

6
推荐指数
1
解决办法
2169
查看次数

如何创建一个秘密的 docker 秘密?

我需要创建一个 MariaDB docker 容器,但需要设置 root 密码,但密码是使用命令行参数设置的,这对于.bash_history.

我尝试使用秘密print pass | docker secret create mysql-root -,但有同样的问题,密码保存到.bash_history. docker 的秘密并不是很秘密。

我尝试使用交互式命令:

while read -e line; do printf $line | docker secret create mysql-root -; break; done;
Run Code Online (Sandbox Code Playgroud)

但是,真的很丑xD。为什么创建 docker 秘密的更好方法是不将其保存到 bash 历史记录中,但又不删除所有 bash 历史记录?

bash docker docker-secrets

6
推荐指数
1
解决办法
1449
查看次数

在基于 Python 的应用程序中从 Kubernetes 读取机密

I\xe2\x80\x99m 打包一个 Python 应用程序以在 Kubernetes 集群中使用。在代码库中存在此方法:

\n
   def get_pymongo_client(self):\n        username = test;\n        password = \'test\';\n        url = \xe2\x80\x98test\n        conn_str = "mongodb+srv://" + username + ":" + password + \xe2\x80\x9c/\xe2\x80\x9d+ url\n\n        return pymongo.MongoClient(conn_str)\n
Run Code Online (Sandbox Code Playgroud)\n

I\xe2\x80\x99m 尝试保护用户名、密码和 URL 字段,以便它们在 src 代码中不可见。为此,我打算使用秘密。

\n

URL https://kubernetes.io/docs/tasks/configmap-secret/managing-secret-using-kubectl/详细介绍了如何创建密钥。但我\xe2\x80\x99m 不知道如何从Python 应用程序读取秘密。

\n

我的应用程序的 .Dockerfile:

\n
#https://docs.docker.com/language/python/build-images/\n\nFROM python:3.8-slim-buster\n\nWORKDIR /app\n\nCOPY requirements.txt requirements.txt\n\nRUN pip3 install -r requirements.txt\n\nCOPY . .\n\nCMD [ "python3", "-m" , "flask", "run", "--host=0.0.0.0"]\n
Run Code Online (Sandbox Code Playgroud)\n

阅读Python Flask application access to docker Secrets in a swarm详细介绍了 …

python docker kubernetes docker-secrets kubernetes-secrets

6
推荐指数
1
解决办法
8693
查看次数

在 docker 中使用 Secrets 没问题,但对于 docker-compose 则失败

我有一个Dockerfile使用秘密的,我可以使用 成功构建图像docker build。但是,当我尝试使用构建相同的图像时,docker-compose build出现错误:

ERROR: Dockerfile parse error line 4: Unknown flag: mount
Run Code Online (Sandbox Code Playgroud)

这种情况发生在 Ubuntu 20.04LTS(Docker 版本 18.09.6,内部版本 481bc77,docker-compose 版本 1.20.0-rc2,内部版本 8c4af54)上。

在 RHEL 7.9(Docker 版本 20.10.7 版本 f0df350、docker-compose 版本 1.29.2、版本 5becea4c)上,会出现不同的错误:

[2/2] RUN --mount=type=secret,id=the_secret cat /run/secrets/the_secret:  
 #8 0.466 cat: /run/secrets/the_secret: No such file or directory
Run Code Online (Sandbox Code Playgroud)

如何使用 docker-compose 构建涉及机密的镜像?

使用 docker 构建(有效)

#!/bin/bash
export COMPOSE_DOCKER_CLI_BUILD=1
export DOCKER_BUILDKIT=1


echo "I have a secret" > secret.txt
docker build --secret id=the_secret,src=./secret.txt .
Run Code Online (Sandbox Code Playgroud)

使用 docker-compose 构建(失败) …

docker docker-compose docker-secrets

6
推荐指数
0
解决办法
2434
查看次数

Docker-compose工具箱的机密文件未正确安装

我正在尝试使用用于开发的秘密来组成堆栈,我在docker / secrets / FILE_NAME中使用本地文件,而我在Windows 10中使用了此文件,但是我正在努力使其在win7工具箱下工作。我收到一个错误:

Cannot create container for service db: 
invalid volume specification:
 'C:\project\docker\secrets\DB_USERNAME:/run/secrets/db-username:ro'
Run Code Online (Sandbox Code Playgroud)

我试图设置COMPOSE_CONVERT_WINDOWS_PATH,但是不幸的是,这没有任何改变。我将得到与true或false相同的输出。设置绝对路径也无济于事。

Docker撰写版本1.16.1的内部版本6d1ac219 Docker版本17.10.0-ce,的内部版本f4ffd25

我的docker-compose.yml

version: '3.3'

services:
  db:
    image: postgres
    volumes:
      - db-data:/var/lib/postgresql/data
    environment:
      - POSTGRES_PASSWORD_FILE=/run/secrets/db-password
      - POSTGRES_USER_FILE=/run/secrets/db-username
      - POSTGRES_DB_FILE=/run/secrets/db-name
    secrets:
      - db-username
      - db-password
      - db-name
  web:
    build: 
      context: ./docker/machines/django/
      args:
        buildno: 1
    command: python3 manage.py runserver 0.0.0.0:8000
    volumes:
      - ./Server:/Server
    ports:
      - "8000:8000"
    depends_on:
      - db
    secrets:
      - db-username
      - db-password
      - db-name

secrets:
  db-username:
    file: ./docker/secrets/DB_USERNAME
  db-password:
    file: ./docker/secrets/DB_PASSWORD
  db-name:
    file: …
Run Code Online (Sandbox Code Playgroud)

windows-7 docker docker-compose docker-toolbox docker-secrets

5
推荐指数
1
解决办法
459
查看次数

为什么Docker Secrets被认为是安全的?

我读到了有关码头群的秘密,并做了一些测试.据我所知,秘密可以替换docker-compose.yml文件中提供的敏感环境变量(例如数据库密码).因此,当我检查docker-compose文件或正在运行的容器时,我将看不到密码.那很好 - 但它真的有用吗?

如果攻击者在我的docker主机上,他可以轻松查看/ run/secrets

docker exec -it df2345a57cea ls -la /run/secrets/
Run Code Online (Sandbox Code Playgroud)

并且还可以查看里面的数据:

docker exec -it df27res57cea cat /run/secrets/MY_PASSWORD
Run Code Online (Sandbox Code Playgroud)

同一个攻击者大多可以在正在运行的容器上打开一个bash,看看它是如何工作的....

此外,如果攻击者在容器本身上,他可以环顾四周.

所以我不明白为什么docker机密更安全,好像我把它们直接写入docker-compose.yml文件?

security docker docker-secrets

5
推荐指数
1
解决办法
1770
查看次数