Docker и безопасность паролей

При реализации аутентификации мы познакомились с использованием секретов Docker для передачи контейнерам файлов ключей для JWT.

По этим мотивам сегодня мы повысим безопасность контейнеров. Сделаем передачу паролей через секреты вместо переменных окружения. И создадим отдельного пользователя для PHP-CLI, чтобы не запускать консольные команды от root. Это нам станет полезно когда мы добавим очереди.

А сначала заодно обновим виртуальные машины до Debian 10 и Docker 20, чтобы работать со свежими инструментами.

  • 00:00:15 Постановка задачи
  • 00:02:11 Версия Docker
  • 00:03:03 Обновление виртуальной машины
  • 00:04:08 Ограничения версией операционной системы
  • 00:06:32 Переход на Debian 10
  • 00:07:32 Имя версии в Ansible
  • 00:09:31 Версия Compose-файлов
  • 00:10:30 Имена файлов секретов
  • 00:11:26 Пример работы с готовыми образами
  • 00:13:28 Чтение FILE-переменных в приложении
  • 00:15:37 Тестовое окружение
  • 00:15:58 Плюсы при деплое без scp
  • 00:18:12 Где отображаются пароли
  • 00:19:40 Внедрение файлов в Jenkins
  • 00:22:16 Создание пользователя в Dockerfile
  • 00:25:02 Обзор результата
Скрытый контент (код, слайды, ...) для подписчиков. Открыть →
Дмитрий Елисеев
elisdn.ru
Комментарии (12)
Руслан

Спасибо!

Ответить
Arunas

Спасибо.

Ответить
Александр

Спасибо

Ответить
Руслан

Дима, спасибо огромное за обновление курса и плана скринкастов по разработке аукциона!

Застрял в настройках SSL для локального тестирования (подключение стороннего API, OAuth2/https). Как правильно получить/установить сертификаты, использовать ssl-cert-snakeoil, или?

Спасибо!

Ответить
Дмитрий Елисеев

Сторонний сервис требует указывать адрес localhost с HTTPS? Если очень нужно подключаться напрямую к сторннему сервису, то да, можно подставить самоподписанные snakeoil сертификаты.

Но вместо этого для локальной разработки удобнее поднять локальный эмулятор стороннего сервиса через Wiremock. Мы это как раз будем делать для входа через социальные сети.

Ответить
Руслан

Дима, благодарю за разъяснение, стало более понятно когда нужен snakeoil. В моем случае сторонний сервис пропустил без https, но создание локального эмулятора стороннего сервиса через Wiremock будет очень интересно.

Ответить
Дмитрий

В уроке (на 15 секунде) говорится, что в предыдущих эпизодах был переход на использование передачи секретов через файлы. Но я что-то не могу найти, где об этом говорилось ранее, ткните пальцем пожалуйста)

Ответить
Дмитрий Елисеев

В 56 эпизоде мы через секреты передавали ключи шифрования.

Ответить
Дмитрий

Благодарю!

Ответить
slo_nik

Добрый вечер, Дмитрий.

Возникла такая проблема.

Для локальной разработки требуется доступ к host.docker.internal в php-cli

Копирую docker-entrypoint.sh, как Вы объясняли, при этом создаю пользователя app в php-cli, но при запуске сервиса получаю ошибку

/usr/local/bin/docker-php-entrypoint: line 9: can't create /etc/hosts: Permission denied

Если я не переключаюсь на пользователя app, то всё работает нормально, но от пользователя root

Как можно обойти эту проблему?

FROM php:8.1-cli-alpine

COPY ./common/entrypoint.sh /usr/local/bin/docker-php-entrypoint
RUN chmod +x /usr/local/bin/docker-php-entrypoint

RUN addgroup -g 1000 app && adduser -u 1000 -G app -s /bin/sh -D app

WORKDIR /app

USER app
Ответить
slo_nik

Добрый вечер.

Вроде как решилась проблема.

Добавил к необходимым сервисам external_hosts.

 php-cli
    build:
       ......
    extra_hosts:
       - host.docker.internal:host-gataway

Это избавило от необходимости копировать исправленный docker-php-entrypoint.

И ещё такой вопрос. Вы переключаете пользователя с root на app только в php-cli, а почему это не делаете в php-fpm?

Ответить
Дмитрий Елисеев

Вы переключаете пользователя с root на app только в php-cli, а почему это не делаете в php-fpm

Потому что PHP-FPM по умолчанию сам запускает cкрипты от пользователя www-data вместо root.

Ответить
Зарегистрируйтесь или войдите чтобы оставить комментарий

Или войти через:

Yandex
MailRu
GitHub
Google