magのOSS備忘録

使ったOSSソフトウェアについて書いていきます。

Keycloakの管理コンソールでIPアドレスごとのアクセス制御を行う

概要

KeycloakはWildFly上のアプリケーションとして実装されており、自身に対する、IPアドレスベースのアクセス制御などの機能はWildFlyが提供している。
WildFlyのサブシステムであるUndertowの設定を行うことで、アクセス制御を実施できる。

動機

Keycloakの前段にReverse Proxyを配置しているが、WEBの管理コンソールに直接アクセスする場合がある。
このケースでは当然Reverse Proxyでのアクセス制御はできないので、Keycloak本体にてアクセス制御をかける。
また、管理REST APIにも同様にアクセス制御をかけたい。

実行環境・前提条件

目次

設定概要

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を許可するように設定している。

参考