Ssoon
[6주차] EKS Security - IAM Roles for Service Accounts 본문
CloudNet@ 팀의 AWS EKS Workshop Study 6주차 정리입니다.
#EKS Immersion Workshop 의 내용입니다.
IAM 역할 ---(연결)---> Kubernetes 서비스 계정
=> 서비스 계정은 해당 서비스 계정을 사용하는 모든 Pod의 컨테이너에 AWS 권한을 제공
=> 더 이상 Amazon EKS 노드 IAM 역할에 확장 권한을 제공할 필요가 없으므로 해당 노드의 포드가 AWS API를 호출할 수 있습니다.
=> Pod의 컨테이너에 있는 애플리케이션이 인증된 AWS 서비스에 API를 요청할 수 있습니다.
Service Account 에 대한 IAM roles 이 제공하는 이점
- 최소 권한 - 서비스 계정에 대한 IAM 역할 기능을 사용하면 노드의 포드가 AWS API를 호출할 수 있도록 더 이상 노드 IAM 역할에 대한 확장 권한을 제공할 필요가 없습니다.서비스 계정에 대한 IAM 권한의 범위를 지정할 수 있으며 해당 서비스 계정을 사용하는 포드만 해당 권한에 액세스할 수 있습니다.
- 자격 증명 분리 - 컨테이너는 컨테이너가 속한 서비스 계정과 연결된 IAM 역할에 대한 자격 증명만 검색할 수 있습니다.컨테이너는 다른 포드에 속한 다른 컨테이너를 대상으로 하는 인증 정보에 액세스할 수 없습니다.
IRSA 사용
클러스터에 대한 IAM OIDC 공급자
OpenID Connect issuer URL 검색
- EKS cluster 는 OpenID Connect issuer URL 이 연결되어 있으며 이 URL은 IAM OIDC 공급자를 구성할 때 사용됩니다.
aws eks describe-cluster --name eksworkshop-eksctl --query cluster.identity.oidc.issuer --output text
클러스터에 대한 IAM OIDC 공급자 만들기
eksctl utils associate-iam-oidc-provider --cluster myeks --approve
(클러스터에 대해 이 작업을 한 번만 수행)
클러스터에 대해 생성된 OIDC 공급자
IAM 역할 생성 및 IAM 정책 연결
- Pod 의 컨테이너에 부여할 권한을 지정하는 IAM 정책을 생성합니다.
- 모든 S3 버킷에 대한 get 및 list 을 허용하는 "AmazonS3ReadOnlyAccess"라는 AWS 관리형 정책을 사용합니다.
- "AmazonS3ReadOnlyAccess" 정책에 대한 ARN을 찾습니다.
aws iam list-policies --query 'Policies[?PolicyName==`AmazonS3ReadOnlyAccess`].Arn'
- S3에 대한 read-only 액세스 권한을 가진 서비스 계정에 바인딩된 IAM role 을 생성합니다
eksctl create iamserviceaccount \
--name iam-test \
--namespace workshop \
--cluster myeks \
--attach-policy-arn arn\:aws\:iam::aws\:policy/AmazonS3ReadOnlyAccess \
--approve \
--override-existing-serviceaccounts
IAM 역할을 서비스 계정에 연결
IAM role 이 방금 만든 클러스터의 서비스 계정 iam-test에 연결되어 있음을 확인
kubectl describe sa iam-test -n workshop
테스트 성공 사례(목록 S3 버킷)
- 앞서 생성한 서비스 계정이 S3 버킷을 list 할 수 있는지 확인합니다.
- S3 버킷을 생성합니다.
aws s3 mb s3://eksworkshop-$ACCOUNT_ID-$AWS_REGION --region $AWS_REGION
명령 결과를 출력할 job-s3.yaml을 추가합니다.
mkdir IRSA
cat <<EoF> job-s3.yaml
apiVersion: batch/v1
kind: Job
metadata:
name: eks-iam-test-s3
namespace: workshop
spec:
template:
metadata:
labels:
app: eks-iam-test-s3
spec:
serviceAccountName: iam-test
containers:
- name: eks-iam-test
image: amazon/aws-cli:latest
args: ["s3", "ls"]
restartPolicy: Never
EoF
kubectl apply -f ~/environment/irsa/job-s3.yaml
- job-s3.yaml 을 실행하고 작업이 완료되었는지 확인합니다.
kubectl get job -l app=eks-iam-test-s3 -n workshop
- 로그를 확인하여 명령이 성공적으로 실행되었는지 확인합니다.
kubectl logs -l app=eks-iam-test-s3 -n workshop
테스트 실패 사례
- 이제 서비스 계정이 EC2 인스턴스를 list 할 수 없는지 확인합니다.
- 명령 결과를 출력할 job-ec2.yaml을 추가합니다.
- aws ec2 describe-instances --region ${AWS_REGION} => 이 작업은 실패해야 합니다.
cat <<EoF> job-ec2.yaml
apiVersion: batch/v1
kind: Job
metadata:
name: eks-iam-test-ec2
namespace: workshop
spec:
template:
metadata:
labels:
app: eks-iam-test-ec2
spec:
serviceAccountName: iam-test
containers:
- name: eks-iam-test
image: amazon/aws-cli:latest
args: ["ec2", "describe-instances", "--region", "${AWS_REGION}"]
restartPolicy: Never
backoffLimit: 0
EoF
kubectl apply -f ~/environment/irsa/job-ec2.yaml
- job 상태를 확인합니다 (완료되지 않는 것이 정상입니다)
- 로그를 확인합니다.
An error occurred (UnauthorizedOperation) when calling the DescribeInstances operation: You are not authorized to perform this operation.
DescribeInstances 작업을 호출하는 동안 오류가 발생했습니다(UnauthorizedOperation): 이 작업을 수행할 수 있는 권한이 없습니다.
'AWS EKS Workshop Study' 카테고리의 다른 글
[6주차] EKS Security - Real Time Threat Detection with Falco (0) | 2023.06.02 |
---|---|
[6주차] EKS Security - Pod Security Standards (0) | 2023.06.02 |
[6주차] EKS Security - RBAC (2) | 2023.05.31 |
[5주차] EKS Autoscaling - Scaling App and Cluster - USE FIS TO INTERRUPT A SPOT INSTANCE (0) | 2023.05.25 |
[5주차] EKS Autoscaling - Scaling App and Cluster - CONFIGURE HPA (0) | 2023.05.25 |
Comments