Как безопасно настроить верфь 2.0.10 с TLS на CoreOS

Вступление

Docker - это популярный вариант программного обеспечения для контейнеров, а CoreOS специализируется на кластерных средах, что делает их идеальными для контейнерных приложений. Однако сохранить все ваши контейнеры организованными может быть сложно, особенно если ими управляют только через интерфейс командной строки Docker или если у вас есть несколько экземпляров CoreOS.

К счастью, есть полезный инструмент управления Docker под названиемShipyard. Это дает вам возможность перезапускать, уничтожать и создавать контейнеры через полезный графический интерфейс. Он также позволяет управлять распределением ресурсов для определенных контейнеров и управлять контейнерами на нескольких хостах Docker. Однако важно убедиться, что ваш сервер Docker и система верфи безопасны, особенно если они используются в производстве.

В этом руководстве мы будем настраивать Shipyard 2.0.10 на одном сервере CoreOS и защищать Docker с помощью сертификата TLS, чтобы к нему могли подключаться только авторизованные клиенты. TLS означаетTransport Layer Security. Он используется для шифрования данных при их передаче от клиента к серверу и обратно. В нашем случае мы будем использовать его для шифрования нашего соединения с хостом Docker и соединения Docker с верфью.

Предпосылки

Чтобы следовать этому уроку, вам понадобится:

  • Рекомендуется одна капля CoreOS с не менее 512 МБ ОЗУ, но рекомендуется 1 ГБ или более. Убедитесь, что вы выбрали последнюю стабильную версию CoreOS, а не альфа или бета-версию.

    Всем серверам CoreOS требуется ключ SSH, поэтому, если у вас его еще нет, вы можете добавить его, выполнив шаги 1–3 изHow To Use SSH Keys with DigitalOcean Droplets.

  • Полное доменное имя (FQDN) или поддомен для вашего хоста Docker.

    Если вы еще не являетесь владельцем домена, вы можете приобрести его у любого из различных регистраторов доменов. Если у вас есть домен для использования, вHow to Point to DigitalOcean Nameservers From Common Domain Registrars есть инструкции по его настройке в DigitalOcean DNS.

    Вы можете указать свой домен на свою каплю, добавив запись A, как описано вHow To Set Up a Host Name with DigitalOcean.

  • Настройка Docker для использования сертификатов для аутентификации - довольно сложная тема, поэтому прочтитеthis OpenSSL tutorial для объяснения того, как работают сертификаты SSL.

[[шаг-один -—- создание-сертификата-сервера]] == Шаг первый - Создание сертификата сервера

Первое, что нам нужно сделать, это создать центр сертификации, который мы можем использовать для подписи сертификатов сервера и клиента. CoreOS поставляется с OpenSSL, утилитой, которая может использоваться для генерации и подписи сертификатов.

Для начала мы создадим закрытый ключ RSA. Сначала создайте и переместите в каталог с именемdockertls, чтобы было легко запомнить, где находятся файлы.

mkdir ~/dockertls && cd ~/dockertls

Затем создайте закрытый ключ RSA. Эта команда предложит вам создать ключевую фразу для вашего ключа.

openssl genrsa -aes256 -out private-key.pem 4096

Давайте разберем вышеприведенную команду. genrsa означает, что команда сгенерирует закрытый закрытый ключ RSA. -out private-key.pem указывает имя файла, который мы хотим сгенерировать, то естьprivate-key.pem. Последний бит4096 - это длина ключа в битах. Рекомендуется хранить это значение высоким, например 4096.

Затем создайте новый сертификат и подпишите его с помощью закрытого ключа, который мы только что создали. Вам нужно будет ввести пароль, который вы выбрали при создании ключа.

openssl req -new -x509 -sha512 -days 365 -key private-key.pem -out myca.pem

OpenSSL также запросит некоторую необходимую информацию, такую ​​как полное доменное имя вашего сервера и округа, в котором находится ваша организация. Постарайтесь ответить на эти вопросы максимально точно. Это последний шаг в создании нашего самозаверяющего центра сертификации, или CA.

Теперь, когда у нас есть центр сертификации, мы можем фактически создать некоторые серверные сертификаты для использования с демоном Docker. Следующие две команды генерируют запрос на подпись. Не забудьте заменитьexample.com доменом или субдоменом, который вы используете для Docker.

openssl genrsa -out docker-1-key.pem 4096
openssl req -subj "/CN=example.com" -sha512 -new -key docker-1-key.pem -out docker.csr

Наконец, подпишите с закрытым ключом CA. Вам нужно будет ввести ключевую фразу еще раз.

openssl x509 -req -days 365 -sha256 -in docker.csr -CA myca.pem -CAkey private-key.pem -CAcreateserial -out final-server-cert.pem

Это создаст в текущем каталоге файл с именемfinal-server-cert.pem, который является сертификатом сервера, который будет использоваться на хосте Docker.

[[шаг-два -—- создание-сертификата-клиента]] == Шаг второй - Создание сертификата клиента

Теперь, когда у нас есть сертификат сервера, нам нужно создать сертификат клиента. Это будет использоваться всякий раз, когда мы пытаемся подключиться к хосту Docker. Он проверит, что подключение клиента действительно было проверено и подписано нашим личным центром сертификации. Поэтому только авторизованным клиентам будет разрешено подключаться и отправлять команды в Docker.

Сначала создайте еще один запрос на подпись для клиента.

openssl genrsa -out client-key.pem 4096
openssl req -subj '/CN=client' -new -key client-key.pem -out docker-client.csr

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

echo extendedKeyUsage = clientAuth > client.cnf

Приведенная выше команда создает файл с именемclient.cnf с содержимымextendedKeyUsage = clientAuth без необходимости использования текстового редактора.

Затем подпишите клиент с ключом CA.

openssl x509 -req -days 365 -sha512 -in docker-client.csr -CA myca.pem -CAkey private-key.pem -CAcreateserial -out client.pem -extfile client.cnf

Теперь у нас есть центр сертификации, сертификат сервера и сертификат клиента.

[[step-three -—- configuring-docker-and-coreos]] == Шаг третий - Настройка Docker и CoreOS

На этом этапе мы настроим демон Docker для использования наших сертификатов.

Нам нужно изменить параметры запуска Docker. CoreOS используетsystemd для управления службами. Если вы хотите прочитатьsystemd и узнать о нем больше, вы можете прочитатьHow To Use Systemctl to Manage Systemd Services and Units.

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

Откройте файл модуля Docker для редактирования с помощьюsystemctl.

sudo systemctl edit --full docker

Это откроет файл для редактирования с использованиемvim, который вы можете узнать, прочитав нашvim tutorial.

Найдите строку, которая начинается сExecStart=/usr/lib/coreos/dockerd. Добавьте выделенные ниже параметры после--host=fd:// в этой строке, чтобы файл выглядел так:

EnvironmentFile=-/run/flannel_docker_opts.env
MountFlags=slave
LimitNOFILE=1048576
LimitNPROC=1048576
ExecStart=/usr/lib/coreos/dockerd --daemon --host=fd:// --tlsverify --tlscacert=/home/core/dockertls/myca.pem --tlscert=/home/core/dockertls/final-server-cert.pem --tlskey=/home/core/dockertls/docker-1-key.pem -H=0.0.0.0:2376 $DOCKER_OPTS $DOCKER_OPT_BIP $DOCKER_OPT_MTU $DOCKER_OPT_IPMASQ

Давайте посмотрим на опции, которые мы только что добавили:

  • --tlsverify просто включает проверку TLS, так что только авторизованные клиенты могут подключаться.

  • --tlscacert указывает расположение сертификата нашего ЦС.

  • --tlscert указывает расположение сертификата сервера.

  • --tlskey указывает расположение ключа сервера.

  • -H=0.0.0.0:2376 означает, что Docker будет прослушивать соединения откуда угодно, но по-прежнему не будет разрешать любые соединения, у которых нет авторизованного клиентского ключа или сертификата.

Сохраните и закройте файл, затем перезагрузите демон Docker, чтобы он использовал нашу новую конфигурацию.

sudo systemctl restart docker

Вы можете убедиться, что все работает, проверив статус Docker.

systemctl status docker

Найдите строку, которая начинается сActive:. Если там написано что-то иное, кромеactive (running), дважды проверьте правки файла вашего модуля и убедитесь, что все необходимые ключи и сертификаты были сгенерированы.

Наконец, мы можем проверить нашу проверку TLS.

docker --tlsverify --tlscacert=myca.pem --tlscert=client.pem --tlskey=client-key.pem -H=example.com:2376 info

Если все хорошо, вы должны получить некоторую базовую системную информацию о вашем хосте Docker; это означает, что вы просто защитили свой хост Docker с помощью TLS. Если вы получили сообщение об ошибке, проверьте журналы с помощьюsystemctl status docker.

Теперь вы можете получить доступ к вашему хосту Docker из любой точки мира, если вы подключаетесь, используя действующий сертификат и клиентский ключ. Вы можете создать и подписать столько клиентских сертификатов, сколько вы хотите использовать в кластере.

[[шаг-четыре -—- установка-верфи]] == Шаг четвертый - Установка верфи

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

Во-первых, нам нужно настроить объем данных, в котором будет храниться база данных Shipyard.

docker create --name shipyard-rethinkdb-data shipyard/rethinkdb

Теперь мы можем развернуть и создать новый контейнер дляRethinkDB. Это ядро ​​базы данных, которое использует верфь для отслеживания данных в реальном времени из Docker.

docker run -it -d --name shipyard-rethinkdb --restart=always --volumes-from shipyard-rethinkdb-data -p 127.0.0.1:49153:8080 -p 127.0.0.1:49154:28015 -p 127.0.0.1:29015:29015 shipyard/rethinkdb

Эта команда также гарантирует, что RethinkDB будет прослушивать толькоlocalhost. Это хороший способ защитить эту базу данных, потому что это означает, что никто не сможет получить к ней доступ снаружи сервера.

Мы будем использовать Верфь версии 2.0.10, поскольку ее проще всего настроить с помощью Docker TLS. Следующая команда запустит новый контейнер, который запускает Shipyard и свяжет его с контейнером RethinkDB, позволяя им общаться.

docker run -it -p 8080:8080 -d --restart=always --name shipyard --link shipyard-rethinkdb:rethinkdb shipyard/shipyard:2.0.10

После завершения настройки верфи посетитеhttp://example.com:8080 илиhttp://your_server_ip:8080, чтобы получить доступ к панели управления верфи. Вы можете войти в систему с именем пользователя по умолчаниюadmin и паролемshipyard.

Верфь предложит вам добавить новый двигатель в кластер. Нажмите зеленую кнопку+ ADD, и вы увидите такую ​​форму:

Shipyard Add

Заполните информацию следующим образом:

  • Name может быть тем, чем вы хотите. Это будет название двигателя.

  • Labels тоже может быть любым. Просто сделайте это коротким, чтобы вы могли держать свои контейнеры организованными.

  • CPUs - это количество процессоров на вашем сервере.

  • Memory - это объем оперативной памяти вашего сервера.

  • Address должен бытьhttps://your_server_ip:2376 для использования TLS.

Под основными опциями есть три больших текстовых поля. Здесь вы вставите сертификаты и ключи, чтобы Shipyard могла безопасно подключиться к вашему хосту Docker.

В первом полеSSL Certificate требуется сертификат клиента. Распечатайте содержание сертификата.

cat ~/dockertls/client.pem

Затем скопируйте результат и вставьте его в полеSSL Certificate.

Далее распечатайте содержимое клиентского ключа.

cat ~/dockertls/client-key.pem

Вставьте результат в текстовую областьSSL Key.

Наконец, распечатайте содержимое сертификата CA.

cat ~/dockertls/myca.pem

Вставьте это содержимое в полеCA Certificate.

Нажмите бледно-голубую кнопкуADD внизу страницы. Если все настроено правильно, верфь должна представить вам этот экран:

Shipyard Engine List

Заключение

Теперь у вас есть безопасный хост Docker, работающий на вашем сервере CoreOS!

Верфь может безопасно и надежно управлять вашими контейнерами и кластерами хостов. Вы также можете добавить клиентский ключ и сертификат на локальный компьютер, чтобы вы могли удаленно управлять кластером Docker из любого места.

Для дополнительных мер безопасности вы можете использовать Nginx для обратного прокси-сервера вашего сервера Верфи. Это позволяет вам использовать HTTPS для еще более безопасного соединения с верфью с вашего локального компьютера. Подробнее об этом читайте в статьеDocker Explained: How To Containerize and Use Nginx as a Proxy. Вы также можетеspin up more CoreOS servers и попробовать кластер Docker. Вы можете управлять сотнями двигателей с помощью верфи.

Related