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

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

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

Ниже приведены примеры служб, где можно использовать идентификатор безопасности службы.

  • Служба работоспособности System Center Operations Manager (NT SERVICE\HealthService)
  • Служба кластера WSFC (NT SERVICE\ClusSvc)

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

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

Совет

Если происходит ошибка 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.

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

Примеры

А. Создание идентификатора безопасности

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

sc.exe --% sidtype "HealthService" unrestricted

Важно!

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

B. Запрос идентификатора безопасности службы

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

sc.exe --% qsidtype "HealthService"

Важно!

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

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

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

CREATE LOGIN [NT SERVICE\HealthService] FROM WINDOWS
GO

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

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

CREATE LOGIN [NT SERVICE\ClusSvc] FROM WINDOWS
GO

Д. Предоставление разрешений идентификатору безопасности

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

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 по умолчанию эту ситуацию можно исправить, добавив SID службы с помощью следующих команд 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.

Следующие шаги

Дополнительные сведения о структуре идентификаторов безопасности см. в разделе Структура SERVICE_SID_INFO.

Сведения о дополнительных доступных параметрах см. в разделе Создание имени входа.

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

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

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