{"id":617,"date":"2017-07-27T21:48:43","date_gmt":"2017-07-27T21:48:43","guid":{"rendered":"http:\/\/www.manualsqlserver.com\/?p=617"},"modified":"2021-03-20T20:26:43","modified_gmt":"2021-03-20T20:26:43","slug":"permisos-con-grant","status":"publish","type":"post","link":"https:\/\/manualsqlserver.com\/?p=617","title":{"rendered":"Asignar permisos en SQL Server &#8211; Grant"},"content":{"rendered":"\n<figure class=\"wp-block-image size-large\"><img loading=\"lazy\" decoding=\"async\" width=\"220\" height=\"228\" src=\"https:\/\/manualsqlserver.com\/wp-content\/uploads\/2020\/05\/ManualSQL_GrantD.png\" alt=\"\" class=\"wp-image-1340\"\/><\/figure>\n\n\n\n<h1 class=\"wp-block-heading\"><strong>Permisos en SQL Server &#8211; Grant<\/strong><\/h1>\n\n\n\n<p>El trabajo de la asignaci\u00f3n de permisos sobre los asegurables a las entidades de seguridad debe ser hecho de manera muy responsable, se debe planear con mucho cuidado que entidades de seguridad pertenecer\u00e1n a los diferentes roles de servidor y roles de base de datos.<\/p>\n\n\n\n<!--more-->\n\n\n\n<h2 class=\"wp-block-heading\"><strong>Conceptos importantes<\/strong><\/h2>\n\n\n\n<ul class=\"wp-block-list\"><li>Sobre los objetos de base de datos se pueden administrar los permisos de forma expl\u00edcita para que los usuarios accedan a ellos. Para conectarse a SQL Server se usan los inicios de sesi\u00f3n (<a href=\"https:\/\/manualsqlserver.com\/?p=540\">Ver Logins<\/a>) y para la asignaci\u00f3n de permisos sobre los asegurables de la base de datos se usan los usuarios de base de datos. (<a href=\"https:\/\/manualsqlserver.com\/?p=561\">Ver Usuarios de base de datos<\/a>)<\/li><li>Cada asegurable tiene permisos que se pueden otorgar a una entidad de seguridad mediante la instrucci\u00f3n de permiso Grant.<\/li><\/ul>\n\n\n\n<h2 class=\"wp-block-heading\"><strong>Principio de los privilegios m\u00ednimos<\/strong><\/h2>\n\n\n\n<ul class=\"wp-block-list\"><li>Existe el enfoque basado en cuenta de<strong> usuario de privilegios m\u00ednimos<\/strong> (LUA) para el desarrollar de aplicaciones lo que constituye una parte importante de una estrategia de defensa contra las amenazas a la seguridad.<\/li><li>El enfoque LUA garantiza que los usuarios de base de datos siguen el principio de los privilegios m\u00ednimos e inician sesi\u00f3n con cuentas de usuario limitadas ya sea en base a roles o de manera individual (por usuario).<\/li><li>Se pueden utilizar roles fijos del servidor o roles flexibles de servidor (desde SQL Server 2012).<\/li><li>Considere el uso del rol fijo del servidor sysadmin muy restringido.<\/li><li>Cuando conceda permisos a usuarios de base de datos, siga siempre el principio de los privilegios m\u00ednimos.<\/li><li>Otorgue a usuarios y roles los m\u00ednimos permisos necesarios para que puedan realizar una tarea concreta.<\/li><\/ul>\n\n\n\n<script async=\"\" src=\"\/\/pagead2.googlesyndication.com\/pagead\/js\/adsbygoogle.js\"><\/script>\n<ins class=\"adsbygoogle\" style=\"display:block; text-align:center;\" data-ad-layout=\"in-article\" data-ad-format=\"fluid\" data-ad-client=\"ca-pub-2636008503986218\" data-ad-slot=\"1902193434\"><\/ins>\n<script>\n     (adsbygoogle = window.adsbygoogle || []).push({});\n<\/script>\n\n\n\n<h2 class=\"wp-block-heading\"><strong>Permisos basados en roles<\/strong><\/h2>\n\n\n\n<ul class=\"wp-block-list\"><li>Administrar los permisos usando roles en lugar de a usuarios hace mas sencilla la administraci\u00f3n de la seguridad en SQL Server.<\/li><li>Los permisos asignados a roles se heredan por todos los miembros del rol.<\/li><li>Es m\u00e1s sencillo agregar o quitar usuarios de base de datos de un rol que volver a crear conjuntos de permisos distintos para cada usuario.<\/li><li>Se pueden anidar los roles, tenga cuidado con crear mucho niveles de anidamiento puede reducir el rendimiento.<\/li><li>Se pueden usar los roles fijos tanto de servidor como de base de datos para simplificar los permisos de asignaci\u00f3n.<\/li><li>Es una buena pr\u00e1ctica asignar los permisos a nivel de esquema. Los usuarios heredan autom\u00e1ticamente los permisos en todos los objetos nuevos creados en el esquema; no es necesario otorgar permisos cuando se crean objetos nuevos.<\/li><\/ul>\n\n\n\n<h2 class=\"wp-block-heading\"><strong>Permisos mediante c\u00f3digo basado en procedimiento<\/strong><\/h2>\n\n\n\n<ul class=\"wp-block-list\"><li>El encapsulamiento del acceso a los datos a trav\u00e9s de m\u00f3dulos tales como procedimientos almacenados y y funciones definidas por el usuario brinda un nivel de protecci\u00f3n adicional a la aplicaci\u00f3n.<\/li><li>Se puede evitar que los usuarios interact\u00faen directamente con objetos de la base de datos otorgando permisos solo a procedimientos almacenados o funciones, y denegando permisos a objetos subyacentes tales como tablas.<\/li><li>SQL Server lo consigue mediante encadenamiento de propiedad. Por ejemplo, se puede restringir los permisos de lectura de todos los objetos de la base de datos y dar permisos de ejecuci\u00f3n de los procedimientos almacenados. Si el usuario logra conectarse a SQL Server no ver\u00e1 ning\u00fan objeto<br>pero si podr\u00e1 ejecutar los procedimientos almacenados a los que se le ha asignado permiso de ejecuci\u00f3n.<\/li><\/ul>\n\n\n\n<h3 class=\"wp-block-heading\"><strong>Asignar permisos<\/strong><\/h3>\n\n\n\n<p><strong>Instrucci\u00f3n Grant<\/strong><br><strong>Asignar permisos de un asegurable a un principal.<\/strong><\/p>\n\n\n\n<p>Sintaxis:<\/p>\n\n\n\n<p>GRANT { ALL [ PRIVILEGES ] }<br>| Permisos [ ON [ clase :: ] asegurable ] TO principal [ ,&#8230;n ]<br>[ WITH GRANT OPTION ]<\/p>\n\n\n\n<p><strong>Donde<\/strong><br><strong>All<\/strong> Opci\u00f3n que se mantienen por compatibilidad con versiones anteriores. Se incluye Privileges para compatibilidad con ISO.<\/p>\n\n\n\n<p><strong>Importante<\/strong><\/p>\n\n\n\n<ul class=\"wp-block-list\"><li>Si el asegurable es base de datos, ALL asigna BACKUP DATABASE, BACKUP LOG, CREATE DATABASE, CREATE DEFAULT, CREATE FUNCTION, CREATE PROCEDURE, CREATE RULE, CREATE TABLE y CREATE VIEW.<\/li><li>Si el asegurable es funci\u00f3n escalar, ALL asigna EXECUTE y REFERENCES.<\/li><li>Si el asegurable es funci\u00f3n que retorna una tabla, ALL asigna DELETE, INSERT, REFERENCES, SELECT y UPDATE.<\/li><li>Si el asegurable es procedimiento almacenado, ALL asigna EXECUTE.<\/li><li>Si el asegurable es tabla, ALL asigna DELETE, INSERT, REFERENCES, SELECT y UPDATE.<\/li><li>Si el asegurable es Vista, ALL asigna DELETE, INSERT, REFERENCES, SELECT y UPDATE.<\/li><\/ul>\n\n\n\n<p><strong>Permisos<\/strong>: la lista de permisos para el asegurable.<br><strong>Clase<\/strong>: especifica el tipo de objeto.<br><strong>asegurable<\/strong>: es el nombre del objeto asegurable.<br><strong>To principal<\/strong>: el principal que se le asignar\u00e1n los permisos.<br><strong>with grant Option<\/strong> significa que al principal al que se le asignan los permisos puede tambi\u00e9n asignar los permisos a otros.<\/p>\n\n\n\n<p style=\"font-size:28px\"><strong>Grant para algunos asegurables<\/strong><\/p>\n\n\n\n<p><strong>Para hacer los ejercicios se incluir\u00e1 sintaxis separadas<\/strong>, la lista de permisos para cada asegurable es amplia y las opciones de Grant son muchas mas de las que se muestran en este art\u00edculo, para informaci\u00f3n completa se sugiere ir a la informaci\u00f3n oficial de Microsoft.<\/p>\n\n\n\n<p><strong>1. Grant con Base de datos<\/strong><br>Grant Permisos to Principal [ WITH GRANT OPTION ]<\/p>\n\n\n\n<p><strong>2. Grant con Procedimientos Almacenados<\/strong><br>Grant Execute on Object::NombreProcedimiento to Principal [ WITH GRANT OPTION ]<\/p>\n\n\n\n<p><strong>3. Grant con Vista, Tabla, Sin\u00f3nimo o funci\u00f3n definida por el usuario<\/strong><br>Grant Permisos on Object::[NombreEsquema.]NombreObjeto to Principal [ WITH GRANT OPTION ]<\/p>\n\n\n\n<p><strong>4. Grant en un esquema<\/strong><br>Grant Permisos on Schema::NombreEsquema to Principal [ WITH GRANT OPTION ]<\/p>\n\n\n\n<p><strong>5. Grant con Tipos definidos por el usuario<\/strong><br>Grant Permisos on Type::[NombreEsquema.]NombreTipo to Principal [ WITH GRANT OPTION ]<br>Nota: Los permisos pueden ser References o View Definition<\/p>\n\n\n\n<h2 class=\"wp-block-heading\"><strong>Ejemplos<\/strong><\/h2>\n\n\n\n<p><strong>Ejercicio 1<\/strong><br><strong>Crear en AdventureWorks un usuario AsistenteRH en base a un login del mismo nombre que tenga permisos de lectura y escritura en el esquema Person<\/strong><\/p>\n\n\n\n<p>use master<br>go<br>create login AsistenteRH with password = &#8216;123&#8217;<br>go<br>use AdventureWorks<br>go<br>create user AsistenteRH from login AsistenteRH<br>go<br>&#8212; Permisos<br>Grant Select, Update on Schema::Person to AsistenteRH<br>Deny Insert, Delete on Schema::Person to AsistenteRH<br>go<\/p>\n\n\n\n<p><strong>Ejercicio 2<\/strong><br><strong>Crear un inicio para Northwind llamado Capataz en base al mismo login Asignar permisos de Lectura, Inserci\u00f3n y Actualizaci\u00f3n en toda la BD<\/strong><\/p>\n\n\n\n<p>use master<br>go<br>Create login Capataz with password = &#8216;123&#8217;<br>go<br>use Northwind<br>go<br>Create user Capataz from login Capataz<br>go<br>grant select, Insert, Update to Capataz<br>Deny delete to Capataz<br>go<\/p>\n\n\n\n<p><strong>Ejercicio 3<\/strong><br><strong>Crear un usuario Auditor, asignar permiso de lectura en la BD y hacerlo miembro de db_backupoperator<\/strong><br><strong>Al login hacerlo miembro de [processadmin]<\/strong><\/p>\n\n\n\n<p>use master<br>go<br>create login Auditor with password = &#8216;123&#8217;<br>go<br>Alter server role processadmin add member Auditor<br>go<br>use Northwind<br>go<br>create user Auditor from login Auditor<br>go<br>Grant Select to Auditor<br>Deny Insert, Delete, Update to Auditor<br>go<br>Alter role db_backupoperator add member Auditor<br>go<\/p>\n\n\n\n<p><strong>Ejercicio 4<\/strong><br><strong>Crear un usuario AsistenteVentas usando un login con el mismo nombre en AdventureWorks que tengo permisos de lectura, modificaci\u00f3n, inserci\u00f3n en el esquema Sales (Ventas)<\/strong><br><strong>Denegar Eliminaci\u00f3n.<\/strong><\/p>\n\n\n\n<p>use master<br>go<br>create login AsistenteVentas with password = &#8216;123&#8217;<br>go<br>use AdventureWorks<br>go<br>Create user AsistenteVentas from login AsistenteVentas<br>go<br>Grant Select, Update, Insert on Schema::Sales to AsistenteVentas<br>Deny Delete on Schema::Sales to AsistenteVentas<br>go<\/p>\n\n\n\n<p><strong>Incluir para AsistenteVentas la lectura de la tabla [HumanResources].[Employee]<\/strong><\/p>\n\n\n\n<p>use AdventureWorks<br>go<br>Grant Select on Object::HumanResources.Employee to AsistenteVentas<br>Deny Insert, Update, Delete on Object::HumanResources.Employee to AsistenteVentas<br>go<\/p>\n\n\n\n<script async=\"\" src=\"\/\/pagead2.googlesyndication.com\/pagead\/js\/adsbygoogle.js\"><\/script>\n<ins class=\"adsbygoogle\" style=\"display:block; text-align:center;\" data-ad-layout=\"in-article\" data-ad-format=\"fluid\" data-ad-client=\"ca-pub-2636008503986218\" data-ad-slot=\"1902193434\"><\/ins>\n<script>\n     (adsbygoogle = window.adsbygoogle || []).push({});\n<\/script>\n\n\n\n<p><strong>Ejercicio 5<\/strong><br><strong>Usando Northwind<\/strong><br>use Northwind<br>go<\/p>\n\n\n\n<p><strong>Crear un SP que liste s\u00f3lo Id, Descripci\u00f3n, Precio y Stock de Productos, luego crear un usuario Reportes que tenga permiso \u00fanicamente al SP creado<\/strong><br><strong>Permiso en un SP es: EXECUTE<\/strong><\/p>\n\n\n\n<p>Create procedure spProductosListado<br>As<br>SELECT ProductID, ProductName, UnitPrice,<br>UnitsInStock from Products<br>go<\/p>\n\n\n\n<p>use master<br>go<br>Create login Reportes with password = &#8216;123&#8217;<br>go<br>use Northwind<br>create user Reportes from login Reportes<br>go<br>Deny Select, insert, Update, Delete to Reportes<br>Grant Execute on object::dbo.spProductosListado to Reportes<br>go<\/p>\n","protected":false},"excerpt":{"rendered":"<p>Permisos en SQL Server &#8211; Grant El trabajo de la asignaci\u00f3n de permisos sobre los asegurables a las entidades de seguridad debe ser hecho de manera muy responsable, se debe planear con mucho cuidado que entidades de seguridad pertenecer\u00e1n a los diferentes roles de servidor y roles de base de datos.<\/p><p><a class=\"more-link btn\" href=\"https:\/\/manualsqlserver.com\/?p=617\">Seguir leyendo<\/a><\/p>\n","protected":false},"author":1,"featured_media":1340,"comment_status":"closed","ping_status":"closed","sticky":false,"template":"","format":"standard","meta":{"footnotes":""},"categories":[5,8,9,10],"tags":[28,46,47,57],"class_list":["post-617","post","type-post","status-publish","format-standard","has-post-thumbnail","hentry","category-esquemastablas","category-programacion","category-registros-vistas","category-seguridad","tag-esquemas","tag-particion","tag-permisos","tag-tablas","nodate","item-wrap"],"_links":{"self":[{"href":"https:\/\/manualsqlserver.com\/index.php?rest_route=\/wp\/v2\/posts\/617","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/manualsqlserver.com\/index.php?rest_route=\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/manualsqlserver.com\/index.php?rest_route=\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/manualsqlserver.com\/index.php?rest_route=\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/manualsqlserver.com\/index.php?rest_route=%2Fwp%2Fv2%2Fcomments&post=617"}],"version-history":[{"count":2,"href":"https:\/\/manualsqlserver.com\/index.php?rest_route=\/wp\/v2\/posts\/617\/revisions"}],"predecessor-version":[{"id":2543,"href":"https:\/\/manualsqlserver.com\/index.php?rest_route=\/wp\/v2\/posts\/617\/revisions\/2543"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/manualsqlserver.com\/index.php?rest_route=\/wp\/v2\/media\/1340"}],"wp:attachment":[{"href":"https:\/\/manualsqlserver.com\/index.php?rest_route=%2Fwp%2Fv2%2Fmedia&parent=617"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/manualsqlserver.com\/index.php?rest_route=%2Fwp%2Fv2%2Fcategories&post=617"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/manualsqlserver.com\/index.php?rest_route=%2Fwp%2Fv2%2Ftags&post=617"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}