Warum ist es eine schlechte Praxis, jedem die Verwendung des sa-Logins zu erlauben?


25

Selbst Microsoft rät von der Verwendung des SQL Server-Authentifizierungsmodus ab , unsere Anwendungen erfordern dies jedoch.

Ich habe gelesen, dass es eine bewährte Methode ist, Benutzern nicht zu saerlauben, die Anmeldung direkt zu verwenden, sondern die Windows-Authentifizierung zu verwenden und diesen Konten (oder Kontengruppen) Sysadmin-Berechtigungen zu gewähren.

  • Ist das nicht im Wesentlichen dasselbe? Was sind die Vor- und Nachteile?
  • Wie erhöht die bewährte Methode die Sicherheit meiner SQL Server-Instanzen?
  • Gilt dies nur für Produktionsinstanzen oder auch für unsere internen Entwicklungsinstanzen?

Ich bitte diese Hälfte als kanonische Referenz, da ich über Google nichts finden konnte (zögern Sie nicht, einen Aspekt zu bearbeiten, den ich nicht behandelt habe), und die Hälfte, um Munition zu sammeln, um das Management davon zu überzeugen, dass diese Änderung eine gute Sache ist (tm).
Jon Seigel

6
Es ist so gut wie jedem eine Kopie Ihres Hausschlüssels zu geben. ;)
Jeremiah Peschka

1
Ganz zu schweigen davon, dass 'sa' ein öffentlich bekannter Anmeldename für SQL Server ist, was es zu einem einfachen Ziel macht. Keine Vermutung wirklich beteiligt. Ich habe gesehen, wie Firmen den Namen von "sa" in etwas anderes geändert haben. Selbst wenn es nur ein kleines Level ist, ist es für Cyber-Eindringlinge etwas schwieriger, etwas in den Griff zu bekommen.
Thomas Stringer

3
Ihre Anwendungen erfordern es nicht. Sagen Sie uns bitte, warum Sie glauben, dass dies der Fall ist.
nvogel

Gute Frage. Wenn nur andere Datenbankprofis aufhören und dieselbe Frage stellen würden, gäbe es viel weniger Sicherheitslücken.
Thomas Stringer

Antworten:


52

Sie haben hier einige verschiedene Fragen, also werde ich sie einzeln klopfen:

"Ich habe gelesen, dass es eine bewährte Methode ist, Benutzer nicht direkt die sa-Anmeldung verwenden zu lassen, sondern die Windows-Authentifizierung zu verwenden."

Sie mischen hier zwei Dinge: das Konzept der SA und das Konzept der SQL-Authentifizierung und der Windows-Authentifizierung.

Die SQL-Authentifizierung ist eine Liste von Benutzernamen und Kennwörtern, die in jedem SQL Server gespeichert sind. Die Tatsache, dass es in SQL gespeichert ist, ist das erste Problem. Wenn Sie das Kennwort eines Logins ändern müssen, müssen Sie es auf jedem Server ändern (oder unterschiedliche Kennwörter auf verschiedenen Servern verwalten). Mit der Windows-Authentifizierung können Sie Anmeldungen zentral deaktivieren, Kennwörter ändern, Richtlinien festlegen usw.

Wenn Sie sich für die Verwendung der SQL-Authentifizierung entscheiden, ist SA nur ein SQL-Authentifizierungs-Login. Dies ist der Standardbenutzername des Administrators, genau wie Administrator bei der Windows-Authentifizierung. Es verfügt über lokale Superkräfte für diese eine Instanz, jedoch nicht über globale Superkräfte für alle Instanzen.

msgstr "... und diesen Konten (oder Kontengruppen) Systemadministratorrechte gewähren."

Für welche Authentifizierungsmethode Sie sich auch entscheiden, im Idealfall möchten Sie dem Grundsatz des geringsten Privilegs folgen: Gewähren Sie den Menschen die Mindestrechte, die sie für die Erledigung ihrer Arbeit benötigen, und nicht mehr.

Betrachten Sie sie nicht nur als Logins - sie sind Leute, die Sie entlassen können. Wenn sie die Datenbank löschen oder Ihre Sicherungsjobs versehentlich deaktivieren, werden sie nicht ausgelöst, da SQL standardmäßig nicht nachverfolgt, wer was getan hat. Du bist derjenige, der gefeuert wird, weil es passieren wird, und du wirst nicht sagen können, welche Person es getan hat.

"Wie erhöht die Best Practice die Sicherheit meiner SQL Server-Instanzen?"

Sie möchten zwei Dinge tun:

  1. Verhindern Sie, dass Personen den Server beschädigen
  2. Wenn sie den Server ausfallen lassen, können Sie genau identifizieren, wer es getan hat

Der erste wird mit dem Grundsatz des geringsten Privilegs erreicht: den Leuten nur die Berechtigungen geben, die sie benötigen, und nicht mehr.

Die zweite Möglichkeit besteht darin, jeder Person ein eigenes Login zuzuweisen, gemeinsame Logins nicht zuzulassen (z. B. dass jeder denselben Benutzernamen / dasselbe Passwort verwendet) und im Idealfall die Logins zu überprüfen. Sie werden den letzten Teil wahrscheinlich nicht sofort erledigen, da er ziemlich schmerzhaft ist. Lassen Sie uns die Teile jedoch zuerst an die richtige Stelle bringen, damit Sie später Auditing hinzufügen können, nachdem jemand eine Datenbank gelöscht hat und Ihr Chef wissen möchte, warum.

Ich weiß, was Sie denken: "Aber wir codieren Apps, und die App benötigt ein Login." Ja, geben Sie der Anwendung ein eigenes Login, und die Entwickler müssen dieses Passwort kennen, aber dieses Login sollte so frei von Berechtigungen sein, dass niemand, der bei Verstand ist, es verwenden möchte. Beispielsweise muss es möglicherweise nur in den Rollen db_datareader und db_datawriter vorhanden sein, sonst nichts. Auf diese Weise kann es Daten einfügen, aktualisieren, löschen und auswählen, aber nicht unbedingt Schemas ändern, Indizes hinzufügen, gespeicherte Prozeduren ändern usw.

"Gilt dies nur für Produktionsinstanzen oder auch für unsere internen Entwicklungsinstanzen?"

Ich denke, das gilt genauso für Entwicklungsinstanzen, weil ich mir normalerweise Sorgen mache, wenn Leute Dinge kaputt machen. Die Leute lieben es einfach, Server in der Entwicklung zu beschädigen. Und wenn es Zeit ist, die Liste der Änderungen zu bündeln, die auf die Produktion migriert werden sollen, muss ich natürlich wissen, ob ein bestimmter Index für die App wirklich wichtig ist oder ob ein Bonehead den Database Tuning Advisor nur ausgeführt und angewiesen hat, alle Änderungen zu übernehmen . Die richtigen Berechtigungen lindern diesen Schmerz.


1
SA für eine Instanz kann Gott Rechte für alle Instanzen aufgrund von Verbindungsservern, NTFS usw.
verleihen

@gbn - Ich bin nicht sicher, ob ich folge. Können Sie einige Beispiele dafür nennen? Ich kann verstehen, ob es sich um schlechte Konfigurationen handelt (wie bei allen Servern, die dasselbe Dienstkonto verwenden), aber ich bin mir nicht sicher, wie Sie dies erreichen, wenn die Server unter verschiedenen Dienstkonten ausgeführt werden.
Brent Ozar

Ein Standard-Build würde in großen Organisationen dasselbe Domänenkonto verwenden. Selbst wenn sie unterschiedlich wären, wären sie ein Mitglied derselben AD-Gruppe (vorbehaltlich natürlich der Regionen) und hätten daher die gleichen Rechte. Ich habe beides bei großen weltweiten Organisationen (Investmentbanken) gesehen
gbn

9
Okay, das ist ein anderes Problem. In den meisten gesicherten Organisationen, die ich gesehen habe, ist es üblich, jeden Server einem eigenen Dienstkonto zuzuweisen. Dies ist auch Teil meiner SQL Server-Setup-Checkliste online. Wenn Sie diesen offensichtlichen Schritt ignorieren, sind Sie zwar weniger sicher - aber worum geht es?
Brent Ozar

15

Wenn Sie dieses Whitepaper lesen: Whitepaper zur SQL Server-Aufgabentrennung

Es wird Ihnen mitgeteilt, dass NIEMAND Sysadmin-Berechtigungen für sein Konto verwenden sollte. Ihrem täglichen Zugriffskonto sollte ein Mindestzugriff gewährt werden, keine expliziten Sysadmin-Rechte. Unter der Voraussetzung, dass CONTROL SERVER tatsächlich in der Nähe von sysadmin ist, können Sie den Zugriff auch dann verweigern / widerrufen, wenn sie ihn nicht benötigen. Das Zulassen von Sysadmin-Rechten für andere wird zu einem Problem, wenn Sie IT-Compliance-Standards einhalten müssen. Die meisten Standards erfordern eine minimale Verwendung der Sysadmin-Rolle.

Ich deaktiviere das Konto "sa" und benenne es um, genau wie Sie es mit dem integrierten Administratorkonto auf dem Betriebssystem tun würden. Nur zur Verwendung im Notfall.

Entwickler erhalten normalerweise vollen Zugriff auf ihre Entwicklungsumgebung. Wenn dann ihr Programm auf die Vorproduktionsinstanz verschoben wird, sollte ihr Zugriff minimal oder nicht vorhanden sein. so wie es in der Produktion wäre. Das ist eine perfekte Welt. Wenn Sie jedoch nicht dabei sind und Ihre Entwickler ein höheres Privileg haben, als Sie es benötigen, würde ich ihre Konten überprüfen. Ich würde alles und alles, was sie tun, bis zu einem gewissen Grad erfassen. Wenn also auf Ihrem Produktionsserver ein Fehler auftritt, können Sie zurückgehen und herausfinden, was genau passiert ist.


2
+1000 Dieses Whitepaper ist ausgezeichnet. Ich habe viel daraus gelernt.
Jon Seigel

8

Wenn Sie externen behördlichen Kontrollen oder Standards (SOX, PCI usw.) unterliegen, dann sind Sie

  • wird eine Prüfung nicht bestehen
  • Ihre monatlichen PCI-Prüfungen scheitern

Entwickler sollten db_owner nur für die Entwicklung auf einem Netzwerk-SQL-Server haben.

Befinden sich Ihre SQL-Server alle im Netzwerk mit einem Standard-Build (dh demselben Dienstkonto), verleiht sa in one ihnen alle Rechte.

Wenn das Dienstkonto ein lokaler Administrator ist, haben Ihre Entwickler auch die volle Kontrolle über die Server.

Es gibt keine Vorteile.


Es gibt einen Vorteil, der nur von den anderen aufgewogen wird: Bequemlichkeit. Es ist für jeden sehr einfach zu benutzen sa(wahrscheinlich mit "Passwort" als Passwort), deshalb wird es als Übung fortgesetzt.
Jon of All Trades

6

sa = sysadmin

Wenn Sie sich mit sa anmelden, haben Sie die folgenden Möglichkeiten: - Löschen und Erstellen von Datenbanken - Ändern von Objekten in der Datenbank - Löschen und Erstellen von Anmeldungen - Ändern von Kennwörtern - Löschen aller Daten

Wenn Sie einem Windows-Konto sysadmin-Berechtigungen gewähren, geschieht dasselbe.

Die Liste geht weiter, aber dies sollte Ihnen ein paar gute Gründe geben, NIEMALS einen Nicht-Administrator sa verwenden zu lassen.

Sie sollten ein Windows- oder SQL-Konto mit den erforderlichen Mindestberechtigungen erstellen, damit die Apps funktionieren. (zB Login, Zugriff auf gespeicherte Prozeduren und Views)


5

Die beste Vorgehensweise besteht darin, ein sicheres Kennwort zu speichern und es zu vergessen.


1

Im Moment habe ich zwei Möglichkeiten, warum man kein schwaches SA-Konto haben sollte. Wenn Sie ein schwaches / leeres Passwort für SA haben, könnte eine böse Person (übersetzen Sie das in "freundlicher Kollege"):

  • Aktivieren Sie die Systemprozedur xp_cmdshell und beschädigen Sie mit den Berechtigungen des SQL Server-Dienstkontos Ihre lokale Box (Dateien erstellen / entfernen ...). Eine niedrige Sicherheit für SA sagt eigentlich nicht viel über die Instanzeinstellungen aus, könnte aber bedeuten, dass der Servicebenutzer schlechten Praktiken folgen könnte (z. B. ein Administrator zu sein :-));

  • Aktivieren Sie die E-Mail-Funktion auf Ihrer Instanz und führen Sie einen schnellen Vorlauf eines kleinen Spam-Skripts durch (dies kann zu Problemen mit Ihrem Internetprovider oder Ihren Kollegen führen. Je nachdem, wohin die E-Mails gesendet werden ;-)).

Ich werde nicht auf die offensichtlichen Tatsachen hinweisen, dass es Datenbanken, Logins ... usw. löschen kann.

  • Ist das nicht im Wesentlichen dasselbe? Was sind die Vor- und Nachteile?
  • Nicht unbedingt: zB - Auf der SQL Server-Instanz Ihres Laptops bedeutet der Unterschied zwischen Windows-Authentifizierung und SQL-Authentifizierung, dass ein externer Angreifer theoretisch nur ein SQL-Konto verwenden kann, da die Windows-Authentifizierung nicht außerhalb Ihrer eigenen Domäne verwendet werden kann Konto. Ein Benutzer könnte benachbarte Laptops in dem Einkaufszentrum scannen, in dem Sie gerade Ihren Kaffee trinken, und feststellen, dass eine SQL-Instanz installiert und gestartet ist, und versuchen, ein wenig kostenlosen Spaß zu haben. Es ist nicht so, dass es oft passieren könnte ... aber es ist eine Möglichkeit :-).

  • Wie erhöht die bewährte Methode die Sicherheit meiner SQL Server-Instanzen?

  • Wie jede bewährte Methode auf dieser Welt ihre Arbeit leistet..de erhöht die Wahrscheinlichkeit eines möglichen Nachteils (z. B .: Die bewährte Methode für körperliche Aktivität verringert die Wahrscheinlichkeit, dass Sie wie ich sind .. eine Stubenhocker), der sonst auftreten könnte.

  • Gilt dies nur für Produktionsinstanzen oder auch für unsere internen Entwicklungsinstanzen?

  • Nehmen wir an, ich würde vorschlagen, die besten Sicherheitsmethoden (getestet und an die Anforderungen Ihrer Umgebung angepasst) zumindest in der Produktion zu implementieren. Wenn Sie in der Entwicklung jedoch auch Produktionsdaten (sensitive..etc) verwenden, ist dies ein starkes Indiz dafür, dass Sie auch Ihre Entwicklungspraktiken ändern müssen.

-1 Die Frage hat wirklich gefragt, warum die integrierte Windows-Authentifizierung zu bevorzugen und die SQL Server-Authentifizierung zu vermeiden ist, während es einfach unmöglich ist, ABER nicht zu erreichen, wie oder "warum man kein schwaches SA-Konto haben sollte"
Fulproof

@Fulproof: Ich verstehe was du sagst und danke für das Feedback. Meine Interpretation eines schwachen SA-Kontos ist ein SA-Konto mit einem schwachen / keinem Kennwort, das von jedem in einem Unternehmen verwendet wird. Aber die Frage ist alt und ich kann mich nicht an alle Details erinnern. Und ich hatte einen Akzent auf der Hauptfrage aus dem Titel - Warum ist es eine schlechte Praxis, jedem zu erlauben, das sa-Login zu verwenden?
Marian

0

Bei der Beantwortung Ihrer letzten Frage verwenden wir SA-Konten für alle unsere Entwicklungsdatenbanken (mit dem Kennwort "sa"!).

Es ist jedoch wichtig zu beachten, dass wir die Daten nicht speichern und nicht generieren. Unsere Datenbanken werden ausschließlich für einen Datenspeicher für eine C / C ++ - Anwendung verwendet. Diese Entwicklungsdatenbanken enthalten lediglich Testdaten und werden häufig erstellt, gelöscht, geändert usw. \

Ebenso wichtig ist, dass alle Entwicklungsdatenbanken auf Entwicklungscomputern installiert sind. (Zumindest eine Kopie pro Entwickler!) Wenn also jemand eine gesamte Installation durcheinander bringt, hat er nur sich selbst und sonst niemanden durcheinander gebracht.

Wenn Sie in einer Umgebung sicherstellen möchten, dass Ihre Datenbank, Tabellen und Daten tatsächlich konsistent und sicher sind, benötigen Sie ein ansprechendes, sicheres SA-Kennwort. Wenn Sie dies schwach lassen, hat jeder und jede Person uneingeschränkten Zugriff auf Ihre Daten und kann Ihre Datenbank vollständig zerstören.

Für eine Reihe von Entwicklern mit eigenen Kopien der Datenbank, die nur Testdaten enthalten, muss ich noch ein solides Argument für die Aufrechterhaltung eines starken SA-Kontos finden.


1
Mit sa könnten sie beispielsweise XP_cmdshell aktivieren und dann verlangen, dass es in prod geht. Und wie ich antwortete, kann es allen Servern Rechte verleihen. Dbo und teilweise sa (create db) etc: keine Probleme
gbn

In einer Entwicklungsumgebung, in der keine Kundendaten generiert oder gespeichert werden - eine Umgebung, in der alle Kopien der Datenbank nur zu Entwicklungs- und Bereitstellungszwecken Testkopien sind - kann ich nicht erkennen, dass dies wirklich ein Problem ist. Wenn es jemals ein Potenzial für fehlerhaften Code in Produktionsdatenbanken gibt, dann sehe ich ein etwas engeres Schiff.
Richard

0

Alle angegebenen Standard-SQL Server-Systemsicherheitsparameter sollten geändert werden. Es wird empfohlen, für die Authentifizierung nicht den gemischten Modus zu verwenden (aktiviert sowohl die Windows- als auch die SQL Server-Authentifizierung). Wechseln Sie stattdessen nur zur Windows-Authentifizierung, um die Windows-Kennwortrichtlinie zu erzwingen, und überprüfen Sie die Kennwortlänge, die Lebensdauer und den Verlauf. Die Windows-Kennwortrichtlinie unterscheidet sich von der SQL Server-Authentifizierung durch die Anmeldesperre. Nach mehreren fehlgeschlagenen Anmeldeversuchen wird die Anmeldung gesperrt und kann nicht mehr verwendet werden

Andererseits bietet die SQL Server-Authentifizierung keine Methoden zum Erkennen von Brute-Force-Angriffsversuchen, und was noch schlimmer ist, SQL Server ist sogar für die Behandlung einer großen Anzahl schneller Anmeldeversuche optimiert. Wenn die SQL Server-Authentifizierung in einem bestimmten SQL Server-System ein Muss ist, wird dringend empfohlen, die SA-Anmeldung zu deaktivieren

Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.