[Proxmox] Proxmoxでkeycloak-OIDCを用いてSSOを実現する方法

# この記事は
- Proxmoxのユーザー認証に，KeycloakのOIDCでSSOが使えるようにするための設定
- SSOユーザーに権限を与える方法
についてまとめる．

# あらすじ
cloudflaredで公開しているKeycloakによる認証サービスを，他にも使えるところがないかと考えたところ，ProxmoxにOIDCのレルムを追加できる機能があったため試してみた．

# 作業内容
以下の記事を参考にした．

https://zenn.dev/krns06/scraps/93c8ba4f7bedf5

## OIDCの設定手順
### 1. Keyclockのレルムの作成とクライアントの追加
これらに関しては，前回の記事が参考になるので，ここでは省略．

https://qiita.com/syou551/items/45837a9ce4ef7af962aa

### 2. useridのMapperの追加
Proxmoxで用いるuseridが参照できるように設定する．Clientsで新たに作成したclientを選択し，その中のClient Scopeを選択する．
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3892865/a8de2209-11f4-4509-b976-58e34be5af7f.png)

次に，＜client-id＞-dedicated (今回の場合はproxmox-dedicated)を選択し，Add Mapperを選択する．そして，From predefined mappersを選択し，その中からusernameを選択する．これで，Mapperを追加できる．


### 3. ユーザーの作成
Keycloakにユーザーを登録しておく．（GoogleなどのIdPを設定している場合は不要．前回の記事ではGoogleをIdPとしているため，この作業は省略した）

### 4. Proxmoxにkeycloak-OIDCを登録
Proxmoxのデータセンターから，アクセス権限内のレルムを選択する．そして，左上の追加をクリックし，OpenID Connectサーバーをクリックする．

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3892865/365b9339-f8ca-4988-8bbc-c4246e120b6d.png)

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3892865/c37e7a51-4f24-4ccd-9fd7-d19b28a6ee48.png)

そして，ポップアップが表示されたら，Issuer URLには，`keyclockのURI/realms/<レルム名>`を入力し，レルムにはレルム名，クライアントIDにはkeyclockで新たに作成したclient名，そしてクライアントキーには，keyclockで取得したものを設定する．（前回の記事で取得方法を解説済みなので省略）

また，自動作成ユーザーにチェックを入れ，ユーザー名の要求をusernameに設定しておく．最後に，右下の追加をクリックすることで，追加される．

:::note alert
セキュリティ的観点から，目的のユーザーでサインインし，ユーザーが登録されたことを確認した後は，自動作成ユーザーのチェックを解除することを強く勧める．
:::

## SSOユーザーへの権限の設定
今回は，ユーザーを個別にグループへ追加することで，権限を設定する方法を取る．

### 1. Poolsとグループの作成
ユーザーに与える属性として，グループを作成し，そのグループに対して割り当てるVMと権限をつなぐPoolsを作成する．

まず，グループはデータセンターのグループタブから，作成をクリックし，任意の名前で作成できる．また，Poolsも同様にPoolsタブから任意の名前で作成できる．名前が一致している必要はない．

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3892865/06964128-8348-47a1-a823-2604dcb24c21.png)

### 2. Poolsにグループと権限を割り当てる
Poolsを作成すると，データセンターの下部に[設定したPoolsの名前]のタブが現れる．このタブとクリックすると，以下の画像のようにサマリ，メンバ，そしてアクセス権限が設定できる．

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3892865/271ba278-5081-4655-8de7-ab9c67ad98ac.png)

このうち，まずはアクセス権限の追加を行う．アクセス権限タブの追加をクリックすると，グループ・ユーザー・APIのどれに割り当てるかを選択することができる．今回は，グループに対して割り当てを行う．

グループは，先ほど作成したものを選択する．そして，ロールに関しては規定で存在しているものが複数あるため，グループに対して割り当てたい権限レベルに相当するロールを選択する．

:::note
SSOユーザーそれぞれに対して所属するグループを設定できるため，操作権限レベルごと，もしくは部門など業務内容ごとにグループを作成し，それぞれに権限を設定するという運用が想定される．
:::

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3892865/ea541fe7-4cf1-4e46-bc5d-8df4c3caa1eb.png)

### 3. Poolsにメンバ（VM）を割り当てる
次に，Poolsのメンバタブで，VMを割り当てる．ここで割り当てられたVMは，VMの閲覧権限が与えられたグループのユーザーに対して表示されるようになる．また，グループの権限に従った操作が可能となる．

追加は簡単で，メンバタブの追加をクリックし，追加したいVMを選択し，追加する．

### 4. 自動作成されたユーザーをグループに割り当てる
最後に，ユーザーをグループに割り当てる．まず，ログイン画面でkeycloakのレルムを選択し，SSOログインを行う．その後，データセンターのユーザータブから自動生成されたユーザーを確認することができる．

自動生成されたユーザーを選択し，上部の編集をクリックする．そして表示されるポップアップのグループに，先ほど作成したグループを選択し，OKをクリックする．これで，ユーザーをグループに割り当てることができた．
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3892865/d22097f6-2d91-4c15-818d-c960a1bd59a2.png)


# まとめ
こんな感じで，ProxmoxにkeycloakのOIDCを設定するのは簡単にできるので，みんなKeycloakを運用して便利にProxmoxライフを満喫しましょう！