2
1

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

EKSでRBACを利用したadminの認証・認可を設定をする

2
Last updated at Posted at 2022-11-01

この記事でわかること

  • EKSでRBACを利用したadminの認証・認可を設定をする で扱う作業の全体像
  • 手順を進める前に確認したい前提
  • 今の環境で試すときに気をつけたい点

はじめに

Amazon EKSでRBACを利用したadminの認可設定をする方法をまとめます。
IAMグループに所属するIAMユーザーに、EKSクラスターの管理者権限でのアクセス許可を付与します。
Mac環境を想定しています。

developerに関してはEKSでRBACを利用したdeveloperの認証・認可を設定をするを参考にしてください。

実行環境の準備

  1. AWS CLIの設定
    AWS CloudFormationを動かすためのAWS CLIの設定を参考にしてください。

  2. EKSクラスタの構築
    Macでeksctlを利用してAmazon EKSのクラスターを構築するを参考にしてください。

  3. EKSのコンテキストの設定
    MacにてAmazon EKSの設定をするを参考にしてください。

IAMロールの作成

  1. IAMロールを作成する
    ※このIAMロールはEKSへのアクセス許可に利用します。
    ※今回はロール名をakane-dev-eks-admin-roleにしています。

    export ACCOUNT_ID=$(aws sts get-caller-identity --output text --query Account)
    ADMIN_ASSUME_ROLE_POLICY=$(echo -n '{
      "Version": "2012-10-17",
      "Statement": [
        {
          "Effect": "Allow",
          "Action": "sts:AssumeRole",
          "Principal": {
              "AWS": "arn:aws:iam::'; echo -n "${ACCOUNT_ID}"; echo -n ':root"
          }
        }
      ]
    }')
    aws iam create-role \
      --role-name akane-dev-eks-admin-role \
      --assume-role-policy-document "${ADMIN_ASSUME_ROLE_POLICY}"
    
  2. IAMロール用のポリシーを作成する
    ※このIAMポリシーはKESのコンテキスト設定時にAWS CLIでaws eks update-kubeconfigが使えるようにします。
    ※今回はポリシー名をakane-dev-eks-admin-role-policyにしています。

    export ACCOUNT_ID=$(aws sts get-caller-identity --output text --query Account)
    ADMIN_ROLE_POLICY=$(echo -n '{
      "Version": "2012-10-17",
      "Statement": [
        {
          "Effect": "Allow",
          "Action": "eks:DescribeCluster",
          "Resource": "arn:aws:eks:*:'; echo -n "${ACCOUNT_ID}"; echo -n ':cluster/*"
        }
      ]
    }')
    aws iam create-policy \
        --policy-name akane-dev-eks-admin-role-policy \
        --policy-document "${ADMIN_ROLE_POLICY}"
    
  3. IAMロール用のポリシーをIAMロールにアタッチする

    export ACCOUNT_ID=$(aws sts get-caller-identity --output text --query Account)
    aws iam attach-role-policy \
      --role-name akane-dev-eks-admin-role \
      --policy-arn arn:aws:iam::${ACCOUNT_ID}:policy/akane-dev-eks-admin-role-policy
    

IAMグループの作成

  1. IAMグループを作成する
    ※今回はロール名をakane-dev-eks-admin-groupにしています。

    aws iam create-group --group-name akane-dev-eks-admin-group
    
  2. IAMグループ用のポリシーを作成する
    ※今回はポリシー名をakane-dev-eks-admin-group-policyにしています。
    ※このポリシーが先ほど作成したIAMロールを委任(AssumeRole)します。

    export ACCOUNT_ID=$(aws sts get-caller-identity --output text --query Account)
    ADMIN_GROUP_POLICY=$(echo -n '{
      "Version": "2012-10-17",
      "Statement": [
        {
          "Effect": "Allow",
          "Action": "sts:AssumeRole",
          "Resource": "arn:aws:iam::'; echo -n "${ACCOUNT_ID}"; echo -n ':role/akane-dev-eks-admin-role"
        }
      ]
    }')
    aws iam create-policy \
        --policy-name akane-dev-eks-admin-group-policy \
        --policy-document "${ADMIN_GROUP_POLICY}"
    
  3. IAMグループ用のポリシーをIAMグループにアタッチする

    export ACCOUNT_ID=$(aws sts get-caller-identity --output text --query Account)
    aws iam attach-group-policy \
      --group-name akane-dev-eks-admin-group \
      --policy-arn arn:aws:iam::${ACCOUNT_ID}:policy/akane-dev-eks-admin-group-policy
    

環境設定

※事前にKubernetesクラスターのコンテキストの設定をします。

  1. aws-auth ConfigMap を更新して、IAM ロールを許可する
    ※クラスター名を設定します。

    export ACCOUNT_ID=$(aws sts get-caller-identity --output text --query Account)
    eksctl create iamidentitymapping \
      --cluster ${クラスター名} \
      --arn arn:aws:iam::${ACCOUNT_ID}:role/akane-dev-eks-admin-role \
      --username dev-akane-admin-user \
      --group system:masters
    
  2. クラスターで管理されているすべての ID のリストを取得する

    eksctl get iamidentitymapping --cluster ${クラスター名}
    

IAMユーザーの作成

  1. IAMユーザーを作成する
    ※今回はユーザー名をeks-akane-developerにしています。

    aws iam create-user --user-name eks-akane-admin
    
  2. IAMユーザーをIAMグループにアタッチする

    aws iam add-user-to-group \
      --user-name eks-akane-admin \
      --group-name akane-dev-eks-admin-group
    
  3. IAMユーザーのアクセスキーを作成する

    aws iam create-access-key --user-name eks-akane-admin | tee /tmp/eks-akane-admin.json
    

AWS CLIのAssumeロールの設定

  1. ~/.aws/config の設定

    export ACCOUNT_ID=$(aws sts get-caller-identity --output text --query Account)
    mkdir -p ~/.aws
    cat << EoF >> ~/.aws/config
    
    [profile eks-akane-admin]
    role_arn=arn:aws:iam::${ACCOUNT_ID}:role/akane-dev-eks-admin-role
    source_profile=eks-akane-admin
    EoF
    
  2. ~/.aws/credentials の設定
    アクセスキーシークレットキーを設定する。
    AWS CloudFormationを動かすためのAWS CLIの設定を参考にしてください。

    cat << EoF >> ~/.aws/credentials
    
    [eks-akane-admin]
    aws_access_key_id=$(jq -r .AccessKey.AccessKeyId /tmp/eks-akane-admin.json)
    aws_secret_access_key=$(jq -r .AccessKey.SecretAccessKey /tmp/eks-akane-admin.json)
    EoF
    
  3. Credentialsを切り替える

    export AWS_PROFILE=eks-akane-admin
    
  4. Credentialsの切り替えを確認する
    ※Arnにassumed-roleと記載される。

    aws sts get-caller-identity
    
  5. コンテキストを切り替える
    ※クラスター名を設定します。

    aws eks update-kubeconfig --region ap-northeast-1 --name ${クラスタ名}
    

adminの権限確認

  1. Namespace default の認可確認
    yes と表示される。

    kubectl auth can-i create deploy
    kubectl auth can-i delete deploy
    

クリーンアップ

  1. Credentialsを切り替える
    プロファイル名を設定する。

    export AWS_PROFILE=${プロファイル名}
    
  2. aws-auth ConfigMap から削除する
    ※クラスター名を設定します。

    export ACCOUNT_ID=$(aws sts get-caller-identity --output text --query Account)
    eksctl delete iamidentitymapping \
      --cluster ${クラスター名} \
      --arn arn:aws:iam::${ACCOUNT_ID}:role/akane-dev-eks-admin-role
    
  3. IAMユーザーをIAMグループからデタッチする

    aws iam remove-user-from-group \
      --user-name eks-akane-admin \
      --group-name akane-dev-eks-admin-group
    
  4. IAMユーザーのアクセスキーを削除する

    aws iam delete-access-key \
      --user-name eks-akane-admin \
      --access-key-id "$(jq -r .AccessKey.AccessKeyId /tmp/eks-akane-admin.json)"
    
  5. IAMユーザーのアクセスキーのファイルを削除する

    rm -f /tmp/eks-akane-admin.json
    
  6. IAMユーザーを削除する

    aws iam delete-user --user-name eks-akane-admin
    
  7. IAMグループ用のポリシーをIAMグループからデタッチする

    export ACCOUNT_ID=$(aws sts get-caller-identity --output text --query Account)
    aws iam detach-group-policy \
      --group-name akane-dev-eks-admin-group \
      --policy-arn "arn:aws:iam::${ACCOUNT_ID}:policy/akane-dev-eks-admin-group-policy"
    
  8. IAMグループ用のポリシーを削除する

    export ACCOUNT_ID=$(aws sts get-caller-identity --output text --query Account)
    aws iam delete-policy \
      --policy-arn arn:aws:iam::${ACCOUNT_ID}:policy/akane-dev-eks-admin-group-policy
    
  9. IAMグループを削除する

    aws iam delete-group --group-name akane-dev-eks-admin-group
    
  10. IAMロール用のポリシーをIAMロールからデタッチする

    export ACCOUNT_ID=$(aws sts get-caller-identity --output text --query Account)
    aws iam detach-role-policy \
      --role-name akane-dev-eks-admin-role \
      --policy-arn arn:aws:iam::${ACCOUNT_ID}:policy/akane-dev-eks-admin-role-policy
    
  11. IAMロール用のポリシーを削除する

    export ACCOUNT_ID=$(aws sts get-caller-identity --output text --query Account)
    aws iam delete-policy \
      --policy-arn arn:aws:iam::${ACCOUNT_ID}:policy/akane-dev-eks-admin-role-policy
    
  12. IAMロールを削除する

    aws iam delete-role \
      --role-name akane-dev-eks-admin-role
    

参考

WHAT IS RBAC?
Using RBAC Authorization
クラスターへの IAM ユーザーおよびロールアクセスを有効にする
Manage IAM users and roles
Identity and Access Management

実務で使うときの確認ポイント

  • Kubernetes、EKS、関連コントローラーのバージョン差分を確認する。
  • kubectl の接続先、namespace、RBAC権限を確認してから実行する。
  • 検証後は不要なリソース、Load Balancer、ログ出力先、権限設定を整理する。
  • 本番反映前に公式ドキュメント、リリースノート、既存クラスタの運用ルールを確認する。

おわりに

ここまで読んでいただきありがとうございました。
Wealthy Designでは、AWS・Webシステム開発・AI活用など、現場で使える技術を大切にしています。

会社の取り組みは、会社サイトにまとめています。
https://wealthy-design.com/

2
1
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
2
1

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?