[JAVA] Essayez de créer une configuration de type Liverpro avec Keycloak (édition Security Proxy)

Que faire aujourd'hui

Cette fois, le 7ème jour du calendrier de l'Avent Keycloak, nous allons essayer le proxy de sécurité de Keycloak.

Security Proxy est un type de serveur proxy inverse simple (ci-après Rivapro) implémenté en Java. Le serveur Liverpro lui-même remplace l'adaptateur client de Keycloak, vous permettant de protéger le contenu du proxy et de contrôler l'accès sur une base par URL. Il convient à une utilisation lorsque le serveur d'applications ne prend pas en charge OpenID Connect ou SAML, il est difficile d'installer un adaptateur client ou l'environnement ne prend pas en charge l'adaptateur client.

Les principales fonctions sont les suivantes.

Cette fois, je vais essayer la procédure de protection avec Security Proxy pour l'exemple d'application d'origine de Tomcat 8.

Configuration du serveur pour le contrôle de fonctionnement

L'environnement d'essai cette fois est comme ça. Un royaume demo a été créé sur le serveur Keycloak (voir l'article du jour 3 (https://qiita.com/tamura__246/items/4290a1035e1adcab733b)), et les utilisateurs avec les rôles suivants On suppose qu'il existe.

FQDN OS JDK Constitution Port LISTEN
kc-server.example.com CentOS 7.4.1708 OpenJDK 1.8.0.151 · Serveur Keycloak 3.3.0.CR2 8443
kc-proxy.example.com CentOS 7.4.1708 OpenJDK 1.8.0.151 ・ Proxy de sécurité 3.3.0.CR2
・ Tomcat 8.5.23
・ 18443(Security Proxy)
・ 8080(Tomcat)
utilisateur rouleau
user001 user
admin001 user,admin

Dans l'application d'exemple fournie avec Tomcat, on suppose que le contrôle d'accès suivant est appliqué.

proxy_acl01.jpg

Les ports d'accès à chaque serveur lors de la vérification de l'opération sont les suivants. proxy_port01.png

Paramètres côté serveur Keycloak

Ajouter / configurer le client

  1. Connectez-vous à la console d'administration Keycloak.
  2. Dans la barre de menu de gauche, sélectionnez le domaine «demo».
  3. Cliquez sur «Client» dans la barre de menu de gauche. Une liste de clients s'affiche.
  4. Appuyez sur le bouton Créer en haut à droite.
  5. Entrez les paramètres client suivants et appuyez sur le bouton «Enregistrer».
  1. L'écran de paramétrage de kc-proxy continue de s'afficher. Effectuez les paramétrages suivants et appuyez sur le bouton Save. --Type d'accès: confidentiel
  1. Appuyez sur l'onglet «Credential».
  2. Notez la valeur affichée comme «secret». proxy03.png

Configuration et démarrage côté proxy de sécurité

Présentation de l'exemple d'application

Installez et démarrez Tomcat 8.0 comme exemple d'application pour vérifier la coopération.

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

Téléchargez et déployez le proxy de sécurité

Téléchargez le proxy de sécurité, décompressez-le dans / usr / local et changez-le dans le répertoire extrait.

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/

Création du fichier de configuration du proxy de sécurité

Créez le fichier de configuration suivant pour utiliser Security Proxy.

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


{
    "target-url": "http://localhost:8080",
    "send-access-token": true,
    "bind-address": "{Adresse IP / nom DNS à lier}",
    "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": "{Valeur secrète côté serveur Keycloak}"
                }
            },
            "constraints": [
                {
                    "pattern": "/*",
                    "authenticate": true
                },
                {
                    "pattern": "/examples/jsp/*",
                    "permit": true
                },
                {
                    "pattern": "/examples/websocket/*",
                    "roles-allowed": [
                        "admin"
                    ]
                }
            ]
        }
    ]
}

La signification des paramètres de configuration dans proxy.json est décrite ci-dessous.

configuration de base

Le nom du paramètre Obligatoire La description
target-url Spécifiez l'URL de transfert Liverpro.
send-access-token KEYCLOAK_ACCESS_Spécifie s'il faut envoyer le jeton d'accès à la destination proxy avec le nom d'en-tête TOKEN.
bind-address Spécifiez le nom DNS ou l'adresse IP à lier au socket du serveur proxy. Lors de la connexion depuis l'extérieur, spécifiez une valeur autre que l'adresse de bouclage.
http-port Spécifiez le numéro de port à écouter en tant que HTTP. Cependant, si l'accès HTTP est autorisé sera décrit plus tard.adapter-configdessl-requiredde設定値に依存します。
https-port Spécifiez le numéro de port à écouter en HTTPS.
keystore Spécifiez le magasin de clés utilisé lors de l'acceptation de HTTPS. Si vous ne spécifiez pas de fichier de clés, le certificat de serveur auto-signé temporaire généré automatiquement sera utilisé.
keystore-password Spécifiez le mot de passe du fichier de clés lorsque le fichier de clés est spécifié.
key-password Spécifiez le mot de passe clé du certificat de serveur à utiliser.
buffer-size Spécifie la taille de la mémoire tampon de socket du serveur HTTP. Normalement, la valeur par défaut est correcte.
buffers-per-region Spécifie le nombre de tampons de socket pour chaque région du serveur HTTP. Normalement, la valeur par défaut est correcte.
io-threads Spécifie le nombre de threads pour traiter les E / S. Normalement, la valeur par défaut est correcte.
worker-threads Spécifie le nombre de threads pour traiter la demande. Normalement, la valeur par défaut est correcte.

paramètres des applications

Le nom du paramètre Obligatoire La description
base-path Spécifie la racine de contexte de l'application."/"Doit commencer par.
error-page Si une erreur survient(Y compris lorsque l'accès est refusé)Spécifie la page d'erreur dans laquelle afficher. base-Spécifiez le chemin relatif à partir du chemin.
adapter-config Il sera décrit plus tard.

paramètres de configuration de l'adaptateur

Le nom du paramètre Obligatoire La description
realm Spécifiez le nom du domaine du côté Keycloak.
resource ID client dans les paramètres client côté Keycloak(client-id)Est spécifié.
auth-server-url Spécifiez l'URL de base du côté Keycloak.[^auth-server-url]
credentials Avec le type d'accès côté Keycloak"confidential"Obligatoire si vous spécifiez.
ssl-required Spécifie s'il faut forcer l'accès via HTTPS."all", "external", "none"Spécifiez l'un des. La valeur par défaut est"external"Par conséquent, l'accès HTTP n'est pas autorisé de l'extérieur.

: information_source: Comme il y a tellement de paramètres de configuration d'adaptateur, seuls les éléments minimum requis pour la vérification de fonctionnement sont répertoriés. Pour les autres paramètres, voir Référence "Java Adapter Config".

définition de la contrainte

Le nom du paramètre Obligatoire La description
pattern Spécifiez le modèle d'URL."/"Doit commencer par un joker(*)Ne peut être spécifié qu'à la fin.
Modèles valides:/foo/bar/*et/foo/*.txt
Modèle non valide:/*/foo/*
roles-allowed Ce paramètre autorise l'accès uniquement aux utilisateurs avec un rôle spécifique. Vous pouvez en spécifier plusieurs dans un tableau.
methods Spécifiez les noms de méthode HTTP autorisés dans un tableau.
excluded-methods Spécifiez le nom de la méthode HTTP à rejeter en tant que tableau.
deny Définir sur true pour refuser l'accès(URL auxquelles vous ne souhaitez pas accéder via Keycoak Security Proxy, etc.)。
permit Définissez sur true pour activer l'accès sans authentification.
permit-and-inject Définissez sur true pour activer l'accès sans authentification. Cependant, s'il est authentifié et accédé, les informations utilisateur seront ajoutées à l'en-tête.
authenticate Définissez sur true si vous souhaitez accéder uniquement par authentification, quel que soit le rôle.

Après avoir créé proxy.json, vous pouvez démarrer Security Proxy à partir de la commande suivante.

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

S'il n'y a pas de problème avec le fichier de configuration, le message de démarrage suivant s'affiche.

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

Contrôle de fonctionnement

URL nécessitant une authentification

  1. Accédez à https://kc-proxy.example.com:18443/, qui nécessite une authentification.
  2. Puisque vous ne vous êtes pas connecté à Keycloak, vous serez redirigé vers l'écran de connexion.
  3. Connectez-vous avec ID / PW.
  4. L'écran supérieur de Tomcat s'affiche.
  5. Accédez à https://kc-proxy.example.com:18443/examples/servlets/servlet/RequestHeaderExample.
  6. Vous pouvez voir que les informations utilisateur Keycloak sont liées à l'en-tête HTTP. proxy04.png

URL qui ne nécessite pas d'authentification

  1. Accédez à https://kc-proxy.example.com:18443/examples/jsp/, qui ne nécessite pas d'authentification.
  2. Vous pouvez voir que vous pouvez parcourir la page sans authentification. proxy05.png

URL qui nécessite le rôle d'administrateur

  1. Accédez à https://kc-proxy.example.com:18443/examples/websocket/echo.xhtml, qui nécessite le rôle d'administrateur.
  2. Connectez-vous avec l'ID / PW de l'utilisateur avec le rôle d'administrateur.
  3. https://kc-proxy.example.com:18443/examples/websocket/echo.xhtml s'affiche. (Si vous vous connectez en tant qu'utilisateur qui n'a pas le rôle d'administrateur, vous obtiendrez une erreur 403) proxy07.png

Résumé

Cette fois, j'ai confirmé comment lier Keycloak et Security Proxy avec ID. Fondamentalement, vous pouvez vérifier la liaison ID avec Keycloak simplement en plaçant un fichier json pour le réglage, donc je pense que c'est utile comme simple vérification de fonctionnement du type Rivapro.

Cependant, il existe des lacunes fonctionnelles en tant que Liverpro lors de l'incorporation sérieuse du proxy de sécurité dans le système.

Par conséquent, lors de l'utilisation de la configuration de type Rivapro, en utilisant "Essayer de construire la configuration de type Rivapro avec Keycloak (édition mod_auth_openidc)" que j'explique dans l'article du 8ème jour, tout en compensant les lacunes ci-dessus, Rivapro Des paramètres flexibles sont disponibles.

Matériel de référence

note de bas de page

[^ auth-server-url]: lors de l'utilisation d'un certificat de serveur auto-signé pour la connexion SSL avec le serveur Keycloak, il est nécessaire d'importer le certificat de serveur dans le magasin de clés de confiance Java du côté du proxy de sécurité. (Parce que le proxy de sécurité communique directement avec le serveur Keycloak via SSL)

Recommended Posts

Essayez de créer une configuration de type Liverpro avec Keycloak (édition Security Proxy)
Essayez de travailler avec Keycloak en utilisant Spring Security SAML (Spring 5)
L'histoire de la création d'un proxy inverse avec ProxyServlet
Essayez de créer un environnement de développement Java à l'aide de Docker
[Débutant] Essayez de créer un jeu RPG simple avec Java ①
Comment configurer un proxy avec authentification dans Feign
Essayez d'imiter l'idée d'un tableau à deux dimensions avec un tableau à une dimension
Comment créer un environnement [TypeScript + Vue + Express + MySQL] avec Docker ~ MySQL ~
Faisons une application multiplateforme avec JRuby (génération de fichier jar)
Étapes pour créer un environnement de développement Ruby on Rails avec Vagrant
Comment construire un peu délicat avec la génération de requêtes SQL dynamiques
[Gradle] Construisez un projet Java avec une configuration différente de la convention