카테고리 없음

[k8s] EKS IRSA, OIDC 이해

daniel_lab 2024. 3. 13. 17:07

temporary security credential을 요청하기위해 AWS Security Token Service(STS)의 API 를 이용할 수 있다.

temporary security credentials는 long-term access key credentials와 사실상 동일하게 동작한다. 하지만 만료시간이 존재하며, long-term AWS security credential 을 앱이나 웹에 직접 embed하는데 보안상 위험이 있기에 해당 방식을 사용해 AWS API를 이용하는것이 강력하게 권고되고 있다.

temporary security credential을 받을 수 있는 방법은 OIDC provider를 생성하여 인증토큰을 받은 후 sts쪽에 AssumeRoleWithWebIdentity api를 호출하는 것이다.
AssumeRoleWithWebIdentity API는 public identity provider를 통해 인증된 federated user를 위해 temporary security credential을 반환한다. public identity provider는 login with amazon, facebook, google 혹은 OpenID Connect(OIDC) compatible 한 identity provider이면 누구든 상관없다. 이 API는 모바일 어플리케이션이나 client-based web application 인데 AWS에 access해야하는 류의 상황들에 적합하다. EKS에서는... 아래의 준비 과정이 필요하다.

  1. OIDC provider를 생성한다
  2. EKS 내부의 service account가 사용해야할 IAM Role을 만들고 아래와 같이 1번의 OIDC provider를 federated url 로 등록하고, condition에서 service account 이름을 등록해준다
    {  
     "Version": "2012-10-17",  
     "Statement": \[  
         {  
             "Effect": "Allow",  
             "Principal": {  
                 "Federated": "arn:aws:iam::431124633566:oidc-provider/oidc.eks.us-east-2.amazonaws.com/id/647E20ED981FF7DDBB56B6E7C5DC088F"  
             },  
             "Action": "sts:AssumeRoleWithWebIdentity",  
             "Condition": {  
                 "StringEquals": {  
                     "oidc.eks.us-east-2.amazonaws.com/id/647E20ED981FF7DDBB56B6E7C5DC088F:sub": "system:serviceaccount:kube-system:ebs-csi-controller-sa",  
                     "oidc.eks.us-east-2.amazonaws.com/id/647E20ED981FF7DDBB56B6E7C5DC088F:aud": "sts.amazonaws.com"  
                 }  
             }  
         }  
     \]  
    }

AssumeRoleWithWebIdentity API 호출시 필요한 파라미터는 아래와 같다

  1. the amazon resource name of the role that the app should assume
  2. the token that the app gets from the IdP after the app authenticates the user

응답내용은 아래와 같다
- temporary access key id
- temporary secret access key

즉, EKS에서는 OIDC provider가 준 토큰을 가지고 sts.amazonaws.com에 AssumeRoleWithWebIdentity API을 호출하여 temporary access key 를 가져오고, 이것으로 iam role 을 행사하며 aws api 진행하는 것이다.

(temporary credential은 identity federation 상황에서 주로 사용된다
IAM은 2가지 타입의 identity federation을 지원한다. 두 case모두에서 identity는 AWS외부에 저장된다. 차이는 external system이 어디에 있느냐이다. 그중 한가지 방식인 aws sts web identity federation 은 OpenID Connect 2.0 compatible 한 provider 라면 무엇이든 연동 가능하다. 예를들어 login with amazon, facebook, google 등이 있다)

참고

Diving into IAM Roles for Service Accounts
https://aws.amazon.com/ko/blogs/containers/diving-into-iam-roles-for-service-accounts/

[AWS] EKS 운영시 IRSA 와 OIDC 에 대한 이해
https://velog.io/@jihwankim94/AWS-EKS-%EC%9A%B4%EC%98%81%EC%8B%9C-IRSA-%EC%99%80-OIDC-%EC%97%90-%EB%8C%80%ED%95%9C-%EC%9D%B4%ED%95%B4

https://docs.aws.amazon.com/IAM/latest/UserGuide/id_credentials_temp_request.html

assume-role-with-web-identity
https://docs.aws.amazon.com/cli/latest/reference/sts/assume-role-with-web-identity.html

Requesting temporary security credentials
https://docs.aws.amazon.com/IAM/latest/UserGuide/id_credentials_temp_request.html

Temporary security credentials in IAM
https://docs.aws.amazon.com/IAM/latest/UserGuide/id_credentials_temp.html

amazon-eks-pod-identity-webhook
https://github.com/aws/amazon-eks-pod-identity-webhook