らくがきちょう

なんとなく

Samba でユーザ管理し、Gitea へのログインを Keycloak でシングルサインオンする

先日、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 関連パラメータとは別に下記のパラメータが必要になります。 これらのパラメータを事前に用意しておくと後の作業がスムーズです。

  1. LDAP 関連
    • Connection URL (※ Samba へ接続するプロトコルFQDN)
    • User DN
    • Bind DN
    • Bind Credential
    • Custom User LDAP Filter (※ Group 検索する為のフィルタ)
  2. Keycloak 関連
    • サーバの FQDN
    • Realm
    • Client ID
    • Client Secret
  3. Gitea 関連
    • サーバの FQDN
    • 認証名
  4. その他のパラメータ (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 をクリックします。

f:id:sig9:20190715120910p:plain:w800

Step.2

Name に Realm 名を入力します。 ここで入力する Realm 名は Gitea 側へ設定する URI に影響しますので、入力した値を控えておきます。 Realm 名を入力したら Create をクリックします。

f:id:sig9:20190715120921p:plain:w800

Step.3

Realm が作成されたら画面左にある Clients をクリックし、更に右上にある Craete をクリックして次へ進みます。

f:id:sig9:20190715121027p:plain:w800

Step.4

Client ID を入力します。 Client ID も Gitea 側で認証ソースを作成する際に必要となりますので入力した値を控えておきます。 Client ID を入力したら Save をクリックして次へ進みます。

f:id:sig9:20190715121035p:plain:w800

Step.5

Client の設定を行います。 Access Type は初期状態で public になっていると思われる為、これは confidential に変更しておきます。 また、Valid Redirect URIs には今回の想定値を入力しておきます。 この値は後で Gitea で入力する認証ソースの認証名に依存しますが、今回は https://git.example.com/user/oauth2/[認証名]/callback と入力します。 入力が完了したら Save をクリックして次へ進みます。

f:id:sig9:20190715121044p:plain:w800

Step.6

Client の設定が完了したら該当 Client の Credentials タブをクリックし、表示される Secret の値を控えておきます。 この値も後ほど、Gitea で新規の認証ソースを作成する際に必要になります。

f:id:sig9:20190715121055p:plain:w800

Step.7

次は LDAP との連携設定を行います。 画面左側のメニューから User Federation をクリックします。 Providor を選択する画面になるので、今回は ldap を選択して次へ進みます。

f:id:sig9:20190715121105p:plain:w800

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 をクリックして次へ進みます。

[f:id:sig9:20190715121122p:plain:800]

Step.9

User Federation の設定が保存されたら下記画面のように、幾つかボタンが増えます。 このうち、Synchroniza all users をクリックし、LDAP へ接続して Filter 条件に一致するユーザ情報を取得出来ることを確認します。

f:id:sig9:20190715180144p:plain:w800

Step.10

左側のメニューから Users をクリックすると、LDAP から同期に成功したユーザの一覧が表示されているはずです。

f:id:sig9:20190715121136p:plain:w800

Gitea の設定

続いて Gitea の設定を行います。

Step.1

ブラウザで https://git.example.com/install へアクセスし、Web インストーラを起動します。 以下のように入力してインストーラを完了させます。 OpenID での登録のみを許可するように設定するのが今回のポイントです。

f:id:sig9:20190715121308p:plain

なぜか「ページ一覧にサインインが必要」等の設定が反映されない為に Gitea を再起動します。 ついでに /opt/gitea/bin/custom/conf/app.ini[server] セクションへ下記を追加します。

START_SSH_SERVER = true

追記が完了したら Gitea を再起動して設定変更を反映します。

systemctl restart gitea

Step.2

Gitea の管理者でログインしたら、画面右上のメニューから サイト管理 をクリックして次へ進みます。

f:id:sig9:20190715121320p:plain:w800

Step.3

画面上部の 認証ソース をクリックして次へ進みます。

f:id:sig9:20190715121332p:plain:w800

Step.4

認証ソースに必要ならパラメータを入力します。 認証タイプは OAuth2、OAuth2 プロパイダーは OpenID Connect を選択します。 認証名は「Keycloak 側に入力する URI と連動する」点を意識する必要があります。つまり、ここで入力する認証名を変更してしまうと、Keycloak 側へ入力する URI も変更が必要 という点です。 「クライアント ID (キー)」には Keycloak 側で入力した Client ID を入力します (今回は gitea)。 「クライアントシークレット」には Keycloak の Client → Credentials で確認出来る Client Secret の値を入力します。 必要なパラメータを入力したら 認証ソースを追加 をクリックして次へ進みます。

f:id:sig9:20190715121342p:plain:w800

Step.5

設定値に明らかな誤りがある場合は認証ソースの追加に失敗します。 妥当性のあるパラメータを入力していれば、認証ソースの追加に成功するはずです。

f:id:sig9:20190715121351p:plain:w800

Gitea へのシングルサインオン

ここまでの手順で Keycloak と Gitea の設定は完了です。 ここからは Gitea へシングルサインオンしてみます。

Step.1

Gitea のトップページから画面右上の サインイン をクリックして次へ進みます。

f:id:sig9:20190715121403p:plain:w800

Step.2

ここでは ユーザー名やパスワードは入力せずに、画面下側にある こちらでサインイン OpenID Connect をクリックして次へ進みます。

f:id:sig9:20190715121413p:plain:w800

Step.3

Keycloak の認証フォームへリダイレクトされます。 Samba なドメインコントローラ上に作成済みユーザのユーザ名とパスワードを入力し、次へ進みます。

f:id:sig9:20190715121426p:plain

Step.4

初回ログイン時のみ、アカウント復旧用のパスワードを追加するように要求されます。 おそらく字面通りの意味だとは思うのですが、この「アカウント復旧用」設定がどういった状況で利用されるのか、分かっていません…

f:id:sig9:20190715121437p:plain:w800

Step.5

(2 会目以降は SSO でログインすると、すぐに Gitea へログイン出来るのですが) 初回アクセス時のみ、なぜかサインイン画面に戻ってしまいました。 この状態で再度、画面下側にある こちらでサインイン OpenID Connect をクリックして次へ進みます。

f:id:sig9:20190715121446p:plain:w800

Step.6

これでユーザ名 / パスワードを再入力することなく、Gitea へログイン出来ました。

f:id:sig9:20190715121456p:plain:w800