GitHub Authentication Plugin を使った Jenkins の二要素認証の実現

KCS 部の島崎です。 KCS部は、KADOKAWAグループ向けプライベートクラウド(以下KCS)を提供しており、主な利用者は株式会社ドワンゴがサービスを提供している『niconico』です。

今回は Jenkins の二要素認証を実現するための方法について投稿します。

Jenkins をどのように使っているか?

Jenkins は主に admin operation で利用しています。なお、これらは基盤運用チームのみが実行できるように制限をかけています

  • 利用者アカウントの発行
  • 利用者アカウントの削除
  • インスタンスの作成
  • インスタンスの更新(スケールアップ)
  • インスタンスの削除

Jenkins に二要素認証をかける理由とは

背景としてまずセキュリティ強化があり、次の状態にありました。

認証方法 二要素認証の方法 備考
SSH (操作対象) 公開鍵認証 N/A 踏み台サーバからしか入れない
SSH (踏み台) 公開鍵認証 Google Authenticator PAM
Jenkins LDAP なし

Jenkins は SSH と同様にホストを直接操作できるものでしたが、認証方法が二要素認証になっていませんでした。

Jenkins の二要素認証は SAML プラグイン を利用した説明を主 (1) (2) としますが、今回は下記の理由から、Jenkins 公式プラグインの一つである GitHub Authentication Plugin を採用しました。

GitHub Authentication Plugin による二要素認証のメリット

GitHub Authentication Plugin を利用することにより次のメリットを享受することができます。

  • 認証を Jenkins ではなく GitHub で実施することができるようになる
    • Jenkins でユーザ管理する必要がなくなります
  • GitHub 側で二要素認証を利用することが可能であり、組織設定により二要素認証利用を強制することができる
    • 二要素認証の強制方法については後述します
  • 認可設定に Organization もしくは Team を扱うことができる
    • Organization または Team に設定することにより、所属するユーザへ個別に認可設定を行う必要がなくなります

GitHub Authentication Plugin は github.com だけではなく GitHub Enterprise (以下 GHE) でも利用可能です。設定手順は以下の通りです。

二要素認証の導入手順

GitHub 側で設定すること

Jenkins 側で実施する前に GitHub 側の設定を実施します。これは Jenkins で設定するときに必要な情報を取得するためです。

GitHub の OAuth アプリを作成する

GitHub Authentication Plugin は GitHub の OAuth アプリを利用するため、認証及び認可用のアプリを作成します。

OAuth アプリ設定画面への移動

f:id:kdx_writer:20200622192445p:plain

設定したい対象の組織ページの Settings > OAuth Apps に遷移し、Register an application ボタンを押します。

OAuth アプリの登録

f:id:kdx_writer:20200626203943p:plain

以下の三項目を入力します。 some.jenkins は設定対象の jenkins のドメインに置き換えます。

  • Application name
    • ここでは Jenkins にする
  • Homepage URL
    • Jenkins の URL
  • Authorization callback URL
    • http://{Jenkins のURL}/securityRealm/finishLogin を入力

説明の入力は任意ですが後から何に使うためのアプリかわかるように書いておきます。

OAuth トークン発行

登録後以下の二項目を控えます。これらは個別の OAuth アプリ画面から後から確認することができます。

  • Client ID
  • Client Secret

GitHub 側の二要素認証を必須にする

f:id:kdx_writer:20200622192536p:plain

組織設定で GitHub の認証時に二要素認証を必須にするかどうかを設定できるのでこれを設定します。

  • Settings > Security に遷移
  • Require two-factor authentication for everyone in the {name} organization にチェックを入れる

二要素認証強制を設定するとその組織に所属する二要素認証を設定していないユーザはアクセス権限が剥奪されるため、事前に合意と組織に所属する全員の二要素認証設定が必要です。詳細は「Organization で 2 要素認証を要求する」を参照してください。

Jenkins 側で設定すること

ここから二要素認証をかける Jenkins の設定を行います。

GitHub Authentication Plugin のインストール

f:id:kdx_writer:20200622192554p:plain

プラグイン管理の「利用可能」タブに移動し、フィルターで Github Authentication を入れて検索してインストールします。

https://plugins.jenkins.io/github-oauth/

Matrix Authorization Strategy Plugin のインストール

通常は初回インストール時に明示的に無効にしなければインストールされますが、もしインストールしていない場合はプラグイン管理の「利用可能」タブに移動し、フィルターで Matrix Authorization Strategy を入れて検索してインストールします。

https://plugins.jenkins.io/matrix-auth/

GitHub Authentication Plugin の認証設定

f:id:kdx_writer:20200622192608p:plain

Jenkins の管理 > グローバルセキュリティの設定 > Authentication から Github Authentication Plugin を選択し、必要な項目を入力します。

  • GitHub Web URI
    • github.com あるいは GHE の URL を入力
  • GitHub API URL
    • GHE の場合は { GHE の URL }/api/v3 を入力
  • Client ID
  • Client Secret
    • 先の「OAuth アプリの作成」で出た Client ID と Client Secret を入力
  • OAuth Scope(s)
    • read:org,user:email を入力

Matrix Based Role Strategy Plugin の認可設定

Jenkins の管理 > グローバルセキュリティの設定 > 権限管理 から「行列による権限設定」にチェックを入れ、認可設定を行います。GitHub Authentication Plugin が働くので、GitHub のユーザだけでなく GitHub のチームをグループとして扱うことができるようになります。

どう認可するか?

Organization の権限レベル にあるように GitHub の Organization の権限レベルの基本は Owner と Member です。これを元に認可設定します。 GitHub Authentication Plugin は GitHub のチームも認識するので、Owner と Member でわけたチーム設定をすると認可設定を GitHub 側のみで完結することができるようになります。

  • Owner はジョブ設定変更や管理などの権限をもたせる
  • Member は読み取りとビルド関連のみに設定する
  • チーム外の認証だけできるユーザは何もできないように設定する

認証及び認可の確認

設定後 GitHub から一回ログアウトし、Jenkins にログインするときに GitHub の認証及び認可画面が表示されるかを確認します。

Jenkins からログアウトしても GitHub からログアウトしない限り Jenkins におけるログイン状態が続く点に注意が必要です。

まとめ

Jenkins の二要素認証を実現するために GitHub Authentication Plugin を利用した二要素認証のメリットと導入及び設定方法を説明しました。

GitHub の機能により二要素認証の利用及び組織単位の強制が可能になります。また、ユーザ管理においても GitHub 内で完結できるため Jenkins の管理コストを下げることが可能になります。

KADOKAWA Connected では、 Private Cloud で運用効率化を意識しながら基盤提供する仲間を募集 しています!