Imagine el siguiente escenario
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');
En algún momento se escribe un proceso ETL que realiza algunas actividades en la test
base de datos.
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*/
El etlUser no debe tener permisos para la Customer
tabla (y ciertamente no para la SensitiveData
columna), por lo que estos se niegan explícitamente anteriormente.
El proceso ETL se trunca, dbo.StagingTable
por lo que se le otorgan ALTER
permisos de tabla.
Esto se marca durante una auditoría de seguridad. ¿Qué tan peligroso es este escenario?
sql-server
permissions
Martin Smith
fuente
fuente
Respuestas:
Bastante peligroso ...
Además del permiso obvio para cambiar la estructura de
StagingTable
sí mismo, elALTER TABLE
permiso les permite crear desencadenantes en la tabla. Entonces, en este caso, a través del encadenamiento de propiedad, pueden ver datos confidenciales del cliente (a pesar de losDENY
permisos explícitos ) y realizar actos de vandalismo en esta segunda tabla.fuente
Además de poder agregar desencadenantes, el permiso ALTER TABLE también permite:
También permite eliminar columnas, pero es probable que no pase desapercibido (ya que parece que estamos buscando acciones potenciales aquí que sean más engañosas que maliciosas).
Afortunadamente, nunca es necesario otorgar este permiso a nadie, ni es necesario envolverlo en un procedimiento almacenado que use la
EXECUTE AS
cláusula (generalmente seguido de'dbo'
oOWNER
). La firma de módulos permite una fácil abstracción de acciones privilegiadas detrás del código firmado (procedimientos almacenados, disparadores, UDF escalares y TVF de múltiples declaraciones). Tengo un código de ejemplo que muestra cómo lograr esto en las siguientes respuestas, aquí en DBA.SE:La diferencia entre esas dos respuestas es el permiso otorgado al Usuario basado en firma. El permiso que se debe otorgar (o el rol de DB para agregar) depende del alcance de lo que se necesita. Si solo necesita permiso para una sola tabla, solo otorgue
ALTER
en esa tabla. Si se necesita permiso para todas las tablas en un Esquema específico, no otorgue permiso a tablas individuales, sino que otorgue el permiso al Esquema mismo. Y así.La firma del módulo son algunos pasos adicionales en comparación con la creación de un esquema específicamente para el usuario de ETL o el uso de la
EXECUTE AS
cláusula, pero:EXECUTE
permiso para ese código. Ser propietario de un esquema permite ciertos permisos implícitos que son innecesarios. Y, usarEXECUTE AS 'dbo'
oEXECUTE AS OWNER
(suponiendo que el propietario lo esdbo
) le dará a todo el proceso , desde ese momento en adelante,dbo
permisos, no solo el procedimiento almacenado / disparador / función con la que usóEXECUTE AS
. La firma del módulo limita los permisos solo al código que firmó, y no a ningún código invocado por el código firmado.fuente
Una mejor práctica sería crear un esquema de etapas, propiedad del usuario ETL. Luego, el proceso ETL puede truncar tablas, deshabilitar restricciones, realizar el cambio de partición, etc. dentro del esquema de preparación. El usuario ETL solo necesitaría un permiso limitado en los otros esquemas.
También puede usar una función de base de datos en lugar de un solo usuario.
Por supuesto, también puede permitir que su usuario limitado realice truncamientos de tabla con un procedimiento almacenado propiedad de dbo, como este:
fuente