본문 바로가기

⭐ Kubernetes & EKS/IRSA (IAM Roles for Service Accounts)

IRSA를 활용하여 Pod에 특정 사용자만 접근 하도록 설정하기

# IRSA (IAM Roles for Service Accounts)를 활용한 pod 접근 권한 관리

- IRSA는 pod에 특정 IAM Accounts를 매핑하여 특정 사용자만이 해당 pod에 접근이 가능하도록 구성하는 작업 이다.

설정은 간단하다 아래의 샘플을 보면 확인이 가능하다.

- IAM Open ID Connect provider를 추가한다.

eksctl utils associate-iam-oidc-provider --region=ap-northeast-2 --cluster={cluster_name} --approve

- 결과

- ServiceAccount를 생성한다. (default 네임스페이스에만 접근가능)

eksctl create iamserviceaccount --cluster={cluster_name} --name={account_id} --attach-policy-arn=arn:aws:iam::aws:policy/AmazonS3FullAccess --approve

- ServiceAccount와 Namespace를 추가 (추가한 네임스페이스 에만 접근가능)

eksctl create iamserviceaccount --cluster={cluster_name} --name={account_id} --namespace={namespace_name} --attach-policy-arn=arn:aws:iam::aws:policy/AmazonS3FullAccess --approve

- 결과

클라우드 포메이션 기반으로 작업이 이루어진다.

- 생성된 서비스 어카운드 확인

# 확인 명령어
kubectl get sa seungkim -o jsonpath="{$.metadata.annotations.eks\.amazonaws\.com/role-arn}"

# 결과
arn:aws:iam::0000000000:role/eksctl-Cluster-addon-iamserviceac-Role1-AAAAAAAAAA

# IAM 롤 및 권한 최종 확인
aws iam list-attached-role-policies --role-name=eksctl-Cluster-addon-iamserviceac-Role1-AAAAAAAAA

# 결과
{
    "AttachedPolicies": [
        {
            "PolicyName": "AmazonS3FullAccess",
            "PolicyArn": "arn:aws:iam::aws:policy/AmazonS3FullAccess"
        }
    ]
}

- irsa-nginx-deployment.yaml

apiVersion: apps/v1
kind: Deployment
metadata:
  name: nginx
  namespace: seungkim
  labels:
    app: nginx
spec:
  replicas: 1
  selector:
    matchLabels:
      app: nginx
  template:
    metadata:
      labels:
        app: nginx
    spec:
      containers:
      - name: nginx
        image: nginx:1.14.2
        ports:
        - containerPort: 80
      serviceAccountName: seungkim
      nodeSelector:
        kubernetes.io/hostname: ip-10-100-00-0.ap-northeast-2.compute.internal

위의 노드셀렉터 옵션은 있어도되고 없어도 된다.

노드 셀렉터 옵션을 넣으면 해당 노드에만 pod가 배포된다.

- 최종 결과 확인

아래의 결과와 같이 seungkim 계정으로는 seungkim 네임스페이스에 생성된 pod에 접근이 가능하고, pod 내부로도 접근이 가능하다.

$ kubectl get pod -n seungkim
NAME                     READY   STATUS    RESTARTS   AGE
nginx-856b88d765-k2jwb   1/1     Running   0          6m25s

- pod 내부로 접근, 접근이 가능한것을 확인 할 수 있다.

$ kubectl exec -it nginx-856b88d765-k2jwb -n seungkim /bin/bash
kubectl exec [POD] [COMMAND] is DEPRECATED and will be removed in a future version. Use kubectl exec [POD] -- [COMMAND] instead.
root@nginx-856b88d765-k2jwb:/# ls -l
total 8
drwxr-xr-x   2 root root 4096 Mar 26  2019 bin
drwxr-xr-x   2 root root    6 Feb  3  2019 boot
drwxr-xr-x   5 root root  360 Jul 28 02:16 dev
drwxr-xr-x   1 root root   19 Jul 28 02:16 etc
drwxr-xr-x   2 root root    6 Feb  3  2019 home
drwxr-xr-x   1 root root   45 Mar 26  2019 lib
drwxr-xr-x   2 root root   34 Mar 26  2019 lib64
drwxr-xr-x   2 root root    6 Mar 26  2019 media
drwxr-xr-x   2 root root    6 Mar 26  2019 mnt
drwxr-xr-x   2 root root    6 Mar 26  2019 opt
dr-xr-xr-x 182 root root    0 Jul 28 02:16 proc
drwx------   1 root root   27 Jul 28 02:19 root
drwxr-xr-x   1 root root   38 Jul 28 02:16 run
drwxr-xr-x   2 root root 4096 Mar 26  2019 sbin
drwxr-xr-x   2 root root    6 Mar 26  2019 srv
dr-xr-xr-x  13 root root    0 Jul 28 02:16 sys
drwxrwxrwt   1 root root    6 Mar 26  2019 tmp
drwxr-xr-x   1 root root   66 Mar 26  2019 usr
drwxr-xr-x   1 root root   19 Mar 26  2019 var

- 다른계정으로 seungkim의 네임스페이스 접근 및 pod 접근

- IAM 계정이 없으면 IAM 계정을 생성한다. 여기서는 test_01로 생성하고 진행, 보안 자격증명도 필요하면 진행

- RBAC에서 role과 role binding을 지정해 줘야함. system:masters는 슈퍼유저 이므로 권한을 줘버리면 안됨. 

결과

$ kubectl get pod -n seungkim
Error from server (Forbidden): pods is forbidden: User "user_01" cannot list resource "pods" in API group "" in the namespace "seungkim"

조회가 안된다.

근데, RBAC랑 차이를 잘 못느끼겠다. 차라리 RBAC를 쓰는게 나아보임.

 

- 끝 -