ConsoleMe 적용해보기

Joo Hee Paige Kim
더핑크퐁컴퍼니 기술 블로그
11 min readApr 12, 2022

--

2022.04.12

English Version

안녕하세요, The Pinkfong Company에서 프론트엔드 개발을 하고 있는 페이지입니다. ConsoleMe라는 웹서비스를 도입하는 과정에서 제가 얻게 된 지식과 팁을 공유하고자 합니다.

저희 회사는 서비스 규모와 개발 부서가 점점 더 크게 성장하면서 각 개발자들의 접근 권한과 역할을 잘 관리할 수 있는 프로그램 도입이 필요해졌습니다. 현재는 각 개발자들이 Amazon Web Service(AWS)에 필요 이상의 접근 권한을 가지고 있기 때문입니다.

ConsoleMe 는 엔드 유저 및 클라우드 관계자들이 AWS IAM 권한 및 자격 증명을 보다 쉽게 관리할 수 있는 웹 서비스로, 저희에게 적합한 솔루션인 것 같아 사용해보기로 했습니다.

ConsoleMe를 사용하면 다음과 같은 이점이 있습니다.

  • 여러 계정의 관리를 단일 웹 인터페이스로 통합합니다.
  • 엔드 유저 및 관리자가 인증 수준에 따라 온보드 계정에 대한 자격 증명 및 콘솔 액세스를 얻을 수 있습니다.
  • 엔드 유저 및 관리자가 IAM 역할, S3 buckets, SQS queues, SNS topics 등에 대한 권한을 요청하고 관리할 수 있는 메커니즘을 제공합니다.
  • 사용자가 높은 수준의 의도를 표현하고 자신에게 맞는 권한을 요청할 수 있는 강력한 셀프 서비스 기능이 있습니다.

ConsoleMe는 두 가지 방식으로 설치가 가능합니다.

Docker, Local.

이번 포스트에서는 ConsoleMe의 로컬 설치 방법에 대해 작성하겠습니다.

  • 루트 액세스 가 가능한 Ubuntu 19.04+를 실행할 수 있는 서버
  • 2GB의 디스크 공간의 스토리지
  • 적절한 권한이 있는 ConsoleMe 서비스용 AWS 사용자/역할

먼저 IAM 사용자를 이용하고, 나중에 IAM 역할로 전환할 수 있습니다. Curtis는 IAM 역할을 사용하는 것이 가장 좋은 방법이라고 추천하였습니다.

  1. 필요한 모든 디펜더시와 관련 소프트웨어/툴을 설치합니다.

2. ConsoleMe 레포지토리를 클론합니다.

저희는 /home/service/consoleme디렉토리에 ConsoleMe를 설치하였습니다. 다른 위치에 설치하려면, 관련 코드를 수정해야 합니다.

vi /home/service/consoleme

3. Redis와 DynamoDB 컨테이너를 시작합니다.

  • 도커 컨테이너가 작동하는 것을 확인할 수 있습니다.

cd /home/service/consoleme

4. AWS 자격 증명을 합니다.

  • 초기 설정의 경우, IAM 사용자를 만들고 난 뒤 추후에 삭제하는 것이 좋습니다. 초기 IAM 사용자를 만든 후, 발급된 AWS_ACCESS_KEY_ID, AWS_SECRET_ACCESS_KEY를 사용합니다.

cd /home/service/consoleme

5. 가상 환경을 생성하고, 설치 스크립트를 실행합니다.

6. 백그라운드에서 ConsoleMe를 실행합니다. (선택사항)

File /usr/bin/consoleme_start.sh

File /etc/systemd/system/consoleme.service

실행 권한을 할당합니다.

서비스를 활성화하고 시작합니다.

cd /home/service/consoleme

7. Celery를 동작시킵니다. (선택사항)

  • Dynamic Configuration의 변경 내용을 반영을 하려면, Celery가 작동 중이어야 합니다. Docker를 사용하는 경우, Celery를 실행하는 스크립트가 포함되어있어 따로 명령어가 필요 없습니다. 다만, 로컬을 사용하는 경우 ConsoleMe 디렉토리에서 다음과 같은 명령어를 입력해야 합니다.

cd /home/service/consoleme

Celery를 백그라운드에서 동작시키기를 원한다면, 해당 부분을 이전에 작성하였던 consoleme_start.sh에 추가하면 됩니다.

해당 부분까지 진행하면, ConsoleMe 웹 UI를 볼 수 있습니다!

8. ConsoleMe 구성을 설정해야 합니다. 원하는 설정 방법에 따라 특정 구성 파일의 예시를 활용하면 됩니다.

ConsoleMe는 다음 순서로 구성을 로드하려고 시도합니다:

1.CONFIG_LOCATION environment variable

2.consoleme.yaml in the current working directory

3. ~/.config/consoleme/config.yaml

4. /etc/consoleme/config/config.yaml

  • 저희는 해당 위치에서 구성하였습니다.

5. example_config/example_config_development.yaml

정적 구성 관련 팁

Slack

  • Slack을 추가하여 정적 구성에 정책 요청이 있을 때, 알림을 받을 수 있습니다.
  • 제목을 눌러 특정 요청 URL로 이동하여 요청한 내용을 승인하거나 확인할 수 있습니다.
  • 배포 후에는 정적 구성에서 url을 수정해야 합니다.
  • 또한, SES를 통해 이메일 발송하는 부분도 적용 하였다면 해당 url을 수정해야만 정책 요청/승인 링크가 정상 작동합니다.

Sentry

  • Sentry를 추가하여 이슈가 발생하면 알림을 받을 수도 있습니다.

Redis/S3

  • Redis는 데이터를 캐시하는 데 사용되지만, S3 bucket을 백업으로 사용할 수도 있습니다. S3 bucket을 생성한 후, 정적 구성에 추가하고, central account에서 consoleme_s3_bucket 키로 inline polocy를 추가하여 사용 가능합니다.

Group Mapping

  • 그룹 매핑을 하기 위해서는 정적 구성에 authorized_group_tags 를 사용해야 합니다.
  • consoleme-authorized-groups-for-credentials 를 spoken account의 role tag에 추가합니다. value는 그룹/사용자 둘 다 가능합니다.
  • consoleme-authorized-groups-for-credentials 는 디폴트 이름이지만 커스터마이즈하여 바꿀 수 있습니다.
  • Role tag를 추가한 뒤 바로 작동하지 않을 수도 있습니다. Event Bridge를 적용한다면 2–3분 정도 소요됩니다.

Dynamic Configuration

  • Dynamic Configuration을 사용한다면 role tag 대신 그룹 매핑이 가능하지만, role tag를 사용하는 것을 더 추천하고 있습니다.
  • 어드민 이메일을 can_edit_config 키에 추가를 해야만 ConsoleMe 웹 UI에서 접근이 가능합니다.

9. ALB Auth (Recommended)

  • 저희는 구글을 이용하여 로그인을 하도록 하였고 구글 그룹을 가져와서 사용하였습니다.
  • 로그인 같은 경우 승인된 리디렉션 URI에 해당 url을 추가해야 됩니다.
  • 로그인이 성공적으로 작동한다면 그 다음, 구글 그룹을 가져올 수 있도록 추가해주면 됩니다. 정적 구성 파일 같은 경우 다음과 같습니다.
  • googleServiceAccountKeys.yaml새 파일에 서비스 계정 키를 추가하고, 해당 파일을 header_auth.yaml에서 확장하여 사용할 수 있도록 하였습니다. 또한 authget_user_by_aws_alb_auth_settings를 업데이트하여 Google에서 그룹을 받아올 수 있도록 수정하였습니다.
  • consoleme_auth 쿠키를 jwt.io 를 이용하여 JWT를 디코딩 한 후 그룹 정보를 확인할 수 있습니다.

역할 생성하기

  • 처음부터 역할을 만들 수 있습니다.

기존 역할을 사용하여 역할 생성하기

  • 기존 역할에서 복제할 대상을 선택하여 사용 가능합니다.
  • 요청한 후 All Policy Requests탭에서 요청을 확인할 수 있습니다.

AWS 로그인하기

  • 이제 요청하여 승인받은 액세스 권한을 가진 역할을 사용하여 AWS에 로그인할 수 있습니다.

Central Account의 초기 IAM 사용자를 IAM 역할로 변환하는 방법

  1. ConsoleMe의 Central Account를 생성한 후, EC2 인스턴스에 인스턴스 프로파일로 연결합니다.
  • EC2 인스턴스가 인스턴스 메타데이터 서비스를 통해 역할의 자격 증명을 제공합니다. ConsoleMe가 실행되면 AWS SDK(Boto3)는 다음 순서로 자격 증명을 찾습니다.
  • 환경 변수로 자격 증명을 찾게 되면, 해당 자격 증명을 가장 먼저 사용하려고 합니다. 따라서 초기에 설정한 AWS 환경변수(AWS_ACCESS_KEY_ID / AWS_SECRET_ACCESS_KEY)는 삭제되어야 합니다.
  • 이러한 환경 변수를 찾지 못하면 결국 인스턴스 프로파일 자격 증명에 도달하게 됩니다. 즉, 자격 증명을 위해 169.254.169.254(인스턴스 메타데이터 서비스)를 컬링하려고 시도합니다.

2. 저희 처럼 EC2에 배포한 경우 인스턴스에서 IMDSv2를 사용하도록 설정하도록 합니다.

참고 문서:

마지막으로, Netflix의 시니어 클라우드 보안 소프트웨어 엔지니어로서 ConsoleMe를 만들었고, 현재는 클라우드 보안 문제 전문 스타트업을 시작한 Mr. Curtis Castrapel에게 감사 드립니다. 저희는 EC2 인스턴스에서 ConsoleMe를 로컬로 설정하는 등 여러 어려움이 있어 ConsoleMe 공식 Discord 채널에 질문을 올렸고, 이에 Curtis가 빠르게 해결책을 제시해 주셔서 많은 도움을 얻게 되었습니다.

--

--