先日、AmazonLinux2 + Gogs で LDAP 認証 / TLS 対応な Git リポジトリを構築するというメモを書いたのですが、どうやら現状の Gogs では SAML や OpenConnect ID での認証には対応していないようです。 しかし、Gogs から Fork した Gitea であれば SAML や OpenConnect ID に対応しています。 そこで今回は Samba + Keycloak + Gitea でシングルサインオン環境を構築してみます。
環境
今回は以下の環境で作業しました。
- Samba + Keycloak サーバ
- AmazonLinux2
- Samba はドメインコントローラとして構成済み
- Keycloak もインストール済み (但し、Realm は未作成)
- Gitea サーバ
- AmazonLinux2
- Gitea はインストール済み
- 但し、Gitea の初期設定は未実施
事前に準備すべきパラメータ
Samba へ接続する為の LDAP 関連パラメータとは別に下記のパラメータが必要になります。 これらのパラメータを事前に用意しておくと後の作業がスムーズです。
- LDAP 関連
- Keycloak 関連
- サーバの FQDN
- Realm
- Client ID
- Client Secret
- Gitea 関連
- サーバの FQDN
- 認証名
- その他のパラメータ (URI)
- Keycloack に設定する Valid Redirect URIs
- Gitea に設定する OpenID Connect 自動検出 URL
「Keycloack に設定する Valid Redirect URIs」は、以下のように生成されます (「Gitea サーバの FQDN」と「認証名」が分かれば生成出来ます)。
https://git.example.com/user/oauth2/[認証名]/callback
「Gitea に設定する OpenID Connect 自動検出 URL」は以下のように生成されます (「Keycloack サーバの FQDN」と「Realm」が分かれば生成出来ます)
https://auth.example.com/auth/realms/[Realm]/.well-known/openid-configuration
今回の仮パラメータ
今回は以下のパラメータで設定するものとします。
LDAP 関連パラメータ
項目 | 値 |
---|---|
Connection URL | ldaps://auth.example.com |
Users DN | OU=People,DC=example,DC=com |
Bind DN | CN=manager,CN=Users,DC=example,DC=com |
Bind Credential | manager-pass |
Custom User LDAP Filter | (&(objectCategory=Person)(sAMAccountName=*)(memberOf=CN=Members,OU=Groups,DC=example,DC=com)) |
Keycloak 関連パラメータ
項目 | 値 |
---|---|
サーバの FQDN | auth.example.com |
Realm | members |
Client ID | gitea |
Client Secret | (gitea 上で生成) |
Gitea 関連パラメータ
項目 | 値 |
---|---|
サーバの FQDN | auth.example.com |
Realm | members |
Client ID | gitea |
Client Secret | (gitea 上で生成) |
その他のパラメータ
項目 | 値 |
---|---|
Keycloack に設定する Valid Redirect URIs | https://git.example.com/user/oauth2/[認証名]/callback |
Gitea に設定する OpenID Connect 自動検出 URL | https://auth.example.com/auth/realms/[Realm]/.well-known/openid-configuration |
Kyecloak の設定
最初に、Keycloak から設定していきます。
Step.1
Realm 名をクリックし、Add realm
をクリックします。
Step.2
Name に Realm 名を入力します。 ここで入力する Realm 名は Gitea 側へ設定する URI に影響しますので、入力した値を控えておきます。 Realm 名を入力したら Create
をクリックします。
Step.3
Realm が作成されたら画面左にある Clients
をクリックし、更に右上にある Craete
をクリックして次へ進みます。
Step.4
Client ID を入力します。 Client ID も Gitea 側で認証ソースを作成する際に必要となりますので入力した値を控えておきます。 Client ID を入力したら Save
をクリックして次へ進みます。
Step.5
Client の設定を行います。 Access Type は初期状態で public
になっていると思われる為、これは confidential
に変更しておきます。 また、Valid Redirect URIs には今回の想定値を入力しておきます。 この値は後で Gitea で入力する認証ソースの認証名に依存しますが、今回は https://git.example.com/user/oauth2/[認証名]/callback
と入力します。 入力が完了したら Save
をクリックして次へ進みます。
Step.6
Client の設定が完了したら該当 Client の Credentials
タブをクリックし、表示される Secret
の値を控えておきます。 この値も後ほど、Gitea で新規の認証ソースを作成する際に必要になります。
Step.7
次は LDAP との連携設定を行います。 画面左側のメニューから User Federation
をクリックします。 Providor を選択する画面になるので、今回は ldap
を選択して次へ進みます。
Step.8
LDAP 連携に関する設定を入力していきます。 今回の想定パラメータを再掲しておきます。
項目 | 値 |
---|---|
Connection URL | ldaps://auth.example.com |
Users DN | OU=People,DC=example,DC=com |
Bind DN | CN=manager,CN=Users,DC=example,DC=com |
Bind Credential | manager-pass |
Custom User LDAP Filter | (&(objectCategory=Person)(sAMAccountName=*)(memberOf=CN=Members,OU=Groups,DC=example,DC=com)) |
これを実際に入力すると以下のようになります。 入力した値の動作確認を行うには、入力値右側の Test connection
をクリックし、結果が Success
になることを確認します。 必要なパラメータを全て入力したら Save
をクリックして次へ進みます。
[:800]
Step.9
User Federation
の設定が保存されたら下記画面のように、幾つかボタンが増えます。 このうち、Synchroniza all users
をクリックし、LDAP へ接続して Filter 条件に一致するユーザ情報を取得出来ることを確認します。
Step.10
左側のメニューから Users
をクリックすると、LDAP から同期に成功したユーザの一覧が表示されているはずです。
Gitea の設定
続いて Gitea の設定を行います。
Step.1
ブラウザで https://git.example.com/install
へアクセスし、Web インストーラを起動します。 以下のように入力してインストーラを完了させます。 OpenID での登録のみを許可するように設定するのが今回のポイントです。
なぜか「ページ一覧にサインインが必要」等の設定が反映されない為に Gitea を再起動します。 ついでに /opt/gitea/bin/custom/conf/app.ini
の [server]
セクションへ下記を追加します。
START_SSH_SERVER = true
追記が完了したら Gitea を再起動して設定変更を反映します。
systemctl restart gitea
Step.2
Gitea の管理者でログインしたら、画面右上のメニューから サイト管理
をクリックして次へ進みます。
Step.3
画面上部の 認証ソース
をクリックして次へ進みます。
Step.4
認証ソースに必要ならパラメータを入力します。 認証タイプは OAuth2
、OAuth2 プロパイダーは OpenID Connect
を選択します。 認証名は「Keycloak 側に入力する URI と連動する」点を意識する必要があります。つまり、ここで入力する認証名を変更してしまうと、Keycloak 側へ入力する URI も変更が必要 という点です。 「クライアント ID (キー)」には Keycloak 側で入力した Client ID を入力します (今回は gitea
)。 「クライアントシークレット」には Keycloak の Client → Credentials で確認出来る Client Secret の値を入力します。 必要なパラメータを入力したら 認証ソースを追加
をクリックして次へ進みます。
Step.5
設定値に明らかな誤りがある場合は認証ソースの追加に失敗します。 妥当性のあるパラメータを入力していれば、認証ソースの追加に成功するはずです。
Gitea へのシングルサインオン
ここまでの手順で Keycloak と Gitea の設定は完了です。 ここからは Gitea へシングルサインオンしてみます。
Step.1
Gitea のトップページから画面右上の サインイン
をクリックして次へ進みます。
Step.2
ここでは ユーザー名やパスワードは入力せずに、画面下側にある こちらでサインイン OpenID Connect
をクリックして次へ進みます。
Step.3
Keycloak の認証フォームへリダイレクトされます。 Samba なドメインコントローラ上に作成済みユーザのユーザ名とパスワードを入力し、次へ進みます。
Step.4
初回ログイン時のみ、アカウント復旧用のパスワードを追加するように要求されます。 おそらく字面通りの意味だとは思うのですが、この「アカウント復旧用」設定がどういった状況で利用されるのか、分かっていません…
Step.5
(2 会目以降は SSO でログインすると、すぐに Gitea へログイン出来るのですが) 初回アクセス時のみ、なぜかサインイン画面に戻ってしまいました。 この状態で再度、画面下側にある こちらでサインイン OpenID Connect
をクリックして次へ進みます。
Step.6
これでユーザ名 / パスワードを再入力することなく、Gitea へログイン出来ました。