- Обзор
- Важность защиты паролей
- Использование переменных окружения
- Использование системы управления секретами
- Использование vault
- Получение секретов
- Использование секретов Docker
- Создание секретов Docker
- Развертывание стека
- Развертывание стека
- Лучшие практики
- Шифрование чувствительных данных
- Ограниченный доступ к чувствительной информации
- Регулярно обновляйте пароли
- Заключение
Обзор
Защита паролей в Docker – важный аспект сохранения безопасности контейнерного приложения.
Внешние службы и базы данных часто требуют аутентификации с помощью пароля.
Отсутствие надлежащей защиты может поставить под угрозу безопасность данных.
В этом руководстве мы расскажем о различных способах защиты паролей в Docker.
Важность защиты паролей
Пароли – распространенный способ аутентификации внешних служб и баз данных.
Облачные сервисы, базы данных и другие сторонние службы постоянно требуют аутентификации.
Однако если эти пароли не защищены должным образом, они могут быть скомпрометированы неавторизованными пользователями.
Таким образом, конфиденциальные данные могут стать доступными для посторонних лиц.
Контейнерные среды, как правило, существуют недолго и являются эфемерными, что делает защиту паролей еще более важной.
🔒 Поможем найти и удалить захардкоженные пароли и секреты в проекте
Использование переменных окружения
Самый простой способ передать пароли в контейнер – использовать переменные ENV.
Переменные окружения можно задать во время выполнения с помощью флага -e при запуске контейнера.
Для примера мы можем использовать следующую команду для передачи пароля в качестве переменной ENV:
В этом образе mysql пароль извлекается из переменной окружения MYSQL_ROOT_PASSWORD.
Чтобы установить пароль учетной записи root, мы передали переменную env команде docker run.
Переменные окружения не хранятся в самом образе, поэтому они не могут быть случайно закоммичены в репозитории исходного кода.
Нам не нужно модифицировать образ, чтобы изменить ENV.
Переменные окружения ненадежны в многопользовательских средах, где несколько контейнеров совместно используют хост и окружение.
Любой процесс, запущенный в контейнере, может получить к ней доступ.
Поэтому не стоит использовать ее для хранения конфиденциальных данных.
Использование системы управления секретами
Мы можем безопасно управлять и хранить пароли с помощью системы управления секретами, например Vault.
- 🔒 Учебник по Vault. Часть 1
- 🔒 Учебник по Vault. Часть 2
- 🔒 Учебник по Vault. Часть 3
- 🔒 Учебник по Vault. Часть 4
- 🔒 Учебник по Vault. Часть 5
- 🔒 Учебник по Vault. Часть 6
Такие системы обычно предоставляют безопасный API для хранения и извлечения секретов.
Более того, мы можем интегрировать ее с нашей контейнерной средой, чтобы предоставлять эти секреты контейнеру во время выполнения.
Использование vault
Мы можем хранить наши пароли как секреты в хранилище, а затем использовать API хранилища для получения пароля при запуске контейнера.
В нашем приложении мы можем использовать либо клиент хранилища из командной строки, либо клиентскую библиотеку.
Давайте запустим vault в среде Docker, чтобы сохранить пароль и получить его в другом контейнере Docker:
В приведенной выше команде VAULT_DEV_ROOT_TOKEN_ID установлен в myroot, а VAULT_DEV_LISTEN_ADDRESS – в 0.0.0.0:8200, поэтому все доступные сетевые интерфейсы будут прослушивать порт 8200.
Опция -p команды docker run открывает внешний порт 8200 сервера хранилища на порт 8200 хоста.
Давайте рассмотрим, как создать секретный пароль vault:
Приведенная выше команда указывает инструменту командной строки vault взаимодействовать с сервером, запущенным на 127.0.0.1 на порту 8200.
Давайте войдем на сервер vault и создадим секретный пароль:
Vault login пытается войти на сервер с токеном myroot.
Этот токен управляет аутентификацией и авторизацией пользователей. Команда vault kv put создает секрет по пути secret/test с парой ключ-значение. Это позволяет хранить конфиденциальную информацию на сервере и извлекать ее позже.
Получение секретов
Запустим еще один контейнер, который получит пароль с вышеупомянутого сервера хранилища:
При выполнении приведенной выше команды создается новый контейнер с образом хранилища и устанавливаются переменные окружения VAULT_ADDR и VAULT_TOKEN.
Кроме того, он подключается к серверу хранилища localhost, работающему на порту 8200.
После этого он аутентифицируется на сервере хранилища, получает значение ключа-пароля из secret/test и выводит его.
Уполномоченные лица могут получить доступ только к тем секретам, которые обеспечивают дополнительный уровень безопасности.
Но системы управления секретами сложны в настройке и управлении.
Кроме того, это увеличивает стоимость нашего приложения.
🔒 Как читать секреты Vault из контейнеров Docker
Использование секретов Docker
Docker secrets – это функция в режиме Docker Swarm, которая позволяет нам безопасно управлять конфиденциальной информацией, такой как пароли, в нашей среде Docker.
Используя секреты Docker, мы можем держать файлы конфигурации, конфиденциальную информацию и аргументы командной строки вне образов/
Это в целом снижает риск раскрытия информации.
🐳 Docker secret – как использовать в Docker Swarm и Docker Compose
Создание секретов Docker
Сначала нам нужно инициализировать SWARM Docker для использования секретов Docker:
В качестве следующего шага мы используем echo для передачи пароля в docker secret create:
Приведенная выше команда создает уникальный секрет “mysql_external_secret” со значением “testpassword”.
С помощью docker-compose.yml мы можем установить MySQL-сервер в Docker-сервис с переменной окружения MYSQL_ROOT_PASSWORD_FILE, передаваемой через Docker secrets:
version: '3.1'
services:
mysql:
image: mysql
secrets: # secrets block only for 'mysql' service
- mysql_external_secret
environment:
- MYSQL_ROOT_PASSWORD_FILE=/run/secrets/mysql_external_secret
secrets: # top level secrets block
mysql_external_secret:
external: true
Блок secrets показывает, что mysql_external_secret – это внешний секрет, который уже присутствует на нашей хост-машине.
Развертывание стека
Секреты Docker создают секреты на хост-машине и передают их контейнеру во время выполнения.
Этот механизм в конечном итоге снижает риск раскрытия.
Чтобы запустить сервис, давайте развернем стек:
Развертывание стека
Секреты Docker создают секреты на хост-машине и передают их контейнеру во время выполнения. Этот механизм в конечном итоге снижает риск раскрытия. Чтобы запустить сервис, развернем стек:
Приведенная выше команда развертывает стек, определенный в файле docker-compose.yml, и создает службу mysql_secret_test.
Используя этот метод, мы можем безопасно управлять конфиденциальной информацией, такой как пароли, в нашей среде Docker.
Лучшие практики
Защита паролей в Docker – важная задача, требующая комплексного планирования и реализации.
Защита паролей в Docker требует многоуровневого подхода, включающего использование переменных окружения, шифрование, секреты Docker и регулярное обновление паролей.
Шифрование чувствительных данных
Шифрование – важнейший аспект защиты паролей в контейнерах Docker.
Мы должны шифровать данные перед их хранением или передачей в контейнер.
Это обеспечивает дополнительный уровень безопасности, который затрудняет несанкционированный доступ.
Среди доступных алгоритмов шифрования – AES, RSA и Blowfish.
Выбор алгоритма зависит от доступности ресурсов и требований безопасности.
Ограниченный доступ к чувствительной информации
Важно ограничить доступ к конфиденциальной информации, такой как пароли, только тем, кто в ней нуждается.
Используя RBAC, мы можем предоставить доступ определенным пользователям.
Мы можем предоставлять доступ только тем пользователям, которым он необходим, и отзывать его, когда он им больше не нужен.
Таким образом, неавторизованные пользователи не могут получить доступ к конфиденциальным данным, что снижает вероятность утечки информации.
Регулярно обновляйте пароли
Регулярное обновление паролей – очень простой и полезный шаг в обеспечении безопасности контейнера.
Обновлять пароль следует не реже, чем раз в три-шесть месяцев.
Это гарантирует, что даже если пароль будет скомпрометирован, риск потери конфиденциальной информации будет ограничен.
Кроме того, следует использовать надежные пароли, которые трудно угадать.
Заключение
В этой статье мы рассмотрели несколько методов защиты паролей в Docker, включая использование переменных окружения, системы управления секретами и системы управления ключами.
Выбор лучшего метода защиты паролей в Docker зависит от конкретных условий использования и требований.
С помощью переменных окружения можно легко защитить небольшое количество паролей.
Однако если нам нужно хранить много паролей, лучшим вариантом может стать система управления секретами или ключами.
см. также:
- 🐳 Как средства Docker защищают контейнерные среды
- 🐳 Проброс портов на контейнеры Docker с помощью брандмауэров Linux
- ☸️ Как обновить секрет Kubernetes
- ☸️ Как расшифровать секрет Kubernetes
- ☸️ Vesta: Анализ конфигурации кластеров Docker и Kubernetes и анализ уязвимостей
- 🐳 Масштабирование автоматизации безопасности с помощью Docker