Управление Ssl-Сертификатами: От Хаоса На Сотнях Серверов К Централизованному Решению

Что может скрываться за словами «крупнейшая онлайн-школа Европы»? С одной стороны, это 1 тысяча уроков в час, 10 тысяч учителей, 100 тысяч учеников.

А для меня, инфраструктурного инженера, это еще и 200+ серверов, сотни сервисов (микро и не очень), доменные имена со 2-го по 6-й уровень.

Везде нужен SSL и соответственно сертификат для него.



Управление SSL-сертификатами: от хаоса на сотнях серверов к централизованному решению

По большей части мы используем сертификаты Let’s Encrypt. Их преимущества в том, что они бесплатны и получение полностью автоматизировано.

С другой стороны, у них есть особенность: небольшой срок действия – всего три месяца.

Соответственно, их приходится часто обновлять.

Мы пытались это как-то автоматизировать, но ручной работы все равно оставалось много, и постоянно что-то ломалось.

Год назад мы придумали простой и надежный способ обновления этой кучи сертификатов и с тех пор забыли об этой проблеме.



От одного сертификата на одном сервере до сотен в нескольких дата-центрах

Когда-то был только один сервер.

И на нем жил certbot, который работал из-под короны.

Потом один сервер уже не справлялся с нагрузкой, поэтому появился другой сервер.

А потом еще и еще.

У каждого из них были свои сертификаты со своим уникальным набором имен, и везде нужно было настраивать их продление.

Где-то при расширении были скопированы существующие сертификаты, а об обновлении забыли.

Чтобы получить сертификат Let's Encrypt, вам необходимо подтвердить право собственности на доменное имя, указанное в сертификате.

Обычно это делается с помощью обратного HTTP-запроса.



Управление SSL-сертификатами: от хаоса на сотнях серверов к централизованному решению

Вот несколько распространенных проблем, с которыми мы столкнулись по мере своего роста:

  • Не все новые серверы были доступны извне: некоторые были скрыты за балансировщиком входящего трафика и стали недоступны из Интернета.

    Сертификаты пришлось копировать вручную.

  • Также появились серверы вообще без HTTP. Допустим, с почтой.

    Или с базами данных.

    Или с каким-нибудь LDAP. Или еще что-то странное.

    Нам также пришлось копировать туда сертификаты вручную.

Самоподписанные сертификаты кое-где используются уже довольно давно, и это показалось хорошим решением там, где аутентификация не нужна — например, для внутреннего тестирования.

Чтобы браузер не сообщал постоянно о «подозрительном сайте», вам достаточно добавить наш корневой сертификат в список доверенных, и все готово.

Но позже и здесь возникли трудности.



Управление SSL-сертификатами: от хаоса на сотнях серверов к централизованному решению

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



Ищем решение

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

Хорошо, тогда.

Мониторинг идет, мы теперь знаем, что сертификаты тут и там скоро закончатся.

и что теперь делать?

Управление SSL-сертификатами: от хаоса на сотнях серверов к централизованному решению

Big Ear — старый бот, который сертификат не испортит. Давайте использовать подстановочные сертификаты? Давайте! Let's Encrypt уже предоставляет их.

Однако вам придется настроить подтверждение владения доменом через DNS. А наш DNS находится в AWS Route53. И вам придется распределить учетные данные доступа к AWS по всем серверам.

А когда появятся новые сервера, копировать всё это оборудование и туда.

Хорошо, имена уровня 3 подстановочные.

Что делать с именами 4 уровня и выше? У нас много команд, которые разрабатывают различные сервисы.

Сейчас принято разделять фронтенд и бэкенд. И если интерфейс получит имя третьего уровня, например service.skyeng.ru , затем они стремятся дать бэкэнду имя api.service.skyeng.ru .

Хм, может, стоит запретить им делать это в будущем? Отличная идея! Что делать с десятками, которые уже существуют? Можно ли железной рукой объединить их всех в одно доменное имя? Давайте заменим все эти имена разного уровня на URL типа skyeng.ru/service .

Технически это вариант, но сколько времени это займет? И как бизнес может обосновать необходимость таких действий? У нас 30+ команд разработчиков, если уговорить каждую, то это займет минимум полгода.

Мы также создаем единую точку отказа.

Как ни крути, это спорное решение.

Какие еще идеи у вас есть?.

Может быть, мы сможем сделать один сертификат, в который можно будет включить все, все, все? И мы установим его на все сервера.

Это могло бы стать решением наших проблем, но Let’s Encrypt позволяет иметь в сертификате только 100 имен, а различных микросервисов у нас уже больше.

Что делать с тестировщиками? Они никогда ничего не придумали и постоянно жалуются.

Все ерунда, кроме пчел.

Пчелы тоже фигня, но их очень много.

Каждому разработчику или тестировщику предоставляется тестовый сервер — мы называем их тестированием.

Тесты не пчелы, но их уже куда больше сотни.

И все проекты развернуты на каждом.

На самом деле все.

А если для продаж нужно N сертификатов, то на каждое тестирование их столько же.

На данный момент они самоподписанные.

Было бы здорово заменить их на настоящие.



Две пьесы и один источник истины

Лебедь, рак и щука телегу никуда не привезут. Нам нужен единый центр управления полетными серверами.

В нашем случае это Ansible. Certbot на каждом сервере — зло.

Храните все сертификаты в одном месте.

Если где-то кому-то нужен сертификат, то зайдите сюда и возьмите с полки последнюю версию.

А мы позаботимся о том, чтобы сертификаты в этом хранилище всегда были актуальными.

Учетные данные для входа в AWS также присутствуют только в этом одном месте.

Соответственно, у нас отпадают вопросы типа настройки AWS CLI на новом сервере, у которого есть доступ к Route53 и тому подобное.

Все необходимые сертификаты описаны в одном файле Ansible в формате YAML:

  
  
  
   

certificates: - common_name: skyeng.ru alt_names: - *.

skyeng.ru - common_name: olympiad.skyeng.ru alt_names: - *.

olympiad.skyeng.ru - api.content.olympiad.skyeng.ru - games.skyeng.ru - common_name: skyeng.tech alt_names: - *.

skyeng.tech .

.

.



Периодически запускается один плейбук, который проходит через этот список и выполняет свою тяжелую работу - по сути, все, что делает certbot:
  • создает учетную запись в центре сертификации Let’s Encrypt
  • генерирует закрытый ключ
  • генерирует (еще не подписанный) сертификат — так называемый запрос на подпись сертификата
  • отправляет запрос на подпись
  • получает DNS-запрос
  • размещает полученные записи в DNS
  • отправляет запрос на подпись еще раз
  • и, наконец получив подписанный сертификат, помещает его в хранилище.

Книга действий выполняется один раз в день.

Если ему по какой-то причине не удалось обновить некоторые сертификаты — будь то проблемы с сетью или какие-то ошибки на стороне Let’s Encrypt — это не проблема.

Обновлю в следующий раз.

Теперь, когда на каком-то сервисном хосте нужен SSL, вы можете прийти в это хранилище и взять оттуда несколько файлов - самая простая операция, которую выполняет второй плейбук.

Какие сертификаты нужны на данном хосте, описано в параметрах этого хозяин, в инвентаризации/host_vars/server.yml :

certificates: - common_name: skyeng.ru handler: reload nginx - common_name: crm.skyeng.ru .

.

.



Если файлы изменились, то Ansible тянет крючок — обычно это перезапуск Nginx (в нашем случае это действие по умолчанию).

И таким же образом вы можете получать сертификаты от других ЦС, работающих по протоколу ACME.

Общий

  • У нас было много разных конфигураций.

    Постоянно что-то ломалось.

    Часто мне приходилось лазить по серверам и разбираться, что же там снова отвалилось.

  • Теперь у нас есть две плейбука и все записано в одном месте.

    Все работает как часы.

    Жизнь стала скучнее.



Тестирование

Да, а как насчет тестировщиков и их тестирования? Каждому разработчику или тестировщику предоставляется персональный тестовый сервер — тестирование.

На данный момент их около 200. У них есть такие имена, как test-y123.skyeng.link , Где 123 — это номер тестирования.

Создание и удаление тестирования автоматизировано.

Одной из составляющих действия является установка на него SSL-сертификата.

SSL-сертификат генерируется заранее с именами по шаблону:

ssl_cert_pattern: - * - *.

auth - *.

bill .

.

.



Всего около 30 имён.

Таким образом, готовый сертификат включает имена

test-y123.skyeng.link *.

test-y123.skyeng.link *.

auth.test-y123.skyeng.link *.

bill.test-y123.skyeng.link

и так далее.

После увольнения разработчика или тестировщика их тестирование удаляется.

Сертификат остается готовым к использованию.

Вы знаете, где все это хранится, и знаете, как оно распределяется по хостам.



P.S.

Репозиторий кода .

Возможно, вам также будет интересно почитать на эту тему: Как переполнение стека перешло на HTTPS :

  • Сотни доменов разного уровня
  • Вебсокеты
  • Множество HTTP API (проблемы с прокси)
  • Делайте все, не жертвуя производительностью
Если у вас есть вопросы, пишите в комментариях, буду рад ответить.

Теги: #ИТ-инфраструктура #Системное администрирование #DevOps #ansible #Администрирование доменных имен #SSL-сертификаты #Certbot #обновление SSL-сертификатов

Вместе с данным постом часто просматривают:

Автор Статьи


Зарегистрирован: 2019-12-10 15:07:06
Баллов опыта: 0
Всего постов на сайте: 0
Всего комментарий на сайте: 0
Dima Manisha

Dima Manisha

Эксперт Wmlog. Профессиональный веб-мастер, SEO-специалист, дизайнер, маркетолог и интернет-предприниматель.