Добро пожаловать в форум, Guest  >>   Войти | Регистрация | Поиск | Правила | В избранное | Подписаться
Все форумы / Microsoft SQL Server Новый топик    Ответить
 Моя борьба с xp_cmdshell - никак не могу заставить работать прокси.  [new]
IKSparrow
Member

Откуда:
Сообщений: 23
Привет тебе общественный разум.

Итак, исходная стойка:
1. Microsoft SQL Server 2014 (SP3) (KB4022619) - 12.0.6024.0 (X64)
Sep 7 2018 01:37:51
Copyright (c) Microsoft Corporation
Enterprise Edition (64-bit) on Windows NT 6.1 <X64> (Build 7601: Service Pack 1)
2. Служба SQL запущена под его штатной, локальной, учетной записью - [NT Service\MSSQL$DVLSRV]
3. Машина, на которой находится сам SQL - в домене.
4. В этом домене есть вторая машина, где работает ещё один SQL-сервер.
5. На второй машине делается бэкап рабочей базы компании (она там одна - и база и компания) и складывается в определенный каталог на локальном диске второго компьютера
6. Локальный каталог проброшен посредством mklink /D со второй машины на локальный диск первой машины.

Теперь, собственно суть.
Предполагается, что копия базы будет браться из этого проброшенного каталога, разворачиваться на SQL первой машины, проходить некоторую пост-обработку и предоставляться заказчику.

И всё бы ничего, но встретился неожиданный затык - xp_cmdshell. То ли я некорректно, что-то делаю, то ли я слишком большие надежды на него возлагаю. Но затык происходит ещё на самом первом этапе - чтения содержимого прилинкованного каталога на первой машине.

Стоит запустить SQL службу от доменного админа, как всё прекрасно читается в каталоге. Но мы же лёгких путей не ищем. Поэтому:

1. Создана доменная учётка с минимальными правами (MyDomain\SBO)
2. Этой учётке на второй машине даны права на чтение и просмотр содержимого каталога, куда складываются копии базы
3. Создан мандат (credential) ##xp_cmdshell_proxy_account## с учеткой MyDomain\SBO
4. Учетке дан логин на первом сервере SQL и права на EXECUTE и CONTROL SERVER. Включена в группу public

И вот, под этой учеткой я выполняю контрольный код, чтобы понять - под кем же я сейчас буду просматривать каталог:

EXECUTE AS LOGIN = 'MyDomain\SBO' ;
GO 
EXEC master..xp_cmdshell 'whoami.exe'
REVERT ;


И я вижу, что cmdshell выполняется от имени:
[NT Service\MSSQL$DVLSRV]

Какого чёрта? Ведь в документации написано, что прокси на cmdshell используется у учетки, которая не включена в группу sysadmins. Что я не так делаю?
15 янв 19, 15:49    [21785846]     Ответить | Цитировать Сообщить модератору
 Re: Моя борьба с xp_cmdshell - никак не могу заставить работать прокси.  [new]
Yasha123
Member

Откуда:
Сообщений: 1833
IKSparrow
Какого чёрта? Ведь в документации написано, что прокси на cmdshell используется у учетки, которая не включена в группу sysadmins. Что я не так делаю?

там еще написано, что или сисадмин, или имеет контрол сервер.
вот отберите контрол сервер и просто дайте exec на xp_cmdshell.
и сразу под прокси полезет.
15 янв 19, 15:54    [21785852]     Ответить | Цитировать Сообщить модератору
 Re: Моя борьба с xp_cmdshell - никак не могу заставить работать прокси.  [new]
IKSparrow
Member

Откуда:
Сообщений: 23
Yasha123,

DENY CONTROL SERVER TO [MyDomain\SBO]
GO
EXECUTE AS LOGIN = 'MyDomain\SBO' ;
GO 
EXEC master..xp_cmdshell 'whoami.exe'
REVERT ;


Увы, опять:

[NT Service\MSSQL$DVLSRV]
15 янв 19, 15:57    [21785856]     Ответить | Цитировать Сообщить модератору
 Re: Моя борьба с xp_cmdshell - никак не могу заставить работать прокси.  [new]
Yasha123
Member

Откуда:
Сообщений: 1833
BOL
Now non-administrators can launch operating system processes with xp_cmdshell and those processes run with the permissions of the proxy account that you have configured.
Users with CONTROL SERVER permission (members of the sysadmin fixed server role)
will continue to receive the permissions of the SQL Server service account for child processes that are launched by xp_cmdshell.

xp_cmdshell (Transact-SQL)
15 янв 19, 15:57    [21785858]     Ответить | Цитировать Сообщить модератору
 Re: Моя борьба с xp_cmdshell - никак не могу заставить работать прокси.  [new]
IKSparrow
Member

Откуда:
Сообщений: 23
Yasha123,

Так, поправочка:
Снял принудительно флажок CONTROL SERVER у MyDomain\SBO и теперь стало выдаваться:
Msg 15121, Level 16, State 200, Procedure xp_cmdshell, Line 14
An error occurred during the execution of xp_cmdshell. A call to 'LogonUserW' failed with error code: '1385'.

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

Спасибо! Пойду дальше ковырять.
15 янв 19, 16:02    [21785862]     Ответить | Цитировать Сообщить модератору
 Re: Моя борьба с xp_cmdshell - никак не могу заставить работать прокси.  [new]
Yasha123
Member

Откуда:
Сообщений: 1833
IKSparrow
Yasha123,

DENY CONTROL SERVER TO [MyDomain\SBO]
GO
EXECUTE AS LOGIN = 'MyDomain\SBO' ;
GO 
EXEC master..xp_cmdshell 'whoami.exe'
REVERT ;


Увы, опять:

[NT Service\MSSQL$DVLSRV]

для начала не DENY, а REVOKE.
и потом, у вас учетка явно sysadmin:
вы ей не дали exec на xp_cmdshell,
а она продолжает процедуру выполнять.

покажите
EXECUTE AS LOGIN = 'MyDomain\SBO';

select *
from sys.fn_my_permissions(null, 'server');

select IS_SRVROLEMEMBER('sysadmin');
15 янв 19, 16:02    [21785864]     Ответить | Цитировать Сообщить модератору
 Re: Моя борьба с xp_cmdshell - никак не могу заставить работать прокси.  [new]
Yasha123
Member

Откуда:
Сообщений: 1833
ок, уже неактуально.
одновременно запостили.
тем не менее, отбирает выданное REVOKE, а не DENY
15 янв 19, 16:06    [21785870]     Ответить | Цитировать Сообщить модератору
 Re: Моя борьба с xp_cmdshell - никак не могу заставить работать прокси.  [new]
Владислав Колосов
Member

Откуда:
Сообщений: 7764
IKSparrow,

как-то Вы с подвыподвертом всё делаете. Эта задача решается утилитой SQLCMD и пакетным файлом и не со стороны SQL сервера, а со стороны операционной системы.
16 янв 19, 15:35    [21786859]     Ответить | Цитировать Сообщить модератору
 Re: Моя борьба с xp_cmdshell - никак не могу заставить работать прокси.  [new]
IKSparrow
Member

Откуда:
Сообщений: 23
Так, у меня тут другая беда.
Прокси работает и отлично.
Но.
Возникает противоречие условий.
Прокси работает только для пользователя у которого нет ролей SYSADMIN и CONTROL SERVER
Файл может бэкапа может прочитать только такой пользователь (под учеткой прокси).
А восстановить базу из бэкапа может пользователь только с двумя вышеупомянутыми ролями.
Тупик. Какие варианты есть по выходу?
16 янв 19, 16:26    [21786979]     Ответить | Цитировать Сообщить модератору
 Re: Моя борьба с xp_cmdshell - никак не могу заставить работать прокси.  [new]
Andy_OLAP
Member

Откуда: я знаю, что Хапоэль Беэр-Шева - чемпион
Сообщений: 3151
IKSparrow
Так, у меня тут другая беда.
Прокси работает и отлично.
Но.
Возникает противоречие условий.
Прокси работает только для пользователя у которого нет ролей SYSADMIN и CONTROL SERVER
Файл может бэкапа может прочитать только такой пользователь (под учеткой прокси).
А восстановить базу из бэкапа может пользователь только с двумя вышеупомянутыми ролями.
Тупик. Какие варианты есть по выходу?

Пользователь, обрезанный в правах, читает самый свежий файл бэкапа из многих. Копирует с сервера по сети на целевой сервер. Сверяет контрольные суммы на скопированный файл и на тот файл, который остался лежать на сервере (причину, по которой желательно это делать, озвучивать не стану, у Вас ведь не ZFS/BTRFS с checksum для файлов). И запускает процедуру, которую для него написал sysadmin (execute as), которая читает локальный файл бэкапа и делает рестор.
16 янв 19, 16:30    [21786991]     Ответить | Цитировать Сообщить модератору
 Re: Моя борьба с xp_cmdshell - никак не могу заставить работать прокси.  [new]
Andy_OLAP
Member

Откуда: я знаю, что Хапоэль Беэр-Шева - чемпион
Сообщений: 3151
IKSparrow
2. Служба SQL запущена под его штатной, локальной, учетной записью - [NT Service\MSSQL$DVLSRV]
3. Машина, на которой находится сам SQL - в домене.
4. В этом домене есть вторая машина, где работает ещё один SQL-сервер.

IKSparrow
Стоит запустить SQL службу от доменного админа, как всё прекрасно читается в каталоге. Но мы же лёгких путей не ищем.

План действий:
1. Перевести работу всех служб MSSQL на доменных ПК и серверах на использование специальной доменной учетной записи, которая не является локальным администратором, нигде вообще.
2. Найти и уволить за служебное несоответствие и саботаж того персонажа, который не признает легких путей и заставляет оставлять MSSQL службы работать под локальными учетными записями.
3. Переделать схему работы на стандартную по отрасли. Чтобы вновь нанятый DBA не вырывал себе остатки пейсов с криком "я не понимаю, как вы тут все сделали".
16 янв 19, 16:37    [21787011]     Ответить | Цитировать Сообщить модератору
 Re: Моя борьба с xp_cmdshell - никак не могу заставить работать прокси.  [new]
invm
Member

Откуда: Москва
Сообщений: 9349
IKSparrow
А восстановить базу из бэкапа может пользователь только с двумя вышеупомянутыми ролями.
https://docs.microsoft.com/en-us/sql/t-sql/statements/restore-statements-transact-sql?view=sql-server-2017
If the database being restored does not exist, the user must have CREATE DATABASE permissions to be able to execute RESTORE. If the database exists, RESTORE permissions default to members of the sysadmin and dbcreator fixed server roles and the owner (dbo) of the database (for the FROM DATABASE_SNAPSHOT option, the database always exists).
16 янв 19, 17:26    [21787084]     Ответить | Цитировать Сообщить модератору
Все форумы / Microsoft SQL Server Ответить