Выбор учётной записи службы Windows — LocalSystem, виртуальные учётные записи и gMSA
· Го Комура · Windows, Службы Windows, Учётные записи служб, gMSA, LocalSystem, Виртуальные учётные записи, Безопасность, Active Directory, Наименьшие права
«Внутреннюю службу, которую мы пока запускали от LocalSystem, на аудите безопасности отметили как „избыточные права“. На что менять?» «Служба не могла обратиться к общей папке, поэтому мы запускаем её от доменного пользователя. Когда пароль истекает, служба останавливается, поэтому мы сделали его без срока и записали открытым текстом в регламент.» — Среди консультаций вокруг служб Windows заказчиков эти две — классика.
Общее у обеих площадок то, что учётная запись входа службы заморожена как «настройка, которая случайно заработала», а не как проектное решение. Служба Windows всегда работает в контексте безопасности какой-то учётной записи, и эта учётная запись решает всё: что она может делать локально, кем она выглядит с той стороны сети и кто ведёт пароль. Оставьте это по умолчанию — и уязвимость одной службы ведёт напрямую к захвату всей машины, а открытые пароли разлетаются по регламентам и сценариям.
flowchart TB
accTitle: Три вещи, которые решает учётная запись входа
accDescr: Служба всегда работает в контексте безопасности какой-то учётной записи, и эта учётная запись решает всё, что она может делать локально, кем она выглядит с той стороны сети и кто ведёт пароль
acct["Учётная запись входа службы"] --> local["Что она может делать локально"]
acct --> net["Кем она выглядит с той стороны сети"]
acct --> pwd["Кто ведёт пароль"]
Рис. 1: Выбор учётной записи входа — проектное решение, которое одновременно фиксирует локальные права, сетевую идентичность и ведение пароля.
Фактически есть шесть выборов — LocalSystem, LocalService, NetworkService, виртуальная учётная запись (NT SERVICE\<имя-службы>), доменный пользователь и gMSA (групповая управляемая учётная запись службы). Рассчитанная на ИТ-сотрудников малых и средних предприятий и разработчиков приложений Windows, эта статья сводит права, сетевую идентичность и ведение пароля этих шести в одну таблицу и кратко излагает поток решений, опираясь на первоисточники Microsoft Learn по состоянию на август 2026 года.имя-службы>
Как строить саму службу (выбор между планировщиком заданий и службой, реализация через .NET Worker Service) разобрано в «Как создавать и эксплуатировать службы Windows». Эта статья сосредоточена на «учётной записи входа» — там, где случается больше всего аварий.
1. Сначала вывод
- Если сомневаетесь, первый кандидат для службы, которая заканчивается внутри одной машины, — виртуальная учётная запись, а для службы, которая обращается к ресурсу внутри домена с идентичностью конкретной службы, — gMSA. Microsoft также даёт указание использовать управляемую учётную запись (MSA / виртуальную) везде, где возможно.12
- Не выбирайте LocalSystem потому что «работает». Токен включает SYSTEM и BUILTIN\Administrators и держит сильные права вроде SeDebugPrivilege, поэтому захват почти всё на этой машине теряет. То, что значение по умолчанию
sc.exe create— LocalSystem, и есть питательная среда этой аварии.34 - Разница между LocalService и NetworkService — сетевая идентичность. Локальные права у обеих минимальны, но для удалённой стороны LocalService выглядит анонимно, а NetworkService — как учётная запись компьютера.5
- **Виртуальная учётная запись (NT SERVICE\<имя-службы>) — современное значение по умолчанию, которое разделяет идентичность по службам, не требуя ведения пароля.** «NT SERVICE\\имя-службы» можно указать прямо в ACL, и учётная запись службы SQL Server по умолчанию — тоже она.[^understand-service-accounts][^sql-service-accounts]имя-службы>
- Когда LocalSystem, NetworkService или виртуальная учётная запись выходят в сеть, они становятся учётной записью компьютера (DOMAIN\имя-компьютера$). Выдача PC$ в ACL общей папки или SQL Server часто позволяет обойтись без доменного пользователя.36
- Конфигурация, которая использует доменного пользователя для службы, становится долгом и по эксплуатации паролей, и перед Kerberoasting. SCM входит с сохранённым паролем, поэтому истечение становится отказом запуска, а «никогда не истекает + заметка открытым текстом», которое это обходит, становится подарком злоумышленнику.78
- gMSA заставляет Active Directory автоматически порождать и чередовать пароль. Требования — домен и корневой ключ KDS, а службу задают как «DOMAIN\имя-учётной-записи$» с пустым полем пароля. Некоторые приложения этого не поддерживают, поэтому нужна предварительная проверка.910
- Смена учётной записи меняет предпосылки профиля, %TEMP% и DPAPI. Данные, защищённые DPAPI старой учётной записи, новая расшифровать не может.
- Инвентаризацию текущего состояния можно подтвердить по учётным записям входа списка служб и по событию с кодом 4624 (тип входа 5).11
Одним предложением вывод этой статьи: сделайте конфигурацию, которая «не даёт службе человеческий пароль» (встроенные учётные записи, виртуальная, gMSA), значением по умолчанию, а доменного пользователя считайте последним средством.
2. Общая картина выборов — шесть учётных записей входа в одной таблице
Сначала один шаг повторения. При запуске службы диспетчер управления службами (SCM) входит как настроенная учётная запись и при успехе создаёт маркер доступа и назначает его процессу службы. Далее каждый доступ к ресурсу — файлам, каналам и подобному — решается сопоставлением этого маркера с ACL.7 Значит, выбор учётной записи входа — проект, который решает содержимое маркера, передаваемого процессу службы. Вот шесть выборов.
flowchart TB
accTitle: Что делает SCM при запуске службы
accDescr: SCM входит как настроенная учётная запись, при успехе создаёт маркер доступа и назначает его процессу службы, и далее доступ к ресурсам решается сопоставлением маркера с ACL
scm["SCM"] --> logon["Войти как настроенная учётная запись"]
logon --> token["Создать маркер доступа"]
token --> proc["Назначить его процессу службы"]
proc --> access["Доступ к файлу или каналу"]
access --> check{"ACL разрешает?"}
check -->|Да| ok["Доступ успешен"]
check -->|Нет| deny["Доступ отказан"]
Рис. 2: Каждый доступ службы к ресурсу решается сопоставлением маркера, который SCM создал при запуске, с ACL.
| Учётная запись | Локальные права | Сетевая идентичность | Ведение пароля | Типичное применение |
|---|---|---|---|---|
| LocalSystem | Почти без ограничений (SYSTEM+Administrators) | Учётная запись компьютера (PC$) | Не нужно (пароля нет) | Исключительные службы, которые работают как одно целое с ОС |
| LocalService | Минимальные (класс Users) | Анонимная | Не нужно | Локальная обработка без сетевой идентичности |
| NetworkService | Минимальные (класс Users) | Учётная запись компьютера (PC$) | Не нужно | Обработка с малыми правами, где хватает идентичности машины |
| Виртуальная NT SERVICE\<имя>имя> | Минимальные + выдача по отдельности в ACL | Учётная запись компьютера (PC$) | Не нужно (ведётся автоматически) | Значение по умолчанию для деловой службы на одном сервере |
| Доменный пользователь | Только то, что выдали | Сам этот пользователь | Вручную (истечение, утечка и смена остаются на людях) | Последнее средство для приложения, которое не поддерживает gMSA |
| gMSA | Только то, что выдали | Сама эта gMSA | AD порождает и чередует автоматически | Когда доменной среде нужна идентичность конкретной службы |
У LocalSystem, LocalService, NetworkService и виртуальной учётной записи вообще нет понятия пароля. Единственные, кто входит с паролем, сохранённым в SCM (= возможны истечение и утечка), — доменный пользователь и локальный пользователь.73
Ниже разбираем эту таблицу по строкам.
3. В чём беда LocalSystem
3.1. Ещё сильнее, чем «Запуск от имени администратора»
LocalSystem (отображаемое имя Local System, NT AUTHORITY\SYSTEM) — предопределённая учётная запись, которую использует SCM, и она держит обширные права на локальном компьютере. В токен входят SID NT AUTHORITY\SYSTEM и BUILTIN\Administrators, и она может обращаться к большинству объектов системы. Далее SeDebugPrivilege, которая может отлаживать другие процессы, и SeTcbPrivilege, которая действует как часть ОС, включены по умолчанию.3
Эта сила синонимична размеру ущерба при захвате. Если у службы, запущенной от LocalSystem, есть одна уязвимость произвольного выполнения кода, злоумышленник одним дыханием доходит до чтения и порчи файлов каждого пользователя на этой машине (у SYSTEM по умолчанию полный контроль на NTFS5), чтения памяти других процессов через SeDebugPrivilege и кражи учётных данных и бокового перемещения оттуда (отправная точка для Pass-the-Hash и подобного). Цепочка кражи учётных данных и бокового перемещения разобрана в «NTLM and Kerberos Explained with Diagrams» и «A Practical Guide to Windows LAPS».
flowchart TB
accTitle: Ущерб при захвате службы LocalSystem
accDescr: Если у службы, запущенной от LocalSystem, есть одна уязвимость произвольного выполнения кода, злоумышленник доходит до чтения и порчи файлов каждого пользователя, чтения памяти других процессов и кражи учётных данных с боковым перемещением
vuln["Одна уязвимость произвольного выполнения кода"] --> sys["Злоумышленник получает права SYSTEM"]
sys --> files["Чтение и порча файлов"]
sys --> mem["Чтение памяти других процессов"]
sys --> cred["Кража учётных данных"]
cred --> lateral["Боковое перемещение на другую машину"]
Рис. 3: Одна уязвимость в службе LocalSystem позволяет злоумышленнику одним дыханием дойти до захвата всей машины и отправной точки бокового перемещения.
3.2. Почему её всё ещё выбирают
Причина проста: это значение по умолчанию, и отказ в доступе никогда не появляется. Значение по умолчанию, если опустить obj= в sc.exe create, — LocalSystem,4 и многие старые образцы кода и шаблоны установщиков всё ещё предполагают LocalSystem. Потому что в разработке можно оставаться свободным от ошибок прав, есть структура, которая массово производит «заработало — оставим». Собственная документация Microsoft также утверждает, что большинству служб не нужен столь высокий уровень прав и что если он не нужен, следует рассмотреть LocalService или NetworkService.3
flowchart TB
accTitle: Структура, из-за которой LocalSystem продолжают выбирать
accDescr: Значение по умолчанию sc.exe create — LocalSystem, и старые образцы и шаблоны тоже предполагают LocalSystem, поэтому в разработке отказ в доступе не появляется и массово производится конфигурация заработало поэтому оставим
def["Значение по умолчанию sc.exe create"] --> lsys["Создана как LocalSystem"]
old["Старые образцы и шаблоны"] --> lsys
lsys --> noerr["Нет отказа в доступе в разработке"]
noerr --> asis["Заработало, поэтому оставим"]
asis --> mass["Службы с избыточными правами производятся массово"]
Рис. 4: Значение по умолчанию и опыт разработки «без отказа в доступе» массово производят службы, замороженные как LocalSystem.
3.3. Отличие от TrustedInstaller — LocalSystem тоже не безгранична
Называть LocalSystem «самой сильной учётной записью Windows» неточно. Защита ресурсов Windows (WRP) начиная с Windows Vista разрешает изменения важных системных файлов, папок и ключей реестра только TrustedInstaller (службе установщика модулей Windows), и даже SYSTEM или администратор получают отказ в доступе при перезаписи.12 «Вам нужно разрешение от TrustedInstaller» в Проводнике — этот механизм. Наоборот, LocalSystem может достичь почти всего вне области, защищённой WRP, и обычно нет причин давать это деловой службе.
flowchart TB
accTitle: Связь области, защищённой WRP, и TrustedInstaller
accDescr: Изменения важных системных файлов и ключей реестра, которые защищает WRP, разрешены только TrustedInstaller, и даже SYSTEM или администратор получают отказ в доступе
ti["TrustedInstaller"] -->|Может менять| wrp["Системные файлы, защищённые WRP, и подобное"]
sysadm["SYSTEM и администраторы"] -->|Отказ в доступе| wrp
sysadm -->|Почти всё разрешено| other["Вне области, защищённой WRP"]
Рис. 5: LocalSystem тоже не безгранична; изменения области, защищённой WRP, разрешены только TrustedInstaller.
3.4. Случаи, когда LocalSystem разумна
Исключительно разумно — служба, чьи нужные права изначально превышают класс администратора — тесная работа с драйвером устройства, управление фундаментом безопасности ОС, управление другими службами или сеансами и подобное. Подходит ПО вроде агента резервного копирования или EDR. Даже тогда стоит подтвердить, что есть путь кода, который действительно использует это право, и рассмотреть, можно ли отделить работу, которой нужно право (как отличить — см. «Когда на Windows действительно требуются права администратора»).
4. LocalService и NetworkService — встроенные учётные записи с наименьшими правами
LocalService (NT AUTHORITY\LOCAL SERVICE, SID: S-1-5-19) и NetworkService (NT AUTHORITY\NETWORK SERVICE, SID: S-1-5-20) — встроенные учётные записи, подготовленные для служб с малыми правами. Обе держат локально только минимальные права и могут мало больше члена группы Users.51
Разница между ними в одном: кем они выглядят с той стороны сети.5
- LocalService: подключается к удалённой стороне с анонимными учётными данными. Не может обратиться к ресурсу, требующему проверки подлинности.
- NetworkService: предъявляет удалённой стороне учётные данные компьютера (в доменной среде DOMAIN\имя-компьютера$).
Разделение: LocalService, если «в сеть не выходит или, если выходит, идентичность не нужна», и NetworkService, если «хотите обратиться к ресурсу внутри домена с идентичностью машины».
flowchart TB
accTitle: Разница между LocalService и NetworkService
accDescr: Локальные права у обеих минимальны, но к удалённой стороне LocalService подключается с анонимными учётными данными, а NetworkService предъявляет учётные данные компьютера
ls["LocalService"] --> anon["Подключается с анонимными учётными данными"]
anon -.-> ng["Ресурс, требующий проверки подлинности, невозможен"]
ns["NetworkService"] --> comp["Предъявляет учётные данные компьютера"]
comp -.-> pc["В домене выглядит как PC$"]
Рис. 6: Локальные права — тот же минимум, но идентичность, видимая с той стороны сети, делится на анонимную или учётную запись компьютера.
Однако у этих двух есть слабость с современной точки зрения. Одну и ту же учётную запись разделяют многие службы. Если пять служб работают от LocalService, то пока ACL по учётной записи, пять могут обращаться к ресурсам друг друга. SQL Server не поддерживает учётную запись Local Service по той же причине: это общая учётная запись, и её нельзя отделить от других служб.1
flowchart TB
accTitle: Общую учётную запись нельзя разделить
accDescr: Если несколько служб разделяют одну LocalService, то пока ACL по учётной записи они могут обращаться к ресурсам друг друга
sva["Служба A"] --> acct["Та же LocalService"]
svb["Служба B"] --> acct
svc["Служба C"] --> acct
acct --> mutual["Могут обращаться к ресурсам друг друга"]
mutual -.-> reason["Потому что ACL по учётной записи"]
Рис. 7: Службы, которые разделяют одну учётную запись, нельзя отделить ACL от ресурсов друг друга.
Решить это «остаться с малыми правами, но разделить по службам» — следующая тема, виртуальная учётная запись.
5. Виртуальные учётные записи (NT SERVICE\<имя-службы>) — современное значение по умолчаниюимя-службы>
5.1. Можно иметь идентичность на службу без пароля
Виртуальная учётная запись — «управляемая локальная учётная запись», доступная с Windows Server 2008 R2 / Windows 7. У неё три свойства.6
- Учётная запись ведётся автоматически; ни создание, ни задание пароля не нужны
- Имя —
NT SERVICE\<имя-службы>, и она становится идентичностью, уникальной для каждой службы - В доменной среде она может выходить в сеть с учётными данными учётной записи компьютера (DOMAIN\имя-компьютера$)
Иначе говоря, она сохраняет достоинство «нет ведения пароля» у LocalService/NetworkService и снимает недостаток «нельзя разделить, потому что учётная запись общая». Поэтому установка SQL Server по умолчанию использует виртуальную учётную запись вроде NT SERVICE\MSSQLSERVER.1
flowchart TB
accTitle: Что виртуальная учётная запись делает совместимым
accDescr: Виртуальная учётная запись сохраняет достоинство отсутствия ведения пароля у LocalService и NetworkService, снимает недостаток нельзя разделить потому что общая и имеет идентичность, уникальную для каждой службы
merit["Достоинство (нет ведения пароля)"] -->|Сохранить| va["Виртуальная учётная запись"]
demerit["Недостаток (нельзя разделить потому что общая)"] -->|Снять| va
va --> ident["Идентичность, уникальная для каждой службы"]
va --> auto["Ни создание, ни пароль не нужны"]
Рис. 8: Виртуальная учётная запись сохраняет достоинства встроенных и снимает только недостаток нельзя разделить потому что общая.
5.2. «NT SERVICE\имя-службы» можно писать прямо в ACL
Практическое удобство в том, что в ACL можно добавить только эту службу по имени. «Только эта служба может писать в эту папку данных» реализуется без создания группы и без ведения пароля.
# Change the service's logon account to a virtual account
# The value of obj= is "NT SERVICE\service-name". Do not specify a password
sc.exe config MyAppService obj= "NT SERVICE\MyAppService"
# Confirm the configuration (check SERVICE_START_NAME)
sc.exe qc MyAppService
# Grant modify rights on the data folder to this service only
icacls "C:\ProgramData\MyApp" /grant "NT SERVICE\MyAppService:(OI)(CI)M"
В графическом интерфейсе в services.msc откройте свойства службы → вкладка «Вход» → введите NT SERVICE\имя-службы в «С учётной записью» и оставьте поля пароля пустыми (для виртуальной учётной записи или MSA не указывать пароль — спецификация SCM). После смены перезапуск службы применяет её.
5.3. Ограничение — вне машины это не «та служба»
Идентичность виртуальной учётной записи локальна для машины и не распознаётся доменом. В сети она сжимается до учётной записи компьютера, как описано далее, поэтому удалённая сторона не может сказать, «какая это служба», и ту же идентичность нельзя разделить между несколькими серверами.10
flowchart TB
accTitle: Идентичность виртуальной учётной записи сжимается вне машины
accDescr: Виртуальная учётная запись, уникальная для каждой службы внутри машины, в сети тоже сжимается до учётной записи компьютера, и удалённая сторона не может сказать, какая это служба
vaa["Виртуальная учётная запись A"] --> pc["Учётная запись компьютера PC$"]
vab["Виртуальная учётная запись B"] --> pc
pc --> remote["Идентичность, видимая удалённой стороне"]
remote -.-> nodist["Нельзя сказать, какая это служба"]
Рис. 9: Даже с уникальной идентичностью внутри машины, с той стороны сети каждая служба выглядит как один и тот же PC$.
Момент, когда это ограничение — нужна идентичность конкретной службы с той стороны сети, нужна одна и та же идентичность на нескольких серверах — становится проблемой, и есть момент, когда вызывают gMSA (глава 8).
6. Идентичность при выходе в сеть — практика учётной записи компьютера (PC$)
6.1. «Служба не может обратиться к общей папке» — недоразумение
На машине, присоединённой к домену, когда служба, запущенная как LocalSystem, NetworkService или виртуальная учётная запись, обращается к удалённому ресурсу, она проходит проверку подлинности как учётная запись компьютера (DOMAIN\имя-компьютера$).36 Многие консультации в начале «не могла обратиться к общей папке, поэтому сделали доменным пользователем» на деле решаются этим. ACL назначения просто не разрешала PC$.
flowchart TB
accTitle: Удалённый доступ как учётная запись компьютера
accDescr: Служба LocalSystem, NetworkService или виртуальная на машине, присоединённой к домену, проходит проверку подлинности на удалённой стороне как учётная запись компьютера, и если ACL назначения разрешает PC$, она может обратиться
svc["Служба (LocalSystem, виртуальная учётная запись и подобное)"] --> auth["Пройти проверку как PC$"]
auth --> acl{"ACL назначения разрешает PC$?"}
acl -->|Да| ok["Доступ к общей папке или БД успешен"]
acl -->|Нет| ng["Доступ отказан"]
Рис. 10: В доменной среде одной выдачи PC$ в ACL назначения достаточно, чтобы установить удалённый доступ без доменного пользователя.
Выдача на стороне файлового сервера та же, что обычная операция ACL; укажите имя-компьютера$ как имя учётной записи (в диалоге выбора объектов графического интерфейса включите «Компьютеры» в типы объектов).
# On the file-server side: grant a service on APPSV01 modify rights on the shared folder
# You need to grant both share permissions and NTFS permissions
Grant-SmbShareAccess -Name "AppData" -AccountName "CORP\APPSV01$" -AccessRight Change -Force
icacls "D:\Shares\AppData" /grant "CORP\APPSV01$:(OI)(CI)M"
С SQL Server то же: создайте учётную запись компьютера как имя входа, и строка подключения проходит с Integrated Security=true без пароля.
-- On the DB-server side: permit Windows integrated authentication from a service on APPSV01
CREATE LOGIN [CORP\APPSV01$] FROM WINDOWS;
6.2. Знайте пределы подхода PC$
У этого подхода два предела.
- Зернистость — на машину. LocalSystem, NetworkService и каждая служба с виртуальной учётной записью на одной машине с удалённой стороны выглядят как один и тот же PC$. На назначении нельзя «разрешить только этой службе», и нельзя проверить, какая служба использовала эту учётную запись.2
- Его нельзя использовать в рабочей группе. Учётная запись компьютера — объект Active Directory, поэтому у машины, не присоединённой к домену, её нет. Нужно проектирование, которое явно обрабатывает учётные данные учётной записи назначения.
Когда хотите выйти за предел 1, ответ 2026 года — не доменный пользователь следующей главы… а пропустить эту проблему и перейти к gMSA.
flowchart TB
accTitle: Два предела подхода PC$
accDescr: Проверка подлинности как PC$ имеет зернистость уровня машины, поэтому ни разрешение, ни проверка по службам невозможны, а в рабочей группе самой учётной записи компьютера нет, поэтому использовать нельзя
pcs["Подход PC$"] --> lim1["Предел 1: на машину"]
pcs --> lim2["Предел 2: нет рабочей группы"]
lim1 -.-> noaudit["Ни разрешения, ни проверки по службам"]
lim2 -.-> nocred["Использовать явные учётные данные"]
lim1 --> gmsa["Дальше: gMSA"]
Рис. 11: Когда хотите выйти за два предела зернистости уровня машины и предпосылки домена, пропустите доменного пользователя и перейдите к gMSA.
7. Проблема использования доменного пользователя для службы
7.1. Структурная проблема пароля
Если назначить службе доменного пользователя (или локального), SCM сохраняет этот пароль и использует его для входа при каждом запуске. SCM не ведёт истечение, поэтому когда пароль истекает, вход не удаётся и служба не запускается.7
Оттуда начинается отрицательная спираль, которую часто видят на местах.
- Происходит авария остановки службы из-за истечения
- Как предотвращение повтора задают «пароль никогда не истекает»
- Процедура смены так и не устанавливается, и тот же пароль пишут открытым текстом в регламенты, сценарии и планировщик заданий нескольких серверов
- Даже когда кто-то уходит, пароль не меняют (если смените — не знаете, что остановится)
flowchart TB
accTitle: Отрицательная спираль эксплуатации с доменным пользователем
accDescr: Пароль истекает и служба останавливается, «никогда не истекает» задают как предотвращение повтора, открытый пароль распространяется по регламентам и сценариям, и даже когда кто-то уходит, его нельзя сменить
expire["1. Истечение останавливает службу"] --> forever["2. «Никогда не истекает» задают как предотвращение"]
forever --> spread["3. Открытый пароль распространяется"]
spread -.-> where["Регламенты, сценарии, задания"]
spread --> stuck["4. Даже когда кто-то уходит, сменить нельзя"]
Рис. 12: Начиная с аварии истечения, «никогда не истекает» и распространение открытого пароля закрепляются.
Microsoft также указывает, что конфигурация, использующая доменную учётную запись для службы, стоит немалых эксплуатационных усилий в ручном ведении пароля и SPN, и что обслуживание может привести к остановке службы.1
7.2. Kerberoasting — учётная запись службы становится целью
Ещё одна атака, специфичная для учётной записи службы доменного пользователя, — Kerberoasting. Служба, принимающая проверку подлинности Kerberos, регистрирует SPN (имя субъекта-службы) на учётной записи входа. Любой прошедший проверку пользователь домена может запросить билет службы к учётной записи с зарегистрированным SPN, поэтому злоумышленник получает билет и пробует автономный перебор пароля. Пароль из 10–16 символов, который решил человек, этой атаке не выдержит.
flowchart TB
accTitle: Поток Kerberoasting
accDescr: Билет службы к учётной записи службы с зарегистрированным SPN может запросить любой прошедший проверку пользователь, поэтому злоумышленник получает билет и пробует автономный перебор пароля
atk["Прошедший проверку пользователь домена"] --> req["Запросить билет для SPN"]
req --> tkt["Получить билет службы"]
tkt --> brute["Автономный перебор"]
brute --> weak["Примерно 10–16 символов будут взломаны"]
Рис. 13: Любой прошедший проверку пользователь может запросить билет, и пароль длины, которую решил человек, не выдержит автономный перебор.
Действенный ответ — сделать пароль такой силы, которую человек не угадает и не взломает. Microsoft также перечисляет принуждение к длинному паролю и использование gMSA, чей пароль становится длинным машинно порождённым случайным значением.8 Тот же документ упоминает и броню Kerberos (FAST), но FAST защищает данные предварительной проверки подлинности и устойчивость к подмене KDC; она не мешает прошедшему проверку пользователю запросить билет службы к SPN, поэтому это не замена силе пароля учётной записи службы. Связь SPN и Kerberos и условия, при которых проверка подлинности падает на NTLM, изображены в «NTLM and Kerberos Explained with Diagrams».
7.3. Если всё же используете доменного пользователя
Если выбора нет, кроме как использовать доменного пользователя, по причинам вроде того, что приложение не поддерживает gMSA, считайте следующее минимальным смягчением.
- Сделайте пароль случайно порождённым из 25 символов или больше и нигде кроме средства ведения паролей не пишите (регламенты, сценарии, общая книга Excel)
- Сделайте её учётной записью, выделенной службе, и разделите по службам (не делите с человеческой учётной записью2)
- Запретите интерактивный вход и удалённый рабочий стол и разрешите только «Вход в качестве службы»
- Сведите к минимуму группы, в которые она входит (добавлять в Domain Admins нечего и думать)
- Установите процедуру периодической смены и занесите места, которые затронет смена, в реестр
Сделать всё это менее безопасно и менее просто, чем перейти на gMSA — это следующая глава.
8. gMSA — оставить ведение пароля Active Directory
8.1. Механизм и эффект
gMSA (групповая управляемая учётная запись службы) — доменная учётная запись, которая оставляет ведение пароля контроллеру домена. Пароль вычисляет контроллер домена из корневого ключа KDS (Key Distribution Service), и только разрешённые узлы его получают.13
flowchart TB
accTitle: Как gMSA ведёт пароль
accDescr: Контроллер домена вычисляет пароль из корневого ключа KDS, только разрешённые узлы получают его и используют для запуска службы, и пароль по умолчанию автоматически чередуется каждые 30 дней
kds["Корневой ключ KDS"] --> dc["КД вычисляет пароль"]
dc --> host["Разрешённый узел получает его"]
host --> svc["Используется для запуска службы"]
dc -.-> rot["Автоматическая смена каждые 30 дней по умолчанию"]
Рис. 14: Контроллер домена берёт на себя порождение, раздачу и обновление пароля, и люди могут работать, не зная пароля.
Эффекты ясны.9
- Случайно порождённый пароль 240 байт: перебор и словарные атаки становятся нереалистичными, и устойчивость к Kerberoasting существенно растёт
- Автоматическая смена каждые 30 дней по умолчанию: человеку не нужно планировать смену, и службу не нужно останавливать
- Одну и ту же идентичность можно разделить между несколькими серверами: ферма серверов под балансировкой нагрузки может взаимно проходить проверку подлинности как один и тот же субъект
- Более простое ведение SPN: регистрацию и ведение SPN тоже можно делегировать и упростить
Люди могут работать, не зная пароля — если принять это как механизм, который для учётной записи службы делает то, что Windows LAPS делает для пароля локального администратора, размещение легче ухватить.
8.2. Требования
У gMSA есть предпосылки.10
- Доменная среда Active Directory (в рабочей группе невозможно)
- Функциональные уровни домена и леса Windows Server 2012 или выше
- Корневой ключ KDS уже создан
- Имя gMSA уникально в лесу, а не только в домене
- Интервал смены пароля можно задать только при создании
Создание корневого ключа KDS — разовая задача, но до 10 часов после создания gMSA создать нельзя, потому что ждут репликации на каждый контроллер домена. Это предохранитель, чтобы не случилась авария отказа извлечения пароля, пока репликация не закончилась.14
flowchart TB
accTitle: От создания корневого ключа KDS до создания gMSA
accDescr: После создания корневого ключа KDS ждут репликации на каждый контроллер домена, поэтому до 10 часов gMSA создать нельзя; после завершения репликации можно создать
add["Создать корневой ключ KDS"] --> wait["До 10 часов ожидания репликации"]
wait -.-> why["Предохранитель против аварии отказа извлечения"]
wait --> done["Репликация на каждый КД завершена"]
done --> ok["Можно создать gMSA"]
Рис. 15: Ожидание до 10 часов после создания корневого ключа — время ожидания, чтобы не допустить отказа извлечения, пока репликация не закончилась.
# Run as a domain administrator, on a domain controller (or an administrative
# workstation with the AD PowerShell module)
# Confirm whether a KDS root key exists, and create one if not (once per forest)
Get-KdsRootKey
Add-KdsRootKey -EffectiveImmediately # Actually usable after up to 10 hours
8.3. Процедура от создания до настройки
Процедура в четыре этапа: «① создать группу, которой разрешено извлекать → ② создать gMSA → ③ установить на серверы → ④ задать службе».10
flowchart TB
accTitle: Четыре этапа внедрения gMSA
accDescr: Внедрить в четыре этапа: создать группу, которой разрешено извлекать пароль, создать gMSA, установить на каждый сервер и задать как учётную запись входа службы
st1["① Создать группу, которой разрешено извлекать"] --> st2["② Создать gMSA"]
st1 -.-> add["Добавить PC$ серверов"]
st2 --> st3["③ Установить на каждый сервер"]
st3 -.-> test["Проверить извлечение командой Test"]
st3 --> st4["④ Задать службе"]
Рис. 16: От создания группы до задания службе внедрение gMSA идёт в четыре этапа.
# ① Create a security group permitted to retrieve the password,
# and add the computer accounts of the servers that will run the service
New-ADGroup -Name "GG-SvcBatchHosts" -GroupScope Global
Add-ADGroupMember -Identity "GG-SvcBatchHosts" -Members "APPSV01$", "APPSV02$"
# Group membership is evaluated at computer logon, so
# restarting the target servers after adding is the reliable approach
# ② Create the gMSA
New-ADServiceAccount -Name "svc-batch" `
-DNSHostName "svc-batch.corp.example.com" `
-PrincipalsAllowedToRetrieveManagedPassword "GG-SvcBatchHosts"
# ③ On each server that will run the service, install the gMSA and validate
Install-ADServiceAccount -Identity "svc-batch"
Test-ADServiceAccount -Identity "svc-batch" # True means retrieval is working
# ④ Set it as the service's logon account. Append $ to the name, and do not specify a password
sc.exe config MyBatchService obj= "CORP\svc-batch$"
Restart-Service MyBatchService
При задании из services.msc имя учётной записи тоже вроде CORP\svc-batch$ — добавьте $ в конце и оставьте поля пароля пустыми. Учётную запись семейства MSA нельзя использовать для интерактивного входа.1 Затем выдайте CORP\svc-batch$ в ACL общей папки или SQL Server вместо PC$, и сетевой доступ с идентичностью конкретной службы готов, без пароля.
8.4. Некоторые приложения этого не поддерживают
Как оговорка: не каждое ПО будет работать как gMSA. То, что настраивает идентичность входа через стандартный механизм — служба Windows, пул приложений IIS, задание планировщика — широко поддерживается, но есть ограничения: сам отказоустойчивый кластер gMSA не поддерживает, а приложение, внутри которого требуют пароль, использовать его не может.10 Microsoft также прямо говорит, что поведение как gMSA нужно подтвердить в тестовой среде до промышленной.9
flowchart TB
accTitle: Как отличить, поддерживает ли что-то gMSA
accDescr: Приложение, которое настраивает идентичность входа через стандартный механизм, широко поддерживает gMSA, но отказоустойчивый кластер и приложение, внутри которого требуют пароль, использовать её не могут, поэтому подтвердите в тестовой среде до промышленной
app["Целевое приложение"] --> how{"Как задаётся вход?"}
how -->|Стандартный механизм| okapp["gMSA поддерживается"]
okapp -.-> ex1["Служба, IIS, задание"]
how -->|Требуют пароль| ngapp["gMSA невозможна"]
ngapp -.-> ex2["Отказоустойчивый кластер"]
okapp --> test["Проверить до промышленной"]
Рис. 17: Приложение, которое настраивает вход через стандартный механизм, широко поддерживается, но некоторые проекты не поддерживаются, поэтому проверка до промышленной незаменима.
Есть и родственники: sMSA (автономная управляемая учётная запись службы) для одного сервера и dMSA (делегированная управляемая учётная запись службы, введённая в Windows Server 2025, которая привязывается к идентичности устройства, чтобы противостоять краже учётных данных). Для новой постройки берите gMSA как базовую линию и рассматривайте по требованиям.6
9. Сопутствующее проектирование — права входа, профиль, DPAPI и аудит
Ещё четыре вещи, которые меняются вместе с учётной записью, чтобы держать.
9.1. Право «Вход в качестве службы» (SeServiceLogonRight)
Чтобы запуститься как служба, учётной записи нужно право пользователя «Вход в качестве службы». У LocalSystem, LocalService и NetworkService оно встроено, но любой другой учётной записи (доменному пользователю, gMSA и подобному) нужно явное назначение.15
Если задаёте со вкладки «Вход» графического интерфейса services.msc, оснастка выдаёт это право автоматически. С другой стороны, CreateService / ChangeServiceConfig (API, которые вызывает sc.exe config) не проверяют, есть ли у указанной учётной записи это право. Типичная причина, по которой служба, настроенная сценарием, останавливается при запуске с «служба не запущена из-за ошибки входа», — именно это. Не полагайтесь на побочный эффект средства; явно включите в процедуру развёртывания добавление в «Вход в качестве службы» в локальной политике безопасности (secpol.msc) или настройку через GPO/Intune (в среде, которая настраивает это право групповой политикой, локальная выдача перезаписывается при применении политики, поэтому на это тоже нужно внимание). Наоборот, стандартный ход для учётной записи, выделенной службе, — задать вместе «Запретить локальный вход».
flowchart TB
accTitle: Разница по пути настройки права Вход в качестве службы
accDescr: Графический интерфейс services.msc выдаёт право автоматически, но API, которую вызывает sc.exe config, право не проверяет, поэтому учётная запись без права останавливает службу с ошибкой входа при запуске
gui["Задать в services.msc"] --> auto["Право выдаётся автоматически"]
auto --> okgui["Служба может запуститься"]
cli["Задать через sc.exe config"] --> noval["Право не проверяется"]
noval --> has{"Есть право?"}
has -->|Да| okcli["Служба может запуститься"]
has -->|Нет| stop["Останавливается с ошибкой входа"]
stop -.-> fix["Выдать явно через secpol.msc или GPO"]
Рис. 18: Графический интерфейс выдаёт право автоматически, но настройка сценарием его не проверяет, поэтому в процедуру нужно включить явную выдачу.
9.2. Профиль, %TEMP% и HKEY_CURRENT_USER меняются
SCM загружает профиль пользователя этой учётной записи при запуске службы.7 Поэтому настоящие %TEMP%, %APPDATA% и HKEY_CURRENT_USER — разное на каждую учётную запись входа, и при смене учётной записи настройки и кэш, сохранённые в профиле старой, выглядят так, будто «пропали».
Ответ проектирования прост: кладите данные службы не под профилем, а на явный путь вроде C:\ProgramData\<имя-приложения> и выдайте этот ACL учётной записи входа. Тогда смена учётной записи не несёт переноса данных.
flowchart TB
accTitle: Зависимость от профиля и ответ размещения данных
accDescr: Настоящий профиль разный на каждую учётную запись входа, поэтому смена учётной записи делает данные старого профиля похожими на пропавшие, но размещение на явном пути и выдача ACL делают перенос ненужным
sw["Смена учётной записи входа"] --> newprof["Загружается другой профиль"]
newprof --> lost["Старые данные выглядят пропавшими"]
lost -.->|Ответ| fix["Положить под ProgramData"]
fix --> acl["Выдать ACL учётной записи входа"]
acl --> nomig["Нет переноса даже при смене учётной записи"]
Рис. 19: Избегайте профиля и кладите данные на явный путь — и смена учётной записи больше не несёт переноса данных.
9.3. Данные, защищённые DPAPI, привязаны к учётной записи
Ещё легче пропустить — DPAPI. Данные, зашифрованные DPAPI пользовательского охвата (CryptProtectData или ProtectedData в .NET), в принципе может расшифровать только та же учётная запись, которая их защитила. В момент смены учётной записи сохранённую строку подключения или ключ API уже нельзя прочитать — это DPAPI делает свою работу правильно, но если этого нет в процедуре переноса, это становится инцидентом.
flowchart TB
accTitle: Связь данных, защищённых DPAPI, и смены учётной записи
accDescr: Данные, защищённые DPAPI пользовательского охвата, может расшифровать только та же учётная запись, которая их защитила, поэтому после смены учётной записи входа нужно заново ввести секреты
protect["Защитить DPAPI старой учётной записью"] --> data["Защищённая строка подключения и подобное"]
data --> who{"Какая учётная запись расшифровывает?"}
who -->|Та же старая| okdec["Может расшифровать"]
who -->|Новая| ngdec["Не может расшифровать"]
ngdec --> re["Заново ввести секреты"]
Рис. 20: Данные, защищённые DPAPI, привязаны к учётной записи, которая их защитила, и после смены учётной записи нужно вводить заново.
Ответ — включить в план переноса процедуру «заново ввести секреты после смены учётной записи» (о проектировании, куда их класть, см. «Хранение секретов в Windows-приложениях»). Также конфигурация, которая может закончиться встроенной проверкой подлинности Windows как gMSA или PC$, может устранить само хранение секрета. Правильный порядок — сначала рассмотреть «можно ли обойтись без хранения», а потом «куда хранить».
А если служба хочет обрабатывать «с правами вызывающего пользователя», используют олицетворение, а не делают учётную запись сильнее. Об этом — «Как правильно работать с токенами олицетворения в Windows».
9.4. Аудит — смотрите 4624 тип входа 5
Запуск службы записывается в журнал событий безопасности как событие с кодом 4624 (Учётная запись успешно вошла в систему) с типом входа 5 (Служба: SCM запустила службу). Поле «Virtual Account» в событии показывает, был ли вход от MSA / виртуальной учётной записи, поэтому его можно использовать и для наблюдения за использованием управляемых учётных записей.11
flowchart TB
accTitle: Поток аудита запуска службы
accDescr: Запуск службы SCM записывается как событие с кодом 4624 тип входа 5, и поле Virtual Account может определить, был ли вход от управляемой учётной записи
start["SCM запускает службу"] --> ev["Записать событие с кодом 4624"]
ev --> type5["Тип входа 5 (Служба)"]
type5 --> vafield["Поле Virtual Account"]
vafield --> watch["Наблюдение за управляемыми учётными записями"]
Рис. 21: Запуск службы записывается как 4624 типа входа 5, и можно даже отслеживать использование управляемых учётных записей.
Для инвентаризации текущего состояния быстрый способ — агрегировать учётные записи входа списка служб.
# Aggregate which services are running as which account
Get-CimInstance Win32_Service |
Group-Object StartName |
Sort-Object Count -Descending |
Select-Object Count, Name
# Inventory non-standard services running as LocalSystem (tell in-house / third-party by the path)
Get-CimInstance Win32_Service |
Where-Object { $_.StartName -eq 'LocalSystem' -and $_.PathName -notlike '*\Windows\*' } |
Select-Object Name, DisplayName, PathName
Если в этом выводе выстроились «деловая служба, запущенная от LocalSystem» и «служба, запущенная от доменного пользователя», вызывается поток решений следующей главы.
10. Поток решений — решить четырьмя вопросами
Вот содержание до сих пор как процедура выбора. Ответьте на четыре вопроса по порядку.
flowchart TB
accTitle: Поток решений для учётной записи входа
accDescr: Решить учётную запись входа, отвечая по порядку на четыре вопроса о сетевом доступе, присоединении к домену, достаточности идентичности уровня машины и поддержке gMSA
q1{"Проверка Windows к узлу?"} -->|Нет| va["Виртуальная учётная запись"]
va -.-> sys["LocalSystem если нужно"]
q1 -->|Да| q2{"Присоединена к домену?"}
q2 -->|Нет| cred["Защитить сохранённые учётные данные"]
q2 -->|Да| q3{"Уровня машины хватает?"}
q3 -->|Да| pcacl["Виртуальная + PC$"]
q3 -->|Нет| q4{"Приложение поддерживает gMSA?"}
q4 -->|Да| gmsa["gMSA"]
q4 -->|Нет| du["Пользователь + смягчения"]
Рис. 22: Ответьте на четыре вопроса по порядку — и какой из шести выборов использовать, решено.
Вопрос 1: Обращается ли эта служба к другой машине в сети (общей папке, БД, API и подобному) с проверкой подлинности Windows?
Если нет, виртуальная учётная запись — значение по умолчанию. Только если нужно особое локальное право, подтвердите эту нужду и затем рассмотрите LocalSystem.
Вопрос 2: (Если обращается) Машина присоединена к домену?
В рабочей группе нельзя использовать ни PC$, ни gMSA. Используйте проектирование, которое явно обрабатывает учётные данные учётной записи назначения (защитите хранилище DPAPI или подобным), или рассмотрите присоединение к домену.
Вопрос 3: (В домене) Хватает ли идентичности уровня машины (PC$)?
Если да, виртуальная учётная запись (или NetworkService) + выдача PC$ в ACL назначения готова. Если нужна идентичность конкретной службы или общая идентичность на нескольких серверах, переходите к вопросу 4.
Вопрос 4: Поддерживает ли приложение gMSA?
Если да (то, что настраивает вход через стандартный механизм — SCM, пул приложений IIS, планировщик заданий — как правило, да), gMSA. Не забудьте проверку поведения в проверочной среде. Если не поддерживается ни при чём, используйте выделенного доменного пользователя после применения каждого смягчения раздела 7.3.
В таблице это так.
| Ситуация | Рекомендация | Примечания |
|---|---|---|
| Только локально, обычные права | Виртуальная учётная запись | Выдать ACL NT SERVICE\<имя> |
| Только локально, нужно право сверх администратора | LocalSystem | Сначала проверить нужду в праве |
| Локальная обработка без сетевой идентичности | LocalService | Приемлемо, чтобы оставить существующую службу как есть |
| Обратиться к ресурсу внутри домена с идентичностью машины | Виртуальная (или NetworkService) | Выдать PC$ в ACL назначения |
| Обратиться к ресурсу внутри домена с идентичностью конкретной службы | gMSA | Корневой ключ KDS + подтвердить поддержку |
| Одна и та же идентичность на нескольких серверах (балансировка и подобное) | gMSA | С виртуальной учётной записью невозможно |
| Приложение не поддерживает gMSA + нужна конкретная идентичность | Выделенный доменный пользователь | Нужны смягчения раздела 7.3 |
| Рабочая группа + нужен удалённый доступ | Защитить и хранить явные учётные данные | Также рассмотреть пересмотр проекта |
11. Итог
- Учётная запись входа службы — проектное решение, которое одновременно решает локальные права, сетевую идентичность и ведение пароля. Не оставляйте её по умолчанию (LocalSystem).
- LocalSystem держит маркер SYSTEM+Administrators и сильные права, и ущерб при захвате максимален. Большинству деловых служб это право не нужно.
- LocalService и NetworkService обе с малыми правами; разница — сетевая идентичность (анонимная или учётная запись компьютера). Однако учётную запись разделяют несколько служб, поэтому их нельзя разделить.
- Виртуальная учётная запись (NT SERVICE\<имя-службы>) — современное значение по умолчанию, которое может разделить по службам, не требуя ведения пароля. Её можно указать прямо в ACL, и настройка — только смена имени учётной записи входа.имя-службы>
- LocalSystem, NetworkService и виртуальная учётная запись выходят в сеть как DOMAIN\PC$ в доменной среде. Выдача PC$ в ACL общей папки или SQL Server часто позволяет обойтись без доменного пользователя.
- Использование доменного пользователя для службы имеет структурные проблемы остановки из-за истечения, распространения открытого пароля и Kerberoasting. Если используете, нужны выделенная учётная запись + длинный случайный пароль + ограничения входа.
- gMSA — механизм, в котором AD автоматически порождает и чередует пароль; требования — домен, функциональный уровень 2012 или выше и корневой ключ KDS. Задайте службе «DOMAIN\имя$» с пустым полем пароля.
- При смене учётной записи включите право «Вход в качестве службы», перенос профиля и %TEMP% и повторный ввод данных, защищённых DPAPI, в процедуру переноса. Аудит можно подтвердить событием с кодом 4624 тип входа 5.
В следующий раз, когда устанавливаете службу, на мгновение остановитесь на экране настроек входа и снова задайте это. От чьего имени и до какой степени эта служба должна иметь доступ? Ответ должен быть какой-то строкой таблицы решений этой статьи.
Похожие статьи
- Как создавать и эксплуатировать службы Windows — от выбора между планировщиком заданий и службами до превращения BackgroundService в службу Windows
- Когда на Windows действительно требуются права администратора — UAC, защищённые области и как это определить на этапе проектирования
- Как правильно работать с токенами олицетворения в Windows — заимствование прав на уровне потока и безопасный откат
- NTLM and Kerberos Explained with Diagrams — Why Authentication Falls Back to NTLM
- A Practical Guide to Windows LAPS — Retiring the Shared Local Administrator Password Across All PCs
- Хранение секретов в Windows-приложениях - избегаем открытых настроек с помощью DPAPI
Смежные области консультирования
KomuraSoft LLC занимается проектированием учётной записи входа и ужесточением до наименьших прав для служб Windows и резидентных приложений, переносом существующих служб, построенных в предположении LocalSystem, на виртуальную учётную запись или gMSA, и расследованием отказов из-за отказа в доступе, DPAPI и профиля после смены учётной записи. Начать со стадии «нас отметили на аудите, но мы не знаем, с чего начать» вполне нормально.
- Разработка приложений для Windows
- Расследование ошибок и причин
- Технические консультации и ревью дизайна
- Связаться с нами
Справочные ссылки
-
Microsoft Learn, Configure Windows service accounts and permissions. О том, что учётная запись службы SQL Server по умолчанию — виртуальная (NT SERVICE\MSSQLSERVER и подобное), что при указании виртуальной или MSA поле пароля оставляют пустым, что MSA — имя с завершающим $ и её нельзя использовать для интерактивного входа, что Local Service — общая учётная запись, поэтому её нельзя отделить и SQL Server её не поддерживает, что использование доменной учётной записи стоит усилий в ручном ведении пароля и SPN и обслуживание может привести к остановке службы, и что службу всегда следует запускать от учётной записи с наименьшими правами. ↩ ↩2 ↩3 ↩4 ↩5 ↩6
-
Microsoft Learn, Securing on-premises service accounts. Приоритет сначала gMSA для локальной службы, затем sMSA если её нельзя использовать, затем учётная запись компьютера и наконец учётная запись пользователя; что при использовании учётной записи компьютера нельзя сказать, какая служба её использует, и нельзя проверить смену; и роли учётной записи службы (опознать, пройти проверку подлинности и запустить службу). ↩ ↩2 ↩3
-
Microsoft Learn, LocalSystem Account. О том, что LocalSystem держит обширные права на локальном компьютере и токен включает SID NT AUTHORITY\SYSTEM и BUILTIN\Administrators, что у неё нет пароля, что она предъявляет учётные данные компьютера удалённому серверу, список прав включая SE_DEBUG_NAME и SE_TCB_NAME, и что большинству служб этот уровень прав не нужен и следует рассмотреть LocalService/NetworkService. ↩ ↩2 ↩3 ↩4 ↩5 ↩6
-
Microsoft Learn, sc.exe config. О том, что учётную запись входа службы указывают параметром obj=, что значение по умолчанию — LocalSystem, и параметр password= при использовании учётной записи пользователя, отличной от LocalSystem. ↩ ↩2
-
Microsoft Learn, Local accounts. О том, что у SYSTEM (S-1-5-18) по умолчанию полный контроль на томе NTFS, что NETWORK SERVICE (S-1-5-20) предъявляет учётные данные компьютера удалённому серверу, и что LOCAL SERVICE (S-1-5-19) держит локально минимальные права и предъявляет сети анонимные учётные данные. ↩ ↩2 ↩3 ↩4
-
Microsoft Learn, Service accounts. О том, что виртуальная учётная запись — автоматически управляемая локальная, которой не нужно ведение пароля, что имя в форме NT SERVICE<SERVICENAME>, что в доменной среде она выходит в сеть с учётными данными учётной записи компьютера (
\ ↩ ↩2 ↩3 ↩4$), и критерии выбора среди sMSA, gMSA, dMSA и виртуальной учётной записи. -
Microsoft Learn, Service User Accounts. О том, что служба работает в контексте безопасности учётной записи пользователя, что SCM входит в учётную запись при запуске и связывает маркер доступа с процессом службы, что SCM загружает профиль пользователя и что SCM не ведёт истечение пароля, поэтому истечение делает вход неудачным и служба не запускается. ↩ ↩2 ↩3 ↩4 ↩5
-
Microsoft Learn, Protect SMB traffic from interception. Рекомендации включая gMSA как защиту учётной записи службы (длинный машинно порождённый случайный пароль делает взлом перебором или словарём нереалистичным), принуждение к длинному паролю и упоминание брони Kerberos (FAST). ↩ ↩2
-
Microsoft Learn, Secure group managed service accounts. О том, что пароль gMSA — случайное порождение 240 байт, которое трудно перебрать или атаковать словарём, что ОС Windows меняет пароль каждые 30 дней, поэтому администратору не нужно планировать смену или останавливать службу, развёртывание в ферме серверов и более простое ведение SPN, что если служба не поддерживает gMSA, используют sMSA, а если и это невозможно — стандартную учётную запись пользователя с сильным ведением пароля, и что поведение как gMSA нужно подтвердить в тестовой среде до промышленной. ↩ ↩2 ↩3
-
Microsoft Learn, Manage group Managed Service Accounts. Предпосылки gMSA (функциональный уровень домена/леса 2012 или выше, создание корневого ключа KDS), что имя gMSA должно быть уникально в лесу, что интервал смены пароля можно задать только при создании, указание группы, которой разрешено извлекать пароль, через -PrincipalsAllowedToRetrieveManagedPassword у New-ADServiceAccount, процедура Install-ADServiceAccount/Test-ADServiceAccount, что идентичность виртуальной учётной записи локальна для машины и доменом не распознаётся, что отказоустойчивый кластер не поддерживает gMSA, и что SCM, пул приложений IIS и планировщик заданий поддерживают настройку входа как gMSA. ↩ ↩2 ↩3 ↩4 ↩5
-
Microsoft Learn, 4624(S): An account was successfully logged on. О том, что событие 4624 записывается на компьютере, к которому обратились, когда создаётся сеанс входа, что тип входа 5 означает службу (SCM запускает службу), и что поле «Virtual Account» может определить вход от MSA или виртуальной учётной записи и использоваться для наблюдения за управляемыми учётными записями служб. ↩ ↩2
-
Microsoft Learn, About Windows Resource Protection. О том, что защита ресурсов Windows (WRP) предотвращает замену важных системных файлов, папок и ключей реестра, что полный доступ к ресурсу, защищённому WRP, ограничен TrustedInstaller и изменение можно сделать только через поддерживаемый механизм замены через службу установщика модулей Windows, и что приложение, которое пытается изменить защищённый ресурс, получает отказ в доступе. ↩
-
Microsoft Learn, Group Managed Service Accounts overview. О том, что gMSA — доменная учётная запись, оставляющая ведение пароля Windows, что контроллер домена вычисляет пароль из общего секрета Key Distribution Service (kdssvc.dll) и узел-член запрашивает у контроллера домена текущий и предыдущий пароли, и что она позволяет взаимную проверку подлинности как один и тот же субъект в ферме серверов. ↩
-
Microsoft Learn, Create a Key Distribution Service (KDS) root key. О том, что корневой ключ нужен, чтобы контроллер домена начал порождать пароли gMSA, процедура создания через Add-KdsRootKey -EffectiveImmediately, что до 10 часов после создания gMSA создать нельзя, потому что ждут сходимости репликации AD, и что неполная репликация может сделать извлечение пароля неудачным. ↩
-
Microsoft Learn, Policy CSP - UserRights: LogOnAsService. О том, что право «Вход в качестве службы» позволяет субъекту безопасности входить как служба, что у Local System, Local Service и Network Service это право встроено, что службе, запущенной от любой другой учётной записи, нужно назначить это право, и путь настройки групповой политики. ↩
Похожие статьи
Недавние статьи с теми же тегами помогут подробнее изучить близкие темы.
Глубины виртуализации Windows (часть 2) — память, которую не видит даже ядро: как работают VBS, HVCI и Credential Guard
На чистой установке на совместимом оборудовании VBS включена по умолчанию и с помощью гипервизора и SLAT создаёт изоляцию сильнее ядра. С...
Именованные каналы на практике — стандартный IPC Windows: от проектирования до безопасности
Практическое руководство по именованным каналам — стандартному межпроцессному взаимодействию Windows. Статья по первичным источникам разб...
Завершение работы Windows глазами приложения — как правильно пережить уведомления о выходе, перезапуски и потерю питания
Ночной перезапуск Windows Update повредил данные измерений — такую аварию можно предотвратить проектом. Статья разбирает по первичным ист...
Политика выполнения PowerShell и подпись скриптов — практическое руководство, как перестать «затыкать дыры» параметром Bypass
Политика выполнения PowerShell — это «не граница безопасности, а защитный механизм». Разбираем различия между RemoteSigned и другими поли...
Как понимать изоляцию сеансов Windows — Session 0, RDP и одновременная работа нескольких пользователей
В этой статье разбирается понятие «сеанса» (session) в Windows — тема, которая постоянно сбивает с толку разработчиков Windows-приложений...
Связанные темы
Эти страницы показывают тему статьи в более широком контексте услуг и решений.
Технические темы Windows
Раздел о разработке Windows, расследовании сбоев и использовании существующих активов.
Услуги по этой теме
Статья напрямую связана со следующими услугами.
Разработка приложений для Windows
Бизнес-приложения, интеграция оборудования и средства связи — от требований до разработки.
Частые вопросы
Вопросы, которые часто возникают при консультациях по теме статьи.
- Нужно ли сразу менять службу, которую пока запускают от LocalSystem?
- Немедленная смена не всегда правильный ответ. Сначала убедитесь, нужны ли этой службе локальные права класса LocalSystem (сильные права сверх администратора). Если это только чтение и запись файлов и сетевое общение, первый кандидат — виртуальная учётная запись (NT SERVICE\имя-службы). При переносе подтвердите выдачу доступа к нужным папкам и ключам реестра, как обрабатывать данные, зависящие от профиля или DPAPI, и есть ли право «Вход в качестве службы». Подтвердите запуск и основные функции в проверочной среде, затем переключайте промышленную.
- Выбрать виртуальную учётную запись или NetworkService?
- Для нового выбора рекомендуем виртуальную учётную запись. В сети обе выглядят как учётная запись компьютера (DOMAIN\имя-компьютера$), и у обеих небольшие локальные права. Однако NetworkService разделяют несколько служб, поэтому ACL «разрешить только этой службе» сделать нельзя. У виртуальной учётной записи своя идентичность на каждую службу, и NT SERVICE\имя-службы можно указать прямо в ACL. Недавние продукты Microsoft вроде SQL Server тоже по умолчанию используют виртуальную учётную запись.
- Можно ли использовать gMSA в рабочей группе (без домена)?
- Нет. gMSA — механизм, в котором контроллер домена Active Directory порождает и ведёт пароль; домен и создание корневого ключа KDS — предпосылки. В рабочей группе базовая линия — закончить локальную обработку виртуальной учётной записью или LocalService/NetworkService. Если нужен доступ к другой машине, нужно другое проектирование, например явно использовать учётные данные учётной записи, подготовленной на стороне назначения. Сетевой доступ как учётная запись компьютера (PC$) тоже действует только в доменной среде.
- После смены учётной записи входа службы сохранённые настройки и учётные данные больше не читаются. Почему?
- Потому что каждая учётная запись входа привязана к своему профилю пользователя, %TEMP%, HKEY_CURRENT_USER и ключу DPAPI. В частности, данные, защищённые DPAPI пользовательского охвата (CryptProtectData и подобное), в принципе может расшифровать только та же учётная запись, которая их защитила. Файлы, сохранённые под профилем (AppData и подобное), для новой учётной записи — другой путь. Перед сменой учётной записи спланируйте процедуру пересоздания данных, защищённых DPAPI (повторный ввод ключей API и подобное), и перенос файлов под профилем.
- Если службе нужен только доступ к общей папке, нужен ли доменный пользователь?
- Во многих случаях нет. В доменной среде служба, запущенная как LocalSystem, NetworkService или виртуальная учётная запись, проходит проверку подлинности на удалённой стороне как учётная запись компьютера (DOMAIN\имя-компьютера$). Добавьте этот PC$ в разрешения общего ресурса и NTFS общей папки — и она сможет читать и писать. Если нужен контроль доступа с идентичностью конкретной службы или одна и та же идентичность на нескольких серверах, рассмотрите gMSA, а не доменного пользователя.
Об авторе
Страница с профилем автора статьи.
Го Комура
Представитель KomuraSoft LLC
Специализируется на разработке программного обеспечения для Windows, техническом консалтинге и расследовании сбоев, особенно в проектах с унаследованными системами и трудно воспроизводимыми ошибками.