Keycloakの管理コンソールでIPアドレスごとのアクセス制御を行う
概要
KeycloakはWildFly上のアプリケーションとして実装されており、自身に対する、IPアドレスベースのアクセス制御などの機能はWildFlyが提供している。
WildFlyのサブシステムであるUndertowの設定を行うことで、アクセス制御を実施できる。
動機
Keycloakの前段にReverse Proxyを配置しているが、WEBの管理コンソールに直接アクセスする場合がある。
このケースでは当然Reverse Proxyでのアクセス制御はできないので、Keycloak本体にてアクセス制御をかける。
また、管理REST APIにも同様にアクセス制御をかけたい。
実行環境・前提条件
- Keycloak 17.0.0
- WildFly 26.0.0
目次
設定概要
WildFlyが提供するCLIで変更する方法や、standalone.xmlなどを直接編集する方法などがあるが、ここではstandalone.xmlを編集する方法を記載する。 ここでは動機欄に書いた通り、「Reverse Proxyの後ろでKeycloakを運用しているケースにて、管理コンソースと管理REST APIへのアクセス制御」を行う設定を想定する。
設定方法
各設定項目についての説明は参考リンク先を参照すること。
Undertowに対して、expression-filterを定義し、それを適用する。
定義は<filters><expression-filter>
で行い、<server><host><filter-ref>
で適用する。
設定例
以下は、Keycloak 17.0.0に付属するstandalone.xmlを抜粋したものに対して、修正を実施した内容である。
<subsystem xmlns="urn:jboss:domain:undertow:12.0" default-server="default-server" default-virtual-host="default-host" default-servlet-container="default" default-security-domain="other" statistics-enabled="${wildfly.undertow.statistics-enabled:${wildfly.statistics-enabled:false}}"> <buffer-cache name="default"/> <server name="default-server"> <http-listener name="default" socket-binding="http" redirect-socket="https" enable-http2="true"/> <https-listener name="https" socket-binding="https" ssl-context="applicationSSC" enable-http2="true"/> <host name="default-host" alias="localhost"> <location name="/" handler="welcome-content"/> <http-invoker http-authentication-factory="application-http-authentication"/> <!-- ★定義したexpression-filterを適用する --> <filter-ref name="kc-admin-reject"/> </host> </server> <servlet-container name="default"> <jsp-config/> <websockets/> </servlet-container> <handlers> <file name="welcome-content" path="${jboss.home.dir}/welcome-content"/> </handlers> <!-- ★expression-filterを定義する --> <filters> <expression-filter name="kc-admin-reject" expression="proxy-peer-address; regex('(^/auth$)|(^/auth/$)|(^/auth/admin)|(^/auth/realms/master)') -> ip-address-control(acl={'xxx.xxx.xxx.xxx/24 127.0.0.1 allow'})"/> </filters> <application-security-domains> <application-security-domain name="other" security-domain="ApplicationDomain"/> </application-security-domains> </subsystem>
設定例の説明
- proxy-peer-address
Reverse Proxyの後段では送信元IPアドレスがReverse Proxyのものになってしまう。一般的にReverse ProxyはX-Forwarded-Forヘッダなどに元々の送信元IPアドレスを設定する。proxy-peer-addressは送信元IPアドレスをX-Forwarded-Forの値で上書きしてくれる。 - regex
アクセス制御を行うパスを限定している。ここではKeycloakの管理コンソールや管理REST APIに関連する、以下のパスに対してアクセス制御を実施する。- /authのみのパス
- /auth/のみのパス
- /auth/adminから始まるパス
- /auth/realms/masterから始まるパス
- ip-access-control
IPアドレスによるアクセス制御を指定できる。ここではxxx.xxx.xxx.xxx/24と、127.0.0.1を許可するように設定している。