Безопасное обновление Shipyard 2.0.10 при помощи TLS в CoreOS

Published by Leave your thoughts

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

К счастью, в такой ситуации можно использовать специально предназначенный для управления контейнерами Docker инструмент — Shipyard.

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

Это руководство поможет установить Shipyard 2.0.10 на сервер CoreOS и защитить Docker при помощи TLS-сертификата, чтобы подключаться к нему могли только авторизованные клиенты.

Примечание: Протокол TLS (Transport Layer Security) используется для шифрования данных, передаваемых клиентом на сервер и обратно. В данном случае его можно использовать его для шифрования взаимодействия с хостом Docker и подключения Docker к Shipyard.

Требования

Для выполнения руководства понадобится:

  • Сервер CoreOS с 512 MB оперативки минимум (рекомендуется иметь 1 GB и больше). Убедитесь, что используете последнюю доступную версию CoreOS.
  • SSH-ключи для серверов CoreOS.
  • FQDN или поддомен для хоста Docker. Если пока что у вас нет домена, закажите его у регистратора, а затем направьте его не серверы имён вашего хостинг-провайдера.

1: Создание сертификата для сервера

Для начала нужно создать сертификат и подписать его. Система 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 – длина ключа в битах (менять не рекомендуется).

Теперь создайте новый сертификат и подпишите его с помощью только что созданного закрытого ключа.

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

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

После этого можно создать самоподписанные сертификаты для 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

В завершение подпишите сертификаты закрытым ключом ЦС. При этом будет запрошен пароль ключа.

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.

2: Создание сертификата для клиента

Теперь нужно создать сертификат для клиентской машины, который будет использоваться всякий раз, когда клиент пытается подключиться к хосту 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; не нужно дополнительно редактировать его.

Затем подпишите сертификат клиента при помощи ключа ЦС.

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

Теперь у вас есть личный ЦС и 2 сертификата: для сервера и для клиента.

3: Настройка Docker и CoreOS

Теперь нужно настроить демон Docker для поддержки сертификатов.

Отредактируйте исходные опции Docker. Для управления сервисами CoreOS использует systemd.

Для начала отредактируйте unit-файл Docker. В нём есть опция для команды systemctl, которая позволяет дублировать оригинальный unit-файл (а не изменять его). Грубо говоря, он позволит переопределить конфигурацию Docker.

Откройте unit-файл Docker для редактирования при помощи systemctl:

sudo systemctl edit --full docker

Это откроет файл в редакторе vim.

Примечание: подробнее с этим редактором можно ознакомиться в статье «Установка и использование текстового редактора Vim».

Найдите строку, которая начинается с 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 с любой машины кластера до тех пор, пока используя валидный сертификат и ключ клиента.

Примечание: Ограничений на количество клиентских сертификатов в кластере нет.

4: Установка Shipyard

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

Сначала нужно установить объем данных для хранения БД Shipyard.

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

Затем можно загрузить новый контейнер для RethinkDB. Это система баз данных, которая используется Shipyard для отслеживания данных 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. Это позволяет обезопасить эту базу данных, потому что никто не сможет получить к ней доступ извне.

В руководстве используется версия Shipyard 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

После завершения установки Shipyard посетите одну из ссылок:

http://example.com:8080

http://your_server_ip:8080

На экране появится форма входа в панель администратора Shipyard. Имя пользователя – admin, пароль – shipyard.

Shipyard предложит добавить новый компонент в систему. нажмите зелёную клавишу + ADD, после чего на экране появится форма для добавления, содержащая такие поля:

  • Name: укажите любое имя компонента.
  • Labels: также можно указать любые данные.
  • CPUs: укажите, сколько на сервере CPU.
  • Memory: объём RAM серера.
  • Address: чтобы использовать TLS, ссылка дожна иметь такой вид https://your_server_ip:2376.

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

Первое поле, SSL Certificate, должно содержать сертификат клиента; запросите содержимое сертификата:

cat ~/dockertls/client.pem

Скопируйте вывод и вставьте его в поле SSL Certificate. Затем запросите ключ клиента:

cat ~/dockertls/client-key.pem

Вставьте вывод в поле SSL Key.

Затем запросите сертификат ЦС.

cat ~/dockertls/myca.pem

Полученный вывод внесите в поле CA Certificate.

Затем нажмите голубую кнопку ADD. После этого Docker будет добавлен в систему Shipyard.

Заключение

Теперь сервер Docker и система CoreOS находятся под защитой TLS.

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

Tags: , , , , ,

Добавить комментарий

Ваш e-mail не будет опубликован. Обязательные поля помечены *


*

Можно использовать следующие HTML-теги и атрибуты: <a href="" title=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <cite> <code> <del datetime=""> <em> <i> <q cite=""> <strike> <strong>