데보션앱 소개페이지 바로가기
로그인 선택

신고하기

CLOSE
신고사유 (대표 사유 1개)
상세내용 (선택)
0/200
  • 신고한 게시글은 더 이상 보이지 않습니다.
  • 이용약관과 운영정책에 따라 신고사유에 해당하는지 검토 후 조치됩니다.
  • 허위 신고인 경우, 신고자의 서비스 이용이 제한될 수 있으니 유의하시어 신중하게 신고해 주세요.
(이 회원이 작성한 모든 댓글과 커뮤니티 게시물이 보이지 않고, 알림도 오지 않습니다.)

미리보기

커뮤니티

      1,234

      badge 23.06.15

      글 등록

      카테고리를 선택해주세요.

      DEVOTEE를 활성화 시키면
      지금 작성한 커뮤니티 글에 대해 1개의 댓글을 달아줍니다.

      버튼을 누르면 글 수정 시 ChatGPT가 작성한 댓글이 수정됩니다.

      임시저장함에 저장되었습니다. 저장일시 : 2022.5.17 14:29:08

      임시저장함

      제목을 선택하시면 이어서 작성이 가능하며,
      최대 20건까지 저장합니다.
      컨텐츠 유형, 제목, 저장일시, 삭제로 이뤄진 임시저장 목록
      컨텐츠 유형 제목 저장일 삭제

      데보션 블로그 게재 요청

      CLOSE
      • *
      • *

      본인인증

      효율적인 데보션 서비스 이용 및
      고객님의 소중한 개인정보보호를 위해
      본인인증을 진행해주세요. 본인인증 미 진행 시 로그인이 제한됩니다.
      본인인증 실패

      본인인증 로그인에 실패하였습니다.
      회원이 아니시거나 본인인증 등록이
      완료되지 않은 사용자입니다.

      회원정보 연결

      AWS 정책변수 기반 사용자 리소스 별 IAM Policy 설계하기

      zero 24.06.13
      1,373 6 0
      DEVOTEE 요약
      IAM(Identity and Access Management)은 AWS 리소스에 대한 접근을 안전하게 제어할 수 있도록 돕는 서비스입니다. 특정 사용자가 자신만의 리소스에만 접근 권한을 가지도록 IAM 정책변수를 활용하여 S3 버킷과 Athena Workgroup의 접근 권한을 분리할 수 있습니다. 예를 들어, S3 버킷과 Athena Workgroup에 각 사용자별 디렉토리와 태그를 설정하고, IAM 정책을 통해 그 사용자만 해당 리소스에 접근할 수 있도록 제어할 수 있습니다.
      DEVOTEE 추천 블로그

      IAM

      Identity and Access Management(IAM)은 AWS 리소스에 대한 액세스를 안전하게 제어할 수 있는 웹 서비스입니다.

      AWS 웹콘솔에 접근하는 사용자들의 경우, IAM User를 발급 받아 직접 로그인을 하거나,

      IAM Identity Center에서 AD와 연동하여 사용자 별 IAM Role(Permission Set)을 임시로 할당 받아 SSO로 로그인 합니다.


      AWS Managed Service (Athena, Sagemaker, S3 ...)

      Athena, Sagemaker, S3 등 AWS 웹콘솔을 통한 매니지드 서비스를 사용자들에게 제공하는 경우,

      일반적으로 개인 별 WorkGroup, 개인 별 Domain, 개인 별 디렉토리 환경을 구성하여 접근하도록 합니다.


      이러한 구성을 할 때 사용자 별 권한 분리를 명확하게 하지 않을 경우, 리소스 안전성이 보장되지 않고 비용에 대한 추적도 어려워집니다.

      (예를 들어 A라는 사용자가 B의 Athena WorkGroup에서 쿼리를 날리면 안되겠죠?)


      때문에 사용자 별 개인용 리소스에 대한 접근 권한 분리를 해주어야 하는데요,

      사용자가 두 명밖에 없다면 두 개의 IAM Policy를 만들어서 각각의 사용자에게 부여하면 되겠지만,

      사용자가 많아질 경우 사용자 수 만큼 IAM Policy를 늘리기엔 관리가 힘들어집니다.


      하여 AWS 정책변수를 활용하여 각 사용자 리소스 별 IAM Policy를 설계하는 방법을 공유 드리고자 합니다.


      1. 리소스 이름 기반으로 권한 분리하기 (S3)

      image.png

      image.png

      위와 같이 zero-user-bucket 이라는 S3 버킷 아래에 user1, user2 디렉토리를 만들어 두었습니다.

      그리고 user1이라는 IAM User를 생성하여, s3-policy-test라는 IAM Policy를 할당하였습니다.

      s3-policy-test의 내용은 아래와 같습니다.

      {
          "Version": "2012-10-17",
          "Statement": [
              {
                  "Effect": "Allow",
                  "Action": [
                      "s3:ListAllMyBuckets"
                  ],
                  "Resource": [
                      "*"
                  ]
              },
              {
                  "Effect": "Allow",
                  "Action": [
                      "s3:ListBucket"
                  ],
                  "Resource": [
                      "arn:aws:s3:::zero-user-bucket"
                  ],
                  "Condition": {
                      "StringLike": {
                          "s3:prefix": [
                              "",
                              "${aws:username}",
                              "${aws:username}/*"
                          ]
                      }
                  }
              },
              {
                  "Effect": "Allow",
                  "Action": [
                      "s3:*"
                  ],
                  "Resource": [
                      "arn:aws:s3:::zero-user-bucket/${aws:username}",
                      "arn:aws:s3:::zero-user-bucket/${aws:username}/*"
                  ]
              }
          ]
      }

      {aws:username}라는 정책변수는, 접근한 IAM User의 이름을 반환해 줍니다.

      우리는 user1 이라는 디렉토리를 만들었기 때문에, 위 권한을 통해 user1 IAM User는 자신의 이름과 동일한 user1 디렉토리에만 접근 권한을 갖고, user2 디렉토리는 접근할 수 없도록 policy를 설계하였습니다.

      그럼 접근 테스트를 해보겠습니다.

      image.png

      -> user1 디렉토리는 정상적으로 접근이 됩니다.

      image.png

      -> user2 디렉토리는 접근이 되지 않습니다.


      이로써 원하는 대로 설계한 policy가 리소스 이름에 따라 권한이 부여됨을 확인할 수 있었습니다.


      2. 리소스 태그 기반으로 권한 분리하기 (Athena)

      이번엔 Athena Workgroup에 대해 Tag 기반으로 접근 권한을 부여해 보겠습니다.

       

      image.png

      위와 같이 2개의 Athena Workgroup을 만들어 두었습니다.

      그리고 각각의 Workgroup에는 해당 Workgroup 소유자에 대한 Tag 정보를 기입하였습니다.

       

      < user1-workgroup >

      image.png

      < user2-workgroup >

      image.png


      그리고 user1 IAM User에서 태그 기반 Athena 접근을 하기 위해 아래와 같이 athena-policy-test라는 IAM Policy를 추가 할당하였습니다.

      내용은 아래와 같습니다.

      image.png

      {
          "Version": "2012-10-17",
          "Statement": [
              {
                  "Effect": "Allow",
                  "Action": [
                      "s3:*"
                  ],
                  "Resource": [
                      "*"
                  ],
                  "Condition": {
                      "ForAnyValue:StringEquals": {
                          "aws:CalledVia": [
                              "athena.amazonaws.com"
                          ]
                      }
                  }
              },
              {
                  "Effect": "Allow",
                  "Action": [
                      "glue:*"
                  ],
                  "Resource": [
                      "*"
                  ]
              },
              {
                  "Effect": "Allow",
                  "Action": [
                      "athena:*"
                  ],
                  "Resource": [
                      "*"
                  ],
                  "Condition": {
                      "StringEquals": {
                          "aws:ResourceTag/owner": "${aws:username}"
                      }
                  }
              }
          ]
      }

      위 내용을 보면, Resource Tag의 'owner' 키의 값이 {aws:username}과 일치하는 리소스에 대해서만 athena 권한을 획득할 수 있도록 하였습니다.

      이제 테스트를 해보겠습니다.

      image.png

      -> user1-workgroup에서는 테이블 생성 쿼리가 정상적으로 수행됩니다.


      image.png

      -> user2-workgroup에서는 athena:GetWorkGroup 권한을 획득하지 못하여 에러가 발생합니다.


      이로써 정상적으로 Tag 기반 사용자 별 리소스 권한 부여가 적용되었음을 확인할 수 있었습니다.


      (번외) IAM User가 아닌 SSO 사용자의 경우?

      AWS 공식 문서를 보면, 아래와 같이 IAM User가 아닌 Federation 혹은 Assume Role 사용자는 {aws:username} 정책변수가 존재하지 않습니다.

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


      이러한 경우에는 {aws:userid}라는 정책변수를 사용해 주면 됩니다.


      userid 값은 아래와 같이 AWS STS CLI를 통해 얻어낼 수 있습니다.

      (제가 확인한 바로는 웹콘솔 상에서는 해당 값을 확인할 수 없는 것 같았습니다.)

      image.png

      댓글 0

      DEVOTEE를 활성화 시키면
      지금 작성한 댓글에 AI가 댓글을 달아줍니다.

      zero 님의 최신 블로그

      더보기

      DEVOTEE 추천 블로그

      동영상 기고하기