INGRES-Sicherheitskonzept und Integrität
14 INGRES-Sicherheitskonzept und Integrität
14.1 Das INGRES-Sicherheitskonzept
14.1.1 Die Anweisungen GRANT und DROP PERMIT
14.1.2 Einschränkung des Datenzugriffs mit
Views
In
diesem Kapitel werden
zwei in Bezug
auf
Systemeinschränkungen verwandte Themen - Sicherheitskonzept
und Integrität - beschrieben. Zuerst werden alle von INGRES
verwendeten Benutzerklassen definiert
und erläutert. Danach
werden die SQL-Anweisungen GRANT und
DROP PERMIT beschrieben,
die
die Vergabe bzw. den Entzug der Zugriffsrechte regeln.
Am Ende des ersten Teils
wird die Rolle
von Views im
Zusammenhang mit dem
Sicherheitskonzept erklärt.
Der
zweite Teil des
Kapitels ist der
Datenintegrität
vorbehalten. In diesem Zusammenhang wird die Anweisung
CREATE
INTEGRITY ausführlich beschrieben. (Die Datenbank-Prozeduren
und Regel, die auch der
Datenintegrität gewährleisten, werden
in Kapitel 20 beschrieben.)
Das
Sicherheitskonzept von INGRES
ermöglicht eine flexible
Vergabe von
Zugriffsrechten. Diese Vergabe
kann sowohl
selektiv als auch dynamisch sein.
Selektiv bedeutet, daß an
verschiedene Benutzer
unterschiedliche Rechte vergeben werden
können, während dynamisch die Möglichkeit kennzeichnet, die
schon vergebenen Rechte zum
Teil oder ganz zu
entziehen.
(In diesem Abschnitt wird mehrfach
das Wort "Benutzer" als
Synonym für die Benutzerkennung
verwendet.)
INGRES benutzt zur Identifizierung die Kennung eines
Benutzers. Damit ist die
Benutzerkennung das einzige
Bindeglied zwischen
Datenbanksystem
einerseits und
dem
Anwender andererseits. Sie
wird benutzt, um
die
Zugriffsrechte eines Anwenders zu überprüfen, zu vergeben
oder zu entziehen.
Alle
INGRES-Benutzer gehören zu
einer der folgenden vier
Benutzerklassen:
- Systemadministrator,
- Superuser,
- Datenbankadministrator
(DBA) und
- Benutzer.
Der
INGRES-Systemadministrator
ist diejenige Person,
die
das
INGRES-System installiert und
die Autorisierung anderer
Benutzer durchführt. Während der
Installation wird die INGRES
Master-Datenbank (iidbdb) erstellt, in der die Information
über die
Benutzerautorisierung und die
existierenden
Datenbanken gespeichert wird.
Nachdem die
INGRES-Installation
abgeschlossen ist und
iidbdb erstellt
wurde, wird das
Dienstprogramm accessdb
vom
Systemadministrator
gestartet, um weiteren
Benutzern
den Zugang zum System zu ermöglichen. Eine ganz geringe
Anzahl von Benutzern soll
der Superuser-Klasse angehören.
Bei dieser Klasse handelt es sich
um die Benutzer, die
nach
der INGRES-Installation dieselben
Rechte wie der
Systemadministrator besitzen, d.h. das Recht, sowohl
das
Dienstprogramm accessdb auszuführen als auch die Rolle jedes
anderen INGRES-Benutzers zu
übernehmen. (Weil die
Rechte
eines Superusers identisch zu denen des Systemadministrators
sind, werden wir im
weiteren Verlauf des
Buches die
beiden Benutzerklassen einheitlich
INGRES-Systemadministrator
nennen.)
Eine größere Anzahl von
Benutzern wird vom
Systemadministrator durch
die Eintragung der
Erlaubnis
zur Datenbankerstellung zu Datenbankadministratoren (DBA's)
ernannt. Dies geschieht auch
mit Hilfe des Dienstprogramms
accessdb. Ein DBA
hat das Recht, sowohl die
Rolle jedes
gewöhnlichen INGRES-Benutzers zu übernehmen als auch, mit
Hilfe des Dienstprogramms createdb Datenbanken zu erstellen.
(Alle in diesem Abschnitt
erwähnten Dienstprogramme sind in
Kapitel 15 ausführlich beschrieben.)
Eine Datenbank kann entweder
global oder privat
sein.
Eine globale Datenbank kann
grundsätzlich von allen
INGRES-Benutzern verwendet werden,
während der Zugang
zu
einer privaten Datenbank nur
dem Benutzer, der sie erstellt
hat,
dem Systemadministrator und
autorisierten Benutzern
vorbehalten ist.
Zu
den INGRES-Benutzern gehören
alle Benutzer, die mit dem
Dienstprogramm accessdb als solche
bezeichnet sind und kein
DBA-Recht haben. Ein INGRES-Benutzer
kann nur die Datenbanken
benutzen, zu denen er Zugang hat. Für diese Datenbanken
kann
er die Tabellen erstellen, die
dann seine private Tabellen
sind.
Hinweis.
Der
Zugang zu einer
Datenbank gewährleistet nicht
automatisch den Zugriff auf
die Tabellen dieser
Datenbank! Der Tabellenzugriff wird
durch einen anderen
Autorisierungsmechanismus, der im
weiteren Verlauf dieses
Abschnitts beschrieben wird, ermöglicht.
Mit
der GRANT-Anweisung können
Zugriffsrechte für Tabellen,
Views oder
Datenbank-Prozeduren an unterschiedliche Benutzer
vergeben werden. Die Syntax dieser
Anweisung ist
GRANT liste_der_rechte ON [TABLE] tab_name|proz_name
TO kennung_liste | PUBLIC;
liste_der_rechte kenzeichnet eine oder mehrere Zugriffsarten,
die
durch Kommata getrennt
werden. Es existieren insgesamt
sechs erlaubte Zugriffsarten:
SELECT,
UPDATE [(spalte_1,...)] ,
INSERT,
DELETE,
ALL [PRIVILEGES] und
EXECUTE.
Zugriffsart |
Wirkung |
SELECT |
Das
SELECT-Zugriffsrecht erlaubt dem Benutzer den lesenden Zugriff auf Reihen einer Tabelle. |
UPDATE |
Das
UPDATE-Zugriffsrecht erlaubt dem Benutzer das Ändern der Reihen einer Tabelle bzw. eines Views. Sind einzelne Spalten der Tabelle bzw. des Views
explizit angegeben, wird das Recht zur Änderung nur für diese Spalten vergeben. Falls die Spaltenliste
fehlt, können alle Spalten geändert werden. |
INSERT |
erlaubt
dem Benutzer das Einfügen von Reihen in einer Tabelle bzw. in
einem View. |
DELETE |
erlaubt
dem Benutzer das Löschen
von Reihen in einer
Tabelle bzw. in einem View. |
ALL |
ALL beinhaltet alle oben beschriebenen Zugriffsrechte. (PRIVILEGES ist optional.) |
erlaubt dem
Benutzer die Ausführung einer
Datenbank-Prozedur. |
kennung_liste kennzeichnet eine oder mehrere
Benutzerkennungen -
getrennt durch Kommata
-, denen das
Zugriffsrecht vergeben wird, das in tab_recht_liste
angegeben
ist. PUBLIC bezeichnet alle
Benutzerkennungen.
Die
GRANT-Anweisung kann nur
von einem Benutzer ausgeführt
werden, der Datenbankadministrator
für diese Datenbank ist.
Dabei kann der Tabellenzugriff
nur für die
Tabellen der
Datenbank gewährleistet werden, die
dem DBA gehören.
Beispiel 14.1
GRANT SELECT ON mitarbeiter TO petra, lothar;
Die Benutzer petra und lothar
haben die Erlaubnis, die Reihen
der Tabelle mitarbeiter
auszuwählen.
Beispiel 14.2
GRANT UPDATE(m_nr,einst_dat), DELETE ON arbeiten TO
toni;
Der
Benutzer toni hat
die Erlaubnis, die Spalten m_nr und
einst_dat der Tabelle
arbeiten zu ändern
und Reihen zu
löschen.
Beispiel 14.3
GRANT ALL ON projekt TO margit;
Der
Benutzer margit hat alle
Zugriffsrechte für die Tabelle
projekt.
Beispiel 14.4
GRANT SELECT,INSERT,DELETE,UPDATE ON projekt TO
PUBLIC;
Alle Benutzer können Reihen der Tabelle projekt
auswählen,
einfügen, löschen und modifizieren.
INGRES unterstützt z.Zt. nicht
die vom SQL-Standard
definierte Anweisung REVOKE, mit
der die vorgegebenen
Zugriffsrechte entzogen
werden können. Die
entsprechende
Anweisung bei INGRES heißt DROP PERMIT, und ihre Syntax hat
folgende Form
DROP PERMIT ON tab_name|proz_name ALL|ganzzahl_liste;
Mit
der ganzzahl_liste
wird eine Liste
von Ganzzahlen
definiert, die die Zugiffsrechte der
Tabelle bzw. des Views
namens tab_name, die entzogen werden sollen, spezifizieren.
(Dasselbe gilt für die
Datenbank-Prozedur proz_name.)
Der
existierende Zusammenhang
zwischen den Zugriffsrechten
einerseits und den angegebenen
Ganzzahlen andererseits kann
mit Hilfe der HELP PERMIT-Anweisung erlangt werden. Mit
der Angabe ALL werden alle für die Tabelle
tab vergebenen
Zugriffsrechte entzogen.
Beispiel 14.5
DROP PERMIT ON projekt 2,3;
Mit der DROP PERMIT-Anweisung in
Beispiel 14.5 werden das
zweite und das dritte
Zugriffsrecht für die Tabelle projekt
entzogen.
Wie
schon in Kapitel 10 gezeigt, können Views für folgende
Zwecke benutzt werden:
- um den verschiedenen Benutzern
unterschiedliche Sichtweisen
auf Datenwerte einer Datenbank zur
Verfügung zu stellen;
- um
die Tabellen mit
einer großen Anzahl
von Spalten
den Benutzern gegenüber in
einer eingeschränkten Form
darzustellen, wodurch die Wahrnehmung und Handhabung für
die Benutzer einfacher wird.
Zusätzlich dazu können die
Datenwerte einer Datenbank mit
Hilfe von Views gezielt geschützt
werden. Wenn z.B. eine
Tabelle eine Spalte mit Gehältern
der Mitarbeiter einer
Firma enthält, ist es
möglich, durch die Erstellung eines
Views, das die Gehälter-Spalte nicht beinhaltet, den Zugriff
auf die Tabelle einzuschränken.
In diesem Fall könnten z.B.
alle Benutzer das
SELECT-Zugriffsrecht auf das erstellte View
haben, während nur eine kleine
Anzahl ausgewählter Benutzer
dasselbe Zugriffsrecht auf die
ganze Tabelle und damit auch
auf die Spalte mit den
Gehältern bekommen könnte. Dieselbe
Regel gilt auch für alle sicherheitsrelevanten Datenwerte
einer Datenbank.
Mit
Hilfe der Beispieldatenbank werden verschiedene
Möglichkeiten gezeigt, wie der
Zugriff auf Datenwerte einer
Datenbank eingeschränkt werden kann.
Beispiel 14.6
Erstellen Sie ein View, das den Zugriff auf die Mittel der
Tabelle projekt nicht erlaubt.
CREATE v_pr_mittn
AS SELECT pr_nr,
pr_name
FROM projekt;
Die Benutzer
des Views v_pr_mittn sehen einen
Spaltenausschnitt der Tabelle projekt. Mit
der Erstellung
dieses Views kann der
Zugriff auf die
Tabelle projekt
eingeschränkt werden. Damit kann allen Benutzern der Zugriff
auf das View ermöglicht und nur
den Benutzern, die
die
Projektmittel kennen
dürfen, der Zugriff
auf die ganze
Tabelle erlaubt werden.
Beispiel 14.7
Erstellen Sie ein View, das alle
Mitarbeiter der Abteilung a2
enthält.
CREATE VIEW v_mit_a2
AS SELECT m_nr,
m_name, m_vorname, pr_nr
FROM mitarbeiter
WHERE pr_nr = 'a2';
Das
View v_mit_a2 stellt einen Ausschnitt der Reihen der
Tabelle mitarbeiter dar.
Beispiel 14.8
Erstellen Sie ein View,
das Personalnummer, Namen
und
Vornamen aller Projektleiter
beinhaltet.
CREATE VIEW v_arbmit_pl
AS
SELECT mitarbeiter.m_nr, m_name, m_vorname
FROM mitarbeiter, arbeiten
WHERE mitarbeiter.m_nr = arbeiten.m_nr
AND aufgabe = 'Projektleiter';
Das
View v_arbmit_pl stellt
einen Ausschnitt der Reihen und
Spalten der Tabellen mitarbeiter
und arbeiten dar.
Die Integrität einer Datenbank ist eine der grundlegenden
Eigenschaften, die ein Datenbanksystem gewährleisten muß. Sie
bezieht sich auf die
Integrität von Datenwerten, die in
der Datenbank gespeichert sind. Ein Datenbanksystem muß
in
der Lage sein, unsinnige bzw. widersprüchliche Datenwerte zu
erkennen und abzuweisen.
Die
Vorschriften, mit denen
das Einfügen bzw.
das
Modifizieren der
Datenwerte einer Datenbank
untersagt
wird, falls die Definition
eines Datenbankobjektes bzw.
eine
vom Benutzer definierte
Regel verletzt wird,
werden
Integritätsvorschriften
("integrity constraints") genannt.
INGRES unterstützt zwei Angaben:
- NOT NULL in der CREATE
TABLE-Anweisung und
- UNIQUE in der CREATE
INDEX-Anweisung,
die die Verletzung der Definition
einer Tabelle bzw. eines
Index regulieren. Mit der Angabe NOT
NULL wird jeder Versuch,
einen NULL-Wert in die entsprechende
Spalte einzufügen, vom
System abgewiesen. Genauso weist das System den Versuch, das
Einfügen der mehrfach vorhandenen Werte in eine Spalte, für
die ein UNIQUE-Index existiert, ab.
Abgesehen von diesen im
INGRES-System existierenden
Integritätsvorschriften ist es bei INGRES möglich, explizite
Vorschriften für Tabellen zu
definieren. Diese Vorschriften
können mit Hilfe:
- einer INGRES-Benutzerschnittstelle wie QBF,
RBF oder
Report-Writer;
- des Knowledge
Management-Moduls und
- der CREATE
INTEGRITY-Anweisung
definiert werden. In diesem Kapitel werden
die Integritätsvorschriften,
die mit der
CREATE
INTEGRITY-Anweisung definiert
werden können, beschrieben.
(Die
Möglichkeiten, die INGRES-Benutzerschnittstellen in
dieser Hinsicht bieten, werden
z.T. in den Kapiteln 4 und 5
erläutert. Der Knowledge
Management-Modul wird ausführlich in
Kapitel 20 erklärt.)
Die CREATE
INTEGRITY-Anweisung
definiert eine
Integritätsvorschrift für eine
Tabelle. Diese Anweisung hat
folgende Form
CREATE INTEGRITY ON tab_name [alias_name]
IS
bedingung;
tab_name ist
der Name der
Tabelle für die
eine
Integritätsvorschrift definiert wird.
alias_name kennzeichnet
den
optionalen Aliasnamen dieser
Tabelle. bedingung
definiert eine Bedingung, die
die Integritätsvorschrift
darstellt. Nur der Tabelleneigentümer darf für eine
Tabelle die
Integritätsvorschriften mit Hilfe
der CREATE
INTEGRITY-Anweisung definieren.
Wenn
die Integritätsvorschrift
für eine geladene
Tabelle
definiert wird, müssen alle
existierenden Reihen dieser
Tabelle die Vorschrift erfüllen.
Falls dies nicht
der
Fall
ist, wird die CREATE
INTEGRITY-Anweisung mit einer
Fehlermeldung abgewiesen.
Nach der erfolgreichen Definition
einer Integritätsvorschrift
wird jede Änderung der
Tabelle, die in
der CREATE
INTEGRITY-Anweisung genannt
ist, auf die
Integrität
überprüft. Alle Versuche, die
definierte Vorschrift zu
verletzen, werden vom INGRES-System
abgewiesen, ohne einen
Fehler zu melden.
Beispiel 14.8
CREATE INTEGRITY ON projekt
IS mittel < 200000;
In Beispiel 14.8 ist eine
Integritätsvorschrift definiert,
die
die obere Grenze der Mittel
aller Projekte auf 200000DM
festsetzt.
Hinweis.
Der Zeitpunkt der Ausführung einer
CREATE INTEGRITY-Anweisung
muß genau überlegt werden, weil diese Anweisung die Tabelle,
auf
die sich die Integritätsvorschrift bezieht,
exklusiv
sperrt. Zusätzlich dazu kann die Ausführung dieser Anweisung
relativ lange dauern, wenn die Tabelle, auf die sich
die
Vorschrift bezieht, groß ist.
Mit der Anweisung
DROP
INTEGRITY ON tab_name ALL | zahl_1 [,zahl_2,...];
können eine oder mehrere,
für die Tabelle
tab_name
definierte Integritätsvorschriften
gelöscht werden. Die
Ganzzahlen zahl_1, zahl_2,...
kennzeichnen die mit der CREATE
INTEGRITY-Anweisung definierten Integritätsvorschriften für
die
Tabelle tab_name. Der
existierende Zusammenhang
zwischen den
Integritätsvorschriften
einerseits und den
angegebenen Ganzzahlen
andererseits kann mit
Hilfe der
HELP
INTEGRITY-Anweisung erlangt werden.
Mit der Angabe
ALL
werden alle für
die Tabelle tab_name
definierten
Integritätsvorschriften gelöscht.
Jede
vorübersetzte und gespeicherte
Abfrage, die sich auf
eine
in der DROP INTEGRITY-Anweisung angegebene
Tabelle
bezieht, muß noch einmal
übersetzt und gespeichert
werden.
Der Grund für diese Maßnahme
ist, daß alle existierenden
Integritätsvorschriften bei
der Erstellung einer
solchen
Abfrage berücksichtigt werden.
(Dasselbe gilt für die
in
Kapitel 18 beschriebenen Prozeduren.)
A.14.1 Die
Tabelle systeme wird
mit der folgenden
CREATE
TABLE-Anweisung erstellt:
CREATE TABLE systeme
(s_name CHAR(15) NOT
NULL,
version CHAR(5) NOT NULL,
hersteller
CHAR(20),
ort CHAR(20),
preis FLOAT);
Vergeben Sie
den genannten Benutzern
folgende
Zugriffsrechte:
a) Dem Benutzer gabi alle
Rechte für die obige Tabelle.
b) Dem Benutzer rainer SELECT-Rechte für die ganze
Tabelle.
c) Dem Benutzer alex
INSERT- und DELETE-Rechte für die
ganze Tabelle.
d) Dem Benutzer peter UPDATE-Rechte für die
Spalten
hersteller und preis. Dieser Benutzer darf
diese
Rechte weiteren Benutzern
vergeben.
A.14.2 Entziehen Sie den Benutzern gabi und peter
die in A.14.1
vergebenen Zugriffsrechte.