10.5. Zero Trust Workload Identity Manager の OIDC フェデレーション
Zero Trust Workload Identity Manager は、SPIRE Server を OIDC プロバイダーとして機能させることで、OpenID Connect (OIDC) と統合します。これにより、ワークロードが、検証可能な JSON Web Tokens (SPIFFE Verifiable Identity Documents (JWT-SVIDs)) を、ローカルの SPIRE Agent から要求して受信できるようになります。その後、クラウドプロバイダーなどの外部システムが、SPIRE Server によって公開される OIDC 検出エンドポイントを使用して公開鍵を取得できるようになります。
Zero Trust Workload Identity Manager for Red Hat OpenShift は、テクノロジープレビュー機能です。テクノロジープレビュー機能は、Red Hat 製品のサービスレベルアグリーメント (SLA) の対象外であり、機能的に完全ではないことがあります。Red Hat は、実稼働環境でこれらを使用することを推奨していません。テクノロジープレビュー機能は、最新の製品機能をいち早く提供して、開発段階で機能のテストを行い、フィードバックを提供していただくことを目的としています。
Red Hat のテクノロジープレビュー機能のサポート範囲に関する詳細は、テクノロジープレビュー機能のサポート範囲 を参照してください。
以下のプロバイダーは、SPIRE OIDC フェデレーションで動作することが検証済みです。
- Azure Entra ID
- Vault
10.5.1. Entra ID OpenID Connect について リンクのコピーリンクがクリップボードにコピーされました!
Entra ID は、ユーザーとアクセス制御を一元管理するクラウドベースのアイデンティティーおよびアクセス管理サービスです。Entra ID は ID プロバイダーとして機能し、ユーザーアイデンティティーを確認して、アプリケーションに ID トークンを発行します。このトークンには重要なユーザー情報が含まれているため、アプリケーションはユーザーの認証情報を管理せずにユーザーの身元を確認できます。
Entra ID OpenID Connect (OIDC) を SPIRE と統合すると、有効期間の短い自動の暗号化アイデンティティーがワークロードに提供されます。SPIRE が発行したアイデンティティーは、静的なシークレットを使用せずにサービスをセキュアに認証するために、Entra ID に送信されます。
10.5.1.1. マネージド OIDC Discovery Provider ルートの外部証明書の設定 リンクのコピーリンクがクリップボードにコピーされました!
マネージドルートは、External Route Certificate 機能を使用して、tls.externalCertificate
フィールドを、外部で管理される Transfer Layer Security (TLS) シークレットの名前に設定します。
前提条件
- Zero Trust Workload Identity Manager 0.2.0 以降がインストールされている。
- クラスターに SPIRE Server、SPIRE Agent、SPIFFEE CSI ドライバー、および SPIRE OIDC Discovery Provider オペランドがデプロイされている。
- cert-manager Operator for Red Hat OpenShift がインストールされている。詳細は、cert-manager Operator for Red Hat OpenShift のインストール を参照してください。
-
公に信頼された CA サービスで設定された
ClusterIssuer
またはIssuer
が作成されている。たとえば、"Let’s Encrypt ACME" サービスを使用した、Automated Certificate Management Environment (ACME) タイプのIssuer
などです。詳細は、ACME 発行者の設定 を参照してください。
手順
次のコマンドを実行して、参照先のシークレットを読み取る権限をルーターのサービスアカウントに付与するための
Role
を作成します。oc create role secret-reader \ --verb=get,list,watch \ --resource=secrets \ --resource-name=$TLS_SECRET_NAME \ -n zero-trust-workload-identity-manager
$ oc create role secret-reader \ --verb=get,list,watch \ --resource=secrets \ --resource-name=$TLS_SECRET_NAME \ -n zero-trust-workload-identity-manager
Copy to Clipboard Copied! Toggle word wrap Toggle overflow 次のコマンドを実行して、ルーターのサービスアカウントを、新しく作成した Role リソースにバインドする
RoleBinding
リソースを作成します。oc create rolebinding secret-reader-binding \ --role=secret-reader \ --serviceaccount=openshift-ingress:router \ -n zero-trust-workload-identity-manager
$ oc create rolebinding secret-reader-binding \ --role=secret-reader \ --serviceaccount=openshift-ingress:router \ -n zero-trust-workload-identity-manager
Copy to Clipboard Copied! Toggle word wrap Toggle overflow 次のコマンドを実行して、前のステップで生成したた Secret を参照するように
SpireOIDCDIscoveryProvider
カスタムリソース (CR) オブジェクトを設定します。oc patch SpireOIDCDiscoveryProvider cluster --type=merge -p='
$ oc patch SpireOIDCDiscoveryProvider cluster --type=merge -p=' spec: externalSecretRef: ${TLS_SECRET_NAME} '
Copy to Clipboard Copied! Toggle word wrap Toggle overflow
検証
SpireOIDCDiscoveryProvider
CR で、次のコマンドを実行して、ManageRouteReady
条件がTrue
に設定されているかどうかを確認します。oc wait --for=jsonpath='{.status.conditions[?(@.type=="ManagedRouteReady")].status}'=True SpireOIDCDiscoveryProvider/cluster --timeout=120s
$ oc wait --for=jsonpath='{.status.conditions[?(@.type=="ManagedRouteReady")].status}'=True SpireOIDCDiscoveryProvider/cluster --timeout=120s
Copy to Clipboard Copied! Toggle word wrap Toggle overflow 次のコマンドを実行して、OIDC エンドポイントに HTTPS 経由でセキュアにアクセスできることを確認します。
Copy to Clipboard Copied! Toggle word wrap Toggle overflow
10.5.1.2. マネージドルートの無効化 リンクのコピーリンクがクリップボードにコピーされました!
OIDC Discovery Provider サービスの公開動作を完全に制御する必要がある場合は、要件に応じてマネージドルートを無効にできます。
手順
OIDC Discovery Provider を手動で設定するには、次のコマンドを実行して
managedRoute
をfalse
に設定します。oc patch SpireOIDCDiscoveryProvider cluster --type=merge -p='
$ oc patch SpireOIDCDiscoveryProvider cluster --type=merge -p=' spec: managedRoute: "false"
Copy to Clipboard Copied! Toggle word wrap Toggle overflow
10.5.1.3. Microsoft Azure での Entra ID の使用 リンクのコピーリンクがクリップボードにコピーされました!
Entra ID の設定が完了したら、Azure で動作するように Entra ID を設定できます。
前提条件
- 公的に信頼された CA からの TLS 証明書を提供するように、SPIRE OIDC Discovery Provider ルートを設定した。
手順
次のコマンドを実行して、Azure にログインします。
az login
$ az login
Copy to Clipboard Copied! Toggle word wrap Toggle overflow 次のコマンドを実行して、Azure サブスクリプションとテナントの変数を設定します。
export SUBSCRIPTION_ID=$(az account list --query "[?isDefault].id" -o tsv)
$ export SUBSCRIPTION_ID=$(az account list --query "[?isDefault].id" -o tsv)
1 Copy to Clipboard Copied! Toggle word wrap Toggle overflow export TENANT_ID=$(az account list --query "[?isDefault].tenantId" -o tsv)
$ export TENANT_ID=$(az account list --query "[?isDefault].tenantId" -o tsv)
1 Copy to Clipboard Copied! Toggle word wrap Toggle overflow export LOCATION=centralus
$ export LOCATION=centralus
1 Copy to Clipboard Copied! Toggle word wrap Toggle overflow 次のコマンドを実行して、リソースの変数名を定義します。
export NAME=ztwim
$ export NAME=ztwim
1 Copy to Clipboard Copied! Toggle word wrap Toggle overflow export RESOURCE_GROUP="${NAME}-rg"
$ export RESOURCE_GROUP="${NAME}-rg"
1 Copy to Clipboard Copied! Toggle word wrap Toggle overflow export STORAGE_ACCOUNT="${NAME}storage"
$ export STORAGE_ACCOUNT="${NAME}storage"
1 Copy to Clipboard Copied! Toggle word wrap Toggle overflow export STORAGE_CONTAINER="${NAME}storagecontainer"
$ export STORAGE_CONTAINER="${NAME}storagecontainer"
1 Copy to Clipboard Copied! Toggle word wrap Toggle overflow export USER_ASSIGNED_IDENTITY_NAME="${NAME}-identity"
$ export USER_ASSIGNED_IDENTITY_NAME="${NAME}-identity"
1 Copy to Clipboard Copied! Toggle word wrap Toggle overflow 次のコマンドを実行してリソースグループを作成します。
az group create \ --name "${RESOURCE_GROUP}" \ --location "${LOCATION}"
$ az group create \ --name "${RESOURCE_GROUP}" \ --location "${LOCATION}"
Copy to Clipboard Copied! Toggle word wrap Toggle overflow
10.5.1.4. Azure Blob Storage の設定 リンクのコピーリンクがクリップボードにコピーされました!
コンテンツを保存するために使用する新しいストレージアカウントを作成する必要があります。
手順
次のコマンドを実行して、コンテンツを保存するために使用する新しいストレージアカウントを作成します。
az storage account create \ --name ${STORAGE_ACCOUNT} \ --resource-group ${RESOURCE_GROUP} \ --location ${LOCATION} \ --encryption-services blob
$ az storage account create \ --name ${STORAGE_ACCOUNT} \ --resource-group ${RESOURCE_GROUP} \ --location ${LOCATION} \ --encryption-services blob
Copy to Clipboard Copied! Toggle word wrap Toggle overflow 次のコマンドを実行して、新しく作成したストレージアカウントのストレージ ID を取得します。
export STORAGE_ACCOUNT_ID=$(az storage account show -n ${STORAGE_ACCOUNT} -g ${RESOURCE_GROUP} --query id --out tsv)
$ export STORAGE_ACCOUNT_ID=$(az storage account show -n ${STORAGE_ACCOUNT} -g ${RESOURCE_GROUP} --query id --out tsv)
Copy to Clipboard Copied! Toggle word wrap Toggle overflow 次のコマンドを実行して、新しく作成したストレージアカウント内にストレージコンテナーを作成し、Blob のストレージをサポートするための場所を提供します。
az storage container create \ --account-name ${STORAGE_ACCOUNT} \ --name ${STORAGE_CONTAINER} \ --auth-mode login
$ az storage container create \ --account-name ${STORAGE_ACCOUNT} \ --name ${STORAGE_CONTAINER} \ --auth-mode login
Copy to Clipboard Copied! Toggle word wrap Toggle overflow
10.5.1.5. Azure のユーザーマネージド ID の設定 リンクのコピーリンクがクリップボードにコピーされました!
新しいユーザーマネージド ID を作成し、そのユーザーマネージド ID に関連付けられている関連サービスプリンシパルのクライアント ID を取得する必要があります。
手順
次のコマンドを実行して、新しいユーザーマネージド ID を作成し、そのユーザーマネージド ID に関連付けられている関連サービスプリンシパルのクライアント ID を取得します。
az identity create \ --name ${USER_ASSIGNED_IDENTITY_NAME} \ --resource-group ${RESOURCE_GROUP} export IDENTITY_CLIENT_ID=$(az identity show --resource-group "${RESOURCE_GROUP}" --name "${USER_ASSIGNED_IDENTITY_NAME}" --query 'clientId' -otsv)
$ az identity create \ --name ${USER_ASSIGNED_IDENTITY_NAME} \ --resource-group ${RESOURCE_GROUP} $ export IDENTITY_CLIENT_ID=$(az identity show --resource-group "${RESOURCE_GROUP}" --name "${USER_ASSIGNED_IDENTITY_NAME}" --query 'clientId' -otsv)
Copy to Clipboard Copied! Toggle word wrap Toggle overflow 次のコマンドを実行して、Azure ユーザー割り当てマネージド ID の
CLIENT_ID
を取得し、それを環境変数として保存します。export IDENTITY_CLIENT_ID=$(az identity show --resource-group "${RESOURCE_GROUP}" --name "${USER_ASSIGNED_IDENTITY_NAME}" --query 'clientId' -otsv)
$ export IDENTITY_CLIENT_ID=$(az identity show --resource-group "${RESOURCE_GROUP}" --name "${USER_ASSIGNED_IDENTITY_NAME}" --query 'clientId' -otsv)
Copy to Clipboard Copied! Toggle word wrap Toggle overflow 次のコマンドを実行して、ユーザーマネージド ID に関連付けられているサービスプリンシパルにロールを関連付けます。
az role assignment create \ --role "Storage Blob Data Contributor" \ --assignee "${IDENTITY_CLIENT_ID}" \ --scope ${STORAGE_ACCOUNT_ID}
$ az role assignment create \ --role "Storage Blob Data Contributor" \ --assignee "${IDENTITY_CLIENT_ID}" \ --scope ${STORAGE_ACCOUNT_ID}
Copy to Clipboard Copied! Toggle word wrap Toggle overflow
10.5.1.6. デモアプリケーションの作成 リンクのコピーリンクがクリップボードにコピーされました!
デモアプリケーションを使用すると、システム全体が動作するかどうかを確認できます。
手順
デモアプリケーションを作成するには、次の手順を実行します。
次のコマンドを実行して、アプリケーション名と namespace を設定します。
export APP_NAME=workload-app
$ export APP_NAME=workload-app
Copy to Clipboard Copied! Toggle word wrap Toggle overflow export APP_NAMESPACE=demo
$ export APP_NAMESPACE=demo
Copy to Clipboard Copied! Toggle word wrap Toggle overflow 以下のコマンドを実行して namespace を作成します。
oc create namespace $APP_NAMESPACE
$ oc create namespace $APP_NAMESPACE
Copy to Clipboard Copied! Toggle word wrap Toggle overflow 次のコマンドを実行して、アプリケーションの Secret を作成します。
Copy to Clipboard Copied! Toggle word wrap Toggle overflow
10.5.1.7. ワークロードアプリケーションのデプロイ リンクのコピーリンクがクリップボードにコピーされました!
デモアプリケーションを作成したら、デプロイします。
前提条件
- デモアプリケーションが作成およびデプロイ済みである。
手順
アプリケーションをデプロイするには、以下に記載のコマンドブロック全体をコピーし、ターミナルに直接貼り付けます。Enter キーを押します。
Copy to Clipboard Copied! Toggle word wrap Toggle overflow
検証
次のコマンドを実行して、
workload-app
Pod が正常に実行されていることを確認します。oc get pods -n $APP_NAMESPACE
$ oc get pods -n $APP_NAMESPACE
Copy to Clipboard Copied! Toggle word wrap Toggle overflow 出力例
NAME READY STATUS RESTARTS AGE workload-app-5f8b9d685b-abcde 1/1 Running 0 60s
NAME READY STATUS RESTARTS AGE workload-app-5f8b9d685b-abcde 1/1 Running 0 60s
Copy to Clipboard Copied! Toggle word wrap Toggle overflow SPIFFE JWT Token (SVID-JWT) を取得します。
次のコマンドを実行して、Pod 名を動的に取得します。
POD_NAME=$(oc get pods -n $APP_NAMESPACE -l app=$APP_NAME -o jsonpath='{.items[0].metadata.name}')
$ POD_NAME=$(oc get pods -n $APP_NAMESPACE -l app=$APP_NAME -o jsonpath='{.items[0].metadata.name}')
Copy to Clipboard Copied! Toggle word wrap Toggle overflow 次のコマンドを実行して、Pod 内でスクリプトを実行します。
oc exec -it $POD_NAME -n $APP_NAMESPACE -- \ /opt/app-root/src/get-spiffe-token.py -a "api://AzureADTokenExchange"
$ oc exec -it $POD_NAME -n $APP_NAMESPACE -- \ /opt/app-root/src/get-spiffe-token.py -a "api://AzureADTokenExchange"
Copy to Clipboard Copied! Toggle word wrap Toggle overflow
10.5.1.8. SPIFFE アイデンティティーフェデレーションを使用した Azure の設定 リンクのコピーリンクがクリップボードにコピーされました!
SPIFFE アイデンティティーフェデレーションを使用して Azure を設定すると、デモアプリケーションに対するパスワード不要の自動認証を有効にできます。
手順
次のコマンドを実行して、ユーザーマネージド ID と、ワークロードアプリケーションに関連付けられている SPIFFE アイデンティティーの間で、アイデンティティーをフェデレーションします。
Copy to Clipboard Copied! Toggle word wrap Toggle overflow
10.5.1.9. アプリケーションワークロードが Azure Blob Storage 内のコンテンツにアクセスできることを確認する リンクのコピーリンクがクリップボードにコピーされました!
アプリケーションワークロードが Azure Blob Storage にアクセスできるかどうかを確認できます。
前提条件
- Azure Blob Storage が作成済みである。
手順
次のコマンドを実行して、SPIFFE Workload API から JWT トークンを取得します。
oc rsh -n $APP_NAMESPACE deployment/$APP_NAME
$ oc rsh -n $APP_NAMESPACE deployment/$APP_NAME
Copy to Clipboard Copied! Toggle word wrap Toggle overflow 次のコマンドを実行して、
TOKEN
という名前の環境変数を作成してエクスポートします。export TOKEN=$(/opt/app-root/src/get-spiffe-token.py --audience=$AZURE_AUDIENCE)
$ export TOKEN=$(/opt/app-root/src/get-spiffe-token.py --audience=$AZURE_AUDIENCE)
Copy to Clipboard Copied! Toggle word wrap Toggle overflow 次のコマンドを実行して、Pod 内に含まれる Azure CLI にログインします。
az login --service-principal \ -t ${AZURE_TENANT_ID} \ -u ${AZURE_CLIENT_ID} \ --federated-token ${TOKEN}
$ az login --service-principal \ -t ${AZURE_TENANT_ID} \ -u ${AZURE_CLIENT_ID} \ --federated-token ${TOKEN}
Copy to Clipboard Copied! Toggle word wrap Toggle overflow 次のコマンドを実行して、アプリケーションワークロード Pod で新しいファイルを作成し、そのファイルを Blob Storage にアップロードします。
echo “Hello from OpenShift” > openshift-spire-federated-identities.txt
$ echo “Hello from OpenShift” > openshift-spire-federated-identities.txt
Copy to Clipboard Copied! Toggle word wrap Toggle overflow 次のコマンドを実行して、Azure Blog Storage にファイルをアップロードします。
Copy to Clipboard Copied! Toggle word wrap Toggle overflow
検証
次のコマンドを実行して、含まれているファイルをリスト表示し、ファイルが正常にアップロードされたことを確認します。
az storage blob list \ --account-name ${BLOB_STORE_ACCOUNT} \ --container-name ${BLOB_STORE_CONTAINER} \ --auth-mode login \ -o table
$ az storage blob list \ --account-name ${BLOB_STORE_ACCOUNT} \ --container-name ${BLOB_STORE_CONTAINER} \ --auth-mode login \ -o table
Copy to Clipboard Copied! Toggle word wrap Toggle overflow
10.5.2. Vault OpenID Connect について リンクのコピーリンクがクリップボードにコピーされました!
Vault OpenID Connect (OIDC) と SPIRE を組み合わせると、信頼できる OIDC プロバイダーとして SPIRE を Vault で使用して、セキュアな認証方法を実現できます。ワークロードは、一意の SPIFFE ID を持つローカル SPIRE Agent から JWT-SVID を要求します。次に、ワークロードはこのトークンを Vault に提示します。Vault はそれを SPIRE Server 上の公開鍵と照合して検証します。すべての条件が満たされた場合、Vault は有効期間の短い Vault トークンをワークロードに発行します。ワークロードはこのトークンを使用してシークレットにアクセスし、Vault 内でアクションを実行できます。
10.5.2.1. Vault のインストール リンクのコピーリンクがクリップボードにコピーされました!
Vault を OIDC として使用する前に、Vault をインストールする必要があります。
前提条件
- ルートを設定します。詳細は、ルート設定 を参照してください。
- Helm がインストールされている。
- Vault API からの出力を簡単に読み取るためのコマンドライン JSON プロセッサー。
- HashiCorp Helm リポジトリーが追加されている。
手順
vault-helm-value.yaml
ファイルを作成します。Copy to Clipboard Copied! Toggle word wrap Toggle overflow helm install
コマンドを実行します。helm install vault hashicorp/vault \ --create-namespace -n vault \ --values ./vault-helm-value.yaml
$ helm install vault hashicorp/vault \ --create-namespace -n vault \ --values ./vault-helm-value.yaml
Copy to Clipboard Copied! Toggle word wrap Toggle overflow 次のコマンドを実行して、Vault サービスを公開します。
oc expose service vault -n vault
$ oc expose service vault -n vault
Copy to Clipboard Copied! Toggle word wrap Toggle overflow 次のコマンドを実行して、
VAULT_ADDR
環境変数を設定し、新しいルートからホスト名を取得してエクスポートします。export VAULT_ADDR="http://$(oc get route vault -n vault -o jsonpath='{.spec.host}')"
$ export VAULT_ADDR="http://$(oc get route vault -n vault -o jsonpath='{.spec.host}')"
Copy to Clipboard Copied! Toggle word wrap Toggle overflow 注記TLS が無効になっているため、先頭に
http://
が追加されます。
検証
Vault インスタンスが実行されていることを確認するために、次のコマンドを実行します。
curl -s $VAULT_ADDR/v1/sys/health | jq
$ curl -s $VAULT_ADDR/v1/sys/health | jq
Copy to Clipboard Copied! Toggle word wrap Toggle overflow 出力例
Copy to Clipboard Copied! Toggle word wrap Toggle overflow
10.5.2.2. Vault の初期化とアンシール リンクのコピーリンクがクリップボードにコピーされました!
新しくインストールされた Vault は、シールされた状態です。そのため、他のすべての暗号鍵を保護するプライマリー暗号鍵が起動時にサーバーメモリーにロードされません。アンシール (シールを解除) するには、Vault を初期化する必要があります。
Vault サーバーを初期化する手順は次のとおりです。
- Vault の初期化とアンシール
- キー/値 (KV) シークレットエンジンの有効化とテストシークレットの保存
- SPIRE での JSON Web Token (JWT) 認証の設定
- デモアプリケーションのデプロイ
- 認証とシークレットの取得
前提条件
- Vault が実行されていることを確認する。
- Vault が初期化されていないことを確認する。Vault サーバーを初期化できるのは 1 回だけです。
手順
次のコマンドを実行して、
vault
Pod へのリモートシェルを開きます。oc rsh -n vault statefulset/vault
$ oc rsh -n vault statefulset/vault
Copy to Clipboard Copied! Toggle word wrap Toggle overflow 次のコマンドを実行して、Vault を初期化し、アンシールキーとルートトークンを取得します。
vault operator init -key-shares=1 -key-threshold=1 -format=json
$ vault operator init -key-shares=1 -key-threshold=1 -format=json
Copy to Clipboard Copied! Toggle word wrap Toggle overflow 次のコマンドを実行して、前のコマンドで受け取ったアンシールキーとルートトークンをエクスポートします。
export UNSEAL_KEY=<Your-Unseal-Key>
$ export UNSEAL_KEY=<Your-Unseal-Key>
Copy to Clipboard Copied! Toggle word wrap Toggle overflow export ROOT_TOKEN=<Your-Root-Token>
$ export ROOT_TOKEN=<Your-Root-Token>
Copy to Clipboard Copied! Toggle word wrap Toggle overflow 次のコマンドを実行して、アンシールキーを使用して Vault をアンシールします。
vault operator unseal -format=json $UNSEAL_KEY
$ vault operator unseal -format=json $UNSEAL_KEY
Copy to Clipboard Copied! Toggle word wrap Toggle overflow -
exit
と入力して Pod を終了します。
検証
Vault Pod の準備完了状態であることを確認するために、次のコマンドを実行します。
oc get pod -n vault
$ oc get pod -n vault
Copy to Clipboard Copied! Toggle word wrap Toggle overflow 出力例
NAME READY STATUS RESTARTS AGE vault-0 1/1 Running 0 65d
NAME READY STATUS RESTARTS AGE vault-0 1/1 Running 0 65d
Copy to Clipboard Copied! Toggle word wrap Toggle overflow
10.5.2.3. キー値シークレットエンジンの有効化とテストシークレットの保存 リンクのコピーリンクがクリップボードにコピーされました!
キー値シークレットエンジンを有効にして、認証情報を管理するためのセキュアな一元管理場所を確立します。
前提条件
- Vault が初期化およびアンシールされていることを確認する。
手順
次のコマンドを実行して、
Vault
Pod で別のシェルセッションを開きます。oc rsh -n vault statefulset/vault
$ oc rsh -n vault statefulset/vault
Copy to Clipboard Copied! Toggle word wrap Toggle overflow 次のコマンドを実行して、この新しいセッション内でルートトークンを再度エクスポートし、ログインします。
export ROOT_TOKEN=<Your-Root-Token>
$ export ROOT_TOKEN=<Your-Root-Token>
Copy to Clipboard Copied! Toggle word wrap Toggle overflow vault login "${ROOT_TOKEN}"
$ vault login "${ROOT_TOKEN}"
Copy to Clipboard Copied! Toggle word wrap Toggle overflow 次のコマンドを実行して、
secret/
パスでキー/値シークレットエンジンを有効にし、テストシークレットを作成します。export NAME=ztwim
$ export NAME=ztwim
Copy to Clipboard Copied! Toggle word wrap Toggle overflow vault secrets enable -path=secret kv
$ vault secrets enable -path=secret kv
Copy to Clipboard Copied! Toggle word wrap Toggle overflow vault kv put secret/$NAME version=v0.1.0
$ vault kv put secret/$NAME version=v0.1.0
Copy to Clipboard Copied! Toggle word wrap Toggle overflow
検証
シークレットが正しく保存されていることを確認するために、次のコマンドを実行します。
vault kv get secret/$NAME
$ vault kv get secret/$NAME
Copy to Clipboard Copied! Toggle word wrap Toggle overflow
10.5.2.4. SPIRE での JSON Web Token 認証の設定 リンクのコピーリンクがクリップボードにコピーされました!
アプリケーションが SPIFFE のアイデンティティーを使用して Vault にセキュアにログインできるように、JSON Web Token (JWT) 認証を設定する必要があります。
前提条件
- Vault が初期化およびアンシールされていることを確認する。
- テストシークレットがキー値シークレットエンジンに保存されていることを確認します。
手順
ローカルマシンで、次のコマンドを実行して SPIRE 認証局 (CA) バンドルを取得し、ファイルに保存します。
oc get cm -n zero-trust-workload-identity-manager spire-bundle -o jsonpath='{ .data.bundle\.crt }' > oidc_provider_ca.pem
$ oc get cm -n zero-trust-workload-identity-manager spire-bundle -o jsonpath='{ .data.bundle\.crt }' > oidc_provider_ca.pem
Copy to Clipboard Copied! Toggle word wrap Toggle overflow Vault Pod シェルに戻り、次のコマンドを実行して一時ファイルを作成し、
oidc_provider_ca.pem
の内容をそのファイルに貼り付けます。cat << EOF > /tmp/oidc_provider_ca.pem -----BEGIN CERTIFICATE----- <Paste-Your-Certificate-Content-Here> -----END CERTIFICATE----- EOF
$ cat << EOF > /tmp/oidc_provider_ca.pem -----BEGIN CERTIFICATE----- <Paste-Your-Certificate-Content-Here> -----END CERTIFICATE----- EOF
Copy to Clipboard Copied! Toggle word wrap Toggle overflow 次のコマンドを実行して、JWT 設定に必要な環境変数を設定します。
export APP_DOMAIN=<Your-App-Domain>
$ export APP_DOMAIN=<Your-App-Domain>
Copy to Clipboard Copied! Toggle word wrap Toggle overflow export JWT_ISSUER_ENDPOINT="oidc-discovery.$APP_DOMAIN"
$ export JWT_ISSUER_ENDPOINT="oidc-discovery.$APP_DOMAIN"
Copy to Clipboard Copied! Toggle word wrap Toggle overflow export OIDC_URL="https://$JWT_ISSUER_ENDPOINT"
$ export OIDC_URL="https://$JWT_ISSUER_ENDPOINT"
Copy to Clipboard Copied! Toggle word wrap Toggle overflow export OIDC_CA_PEM="$(cat /tmp/oidc_provider_ca.pem)"
$ export OIDC_CA_PEM="$(cat /tmp/oidc_provider_ca.pem)"
Copy to Clipboard Copied! Toggle word wrap Toggle overflow 次のコマンドを実行して、新しい環境変数を作成します。
export ROLE="${NAME}-role"
$ export ROLE="${NAME}-role"
Copy to Clipboard Copied! Toggle word wrap Toggle overflow 次のコマンドを実行して、JWT 認証方法を有効にします。
vault auth enable jwt
$ vault auth enable jwt
Copy to Clipboard Copied! Toggle word wrap Toggle overflow 次のコマンドを実行して、ODIC 認証方法を設定します。
vault write auth/jwt/config \ oidc_discovery_url=$OIDC_URL \ oidc_discovery_ca_pem="$OIDC_CA_PEM" \ default_role=$ROLE
$ vault write auth/jwt/config \ oidc_discovery_url=$OIDC_URL \ oidc_discovery_ca_pem="$OIDC_CA_PEM" \ default_role=$ROLE
Copy to Clipboard Copied! Toggle word wrap Toggle overflow 次のコマンドを実行して、
ztwim-policy
という名前のポリシーを作成します。export POLICY="${NAME}-policy"
$ export POLICY="${NAME}-policy"
Copy to Clipboard Copied! Toggle word wrap Toggle overflow 次のコマンドを実行して、先ほど作成したシークレットへの読み取りアクセス権を付与します。
vault policy write $POLICY -<<EOF path "secret/$NAME" { capabilities = ["read"] } EOF
$ vault policy write $POLICY -<<EOF path "secret/$NAME" { capabilities = ["read"] } EOF
Copy to Clipboard Copied! Toggle word wrap Toggle overflow 次のコマンドを実行して、以下の環境変数を作成します。
export APP_NAME=client
$ export APP_NAME=client
Copy to Clipboard Copied! Toggle word wrap Toggle overflow export APP_NAMESPACE=demo
$ export APP_NAMESPACE=demo
Copy to Clipboard Copied! Toggle word wrap Toggle overflow export AUDIENCE=$APP_NAME
$ export AUDIENCE=$APP_NAME
Copy to Clipboard Copied! Toggle word wrap Toggle overflow 次のコマンドを実行して、特定の SPIFFE ID を持つワークロードにポリシーをバインドする JWT ロールを作成します。
Copy to Clipboard Copied! Toggle word wrap Toggle overflow
10.5.2.5. デモアプリケーションのデプロイ リンクのコピーリンクがクリップボードにコピーされました!
デモアプリケーションをデプロイする場合は、SPIFFE アイデンティティーを使用して Vault で認証するシンプルなクライアントアプリケーションを作成します。
手順
ローカルマシンで、次のコマンドを実行してアプリケーションの環境変数を設定します。
export APP_NAME=client
$ export APP_NAME=client
Copy to Clipboard Copied! Toggle word wrap Toggle overflow export APP_NAMESPACE=demo
$ export APP_NAMESPACE=demo
Copy to Clipboard Copied! Toggle word wrap Toggle overflow export AUDIENCE=$APP_NAME
$ export AUDIENCE=$APP_NAME
Copy to Clipboard Copied! Toggle word wrap Toggle overflow 次のコマンドを実行して、Kubernetes マニフェストを適用し、デモアプリケーションの namespace、サービスアカウント、およびデプロイメントを作成します。このデプロイメントにより、SPIFFE CSI ドライバーソケットがマウントされます。
oc apply -f - <<EOF ... (paste the full YAML from your provided code here) ... EOF
$ oc apply -f - <<EOF # ... (paste the full YAML from your provided code here) ... EOF
Copy to Clipboard Copied! Toggle word wrap Toggle overflow
検証
次のコマンドを実行して、クライアントのデプロイメントが準備完了状態であることを確認します。
oc get deploy -n $APP_NAMESPACE
$ oc get deploy -n $APP_NAMESPACE
Copy to Clipboard Copied! Toggle word wrap Toggle overflow 出力例
NAME READY UP-TO-DATE AVAILABLE AGE frontend-app 2/2 2 2 120d backend-api 3/3 3 3 120d
NAME READY UP-TO-DATE AVAILABLE AGE frontend-app 2/2 2 2 120d backend-api 3/3 3 3 120d
Copy to Clipboard Copied! Toggle word wrap Toggle overflow
10.5.2.6. 認証とシークレットの取得 リンクのコピーリンクがクリップボードにコピーされました!
デモアプリケーションを使用して SPIFFE Workload API から JWT トークンを取得し、それを使用して Vault にログインしてシークレットを取得します。
手順
実行中のクライアント Pod 内で次のコマンドを実行して、JWT-SVID を取得します。
oc -n $APP_NAMESPACE exec -it $(oc get pod -o=jsonpath='{.items[*].metadata.name}' -l app=$APP_NAME -n $APP_NAMESPACE) \ -- /opt/spire/bin/spire-agent api fetch jwt \ -socketPath /run/spire/sockets/spire-agent.sock \ -audience $AUDIENCE
$ oc -n $APP_NAMESPACE exec -it $(oc get pod -o=jsonpath='{.items[*].metadata.name}' -l app=$APP_NAME -n $APP_NAMESPACE) \ -- /opt/spire/bin/spire-agent api fetch jwt \ -socketPath /run/spire/sockets/spire-agent.sock \ -audience $AUDIENCE
Copy to Clipboard Copied! Toggle word wrap Toggle overflow 出力からトークンをコピーし、次のコマンドを実行してローカルマシン上で環境変数としてエクスポートします。
export IDENTITY_TOKEN=<Your-JWT-Token>
$ export IDENTITY_TOKEN=<Your-JWT-Token>
Copy to Clipboard Copied! Toggle word wrap Toggle overflow 次のコマンドを実行して、新しい環境変数を作成します。
export ROLE="${NAME}-role"
$ export ROLE="${NAME}-role"
Copy to Clipboard Copied! Toggle word wrap Toggle overflow 次のコマンドを実行して、
curl
を使用して JWT トークンを Vault ログインエンドポイントに送信し、Vault クライアントトークンを取得します。VAULT_TOKEN=$(curl -s --request POST --data '{ "jwt": "'"${IDENTITY_TOKEN}"'", "role": "'"${ROLE}"'"}' "${VAULT_ADDR}"/v1/auth/jwt/login | jq -r '.auth.client_token')
$ VAULT_TOKEN=$(curl -s --request POST --data '{ "jwt": "'"${IDENTITY_TOKEN}"'", "role": "'"${ROLE}"'"}' "${VAULT_ADDR}"/v1/auth/jwt/login | jq -r '.auth.client_token')
Copy to Clipboard Copied! Toggle word wrap Toggle overflow
検証
次のコマンドを実行し、新しく取得した Vault トークンを使用してキー/値ストアからシークレットを読み取ります。
curl -s -H "X-Vault-Token: $VAULT_TOKEN" $VAULT_ADDR/v1/secret/$NAME | jq
$ curl -s -H "X-Vault-Token: $VAULT_TOKEN" $VAULT_ADDR/v1/secret/$NAME | jq
Copy to Clipboard Copied! Toggle word wrap Toggle overflow 出力にシークレットの内容 (
"version": "v0.1.0"
) が表示されます。これにより、ワークフロー全体が成功したことを確認できます。