[OpenShift]ユーザ認証について確認する

#はじめに
今回はOpenShiftのユーザ認証について確認してみたいと思います。

OpenShiftでサポートされているアイデンティティプロバイダーにはいくつかありますが、今回はHTPasswdでのユーザ認証方法を確認します。

[3.2. サポートされるアイデンティティープロバイダー](https://access.redhat.com/documentation/ja-jp/openshift_container_platform/4.5/html/authentication_and_authorization/supported-identity-providers)

なお、今回のOpenShiftのバージョンは以下になります。

```
$ oc version
Client Version: 4.5.4
Server Version: 4.5.4
Kubernetes Version: v1.18.3+012b3ec
```

#ユーザの設定
cluster-admin権限を持つ「admin」ユーザと権限を付与しない「user01」ユーザを設定します。

##htpasswdファイルの作成
今回は以下のコマンドでカレントディレクトにファイル名「htpasswd」でhtpasswdファイルを作成します。
-c オプション：ファイル作成
-B オプション：bcrypt 暗号化を用いたよりセキュアなパスワードの作成。指定しない場合はMD5

```
$ htpasswd -c -B -b htpasswd admin redhat
Adding password for user admin
$ htpasswd -b htpasswd user01 user01
Adding password for user user01
$ cat htpasswd 
admin:$2y$05$lIAZOHeXdQzxCN5i1Z62IuDFym.0rh2PhplOccH1Mc2od8oqt.lHS
user01:$apr1$x.VMfvpN$bOTCqKi9S/667iPR9kBIL1
```

##secretの作成

OpenShiftクラスタにkubeadminユーザでログインします。

```
$ oc login -u kubeadmin -p nIMBQ-ZoYZ5-UyS5D-oGTjF https://api.ocp4.example.com:6443
The server uses a certificate signed by an unknown authority.
You can bypass the certificate check, but any data you send to the server could be intercepted by others.
Use insecure connections? (y/n): y

Login successful.

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

Using project "default".
Welcome! See 'oc help' to get started.
```

作成したhtpasswdファイルを使用して、secretを作成します。

```
$ oc create secret generic localusers --from-file htpasswd=htpasswd -n openshift-config
secret/localusers created
$ oc -n openshift-config describe secret localusers
Name:         localusers
Namespace:    openshift-config
Labels:       <none>
Annotations:  <none>

Type:  Opaque

Data
====
htpasswd:  112 bytes
```

##cluster-admin権限の付与

adminユーザにcluster-admin権限を付与します。

```
$ oc adm policy add-cluster-role-to-user cluster-admin admin
Warning: User 'admin' not found
clusterrole.rbac.authorization.k8s.io/cluster-admin added: "admin"
$ oc get users
No resources found
```
この時点ではユーザは作成されていないので、adminユーザが存在しないとWarningが出ますが無視します。

##HTPasswdアイデンティティプロバイダーの更新

現状のOAuthリソースをファイルに出力します。

```
$ oc get oauth cluster -o yaml > oauth.yaml
```
spec配下に以下の記載を追記します。

```oauth.yaml 
apiVersion: config.openshift.io/v1
kind: OAuth
metadata:
  annotations:
    release.openshift.io/create-only: "true"
  creationTimestamp: "2020-08-05T18:23:41Z"
  generation: 1
  managedFields:
  - apiVersion: config.openshift.io/v1
    fieldsType: FieldsV1
    fieldsV1:
      f:metadata:
        f:annotations:
          .: {}
          f:release.openshift.io/create-only: {}
      f:spec: {}
    manager: cluster-version-operator
    operation: Update
    time: "2020-08-05T18:23:41Z"
  name: cluster
  resourceVersion: "2121"
  selfLink: /apis/config.openshift.io/v1/oauths/cluster
  uid: c96a18f6-b8de-4722-b5bf-ca6c39cdb78b
spec:
### 以降追記 ###
  identityProviders:
  - htpasswd:
      fileData:
        name: localusers #secret名
    mappingMethod: claim #アイデンティティーとユーザーオブジェクト間にマッピングが確立される方法
    name: myusers #任意のプロバイダー名
    type: HTPasswd
```

編集したyamlファイルを適用します。

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

##ログインの確認
adminユーザとuser01ユーザでログインできることを確認します。

```
$ oc login -u admin -p redhat
Login successful.

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

Using project "default".
$ oc get node
NAME       STATUS   ROLES           AGE    VERSION
master01   Ready    master,worker   102d   v1.18.3+012b3ec
master02   Ready    master,worker   102d   v1.18.3+012b3ec
master03   Ready    master,worker   102d   v1.18.3+012b3ec
$ oc get users
NAME    UID                                    FULL NAME   IDENTITIES
admin   a5cfccd7-d783-494d-8d72-f504ca96ee18               myusers:admin
```
adminユーザにはcluster-admin権限を付与していますので、`oc get node`コマンドでノードの情報を確認できます。
また、ログインすることによって、ユーザが作成されます。

```
$ oc login -u user01 -p user01
Login successful.

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

    oc new-project <projectname>

[student@workstation ~]$ oc get nodes
Error from server (Forbidden): nodes is forbidden: User "user01" cannot list resource "nodes" in API group "" at the cluster scope
```

user01には権限を付与してませんので、`oc get node`コマンドがエラーになります。

adminユーザに戻り、ユーザとIDリストを確認します。

```
$ oc login -u admin -p redhat
Login successful.

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

Using project "default".
$ oc get users
NAME     UID                                    FULL NAME   IDENTITIES
admin    a5cfccd7-d783-494d-8d72-f504ca96ee18               myusers:admin
user01   75af9184-1da0-4b31-b6fe-56f8747a7e56               myusers:user0
$ oc get identities.user.openshift.io 
NAME             IDP NAME   IDP USER NAME   USER NAME   USER UID
myusers:admin    myusers    admin           admin       a5cfccd7-d783-494d-8d72-f504ca96ee18
myusers:user01   myusers    user01          user01      75af9184-1da0-4b31-b6fe-56f8747a7e56
```
adminユーザに加えて、user01ユーザも作成されていますね。


#ユーザの追加
上記で設定したアイデンティティプロバイダーを使用して、ユーザを追加します。

##secretの更新
secretの内容からhtpasswdファイルを作成します。
なお、今回の場合は上記で作成した状態と変化がありませんので、同じ内容で上書きされます。

```
$ oc extract secret/localusers -n openshift-config --to . --confirm
htpasswd
```

user02のhtpasswdを追加します。

```
$ htpasswd -b htpasswd user02 user02
Adding password for user user02
$ cat htpasswd
admin:$2y$05$lIAZOHeXdQzxCN5i1Z62IuDFym.0rh2PhplOccH1Mc2od8oqt.lHS
user01:$apr1$x.VMfvpN$bOTCqKi9S/667iPR9kBIL1
user02:$apr1$r793hWZY$qNGUgK0BGtxhkatSNKohi.
```

このhtpasswdでsecretを更新します。

```
$ oc set data secret localusers --from-file htpasswd=htpasswd -n openshift-config
secret/localusers data updated
```

##ログインの確認
追加したuser02でログインできることを確認します。

```
$ oc login -u user02 -p user02
Login successful.

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

    oc new-project <projectname>

$ oc get users
Error from server (Forbidden): users.user.openshift.io is forbidden: User "user02" cannot list resource "users" in API group "user.openshift.io" at the cluster scope
$ oc login -u admin -p redhat
Login successful.

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

Using project "default".
$ oc get users
NAME     UID                                    FULL NAME   IDENTITIES
admin    a5cfccd7-d783-494d-8d72-f504ca96ee18               myusers:admin
user01   75af9184-1da0-4b31-b6fe-56f8747a7e56               myusers:user01
user02   5d21132f-0502-4eba-a105-da050eb28637               myusers:user02
```

user02にログイン後、adminユーザで再ログインすることで、user02ユーザが作成されていることが確認できます。

#ユーザの削除
今度はuser02を削除します。

##secretの更新
htpasswdファイルからuser02を削除して、secretを更新します。

```
$ oc extract secret/localusers -n openshift-config --to . --confirm
htpasswd
$ htpasswd -D htpasswd user02
Deleting password for user user02
$ oc set data secret localusers --from-file htpasswd=htpasswd -n openshift-config
secret/localusers data updated
```

##IDとユーザの削除

```
$ oc get identity
NAME             IDP NAME   IDP USER NAME   USER NAME   USER UID
myusers:admin    myusers    admin           admin       0580eb50-43f0-4edf-923f-c2ea35d76fc3
myusers:user01   myusers    user01          user01      0319489b-e5ac-41e3-a41c-08d339865dbd
myusers:user02   myusers    user02          user02      7681cd02-ed49-4aec-acce-4ff20bb021fe
$ oc delete identities.user.openshift.io "myusers:user02"
identity.user.openshift.io "myusers:user02" deleted
$ oc delete user user02
user.user.openshift.io "user02" deleted
$ oc get users
NAME     UID                                    FULL NAME   IDENTITIES
admin    0580eb50-43f0-4edf-923f-c2ea35d76fc3               myusers:admin
user01   0319489b-e5ac-41e3-a41c-08d339865dbd               myusers:user01
```

ログ取るのを忘れましたが、この後user02にログインできないことを確認します。

#(参考)kubeadminユーザの削除
kubeadminユーザは、OpenShiftをインストールしたらデフォルトで作成される管理ユーザです。
アイデンティティープロバイダーを定義し、cluster-admin権限を持つユーザーを作成した後に、クラスターのセキュリティーを強化するため kubeadminユーザを削除することが推奨されています。
以下のコマンドでsecretを削除するだけですので簡単に削除できますが、「本当に削除しますか？」のような確認もありませんので、ちょっと怖いなーと思います。

```
$ oc delete secrets kubeadmin -n kube-system
```

もし、cluster-admin権限を持つユーザーを作成する前にこのコマンドを実行すると、クラスタ再インストールです。

[3.3. KUBEADMIN ユーザーの削除](https://access.redhat.com/documentation/ja-jp/openshift_container_platform/4.5/html/authentication_and_authorization/removing-kubeadmin_understanding-identity-provider)

#まとめ
今回はOpenShiftのユーザ認証方法について確認しました。いろいろ種類があるうちの一番簡単な方法だと思いますが、Kubernetesよりもわかりやすいと感じました。
OpenShiftは勉強始めたばかりでまだocコマンドに慣れていませんが、これから慣れていきたいと思います。