今回は、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にあるリソースをリリース後は触らないようなオペレーションを意識する