Поделиться через


Использование ИДЕНТИФИКАТОРов служб для предоставления разрешений службам в SQL Server

SQL Server использует идентификаторы безопасности для каждой службы (SID), также называемые субъектами безопасности службы, чтобы разрешить предоставление разрешений непосредственно определенной службе. Этот метод используется SQL Server для предоставления разрешений службам обработчика и агента (NT SERVICE\MSSQL$<InstanceName> и NT SERVICE\SQLAGENT$<InstanceName> соответственно). С помощью этого метода службы могут получить доступ к механизму базы данных только когда они работают. Дополнительные сведения см. в разделе KB2620201 (ссылка на архив).

Этот же метод можно использовать при предоставлении разрешений другим службам. Использование идентификатора безопасности службы (SID) устраняет необходимость управления и сопровождения учетных записей служб, обеспечивая более точный и детализированный контроль над разрешениями, предоставляемыми системным ресурсам.

Примеры служб, в которых можно использовать идентификатор безопасности службы:

  • Служба мониторинга состояния System Center Operations Manager (NT SERVICE\HealthService)
  • Служба отказоустойчивой кластеризации Windows Server (WSFC) (NT SERVICE\ClusSvc)

Некоторые службы по умолчанию не имеют идентификатор безопасности службы. Идентификатор безопасности службы должен быть создан с помощью SC.exe. Этот метод был принят администраторами Microsoft System Center Operations Manager для предоставления разрешений компоненту HealthService в SQL Server.

После создания и подтверждения SID службы необходимо предоставить разрешение в SQL Server. Предоставление разрешений осуществляется путем создания имени входа Windows с помощью SQL Server Management Studio (SSMS) или запроса Transact-SQL. После создания имени входа его можно предоставить разрешения, добавить к ролям и сопоставить с базами данных так же, как и любой другой вход.

Подсказка

Если ошибка Login failed for user 'NT AUTHORITY\SYSTEM' получена, убедитесь, что идентификатор безопасности службы существует для требуемой службы, имя входа службы безопасности было создано в SQL Server, и соответствующие разрешения были предоставлены этому идентификатору безопасности в SQL Server.

Безопасность

Удалите служебные учетные записи

Традиционно учетные записи служб использовались для предоставления службам возможности входа в SQL Server. Учетные записи служб добавляют дополнительный уровень сложности управления из-за необходимости поддерживать и периодически обновлять пароль учетной записи службы. Кроме того, учетные данные учетной записи службы могут использоваться отдельным лицом, пытающимся маскировать свои действия при выполнении действий в системе.

Гранулированные разрешения для системных учетных записей

Системным учетным записям исторически предоставлялись разрешения путем создания имени входа для учетных записей LocalSystem (NT AUTHORITY\SYSTEM в en-us) или NetworkService (NT AUTHORITY\NETWORK SERVICE в en-us) и предоставления этим входам необходимых разрешений. Этот метод предоставляет процессу или службе разрешения на доступ к SQL, который работает с привилегиями системной учетной записи.

Использование SID службы позволяет предоставлять разрешения определенной службе. Служба имеет доступ только к ресурсам, которым было предоставлено разрешение при запуске. Например, если HealthService выполняется как LocalSystem и предоставляется View Server State, то учетная запись LocalSystem будет иметь разрешение View Server State только при выполнении в контексте HealthService. Если любой другой процесс пытается получить доступ к состоянию сервера SQL как LocalSystem, они будут отказано в доступе.

Примеры

А. Создать идентификатор SID службы

Следующая команда PowerShell создаст идентификатор безопасности службы (SID) в службе работоспособности System Center Operations Manager.

sc.exe --% sidtype "HealthService" unrestricted

Это важно

--% Сообщает PowerShell остановить обработку оставшейся части команды. Это полезно при использовании устаревших команд и приложений.

В. Запрос SID службы

Чтобы проверить идентификатор безопасности службы или убедиться, что идентификатор безопасности службы существует, выполните следующую команду в PowerShell.

sc.exe --% qsidtype "HealthService"

Это важно

--% указывает PowerShell прекратить синтаксический анализ остальной части команды. Это полезно при использовании устаревших команд и приложений.

С. Добавление только что созданного идентификатора безопасности службы в качестве имени входа

В следующем примере создается учётная запись для службы мониторинга System Center Operations Manager с помощью T-SQL.

CREATE LOGIN [NT SERVICE\HealthService] FROM WINDOWS
GO

D. Добавление существующего идентификатора безопасности службы в качестве имени входа

В следующем примере создается имя входа для службы кластера с помощью T-SQL. Предоставление разрешений службе кластера напрямую устраняет необходимость предоставления чрезмерных разрешений учетной записи SYSTEM.

CREATE LOGIN [NT SERVICE\ClusSvc] FROM WINDOWS
GO

E. Предоставить разрешения служебному SID

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

GRANT ALTER ANY AVAILABILITY GROUP TO [NT SERVICE\ClusSvc]
GO

GRANT CONNECT SQL TO [NT SERVICE\ClusSvc]
GO

GRANT VIEW SERVER STATE TO [NT SERVICE\ClusSvc]
GO

Замечание

Удаление учетных записей SID служб или их исключение из роли сервера sysadmin может вызвать проблемы с различными компонентами SQL Server, которые подключаются к ядру подсистемы базы данных SQL Server. К некоторым проблемам относятся следующие проблемы:

  • Агент SQL Server не может запустить или подключиться к службе SQL Server
  • Программы установки SQL Server сталкиваются с проблемой, указанной в следующей статье базы знаний Майкрософт: https://mskb.pkisolutions.com/kb/955813

Для экземпляра SQL Server по умолчанию эту ситуацию можно исправить, добавив идентификатор безопасности службы с помощью следующих команд Transact-SQL:

CREATE LOGIN [NT SERVICE\MSSQLSERVER] FROM WINDOWS WITH DEFAULT_DATABASE=[master], DEFAULT_LANGUAGE=[us_english]

ALTER ROLE sysadmin ADD MEMBER [NT SERVICE\MSSQLSERVER]

CREATE LOGIN [NT SERVICE\SQLSERVERAGENT] FROM WINDOWS WITH DEFAULT_DATABASE=[master], DEFAULT_LANGUAGE=[us_english]

ALTER ROLE sysadmin ADD MEMBER [NT SERVICE\SQLSERVERAGENT]

Для именованного экземпляра SQL Server используйте следующие команды Transact-SQL:

CREATE LOGIN [NT SERVICE\MSSQL$SQL2019] FROM WINDOWS WITH DEFAULT_DATABASE=[master], DEFAULT_LANGUAGE=[us_english]

ALTER ROLE sysadmin ADD MEMBER [NT SERVICE\MSSQL$SQL2019]

CREATE LOGIN [NT SERVICE\SQLAgent$SQL2019] FROM WINDOWS WITH DEFAULT_DATABASE=[master], DEFAULT_LANGUAGE=[us_english]

ALTER ROLE sysadmin ADD MEMBER [NT SERVICE\SQLAgent$SQL2019]

В этом примере SQL2019 — имя экземпляра SQL Server.

Дальнейшие шаги

Дополнительные сведения о структуре sid службы см. в структуре SERVICE_SID_INFO.

Ознакомьтесь с дополнительными параметрами, доступными при создании имени входа.

Чтобы использовать контроль доступа на основе ролей с служебными SID, ознакомьтесь с созданием ролей в SQL Server.

Ознакомьтесь с различными способами предоставления разрешений идентификаторам безопасности служб в SQL Server.

Дополнительные сведения о настройке учетных записей служб для SQL Server см. в статье "Настройка учетных записей службы Windows" и разрешений.