Обработка секретов внутри контейнера докеров без использования роя докеров
Один вопрос, как вы обрабатываете секреты внутри dockerfile без использования docker swarm. Допустим, у вас есть частное репо на npm и вы восстанавливаете его с помощью.npmrc внутри файла dockerfile, предоставив учетные данные. После восстановления пакета, очевидно, я удаляю файл.npmrc из контейнера. Точно так же это касается NuGet.config, а также для восстановления частных репозиториев внутри контейнера. В настоящее время я предоставляю эти учетные данные как --build-arg при создании файла докеров.
Но такая команда, как docker history --no-trunc, покажет пароль в журнале. Есть ли какой-нибудь достойный способ справиться с этим. В настоящее время я не на кубернетах. Следовательно, необходимо обрабатывать то же самое в самом докере.
Один из способов, который я могу придумать, - это смонтировать / run /secrets/ и сохранить его внутри либо с помощью текстового файла, содержащего пароль, либо через файл.env. Но тогда этот файл.env должен быть частью конвейера для завершения процесса CI/CD, что означает, что он должен быть частью системы управления версиями. Есть ли способ избежать этого, или что-то можно сделать с помощью самого конвейера, или здесь можно применить любую логику шифрования / дешифрования?
Спасибо.
Спасибо.
2 ответа
Во-первых, имейте в виду, что файлы, удаленные в одном слое, все еще существуют в предыдущих слоях. Так что удаление файлов тоже не помогает.
Есть три способа защиты:
Загрузите весь код заранее, за пределами сборки Docker, где у вас есть доступ к секрету, а затем просто скопируйте загруженный материал.
Используйте BuildKit, который является экспериментальной функцией Docker, которая обеспечивает безопасное использование секретов ( https://docs.docker.com/develop/develop-images/build_enhancements/).
Предоставлять секреты от сетевого сервера, работающего локально (например, в другом контейнере). См. Подробное объяснение того, как это сделать, здесь: https://pythonspeed.com/articles/docker-build-secrets/
Позвольте мне попытаться объяснить секрет докера здесь.
- Секрет Docker работает с docker swarm. Для этого нужно запустить
$ docker swarm init --advertise-addr=$(hostname -i)
Это делает узел мастером. Теперь вы можете создать свой секрет здесь, например: - создайте файл /db_pass и поместите свой пароль в этот файл.
$docker secret create db-pass /db_pass
это создает ваш секрет. Теперь, если вы хотите просмотреть список созданных секретов, выполните команду
$ docker secret ls
Позволяет использовать секрет при запуске службы: -
$docker service create --name mysql-service --secret source=db_pass,target=mysql_root_password --secret source=db_pass,target=mysql_password -e MYSQL_ROOT_PASSWORD_FILE="/run/secrets/mysql_root_password" -e MYSQL_PASSWORD_FILE="/run/secrets/mysql_password" -e MYSQL_USER="wordpress" -e MYSQL_DATABASE="wordpress" mysql:latest
В приведенной выше команде файлы /run/secrets/mysql_root_password и /run/secrets/mysql_password находятся в контейнере, в котором хранятся данные исходного файла (db_pass).
source=db_pass,target=mysql_root_password (создает файл /run/secrets/mysql_root_password внутри контейнера со значением db_pass)
source=db_pass,target=mysql_password (создает файл /run/secrets/mysql_password внутри контейнера со значением db_pass)
Смотрите скриншот из контейнера, который содержит данные секретного файла: -