mkatを使ってeksクラスタとIAM roleの関係性を可視化しよう

# はじめに
クラスタと他サービスの疎通がうまくいかない時や、新しくIAM roleを適応した時、今のeks クラスタには何のroleが紐づいているんだろうと疑問に思ったことありませんか？
そんな時便利なのがmkatです。
mkatはaws eks クラスタにおけるIAM roleの関係性を可視化することができます。他にもシークレット情報の検出やIMDSアクセスのテストなど色々な機能を提供しているのですが、今回はIAM roleの関係性を可視化する機能にのみ焦点をおきます。気になったらぜひ[GitHubのリポジトリ](https://github.com/DataDog/managed-kubernetes-auditing-toolkit)を見に行ってみてください

# mkatのfind-role-relationshipsコマンドとは
`mkat eks find-role-relationships`は、EKSクラスター内のPod、ServiceAccount、IAMロールの関係性を可視化するためのコマンドです。
このコマンドを実行することで、どのPodがどのServiceAccountを使用し、それがどのIAMロールと紐づいているかを一目で把握することができます。

実際の内部動作は以下のようになっています。

1. EKSクラスターへの接続
2. クラスター情報の取得
3. ServiceAccountの列挙
4. AWSアカウント内のIAMロールの取得
5. IRSA設定の分析
6. Pod Identity設定の分析
7. 結果の表形式での出力

では実際にどのように使うかをみてみましょう。

# 導入手順
## インストール
以下コマンドでインストールを行います。
もしbrewでのインストールが難しい場合には[バイナリファイル](https://github.com/DataDog/managed-kubernetes-auditing-toolkit/releases)を直接使ってください。

```console
brew tap datadog/mkat https://github.com/datadog/managed-kubernetes-auditing-toolkit
brew install datadog/mkat/managed-kubernetes-auditing-toolkit
mkat version
```

## コマンドを使用
下記コマンドで指定したクラスタ名の関係性を出すことができます。

```console
aws eks update-kubeconfig --name <cluster-name>
```

nameを指定しなかった場合、current-contextsを参考に実行されるようです。

```console
aws eks update-kubeconfig
```

結果は以下のように図示されて出てきます。

```
$ mkat eks find-role-relationships
 _ __ ___   | | __   __ _  | |_
 | '_ ` _ \  | |/ /  / _` | | __|
 | | | | | | |   <  | (_| | | |_
 |_| |_| |_| |_|\_\  \__,_|  \__|

2023/11/28 21:05:59 Connected to EKS cluster mkat-cluster
2023/11/28 21:05:59 Retrieving cluster information
2023/11/28 21:06:00 Listing K8s service accounts in all namespaces
2023/11/28 21:06:02 Listing roles in the AWS account
2023/11/28 21:06:03 Found 286 IAM roles in the AWS account
2023/11/28 21:06:03 Analyzing IAM Roles For Service Accounts (IRSA) configuration
2023/11/28 21:06:03 Analyzing Pod Identity configuration of your cluster
2023/11/28 21:06:04 Analyzing namespace microservices which has 1 Pod Identity associations
+------------------+---------------------------+-----------------------------------+-----------------------------+--------------------------------+
| NAMESPACE        | SERVICE ACCOUNT           | POD                               | ASSUMABLE ROLE              | MECHANISM                      |
+------------------+---------------------------+-----------------------------------+-----------------------------+--------------------------------+
| microservices    | inventory-service-sa      | inventory-service                 | inventory-service-role      | IAM Roles for Service Accounts |
|                  |                           |                                   | s3-backup-role              | IAM Roles for Service Accounts |
|                  | rate-limiter-sa           | rate-limiter-1                    | rate-limiter-role           | IAM Roles for Service Accounts |
|                  |                           |                                   | webserver-role              | Pod Identity                   |
|                  |                           | rate-limiter-2                    | rate-limiter-role           | IAM Roles for Service Accounts |
|                  |                           |                                   | webserver-role              | Pod Identity                   |
+------------------+---------------------------+-----------------------------------+-----------------------------+--------------------------------+
| default          | vulnerable-application-sa | vulnerable-application            | vulnerable-application-role | IAM Roles for Service Accounts |
|                  | webserver-sa              | webserver                         | webserver-role              | IAM Roles for Service Accounts |
+------------------+---------------------------+-----------------------------------+-----------------------------+--------------------------------+
| external-secrets | external-secrets-sa       | external-secrets-66cfb84c9b-kldt9 | ExternalSecretsRole         | IAM Roles for Service Accounts |
+------------------+---------------------------+-----------------------------------+-----------------------------+--------------------------------+
```

# おわりに
この機能は権限の確認、設定の検証など手作業で確認するのは少しめんどくさい部分を容易にこなしてくれます。
是非機会があれば活用してみてください。