Masz tutaj kilka różnych pytań, więc wybiję je indywidualnie:
„Przeczytałem, że najlepszą praktyką jest nie zezwalanie użytkownikom na bezpośrednie logowanie się do sa, zamiast używania uwierzytelniania systemu Windows”
Mieszasz tutaj dwie rzeczy: koncepcję SA oraz koncepcję uwierzytelniania SQL i uwierzytelniania Windows.
Uwierzytelnianie SQL to lista nazw użytkowników i haseł przechowywanych na każdym serwerze SQL. Pierwszym problemem jest fakt, że jest przechowywany w SQL. Jeśli musisz zmienić hasło logowania, musisz je zmienić na każdym serwerze (lub utrzymywać różne hasła na różnych serwerach). Dzięki uwierzytelnianiu systemu Windows można centralnie wyłączać logowanie, zmieniać hasła, ustawiać zasady itp.
Jeśli wybierzesz uwierzytelnianie SQL, wówczas SA jest tylko jednym loginem uwierzytelniającym SQL. Jest to domyślna nazwa użytkownika administratora, podobnie jak Administrator w uwierzytelnianiu systemu Windows. Ma lokalne supermoce w tej jednej instancji, ale nie ma globalnych supermocarstw we wszystkich instancjach.
„... i zezwalanie tym kontom (lub grupom kont) na uprawnienia administratora.”
Niezależnie od wybranej metody uwierzytelniania, najlepiej postępować zgodnie z zasadą najmniejszego uprzywilejowania: przyznać ludziom minimalne prawa, których potrzebują do wykonania swojej pracy, i nie więcej.
Nie myśl o nich jak o zwykłym logowaniu - to ludzie, którzy mogą cię zwolnić. Jeśli upuszczą bazę danych lub przypadkowo wyłączą zadania tworzenia kopii zapasowych, nie zostaną zwolnieni, ponieważ domyślnie SQL nie śledzi, kto co zrobił. To ty zostaniesz zwolniony, ponieważ tak się stanie i nie będziesz w stanie powiedzieć, która osoba to zrobiła.
„W jaki sposób najlepsza praktyka zwiększa bezpieczeństwo moich wystąpień programu SQL Server?”
Chcesz zrobić dwie rzeczy:
- Powstrzymaj ludzi przed zerwaniem serwera
- Gdy zepsują serwer, być w stanie dokładnie określić, kto to zrobił
Pierwszy realizowany jest zgodnie z zasadą najmniejszego przywileju: udzielanie ludziom tylko potrzebnych im uprawnień i nic więcej.
Druga realizowana jest poprzez nadanie każdej osobie własnego loginu, nie zezwalanie na wspólne logowanie (np. Zezwalanie każdemu na używanie tej samej nazwy użytkownika / hasła), a najlepiej na kontrolę logowań. Prawdopodobnie nie zrobisz tej ostatniej części od razu, ponieważ jest to trochę bolesne, ale odłóżmy elementy na początek, abyś mógł dodać audyt później, gdy ktoś upuści bazę danych, a twój szef chce wiedzieć, dlaczego.
Wiem, co myślisz: „Ale kodujemy aplikacje, a aplikacja wymaga logowania”. Tak, nadaj aplikacji swój własny login, a programiści muszą znać to hasło, ale to logowanie powinno być tak pozbawione uprawnień, że nikt przy zdrowych zmysłach nie chciałby z niego korzystać. Na przykład może być konieczne, aby był w rolach db_datareader i db_datawriter, nic więcej. W ten sposób może wstawiać, aktualizować, usuwać i wybierać dane, ale niekoniecznie zmieniać schematy, dodawać indeksy, zmieniać procedury składowane itp.
„Czy dotyczy to tylko instancji produkcyjnych, czy też naszych wewnętrznych instancji programistycznych?”
Myślę, że dotyczy to również instancji programistycznych, ponieważ zwykle martwię się, że ludzie coś zepsują. Ludzie po prostu uwielbiają łamać serwery podczas programowania. I oczywiście, kiedy nadszedł czas na spakowanie listy zmian do migracji do produkcji, muszę wiedzieć, czy konkretny indeks jest naprawdę niezbędny dla aplikacji, czy też jakiś głupek właśnie uruchomił Doradcę dostrajania bazy danych i powiedział, aby zastosować wszystkie zmiany . Odpowiednie uprawnienia pomagają zmniejszyć ten ból.