OpenShift の Identity Provider に htpasswdファイルを使用してみる。

`OpenShift` を実運用で使用する場合、`cluster-admin`権限(最強の権限)を持った`kubeadmin`以外にも、一般ユーザーも登録する必要があるので、`LDAP` 等のクラスター外部の `Identity Provider` が必要になります。

`LDAP`等を立てるのも大変なので、ここではテスト環境用に`htpasswd`ファイルに登録した `userid` と `password` を `OpenShift`のログインユーザーに使用してみます。

#1. htpasswd ファイルを作る

`user`名と`Password`が入った`htpasswd`ファイルを作成します。
`jonh` (パスワードは `passw0rd`) を登録した `htpasswd` 形式の `$HOME/htpaswd` というファイルを作成します。

```
[root@bastion ~]# htpasswd -c -Bb $HOME/htpasswd john passw0rd
Adding password for user john
[root@bastion ~]#
-b : Use the password from the command line rather than prompting for it.
-B : Force bcrypt aencryption of the password (very secure).
-c : 新規にファイルを作成
```

他にもユーザーを追加しておきます。
ここでは、`paul` と `ringo` と `george` を追加します。

```
[root@bastion ~]#  htpasswd -Bb $HOME/htpasswd  paul passw0rd
Adding password for user paul
[root@bastion ~]#  htpasswd -Bb $HOME/htpasswd  ringo passw0rd
Adding password for user ringo
[root@bastion ~]#  htpasswd -Bb $HOME/htpasswd  george passw0rd
Adding password for user george
[root@bastion ~]#
```

#2. 作成した htpasswd のファイルを元にした Secret リソースを作成します。

`openshift-config` `namespace` に、`htpasswd` という名前の `secret` リソースを作成します。

```
[root@bastion ~]# oc create secret generic htpasswd --from-file=$HOME/htpasswd -n openshift-config
secret/htpasswd created
[root@bastion ~]#
```

#3. OAuth リソースを編集して前述のSecretリソースを参照させます。

デフォルトで `cluster`という名前の `OAuth` リソースがあります。

```
[root@bastion ~]# oc get oauth
NAME      AGE
cluster   21d
[root@bastion ~]# oc get oauth cluster -o yaml
apiVersion: config.openshift.io/v1
kind: OAuth
metadata:
  annotations:
    release.openshift.io/create-only: "true"
  creationTimestamp: "2021-03-03T08:57:12Z"
  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: "2021-03-03T08:57:12Z"
  name: cluster
  resourceVersion: "1728"
  selfLink: /apis/config.openshift.io/v1/oauths/cluster
  uid: 1001967e-401e-41db-8841-4fca3ac4ad7b
spec: {}
[root@bastion ~]#
```

これを、先ほど作成した `Secret`リソースの`htpasswd`を参照するように変更します。

```
[root@bastion ~]# cat oauth-cluster.yaml
apiVersion: config.openshift.io/v1
kind: OAuth
metadata:
  name: cluster
spec:
  identityProviders:
  - name: Local Password
    mappingMethod: claim
    type: HTPasswd
    htpasswd:
      fileData:
        name: htpasswd   # これがさっき htpasswd ファイルから作成した Secret
[root@bastion ~]# oc apply -f oauth-cluster.yaml
Warning: oc apply should be used on resource created by either oc create --save-config or oc apply
oauth.config.openshift.io/cluster configured
[root@bastion ~]#
```

新しい設定で `openshift-authentication` `namespace` の `oauth-openshift-xxxx` という `Pod`が再起動するので観察します。

```
[root@bastion ~]# oc get pods -n openshift-authentication
NAME                               READY   STATUS        RESTARTS   AGE
oauth-openshift-6456c879c9-5dlsz   1/1     Running       0          19d
oauth-openshift-6456c879c9-b2gcs   1/1     Running       0          19d
oauth-openshift-6b44f6844f-hkjpb   1/1     Terminating   0          14s
oauth-openshift-7dcb9cf497-h9vbz   0/1     Running       0          10s
[root@bastion ~]# oc get pods -n openshift-authentication
NAME                               READY   STATUS        RESTARTS   AGE
oauth-openshift-6456c879c9-5dlsz   1/1     Terminating   0          19d
oauth-openshift-6456c879c9-b2gcs   1/1     Terminating   0          19d
oauth-openshift-6b44f6844f-hkjpb   0/1     Terminating   0          39s
oauth-openshift-7dcb9cf497-ckz6b   1/1     Running       0          25s
oauth-openshift-7dcb9cf497-h9vbz   1/1     Running       0          35s
[root@bastion ~]# oc get pods -n openshift-authentication
NAME                               READY   STATUS    RESTARTS   AGE
oauth-openshift-7dcb9cf497-ckz6b   1/1     Running   0          41s
oauth-openshift-7dcb9cf497-h9vbz   1/1     Running   0          51s
[root@bastion ~]#
```

#4. ログインの確認

`Pod` の再起動が完了したら、`htpasswd` のファイルに登録した `userid` / `password` でログインできるか試して見ます。

```
[root@bastion ~]# oc login -u john -p passw0rd $(oc whoami --show-server)
Login successful.

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

    oc new-project <projectname>

[root@bastion ~]#
```

syst

```
[root@bastion ~]# oc login -u system:admin
Logged into "https://api.ocp46.example.localdomain:6443" as "system:admin" using existing credentials.

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

Using project "default".
[root@bastion ~]# oc get users
NAME     UID                                    FULL NAME   IDENTITIES
john     3d81b831-fcb7-464f-a5b0-bb45e5014e29               Local Password:john
[root@bastion ~]#
```