【Red Hat OpenShift Administration対策】(2)Openshift上のRBACの仕組み


Red Hat openshift Administration試験(EX280)の勉強記事二回目です。
前回、認証機能であるHTPasswdアイデンティティプロバイダーの概念と設定手順について書きました。
今回は認可機能であるRABCについて書きます。

Openshift上のRBACポリシーについて

Openshiftでは、認可(あるユーザーがどのオブジェクトにどのアクセス権を持っているのかを決めること)機能は、RBAC(Role Based Access Control)ポリシーによって定められます。
RBACとは、人によってはあまり聞き慣れない用語かもしれませんが、グループやユーザーをあるロール(役割)に所属させ、ロールにどのような操作を許可するか設定することによってアクセス権を制御する仕組みのことです。

Openshiftでは、まずロールを「クラスターロール」と「プロジェクトロール」に分かれており、それぞれに対しアクセス権が定められたいくつかのデフォルトロール(cluster-adminなど)が用意されています。

新しくロールを定義することもできるようですが、EX280の範囲では考慮しないことにします。
これらのデフォルトロールに対し、グループまたはユーザーを割り当て(バインディング)することによって、Openshift上の操作権限の管理が行われます。

Openshiftのユーザーの種類

Openshiftのユーザーは、大きく3種類に分けられます。
(1)一般ユーザー、(2)システムユーザー、(3)サービスアカウントです。

(1)一般ユーザーはシステムユーザーおよびサービスアカウントに該当しないユーザーです。

(2)システムユーザーは、Openshift構築時にシステムが自動作成するアカウントです。system:admin、system:anonymous(認証が行われなかった場合に適用されるゲストアカウント)などがあります。

(3)サービスアカウントは、プロジェクト作成時にプロジェクト単位で生成されるシステムユーザーアカウントです。プロジェクト単位のアクセス制限を行うために使用されます。system:serviceaccount:project1:user1などがあります。

グループやユーザーのロール割り当て

グループやユーザーのロール割り当てをする際は、以下のコマンドのヘルプを見ればだいたいわかります。

oc adm policy -h

クラスターロールの操作を行う場合はadd-cluster-role-to-user/groupなどのコマンドを使い、ローカルロールの操作を行う場合はadd-role-to-user/groupなどのコマンドを使うことになります。ローカルロールの操作を行う場合は、oc project1などのコマンドを使って、対象のプロジェクトにスイッチしてからローカルロールの操作を行いましょう。

例として、次の状況を考えます。
・app1プロジェクト上にdevグループを作成する。devグループはapp1プロジェクトのedit権限を持っている。
・devグループにはuser1とuser2が所属している。
・user1はapp1プロジェクトのadmin権限を持っている。

まず、app1プロジェクトを作成します。以下のコマンドはクラスター管理者(例えばkubeadminなど)で実行します。

oc new-project app1
oc project app1

次に、devグループを作成し、user1とuser2をdevグループに所属させます。
コマンドを忘れたらoc adm -hでヘルプを見ましょう。

oc adm groups new dev
oc adm groups add-users dev user1
oc adm groups add-users dev user2
oc get groups

RBACポリシーを変更する場合はoc adm policy -hを見て必要なコマンドを実行すれば良いです。
今回の場合は以下のようになります。

oc adm policy add-role-to-group edit edit
oc adm policy add-role-to-user admin user1

プロジェクト作成権限の削除

クラスター管理者以外がプロジェクトを作成できないように設定する場合、以下のコマンドを実行します。

oc adm policy remove-cluster-role-from-group self-provisioner system:authenticated:oauth

以下コマンドを実行して、self-provisionerロールがバインドされているグループやユーザーがないことを確認します。

oc get clusterrolebinding -o wide | grep self-provisioner