전공영역 공부 기록

IRSA가 등장하기 전, 설정했던 방법들

악분 2024. 4. 11. 20:48
반응형

https://youtu.be/J4drta_ImfM

 

IRSA가 등장하기 전에는 쿠버네티스 관리자 또는 개발자가 IRSA와 비슷한 로직을 구현했습니다. 구현 방법은 다양하지만 구현 원리는 아래 범위에서 벗어나지 않습니다.

  • Access key, Secret key를 사용
  • IAM Assume을 사용(권장)
  • AWS EC2 인스턴스 IAM profile 사용

 

이 글에서 실습한 예제는 저의 github에 공개되어 있습니다.

 

1. Access key, Secret key를 사용한 방법(추천하지 않음)

Access key, Secret key 방법은 IAM user의 권한을 사용하는 방법입니다. Access key, Secret key는 만료기간이 없으므로 유출되면 보안사고가 일어나므로 권장하지 않는 방법입니다.

 

쿠버네티스 관리자는 Access key, Secret key를 pod에 설정해야 합니다. 아래 예제는 환경변수를 사용하여 Access key, Secret key를 pod에 주입했습니다.

 

코드에서는 환경변수에 설정된 Access key, Secret key를 읽고 key들을 사용하는 로직이 있어야 합니다.

session = boto3.Session(
      aws_access_key_id=os.environ.get('ACCESS_KEY'),
      aws_secret_access_key=os.environ.get('SECRET_KEY')
    )
s3_client = session.client('s3')

response = s3_client.list_buckets()

 

2. Assume role을 사용

Assume role은 만료시간이 있는 세션을 가지므로 임시자격증명이라고 불립니다. 따라서 영구자격 증명을 갖는 Access key, Secret key보다 보안위험이 낮습니다.

 

쿠버네티스 관리자는 Assume role arn을 pod에 설정해야 합니다. 아래 예제는 환경변수로 Assume role arn을 pod에 주입했습니다.

 

코드에서는 assume role하는 로직이 있어야 합니다.

session = boto3.Session()
sts_client = session.client('sts')
assumed_role = sts_client.assume_role(
    RoleArn=os.environ.get('ASSUME_ROLE_ARN'),
    RoleSessionName='AssumedRoleSession'
)

credentials = assumed_role['Credentials']
s3_client = boto3.client(
  's3',
  aws_access_key_id=credentials['AccessKeyId'],
  aws_secret_access_key=credentials['SecretAccessKey'],
  aws_session_token=credentials['SessionToken']
)

response = s3_client.list_buckets()

 

assume role의 TrustRelationShip설정은 EKS node instance profile arn 또는 AWS 계정 accountID를 설정하면 됩니다. 최소권한을 설정하기 위해 EKS node instnace profile arn 설정이 올바른 방법입니다.

 

3. instnace profile 사용

세 번째 방법은 코드 변경사항 없이 instance profile 즉, EKS node IAM role을 사용하는 방법입니다.

 

Access key&Secret key설정과 Assume role은 직접 코드를 구현해야 합니다. 다루는 서비스가 많아질 수록 코드 변경점이 많아지므로, 이 방법들은 서비스 장애로 발생할 확률이 높습니다.

 

instance profile을 사용하면 코드 변경을 하지 않는 장점이 있지만 보안위험이 증가하는 단점이 있습니다. EKS node에 실행되는 모든 pod가 권한을 갖기 때문입니다.

 

쿠버네티스 관리자는 instance profile에 IAM policy만 설정하면 됩니다.

반응형