[JAVA] Versuchen Sie, mit Keycloak (Security Proxy Edition) eine Konfiguration vom Typ Liverpro zu erstellen.

Was heute zu tun

Dieses Mal, am 7. Tag des Keycloak-Adventskalenders, werden wir den Sicherheitsproxy von Keycloak testen.

Security Proxy ist eine Art einfacher Reverse-Proxy-Server (im Folgenden Rivapro), der in Java implementiert ist. Der Liverpro-Server selbst ersetzt den Client-Adapter von Keycloak, sodass Sie den Inhalt des Proxys schützen und den Zugriff per URL steuern können. Es ist geeignet, wenn der Anwendungsserver OpenID Connect oder SAML nicht unterstützt, die Installation eines Clientadapters schwierig ist oder die Umgebung den Clientadapter nicht unterstützt.

Die Hauptfunktionen sind wie folgt.

--HTTP (S) Liverpro-Funktion --OpenID Connect-Integration mit dem Keycloak-Server

Dieses Mal werde ich das Verfahren zum Schutz mit Security Proxy für die ursprüngliche Beispielanwendung von Tomcat 8 ausprobieren.

Serverkonfiguration für die Betriebsprüfung

Die Testumgebung ist diesmal so. Auf dem Keycloak-Server wurde ein Demo-Bereich erstellt (siehe Artikel zu Tag 3) und Benutzer mit den folgenden Rollen Es wird angenommen, dass es existiert.

FQDN OS JDK Verfassung HÖREN Port
kc-server.example.com CentOS 7.4.1708 OpenJDK 1.8.0.151 · Keycloak-Server 3.3.0.CR2 8443
kc-proxy.example.com CentOS 7.4.1708 OpenJDK 1.8.0.151 ・ Sicherheitsproxy 3.3.0.CR2
・ Tomcat 8.5.23
43 18443(Security Proxy)
80 8080(Tomcat)
Nutzer rollen
user001 user
admin001 user,admin

In der mit Tomcat gelieferten Beispielanwendung wird davon ausgegangen, dass die folgende Zugriffssteuerung angewendet wird.

proxy_acl01.jpg

Die Zugriffsports zu jedem Server bei der Überprüfung des Vorgangs sind wie folgt. proxy_port01.png

Serverseitige Keycloak-Einstellungen

Client hinzufügen / konfigurieren

  1. Melden Sie sich bei der Keycloak-Administrationskonsole an.
  2. Wählen Sie in der linken Menüleiste den Bereich "Demo" aus.
  3. Klicken Sie in der linken Menüleiste auf "Client". Eine Liste der Clients wird angezeigt.
  4. Klicken Sie oben rechts auf die Schaltfläche "Erstellen".
  5. Geben Sie die folgenden Client-Einstellungen ein und klicken Sie auf die Schaltfläche "Speichern". --Client ID: kc-Proxy --Client-Protokoll: openid-connect
  1. Der Einstellungsbildschirm für den kc-Proxy wird weiterhin angezeigt. Nehmen Sie die folgenden Einstellungen vor und klicken Sie auf die Schaltfläche "Speichern".
  1. Klicken Sie auf die Registerkarte "Anmeldeinformationen".
  2. Notieren Sie sich den Wert, der als "geheim" angezeigt wird. proxy03.png

Konfiguration und Start der Security Proxy-Seite

Einführung der Beispielanwendung

Installieren und starten Sie Tomcat 8.0 als Beispielanwendung zur Überprüfung der Zusammenarbeit.

cd  /tmp
wget http://ftp.tsukuba.wide.ad.jp/software/apache/tomcat/tomcat-8/v8.5.23/bin/apache-tomcat-8.5.23.tar.gz
tar zxvf apache-tomcat-8.5.23.tar.gz -C /usr/local
cd /usr/local/apache-tomcat-8.5.23/
./bin/startup.sh

Laden Sie den Sicherheitsproxy herunter und stellen Sie ihn bereit

Laden Sie den Sicherheitsproxy herunter, entpacken Sie ihn in "/ usr / local" und ändern Sie ihn in das extrahierte Verzeichnis.

cd  /tmp
wget https://downloads.jboss.org/keycloak/3.3.0.CR2/keycloak-proxy-3.3.0.CR2.zip
unzip keycloak-proxy-3.3.0.CR2.zip -d /usr/local
cd /usr/local/keycloak-proxy-3.3.0.CR2/

Erstellung der Security Proxy-Konfigurationsdatei

Erstellen Sie die folgende Konfigurationsdatei, um Security Proxy zu betreiben.

json:/usr/local/keycloak-proxy-3.3.0.CR2/proxy.json


{
    "target-url": "http://localhost:8080",
    "send-access-token": true,
    "bind-address": "{IP-Adresse / DNS-Name zum Binden}",
    "http-port": "18080",
    "https-port": "18443",
    "applications": [
        {
            "base-path": "/",
            "adapter-config": {
                "realm": "demo",
                "resource": "kc-proxy",
                "auth-server-url": "https://kc-server.example.com:8443/auth",
                "ssl-required" : "external",
                "credentials": {
                    "secret": "{Keycloak serverseitiger geheimer Wert}"
                }
            },
            "constraints": [
                {
                    "pattern": "/*",
                    "authenticate": true
                },
                {
                    "pattern": "/examples/jsp/*",
                    "permit": true
                },
                {
                    "pattern": "/examples/websocket/*",
                    "roles-allowed": [
                        "admin"
                    ]
                }
            ]
        }
    ]
}

Die Bedeutung der Einstellungsparameter in proxy.json wird unten beschrieben.

Grundlegende Konfiguration

Parametername Verpflichtend Erläuterung
target-url Geben Sie die Liverpro-Weiterleitungsziel-URL an.
send-access-token KEYCLOAK_ACCESS_Gibt an, ob das Zugriffstoken mit dem Headernamen TOKEN an das Proxy-Ziel gesendet werden soll.
bind-address Geben Sie den DNS-Namen oder die IP-Adresse an, die an den Socket des Proxyservers gebunden werden soll. Geben Sie bei einer Verbindung von außen einen anderen Wert als die Loopback-Adresse an.
http-port Geben Sie die Portnummer an, die als HTTP abgehört werden soll. Ob jedoch ein HTTP-Zugriff zulässig ist, wird später beschrieben.adapter-configvonssl-requiredvon設定値に依存します。
https-port Geben Sie die Portnummer an, die als HTTPS abgehört werden soll.
keystore Geben Sie den Schlüsselspeicher an, der beim Akzeptieren von HTTPS verwendet wird. Wenn Sie keinen Schlüsselspeicher angeben, wird das automatisch generierte temporäre selbstsignierte Serverzertifikat verwendet.
keystore-password Geben Sie das Schlüsselspeicherkennwort an, wenn der Schlüsselspeicher angegeben wird.
key-password Geben Sie das Schlüsselkennwort des zu verwendenden Serverzertifikats an.
buffer-size Gibt die Socket-Puffergröße des HTTP-Servers an. Normalerweise ist die Standardeinstellung in Ordnung.
buffers-per-region Gibt die Anzahl der Socket-Puffer für jede Region des HTTP-Servers an. Normalerweise ist die Standardeinstellung in Ordnung.
io-threads Gibt die Anzahl der Threads an, die E / A verarbeiten sollen. Normalerweise ist die Standardeinstellung in Ordnung.
worker-threads Gibt die Anzahl der Threads an, die die Anforderung verarbeiten sollen. Normalerweise ist die Standardeinstellung in Ordnung.

Anwendungseinstellungen

Parametername Verpflichtend Erläuterung
base-path Gibt den Kontextstamm der Anwendung an."/"Muss mit beginnen.
error-page Wenn ein Fehler auftritt(Einschließlich, wenn der Zugriff verweigert wird)Gibt die Fehlerseite an, auf der angezeigt werden soll. Base-Geben Sie den relativen Pfad vom Pfad an.
adapter-config Es wird später beschrieben.

Adapter-Konfigurationseinstellungen

Parametername Verpflichtend Erläuterung
realm Geben Sie den Realm-Namen auf der Keycloak-Seite an.
resource Client-ID in den Client-Einstellungen auf der Keycloak-Seite(client-id)Angegeben.
auth-server-url Geben Sie die Basis-URL auf der Keycloak-Seite an.[^auth-server-url]
credentials Mit dem Zugriffstyp auf der Keycloak-Seite"confidential"Erforderlich, wenn Sie angeben.
ssl-required Gibt an, ob der Zugriff über HTTPS erzwungen werden soll."all", "external", "none"Geben Sie eine der folgenden Optionen an. Der Standardwert ist"external"Daher ist der HTTP-Zugriff von außen nicht zulässig.

: information_source: Da es so viele Einstellungen für die Adapterkonfiguration gibt, werden nur die Mindestelemente aufgelistet, die für die Funktionsprüfung erforderlich sind. Weitere Parameter finden Sie unter Referenz "Java Adapter Config".

Einstellungsbeschränkung

Parametername Verpflichtend Erläuterung
pattern Geben Sie das URL-Muster an."/"Muss mit einem Platzhalter beginnen(*)Kann nur am Ende angegeben werden.
Gültige Muster:/foo/bar/*und/foo/*.txt
Ungültiges Muster:/*/foo/*
roles-allowed Diese Einstellung ermöglicht nur den Zugriff auf Benutzer mit einer bestimmten Rolle. Sie können mehrere in einem Array angeben.
methods Geben Sie die zulässigen HTTP-Methodennamen in einem Array an.
excluded-methods Geben Sie den Namen der HTTP-Methode an, die als Array verweigert werden soll.
deny Auf true setzen, um den Zugriff zu verweigern(URLs, auf die Sie nicht über Keycoak Security Proxy usw. zugreifen möchten)。
permit Auf true setzen, um den Zugriff ohne Authentifizierung zu ermöglichen.
permit-and-inject Auf true setzen, um den Zugriff ohne Authentifizierung zu ermöglichen. Wenn es jedoch authentifiziert ist und darauf zugegriffen wird, werden Benutzerinformationen zum Header hinzugefügt.
authenticate Setzen Sie diesen Wert auf true, wenn Sie unabhängig von der Rolle nur über die Authentifizierung zugreifen möchten.

Nach dem Erstellen von proxy.json können Sie Security Proxy mit dem folgenden Befehl starten.

cd /usr/local/keycloak-proxy-3.3.0.CR2/
java -jar bin/launcher.jar proxy.json

Wenn es kein Problem mit der Einstellungsdatei gibt, wird die folgende Startmeldung angezeigt.

Home directory: /usr/local/keycloak-proxy-3.3.0.CR2
11 24, 2017 6:44:37 Uhr org.keycloak.proxy.ProxyServerBuilder initConnections
WARN: Generating temporary SSL cert
11 24, 2017 6:44:45 Uhr org.xnio.Xnio <clinit>
INFO: XNIO version 3.3.6.Final
11 24, 2017 6:44:45 Uhr org.xnio.nio.NioXnio <clinit>
INFO: XNIO NIO Implementation Version 3.3.6.Final

Funktionsprüfung

URL, die eine Authentifizierung erfordert

  1. Gehen Sie zu https://kc-proxy.example.com:18443/, für das eine Authentifizierung erforderlich ist.
  2. Da Sie sich nicht bei Keycloak angemeldet haben, werden Sie zum Anmeldebildschirm weitergeleitet.
  3. Melden Sie sich mit ID / PW an.
  4. Der obere Bildschirm von Tomcat wird angezeigt.
  5. Gehen Sie zu https://kc-proxy.example.com:18443/examples/servlets/servlet/RequestHeaderExample.
  6. Sie können sehen, dass die Keycloak-Benutzerinformationen mit dem HTTP-Header verknüpft sind. proxy04.png

URL, für die keine Authentifizierung erforderlich ist

  1. Gehen Sie zu https://kc-proxy.example.com:18443/examples/jsp/, für das keine Authentifizierung erforderlich ist.
  2. Sie können sehen, dass Sie die Seite ohne Authentifizierung durchsuchen können. proxy05.png

URL, für die die Administratorrolle erforderlich ist

  1. Gehen Sie zu https://kc-proxy.example.com:18443/examples/websocket/echo.xhtml, für das die Administratorrolle erforderlich ist.
  2. Melden Sie sich mit der ID / PW des Benutzers mit der Administratorrolle an.
  3. https://kc-proxy.example.com:18443/examples/websocket/echo.xhtml wird angezeigt. (Wenn Sie sich als Benutzer anmelden, der nicht über die Administratorrolle verfügt, wird eine 403-Fehlermeldung angezeigt.) proxy07.png

Zusammenfassung

Dieses Mal habe ich bestätigt, wie Keycloak und Security Proxy mit der ID verknüpft werden. Grundsätzlich können Sie die ID-Verknüpfung mit Keycloak überprüfen, indem Sie eine JSON-Datei zum Einstellen platzieren. Ich denke, dass dies als einfache Funktionsprüfung vom Typ Rivapro nützlich ist.

Es gibt jedoch einige Funktionsmängel als Liverpro, wenn Security Proxy ernsthaft in das System integriert wird.

Wenn Sie die Rivapro-Typkonfiguration verwenden, verwenden Sie daher "Versuchen Sie, die Rivapro-Typkonfiguration mit Keycloak (mod_auth_openidc Edition) zu erstellen", die ich im Artikel am 8. Tag erläutere, und kompensieren Sie dabei die oben genannten Mängel, Rivapro Flexible Einstellungen sind verfügbar.

Referenzmaterial

Fußnote

[^ auth-server-url]: Wenn Sie ein selbstsigniertes Serverzertifikat für die SSL-Verbindung mit dem Keycloak-Server verwenden, muss das Serverzertifikat in den Java-Truststore auf der Seite des Sicherheitsproxys importiert werden. (Da der Sicherheitsproxy über SSL direkt mit dem Keycloak-Server kommuniziert)

Recommended Posts

Versuchen Sie, mit Keycloak (Security Proxy Edition) eine Konfiguration vom Typ Liverpro zu erstellen.
Versuchen Sie, mit Keycloak mit Spring Security SAML (Spring 5) zu arbeiten.
Die Geschichte, einen Reverse-Proxy mit ProxyServlet zu erstellen
Versuchen Sie, mit Docker eine Java-Entwicklungsumgebung zu erstellen
[Anfänger] Versuchen Sie, mit Java ein einfaches RPG-Spiel zu erstellen ①
So richten Sie einen Proxy mit Authentifizierung in Feign ein
Versuchen Sie, die Idee eines zweidimensionalen Arrays mit einem eindimensionalen Array nachzuahmen
So erstellen Sie mit Docker ~ MySQL ~ eine [TypeScript + Vue + Express + MySQL] -Umgebung
Versuchen Sie, mit JRuby eine plattformübergreifende Anwendung zu erstellen (Generierung von JAR-Dateien).
Schritte zum Erstellen einer Ruby on Rails-Entwicklungsumgebung mit Vagrant
Wie man mit der Generierung dynamischer SQL-Abfragen ein wenig knifflig baut
[Gradle] Erstellen Sie ein Java-Projekt mit einer Konfiguration, die von der Konvention abweicht