Skip to content

О названии домена для Windows Active Directory и Let's Encrypt

При выборе названия для домена Active Directory лучше не спешить и хорошо обдумать. Это одна из тех настроек в системе, которую раз сделаешь и потом очень сложно поменять.

Содержание

  • Выбор названия домена Active Directory
  • Let’s Encrypt

    • http-01
    • dns-01
    • DNS dynamic update
    • CNAME alias
    • NS делегирование
    • ACME DNS
    • Posh-ACME
    • curl и REST API
  • Сервисы Windows для защиты сертификатом

    • LDAP
    • RDP
    • IIS
    • WinRM

Длительное вермя было принято использовать имя с непубличным доменом (TLD). Например, example.local.

Однако проходит время и выходят особенности такой настройки. Например, невозможность получить сертификат из публичных Certificate Authority. И приходиться разворачивать свой внутренний Центр Сертификации. И находить способ импортировать корневой сертификат на все устройства, подключающиеся к ресурсам домена.

С одной стороны распространение шифрования TLS и с другой политики BYOD (не подключенные к домену устройства) вместе выявило необходимость к получению сертификатов из публичного CA. А также история с покупкой .DEV домена Google, выявила уязвимость в привязке к ресурсу, которым вы не владеете.

Распространения таких систем защиты как HSTS и Certificate Transparancy также закрепляет шифрование с использованием публичных сертификатов.

Поэтому стоит поменять отношение к выбору имени домена Active Directory. И использовать поддомен основного домена компании из Интернета.

Как правило на главном домене располагается веб-сайт с адресом example.org. Тогда домен AD может называться, например, internal.example.org. Главное зарезервировать для Acitve Directory Domain Services неиспользуемый поддомен из публичного домена. Чтобы адреса Active Directory не пересекались с публичными адресами. Потому что если этого не сделать, то DNS запись example.org будет указывать на контроллер домена, а не на веб сайт организации. Для записи NetBIOS или UPN, можно выбрать не привязанное к основному адресу имя, например для AD домена internal.example.org:

  • NetBIOS - при установке первого контроллера домена (dcpromo) выбрать имя example. Помните об ограничении в 15 символов. Тогда имя пользователя будет example\user , а не internal\user
  • UPN - в Active Directory Forests and Trusts добавить суффикс @example.org. Тогда UPN имя пользователя будет user@example.org , а не user@internal.example.org

Let's Encrypt

Из доступных центров сертификации наиболее распространен Let's Encrypt. Срок годности его сертификатов - 90 дней. Т.е. он рассчитан на регулярный запуск команды с автоматическим перевыпуском сертификата по расписанию. Он не требует оплаты. А для регистрации достаточно email. И подтвердить владение доменом.

Существует несколько способов подтвердить владение доменом в Let's Encrypt.

  • http-01

    • Требует веб-севрер, на котором размещается файл.
    • Сервер Let's encrypt веб запросом проверяет наличие файла с ключом по известному адресу.
    • Пример адреса example.org/.well-known/acme-challenge/.
    • Если файл найден - подтверждается домен, выдается сертификат.
  • dns-01

    • Требует TXT запись в DNS.
    • Клиент Let's Encrypt создает и удаляет TXT запись _acme-challenge в поддомене основного домена.
    • Сервер Let's encrypt DNS запросом проверяет содержимое TXT записи с ключом.
    • Пример записи _acme-challenge.example.org.
nslookup -q=TXT _acme-challenge.example.org

То что надо. Можно запрашивать как wildcard сертифкат, так и на конкретное имя. Wildcard более уязвимый, но более удобный в использовании. Его можно получить на весь поддомен *.internal.example.org и использовать для шифрования коммуникации серверов внутри всего поддомена. Главное помнить, что wildcard сертификат покрывает один уровень, т.е. сертификат будет покрывать например dc01.internal.example.org, но будет нерабочим для n01.clu01.internal.example.org.

DNS динамические обновления

Осталось только найти DNS провайдер, который поддерживает динамическое обновление записей. Существует несколько способов обновления DNS записи на DNS сервере.

  • DNS dynamic update RFC 2136. Утилита nsupdate
  • REST API Через использование плагина

У Let's Encrypt есть список DNS провайдеров, которые поддерживаются certbot. Это значит, что к утилите certbot есть плагин, который будет регистрировать необходимые DNS записи.

Есть другие клиенты, поддерживающие протокол ACME. Например Posh-ACME. У которого тоже есть список DNS провайдеров, которые поддерживаются.

Делегирование

Если вашего DNS регистратора не оказалось в списке поддерживаемых, то можно попробовать вариант делегирования _acme-challenge в другую зону. Это значит, что запись _acme-challenge выделяется в отдельный DNS сервер, который поддерживает обновление через плагин.

  • Выбрать DNS хостинг поддерживающий Let's Encrypt. Списки выше.
  • Создать CNAME запись _acme-challenge в домене на основном регистраторе
  • Запись указывает на запись TXT на хостинге, поддерживающем Let's Encrypt
  • Let's Encrypt создает автоматически запись TXT при проверке
  • После подтверждения домена, запись TXT дожна быть удалена. Let's Encrypt может использовать команду удаления (пример с хуком приведен ниже)

Варианты выделения _acme-challenge записи также повышает безопасноть. В случае компрометации клиента Let's encrypt или утечки прав доступа, только эта запись будет подвержена, а основной домен не подвержен.

Варианты делигирования _acme-challenge

  • Использование CNAME записи в другую зону называется DNS псевдоним (alias). Этот режим требует поддержки со стороны клиента Let's Encrypt, поскольку CNAME запись располагается на одном DNS сервере, а TXT запись создается на другом DNS сервере. И если клиент не поддерживает DNS aliasing, он попытается обновить TXT запись на основном DNS сервере, не поддерживающим плагин.
  • Использование NS записи для поддомена называется DNS делегирование. Этот режим поддерживается всеми клиентами Let's Encrypt, поскольку зона DNS располагается на DNS сервере, содержащем TXT запись.

Пример CNAME записи для alias

_acme-challenge.www.example.com. IN CNAME acme.example.net 
_acme-challenge.example.com. IN CNAME acme.example.net

Примечание к записи

  • Одна CNAME запись для каждой записи
  • Количество CNAME азписей равно количеству имен в сертификате
  • Запись TXT может быть одна, для всех CNAME записей
  • CNAME запись example.com указывает на TXT запись acme.example.net

Пример записей для NS делегирования

_acme-challenge.www.example.com. IN NS acme-ns1.example.net 
_acme-challenge.example.com. IN NS acme-ns1.example.net

Примечание к записям

  • DNS сервер acme-ns1.example.net содержит зоны _acme-challenge
  • Отдельная зона _acme-challenge для каждой записи
  • Для двух имен в сертификате example.com и www.example.com создано две зоны
  • Для работы с CNAME записями нужен клиент Let's Encrypt, который поддерживает такой режим

ACME DNS

Еще один вариант, если ваш DNS провайдер не поддерживает Let's Encrypt. Использовать ACME DNS. Специальный публичный DNS сервер, который поддерживает добавление записей для Let's Encrypt. Это значит, что не потребуется искать отдельный DNS провайдер, который поддерживает Let's Encrypt.

При первом запуске certbot или Posh-ACME потребуется вручную зарегистрировать CNAME запись _acme-challenge указывающую на запись в домене auth.acme-dns.io (см. ниже). Эта запись потом сохранится и при обновлении сертификата, не потребуется ее создавать.

Дальше пойдут примеры команд и настроек Let's Encrypt. Поскольку существуют множество вариантов получить сертификат указаны лишь некоторые ситуации. Следует выбрать исходя из поставленной цели.

Другая статья по Let's Encrypt.

Posh-ACME и CNAME запись

New-PACertificate -Domain '*.example.org','example.org' -AcceptTOS -DnsPlugin <dns.hosting.for.example.net> -PluginArgs @{'DMEKey=xxx'} -DnsAlias acme.example.net -Contact support@example.org -Install

Примечание к команде

  • Работает на PowerShell. Запускать с правами администраротра
  • Требует установки Posh-ACME
  • Для обновления сертификата можно использовать команду Submit-Renewal. Которую можно добавить в задачи, запускаемые по расписанию
  • Команда сочетает несколько действий.

    • Создание TXT записи в домене example.net.
    • Запрос сертификата, покрывающего домен example.org и wildcard
  • Сначала нужно создать CNAME запись в example.org, указывающую на запись acme.example.net _acme-challenge.example.org → _acme-challenge.example.net

  • DnsPlugin - имя плагина хостинга, на котором размещается запись acme.example.net
  • DnsAlias - имя, которое будет регистрировать Posh-ACME с помощью плагина.

One or more FQDNs that DNS challenges should be published to instead of the certificate domain's zone. This is used in advanced setups where a CNAME in the certificate domain's zone has been pre-created to point to the alias's FQDN which makes the ACME server check the alias domain when validation challenge TXT records. If the same alias is used for all domains in the order, you can just specify it once. Otherwise, you should specify as many alias FQDNs as there are domains in the order and in the same sequence as the order.

  • Install - сертификат устанавливается в локальное хранилище сертификатов компьютера в контейнер Personal

Posh-ACME и ACME DNS плагин

Как говорилось выше, существует специальный DNS сервер auth.acme-dns.io для выполнения верификации домена через механизм dns-01. При первом запуске вам предложат создать CNAME запись в вашем домене, указывающую на уникальную для вас TXT запись в auth.acme-dns.io домене.

acme-dns будет выступать авторизированным DNS сервером для под-домена вашего домена.

acme-dns сервис будет создавать случайные записи в этом под-домене (или случайные записи для каждого FQDN, который вы запросите в сертификате), например 32f5274d-51e3-466d-bf38-eb9980e7bcf3.auth.acme-dns.io.

Нужно добавить CNAME запись _acme-challenge.example.com, указывающую на случайную запись acme-dns.

Когда Let's Encrypt проверяет владение доменом example.com, он ищет DNS записи_acme-challenge.example.com, находит CNAME запись для 32f5274d-51e3-466d-bf38-eb9980e7bcf3.auth.acme-dns.io, и запрашивает TXT запись _acme-challenge.32f5274d-51e3-466d-bf38-eb9980e7bcf3.auth.acme-dns.io.

В этот момент, acme-dns обслужит вызов, который ваш клиент запросил его обслужить, проверка достоверности будет успешной, и Let's Encrypt выпустит сертификат.

Примечание: после того, как вы настроили acme-dns, вы можете использовать его для любого домена, которым вы управляете. Другими словами, вы можете использовать один экземпляр для проверки контроля любого количества доменов или под-доменов, просто установив отдельные записи CNAME для каждого желаемого (под)домена.

Пример первого запуска Posh-ACME и плагина ACME DNS

New-PACertificate example.com -DnsPlugin AcmeDns -PluginArgs @{ACMEServer='auth.acme-dns.io'}
Please create the following CNAME records:
 ------------------------------------------ 
_acme-challenge.example.com -> xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx.auth.acme-dns.io
 ------------------------------------------ 
Press any key to continue.:

Примечание к компанде

  • example.com - домен, для которого запрашивается сертификат. Каждое имя в сертификате требует отдельной CNAME записи, поэтому рекомендуется заранее подумать какие именя должен покрывать сертификат
  • DnsPlugin - плагин для использования ACME DNS
  • ACMEServer - адрес ACME DNS сервера
  • _acme-challenge.example.com - CNAME запись, которую нужно создать в основном домене
  • xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx.auth.acme-dns.io - уникальная TXT запись, которая будет обновляться клиентом Let's Encrypt
  • Поскольку параметра Install не было, то в рабочей папке сохранятся сертификаты в файлах

    • cert.cer (Base64 PEM сертификат)
    • cert.key (Base64 PEM закрытый ключ)
    • cert.pfx (PKCS12 контейнер сертификат+закрытый ключ)
    • chain.cer (Base64 PEM цепочка сертификатов выпускающего центра сертификации (CA))
    • fullchain.cer (Base64 PEM сертификат+закрытый ключ)
    • fullchain.pfx (PKCS12 контейнер сертификат+закрытый ключ+цепочка сертификатов CA)
  • Поскольку параментра PfxPass не было, то пароль на PFX контенер установлен poshacme

Будущее обновление сертифката не потребует ручного взамиодействия. Скрипт обновления можно запускать по расписанию. Главное не изменять имена, покрываемые сертификатом. Пример команды обновления

Submit-Renewal

Примечание к команде

  • Команды выпуска сертификата (New-PACertificate) и обновления сертификата должны запускаться под одним пользователем. Потому что настройки Posh-ACME сохраняются в профиль текущего пользователя

curl и REST API запрос на регистрацию TXT записи

curl -X PUT "HTTPS://API.DNS.REGISTAR/v1/domains/EXAMPLE.ORG/records/TXT/_acme-challenge" -H "accept: application/json" -H "Content-Type: application/json" -H "Authorization: sso-key 1234" -d "[{ \"data\": \"<TOKEN_FROM_CERTBOT>\", \"name\": \"_acme-challenge\", \"ttl\": 600 }]"

Примечание к команде

  • URL создержит REST API путь, в котором указывается домен, тип записи и имя записи. У каждого регистратора он свой
  • sso-key 1234 - ключ авторизации, которому даны права на регистраторе добавлять запись
  • команда хранится в файле-скрипте, запускаемый в команде certbot через параметр --manual-auth-hook
  • TOKEN_FROM_CERTBOT - передается от команды certbot ниже

certbot c хуками на регистрацию TXT

certbot -d example.org --agree-tos --register-unsafely-without-email --manual --preferred-challenges dns --manual-auth-hook <register.txt.dns.script> --manual-cleanup-hook <delete.txt.dns.script> --manual-public-ip-logging-ok --force-renewal certonly

Примечание к команде

  • register.txt.dns.script - путь к скрипту с командой выше. Регистрирует DNS запись _acme-challenge.example.org
  • delete.txt.dns.script - путь к скрипту удаления TXT записи. Здесь не приведен для экономии места

certbot и DNS Dynamic updates (RFC2136)

Это вариант, когда у вас есть BIND DNS сервер, который отвечает на запросы из Интернета. Для этого на нем настраивается обновление записи от клиента Let's Encrypt.

  • Сгенерировать TSIG ключ для авторизации обновления зоны

    dnssec-keygen -a HMAC-SHA512 -b 512 -n HOST keyname.
    
  • Примечание к команде

    • Команда создаст два файла .key и .private
    • Для TSIG можно использовать любой из них. Возьмите .key
  • Настроить конфигурацию BIND

    key "keyname." {
    algorithm hmac-sha512;
    secret "abc...";
    };
    zone "example.com." IN {
    type master;
    file "named.example.com";
    update-policy {
    grant keyname. name _acme-challenge.example.com. txt;
    };
    };
    
  • Примечание к файлу

    • Это конфигурационный файл DNS сервера, который будет принимать запрос обновления записи
    • Разрешить обновления TXT записи _acme-challenge.example.com.
    • secret - сгенирированный TSIG ключ
    • update-policy - разрешить TSIG ключу keyname. обнавлять запись _acme-challenge TXT в зоне
  • Создать файл учетных данных rfc2136.ini для настройки DNS обновления через certbot

# Target DNS server
dns_rfc2136_server = 10.11.12.13
# Target DNS port
dns_rfc2136_port = 53
# TSIG key name
dns_rfc2136_name = keyname.
# TSIG key secret
dns_rfc2136_secret = abcd...
# TSIG key algorithm
dns_rfc2136_algorithm = HMAC-SHA512
  • Примечание к файлу

    • Это конфигурационный файл клиента Let's Encrypt. Он должен располагаться на машине, где будет запускаться certbot
  • Использовать файл в запросе Let's Encrypt

    certbot certonly --dns-rfc2136 --dns-rfc2136-credentials ~/.secrets/certbot/rfc2136.ini -d example.com -d \*.example.com
    

nsupdate на регистрацию TXT записи

Это вариант, когда у вас есть BIND DNS сервер, который отвечает на запросы из Интернета. Для этого используется команда nsupdate, которую запускает клиент Let's Encrypt.

/usr/bin/nsupdate << EOM
server 10.11.12.13
zone _acme-challenge.${CERTBOT_DOMAIN}
update add _acme-challenge.${CERTBOT_DOMAIN} 300 TXT "${CERTBOT_VALIDATION}"
send
EOM

Примечание к команде

  • команда хранится в файле-скрипте, запускаемом в команде certbot через параметр --manual-auth-hook
  • CERTBOT_VALIDATION - передается от команды certbot ниже
  • CERTBOT_DOMAIN - передается от команды certbot ниже
certbot certonly -n --manual-public-ip-logging-ok --agree-tos --manual --preferred-challenges=dns --manual-auth-hook register.txt.dns.script -d "*.example.org"

Примечание к команде

  • register.txt.dns.script - путь к скрипту с командой выше. Регистрирует DNS запись _acme-challenge.example.org

Сервисы в Windows, поддерживающие шифрование сертификатом

Рассмотрим сервисы на серевере Windows, которым можно настроить защититу шифрованием TLS с использованием сертификата.

LDAP

Аутентификация. Используют третьи приложения, которые плохо интегрируются со встроенной в Windows системой Kerberos (я смотрю на тебя Java). Авторизация по LDAP передается открытым текстом (LDAP simple bind). И это проблема. Microsoft выпустила обновление, которое говорит про это.

В совете по безопасности Microsoft ADV190023 администраторам рекомендуется включить привязку канала LDAP и подписывание LDAP для контроллеров доменов Active Directory.

Обнолвение ADV190023 March 2020 не меняет эти настройки. Важно: Обновления 10 марта 2020 года не меняет политики по умолчанию для LDAP подписания и привязки LDAP каналов на новых или существующих контроллерах доменов Active Directory.

Microsoft рекомендует запретить LDAP simple bind. Безопасность контроллеров домена Active Directory может быть значительно улучшена настройкой сервера на отказ от простых привязок LDAP, которые выполняются через соединение открытым текстом (не зашифрованном по TLS).

Microsoft рекомендует их менять вручную в реестре.

  • LDAP Channel Binding - LdapEnforceChannelBinding - HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\NTDS\Parameters
  • LDAP Server signing - LDAPServerIntegrity - HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\NTDS\Parameters

Или использовать политики безопастности на контроллерах домена

  • LDAP channel binding - Domain controller: LDAP server channel binding token requirements
  • LDAP signing - Domain controller: LDAP server signing requirements

Шифрование LDAP

LDAP используется для чтения из Active Directory и записи в нее. По умолчанию LDAP-трафик передается незащищенным (открытым текстом). Можно сделать LDAP трафик конфиденциальным и безопасным, используя технологию Transport Layer Security (TLS). Включив LDAP через SSL (LDAPS) и установив сертификат. Нет пользовательского интерфейса для настройки LDAPS. Установка действующего сертификата на контроллер домена позволяет службе LDAP прослушивать и автоматически принимать SSL соединения как для трафика LDAP, так и для трафика глобального каталога.

Чтобы импортировать сертификат для LDAP

  • Выполнить mmc
  • Выбрать Сертификаты (Certificates)
  • Выбрать локальный компьютер → Сервисы → Active Directory Domain Services
  • Импортировать в NTDS → Personal

Особенности сертификата для LDAP

  • Существует вероятность несовместимости публичного сертификата с некоторыми сервисами Windows. Внутренний Active Directory Certificate Services может поддерживать атрибуты недоступные публичному центру сертификации. Из возможных проблем с совместимостью: Smart Card Authentication, Device Certificate Authentication, Windows 10 Hello for Business
  • Должен включать домен и адрес контроллера. Если у вас несколько контроллеров возможно придется выпускать несколько сертификатов
  • KB 321051 - Полное имя контроллера домена (DC01.EXAMPLE.ORG) должно присутствовать в: Common Name (CN) поле Subject или DNS поле Subject Alternative Name

RDP

Протокол удаленного доступа. TLS используется как на самом протоколе, так и на сервере шлюза удаленных рабочих столов (Remote Desktop Gateaway).

  • Установить сертификат в Local Computer → Personal
  • Получить идентификатор (thumbprint) сертификата

    Get-ChildItem "Cert:\LocalMachine\My"
    
  • Указать в переменной путь WMI до прослушивателя RDP

    $PATH = (Get-WmiObject -class "Win32_TSGeneralSetting" -Namespace root\cimv2\terminalservices)
    
  • Указать идентификатор сертификата (thumbprint) для RDP

    Set-WmiInstance -Path $PATH -argument @{SSLCertificateSHA1Hash="thumbprint"}
    

IIS

Веб сервер. Настройка привязки порта 443 протокола https.

WinRM

PowerShell Remoting. WinRM HTTPS слушает на порту 5986.

  • Команда проверки порта прослушки

    winrm enumerate winrm/config/listener
    
  • Или посмореть настройку PowerShell Remoting через PowerShell

    Get-ChildItem wsman:\localhost\Listener
    
  • Включить HTTPS порт в WinRM

    winrm quickconfig -transport:https
    
  • Или включить PowerShell Remoting через Powershell

    Enable-PSRemoting
    
  • Указать использовать сертификат с определенным идентификатором (thumbprint)

    winrm create winrm/config/Listener?Address=*+Transport=HTTPS @{Hostname="machine.example.org"; CertificateThumbprint="abc..."}
    
  • Или настройка HTTPS прослушки в PowerShell

    New-Item -Path WSMan:\localhost\Listener\ -Transport HTTPS -Address * -CertificateThumbPrint abc...
    

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

Get-ChildItem wsman:\localhost\Listener\ | Where-Object -Property Keys -eq 'Transport=HTTP' | Remove-Item -Recurse

Для того чтобы разрешить серверу передавать учетные данные на следующий сервер (CredSSP delegation). Этот случай когда удаленный сервер используется как промежуточный пункт, через который подлючаются к следующему серверу.

Enable-WSManCredSSP -Role Server

Команда подключения PowerShell Remoting на клиенте с использованием шифорвания

Enter-PSSession -ComputerName machine.example.org -UseSSL

Для подключения с некоторых машин потребуется разрешить на сервере Basic authentication

winrm set winrm/config/service/auth '@{Basic="true"}'

Источник 1

Источник 2

Источник 3

Источник 4

Источник 5

Источник 6

Источник 7

Источник 8

Источник 9

Источник 10

Источник 11

Источник 12

Источник 13

Источник 14

Источник 15

Источник 16

Источник 17

Источник 18

Источник 19

Источник 20

Источник 21

Источник 22

Источник 23

Источник 24

Источник 25

Источник 26

Источник 27

Источник 28

Источник 29

Источник 30

Источник 31

Источник 32

Источник 33

Источник 34

Источник 35

Источник 36

Источник 37