Jenkinsでユーザーに権限を付与してアクションを制限する

# 目的
Jenkinsのセキュリティ対応。
デフォルトの状態だと、JenkinsのURLにアクセス出来る人であれば、全ての機能をいじることが可能で危険すぎるため、以下のセキュリティ対策を行います。

* ユーザーアカウントを作成してログイン必須にする。
* ユーザーに権限を付与して行動を制限する。   

# 手順メモ

## 権限付与プラグインのインストール
1. メニューから、「Jenkinsの管理」->「プラグインの管理」を選択して、プラグインマネージャーページを開く。

2. 「利用可能」タブ内の「その他（security）」カテゴリにある「Role-based Authorization Strategy」をチェックして、「再起動せずにインストール」ボタンを押す。
<img alt="アップデートセンター__Jenkins_.png" src="https://qiita-image-store.s3.amazonaws.com/0/109136/1f01eb85-ee1c-968a-a52c-d1832a94a3b1.png">

これでプラグインがインストールされます。
試した感じだと、このプラグインを反映させるために、Jenkinsの再起動は必要なかったです。

## プラグインを有効化
1. メニュー「Jenkinsの管理」-> 「グローバルセキュリティの設定」を選択して、グローバルセキュリティの設定ページを開く。
2. 「セキュリティを有効化」にチェックを入れる。
3. チェックを入れると「アクセス制御」という項目が追加されるので、「ユーザー情報」で「Jenkinsのユーザーデータベース」を選択する。   
   これによりユーザーの登録を行うことが可能になります。
4. 見知らぬユーザーにサインアップされないように、「ユーザーにサインアップを許可」のチェックを外す。
5. 「アクセス制御」内の「権限管理」で「Role-Based Strategy」を選択する。  
   これにより、インストールした「Role-based Authorization Strategy」プラグインが有効になり、権限設定可能になります。
6. 「保存」ボタンを押して設定を反映する。

<img width="500" alt="貼り付けた画像_2016_01_13_14_14.png" src="https://qiita-image-store.s3.amazonaws.com/0/109136/0e0437be-8da2-4c5d-0cf1-a16bf8584be9.png">

## ユーザーを登録
権限を付与するテスト用ユーザーを作成します。
例として、admin権限を所持させるtest1と、閲覧・ジョブ実行権限を所持させるtest2を作成します。

1. セキュリティを有効にして保存ボタンを押すとユーザー登録ページが表示されるので、権限確認用に「test1」ユーザーを作成する。   
<img alt="BB2D5FA3-0314-47FC-AB0D-82E9D6588F41.png" src="https://qiita-image-store.s3.amazonaws.com/0/109136/43197099-60e2-2935-359f-96b8f0237e72.png">
2. 権限確認用にもう1人ユーザーを作成する。   
   メニュー 「Jenkinsの管理」->「ユーザーの管理」を選択して、Jenkinsのユーザーデータベースページを開きます。
3. 左メニューにある「ユーザー作成」リンクを押し、「test2」ユーザーを作成する。   
   <img alt="765520A4-1637-4BED-9111-04993A1CA771.png" src="https://qiita-image-store.s3.amazonaws.com/0/109136/4e0ce042-5041-f971-d0f2-127be0e3db6e.png">

## 権限の作成
プラグインをインストールした直後は、全てのアクションが可能なadmin権限しか無いので、その他の権限を作成します。
例として、閲覧と既存ジョブが実行可能なoperator権限を作成します。

1. メニュー「Jenkinsの管理」->「Manage and Assign Roles」->「Manage Roles」を選択して、Manage Rolesページを開く。
2. 「Global roles」の「Role to add」に「operator」と入力してAddボタンを押す。
3. 一覧にoperatorが追加されるので、以下の権限にチェックする。   
   * 全体のRead
   * ジョブのBuild, Cancel, Read
   * ビューのRead
4. 「Save」ボタンを押して権限設定を反映させる。

<img alt="61266FF8-4F04-4DCD-9725-BC721E1A8280.png" src="https://qiita-image-store.s3.amazonaws.com/0/109136/bff2dc25-75d6-457d-0d68-b7bd2f689d19.png">

## ユーザーに権限を付与
作成したユーザーと権限を紐付けます。
例として、test1ユーザーにadmin権限を、test2ユーザーにoperator権限を付与します。
それと、本来必要ないですが、id入力をミスした例として、存在していないtest3ユーザーにも権限を付与します。

1. メニュー「Jenkinsの管理」->「Manage and Assign Roles」->「Assign Roles」を選択して、Assign Rolesページを開く。　　　
2. 「User/group to add」に「test1」と入力して、Addボタンを押す。   
3. 同じく、「test2」と入力して、Addボタンを押す。　　　
4. 同じく、「test3」と入力して、Addボタンを押す。   
   ※ test3ユーザーは存在していませんので、本来必要ありません。   
   　追加したのは、存在していないユーザーに権限を付与しようとするとどうなるかを確認するためです。   
5. Global rolesの各ユーザーに権限を付与する。   
   * test1ユーザーは、adminにチェック
   * test2ユーザーは、operatorにチェック 
   * test3ユーザーは、admin, operator両方にチェック   
　   
※注意  
Anonymousユーザーとは、非ログインユーザーのことです。   
最終的には全ての権限を外すべきですが、確認が終わるまでは絶対adminのチェックを外さない方がいいです。   
このページでのユーザー追加は入力式になっており、しかも登録時に存在チェックが行われていませんので、入力ミスが発生する可能性があります。   
ミスをすることにより、admin権限を所持したユーザーが存在しない状態になり、どうすることもできなくなるのを回避するためです。
6. 上記を実行するとこの状態になっている。一旦「Save」ボタンを押して設定を反映させる。   
<img alt="ACFEE14C-B7D6-4928-9738-032393B4B8D5.png" src="https://qiita-image-store.s3.amazonaws.com/0/109136/1bc06832-c897-4ad2-71e5-78b437363a62.png">   
7. 再度Assign Rolesページを開くと、ユーザーIDの左横にアイコンが表示されている。   
   <img alt="Jenkins.png" src="https://qiita-image-store.s3.amazonaws.com/0/109136/a2a85f20-e776-e1f0-aa81-84d6387e38b8.png">   
   test1, test2ユーザーには人のアイコンが表示されており、存在しているユーザーであることを示しています。   
   また、存在していないtest3ユーザーには警告アイコンが表示されています。   
   これにより、入力ミスが無いことを確認可能です。（一旦保存するしかないのが難点ですが・・・）
8. test3ユーザーを削除し、Anonymousユーザーから権限剥奪する。   
   ユーザーの存在チェックが行えたので、test3ユーザーは必要なくなりました。   
   また、test1ユーザーがadmin権限を保持していることが確定しましたので、Anonymousユーザーの権限は必要なくなりました。   
   test3ユーザーを削除、Anonymousユーザーの全ての権限チェックを外して「Save」ボタンを押して権限を反映します。   
   <img alt="Jenkins.png" src="http://www.24w.jp/qiita/20160113-Jenkins-security1.png">      

## 動作確認
以上で設定は完了しましたので、動作確認してみます。
Jenkinsのトップページにアクセスすると、権限設定前はジョブの一覧が表示されていましたが、ログインページが表示されるようになります。
<img width="500" alt="Jenkins.png" src="http://www.24w.jp/qiita/20160113-Jenkins-security4.png">

まず、test1ユーザーでログインします。
admin権限を所持していますので、Jenkinsの設定を更新可能ですし、新しいジョブも登録可能です。
<img width="500" alt="Jenkins.png" src="http://www.24w.jp/qiita/20160113-Jenkins-security2.png">

次に、test2ユーザーでログインします。
operator権限のみ所持していますので、Jenkinsの設定を更新することはできませんし、新しいジョブも作成することが出来ません。
<img width="500" alt="Jenkins.png" src="http://www.24w.jp/qiita/20160113-Jenkins-security3.png">