Имена, адреса и TLS

Что это такое

Прежде чем отправить запрос, имя должно стать адресом, а прежде чем ответу можно доверять, соединение нужно защитить. Разрешение проходит по иерархии серверов имён, чтобы найти адрес; рукопожатие TLS доказывает подлинность сервера и согласует шифрование. И то и другое происходит до первого байта запроса, поэтому оба появляются в инцидентах как задержки или сбои вообще без участия приложения.

Почему это важно

Самые частые причины «сайт недоступен» лежат не в приложении: сертификат истёк, имя разрешается в старый адрес, запись не распространилась или имя разрешается иначе изнутри сети, чем снаружи. Ничего из этого не видно в логах приложения, и всё это быстро подтвердить, когда модель под рукой. Понимание последовательности объясняет и то, почему добавить запись быстро, а изменить её может занять часы.

Ключевые идеи

Разрешение идёт от самого конкретного к самому авторитетному

Клиент спрашивает резолвер, который идёт от корня к авторитетному серверу домена и возвращает ответ. Ответы кэшируются на каждом шаге на время, которое объявляет сама запись, — поэтому изменение не мгновенно и поэтому понизить это значение перед миграцией стало стандартной практикой.

клиент -> резолвер -> корень -> домен верхнего уровня -> авторитетный сервер
                    (каждый кэширует ответ на время жизни записи)

Типы записей отвечают на разные вопросы

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

Имена в сертификате должны совпадать с запрошенным именем

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

Рукопожатие доказывает подлинность и согласует ключ

Клиент и сервер обмениваются ключевым материалом, а сервер предъявляет свой сертификат и доказательство, что владеет соответствующим закрытым ключом. Затем клиент проверяет сертификат по доверенному удостоверяющему центру, по срокам действия и по запрошенному имени. Только после этого начинается шифрование, поэтому медленная часть нового соединения — рукопожатие, а не запрос.

приветствие клиента -> сертификат сервера + обмен ключами -> проверка клиентом -> шифрованная сессия

Срок жизни сертификата — запланированное событие

Сертификаты истекают, и истечение — это сбой с известной датой и временем. Автоматическое продление делает его не-событием; ручное делает его повторяющимся инцидентом, который случается, когда человек, помнящий о нём, недоступен. Сбой обычно невидим до дня, когда он тотален, — именно поэтому его стоит автоматизировать, а не документировать.

Последовательность задержек указывает на виновника

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

Практика

Проследите имя до его ответа

Разрешите имя шаг за шагом, определите авторитетный сервер, который ответил, и время жизни на записи.

Готово, когда: вы можете сказать, сколько ответ будет кэшироваться и какое изменение потребовало бы сначала понизить время жизни записи.

Проверьте покрытие сертификата

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

Готово, когда: вы можете назвать точный набор имён, которые удостоверяет сертификат, и почему родственное имя не проходит.

Частые ошибки

  • Менять запись, не понизив сначала её время жизни — клиенты держат старый ответ часами; исправить: понизьте значение, подождите, затем меняйте.
  • Доверять сертификату, чьё имя не совпадает — клиент говорил не с тем сервисом; исправить: проверьте запрошенное имя против покрытия сертификата.
  • Продлевать сертификаты вручную — истечение становится запланированным сбоем; исправить: автоматизируйте продление и оповещайте о его сбое.
  • Читать запись адреса как запись имени — разрешение падает или тихо указывает в другое место; исправить: убедитесь, что тип записи отвечает на заданный вопрос.
  • Диагностировать разрешение изнутри той же сети — внутренние и внешние ответы различаются; исправить: проверяйте с позиции клиента, а не сервера.

Что читать дальше