LoginSignup
1
1

More than 1 year has passed since last update.

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

Last updated at Posted at 2022-11-01

はじめに

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

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

実行環境の準備

  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-developer-roleにしています。

    export ACCOUNT_ID=$(aws sts get-caller-identity --output text --query Account)
    DEV_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-developer-role \
      --assume-role-policy-document "${DEV_ASSUME_ROLE_POLICY}"
    
  2. IAMロール用のポリシーを作成する
    ※このIAMポリシーはKESのコンテキスト設定時にAWS CLIでaws eks update-kubeconfigが利用できるようにします。
    ※今回はポリシー名をakane-dev-eks-developer-role-policyにしています。

    export ACCOUNT_ID=$(aws sts get-caller-identity --output text --query Account)
    DEV_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-developer-role-policy \
        --policy-document "${DEV_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-developer-role \
      --policy-arn arn:aws:iam::${ACCOUNT_ID}:policy/akane-dev-eks-developer-role-policy
    

IAMグループの作成

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

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

    export ACCOUNT_ID=$(aws sts get-caller-identity --output text --query Account)
    DEV_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-developer-role"
        }
      ]
    }')
    aws iam create-policy \
        --policy-name akane-dev-eks-developer-group-policy \
        --policy-document "${DEV_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-developer-group \
      --policy-arn arn:aws:iam::${ACCOUNT_ID}:policy/akane-dev-eks-developer-group-policy
    

環境設定

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

  1. akane-namespace.yaml を作成する

    akane-namespace.yaml
    apiVersion: v1
    kind: Namespace
    metadata:
      name: akane
    
  2. akane-developer-role.yamlを作成する

    akane-developer-role.yaml
    kind: Role
    apiVersion: rbac.authorization.k8s.io/v1
    metadata:
      name: dev-akane-developer-role
      namespace: akane
    rules:
      - apiGroups:
          - ""
          - "apps"
          - "batch"
          - "extensions"
        resources:
          - "configmaps"
          - "cronjobs"
          - "deployments"
          - "events"
          - "ingresses"
          - "jobs"
          - "pods"
          - "pods/attach"
          - "pods/exec"
          - "pods/log"
          - "pods/portforward"
          - "secrets"
          - "services"
        verbs:
          - "create"
          - "delete"
          - "describe"
          - "get"
          - "list"
          - "patch"
          - "update"
    
  3. akane-role-developer-binding.yaml を作成する

    akane-role-developer-binding.yaml
    kind: RoleBinding
    apiVersion: rbac.authorization.k8s.io/v1
    metadata:
      name: dev-akane-developer-role-binding
      namespace: akane
    subjects:
    - kind: User
      name: dev-akane-developer-user
    roleRef:
      kind: Role
      name: dev-akane-developer-role
      apiGroup: rbac.authorization.k8s.io
    
  4. クラスターに適用する

    kubectl apply -f akane-namespace.yaml
    kubectl apply -f akane-developer-role.yaml
    kubectl apply -f akane-developer-role-binding.yaml
    
  5. 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-developer-role \
      --username dev-akane-developer-user
    
  6. クラスターで管理されているすべての ID のリストを取得する

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

IAMユーザーの作成

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

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

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

    aws iam create-access-key --user-name eks-akane-developer | tee /tmp/eks-akane-developer.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-developer]
    role_arn=arn:aws:iam::${ACCOUNT_ID}:role/akane-dev-eks-developer-role
    source_profile=eks-akane-developer
    EoF
    
  2. ~/.aws/credentials の設定
    アクセスキーシークレットキーを設定する。
    AWS CloudFormationを動かすためのAWS CLIの設定を参考にしてください。

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

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

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

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

developerの権限確認

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

    kubectl auth can-i create deploy -n akane
    kubectl auth can-i delete deploy -n akane
    
  2. Namespace default の認可確認
    no と表示される。

    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-developer-role
    
  3. クラスターから削除する

    kubectl delete -f akane-developer-role-binding.yaml
    kubectl delete -f akane-developer-role.yaml
    kubectl delete -f akane-namespace.yaml
    
  4. IAMユーザーをIAMグループからデタッチする

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

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

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

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

    export ACCOUNT_ID=$(aws sts get-caller-identity --output text --query Account)
    aws iam detach-group-policy \
      --group-name akane-dev-eks-developer-group \
      --policy-arn "arn:aws:iam::${ACCOUNT_ID}:policy/akane-dev-eks-developer-group-policy"
    
  9. 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-developer-group-policy
    
  10. IAMグループを削除する
    ※今回はロール名をakane-dev-eks-developer-groupにしています。

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

    export ACCOUNT_ID=$(aws sts get-caller-identity --output text --query Account)
    aws iam detach-role-policy \
      --role-name akane-dev-eks-developer-role \
      --policy-arn arn:aws:iam::${ACCOUNT_ID}:policy/akane-dev-eks-developer-role-policy
    
  12. 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-developer-role-policy
    
  13. IAMロールを削除する

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

参考

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

1
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
1
1