Kubernetesアクセス管理を構成する

前提条件

  • Kubernetesアクセス管理機能が有効な既存のOkta Privileged Accessチーム
  • 既存のK8sクラスター
  • TerraformおよびOktaPAM Terraformプロバイダーがインストールおよび構成されたデバイス
  • v1.61.2以降のOkta Privileged Accessクライアントがインストールされたデバイス
  • kubectlがインストールされたデバイス

OktaPAM Terraformプロバイダーを準備する

最初に管理者は、Okta Privileged Access内に作成するクラスターリソースを定義するTerraformファイルを作成する必要があります。このファイルには、特定のOkta Privileged Accessチームの認証情報も含める必要があります。詳細については、認証(Authentication)を参照してください。

terraform {
	required_providers {
		oktapam = {
			source = "okta/oktapam"
			version = "0.2.1"
		}
	}
}

provider "oktapam" {
	# Authentication options
	oktapam_key = # An Okta PAM API Key
	oktapam_secret = # An Okta PAM API Secret
	oktapam_team = # An Okta PAM Team Name

}			

Kubernetesアクセス管理向けにOkta Privileged Accessを構成する

Okta Privileged AccessがKubernetesクラスターへのアクセスを管理するには、Okta Privileged Accessと管理対象クラスターの両方に相互に関する情報を構成する必要があります。

各クラスターを効果的に管理するには、クラスターのAPIサーバーアドレスとTLS証明書の両方が含まれるクラスターオブジェクトを作成し、更新することが重要です。kubernetesが管理する各クラスターは、Okta Privileged AccessをOIDC認証エンドポイントとして使用するように構成されている必要があります。OktaPAM Terraformプロバイダーは、クラスターごとにこの情報をOkta Privileged Accessに構成する際に使用されるkubernetes固有のリソースをサポートします。

クラスターのリソースをOkta Privileged Accessに構成すると、Okta Privileged Access管理者は、Okta Privileged AccessコンソールのKubernetesセクションでクラスターに関する情報をレビューできるようになります。

クラスター(Clusters):すでに追加されているすべてのクラスターをリスト表示します。チームは、関連付けられているラベルをこのページで素早く確認することもできます。特定のクラスターをクリックすると、詳細ビューが表示されます。チームは、クラスターに関連付けられているOIDC認証URLを取得できます。

クラスターグループ(Clusters Groups):すでに追加されているすべてのクラスターグループをリスト表示します。チームは、各クラスターグループのラベルをこのページで確認できます。

タスク1:Okta Privileged Accessにクラスターを追加する

まず、Okta Privileged Accessリソース管理者は、Okta Privileged Access内に作成する1つ以上のK8sクラスターリソースを定義するリソースブロックを追加する必要があります。各クラスターリソースには、その特定クラスターの認証の構成に使用されるOIDC URLが関連付けられています。チームは一度に複数のクラスターを追加できますが、クラスターごとに個別のリソースブロックを作成する必要があります。

オプションとして、チームはクラスターリソースの1つ以上のラベルセレクターを定義できます。チームは、これらのラベルを使って各クラスターへのグループアクセスを制御できます。

リクエスト
パラメーター 説明
auth_mechanism クラスターに認証の詳細を提供するために使われる特定のメカニズム。現在サポートされるのは、OIDC_RSA2048のみです。
key Okta Privileged Access内のクラスターの識別に使われる判読可能な名前。空白文字は使用できません。使用できる文字は、A~Z、0~9です。
labels Okta Privileged Access内のグループアクセスの制御に使われるラベルのマップ。
レスポンス(Response )
プロパティ(Property) 説明(Description)
id Okta Privileged Access内に作成されるリソースのID。
oidc_issuer_url K8sクラスターの構成に使用されるOIDC Issuer URL。
例(Example)
resource "oktapam_kubernetes_cluster" "asa_docs" {
	auth_mechanism    = "OIDC_RSA2048"
	key		 = "asadocs"
	labels		= { env = "prod", tier = "gold" }
}	

タスク2:Okta Privileged Accessをクラスター情報で更新する

Okta Privileged Accessには、kubectl構成ファイルを管理し、ユーザーがクラスターにアクセスできるようにするために、管理しているクラスターに関する追加情報が必要です。この情報には、クラスターのAPIサーバーとのHTTPS接続の確立に使用される、クラスターのAPIサーバーのアドレスと証明書が含まれます。この情報は、クラスターの作成方法とホスティング場所に応じて、Terraform状態ファイルから(Terraformで構築されたクラスターの場合)、またはクラスターAdmin ConsoleまたはAPIサーバーから取得できます。

リクエスト
パラメーター 説明
cluster_id クラスターのIDは、oktapam_kubernetes_clusteリソースから返されます。
api_url KubernetesクラスターのHTTPS URL。これは、Okta Privileged Accessクライアントによってユーザーのkubeconfigファイルに構成されるエンドポイントです。
public_certificate クラスターのAPIサーバーで使用されるPEMエンコードされたTLS証明書。この証明書は、クラスターのAPIサーバーが提示する証明書の検証時にkubectlによって使用されます。
レスポンス(Response )
プロパティ(Property) 説明(Description)
id Okta Privileged Access内に作成されるリソースのID。
oidc_issuer_url K8sクラスターの構成に使用されるOIDC Issuer URL。
例(Example)
resource "oktapam_kubernetes_cluster_connection" "asa_docs" {
	cluster_id         = oktapam_kubernetes_cluster.asa_docs.id
	api_url            = data.tls_certificate.asa_docs.url
	public_certificate = data.tls_certificate.asa_docs.certificates[0].cert_pem
} 

タスク3:クラスターグループを作成する

最後に、管理者は1つ以上のクラスターグループリソースブロックを作成する必要があります。クラスターグループは、既存のOkta Privileged AccessグループをKubernetesクラスターにマッピングし、チームがグループごとの特定のラベルとクレームを定義できるようにします。チームは一度に複数のクラスターグループを追加できますが、グループごとに個別のリソースブロックを作成する必要があります。

ラベルは、グループのどのクラスターメンバーがアクセス可能であるかを制御します。たとえば、チームは一部のクラスターにenv: prod セレクターを割り当て、その他のクラスターにenv: devセレクターを割り当てるかもしれません。その上で、特定のグループのみにprodラベルを割り当てる可能性があります。

クレームは、Okta Privileged Accessが作成するトークンに含まれており、KubernetesクラスターがトークンをKubernetesロールバインディングにマッピングするときに使用されます。グループの全メンバーは、関連付けられているクラスターとのやりとりでこのロールを受信します。

リクエスト
パラメーター 説明
cluster_selector ラベルクラスターは、K8sクラスターの照合に使用されます。
group_name 既存のOkta Privileged Accessグループの判読可能な名前。値の大文字/小文字は区別されます。
claims クラスター認証に使われるユーザー資格情報が含まれるクレームのマップ。クラスターに事前に構成されるロールバインディングに対応するクレーム。
応答(Response)
プロパティ(Property) 説明(Description)
id Okta Privileged Access内に作成されるリソースのID。
例(Example)

resource "oktapam_kubernetes_cluster_group" "asa_docs" {
	cluster_selector  = "env=prod"
	group_name		= "existingGroup"
	claims		= { groups = "ExampleGroup" }
}	

タスク4:クラスターを構成する

チームがOkta Privileged Access内にリソースを作成したら、管理者は、認証にOkta Privileged Accessを使用するようにクラスターを構成する必要があります。

チームがOktaPam Terraformプロバイダーを使ってクラスターを追加すると、チームは一意のOIDC認証URLを受信します。管理者はこのURLを使用して、ユーザー認証時のOkta Privileged Accessの使用をクラスターに強制します。Kubernetesのドキュメントを参照してください

Minikubeクラスター

Kubernetesアクセス管理機能をminikubeクラスターでテストすることを予定しているのであれば、次の表は、minikubeの起動コマンドに渡す必要があるパラメーターの概要を示しています。

Minikube起動引数
パラメーター 説明
apiserver.authorization-mode クラスターでKubernetes RBACを有効にするには、これをRBACに設定します。
apiserver.oidc-issuer-url クラスターの作成時にOkta Privileged Accessが生成するOIDC URL。これは、Okta Privileged Accessダッシュボードの[Cluster Details(クラスター詳細)]ページで確認できます。
apiserver.oidc-username-claim ユーザー名を定義するJWTクレーム。

subを入力します。

apiserver.oidc-groups-claim グループを定義するJWTクレーム。この値は、Okta Privileged Accessクラスターグループに構成される1つ以上のグループクレームと一致する必要があります。これは、通常はグループに設定されます。
apiserver.oidc-client-id これは、kubernetesに設定します。
minikube起動コマンドの例(Example minikube startup command)
minikube start \
	--extra-config=apiserver.authorization-mode=Node,RBAC \
	--extra-config=apiserver.oidc-issuer-url=\
	    https://app.scaleft.com/v1/teams/XXXXXX/kubernetes/clusters/XXXX-XXXX-XXXX-XXXX \
	--extra-config=apiserver.oidc-username-claim=sub \
	--extra-config=apiserver.oidc-client-id=kubernetes \
	--extra-config=apiserver.oidc-groups-claim=groups	

AWS EKSクラスター

AWS EKSクラスターでは、Okta Privileged Accessを使ったクラスターの認証のために追加の構成が必要となります。次の表は、EKSクラスターの構成方法を示すシンプルな例を提供します。詳細については、EKSクラスター認証のドキュメントを参照してください。IDをEKSクラスターに関連付け、Okta Privileged Accessによる認証とアクセスを有効にする、eksctl CLIで使用するためのYAMLファイルの例を次に示します。

EKSの構成
パラメーター 説明
IssuerUrl ラベルクラスターは、K8sクラスターの照合に使用されます。
ClientId 既存のOkta Privileged Accessグループの判読可能な名前。値の大文字/小文字は区別されます。
UsernameClaim クラスター認証に使われるユーザー資格情報が含まれるクレームのマップ。クラスターに事前に構成されるロールバインディングに対応するクレーム。
GroupsClaim グループを定義するJWTクレーム。この値は、Okta Privileged Access ClusterGroupsに構成される1つ以上のグループクレームと一致する必要があります。これは、通常はグループに設定されます。
UsernamePrefix 任意。競合を防止するためにユーザーアカウントの先頭に追加される文字列。

任意の説明的な文字列(例:ASAUser:)を入力します。

GroupsPrefix 任意。競合を防止するためにユーザーグループの先頭に追加される文字列。

任意の説明的な文字列(例:ASAGroup:)を入力します。

アクセスIDプロバイダーファイルの例(eksctlで使用)(Example Associate Identity Provider file (for use with eksctl))

apiVersion: eksctl.io/v1alpha5
kind: ClusterConfig

metadata:
	name: eks-k8s-beta
	region: us-east-1

identityProviders:
	- name: okta-asa-k8s
	type: oidc
	issuerUrl: <ASA OIDC URL>
	clientId: kubernetes
	usernameClaim: sub
	groupsClaim: groups	

クラスターロールの例(Example Cluster Role)

kind: ClusterRole
apiVersion: rbac.authorization.k8s.io/v1
metadata:
	name: ASA-readonly
rules:
	- apiGroups: ["*"]
	resources: ["*"]
	verbs: ["get", "list"]	

ロールバインディングの例(Example Role Binding)

kind: ClusterRoleBinding
apiVersion: rbac.authorization.k8s.io/v1
metadata:
	name: ASA-readonly-binding
roleRef:
	kind: ClusterRole
	name: ASA-readonly
	apiGroup: rbac.authorization.k8s.io
subjects:
	- kind: Group
	name: ASAGroup:ExampleGroup
	apiGroup: rbac.authorization.k8s.io

関連項目

Kubernetesアクセス管理

Kubernetesクラスター接続