Amazon EKS で RBAC の問題をトラブルシューティングする方法を教えてください。
Amazon Elastic Kubernetes Service (Amazon EKS) クラスターを使用するときに、アクセス拒否、無許可、禁止などのエラーのトラブルシューティングを行いたいと考えています。
簡単な説明
AWS Identity and Access Management (IAM) はクラスターに認証を提供し、承認にはネイティブの Kubernetes ロールベースアクセスコントロール (RBAC) を使用します。IAM ユーザーまたはロールが Amazon EKS クラスターを作成すると、IAM エンティティが system:masters アクセス許可で Kubernetes RBAC 認証テーブルに追加されます。
管理者アクセス権を持つユーザーを Amazon EKS クラスターに追加するには、以下の手順を実行します。
- ユーザーが必要なクラスター操作を実行できるように、関連する IAM ユーザーに必要な IAM コンソールアクセス許可を付与します。
- aws-auth ConfigMap を更新して、追加の IAM ユーザーにクラスターロールとロールバインディングを提供します。詳細については、「Amazon EKS クラスターに IAM ユーザーまたはロールを追加する」を参照してください。
注: aws-auth ConfigMap はワイルドカードをサポートしていません。eksctl を使用して ConfigMap を編集するのがベストプラクティスです。入力の形式に誤りがあると、ロックアウトされる可能性があります。
次の kubectl auth can-i コマンドを実行して、RBAC アクセス許可が正しく設定されていることを確認します。
kubectl auth can-i list secrets --namespace dev --as dave
kubectl コマンドを実行すると、認証メカニズムは次の主要なステップを完了します。
- Kubectl は ~/.kube/config からコンテキスト設定を読み取ります。
- .kube/config で定義されているように、AWS コマンドラインインターフェイス (AWS CLI) コマンド aws eks get-token を実行して認証情報を取得します。
- k8s api リクエストが送信され、前述のトークンで署名されます。
注: aws eks get-token で取得したトークンの 15 分の有効期限を変更することはできません。
解決方法
注: AWS コマンドラインインターフェイス (AWS CLI) のコマンド実行中にエラーが発生した場合は、AWS CLI の最新バージョンを使用していることを確認してください。
認証の問題
エラー:「クラスター作成者の IAM ユーザーが削除されているため、クラスターにアクセスできません」
上記のエラーが表示された場合は、クラスターと同じ名前でクラスター作成者の IAM ユーザーを再作成する必要があります。そのためには、クラスター管理者とクラスター作成者の情報を参照してください。
過去 90 日以内にクラスターを作成した場合は、AWS CloudTrail で CreateCluster API 呼び出しを検索できます。クラスター作成者のアクセス許可は system:masters アクセス許可と同じです。system:masters アクセス許可を持つ他のユーザーがいる場合は、クラスターの作成者に依存しません。以前に Amazon EKS クラスターで認証したことがある場合は、Amazon CloudWatch ロググループで以前の認証システムログを確認できます。次の CloudWatch Logs Insights クエリを使用して、クラスター管理者のユーザーとロールの詳細を確認します。
fields @timestamp, @message | sort @timestamp desc | filter @logStream like /authenticator/ | filter @message like "system:masters"
クラスター作成者の IAM ユーザーとロールを再作成するには、以下のコマンドを実行します。
重要: AWS CLI コマンドをすべて確認し、サンプル文字列のインスタンスをすべて必要な値に置き換えてください。例えば、EXAMPLE-USER を自分のユーザー名に置き換えてください。
aws iam create-user --user-name <EXAMPLE-USER>
aws iam create-role --role-name <EXAMPLE-ROLE>
エラー:「存在しないか、信頼できるエンティティが正しくないか、AssumeRole 操作を呼び出すときにエラーが発生したため、想定できませんでした」
上記のエラーが表示された場合は、信頼ポリシーがユーザーに引受アクセス許可を適切に付与していることを確認してください。詳細については、「IAM チュートリアル: AWS アカウント間の IAM ロールを使用したアクセスの委任」を参照してください。
Amazon EKS クラスターをデフォルトでデプロイするローカルユーザーを特定するには、次のコマンドを実行します。
kubectl get clusterroles -l kubernetes.io/bootstrapping=rbac-defaults
API アクションの匿名アクセスをオフにします。匿名ユーザーの subject が name: system:unauthenticated に設定されています。匿名ユーザーを識別するには、以下のコマンドを実行します。
kubectl get clusterrolebindings.rbac.authorization.k8s.io -o json | jq '.items[] | select(.subjects[]?.name=="system:unauthenticated")'
詳細については、Amazon EKS ベストプラクティスガイドを参照してください。
承認に関する問題
エラー:「現在のサーバー API グループリストを取得できませんでした」
前述のエラーをトラブルシューティングするには、「不正アクセスまたはアクセス拒否 (kubectl)」を参照してください。
エラー:「サーバーにログインする必要があります (未承認)」
前述のエラーをトラブルシューティングするには、「「サーバーにログインする必要があります (未承認)」というエラーを解決する方法を教えてください」を参照してください。
エラー:「サーバーにログインする必要があります (サーバーはクライアントに認証情報の提供を求めています)」
前述のエラーは、IAM エンティティを使用して API 呼び出しを行い、IAM エンティティを正しくマッピングしなかった場合に発生します。IAM エンティティをクラスターの aws-auth ConfigMap 内の Amazon EKS ロールにマッピングする必要があります。詳細については、「クラスターへの IAM ユーザーおよびロールアクセスを有効にする」を参照してください。
エラー:「クラスターコントロールプレーンを記述できません: AccessDeniedException」
上記のエラーは、eks:DescribeCluster アクションを実行するアクセス許可のないユーザーとロールで kubeconfig を更新したときに発生します。
エラー:「現在のユーザーまたはロールは、この EKS クラスターの Kubernetes オブジェクトにアクセスできません」
前述のエラーの詳細については、「Amazon EKS の Kubernetes オブジェクトアクセスエラーを解決する」を参照してください。
エラー:「クラスター作成者の IAM を別のユーザー/ロールに変更しています」
クラスターを作成した後は、クラスター作成者の IAM を設定できないため、クラスター作成者の IAM を別のユーザーに変更することはできません。
ネットワークの問題
エラー:「サーバーに接続できません: tcp 172.xx.xx.xx.xx: 443: i/o タイムアウトをダイヤルしてください」
このエラーが表示された場合は、セキュリティグループが送信者の送信元 IP アドレスからのトラフィックを許可していることを確認します。
エラー:「サーバーに接続できません: x509: 証明書は*.example.com、example.com で有効で、https://xxx.gr7.us-east-1.eks.amazonaws.com では有効ではありません」
このエラーが表示された場合は、プロキシ設定が正しいことを確認してください。
KUBECONFIG に関する問題
エラー:「サーバーの localhost:8080 への接続が拒否されました」
上記のエラーは、kubeconfig ファイルが見つからない場合に発生します。kubeconfig ファイルは ~/.kube/config にあり、kubectl にはこのファイルが必要です。このファイルには、クラスター API サーバーに接続するために必要なクラスター認証情報が含まれています。kubectl がこのファイルを見つけられない場合、デフォルトのアドレス (localhost:8080) への接続を試みます。
エラー:「Kubernetes 設定ファイルはグループで読み取り可能です」
上記のエラーは、kubeconfig ファイルのアクセス許可が正しくない場合に発生します。この問題を解決するには、以下のコマンドを実行します。
chmod o-r ~/.kube/config chmod g-r ~/.kube/config
AWS IAM アイデンティティセンター (AWS Single Sign-On の後継) の設定に関する質問
重要: rolearn URL から /aws-reserved/sso.amazonaws.com/ を削除してください。削除しないと、有効なユーザーとして認証することはできません。
IAM アクセス許可ポリシーにユーザーグループを割り当てる
1. IAM アイデンティティセンターコンソールを開きます。
2. [AWS Accounts] (AWS アカウント) タブを選択してから、AWS アカウントを選択してユーザーを割り当てます。
3. [Assign Users] (ユーザーを割り当て) を選択します。
4. ユーザーグループを検索してから、[Next: Permission sets] (次へ: アクセス許可セット) を選択します。
5. [Create new permission set] (新しいアクセス許可セットの作成) を選択してから、[Create a custom permission set] (カスタムアクセス許可セットの作成) を選択します。
6. アクセス許可セットに名前を付けてから、[Create a custom permissions policy] (カスタムアクセス許可ポリシーの作成) チェックボックスをオンにします。
7. 次のアクセス許可ポリシーをコピーして、ウィンドウに貼り付けます。
{ "Version": "2012-10-17", "Statement": [ { "Effect": "Allow", "Action": "sts:AssumeRole", "Resource": "*" } ] }
8. [Create] (作成) を選択します。
Kubernetes RBAC でロールアクセス許可を設定する
Kubernetes RBAC でロールアクセス許可を設定するには、次のマニフェストを使用して RBAC ロールを作成します。
apiVersion: rbac.authorization.k8s.io/v1 kind: Role metadata: name: <example name of the RBAC group> namespace: <example name of namespace> rules: - apiGroups: [""] resources: ["services", "endpoints", "pods", "deployments", "ingress"] verbs: ["get", "list", "watch"]
IAM 認証システムの ConfigMap を変更する
1. 次のコマンドを実行して、目的のユーザーのデータを含む IAM Identity Center ユーザーグループの IAM ロールをキャプチャします。
aws iam list-roles | grep Arn
2. 次の h コマンドを実行して、認証システムの ConfigMap を変更します。
kubectl edit configmap aws-auth --namespace kube-system
3. mapRoles の下の ConfigMap に次の属性を追加します。
- rolearn: <example arn of the AWS SSO IAM role> username: <example preferred username> groups: - <example name of the RBAC group>
重要: rolearn URL から /aws-reserved/sso.amazonaws.com/ を削除してください。削除しないと、有効なユーザーとして認証することはできません。
4. 次のコマンドを実行して、kubeconfig ファイルを更新します。
aws eks update-kubeconfig —-name <example eks cluster> —-region <example region>
5. IAM アイデンティティセンターのユーザー名でログインし、kubectl コマンドを実行します。
関連情報
![AWS公式](/static/images/aws.png)
関連するコンテンツ
- AWS公式更新しました 2年前
- AWS公式更新しました 1年前