{"id":639,"date":"2017-08-03T20:36:29","date_gmt":"2017-08-03T20:36:29","guid":{"rendered":"http:\/\/www.manualsqlserver.com\/?p=639"},"modified":"2020-05-20T18:37:51","modified_gmt":"2020-05-20T18:37:51","slug":"denegar-permisos-deny","status":"publish","type":"post","link":"https:\/\/manualsqlserver.com\/?p=639","title":{"rendered":"Denegar permisos &#8211; Deny"},"content":{"rendered":"\n<figure class=\"wp-block-image size-large\"><img loading=\"lazy\" decoding=\"async\" width=\"220\" height=\"264\" src=\"https:\/\/manualsqlserver.com\/wp-content\/uploads\/2020\/05\/ManualSQL_Deny_D.png\" alt=\"\" class=\"wp-image-1327\"\/><\/figure>\n\n\n\n<h1 class=\"wp-block-heading\"><strong>Denegar Permisos en SQL Server<\/strong><\/h1>\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\u00a0para que los usuarios accedan a ellos. (<a href=\"https:\/\/manualsqlserver.com\/?p=540\">Ver Logins<\/a>) (<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 (<a href=\"https:\/\/manualsqlserver.com\/?p=617\">Ver Asignar permisos con Grant<\/a>) y para quitar los permisos se debe utilizar Deny.<\/li><\/ul>\n\n\n\n<!--more-->\n\n\n\n<script async src=\"\/\/pagead2.googlesyndication.com\/pagead\/js\/adsbygoogle.js\"><\/script>\n<ins class=\"adsbygoogle\"\n     style=\"display:block; text-align:center;\"\n     data-ad-layout=\"in-article\"\n     data-ad-format=\"fluid\"\n     data-ad-client=\"ca-pub-2636008503986218\"\n     data-ad-slot=\"1902193434\"><\/ins>\n<script>\n     (adsbygoogle = window.adsbygoogle || []).push({});\n<\/script>\n\n\n\n<p>Los siguientes p\u00e1rrafos corresponden a la explicaci\u00f3n del art\u00edculo donde se asignan los permisos con Grant. (<a href=\"http:\/\/www.manualsqlserver.com\/?p=617\">Ver Permisos Grant<\/a>)<\/p>\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 usuario de privilegios m\u00ednimos (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&nbsp;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). (<a href=\"http:\/\/www.manualsqlserver.com\/?p=529\">Ver Roles de Servidor<\/a>)<\/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<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 datis 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 a 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 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 <a href=\"http:\/\/www.manualsqlserver.com\/?p=314\">procedimientos almacenados<\/a> 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<h2 class=\"wp-block-heading\"><strong>Denegar permisos<\/strong><\/h2>\n\n\n\n<p><strong>Instrucci\u00f3n Deny<\/strong><\/p>\n\n\n\n<p><strong>Deniega permisos de un asegurable a un principal. Evita que la entidad de seguridad herede permisos por su pertenencia a grupos o roles.<\/strong><br><strong>Sintaxis:<\/strong><\/p>\n\n\n\n<p>Deny { ALL [ PRIVILEGES ] }<br>| Permisos [ ON [ clase :: ] asegurable ] TO principal [ ,&#8230;n ]<\/p>\n\n\n\n<p><strong>Donde<\/strong><br>All Opci\u00f3n que se mantienen por compatibilidad con versiones anteriores.<br>Se incluye Privileges para compatibilidad con ISO.<br>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.<br>Si el asegurable es funci\u00f3n escalar, ALL asigna EXECUTE y REFERENCES.<br>Si el asegurable es funci\u00f3n que retorna una tabla, ALL asigna DELETE, INSERT, REFERENCES, SELECT y UPDATE.<br>Si el asegurable es procedimiento almacenado, ALL asigna EXECUTE.<br>Si el asegurable es tabla, ALL asigna DELETE, INSERT, REFERENCES, SELECT y UPDATE.<br>Si el asegurable es Vista, ALL asigna DELETE, INSERT, REFERENCES, SELECT y UPDATE.<\/p>\n\n\n\n<p>Permisos: la lista de permisos a denegar sobre el asegurable.<br>Clase: especifica el tipo de objeto.<br>asegurable: es el nombre del objeto asegurable.<br>To principal: el principal que se le denegar\u00e1n los permisos.<\/p>\n\n\n\n<p><strong>Para hacer los ejercicios se incluir\u00e1 sintaxis separadas<\/strong><\/p>\n\n\n\n<p><strong>1. Deny con Base de datos<\/strong><br>Deny Permisos to Principal<\/p>\n\n\n\n<p><strong>2. Deny con Procedimientos Almacenados<\/strong><br>Deny Execute on Object::NombreProcedimiento to Principal<\/p>\n\n\n\n<p><strong>3. Deny con Vista, Tabla, Sin\u00f3nimo o funci\u00f3n definida por el usuario<\/strong><br>Deny Permisos on Object::[NombreEsquema.]NombreObjeto to Principal<\/p>\n\n\n\n<p><strong>4. Deny en un esquema<\/strong><br>Deny Permisos on Schema::NombreEsquema to Principal<\/p>\n\n\n\n<p><strong>5. Deny con Tipos definidos por el usuario<\/strong><br>Deny Permisos on Type::[NombreEsquema.]NombreTipo to Principal<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 <\/strong><br><strong>nombre que tenga permisos de lectura y escritura en el esquema Person.<\/strong><br><strong>Denegar el los permisos para insertar, modificar y eliminar.<\/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<\/strong><br><strong>Asignar permisos de Lectura, Inserci\u00f3n y Actualizaci\u00f3n en toda la BD<\/strong><br><strong>Denegar el permiso de Eliminaci\u00f3n.<\/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]. Denegar el permiso de insertar, eliminar y modificar.<\/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<script async src=\"\/\/pagead2.googlesyndication.com\/pagead\/js\/adsbygoogle.js\"><\/script>\n<ins class=\"adsbygoogle\"\n     style=\"display:block; text-align:center;\"\n     data-ad-layout=\"in-article\"\n     data-ad-format=\"fluid\"\n     data-ad-client=\"ca-pub-2636008503986218\"\n     data-ad-slot=\"1902193434\"><\/ins>\n<script>\n     (adsbygoogle = window.adsbygoogle || []).push({});\n<\/script>\n\n\n\n<p>E<strong>jercicio 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<p><strong>Ejercicio 5<\/strong><br><strong>Usando Northwind<\/strong><br><strong>use Northwind<\/strong><br><strong>go<\/strong><\/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>Denegar los permisos en la tabla productos de listado, inserci\u00f3n, modificaci\u00f3n y eliminaci\u00f3n.<\/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\n\n\n<p><strong>Ejercicio 6<\/strong><br><strong>Usando AdventureWorks.<\/strong><br><strong>Crear un usuario llamado Contable que tenga acceso s\u00f3lo a los esquemas Person y HumanResorces, asegurar que no pueda ver los otros esquemas y que en los esquemas que tiene permisos no pueda modificar ni eliminar los registros.<\/strong><\/p>\n\n\n\n<p>use master<br>go<br>Create login Contable with password = &#8216;123&#8217;<br>go<br>use AdventureWorks<br>go<br>Create user Contable from login Contable<br>go<br>Grant select, insert on schema::Person to Contable<br>Grant select, insert on schema::HumanResources to Contable<br>Deny update, delete on schema::HumanResources to Contable<br>Deny update, delete on schema::Person to Contable<br>Deny select, insert, update, delete on schema::Production to Contable<br>Deny select, insert, update, delete on schema::Purchasing to Contable<br>Deny select, insert, update, delete on schema::Sales to Contable<br>Deny select, insert, update, delete on schema::dbo to Contable<br>go<\/p>\n","protected":false},"excerpt":{"rendered":"<p>Denegar Permisos en SQL Server Sobre los objetos de base de datos se pueden administrar los permisos de forma expl\u00edcita\u00a0para que los usuarios accedan a ellos. (Ver Logins) (Ver Usuarios de base de datos) Cada asegurable tiene permisos que se pueden otorgar a una entidad de seguridad mediante la instrucci\u00f3n de permiso Grant (Ver Asignar &hellip; <\/p>\n<p><a class=\"more-link btn\" href=\"https:\/\/manualsqlserver.com\/?p=639\">Seguir leyendo<\/a><\/p>\n","protected":false},"author":1,"featured_media":1327,"comment_status":"closed","ping_status":"closed","sticky":false,"template":"","format":"standard","meta":{"footnotes":""},"categories":[5,8,10],"tags":[17,21,26,28,33,46,47,57],"class_list":["post-639","post","type-post","status-publish","format-standard","has-post-thumbnail","hentry","category-esquemastablas","category-programacion","category-seguridad","tag-create-login","tag-create-user","tag-deny","tag-esquemas","tag-grant","tag-particion","tag-permisos","tag-tablas","nodate","item-wrap"],"_links":{"self":[{"href":"https:\/\/manualsqlserver.com\/index.php?rest_route=\/wp\/v2\/posts\/639","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=639"}],"version-history":[{"count":1,"href":"https:\/\/manualsqlserver.com\/index.php?rest_route=\/wp\/v2\/posts\/639\/revisions"}],"predecessor-version":[{"id":1329,"href":"https:\/\/manualsqlserver.com\/index.php?rest_route=\/wp\/v2\/posts\/639\/revisions\/1329"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/manualsqlserver.com\/index.php?rest_route=\/wp\/v2\/media\/1327"}],"wp:attachment":[{"href":"https:\/\/manualsqlserver.com\/index.php?rest_route=%2Fwp%2Fv2%2Fmedia&parent=639"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/manualsqlserver.com\/index.php?rest_route=%2Fwp%2Fv2%2Fcategories&post=639"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/manualsqlserver.com\/index.php?rest_route=%2Fwp%2Fv2%2Ftags&post=639"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}