О названии домена для 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"}'