Представьте себе следующий сценарий
CREATE DATABASE test
GO
USE test;
CREATE TABLE dbo.Customer
(
CustomerId INT,
Email VARCHAR(100),
SensitiveData VARCHAR(20)
);
INSERT INTO dbo.Customer
VALUES (1,'abc@foo.com','12346789');
В какой-то момент записывается процесс ETL, который выполняет некоторые действия в test
базе данных.
CREATE USER etlUser WITHOUT LOGIN; /*For demo purposes*/
CREATE TABLE dbo.StagingTable
(
StagingTableId INT,
SomeData VARCHAR(100),
)
GRANT UPDATE,INSERT,DELETE,SELECT,ALTER ON dbo.StagingTable TO etlUser;
DENY SELECT ON dbo.Customer TO etlUser;
DENY SELECT ON dbo.Customer (SensitiveData) TO etlUser; /*For good measure*/
У etlUser не должно быть прав доступа к Customer
таблице (и, конечно, к SensitiveData
столбцу), поэтому они явно запрещены выше.
Процесс ETL усекается, dbo.StagingTable
поэтому ему даются ALTER
разрешения для таблицы.
Это помечается во время аудита безопасности. Насколько опасен этот сценарий?
sql-server
permissions
Мартин Смит
источник
источник
Ответы:
Довольно опасно ...
В дополнение к очевидному разрешению изменять
StagingTable
саму структуру,ALTER TABLE
разрешение позволяет им создавать триггеры на столе. Таким образом, в этом случае с помощью цепочки владения они могут как просматривать конфиденциальные данные клиентов (несмотря на явныеDENY
разрешения), так и выполнять вандализм в отношении второй таблицы.источник
Помимо возможности добавления триггеров, разрешение ALTER TABLE также позволяет:
Это также позволяет удалять столбцы, но это вряд ли останется незамеченным (так как кажется, что мы ищем здесь потенциальные действия, которые являются скорее обманчивыми, чем вредоносными).
К счастью, никогда не нужно предоставлять это разрешение кому-либо, и нет необходимости заключать его в хранимую процедуру, которая использует
EXECUTE AS
предложение (обычно сопровождаемое'dbo'
илиOWNER
). Подписание модуля позволяет легко абстрагировать привилегированные действия за подписанным кодом (хранимые процедуры, триггеры, скалярные UDF и TVF с несколькими операторами). У меня есть пример кода, показывающий, как это сделать, в следующих ответах, здесь, на DBA.SE:Разница между этими двумя ответами заключается в разрешении, предоставленном пользователю на основе подписи. Разрешение, которое будет предоставлено (или роль БД, которая будет добавлена), зависит от объема того, что необходимо. Если вам нужно разрешение только для одной таблицы, то предоставьте только
ALTER
эту таблицу. Если разрешение требуется для всех таблиц в конкретной схеме, не предоставляйте разрешение отдельным таблицам, а вместо этого предоставляйте разрешение самой схеме. И так далее.Подписание модуля - это несколько дополнительных шагов по сравнению с созданием схемы специально для пользователя ETL или с использованием
EXECUTE AS
предложения, но:EXECUTE
разрешение на этот код. Быть владельцем схемы позволяет определенные неявные разрешения, которые не нужны. И использованиеEXECUTE AS 'dbo'
илиEXECUTE AS OWNER
(при условии, что владельцем являетсяdbo
) даст весь процесс , начиная с этого момента,dbo
разрешения, а не только хранимую процедуру / триггер / функцию, которую вы использовалиEXECUTE AS
. Подписание модуля ограничивает разрешения только кодом, который вы подписали, а не кодом, вызываемым подписанным кодом.источник
Лучше было бы создать промежуточную схему, принадлежащую пользователю ETL. Затем процесс ETL может усекать таблицы, отключать ограничения, выполнять переключение разделов и т. Д. В промежуточной схеме. Пользователю ETL потребуется только ограниченное разрешение на другие схемы.
Вы также можете использовать роль базы данных вместо одного пользователя.
Конечно, вы также можете разрешить вашему ограниченному пользователю выполнять усечение таблиц с помощью хранимой процедуры, принадлежащей dbo, например:
источник