この記事では、次の方法について説明します。
- Microsoft Entra ワークロード ID と Kubernetes サービス アカウントを作成します。
- トークンのフェデレーション用にマネージド ID を構成する。
- 新しいシークレットとロールの割り当てを使用して Microsoft Azure Key Vault を作成します (デモ用)。
- ワークロードをデプロイし、ワークロード ID を使用して認証を確認します。
- クラスター内のポッドに、Azure キー コンテナー内のシークレットへのアクセス権を付与します。
このプロセスには、次の処理が伴います。
- OpenID Connect (OIDC) 発行者 URL を取得します。
- アプリケーションのユーザー割り当てマネージド ID を作成します。
- 目的のリソースに対してロールの割り当てを実行します。
- Kubernetes サービス アカウントを作成します。
- サービス アカウントに注釈を設定します。
- フェデレーション認証情報を作成します。
- アプリケーションをデプロイし、次のことを確認します。
-
.spec.serviceAccountName
が設定されます。 - ラベル
azure.workload.identity/use: "true"
が設定されます。
-
重要
この Azure Red Hat OpenShift 機能は現在、プレビューでのみ提供されています。 プレビュー機能は、セルフサービスのオプトイン ベースで利用できます。 プレビューは 現状のまま かつ 利用可能な場合 に提供され、サービスレベル合意および限定保証から除外されます。 Azure Red Hat OpenShift プレビューは、ベスト エフォートベースでカスタマー サポートによって部分的にカバーされるため、これらの機能は運用環境での使用を意図していません。
[前提条件]
既存のマネージド ID Azure Red Hat OpenShift クラスターが必要です。
pod-identity-webhook のデプロイを確認する
よく知られているパスに署名されたサービス アカウント トークンを投影し、認証関連の環境変数をアプリケーション ポッドに挿入する変更アドミッション Webhook があります。 詳細については、「 受付 Webhook の変更」を参照してください。
次のコマンドを実行して、openshift-cloud-credential-operator
名前空間の pod-identity-webhook デプロイで注釈target.workload.openshift.io/management
が設定されていることを確認します。
oc describe deployment pod-identity-webhook -n openshift-cloud-credential-operator | grep 'target.workload.openshift.io/management'
次のような応答が表示されます。
Annotations: target.workload.openshift.io/management: {"effect": "PreferredDuringScheduling"}
注釈が見つからない場合は、 サポート ケースを開きます。
環境変数をエクスポートする
まず、既存のマネージド ID Azure Red Hat OpenShift クラスターに一致する環境変数を設定します。 正しい RESOURCE_GROUP
、 LOCATION
、 CLUSTER_NAME
、名前空間、および必要な ID 名を設定してください。
export KEYVAULT_NAME="azwi-kv-$(openssl rand -hex 2)"
export KEYVAULT_SECRET_NAME="my-secret"
export KEYVAULT_LOCATION="eastus"
export RESOURCE_GROUP="<ARO_CLUSTER_RESOURCE_GROUP>"
export CLUSTER_NAME="<ARO_CLUSTER_NAME>"
export SUBSCRIPTION="$(az account show --query id --output tsv)"
export USER_ASSIGNED_IDENTITY_NAME="example-user-assigned-identity"
export FEDERATED_IDENTITY_CREDENTIAL_NAME="example-federated-identity"
export SERVICE_ACCOUNT_NAMESPACE="example-project"
export SERVICE_ACCOUNT_NAME="example-workload-identity-sa"
OIDC 発行者 URL を取得する
OpenShift CLI (OC) を使用して Azure Red Hat OpenShift クラスター OIDC 発行者 URL を取得し、環境変数を設定します。
export ARO_OIDC_ISSUER="$(oc get authentication cluster -o jsonpath='{.spec.serviceAccountIssuer}')"
必要に応じて、クラスターへのアクセス権がない場合は、Azure CLI を使用して Azure Red Hat OpenShift クラスター OIDC 発行者 URL を取得します。
export ARO_OIDC_ISSUER="$(az aro show --subscription "${SUBSCRIPTION}" \
--name "${CLUSTER_NAME}" \
--resource-group "${RESOURCE_GROUP}" \
--query "clusterProfile.oidcIssuer" \
--output tsv)"
正しい URL が設定されていることを確認します。
echo $ARO_OIDC_ISSUER
https://eastus.oic.aro.azure.net/00000000-0000-0000-0000-000000000000/11111111-1111-1111-1111-111111111111
既定では、発行者はベース URL https://{region}.oic.aro.azure.net/{tenant_id}/{uuid}
を使用するように設定されています。ここで、 {region}
の値は、Azure Red Hat OpenShift クラスターがデプロイされている場所と一致します。
{uuid}
値は、変更できないランダムに生成されたクラスター固有の GUID である OIDC キーを表します。
リソースの例を作成する
この例では、新しいシークレットを含む新しい Microsoft Azure Key Vault が作成され、後で Microsoft Entra ワークロード ID を介してアクセスされます。 Azure az
コマンド ライン ツールを使用して、後でアクセスするキー コンテナーを作成します。
Azure ロールベースのアクセス制御 (Azure RBAC) Key Vault Secrets Officer ロールが自分に割り当てられていることを確認します。
# If necessary, create the Resource Group
az group create --resource-group "${RESOURCE_GROUP}" --location "${KEYVAULT_LOCATION}"
# Create the Keyvault and set a secret value
az keyvault create --resource-group "${RESOURCE_GROUP}" --location "${KEYVAULT_LOCATION}" --name "${KEYVAULT_NAME}"
az keyvault secret set --vault-name "${KEYVAULT_NAME}" --name "${KEYVAULT_SECRET_NAME}" --value "Hello world"
# Create an environment variable for the key vault URL:
export KEYVAULT_URL="$(az keyvault show --resource-group ${RESOURCE_GROUP} --name ${KEYVAULT_NAME} --query properties.vaultUri --output tsv)"
# Create an environment variable for the key vault Resource ID:
export KEYVAULT_RESOURCE_ID=$(az keyvault show --resource-group "${RESOURCE_GROUP}" --name "${KEYVAULT_NAME}" | jq -r '.id')
マネージド ID を作成し、Azure Key Vault にアクセスするためのアクセス許可を付与する
次の手順では、ユーザー割り当てマネージド ID と対応するロールの割り当てを作成します。
# Create the identity
az identity create --name "${USER_ASSIGNED_IDENTITY_NAME}" --resource-group "${RESOURCE_GROUP}"
# Assign Key Vault Secrets User to the identity
export USER_ASSIGNED_IDENTITY_OBJECT_ID="$(az identity show --name "${USER_ASSIGNED_IDENTITY_NAME}" --resource-group "${RESOURCE_GROUP}" --query 'principalId' -o tsv)"
export USER_ASSIGNED_IDENTITY_CLIENT_ID="$(az identity show --name "${USER_ASSIGNED_IDENTITY_NAME}" --resource-group "${RESOURCE_GROUP}" --query 'clientId' -o tsv)"
az role assignment create --assignee-object-id "${USER_ASSIGNED_IDENTITY_OBJECT_ID}" --role "Key Vault Secrets User" --scope "${KEYVAULT_RESOURCE_ID}" --assignee-principal-type ServicePrincipal
Kubernetes サービス アカウントを作成する
- OpenShift Container Platform で、
azure.workload.identity/client-id
が以前に作成したUSER_ASSIGNED_IDENTITY_CLIENT_ID
に設定されたサービス アカウントを作成します。 - サービス アカウントの作成の詳細については、「サービス アカウント の作成」を参照してください。
このサンプル アプリの新しいプロジェクトを作成します。
oc new-project ${SERVICE_ACCOUNT_NAMESPACE}
サービス アカウントを作成します。
cat <<EOF | oc apply -f -
apiVersion: v1
kind: ServiceAccount
metadata:
name: ${SERVICE_ACCOUNT_NAME}
namespace: ${SERVICE_ACCOUNT_NAMESPACE}
annotations:
azure.workload.identity/client-id: ${USER_ASSIGNED_IDENTITY_CLIENT_ID}
EOF
フェデレーション ID 資格情報を作成する
OpenShift Container Platform のサービス アカウントを Azure ユーザー割り当てマネージド ID にリンクする Azure フェデレーション ID 資格情報を作成します。
az identity federated-credential create \
--name "${FEDERATED_IDENTITY_CREDENTIAL_NAME}" \
--identity-name "${USER_ASSIGNED_IDENTITY_NAME}" \
--resource-group "${RESOURCE_GROUP}" \
--issuer "${ARO_OIDC_ISSUER}" \
--subject "system:serviceaccount:${SERVICE_ACCOUNT_NAMESPACE}:${SERVICE_ACCOUNT_NAME}"
アプリケーションをデプロイする
OpenShift Container Platform Service アカウントが想定どおりに構成されました。
.spec.serviceAccountName
が設定され、ラベルazure.workload.identity/use: "true"
が使用されることに注意してください。
cat <<EOF | oc apply -f -
apiVersion: v1
kind: Pod
metadata:
name: quick-start
namespace: ${SERVICE_ACCOUNT_NAMESPACE}
labels:
azure.workload.identity/use: "true"
spec:
serviceAccountName: ${SERVICE_ACCOUNT_NAME}
securityContext:
runAsNonRoot: true
seccompProfile:
type: RuntimeDefault
containers:
- image: ghcr.io/azure/azure-workload-identity/msal-go
name: oidc
securityContext:
allowPrivilegeEscalation: false
capabilities:
drop: [ "ALL" ]
env:
- name: KEYVAULT_URL
value: ${KEYVAULT_URL}
- name: SECRET_NAME
value: ${KEYVAULT_SECRET_NAME}
EOF
デプロイされたワークロードを確認する
新しくデプロイされたワークロードで、環境変数と投影ボリュームの両方が存在することを確認します。 次のコマンドを実行します。
oc describe pod quick-start
次の出力例を参照してください。
[..]
Environment:
KEYVAULT_URL: https://azwi-kv-45ff.vault.azure.net/
SECRET_NAME: my-secret
AZURE_CLIENT_ID: 00001111-aaaa-2222-bbbb-3333cccc4444
AZURE_TENANT_ID: aaaabbbb-0000-cccc-1111-dddd2222eeee
AZURE_FEDERATED_TOKEN_FILE: /var/run/secrets/azure/tokens/azure-identity-token
AZURE_AUTHORITY_HOST: https://login.microsoftonline.com/
[..]
Volumes:
[..]
azure-identity-token:
Type: Projected (a volume that contains injected data from multiple sources)
TokenExpirationSeconds: 3600
挿入されたキーを使用して、ワークロードが Microsoft Azure Key Vault にアクセスできたことをログで確認します。
$ oc logs quick-start
I0816 09:43:37.961113 1 main.go:63] "successfully got secret" secret="Hello world"