Вопрос или проблема
С SQL Server 2012 я пытаюсь сделать следующее:
DECLARE @COMMAND nvarchar(4000)
SET @COMMAND = 'net stop <servicename>'
exec master.dbo.xp_cmdshell @COMMAND
Я получаю системную ошибку 5 и отказ в доступе как ответ
Служебная учётная запись (проверено с помощью whoami
) добавлена в администраторы, так что что еще может быть не так?
Запустите SQL Server 2012 от имени администратора, и проблема исчезнет.
Разрешить пользователю, не являющемуся sysadmin, выполнять xp_cmdshell
из SSMS
Я помогал устранить проблему, когда нам нужно было предоставить разработчику приложения доступ к выполнению xp_cmdshell
из сеанса SSMS, а не “Запуск от имени” из SQL Agent Job на некритичном сервере разработки, не делая его sysadmin на экземпляре SQL Server.
Что мы сделали
Заметка: Учётная запись домена может быть заменена учётной записью рабочей группы, локальной учётной записью компьютера и т.д.
Важно: Вы должны понимать риск, связанный с разрешением пользователям в вашей среде выполнять команды уровня ОС, и вы должны предоставлять этот уровень разрешений к xp_cmdshell
только тем, кому вы доверяете с этой степенью безопасности с помощью метода прокси.
-
Создали новую учётную запись домена с надежным паролем и записали имя пользователя и пароль. Убедились, что учётная запись активирована, а пароль установлен на никогда не истекающий.
-
Создали новый SQL Server Login, связанный с новой учётной записью домена, которую мы создали.
-
Создали новый учётные данные прокси, связанные с учётной записью домена.
EXEC sp_xp_cmdshell_proxy_account '<Domain>\<NewUser>', '<password>' -- вы должны ввести фактический пароль
-
Предоставили тому SQL Server Login явный
EXECUTE
доступ к системной расширенной хранимой процедуре из базы данныхMaster
с именемsys.xp_cmdshell
.--посмотрите, кто имеет доступ на выполнение xp_cmdshell Use master EXEC sp_helprotect 'xp_cmdshell' -- Чтобы разрешить изменение расширенных опций. EXEC sp_configure 'show advanced options', 1 RECONFIGURE GO -- Включите процедуру xp_cmdshell EXEC sp_configure 'xp_cmdshell', 1 RECONFIGURE GO -- Предоставить права на выполнение учётной записи GRANT EXECUTE ON xp_cmdshell TO [<Domain>\<NewUser>]
-
Предоставить человеку, использующему
EXECUTE AS
разрешение на исполнение от имени для новой SQL Server Login.GRANT IMPERSONATE ON LOGIN::[<Domain>\<NewUser>] TO [<Domain>\<UserGrantingExecuteAsUser>]
-
Теперь выполните команду с помощью EXECUTE AS LOGIN и передайте команду
net stop
процедуреxp_cmdshell
. Секретный принципал, указанный в шаге #5 выше в<Domain>\<UserGrantingExecuteAsUser>
, должен быть тем, от имени кого вы запускаете SSMS с точки зрения контекста безопасности для этой задачи.EXECUTE AS LOGIN = '<Domain>\<NewUser>' DECLARE @COMMAND nvarchar(4000) SET @COMMAND = 'net stop <servicename>' EXEC xp_cmdshell @COMMAND REVERT
Дополнительные ресурсы
Ответ или решение
При работе с SQL Server 2012 и использованием команды xp_cmdshell
для выполнения системных команд, пользователи могут столкнуться с ошибкой "System Error 5: Access Denied". Эта проблема часто возникает, когда система не позволяет текущему пользователю останавливать службы через команду net stop
. Давайте рассмотрим возможные причины этой ошибки и способы ее устранения.
1. Причины ошибки "Access Denied"
Ошибка доступа может возникать по нескольким причинам:
- Недостаточные права пользователя: Несмотря на то, что учетная запись может быть добавлена в группу администраторов, это не всегда гарантирует необходимые права на выполнение системных команд через SQL Server.
- Настройки безопасности SQL Server: SQL Server имеет собственные механизмы управления доступом, которые могут препятствовать выполнению определенных действий даже для учетных записей с администраторскими правами.
2. Решение проблемы
Для решения проблемы сначала рассмотрим оптимальный способ настройки прав доступа на выполнение xp_cmdshell
.
А. Настройка xp_cmdshell
-
Включение расширенной опции
xp_cmdshell
:
Для начала, если функцияxp_cmdshell
еще не включена, активируйте ее:EXEC sp_configure 'show advanced options', 1; RECONFIGURE; EXEC sp_configure 'xp_cmdshell', 1; RECONFIGURE;
-
Создание нового логина и учетной записи:
Рекомендуется создать новую учетную запись с минимально необходимыми правами, чтобы избежать излишних рисков:-- Создание логина для доменной учетной записи CREATE LOGIN [Domain\NewUser] FROM WINDOWS;
-
Настройка прокси-учетной записи для
xp_cmdshell
:
Прокси-учетная запись позволяет SQL Server выполнять команды от имени учетной записи с нужными привилегиями:EXEC sp_xp_cmdshell_proxy_account 'Domain\NewUser', 'your_password';
-
Предоставление необходимых прав:
Убедитесь, что созданный логин имеет права на выполнениеxp_cmdshell
:GRANT EXECUTE ON xp_cmdshell TO [Domain\NewUser];
-
Использование команды через
EXECUTE AS
:
Когда все настройки завершены, используйте командуEXECUTE AS
для выполнения команд от имени созданной учетной записи:EXECUTE AS LOGIN = 'Domain\NewUser'; DECLARE @COMMAND nvarchar(4000); SET @COMMAND = 'net stop <servicename>'; EXEC xp_cmdshell @COMMAND; REVERT;
3. Принципы безопасности
Важно помнить о рисках, связанных с предоставлением доступа к xp_cmdshell
. Эта функция позволяет выполнять любые команды на операционной системе, что потенциально может быть использовано злоумышленниками. Поэтому следует строго контролировать, кто имеет доступ к этой функции, и применять безопасные методы работы с ней.
Заключение
Использование xp_cmdshell
в SQL Server требует внимательного подхода к безопасности и управлению правами доступа. Если вы получаете ошибку "Access Denied" при выполнении команд, изучение и последующая корректировка прав доступа, а также создание прокси-учетной записи являются необходимыми шагами для исправления данной ситуации.
Используйте предоставленные рекомендации для обеспечения безопасного и эффективного управления SQL Server и его интеграции с операционной системой.