はじめに
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 アプリ設定画面への移動
設定したい対象の組織ページの Settings > OAuth Apps
に遷移し、Register an application ボタンを押します。
OAuth アプリの登録
以下の三項目を入力します。 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 側の二要素認証を必須にする
組織設定で GitHub の認証時に二要素認証を必須にするかどうかを設定できるのでこれを設定します。
Settings > Security
に遷移Require two-factor authentication for everyone in the {name} organization
にチェックを入れる
二要素認証強制を設定するとその組織に所属する二要素認証を設定していないユーザはアクセス権限が剥奪されるため、事前に合意と組織に所属する全員の二要素認証設定が必要です。詳細は「Organization で 2 要素認証を要求する」を参照してください。
Jenkins 側で設定すること
ここから二要素認証をかける Jenkins の設定を行います。
GitHub Authentication Plugin のインストール
プラグイン管理の「利用可能」タブに移動し、フィルターで Github Authentication
を入れて検索してインストールします。
https://plugins.jenkins.io/github-oauth/
Matrix Authorization Strategy Plugin のインストール
通常は初回インストール時に明示的に無効にしなければインストールされますが、もしインストールしていない場合はプラグイン管理の「利用可能」タブに移動し、フィルターで Matrix Authorization Strategy
を入れて検索してインストールします。
https://plugins.jenkins.io/matrix-auth/
GitHub Authentication Plugin の認証設定
Jenkins の管理 > グローバルセキュリティの設定 > Authentication から Github Authentication Plugin を選択し、必要な項目を入力します。
- GitHub Web URI
- github.com あるいは GHE の URL を入力
- GitHub API URL
- GHE の場合は
{ GHE の URL }/api/v3
を入力
- GHE の場合は
- 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 で運用効率化を意識しながら基盤提供する仲間を募集 しています!