Tagbangers Blog

aws-auth(configmap)にSSOのrolearnを足す際の注意点!

今回は、EKSクラスターを操作する権限を付与する際に編集するConfigMapである、

aws-authの設定に関する注意点を共有したいと思います!

本題に入る前に、いくつか前提となる知識の説明です。

※EKSのversion

$ aws eks describe-cluster --name cluster-name --region ap-northeast-1 | jq '.cluster["version"]' -r
1.15

ConfigMapについて

A ConfigMap is an API object used to store non-confidential data in key-value pairs.

A ConfigMap allows you to decouple environment-specific configuration from your container images, so that your applications are easily portable.

k8sのドキュメントにあるように、設定情報をKey-Valueで保持するk8sのリソースで、

環境固有の設定をコンテナイメージから分離する際に使用するものです。

※機密情報を保持するリソースとしてはSecretsを使用する

以下は今回編集したConfigMap(aws-auth)の参考例ですが、Key-Valueで設定情報が保存されていることがわかります。

$ kubectl get configmaps aws-auth -n kube-system -o json
{
  "apiVersion": "v1",
  "data": {
    "mapRoles": "- groups:\n  - system:bootstrappers\n  - system:nodes\n  - system:node-proxier\n  rolearn: arn:aws:iam::AccountID:role/eks-fargate-profile\n  username: system:node:{{SessionName}}\n- groups:\n  - system:masters\n  rolearn: arn:aws:iam::AccountID:role/AWSReservedSSO_dev_aaaaaaaaaaaaaaaa\n"
  },
  "kind": "ConfigMap",
  "metadata": {
    "annotations": {
      "kubectl.kubernetes.io/last-applied-configuration": "{\"apiVersion\":\"v1\",\"data\":{\"mapRoles\":\"- groups:\\n  - system:bootstrappers\\n  - system:nodes\\n  - system:node-proxier\\n  rolearn: arn:aws:iam::AccountID:role/eks-fargate-profile\\n  username: system:node:{{SessionName}}\\n\"},\"kind\":\"ConfigMap\",\"metadata\":{\"annotations\":{},\"name\":\"aws-auth\",\"namespace\":\"kube-system\"}}\n"
    },
    "creationTimestamp": "2020-03-06T06:51:27Z",
    "name": "aws-auth",
    "namespace": "kube-system",
    "resourceVersion": "17745138",
    "selfLink": "/api/v1/namespaces/kube-system/configmaps/aws-auth",
    "uid": "e6cfe172-5f76-11ea-bbbb-aaaaaaaaaaaa"
  }
}


aws-authについて

EKSクラスターを操作する権限を追加する際に編集する必要のある、Configmapです。

公式ドキュメント「クラスターのユーザーまたは IAM ロールの管理」によると、

作成時の IAM エンティティユーザーまたはロールは、クラスターの RBAC 設定で system:masters のアクセス許可が自動的に付与されているようです。

つまり、EKSクラスター作成者以外に権限を付与する際に、aws-authの設定を追加する必要があるということです。

ここでaws-authの中身を確認してみます。

jqコマンドを使ってKeyを指定して出力を絞ってみます。

$ kubectl get configmaps aws-auth -n kube-system -o json | jq '.data[
    "mapRoles"
]' -r
- groups:
  - system:bootstrappers
  - system:nodes
  - system:node-proxier
  rolearn: arn:aws:iam: : AccountID:role/eks-fargate-profile
  username: system:node: {
    {SessionName
    }
}
- groups:
  - system:masters
  rolearn: arn:aws:iam: : AccountID:role/AWSReservedSSO_dev_aaaaaaaaaaaaaaaa
  username: system:node: {
    {SessionName
    }
}

k8sがJSONPathでの出力をサポートしている のでjqを使わなくても以下のようにもKeyを指定して絞れる

$ kubectl get configmaps aws-auth -n kube-system -o jsonpath='{.data..mapRoles}'

この確認コマンドと出力から読み解けるポイントが2点あります。

1つ目は、aws-authはkube-system(Namespaces)上に作成されていることです。

kube-system The namespace for objects created by the Kubernetes system

k8sのドキュメントにあるように、EKS構築時にシステムをデプロイするために作成されたものです。

つまり、このリソースの設定を無効なものにしてしまうと、EKSクラスタ全体が動作しなくなる危険性があるということです。

aws-authに限らず、kube-systemにあるリソースを触る時は本当に慎重に作業するべきです。

システムが稼働してからは触らないようなオペレーションにするのが1番なので、

作成者以外に権限をつける必要がある時は、EKSクラスタ作成直後に編集することをお勧めします!

2つ目は、Keyで絞ったmapRolesのValueにあるように、AWSリソースのEKSクラスタに対する権限が記載されていることです。

Fargate起動タイプでクラスタ構築後の状態だと、fargate-profileのみがマッピングされていると思います。

- groups:
  - system:bootstrappers
  - system:nodes
  - system:node-proxier
  rolearn: arn:aws:iam: : AccountID:role/eks-fargate-profile
  username: system:node: {
    {SessionName
    }
}


aws-auth(configmap)にSSOのrolearnを足す際の注意点!

前提知識の説明が長くなってしまいましたが、やっと本題です。

今回、公式ドキュメント1公式ドキュメント2を参考にSSOのroleをEKSクラスターを操作する権限を追加する作業を行いました。

まず、追加したいSSOのRole ARNをManagement consoleで確認すると、以下のような形式でした。

arn:aws:iam: : 871573853082:role/aws-reserved/sso.amazonaws.com/AWSReservedSSO_dev_aaaaaaaaaaaaaaaa

ここで注意点なのですが、標準のRole ARN形式のままaws-authのmapRolesに追加しても有効な設定として入りません

AWSサポートにも確認したところ、パスを抜いた形で設定する必要があるとのことでした。※GitHub Issuse

kubectl edit -n kube-system configmap/aws-auth

を実行すると、viの編集画面になるので、

# Please edit the object below. Lines beginning with a '#' will be ignored,
# and an empty file will abort the edit. If an error occurs while saving this file will be
# reopened with the relevant failures.
#
apiVersion: v1
data:
  mapRoles: |
    - groups:
      - system:bootstrappers
      - system:nodes
      - system:node-proxier
      rolearn: arn:aws:iam: : AccountID:role/eks-fargate-profile
      username: system:node: {{SessionName}}
    - groups:
      - system:masters
      rolearn: arn:aws:iam: : AccountID:role/AWSReservedSSO_dev_aaaaaaaaaaaaaaaa
      username: system:node: {{SessionName}}

上記のように、groupsのフィールドを追加して、適切なRBACを追加してください。

くれぐれも、fargate-profileの箇所は書き換えないように!

書き換えてしまうとk8sのリソースとAWSのリソースの連携ができないようになり、podの起動や作成が一切できなくなります。

※RBACが無効になった際に、podをdescribeした時のログ

Misconfigured Fargate Profile: fargate profile eks-fargate-profile blocke│
│d for new launches due to: Pod execution role is not found in auth config or does not have all required permissions for launching fargate pods.

まとめ

  • aws-authへrolearnを追加する時は、パスを取り除く
  • aws-authに記載されているfargate-profileを書き換えないように注意する
  • 可能な限り、kube-systemにあるリソースをリリース後は触らないようなオペレーションを意識する