sqlschool.gr logo

articles

Articles of SQLschool.gr Team

Database owner Vs db_owner database role

Antonios Chatzipavlis
Friday 29 July 2016

Δεν είναι λίγοι αυτοί που πιστεύουν ότι το να είναι κάποιος database owner είναι το ίδιο με το να ανήκει στο database role db_owner. Η απάντηση είναι ότι δεν είναι, αν και σε πρώτη ανάγνωση έτσι φαίνεται.

Η ουσιαστική διαφορά είναι ότι ο πρώτος είναι ο πραγματικός owner και μπορεί να κάνει τα πάντα στην database. Εξάλλου μην ξεχνάμε ότι όποιος είναι sysadmin στο SQL Server instance στην κάθε database "μπαίνει" σαν dbo, που είναι ο database owner.

Όποιον έχουμε βάλει στο database role db_owner απλά του έχουμε εκχωρήσει το δικαίωμα να κάνει τα πάντα χωρίς όμως αυτό να σημαίνει ότι από αυτά τα πάντα δεν μπορούμε να του κόψουμε κάποια.

Για του λόγου το αληθές δοκιμάστε το παρακάτω script.

Στο step 1 δημιουργώ  δύο SQL Logins χωρίς κανένα δικαίωμα σε επίπεδο instance και μια demo database με τα defaults.

Στο step 2 αναθέτω στον user1 να είναι database owner στην demo database

Στο step 3 δίνω το δικαίωμα να μπορεί να χρησιμοποιεί την demo database στο user2 και μάλιστα με δικαιώματα dbo καθώς το κάνω μέλος στο db_owner database role.

Στο step 4 είναι η πρώτη αποκάλυψη της αλήθειας καθώς φαίνεται ξεκάθαρα ότι ο user1 είναι dbo δηλαδή ενώ ο user2 είναι απλά ο user2.

Στο step 5 δημιουργώ έναν πίνακα και βάζω δύο records

Όπως είναι φυσικό (step 6) και οι δύο χρήστες μπορούν να κάνουν τα ίδια πχ SELECT.

Αν προσπαθήσω στο user1 (step 7) να αφαιρέσω το δικαίωμα του SELECT δεν με αφήνει να το κάνω  διότι είναι database owner και φυσικά συνεχίζει να διαβάζει κανονικά τα δεδομένα και όχι μόνο.

Αν όμως στον user2 (step 8) δοκιμάσω να αφαιρέσω το δικαίωμα του SELECT αυτό γίνεται και φυσικά ο user2 δεν μπορεί να διαβάσει δεδομένα παρόλο που ανήκει στο db_owner database role!!!.

To τελικό συμπέρασμα είναι ότι πρέπει να είμαστε προσεκτικοί στο ποιον χρήστη βάζουμε να είναι database owner καθώς σε ένα περιβάλλον που ζητάει μόνο τα απαραίτητα δικαιώματα στους χρήστες αυτό είναι μαχαιριά στην πλάτη.

Ακόμα και το εύκολο βήμα να βάζουμε το SA σαν dbo δεν είναι καλό αλλά από άποψη συντήρησης είναι και αυτό διότι είναι sysadmin.

Μια καλή εναλλακτική λύση για αυτό είναι να δημιουργηθεί ένας απλός χρήστης στο SQL Server στον οποίο να αφαιρέσουμε το δικαίωμα CONNECT και αυτόν να βάζουμε σαν dbo σε κάθε database. Μπορεί να μας δυσκολέψει λίγο σε πιθανά restores σε άλλον server αλλά μπροστά στην ασφάλεια αξίζει το να σπαταλήσει κάποιος 5 λεπτά περισσότερο σε μια τέτοια περίπτωση.

Μπορεί να φανεί υπερβολικό αυτό σε αρκετούς όμως όταν στα χέρια σου είναι δεδομένα που κοστίζουν πολλά εκατομμύρια καλό είναι να είσαι προσεκτικός σε κάθε λεπτομέρεια ακόμα και αν σου κολλήσουν την ρετσινιά του παρανοϊκού. Καλύτερα αυτό παρά κάπου αλλού.

-- step 1

USE [master]
GO
CREATE LOGIN [user1] WITH PASSWORD=N'P@ssw0rd', DEFAULT_DATABASE=[master], CHECK_EXPIRATION=OFF, CHECK_POLICY=ON
GO
CREATE LOGIN [user2] WITH PASSWORD=N'P@ssw0rd', DEFAULT_DATABASE=[master], CHECK_EXPIRATION=OFF, CHECK_POLICY=ON
GO
CREATE DATABASE demo
GO

-- step 2

USE demo
go
EXEC dbo.sp_changedbowner @loginame = N'user1', @map = false
GO

-- step 3

CREATE USER [user2] FOR LOGIN [user2]
GO
ALTER ROLE [db_owner] ADD MEMBER [user2]
GO

-- step 4

EXECUTE AS LOGIN='user1';
SELECT USER_NAME()
REVERT;
GO

EXECUTE AS LOGIN='user2';
SELECT USER_NAME()
REVERT;
GO

-- step 5
CREATE TABLE T(COL1 INT,COL2 NVARCHAR(100));
GO

INSERT INTO T VALUES (1,'ANTONIOS CHATZIPAVLIS'),(2,'SQLSCHOOL.GR')
GO

SELECT * FROM T;
GO

-- step 6
EXECUTE AS LOGIN='user1';
SELECT * FROM T;
REVERT;
GO

EXECUTE AS LOGIN='user2';
SELECT * FROM T;
REVERT;
GO

-- step 7
DENY SELECT ON T TO USER1;
GO
EXECUTE AS LOGIN='user1';
SELECT * FROM T;
REVERT;
GO

-- step 8
DENY SELECT ON T TO USER2;
GO

EXECUTE AS LOGIN='user2';
SELECT * FROM T;
REVERT;
GO

Comments

29 Jul 2016 @ 9:52 AM

user-gravatar

sowmiya

This blog is really useful and it is very well nice and informative thus it is really awesomw and very well nice . it is really good too and very much interesting

Antonios Chatzipavlis

Antonios Chatzipavlis

Antonios is a Data Solutions Consultant and Trainer. He has been working in IT since 1988. In his career, he has worked as senior developer, IT Manager, Solutions Architect and IT Consultant. Since 1995 he has been devoted on new technologies and software development tools, mainly by Microsoft, either by training company staff and colleagues or assisting them in design, development and implementation as a consultant or chief developer. He has focused in Databases and Data Science since 1995. He specialized in Microsoft SQL Server since version 6.0 in areas like SQL Server Internals, Database Design and Development, Business Intelligence and in 2010 he has started working with Azure Data Platform, NoSQL databases, Big Data Technologies and Machine Learning. He is an active member of many IT communities in Greece, answering colleagues' questions and writing articles in his web site. He is the owner of SQLschool.gr which is a community portal with a lot of information about Microsoft SQL Server. He has been a Microsoft Certified Trainer (MCT) since 2000. Microsoft honored him as MVP on Data Platform due to his activities in SQL Server since 2010. He holds a large number of Microsoft Certifications and Microsoft SQL Server Certifications since version 6.5.

Episode

First look: SQL Database in Microsoft Fabric

image

More Episodes...

Tip

What's New in SQL Server 2022 - Episodes

More Tips...

Become a member

If you want to receive updates from us become a member to our community.

Connect

Explore

Learn


sqlschool.gr © 2010-2024 All rights reserved

This site uses cookies for operational and analytics purposes only. By continuing to browse this site, you agree to their use.