ESC1
, выделяем его и нажимаем на кнопку OK.
Рис. 4.65. Опубликованные шаблоны сертификатов
ESC2
Повторяем действия для создания шаблона сертификатов. Имя нового сертификата –
ESC2
. Во вкладке Subject Name устанавливаем Supply in the request. Переходим во кладку Extensions, выбираем Application Policies и нажимаем на кнопку Edit. У нас есть два варианта: или удалить все значения и оставить поле пустым, или добавить политику Any Purpose. Нажимаем на Apply.
Рис. 4.66. Настройка шаблона сертификата ESC2
Теперь необходимо опубликовать шаблон сертификата.
ESC3
В данном случае потребуется два шаблона сертификата. Создаем копию, как было описано ранее, называем шаблон
ESC3_1
. Переходим во вкладку Extensions и редактируем Application Policies. Нам необходимо удалить все поля и вместо них добавить Certificate Request Agent (рис. 4.67).Нажимаем на кнопку Apply и закрываем окно. Теперь создадим еще один шаблон сертификата и назовем его
ESC3_2.
Переходим во вкладку Issuance Requirements и выполняем настройку. Установим галочку на This number of authorized signatures. В Policy type required in signature выберем Application policy, а в Application policy – Certificate Request Agent (рис. 4.68).Нажимаем кнопку Apply и опубликовываем оба шаблона сертификата.
Рис. 4.67. Настройка шаблона сертификата ESC3_1
Рис. 4.68. Настройка шаблона сертификата ESC3_2
ESC4
Создадим еще одну копию шаблона сертификата
User
и назовем его ESC4
. Перейдем во вкладку Security и выполним следующие настройки: группе Authenticated
Users
предоставим полные права на данный шаблон, а группе Domain
Users
добавим права Write
.
Рис. 4.69. Права ACL для шаблона сертификата ESC4
Нажимаем кнопку Apply, закрываем окно и опубликовываем новый шаблон сертификата.
ESC5
В данном случае не требуется никаких дополнительных настроек. Это связано с тем, что наш центр сертификации установлен на контроллере домена, а предоставлять права локального администратора на контроллер домена кому-то кроме администраторов – плохая практика.
ESC6
Для настройки недостатка необходимо запустить командную строку с правами администратора и выполнить следующую команду:
certutil -config "dc.domain.local\domain-DC–CA" -setreg policy\EditFlags +EDITF_ATTRIBUTESUBJECTALTNAME2
Рис. 4.70. Результат выполнения команды
ESC7
Возвращаемся в Certification Authority, вызываем контекстное меню для нашего центра сертификации и выбираем Properties. Переходим во вкладку Security и добавим группу
Domain User,
которой предоставим права Issue and Manage Certificates и Manage CA
(рис. 4.71).После добавления прав необходимо перезагрузить центр сертификации.
ESC8
Мы уже установили Web Enrollment, и дополнительные настройки не требуются.
ESC11
В командной строке с правами администратора нужно выполнить команду (рис. 4.72):
certutil -config "dc.domain.local\domain-DC–CA" -setreg "CA\InterfaceFlags" -IF_ENFORCEENCRYPTICERTREQUEST
Рис. 4.71. Добавление прав управления
Рис. 4.72. Удаление флага из настроек
Совет
Можно запустить утилиту certify или certipy и изучить результаты.
Сбор информацииДля сбора информации напишем скрипт на Powershell и назовем его
Get-ADCSInformation.ps1.
Алгоритм скрипта будет следующим:● Выгрузить из Active Directory все шаблоны сертификатов.
● На основании информации о недостатках в шаблонах сформировать узел шаблона сертификата.
● Получить владельца шаблона сертификата.
● Получить ACL для шаблонов сертификатов.
● Запросить из Active Directory все центры сертификации.
● На основании информации о недостатках центра сертификации сформировать узлы центра сертификации.
● Проверить, в каких центрах сертификации используются шаблоны сертификатов.
Внимание
Данный скрипт является рабочей демонстрацией, но при этом в нем отсутствует ряд механизмов проверок, например доступности самого центра сертификации по портам.
Некоторые комментарии по работе скрипта будут предоставлены в самом коде.
# https://www.sysadmins.lv/blog-en/how-to-convert-pkiexirationperiod-and-pkioverlapperiod-active-directory-attributes.aspx
function Convert-pKIPeriod ([Byte[]]$ByteArray)
{
[array]::Reverse($ByteArray)
$LittleEndianByte = –join ($ByteArray |%{ "{0:x2}" -f $_})
$Value = [Convert]::ToInt64($LittleEndianByte,16) * -.0000001
if (!($Value% 31536000) -and ($Value / 31536000) -ge 1) {[string]($Value / 31536000) + " years"}
elseif (!($Value% 2592000) -and ($Value / 2592000) -ge 1) {[string]($Value / 2592000) + " months"}
elseif (!($Value% 604800) -and ($Value / 604800) -ge 1) {[string]($Value / 604800) + " weeks"}
elseif (!($Value% 86400) -and ($Value / 86400) -ge 1) {[string]($Value / 86400) + " days"}
elseif (!($Value% 3600) -and ($Value / 3600) -ge 1) {[string]($Value / 3600) + " hours"}
else { "0 hours"}
}
function Get-ADCSInfo()
{
# Создаем hashtable для флагов Request Disposition
[flags()] Enum RequestDisposition
{
Pending = 0x00000000
Issue = 0x00000001
Deny = 0x00000002
UserRequestAttribute = 0x00000003
Mask = 0x000000ff
PendingFirst = 0x00000100
}
# Создаем файл отчета
[string]$OutFile = "ADCS_" + $(Get-Date -f ddMMyyyyhhmmss) +".log"
# Получаем имя домена
$DomainObject = [System.DirectoryServices. ActiveDirectory.Domain]::GetCurrentDomain()
$CurrentDomain = ([ADSI]""). distinguishedName
$DomainName = $DomainObject.name.toUpper()
# Выполняем ADSI-запрос для получения всех шаблонов сертификатов
$Objects = [ADSI]"LDAP://CN=Certificate Templates, CN=Public Key Services, CN=Services, CN=Configuration, $CurrentDomain"
$Templates = $Objects.Get_Children()
foreach($template in $templates)
{
# Получаем имя шаблона сертификата
$Name = $Template.properties.name.toUpper()
# Получаем отображаемое имя шаблона сертификата
$DisplayName = $Template.properties.displayname
# Получаем distinguishedname шаблона сертификата
$DN = $Template.properties.distinguishedname
# Получаем guid шаблона сертификата
$ObjectGUID = [guid]$Template.properties.objectGUID. value | select -ExpandProperty Guid
# Получаем размер ключа шаблона сертификата
$KeySize = $Template.properties.'msPKI–Minimal-Key-Size'
# Проверяем, можно ли экспортировать ключ сертификата
if($template.properties.'msPKI-Private-Key-Flag'.value -band "0x00000010")
{
$ExportableKey = "True"
}
else
{
$ExportableKey = "False"
}
# Проверка установки флага Key Archival для ключей
if($template.properties.'msPKI-Private-Key-Flag'.value -band "0x00000001")
{
$RequiresKeyArchival = "True"
}
else
{