EKSのIRSAを理解する
IRSA体験チュートリアル
わかりやすい!
各コンポーネントの役割
↑チュートリアルのワークフロー図がわかりやすい
OIDCプロバイダ
管轄:AWS
役割:EKSクラスタとIAMロール間の認証を橋渡しする(とてもざっくり)
サービスアカウント
管轄:k8s(EKS)
役割:Kubernetesポッドやリソースに特定のIAMロールを紐付ける
IAMロール
管轄:AWS
役割:AWSリソースに対するアクセス権限を提供する
なぜIRSAが必要?
最小特権 – IAM アクセス許可の範囲をサービスアカウントに設定すると、そのサービスアカウントを使用する Pods のみにそのアクセス許可を付与できます。また、この機能により、kiam や kube2iam などのサードパーティーのソリューションが不要になります。
認証情報の分離 – Pod's のコンテナは、そのコンテナが使用するサービスアカウントに関連付けられた IAM ロールの認証情報のみを取得できます。コンテナは、他の Pods のコンテナで使われている認証情報にアクセスすることはできません。サービスアカウントの IAM ロールを使用する場合、Pod's コンテナには Amazon EKS ノード IAM ロール に割り当てられたアクセス許可も付与されます (Amazon EC2 インスタンスメタデータサービス (IMDS) への Pod のアクセスをブロックしていない場合)。詳細については、「ワーカーノードに割り当てられたインスタンスプロファイルへのアクセスを制限する」を参照してください。
監査性 - 遡及的な監査を確実に行うため、AWS CloudTrail を介してアクセスとイベントのロギングを利用できます。
ノードレベルの認証情報(IAMロール)では不必要な権限を与えてしまう可能性があるため
terraformで試す
terraform側
IRSA terraform
resource "aws_iam_openid_connect_provider" "main" {
url = var.eks_issuer
client_id_list = ["sts.amazonaws.com"]
thumbprint_list = ["testtesttesttesttesttesttesttesttesttest"]
}
resource "aws_iam_role" "main" {
name = "s3-test-terraform"
assume_role_policy = jsonencode({
Version = "2012-10-17",
Statement = [
{
Effect = "Allow",
Principal = {
Federated = aws_iam_openid_connect_provider.main.arn
},
Action = "sts:AssumeRoleWithWebIdentity",
Condition = {
StringEquals = {
"${aws_iam_openid_connect_provider.main.url}:aud" = "sts.amazonaws.com",
"${aws_iam_openid_connect_provider.main.url}:sub" = "system:serviceaccount:default:s3-test-terraform"
}
}
}
]
})
}
resource "aws_iam_policy" "main" {
name = "s3-test-terraform"
description = "Example policy for IRSA"
policy = jsonencode({
Version = "2012-10-17",
Statement = [
{
Effect = "Allow",
Action = "s3:*",
Resource = "*"
}
]
})
}
resource "aws_iam_role_policy_attachment" "main" {
role = aws_iam_role.main.name
policy_arn = aws_iam_policy.main.arn
}
k8s(EKS)側
apiVersion: v1
kind: ServiceAccount
metadata:
name: s3-test-terraform
namespace: default
annotations:
eks.amazonaws.com/role-arn: arn:aws:iam::xxxx:role/s3-test-terraform
---
apiVersion: v1
kind: Pod
metadata:
name: eks-iam-test3
namespace: default
spec:
serviceAccountName: s3-test-terraform
containers:
- name: my-aws-cli
image: amazon/aws-cli:latest
command: ['aws', 's3', 'ls']
restartPolicy: Never
実行
s3バケット一覧が出力されればOK
❯ k apply -f irsa-test.yaml
serviceaccount/s3-test-terraform created
pod/eks-iam-test3 created
❯ k logs -f eks-iam-test3
所感
k8s側でSA、AWS側でIAM周りの設定をしなくてはならないため手間
pod identityも試す