Jenkinsの認証にGitHub Enterpriseを利用する


はじめに

現在使用しているJenkinsは、Active Directoryでユーザー認証し、Role-Based Strategyで認可設定をしています。

一つのJenkinsインスタンスで複数のPJが共存するという構成の都合上、認可設定が最も柔軟にできるということからこの構成としているのですが、Role-Based Strategyによる認可判定の際にログインIDの大文字・小文字が区別されてしまうという課題がありました。

そのため、認証は通るが認可が正しく行われないという事象が発生してしまいます。利用者からの問い合わせも頻発しており、他の認証認可方式を検討することになりました。

なお、Role-Based Strategyで大文字・小文字を区別せず処理するエンハンスについてはプルリクエストがオープンされているため、そう遠くないうちにプラグイン側で対応されるかもしれません。

Jenkinsサイズ問題

そもそも柔軟な認可設定が必要な背景として、複数PJが同じJenkinsインスタンスを共有している現状があります。
これはいまにして思えば完全にアンチパターンな構成です。
プラグイン間の相性問題に悩まされるJenkinsでは、同一のJenkinsインスタンスを利用するユーザーは最小限に留めるのがベストプラクティスといえます。
そこで、今回はJenkinsインスタンスをPJ単位に分割させ、最小限のユーザーのみがアクセスできればよいという前提で進めます(フォルダ単位でのアクセス制御はしない前提)。

Active Directory認証問題

実はもう一つ大きな問題として、Active Directoryでの認証が異常に遅いという問題がありました。
社内環境固有の問題と判断し対応を後回しにしてきましたが、今回この問題も合わせて解消できないか検証します。

構成

認証には GitHub Authentication Pluginを、認可にはMatrix Authorization Strategy Pluginを使って検証します。

前提

  • Jenkinsは推奨プラグインが一式インストール済みであること
  • GitHub Enterpriseがセットアップ済みであること

認証設定

  1. Pluginインストール
    GitHub Authentication Pluginは推奨プラグインとしてインストールされていないため、個別にインストールします。
    [Jenkinsの管理]→[プラグインの管理]とすすみ、利用可能タブで フィルターにはGitHub Authentication と入力します。
    表示されたプラグインをインストールします。

  2. GitHub Enterprise OAuthApp作成
    GitHub EnterpriseにOAuthAppを作成します。
    Application nameは任意の名称を、Homepage URLにはJenkinsのベースURLを、Authorization callback URLには[JenkinsURL]/securityRealm/finishLoginを記述してRegister applicationをクリックします。

  3. ID/Secret確認
    登録すると、Client IDClient Secretが表示されるので控えておきます(後からでも確認はできます)

  4. Jenkinsのセキュリティ設定
    [Jenkinsの管理]→[グローバルセキュリティの設定]をクリックし、アクセス制御の項目はGithub Authentication Pluginを選択します。
    GitHub Web URIにはGitHub EntepriseのURLを、GitHub API URIでは[GitHub Web URL]/api/v3を入力し、Client IDとClient Secretは手順3で控えておいた値を入力します。

  5. 認可設定
    アクセス制御の下にある権限管理で行列による権限設定を選択し、一旦はAuthenticated Usersに対してAdministerを付与しておきます。
    その後設定を保存し、ログアウトします。

  6. 初回ログイン
    設定完了後にJenkinsにアクセスすると認可を許可するか確認する画面が表示されるので(初回のみ)、Authorize ***をクリックします。

  7. アクセス確認
    下記の通り、[Jenkinsの管理]リンクも含めたページが表示されれば正常に設定できています。

認可設定

現状は、GitHubEnterpriseにログイン可能なユーザーは全員Administer権限を持っていますので、認可設定を行います。
[Jenkinsの管理]→[グローバルセキュリティの設定]で、権限管理にユーザーを追加し、付与したい権限を設定すればOKです。
試しに、Administer権限を特定ユーザーのみに設定し、Authenticated Usersからははく奪してみます。

すると、そのはく奪されたユーザーにはこのようなメッセージが表示されます。

あとは、Administerを付与されたユーザーで、必要な権限を設定していけばOKです。

これで、ログイン時に入力するIDの大文字小文字の区別なく、ユーザーに対して認証・認可を設定することができました。

おまけ

うっかりAdminister権限を全員からはく奪してしまったらどうなるか?
試してみましたが、最後の一人(またはグループ)からはAdministerを除外できないように親切設計されていました。
(UI的にできてしまうように見えますが)

また、設定そのものは、[Jenkinsインストール先]\config.xml に記述されているため、
ここを編集することで復旧させたり、あるいは認可作業自体を自動化することもできそうですね。

例えば、今回の設定を復元させたい場合には下記の項目を追加すれば大丈夫です。

<?xml version='1.1' encoding='UTF-8'?>
<hudson>
    <!-- 中略 -->
    <authorizationStrategy class="hudson.security.GlobalMatrixAuthorizationStrategy">
        <permission>hudson.model.Hudson.Administer:github-admin</permission>
        <!-- ここに付与したい権限とユーザーの組み合わせで記述 -->
    </authorizationStrategy>
    <!-- 中略 -->
</hudson>

まとめ

ということで、Jenkinsの認証・認可の検証は無事にできました。
GitHub Authentication と Matrix Authorization Strategy を利用することで、ログイン時の大文字小文字の区別なく認可設定しつつ、AdctiveDirecory認証時のパフォーマンス問題を回避することができました。
参考になれば幸いです。