it-swarm.com.de

Erstellen Sie eine Tabellenberechtigung für einen Benutzer in einem bestimmten Schema

Ich möchte Benutzer A die Berechtigung zum Erstellen, Ändern und Löschen eines Schemas1 einer Datenbank erteilen. Ich denke, diese Frage wurde bereits gestellt, und ich habe festgestellt, dass ich dem Schema eine Änderung gewähren und dem Benutzer A auch eine Erstellungs-Tabelle gewähren soll: GRANT ALTER, DELETE, EXECUTE, INSERT, SELECT, UPDATE ON SCHEMA::schema1 TO user A;

GRANT CREATE TABLE TO User A;

Wenn dies richtig ist, kann der Benutzer A dann auch Tabellen in anderen Schemas erstellen?

4
joeprince

Ich möchte Benutzer A die Berechtigung zum Erstellen, Ändern und Löschen eines Schemas1 einer Datenbank erteilen

Der sichere Weg, dies zu tun, besteht darin, einen Eigentümer dieses Schemas zu machen.

Wenn Sie einem Benutzer die Möglichkeit geben, das Schema eines anderen Benutzers zu ändern, kann dieser Benutzer Zeilen in jeder Tabelle auswählen, einfügen, aktualisieren und löschen, die dem Eigentümer dieses Schemas gehört. Dies wird als "Ownership Chaining" bezeichnet. Dies macht Ansichten und gespeicherte Prozeduren zu einer wirklich einfachen Möglichkeit, die Sicherheit zu steuern, da einem Benutzer, der über Berechtigungen für eine Ansicht oder eine gespeicherte Prozedur verfügt, keine Berechtigungen für die zugrunde liegende Tabelle erteilt werden müssen, solange die View/Proc hat denselben Eigentümer wie die Tabelle.

In diesem Szenario können Sie jedoch problemlos eine Sicherheitslücke mit Besitzerketten erstellen. Im Allgemeinen möchten Sie niemals, dass ein Benutzer Objekte erstellen kann, die einem anderen (und insbesondere einem privilegierten) Benutzer gehören.

Wenn Sie nur CREATE TABLE, ALTER und INSERT gewähren, entsteht eine Sicherheitslücke:

use master
--drop database security_test
go
create database security_test
go
use security_test 
go

create schema schema1 authorization dbo
go
create user A without login
go
grant create table to A
grant alter, insert on schema::schema1 to A
go
create table dbo.secret(id int, msg varchar(200))
insert into dbo.secret(id,msg) values (1, 'secret data')
go
execute as user='A'

create table schema1.foo(id int)

go
create trigger t on schema1.foo after insert
as
begin
  select * from dbo.secret 
end

go

insert into schema1.foo(id) values (1)


go

revert

ausgänge

id          msg
----------- -----
1           secret data

Ja, Sie müssen die Berechtigung zum Erstellen einer Tabelle auf Datenbankebene erteilen. Wenn einem Benutzer beispielsweise die zum Erstellen einer Tabelle erforderlichen Berechtigungen erteilt werden, er jedoch nicht über die erforderlichen Berechtigungen verfügt, um dies in einem bestimmten Schema zu tun, kann er hier kein Tablet erstellen.

3
user103326

Nein, wenn Sie kein Schema angeben, das er ändern kann, und ihn einfach GRANT CREATE TABLE zu Benutzer A hinzufügen, können Sie nirgendwo eine Tabelle erstellen.

Sie müssen ein Schema angeben, das er ändern kann, um die Berechtigung CREATE TABLE zu aktivieren. Schließlich wird das Hinzufügen/Entfernen von Tabellen zum Schema als Schemaänderung betrachtet, und jedes Mal, wenn Sie eine DDL ausführen, benötigt der SQL Server eine Sch-M-Sperre, bei der es sich im Wesentlichen um eine Schemaänderung handelt

1
S4V1N