aws eks и aws sso проблема аутентификации RBAC

Я создал новую систему единого входа AWS (в качестве источника идентификации использовал внутренний IDP, поэтому Active Directory не использовался).
Я могу войти в AWS CLI, AWS GUI, но не могу выполнять какие-либо операции kubectl.

      error: You must be logged in to the server (Unauthorized)

Я думаю, это как-то связано с RBAC, поскольку я могу получить токен EKS через aws eks get-token.

      ➜ cat ~/.aws/config

[profile team-sso-admin]
sso_start_url=https://team.awsapps.com/start
sso_region=us-west-2
sso_account_id=1111111111
sso_role_name=AdministratorAccess
region=us-west-2
credential_process = aws-vault exec team-sso-admin --json


➜ aws-vault exec team-sso-admin --debug -- zsh --login
➜ env | grep AWS
AWS_VAULT_PROMPT=pass
AWS_VAULT_BACKEND=pass
AWS_VAULT=team-sso-admin
AWS_DEFAULT_REGION=us-west-2
AWS_REGION=us-west-2
AWS_ACCESS_KEY_ID=xxx
AWS_SECRET_ACCESS_KEY=xxx
AWS_SESSION_TOKEN=xxx
AWS_SECURITY_TOKEN=yyy
AWS_SESSION_EXPIRATION=2021-01-11T05:55:51Z
AWS_SDK_LOAD_CONFIG=1

➜ aws sts get-caller-identity --output yaml 

Account: '111111111111'
Arn: arn:aws:sts::111111111111:assumed-role/AWSReservedSSO_AdministratorAccess_6c71da2aa3076dfb/TestUser
UserId: XXX:TestUser

➜ aws eks get-token --cluster-name team-shared-eks --role arn:aws:iam::111111111111:role/aws-reserved/sso.amazonaws.com/us-west-2/AWSReservedSSO_AdministratorAccess_67d1da2aa3076dfb

{"kind": "ExecCredential", "apiVersion": "client.authentication.k8s.io/v1alpha1", "spec": {}, "status": {"expirationTimestamp": "2021-01-11T02:49:11Z", "token": "xxx"}}

kubeconfig

      config

- name: arn:aws:eks:us-west-2:111111111111:cluster/team-shared-eks
  user:
    exec:
      apiVersion: client.authentication.k8s.io/v1alpha1
      args:
      - --region
      - us-west-2
      - eks
      - get-token
      - --cluster-name
      - team-shared-eks
      - --role
      - arn:aws:iam::111111111111:role/aws-reserved/sso.amazonaws.com/us-west-2/AWSReservedSSO_AdministratorAccess_67d1da2aa3076dfb
      command: aws

aws-auth

      mapRoles: |
    - "groups":
      - "system:bootstrappers"
      - "system:nodes"
      "rolearn": "arn:aws:iam::111111111111:role/team-shared-eks20210110051740674200000009"
      "username": "system:node:{{EC2PrivateDNSName}}"
    - "groups":
      - "system:master"
      "rolearn": "arn:aws:iam::111111111111:role/team-saml-devops"
      "username": "team-devops"
    - "groups":
      - "system:master"
      "rolearn": "arn:aws:iam::111111111111:role/aws-reserved/sso.amazonaws.com/us-west-2/AWSReservedSSO_AdministratorAccess_67d1da2aa3076dfb"
      "username": "team-sso-devops"

Привязка кластерной роли для пользователя team-sso-DevOps :

      apiVersion: rbac.authorization.k8s.io/v1
kind: ClusterRoleBinding
metadata:
  creationTimestamp: "2021-01-11T01:37:51Z"
  name: team:sso:devops
roleRef:
  apiGroup: rbac.authorization.k8s.io
  kind: ClusterRole
  name: cluster-admin
subjects:
- apiGroup: rbac.authorization.k8s.io
  kind: User
  name: team-sso-devops
  namespace: default

3 ответа

Решение

Вариант №1 - Попробуйте удалить aws-reserved/sso.amazonaws.com/из role_arn ( источник )

Вариант № 2 - используйте aws-iam-Authenticator , официальная документация предоставляет подробный пример того, как использовать SSO и kubectl (kubeconfig)

клиент проголосовал за другой пост в качестве ответа, но не опубликовал используемую методологию. Для других, кто может столкнуться с этим, я публикую то, что мне нужно для работы по тому же сценарию:

Следующие советы из этого блога :

  1. используйте консоль AWS или аналогичный метод, чтобы проверить роль и получить ее arn
  2. измените предоставленный arn, удалив лишнюю информацию о пути. В моем случае мне пришлось удалить aws-reserved/sso.amazonaws.com/us-west-2/от арн. Цель состоит в том, чтобы сделать arn "читаемым" как традиционную роль arn ex: arn:aws:iam::123456789012:role/RoleName
  3. наконец, обновите роли карты aws-auth, чтобы использовать этот новый arn, а также измените имя пользователя, чтобы оно содержало имя сеанса, например:
      - "groups":
  - "system:masters"
  "rolearn": "arn:aws:iam::123456789012:role/AWSReservedSSO_AWSAdministratorAccess_randomdigits"
  "username": "AWSAdministratorAccess:{{SessionName}}"

Напоминаем, что эта запись mapRoles является дополнением к существующим ролям и не удаляет запись загрузчика.

Надеюсь, это поможет другим!

как упоминал @Meir, нет необходимости обновлять конфигурацию куба,

  1. обновить карту конфигурации aws-authсо следующим: mapRoles: |

    • "группы":
      • "system:masters" "rolearn": "arn:aws:iam::{{AWS_ACCOUNT}}:role/{{AWSSSO_ROLE}}" "username": "admin:{{SessionName}}"
  2. использование временного ключа AWS, секрета и токена сеанса в env

и вы должны быть готовы к работе.

Другие вопросы по тегам