【Red Hat OpenShift Administration対策】(1)アイデンティティプロバイダーの作成と更新

Red Hat openshift Administration試験(EX280)の勉強のため、Qiita記事を書くことにしました。
週に一、二度のペースで更新していきたいと思っています。よろしくお願いします。
第一回目は、アイデンティティプロバイダーの作成と更新についてです。
勉強中のため、記載が不十分だったり誤解をしている点があればコッソリ教えていただけると助かります・・・。

# 認証と認可
認証や権限に関する話題でよく言われる話ですが、明確に異なる概念である認証(Authentication)と認可(Authorization)について、まず最初にしっかり理解しておく必要があります。
**認証(Authentication)は、正しいユーザーであることを認めること(例えばIDとパスワードが一致することを確認すること)**、
**認可(Authorization)は、あるユーザーがどのオブジェクトにどのアクセス権を持っているのかを決めること**、です。

Openshiftでは認証機能はOAuthサーバーとアイデンティティプロバイダーが担当します。
そして、認可機能はRBAC(Role Based Access Control)ポリシーが担当しています。

# OAuthとアイデンティティプロバイダー
Openshiftにおいて、OAuthとアイデンティティプロバイダーの関係を図示すると、以下となります。
EX280試験対策のため、ここではアイデンティティプロバイダーをHTPasswdに限定して話を進めます。
![20210206_HTPasswdアイデンティティプロバイダーの作成と管理.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/684500/10123ec1-4d1c-0b1f-e8cf-960c6bfdcbf8.jpeg)

Openshiftでは、APIを通じてユーザーは操作を行います。
ユーザーがAPIを実行するときに必要になるのがOAuthアクセストークンです。

ユーザーがAPIを実行するとき、ユーザーはOAuthサーバーに対してIDとパスワードを使用して認証を行います。
OAuthサーバーは、アイデンティティプロバイダーに対しIDとパスワードを送付します。Openshift 4.5では、アイデンティティプロバイダーとしてHTPasswd、Keystone、LDAPなどが対応しています。OAuthサーバーは一度に複数のアイデンティティプロバイダーを持つことができますが、ここではHTPasswdに限定して話を進めます。

HTPasswdアイデンティティプロバイダーはIDとパスワード等の資格情報をSecretとして保管しており、これが一致すると認証成功をOAuthサーバーに送付します。
OAuthサーバーは、認証が成功すると、OAuthトークンをユーザーに送付し、ユーザーはこのOAuthトークンを使用してAPIを実行するという仕組みです。

# HTPasswdアイデンティティプロバイダーの設定
HTPasswdアイデンティティプロバイダーの設定手順は以下です。アイデンティティプロバイダーを作成する場合、クラスター管理者(例えばkubeadmin)としてコマンドを実行する必要があります。

(1)資格情報が記載されたHTPasswdファイルの作成
(2)資格情報を保有するSecretの作成
(3)OAuthカスタムリソース定義をファイル出力
(4)OAuthカスタムリソース定義にHTPasswdアイデンティティプロバイダーのエントリーを追加
(5)OAuthカスタムリソース定義を更新

クラスター管理者として順にコマンドを実行していきます。

(1)資格情報が記載されたHTPasswdファイルの作成
htpasswdコマンドを使用して資格情報ファイル(HTPasswdファイル)を作成します。
htpasswdコマンドが使えない場合、まずyum install -y httpd-toolsを実行してhttpd-toolsをインストールしてから以下コマンドを実行しましょう。

```
htpasswd -c -B -b /tmp/htpasswd user1 password1
cat /tmp/test-htpasswd
```

catを実行して、user1というユーザー名とHash化されたパスワードが/tmp/htpasswdファイルに記載されていることが確認できたら成功です。
すでにhtpasswdファイルがある場合、-cオプションをとって実行するとユーザーを追加できます。以下のコマンドが例です。

```
htpasswd -B -b /tmp/htpasswd user2 password2
cat /tmp/test-htpasswd
```

(2)資格情報を保有するSecretの作成
次にHTPasswdファイルを使用してSecretを作成します。以下コマンドを実行します。
ちなみに、資格情報ファイル名が「htpasswd」の場合、--from-fileオプションの「htpasswd=」は指定しなくてもいいのですが、場合分けして覚えるのが面倒なので私は常に指定するようにして覚えています。

```
oc create secret generic htpasswd-secret --from-file htpasswd=/tmp/htpasswd -n openshift-config
oc get secret -n openshift-config
```

名前空間にopenshift-configを指定する必要があります。htpasswd-secretという名前のsecretが追加されていれば成功です。

(3)OAuthカスタムリソース定義をファイル出力
次に、既存のOAuthサーバーの定義をyaml形式で出力します。

```
oc get oauth cluster -o yaml > /tmp/oauth.yaml
cat /tmp/oauth.yaml
```

catで今のOpenshiftクラスター上のOAuthカスタムリソース定義が確認できます。

(4)OAuthカスタムリソース定義にHTPasswdアイデンティティプロバイダーのエントリーを追加
oauth.yaml内に、.spec.identityProvides配列のエントリーを追加します。

```
vi /tmp/oauth.yaml
```

```
spec:
  identityProviders:
  - type: HTPasswd
    name: htpasswd-provider
    mappingMethod: claim
    htpasswd:
      fileData:
        name: htpasswd-secret
```

インデントやスペルミスに注意して編集しましょう。
nameは自由に設定して構いません。またhtpasswd.fileData.nameは(2)で作成したSecret名を指定します。
追加するエントリーの例はOpenshiftのマニュアルに書いてあるので、試験対策としてすぐ検索できるようマニュアルの場所を覚えておきましょう。

第4章 アイデンティティープロバイダーの設定
https://access.redhat.com/documentation/ja-jp/openshift_container_platform/4.1/html/authentication/configuring-identity-providers#identity-provider-htpasswd-CR_configuring-htpasswd-identity-provider

(5)OAuthカスタムリソース定義を更新
修正したOAuthカスタムリソース定義を適用します。

```
oc replace -f /tmp/oauth.yaml
```

無事に成功していれば、user1でログインできるようになっています。
念のため、以下コマンドを実行してアイデンティティプロバイダー配列が追加されていることを確認してもよいかもしれません。

```
oc get oauth cluster -o yaml
```

# ユーザーの削除
HTPasswdプロバイダーの環境上でユーザーを削除する場合、以下の3つを行う必要があります。
(1)アイデンティティプロバイダーからユーザーを削除
(2)ユーザーリソースの削除
(3)アイデンティティリソースの削除

それぞれ実行していきます。

(1)アイデンティティプロバイダーからユーザーを削除
htpasswdファイルを更新した後、Secretを更新する必要があります。
このため現状のSecretからhtpasswdファイルを出力し、htpasswdファイルを更新した後、Secret適用を行います。

```
oc extract secret/htpasswd-secret -n openshift-config --to /tmp/ --confirm
cat /tmp/htpasswd
```

```
htpasswd -D /tmp/htpasswd user1
cat /tmp/htpasswd
```

```
oc set data secret/htpasswd-secret --from-file htpasswd=/tmp/htpasswd -n openshift-config
```


(2)ユーザーリソースの削除
ユーザーリソースを削除します。単純ですね。

```
oc delete user user1
```


(3)アイデンティティリソースの削除
プロバイダーからユーザーを削除しても、すでにログイン中のユーザーであればアイデンティティリソースが残っているため、アイデンティティリソースからも削除します。
アイデンティティリソースが存在しているか確認し、リソースが残っていれば削除します。

```
oc get identity
oc delete identity htpasswd-provider:user1
```

# 管理者権限ユーザーの割り当てとkubeadminの削除
openshiftにはデフォルトで作成されるkubeadminという名前の管理者権限ユーザーがあります。
他に管理者権限ユーザーを作成すれば、このkubeadminは削除することができます。

管理者権限の割り当て

```
oc adm policy add-cluster-role-to-user cluster-admin admin
```

kubeadminの削除

```
oc delete secret kubeadmin -n kube-system
```