# 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를 쓰는게 나아보임.
- 끝 -