kube2iamをIAM Role for Service Accountに載せ替えた

この記事は LAPRAS Advent Calendar 2019 の4日目です.

AWS上にkubernetesクラスタを構築していると,Pod内のコンテナから,AWSAPIを叩きたいことがある. そのためにはもちろんAWSの認証を通す必要があり,AWSAccess Tokenとか,IAM Roleを使って認証を通すことになる.

一般的に,productionで運用するEC2の中に,IAM UserのAccess Tokenを置くことは推奨されず,大抵の場合はIAM Roleで解決すると思う.もちろん,kubernetesクラスタであっても,ノードはただのEC2なのでInstance Profileを使えばIAM Roleでの認証は可能になる. しかし,kubernetesクラスタだ.もちろんノードはいっぱいあり,その上で様々なPodが動いている.ということは,ノードのインスタンスからIAM Roleでの認証をする場合,そのRoleは,クラスタ内で動くすべてのPodが要求する権限を保有する必要がある.これはかなり強大な権限を持つRoleになってしまう. おまけに,この状態だと,実はセキュリティ的にAWSへのアクセスを許可しないPodであっても,容易にAWSへの認証を通ってしまうことになる.

こういう状態を避けるために,kube2iamkiamといったOSSが開発されてきた.

で,このkube2iamに結構なバグがあったため,kopsで構築していたkubernetesクラスタに関しては,kiamに載せ替えたことがあった.

h3poteto.hatenablog.com

しかし,kiamはmasterノードにPodを配置する必要があり,masterノードに手を入れられないEKSでは,kiamを使うことができなかった.

これを完全に解決する方法として,今年9月にIAM Role for Service Accountが発表された.

aws.amazon.com

というわけで,EKS運用しているクラスタのIAM認証を,このIRSAに載せ替えた.

IRSAの仕組みについては,上記記事を参照してほしい.ここでは詳しい動作原理については説明しない.

続きを読む

kube2iamからkiamに乗り換えた

AWS上に構築したKubernetesクラスタ内のPodが,AWSのリソースにアクセスしようとしたときには,もちろんAWS IAM Roleか,AWSの認証情報を使ってAWSAPIを叩く必要がある.

しかし,Kubernetesクラスタだ.もちろんノードはいっぱいあるし,その上では様々なPodが動くことになる.そういうときに,ノード全体に強い権限を持ったIAM Roleを付与するのは,あまり嬉しくない. 意図せず別のPodが,アクセスしてほしくないリソースにアクセスできることになってしまう.

というわけで,Podごとに個別にIAM Roleを付与したいという要求があるのだが,それを満たすのがkube2iamkiamというOSSだ.

で,中身の仕組みの話を詳しくここではしないのだが,基本的にkube2iamの方が仕組みが単純である. ただし,たまにバグを拾うことがあって,正しくAWSのCredentialを引けない場合があった.

というわけで今回kiamに移行した.

ちなみにKubernetesクラスタはkopsで構築している. EKSを使っている場合は,つい最近発表されたIAM Role for Service Account を使うと良いと思うよ.

続きを読む