Автор: Emad Al-Mousa Audit SQL Server Extended Stored Procedures Usage
В этой статье поговорим о мониторинге доступов к конфиденциальной
информации SQL Server и политиках аудита безопасности для обеспечения требований
Security Information and Event Management (SIEM).
Заострим наше внимание на аудите выполнения не безопасных в этом плане
системных хранимых процедур. Такие команды следует отслеживать, поскольку их
можно использовать для компрометации данных, если запуск происходит в контексте
роли системного администратора.
Extended stored procedures (расширенные хранимые процедуры) — это файлы библиотек DLL, на которые ссылается SQL Server, и которые предоставляют интерфейсы для операционной системы. Эти процедуры предназначены для выполнения действий на системном уровне. Поэтому для их работы нужны привилегии на уровне роли SYSADMIN. Использование расширенных процедур повышает риски безопасности и требует особого мониторинга для возможного расследования обстоятельств нарушения безопасности. Кроме того, операции на уровне операционной системы выполняются в контексте учетной записи службы SQL Server.
Чтобы получить список логинов, которые входят в роль
SYSADMIN, выполните следующий запрос T-SQL:
SELECT * FROM master.sys.server_principals
WHERE IS_SRVROLEMEMBER ('sysadmin',name)=1;
Список всех расширенных хранимых процедур экземпляра SQL Server можно получить так:
SELECT * FROM master.sys.all_objects where type='X'
GO
Из всех расширенных хранимых процедур наиболее важными
для мониторинга считаются перечисленные ниже, поскольку с их помощью легко
навредить, и они позволяют вносить изменения на системном уровне:
- xp_cmdshell: позволяет выполнять
команды операционной системы в контексте учетной записи службы, от которой
запущен SQL Server.
- xp_delete_files: удаляет файл или группу
файлов.
- xp_delete_file: удаляет файл или группу файлов,
включая файлы резервных копий с расширениями «.bak» или «.trn».
- xp_regdeletekey: удаляет ключ раздела
реестра Windows.
- xp_regwrite: изменяет значения в
реестре Windows.
- xp_copy_file: копирует файлы, особенно
удобно для файлов с расширениями «.bak» и «.trn».
- xp_copy_files: Копирует группу файлов.
Давайте сначала настроим аудит на уровне сервера:
USE [master]
GO
CREATE SERVER AUDIT [AUDIT-XPPROC]
TO FILE
(FILEPATH = N'D:\SQLServer_2022\audit\'
,MAXSIZE = 0 MB
,MAX_ROLLOVER_FILES = 2147483647
,RESERVE_DISK_SPACE = OFF
) WITH (QUEUE_DELAY = 1000, ON_FAILURE = CONTINUE)
GO
Затем настроим аудит на уровне базы данных «master»:
USE [master]
GO
CREATE DATABASE AUDIT SPECIFICATION [Audit_XP]
FOR SERVER AUDIT [AUDIT-XPPROC]
ADD (SCHEMA_OBJECT_ACCESS_GROUP)
WITH (STATE = ON)
GO
Для мониторинга использования расширенных хранимых
процедур был выбран тип аудита — SCHEMA_OBJECT_ACCESS_GROUP.
Для демонстрации, что он работает, давайте скопируем
файл «file1.txt» из папки C:\tmp в папку C:\tmp2, используя следующий код на
T-SQL:
exec master.sys.xp_copy_files 'C:\tmp\file1.txt', 'C:\tmp2\';
На скриншоте видно, что файл скопирован успешно:
Давайте теперь заглянем в журнал аудита, тут нам поможете следующий
запрос:
SELECT action_id,succeeded,session_server_principal_name
,server_principal_name,object_name,statement
FROM sys.fn_get_audit_file('D:\SQLServer_2022\audit\*', DEFAULT, DEFAULT)
WHERE action_id='EX' and object_name like 'xp_copy%'
GO
Вот его результат:
Теперь давайте отследим для примера изменение ключей реестра Windows, в
котором указан порт для прослушивания SQL Server. Изменим порт по умолчанию
1433 на другое значение: 1466.
EXEC master..xp_regwrite
@rootkey = 'HKEY_LOCAL_MACHINE',
@key = 'Software\Microsoft\Microsoft SQL Server\MSSQL16.MSSQLSERVER\MSSQLServer\SuperSocketNetLib\Tcp\IP1',
@value_name = 'TcpPort',
@type = 'REG_SZ',
@value = '1466'
Запросим теперь изменённое значение с помощью вот такого запроса:
SELECT *
FROM [master].[sys].[dm_server_registry]
WHERE registry_key='HKLM\Software\Microsoft\Microsoft SQL Server\MSSQL16.MSSQLSERVER\MSSQLServer\SuperSocketNetLib\Tcp\IP1';
Журналы аудита также зафиксировал это событие, как мы и ожидали:
SELECT action_id, succeeded, session_server_principal_name
, server_principal_name, object_name,statement
FROM sys.fn_get_audit_file('D:\SQLServer_2022\audit\*', DEFAULT, DEFAULT)
WHERE action_id='EX' and object_name='xp_regwrite';
GO
Внесение изменений в реестр Windows — один из приёмов,
который эксплуатируют злоумышленники для атаки на системные службы и позволяет
выполнять команды или запускать программы. В глобальной базе знаний о тактиках
и методах атак «MITRE ATT&CK» описанный выше способ указан в качестве эксплуатируемого
метода [ID: T1569].
Третий пример, который мы протестируем, — это
использование xp_cmdshell, популярной и известной расширенной хранимой
процедуры, которая позволяет удаленно запускать команды операционной системы.
Например, я буду использовать ее для удаления специально созданного для этого
файла на диске D: с именем «sample.txt».
EXEC xp_cmdshell 'del D:\sample.txt';
GO
Заглянем теперь в журнал аудита следующим запросом, и убедимся, что
использование xp_cmdshell было зарегистрировано:
SELECT action_id, succeeded, session_server_principal_name
, server_principal_name, object_name,statement
FROM sys.fn_get_audit_file('D:\SQLServer_2022\audit\*', DEFAULT, DEFAULT)
WHERE object_name='xp_cmdshell';
GO
Ещё одна операция, где можно злонамеренно использовать xp_cmdshell, —
это изменение разрешений файла, что может потенциально создать дыру в
безопасности на уровне операционной системы. В команде ниже будут предоставлены
полные разрешения учетной записи операционной системы Windows с именем
"emad2"
на файл «sample.txt»:
EXEC xp_cmdshell 'CACLS D:\sample.txt /e /p emad2:f';
GO
Возможности удаленного выполнения операций в операционной системе,
когда злоумышленник скомпрометировал логин из серверной роли SYSADMIN, являются
той поверхностью атаки, которая требует обнаружения, изучения возможных
последствий, обзора средств контроля, реагирования и мониторинга. В качестве рекомендуемой
практики и соблюдения лучших стандартов безопасности, изложенных в эталонных
тестах Center for Internet Security (CIS), вы можете следовать правилу,
что учетная запись службы SQL Server не должна входить в группу локальных администраторов
операционной системы.
Чтобы узнать имя учётки службы, в контексте которой работает служба
SQL Server, вы можете выполнить следующий запрос:
SELECT servicename, service_account FROM sys.dm_server_services;
Комментариев нет:
Отправить комментарий