Heute fragte in der deutschen SQL-Server-Newsgroup im Usenet wieder jemand danach, wie man denn verhindern kann, dass der Sysadministrator (SA) des SQL-Servers die Daten in seiner Anwendungsdatenbank lesen bzw. ändern kann. Die Frage stellte ich mir auch schon so oft. Die traurige Tatsache ist, dass Microsoft hier eine ganz einfache Linie fährt: ein Admin darf alles. Das es in Deutschland Regelungen gibt, die anderes vorschreiben, ist nicht bei Ihnen angekommen.

Das geht über mehrere Stufen:

  • Wer Domänen-Admin ist, der ist auch lokaler Administrator.
  • Wer lokaler Windows-Admin oder Domänen-Admin ist, der ist auch SysAdmin im SQL-Server.
  • Wer SysAdmin im SQL Server ist, der hat auch volle Adminrechte auf jeder Datenbank.

Natürlich kann man jeden einzelnen Schritt gut begründen und sinnvolle Beispiele nennen. Leider gibt es aber auch für jeden Schritt exotische Sonderfälle in denen das nicht so ist. In unserer Firma gibt es zum Beispiel eine personelle Trennung zwischen den Administratoren der Windows-Server und den SQL-Server-Administratoren. Um das zu verhindern, kann man zwar der vordefinierten SQL-Server-Rolle NT-Autorität\Administrator den Zugang zunächst versperren, aber leider nicht nachhaltig. Durch Start des SQL-Servers im Single-User-Modus wird das wieder aufgehoben. Das sollte für einen Admin machbar sein… 😉

Wenn man also verhindern will, dass der Admin die Objektdefinitionen auslesen will, dann muss man die Objekte schon "WITH ENCRYPTION" anlegen. Aber auch dabei sollte man sich nicht zu sicher fühlen, denn die Anleitung zur Entschlüsselung ist auch nicht so wirklich schwierig. Für mich ist das in der gleichen Liga wie die Obfuscation bei .Net… 😉

OK, aber wenigstens kann man verhindern, dass der Admin die Daten lesen kann. Dazu muss man lediglich die Inhalte der Felder verschlüsseln. Ich nehme an, dass ein Admin die mittels der SQL-Server-Encrypt-Funktionen verschlüsselten Felder tatsächlich nicht lesen kann. Wenn es durch Austausch oder Neugenerieren des Database-Master-Key doch gehen sollte, dann kann man immer noch "EncryptByPassphrase" verwenden. Hier sollte man allerdings bedenken, dass das Passwort im Klartext über die Leitung geht. Und ein Admin, der keinen Netztrace ziehen kann, darf sich wohl kaum Admin nennen. Aber die auf Signaturen basierenden Encrypt-Funktionen halte schon für recht sicher, bin hier aber nicht sehr erfahren. 🙂

Leider kenne ich keine Möglichkeit, wie man verhindern kann, dass der Admin Datensätze löscht oder ändert. Man kann allenfalls erzeugte Signaturen von Sätzen erstellen und inline speichern, um Änderungen einzelner Sätze zu bemerken. Und die Anzahl von Datensätzen zu bestimmten Schlüsseln verschlüsselt abspeichern, um das nachträgliche Anfügen oder Löschen zu bemerken. Das dürfte die gängigsten Fälle abdecken. Nur gegen mutwilligen Vandalismus ist man machtlos. Aber dafür gibt es ja hoffentlich Datensicherungen… 🙁

Das Resümee ist: Microsoft hat festgelegt, dass man dem Admin vertrauen muss. Wenn das nicht der Fall ist, dann sollte man schleunigst den Vertrag kündigen und die Admin-Passwörter ändern… 😉