OpenShiftセットアップ#1 ユーザ登録(HTPasswd編)

以前、投稿しました以下のSingle Node構成の環境を使用して、OpenShiftの基本的なセットアップ作業を進めていきたいと思います。今回は、OpenShift導入後の最初の作業であるユーザ登録をやってみましたので、その備忘録として記載していきます。

https://qiita.com/Nakaji1106/items/bbe64021254b15d98355

https://qiita.com/Nakaji1106/items/594cf85f748ff3ab4d65


OpenShiftでサポートしている認証・認可の方法は、Red Hat社の以下のドキュメントから確認可能です。以降の私の記事でもこちらのドキュメントの情報をベースに記載しています。
もし私の投稿内容で不足している情報がある場合には、こちらのドキュメントリンクもご確認ください。

[Red Hat社ドキュメント : ユーザー認証およびユーザーとサービスのアクセス制御の設定](https://access.redhat.com/documentation/ja-jp/openshift_container_platform/4.10/html/authentication_and_authorization/overview-of-authentication-authorization)

# 0. OpenShiftにおけるユーザ登録

OpenShiftでサポートされているアイデンティティプロバイダーのうち、今回はHTPasswdを使用して、OpenShiftで利用するユーザを登録していきたいと思います。なお、OpenShiftをインストールした初期の状態では、kubeadminユーザのみが作成されており、直近の作業はこのkubeadminユーザで実行します。

**OpenShift 4.10でサポートされているアイデンティティプロバイダー**
https://access.redhat.com/documentation/ja-jp/openshift_container_platform/4.10/html/authentication_and_authorization/supported-identity-providers

# 1. HTPasswdでOpenShiftへユーザ登録

### 1-1. htpasswdコマンドを導入します

HTPasswdによるユーザ/パスワード登録には、htpasswdコマンドを使用します。
まずはそのコマンドのインストールを実施します。

```bash
$ dnf install -y httpd-tools
```

### 1-2. 登録するユーザ/パスワード情報を含んだ設定ファイルを作成します

今回は以下のユーザ/パスワードを作成していこうと思います。

|ユーザ名|パスワード|
|----|----|
|hiroshi|kasukabe|
|misae|kasukabe|
|shinnosuke|kasukabe|
|himawari|kasukabe|
|shiro|kasukabe|

(1) 作業用のディレクトリをお作成

```bash
$ mkdir /root/sno-user
$ cd /root/sno-user/
```

(2) htpasswdコマンドで設定ファイルを作成。

```bash
# 一番最初のユーザ作成 : $ htpasswd -cBb <設定ファイル名> <ユーザ名> <パスワード>
$ htpasswd -cBb users.htpasswd shinnosuke kasukabe
Adding password for user shinnosuke

# 2回目以降 : $ htpasswd -b <設定ファイル名> <ユーザ名> <パスワード>
$ htpasswd -b users.htpasswd hiroshi kasukabe
Adding password for user hiroshi
$ htpasswd -b users.htpasswd misae kasukabe
Adding password for user misae
$ htpasswd -b users.htpasswd shiro kasukabe
Adding password for user shiro
$ htpasswd -b users.htpasswd himawari kasukabe
Adding password for user himawari
```

最後に設定した内容を確認します。

```bash
$ cat users.htpasswd 
shinnosuke:$2y$05$.AyibjCeAJiwKE1ZB2Au6OCrGL.Nkzy1YJOoEY20zO5O0POrnLj2u
hiroshi:$apr1$GR3nqMtg$sw5bok8XsdHRTW7Iw6RCj/
misae:$apr1$.C9T8n7z$yCwWEy2QmgNQ8KAWmH1Lu/
shiro:$apr1$IF3PKbO7$xSOpxr4Exk3A1m0KxUB4H.
himawari:$apr1$SAIUABWP$1JgEo/5u39momT3/VV9zX0
```

### 1-3. OpenShiftにてアイデンティティプロバイダとしてHTPasswdを使用するように設定

(1) OpenShiftのクラスタへログインします。

適宜、ご自身の環境に合わせて、kubeadminのパスワードやOpenShiftのAPIサービスURLを変更ください。

```
$ oc login -u kubeadmin -p "kubeadmin_password" https://api.sno-qiita.test.example.local:6443
```

(2) 既存のOpenShiftの認証設定情報を取得します。

```bash
$ pwd
/root/sno-user
$ oc get oauth cluster -o yaml > oauth.yaml
```

(3) HTPasswdをアイデンティティプロバイダとして使用するようにoauth.yamlのspec欄を変更します

```oauth.yaml 変更箇所
spec: 
  identityProviders:
  - name: my_htpasswd_provider   # 任意のidentityProviderの名前を設定します
    mappingMethod: claim 
    type: HTPasswd               # identityProviderとしてHTPasswdを使用します
    htpasswd:
      fileData:
        name: htpass-secret      # 後ほど作成するHTPasswdのSecret名を記載します
```

(4) 変更したoauth.yamlをOpenShiftへ適用します。

```bash
$ oc replace -f oauth.yaml 
oauth.config.openshift.io/cluster replaced
```

### 1-4. OpenShiftにユーザ認証に使用するSecretを作成します

先程、oauth.yaml内の"fileData"指定したSecret名で作成します。

```bash
$ oc create secret generic htpass-secret --from-file htpasswd=users.htpasswd -n openshift-config
secret/htpass-secret created
```

このタイミングで、自動的に" openshift-authentication " Namespaceにある " oauth-openshift-XXX " PoDが再起動されます。
この再起動が完了すると、今回のユーザ登録処理が完了します。

oauth-openshift-7994794ff-rkkwb : 元々あったoauth-openshiftのPoD
oauth-openshift-7b97cb4688-wjq2n : 今回の設定変更で新規に作成されたoauth-openshiftのPoD

```bash
$ oc get pods -n openshift-authentication                                                                       

NAME                               READY   STATUS        RESTARTS   AGE
oauth-openshift-7994794ff-rkkwb    1/1     Terminating   0          9d
oauth-openshift-7b97cb4688-wjq2n   0/1     Pending	 0          30s
```

再起動後

```
$ oc get pods -n openshift-authentication
NAME                               READY   STATUS    RESTARTS   AGE
oauth-openshift-7b97cb4688-wjq2n   1/1     Running   0          11m
```

### 1-4. 設定したユーザ名でログイン可能か確認

新規で作成した"shinnosuke"ユーザでログインができるか確認します。

```bash
$ oc login -u shinnosuke -p kasukabe https://api.sno-qiita.test.example.local:6443
Login successful.

You don't have any projects. You can try to create a new project, by running

    oc new-project <projectname>
```

その他のユーザについても、問題なくログインできるかどうか確認しておきましょう。


# 2. RBACを使用した権限付与

続いて、作成したユーザに対してOpenShiftでの操作権限を付与していきます。Openshiftでは、クラスタ全体に対する操作権限をClusterRoleBindingで、特定のプロジェクト対する操作権限をRoleBindingで管理します。

今回は、先程作成したユーザに対して以下のような権限を付与していきたいと思います。
またこれらのユーザには、作業用のプロジェクトとして"Nohara"を作成し、その"Nohara"プロジェクトに対するRoleBindingを付与します。

|ユーザ名|ClusterRoleBinding|RoleBinding|
|:----:|:----:|:----:|
|misae|クラスタ管理者|管理者権限
|hiroshi|一般ユーザ|参照権限(view)
|shinnosuke|一般ユーザ|編集権限(edit)
|himawari|一般ユーザ|編集権限(edit)
|shiro|一般ユーザ|参照権限(view)

### 2-1. ユーザ"misae"にクラスタ管理者権限を付与します。

まずkubeadminユーザでOpenShiftにログインします。

```bash
$ oc login -u kubeadmin -p "kubeadmin_password" https://api.sno-qiita.test.example.local:6443
```
上記のテーブルの通り、OpenShiftクラスタ全体の管理者権限(cluster-admin)をユーザ"misae"に付与します。

```bash
$ oc adm policy add-cluster-role-to-user cluster-admin misae
clusterrole.rbac.authorization.k8s.io/cluster-admin added: "misae"
```

問題なく、ユーザ"misae"にクラスタ管理者権限が付与されているか確認します。
今回は"oc get nodes"で動作を確認してみます。

```bash
$ oc login -u misae -p kasukabe
Login successful.

You have access to 65 projects, the list has been suppressed. You can list all projects with 'oc projects'

Using project "default".
$ oc get nodes
NAME                           STATUS   ROLES           AGE   VERSION
sno-qiita.test.example.local   Ready    master,worker   14d   v1.23.3+e419edf
```

試しに一般ユーザである、ユーザ"hiroshi"で同様のコマンドを実行してみると、以下のように権限が不足している旨のエラーが表示されます。

```bash
$ oc login -u hiroshi -p kasukabe
$ oc get nodes
Error from server (Forbidden): nodes is forbidden: User "hiroshi" cannot list resource "nodes" in API group "" at the cluster scope
```

### 2-2. 必要に応じて、新規プロジェクト作成権限に関する作業を実施します。

OpenShiftをインストールすると、新規プロジェクトの作成権限(self-provisioner)が全てのユーザにデフォルトで付与されるように設定されています。そのため、この設定を無効にしたい場合には、グループ"system:authenticated:oauth"から"self-provisioner"権限を削除する必要があります。

以降は、クラスタ管理者権限を付与したユーザ"misae"で作業していきたいと思います。

```bash
$ oc login -u misae -p kasukabe https://api.sno-qiita.test.example.local:6443 
Login successful.

You have access to 65 projects, the list has been suppressed. You can list all projects with 'oc projects'

Using project "default".
```

```bash
$ oc adm policy remove-cluster-role-from-group self-provisioner system:authenticated:oauth
Warning: Your changes may get lost whenever a master is restarted, unless you prevent reconciliation of this rolebinding using the following command: oc annotate clusterrolebinding.rbac self-provisioners 'rbac.authorization.kubernetes.io/autoupdate=false' --overwrite
clusterrole.rbac.authorization.k8s.io/self-provisioner removed: "system:authenticated:oauth"
```

### 2-3. "Nohara"プロジェクトに対する権限を各ユーザに付与します。

まず、作業用プロジェクト"Nohara"を作成します。

```
$ oc new-project nohara
Now using project "nohara" on server "https://api.sno-qiita.test.example.local:6443".

You can add applications to this project with the 'new-app' command. For example, try:

    oc new-app rails-postgresql-example

to build a new example application in Ruby. Or use kubectl to deploy a simple Kubernetes application:

    kubectl create deployment hello-node --image=k8s.gcr.io/e2e-test-images/agnhost:2.33 -- /agnhost serve-hostname
```

(1) ユーザ"hiroshi"へ参照権限(view)を付与

```bash
$ oc policy add-role-to-user view hiroshi -n nohara
clusterrole.rbac.authorization.k8s.io/view added: "hiroshi" 
```

(2) ユーザ"shiro"へ参照権限(view)を付与

```bash
$ oc policy add-role-to-user view shiro -n nohara
clusterrole.rbac.authorization.k8s.io/view added: "shiro"
```

(3) ユーザ"shinnosuke"へ編集権限(edit)を付与

```bash
$ oc policy add-role-to-user edit shinnosuke -n nohara
clusterrole.rbac.authorization.k8s.io/edit added: "shinnosuke"
```

(4) ユーザ"himawari"へ編集権限(edit)を付与

```bash
$ oc policy add-role-to-user edit himawari -n nohara
clusterrole.rbac.authorization.k8s.io/edit added: "himawari"
```

### 2-4. "kubeadmin"ユーザを削除

最後に、OpenShiftインストール時のデフォルトユーザであるkubeadminユーザを削除します。

```bash
$ oc delete secrets kubeadmin -n kube-system 
secret "kubeadmin" deleted
```

# 3. まとめ

今回は、OpenShiftインストール後に実施する最初の手順である、ユーザ作成にフォーカスを当てて作業してみました。
実際の本番環境などでは、ユーザグループなどを作成し、グループレベルでのRBAC権限操作を行うことがあるかと思いますが、そちらに関しては機会があれば別の記事でご紹介したいと思います。

最後までご覧いただき、ありがとうございました。