Share via


Seguridad de nivel de columna

La seguridad de nivel de columna permite a los clientes controlar el acceso a columnas de tablas según el contexto de ejecución del usuario o su pertenencia a grupos.

La seguridad de nivel de columna simplifica el diseño y la codificación de la seguridad de la aplicación y esto le permite restringir el acceso a las columnas para proteger información confidencial. Por ejemplo, garantiza que determinados usuarios puedan acceder solo a ciertas columnas de una tabla pertenecientes a su departamento. La lógica de la restricción de acceso está ubicada en el nivel de base de datos en lugar de estar alejado de los datos en otro nivel de aplicación. La base de datos aplica las restricciones de acceso cada vez que se intenta acceder a los datos desde cualquier nivel. Esta restricción hace que la seguridad resulte más sólida y confiable, ya que reduce el área expuesta del sistema de seguridad global. Además, la seguridad de nivel de columna también elimina la necesidad de introducir vistas para filtrar las columnas a fin de imponer restricciones de acceso a los usuarios.

Puede implementar la seguridad de nivel de columna con la instrucción de T-SQL CONCEDER permisos de objeto. Con este mecanismo, se admite la autenticación tanto con SQL como con Microsoft Entra ID (anteriormente Azure Active Directory).

Considere también la posibilidad de aplicar la Seguridad de nivel de fila en las tablas, en función de un filtro de cláusulas WHERE.

En el diagrama se muestra una tabla esquemática con la primera columna encabezada por un candado cerrado, cuyas celdas son de color naranja, mientras que las celdas de las demás columnas son blancas.

Syntax

La sintaxis de la instrucción GRANT para los permisos de objeto permite conceder permisos a las listas de columnas delimitadas por comas en una tabla.

GRANT <permission> [ ,...n ] ON
    [ OBJECT :: ][ schema_name ]. object_name [ ( column [ ,...n ] ) ]
    TO <database_principal> [ ,...n ]
    [ WITH GRANT OPTION ]
    [ AS <database_principal> ]
<permission> ::=
    SELECT
  | UPDATE
<database_principal> ::=
      Database_user
    | Database_role
    | Database_user_mapped_to_Windows_User
    | Database_user_mapped_to_Windows_Group

Ejemplos

En el ejemplo siguiente, se muestra cómo impedir que TestUser acceda a la columna SSN de la tabla Membership:

Cree la tabla Membership con la columna SSN destinada a almacenar números del seguro social:

CREATE TABLE Membership
  (MemberID int IDENTITY,
   FirstName varchar(100) NULL,
   SSN char(9) NOT NULL,
   LastName varchar(100) NOT NULL,
   Phone varchar(12) NULL,
   Email varchar(100) NULL);

Permita que TestUser acceda a todas las columnas excepto a la columna SSN, que contiene información confidencial:

GRANT SELECT ON Membership(MemberID, FirstName, LastName, Phone, Email) TO TestUser;

Las consultas ejecutadas como TestUser producirán un error si incluyen la columna SSN:

SELECT * FROM Membership;

Con el error resultante:

Msg 230, Level 14, State 1, Line 12
The SELECT permission was denied on the column 'SSN' of the object 'Membership', database 'CLS_TestDW', schema 'dbo'.

Casos de uso

Estos son algunos ejemplos de cómo se usa la seguridad de nivel de columna en la actualidad:

  • Una empresa de servicios financieros solo permite a los administradores de cuentas obtener acceso a los números del seguro social (SSN), números de teléfono y otros datos personales del cliente.
  • Un profesional sanitario solo permite a los médicos y a las enfermeras acceder a los historiales médicos confidenciales mientras que impide ver estos datos a los miembros del departamento de facturación.

Pasos siguientes