---
title: Azure AD ワークロードIDを使って k8sからAzureリソースに安全にアクセスしよう
tags:  #azure  
author: [ussvgr](https://www.docswell.com/user/ussvgr)
site: [Docswell](https://www.docswell.com/)
thumbnail: https://bcdn.docswell.com/page/L71M33PKJG.jpg?width=480
description: Kubernetes Novice Tokyo #26 でのLT資料です
published: July 04, 23
canonical: https://www.docswell.com/s/ussvgr/ZVV49E-azure-ad-workload-id
---
# Page. 1

![Page Image](https://bcdn.docswell.com/page/L71M33PKJG.jpg)

Azure AD ワークロードIDを使って
k8sからAzureリソースに
安全にアクセスしよう
2023/07/04 Kubernetes N ovice Tok yo # 26
Shunsuk e Yoshik a wa


# Page. 2

![Page Image](https://bcdn.docswell.com/page/G7W3PP2P72.jpg)

自己紹介
Shunsuke Yoshikawa
Twitter: https://twitter.com/ussvgr
Qiita:
https://qiita.com/ussvgr
⚫ 所属: 株式会社エーピーコミュニケーションズ
⚫ 普段の仕事: Azure×コンテナ中心のインフラ構築（AKSとかContainer Appsとか）
⚫ MICUG クラウドネイティブ/内製開発分科会オーガナイザー
⚫ Platform Engineering Meetup 運営メンバー
⚫ Microsoft MVP (Microsoft Azure) 2023/06～
⚫ 愛知県在住


# Page. 3

![Page Image](https://bcdn.docswell.com/page/4JZVKKD673.jpg)

はじめに: Azureの認証について


# Page. 4

![Page Image](https://bcdn.docswell.com/page/YE65QQ1LJV.jpg)

Azure ADのアカウントには3つの種類がある
⚫ ユーザーアカウント
ユーザーに紐づくアカウント。人が行う操作に利用する。
⚫ サービスプリンシパル
アプリケーション用のアカウント。ID/PW or 証明書を用いて認証する。
⚫ マネージドID
VMなどの Azureリソース に紐づくアカウント。
Azureのプラットフォーム内で認証するため、ID/PWの管理が不要。


# Page. 5

![Page Image](https://bcdn.docswell.com/page/GE5YRR4ME4.jpg)

アプリケーションからAzure ADの認証をする
対応している環境であれば マネージドID を使うのが推奨。
マネージドID が使えない場合のみ サービスプリンシパル を用いる。
※ マネージドID が使えない例:
⚫ オンプレミスや他クラウド上のアプリケーション
⚫ マネージドIDに対応していないAzureサービス


# Page. 6

![Page Image](https://bcdn.docswell.com/page/972GDDVR7R.jpg)

マネージドID の種類
Azureリソースとの紐づけ方によって、以下の2種類が存在する。
⚫ システム割り当てマネージドID
リソースとマネージドIDが1対1で紐づく
⚫ ユーザー割り当てマネージドID
リソースとマネージドIDが多対多で紐づく


# Page. 7

![Page Image](https://bcdn.docswell.com/page/DJYV2235JM.jpg)

AKS(Azure Kubernetes Service) における マネージドID
デフォルトの設定でAKSクラスターを作ると、
コントロールプレーンに紐づくマネージドID と
ノードプールに紐づくマネージドID の2種類が作られる。
⚫ コントロールプレーンのマネージドID (システム割り当て)
ノードの増減やIPアドレスの割り当てなど、
Kubernetesクラスターの動作に必要な操作を行うためのID。
⚫ ワーカーノードのマネージドID (ユーザー割り当て)
ワーカーノードやPodから他のAzureリソースにアクセスするためのID。
用途に応じ複数のマネージドIDを同時に割り当てることもできる。


# Page. 8

![Page Image](https://bcdn.docswell.com/page/V7NM88V4E8.jpg)

マネージドID の利用例
ワーカーノードの
マネージドIDを使って
Azure ADに認証
AKSワーカーノードの
マネージドIDからの
Image Pullを許可


# Page. 9

![Page Image](https://bcdn.docswell.com/page/YJ9NKK64J3.jpg)

Azure AD ワークロードIDの利用シーン


# Page. 10

![Page Image](https://bcdn.docswell.com/page/GJ8KRRZVED.jpg)

こんなときどうする？
Namespace AのPodに対しAzureリソースへのアクセスを許可する。
Namespace BのPodにはAzureリソースへのアクセスを許可しない。
Namespace A
Namespace B


# Page. 11

![Page Image](https://bcdn.docswell.com/page/LJLZKKDR7R.jpg)

Azure AD ワークロードID の利用
従来のマネージドIDでは、AKSクラスター上のすべてのPodに対し
画一的な権限を渡すことになってしまい、
マルチテナントな利用方法には不向きであった。
より細かい単位で権限の割り当てを行うための機構として、
OpenID Connectを利用する Azure AD ワークロードID が誕生した。
2023/04にGA！


# Page. 12

![Page Image](https://bcdn.docswell.com/page/47MV22PP7W.jpg)

認証の仕組み
引用元: Concepts – Azure AD Workload Identity
(https://azure.github.io/azure-workload-identity/docs/concepts.html)


# Page. 13

![Page Image](https://bcdn.docswell.com/page/P7R2MM1YJ9.jpg)

Azure AD ワークロードIDの利用方法


# Page. 14

![Page Image](https://bcdn.docswell.com/page/PJXDVVY4EX.jpg)

手順1
AKSクラスターを作成する際、
--enable-oidc-issuer オプション付きで作成する。
$ az aks create -g $RG_NAME -n $AKS_NAME --enable-oidc-issuer
出力結果にある issuerUrl の値を控えておく。
&quot;oidcIssuerProfile&quot;: {
&quot;enabled&quot;: true,
&quot;issuerUrl&quot;: &quot;https://japaneast.oic.prod-aks.azure.com/hoge/fuga/&quot;
},


# Page. 15

![Page Image](https://bcdn.docswell.com/page/3JKXQQ3PED.jpg)

手順2
ユーザー割り当てマネージドIDを作成する
$ az identity create -n $MANAGEDID_NAME -g $RG_NAME
出力結果にある clientId の値を控えておく。
&quot;clientId&quot;: &quot;abcdefgh-1234-5678-9abc-0123456789ab&quot;,
作成したマネージドIDに、必要なIAMロールを割り当てておく。


# Page. 16

![Page Image](https://bcdn.docswell.com/page/LE35PPG4J5.jpg)

手順3
AKSクラスター上にサービスアカウントを作成する。
その際、annotationsに手順2で作成したマネージドIDのclientIdを指定する。
azure.workload.identity/use: &quot;true&quot; のラベルも必須。
apiVersion: v1
kind: ServiceAccount
metadata:
annotations:
azure.workload.identity/client-id: &lt;マネージドIDのclientId&gt;
labels:
azure.workload.identity/use: &quot;true&quot;
name: &lt;サービスアカウント&gt;
namespace: &lt;Namespace&gt;


# Page. 17

![Page Image](https://bcdn.docswell.com/page/8EDDLL15EG.jpg)

手順4
マネージドIDにフェデレーション資格情報の登録を行う。
手順1で確認した issuerUrl と
手順3で作成した サービスアカウントの情報を利用する。
az identity federated-credential create --name myfederatedIdentity \
--identity-name &quot;${MANAGEDID_NAME}&quot; --resource-group &quot;${RG_NAME}&quot; \
--issuer &quot;&lt;issuerUrl&gt;&quot; \
--subject system:serviceaccount:&quot;&lt;Namespace&gt;&quot;:&quot;&lt;サービスアカウント&gt;&quot;


# Page. 18

![Page Image](https://bcdn.docswell.com/page/V7PX22QDE8.jpg)

手順5
アプリケーションのPodを起動する際、
手順3で作成したサービスアカウントを指定する
apiVersion: v1
kind: Pod
metadata:
name: test-pod
namespace: &lt;Namespace名&gt;
spec:
serviceAccountName: &lt;サービスアカウント&gt;
containers:
- name: hoge
image: hogehoge:latest


# Page. 19

![Page Image](https://bcdn.docswell.com/page/2JVLDD5G7Q.jpg)

アプリケーションからの認証
アプリケーションからは
⚫ Azure Identity SDK
⚫ Microsoft Authentication Library (MSAL)
のどちらかを使って認証を行う。
PythonでAzure Identity SDKを使う場合は以下のように認証を行う。
from azure.identity import DefaultAzureCredential
credential = DefaultAzureCredential()


# Page. 20

![Page Image](https://bcdn.docswell.com/page/5EGXYYPDJL.jpg)

まとめのイメージ図①
OIDC
Provider
②Issue URLにアクセスし要求を検証
①SAのTokenを送り
AADのTokenを要求
Namespace A
③マネージドIDのTokenを返す
④マネージドIDを利用してAzureリソースにアクセス
Namespace B


# Page. 21

![Page Image](https://bcdn.docswell.com/page/4JQ8MM2X7P.jpg)

まとめのイメージ図②
OIDC
Provider
Namespace A
マネージドIDに設定した
フェデレーション情報と不一致の場合は
認証に失敗する
Namespace B


# Page. 22

![Page Image](https://bcdn.docswell.com/page/K742VVL2J1.jpg)

まとめ
⚫ Azureリソースの認証には極力マネージドIDを使おう
⚫ でもAKSのマルチテナント利用を考えると、
クラスタ全体が同じ権限なのは困る
⚫ だから Azure AD ワークロードID を使おう


# Page. 23

![Page Image](https://bcdn.docswell.com/page/LJ1M33LKEG.jpg)

おまけ情報
過去に弊社ブログにも書いたのでこちらも見てね
https://techblog.ap-com.co.jp/entry/2022/12/02/113000


# Page. 24

![Page Image](https://bcdn.docswell.com/page/GJW3PPVPJ2.jpg)

おまけ情報2
Azure AD ワークロードIDは、
KubernetesクラスターがOIDCのIssuerに対応していればよいので、
実は AKS以外でも動く（らしい）
EKS・GKEからAzureリソースにアクセスしたい場合にも
同様の手順で設定できると思う（未検証）
誰か試してみて（他力本願）
参考: Managed Clusters – Azure AD Workload Identity
(https://azure.github.io/azure-workload-identity/docs /installation/managed-clusters.html)


# Page. 25

![Page Image](https://bcdn.docswell.com/page/4EZVKK46J3.jpg)

Enjoy Kubernetes
with Azure !


