Imagine o seguinte cenário
CREATE DATABASE test
GO
USE test;
CREATE TABLE dbo.Customer
(
CustomerId INT,
Email VARCHAR(100),
SensitiveData VARCHAR(20)
);
INSERT INTO dbo.Customer
VALUES (1,'[email protected]','12346789');
Em algum momento, é gravado um processo ETL que executa algumas atividades no test
banco de dados.
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*/
O etlUser não deve ter permissões para a Customer
tabela (e certamente não para a SensitiveData
coluna), portanto, essas são explicitamente negadas acima.
O processo ETL trunca, dbo.StagingTable
portanto, são concedidas ALTER
permissões de tabela.
Isso é sinalizado durante uma auditoria de segurança. Quão perigoso é esse cenário?
sql-server
permissions
Martin Smith
fonte
fonte
Respostas:
Muito perigoso ...
Além da permissão óbvia para alterar a estrutura em
StagingTable
si, aALTER TABLE
permissão permite que eles criem acionadores na tabela. Portanto, nesse caso, por meio do encadeamento de propriedade, eles podem ver dados confidenciais do cliente (apesar dasDENY
permissões explícitas ) e realizar vandalismo nesta segunda tabela.fonte
Além de poder adicionar gatilhos, a permissão ALTER TABLE também permite:
Ele também permite a remoção de colunas, mas é provável que isso passe despercebido (pois parece que estamos procurando ações em potencial aqui mais enganosas do que maliciosas).
Felizmente, nunca é necessário conceder essa permissão a ninguém, nem é necessário envolvê-la em um procedimento armazenado que use a
EXECUTE AS
cláusula (normalmente seguida por'dbo'
ouOWNER
). A assinatura do módulo permite a fácil abstração de ações privilegiadas por trás do código assinado (procedimentos armazenados, gatilhos, UDFs escalares e TVFs com várias instruções). Eu tenho um código de exemplo mostrando como fazer isso nas seguintes respostas, aqui no DBA.SE:A diferença entre essas duas respostas é a permissão concedida ao usuário baseado em assinatura. A permissão a ser concedida (ou a função de banco de dados a ser adicionada) depende do escopo do que é necessário. Se você precisar apenas de permissão para uma única tabela, conceda apenas
ALTER
a ela. Se a permissão for necessária para todas as tabelas em um esquema específico, não conceda permissão para tabelas individuais, mas conceda a permissão ao próprio esquema. E assim por diante.A assinatura do módulo é algumas etapas extras, em comparação com a criação de um esquema especificamente para o usuário ETL ou com a
EXECUTE AS
cláusula, mas:EXECUTE
permissão para esse código. Ser proprietário de um esquema permite certas permissões implícitas que são desnecessárias. E, usandoEXECUTE AS 'dbo'
ouEXECUTE AS OWNER
(assumindo que o proprietário sejadbo
) concederá permissões a todo o processo , a partir desse pontodbo
, não apenas ao procedimento / gatilho / função armazenada que você usouEXECUTE AS
. A assinatura do módulo restringe as permissões apenas ao código que você assinou, e não a qualquer código chamado pelo código assinado.fonte
Uma prática melhor seria criar um esquema de temporariedade, de propriedade do usuário ETL. Em seguida, o processo ETL pode truncar tabelas, desabilitar restrições, executar alternância de partições etc. no esquema de preparação. O usuário ETL precisaria apenas de permissão limitada nos outros esquemas.
Você também pode usar uma função de banco de dados em vez de um único usuário.
Obviamente, você também pode permitir que seu usuário limitado execute truncamentos de tabela com um procedimento armazenado de propriedade do dbo, como este:
fonte