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