K8sリソースとしてのIAMロールの管理

(Naveen M)(2020年7月10日)

AWSのKubernetesクラスターにデプロイされたアプリケーションにはAWSリソースを管理およびアクセスするためのIAMロール。 Intuitには、200以上のクラスターと8000以上の名前空間があります。最近まで、IAMロールは集中型アプリケーションのKubernetesリソースとは別に管理されていました。

これは正常に機能していましたが、開発者はアプリケーションをデプロイする前にIAMポリシーを手動で更新する必要がありました。 IAMポリシーの更新に必要な手動の変更により、開発者がIAMポリシーを次のステージング環境にプロモートするときに更新するのを忘れることがあるという許容誤差が生じ、多くの開発者にフラストレーションが生じました。

クラスタ管理サービスから許可する権限を制御しますが、一部のプラットフォームアプリケーションでは、より許容度の高いポリシーを許可するために例外が必要でした。例外をコードに組み込み始めましたが、すぐに、よりスケーラブルなソリューションが必要であることに気付きました。

それが、iam-managerを思いついたときです。 iam-manager は、KubernetesリソースとしてAWSIAMロールを管理するためのk8sCRD(カスタムリソース定義)です。 iam-managerは、 Keiko Project の一部としてオープンソース化されており、アプリケーションがデプロイパイプラインの一部としてIAMロールを安全かつ便利に作成および管理できるようにします(つまり、 kubectl apply)と他のKubernetesリソース。

ロールと権限を作成または変更する他の機能と同様に、セキュリティが最も重要です。 iam-managerは、 AWS IAMパーミッションバウンダリーを他のセーフガードとともに使用して、適切なレベルの可視性と制御を確保します。

AWSIAMパーミッションバウンダリーが再生されましたこれがないと、開発者はIAMRole仕様にIAMアクセス許可を含めることができ、eks:*またはec2:*アクセス許可を持つIAMロールを持つアプリケーションは、クラスター全体を破壊する可能性があるため、セキュリティの面で主要な役割を果たします。 IAMマネージャーによって作成されたロールに委任できるアクセス許可を制御したかったので、アクセス許可の境界は私たちにとって最適な選択です。 AWS IAMパーミッションバウンダリーは、IAMロールポリシーで指定されている内容に関係なくアクセスできる最大の許可/(または拒否)IAMパーミッションのリストを使用して境界を作成できる概念です。つまり、実際の権限は、権限境界とIAMロールポリシーで指定された権限の交差点になります。

IAMロールに「 AdministratorAccess 」ポリシーがある例を見てみましょう。これは、ほぼすべてのアクセス権を持っていることを意味しますが、アクセス境界を添付すると、 s3:Get *アクセスのみがあり(ユーザーは変更できませんが、クラスター管理者のみが変更できます)、そのIAMロールは「管理者」権限を持っていてもs3:Get *のみを実行できます。簡単に言うと、アクセス許可の境界は、iam-managerCRDによって委任できるアクセス許可を制限するために使用されます。詳細については、awsドキュメントの AWSIAMアクセス許可境界を確認してください。

IAMRole仕様にIAMRole仕様がある場合、IAMロールの作成を拒否するWebhookもあります。設定マップを介して設定できるホワイトリストに登録されたポリシーに含まれていないポリシー。 AWS IAMアクセス許可境界は過剰なアクセス許可を処理しますが、ポリシーを非常にクリーンに保つために使用できるため、これは完全にオプションです。

最後になりましたが、iam-manager-controllerポッド自体に割り当てられたIAMロールに細心の注意を払う必要があり、限られたタスクしか実行できないようにIAMアクセス許可ポリシーを慎重に設計しました。つまり、事前定義された権限境界をアタッチせずにIAMロールを作成することはできず、事前定義された名前(つまり、k8s- *)でのみロールを作成でき、事前定義されたTAGを持たないロールを削除することもできません。 (iam-managerによってのみ作成されたロールにTAGを追加しました)。詳細については、iam-manager IAMポリシーを参照してください。

iam-managerをインストールして試すには:

git clone 
[email protected]:keikoproj/iam-manager.git
cd hack#update config map according to your requirements. please refer #
config map for all the configuration options
vim iammanager.keikoproj.io\_iamroles-configmap.yamlexport KUBECONFIG=/Users/myhome/.kube/[email protected]
export AWS\_PROFILE=admin\_123456789012\_account
#./install.sh [cluster\_name] [aws\_region] [aws\_profile]
./install.sh eks-dev2-k8s us-west-2 aws\_profile

簡単な例を次に示します。

apiVersion: iammanager.keikoproj.io/v1alpha1
kind: Iamrole
metadata:
name: iam-manager-iamrole
spec:
# Add fields here
PolicyDocument:
Statement:
-
Effect: "Allow"
Action:
- "s3:Get*"
Resource:
- "arn:aws:s3:::intu-oim*"
Sid: "AllowS3Access"
AssumeRolePolicyDocument:
Version: "2012-10-17"
Statement:
-
Effect: "Allow"
Action: "sts:AssumeRole"
Principal:
AWS:
- "arn:aws:iam::XXXXXXXXXXX:role/20190504-k8s-kiam-role"

送信するには、 kubectl apply -f iam\_role .yaml — ns namespace1

IAMロールを作成し、常に目的の状態を維持することに加えて、アノテーションを追加することでIRSA(サービスアカウントのIAMロール)のロールの作成もサポートします
iam.amazonaws.com/irsa-service-account:<サービスアカウント名>” IAMロール仕様。

apiVersion: iammanager.keikoproj.io/v1alpha1
kind: Iamrole
metadata:
name: iam-manager-iamrole-irsa
annotations:
iam.amazonaws.com/irsa-service-account: aws-sa
spec:
# Add fields here
PolicyDocument:
Statement:
-
Effect: "Allow"
Action:
- "s3:Get*"
Resource:
- "arn:aws:s3:::intu-oim*"
Sid: "AllowS3Access"

要約すると、Kubernetesクラスターにiam-managerを追加すると、クラスター内のAWS IAMロール管理に安全で便利なソリューションが提供されるだけでなく、アプリケーションも可能になります。 チームは、GitOpsを介して他のKubernetesリソースとともにデプロイパイプラインの一部としてIAMロールを作成します。

機能の完全なリストについては、 https://github.com/keikoproj/iam-manager

また、(Ed Lee)、(Kshama Jain)、および他のチームメンバーの貴重な貢献に感謝します。 iam-manager。