Tworząc bazę danych dla SmogBota, mimo że jest ona stosunkowo niewielka jeśli chodzi o złożoność i ilość obiektów, postanowiłem zaimplementować kilka dobrych praktyk i pokazać w jaki sposób można zwiększyć bezpieczeństwo takowej bazy, nie męcząc się zbytnio :)
Całość mechanizmu jest prosta i przejrzysta a opiera się to na schema bazodanowych.
Przykładowo, baza SmogBota ma trzy schema:
- dbo – tutaj znajdują się tabele z danymi oraz wewnętrzne funkcje pomocnicze. W większy projektach nie używam dbo, tworzę natomiast kilka schema które grupują poszczególne obszary systemu.
- Bot – w tym schema zawarte są wszystkie obiekty (w praktyce tylko widoki i stored procedures), do których powinien mieć dostęp bot.
- Updater – jak wyżej, tyle że dotyczy updatera do aktualizacji danych pomiarowych.
Schema tworzymy poprzez polecenie:
CREATE SCHEMA [Bot] AUTHORIZATION [dbo];
To sprawia, że wszelkie obiekty w ramach schema Bot będą miały dostęp do obiektów w schema dbo (w dość dużym uproszczeniu).
W większych systemach lubię tworzyć takowe schema dla każdego komponentu, który ma mieć dostęp do bazy danych – to zapewnia po pierwsze przejrzystość – łatwo sprawdzić do czego ma dostęp dany komponent, a po drugie – komponent ma dostęp tylko do rzeczy zawartych w jego schema, a więc mamy pewność, że nie będzie miał wpływu na resztę bazy.
Dla każdego schema tworzę zazwyczaj osobny login, np. dla bota:
CREATE LOGIN [Bot] WITH PASSWORD = 'hasło'; GO;
Oczywiście, w miarę dostepności, polecam tworzenie loginów w oparciu o Active Directory i Managed Service Accounts, ale to temat na inny wpis.
Natępnie tworzę odpowiadającego mu użytkownika w danej bazie danych:
USE [SmogBot]; GO; CREATE USER [Bot] FROM LOGIN [Bot] WITH DEFAULT_SCHEMA = [Bot];
A następnie przyznaję mu uprawnienia do odpowiadającego mu schema:
GRANT SELECT ON SCHEMA::Bot TO Bot; GRANT EXECUTE ON SCHEMA::Bot TO Bot;
Efektem powyższych poleceń jest stan , który umożliwia dostęp tylko do niezbędnych dla danego loginu obiektów bazodanowych z minimum uprawnień.
Należy także zwrócić uwagę, że mechanizm ten w przyszłości nie wymaga żadnej dodatkowej opieki – wystarczy tworzyć obiekty w odpowiednim schema i poszczególne komponenty mają od razu do nich dostęp.
System powyższy można oczywiście rozbudować np. o dodatkowe role bazodanowe, ale to temat na inny wpis, do większości prostych zastosowań powyższy mechanizm sprawdzi się doskonale :)
Dodaj komentarz