[EKS] 클러스터 권한이 없어서 안보일때
'현재 IAM 보안 주체가 이 클러스터에 있는 Kubernetes 객체에 액세스할 수 없습니다.' 라고 뜨며 클러스터에 접근 안되는 경우가 있다.
우선 클러스터를 생성하면 생성자에게 system:master 권한이 부여 되며
만약 생성자가 EC2 에서 Role을 부여 받고 사용중이라면 Role에 system:master 권한이 부여된다.
현재 자신이 사용하고 있는 ARN이 무엇인지 궁금하다면 아래와 같이 확인하며 해당 ARN에 system:master 권한이 부여 된것이다.
$ aws sts get-caller-identity
EKS 권한 부여 방법은 User 에게 부여 또는 Role에 부여하는 방법 두가지가 있다.
권한은 EKS aws-auth 의 ConfigMap으로 관리하며 ConfigMap에 Role 또는 User를 추가 하면 된다.
Role 을 추가하는 경우는 User가 해당 Role을 받아서 사용하면 되고 User를 추가하는 방식을 이용하면 관리자가 변경 되거나 추가될때마다 ConfigMap에 유저 단위로 추가하면 된다.
실습은 User, Role 모두 해볼 예정이다.
우선 User를 ConfigMap에 추가 해보도록 하자!
우선 클러스터를 처음 생성한 A 사용자에게 system:master 권한이 있으니 A 사용자로 접속하여 B 에게 system:master 권한 부여 해야한다.
A 사용자 콘솔에서 현재 A 사용자 인지 arn 부분 확인 한다.
$ aws sts get-caller-identity
ConfigMap 을 확인하면 MapRoles 에 노드 그룹 관련 역할만 설정 되어 있으며 클러스터 생성자의 system:master 관련 내용은 표기 되지 않는 것으로 보인다.
$ kubectl get cm/aws-auth -n kube-system -o yaml
apiVersion: v1
data:
mapRoles: |
- groups:
- system:bootstrappers
- system:nodes
rolearn: arn:aws:iam::123:role/eksctl-<cluster_name>-nodegroup-manag-NodeInstanceRole-123
username: system:node:{{EC2PrivateDNSName}}
kind: ConfigMap
metadata:
creationTimestamp: "2023-06-23T06:20:49Z"
name: aws-auth
namespace: kube-system
resourceVersion: "515710"
uid: dd-c-aa-ss-ww
여기에 B 사용자를 추가하는 명령어를 호출한다.
$ eksctl create iamidentitymapping \
--cluster <CLUSTER_NAME> \
--region <REGION> \
--arn <ARN> \
--username <USER_NAME> \
--group system:masters
다시 한번 확인하면 B 사용자의 arn이 추가 되었다.
$ kubectl get cm/aws-auth -n kube-system -o yaml
apiVersion: v1
data:
mapRoles: |
- groups:
- system:bootstrappers
- system:nodes
rolearn: arn:aws:iam::123:role/eksctl-<cluster_name>-nodegroup-manag-NodeInstanceRole-123
username: system:node:{{EC2PrivateDNSName}}
mapUsers: |
- groups:
- system:masters
userarn: arn:aws:iam::123:user/B
username: B
kind: ConfigMap
metadata:
creationTimestamp: "2023-06-23T06:20:49Z"
name: aws-auth
namespace: kube-system
resourceVersion: "515710"
uid: dd-c-aa-ss-ww
AWS 콘솔의 EKS 클러스터 정보 보여지는 화면도 정상적으로 접근 되는것을 볼 수 있다.
이제 Role을 통한 관리를 위해 아래 권한 매핑 부분을 제거한다.
$ eksctl delete iamidentitymapping \
> --cluster <CLUSTER_NAME> \
> --region <REGION> \
> --arn arn:aws:iam::123:user/B
우선 olivia-eks-admin 역할을 생성한다.
AWS console > IAM > 역할 생성
위에 입력한 정보는 아래와 같다.
{
"Version": "2012-10-17",
"Statement": [
{
"Effect": "Allow",
"Principal": {
"AWS": "arn:aws:iam::<계정ID>:root"
},
"Action": "sts:AssumeRole"
}
]
}
그 다음 권한을 생성하며 우리가 생성한 클러스터만 관리 할 수 있도록 cluster 만 제한하고
나머지는 any 로 지정한다.
정책 이름을 역할과 동일하게 적고 생성한다.
역할에 가서 생성한 정책을 연결한다.
이제 역할 전환을 해서 사용해보자!
오른쪽 상단 계정 클릭하고 역할 전환을 클릭한다.
계정의 경우에는 계정 ID 또는 계정명 입력하며 역할은 생성한 역할명을 기입하고 역할 전환을 클릭한다.
권한을 부여한 클러스터만 보인다.
또 이전과 같은 오류가 발생하니 해당 Role에 system:master 권한을 부여해보자!
우선 권한 매핑 항목을 보면 system:master가 없는 부분 다시 확인 하였으며
$ eksctl get iamidentitymapping --cluster <CLUSTER_NAME> --region ap-northeast-2
ARN USERNAME GROUPS ACCOUNT
arn:aws:iam::123:role/eksctl-<CLUSTER_NAME>-nodegroup-manag-NodeInstanceRole-123 system:node:{{EC2PrivateDNSName}} system:bootstrappers,system:nodes
권한 매핑을 진행한다.
그 전에 역할에 들어가서 역할의 ARN 을 복사한다.
매핑을 추가한다.
$ eksctl create iamidentitymapping \
--cluster [CLUSTER_NAME] \
--region ap-northeast-2 \
--arn arn:aws:iam::[계정ID]:role/olivia-eks-admin \
--username olivia-eks-admin \
--group system:masters
다시 매핑 항목을 보면 정상적으로 추가되었으며
$ eksctl get iamidentitymapping --cluster <CLUSTER_NAME> --region ap-northeast-2
ARN USERNAME GROUPS ACCOUNT
arn:aws:iam::123:role/eksctl-<CLUSTER_NAME>-nodegroup-manag-NodeInstanceRole-123 system:node:{{EC2PrivateDNSName}} system:bootstrappers,system:nodes
arn:aws:iam::123:role/olivia-eks-admin olivia-eks-admin system:masters
이제 오류 메세지가 안뜬다.
이처럼 클러스터에 매핑된 역할로 전환을 한 사용자만 클러스터 사용가능하도록 할 수 있다.
끝!