Access Control Lists in 11g

01.
Januar
2009
Veröffentlicht von: Hildegard Asenabuer

Viele Applikationen verwenden die Möglichkeiten zur Mailversendung aus Oracle heraus, sei es mit UTL_SMTP, sei es mit UTL_MAIL. Bis Version 10g reichte es, wenn der Eigentümer der Sende-Prozedur das EXECUTE-Recht auf das jeweilige Package hatte. Soll auf 11g migriert werden, so erfordert dies einen zusätzlichen administrativen Aufwand.

Viele Applikationen verwenden die Möglichkeiten zur Mailversendung aus Oracle heraus, sei es mit UTL_SMTP, sei es mit UTL_MAIL. Bis Version 10g reichte es, wenn der Eigentümer der Sende-Prozedur das EXECUTE-Recht auf das jeweilige Package hatte. Soll auf 11g migriert werden, so erfordert dies einen zusätzlichen administrativen Aufwand.

Mit Version 11g wurde nämlich das Sicherheitskonzept dahingehend erweitert, dass Netzwerkzugriffe über Access Control Lists (ACLs) freigegeben werden müssen. Das betrifft neben UTL_SMTP und UTL_MAIL auch die Packages UTL_TCP, UTL_HTTP und UTL_INADDR. Wenn ein entsprechender Aufruf erfolgt, ohne dass der Host bzw. Port explizit freigegeben wurde, so erfolgt nun die Fehlermeldung:

ORA-24247: Netzwerkzugriff von Zugriffskontrollliste (ACL) abgelehnt

Darüber hinaus wurden die angegebenen Packages auf Invoker Rights umgestellt, und auch entsprechende Prozeduren, die mit diesen Packages arbeiten, sollten mit AUTHID CURRENT_USER erstellt werden, um ein Unterlaufen der ACLs zu verhindern.

Am einfachsten kann der DBA ACLs über das Package DBMS_NETWORK_ACL_ADMIN verwalten. Zunächst muss eine ACL erstellt werden, wie im folgenden Beispiel gezeigt:

BEGIN
   DBMS_NETWORK_ACL_ADMIN.CREATE_ACL (
      acl          => 'utl_smtp.xml',
      description  => 'Mailversendung',
      principal    => 'SCOTT',
      is_grant     => TRUE,
      privilege    => 'connect');
END;
/

Die ACL wird dann einem Host zugewiesen, wobei auf einen Port bzw. auf einen Bereich eingeschränkt werden kann.

BEGIN
   DBMS_NETWORK_ACL_ADMIN.ASSIGN_ACL (
      acl          => 'utl_smtp.xml',
      host         => 'mailserver',
      lower_port   => 25);
END;
/


In diesem Beispiel wäre nur der Port 25 auf dem Host mailserver freigegeben. Wird zusätzlich ein upper_port mit angegeben, so ist der Bereich zwischen den beiden Werten freigegeben.
Einem Host bzw. einem Port-Range kann immer nur eine ACL zugewiesen sein. Bei einer erneuten Zuweisung wird die alte Zuweisung entfernt. Statt Namen können auch IP-Adressen angegeben werden, und es kann mit dem Stern (*) als Wildcard gearbeitet werden, um ganze Bereiche einer Domäne bzw. ganze Subnetze zu verwalten.

SCOTT kann nun im obigen Beispiel über den Port 25 Mails versenden. Wenn er eine entsprechende Prozedur mit Invoker Rights schreibt und das EXECUTE-Recht an einen User DUMMY vergibt, so braucht dieser zusätzlich die entsprechende Freigabe:

BEGIN
   DBMS_NETWORK_ACL_ADMIN.ADD_PRIVILEGE (
      acl          => 'utl_smtp.xml',
      principal    => 'DUMMY',
      is_grant     => TRUE,
      privilege    => 'connect');
END;
/

DBA PL/SQL

Jede Menge Know-how für Sie!

In unserer Know-How Datenbank finden Sie mehr als 300 ausführliche Beiträge zu den Oracle-Themen wie DBA, SQL, PL/SQL, APEX und vielem mehr.
Hier erhalten Sie Antworten auf Ihre Fragen.