ConsoleMe 적용해보기
2022.04.12
안녕하세요, The Pinkfong Company에서 프론트엔드 개발을 하고 있는 페이지입니다. ConsoleMe라는 웹서비스를 도입하는 과정에서 제가 얻게 된 지식과 팁을 공유하고자 합니다.
저희 회사는 서비스 규모와 개발 부서가 점점 더 크게 성장하면서 각 개발자들의 접근 권한과 역할을 잘 관리할 수 있는 프로그램 도입이 필요해졌습니다. 현재는 각 개발자들이 Amazon Web Service(AWS)에 필요 이상의 접근 권한을 가지고 있기 때문입니다.
ConsoleMe 는 엔드 유저 및 클라우드 관계자들이 AWS IAM 권한 및 자격 증명을 보다 쉽게 관리할 수 있는 웹 서비스로, 저희에게 적합한 솔루션인 것 같아 사용해보기로 했습니다.
ConsoleMe를 사용하면 다음과 같은 이점이 있습니다.
- 여러 계정의 관리를 단일 웹 인터페이스로 통합합니다.
- 엔드 유저 및 관리자가 인증 수준에 따라 온보드 계정에 대한 자격 증명 및 콘솔 액세스를 얻을 수 있습니다.
- 엔드 유저 및 관리자가 IAM 역할, S3 buckets, SQS queues, SNS topics 등에 대한 권한을 요청하고 관리할 수 있는 메커니즘을 제공합니다.
- 사용자가 높은 수준의 의도를 표현하고 자신에게 맞는 권한을 요청할 수 있는 강력한 셀프 서비스 기능이 있습니다.
ConsoleMe는 두 가지 방식으로 설치가 가능합니다.
이번 포스트에서는 ConsoleMe의 로컬 설치 방법에 대해 작성하겠습니다.
- 루트 액세스 가 가능한 Ubuntu 19.04+를 실행할 수 있는 서버
- 2GB의 디스크 공간의 스토리지
- 적절한 권한이 있는 ConsoleMe 서비스용 AWS 사용자/역할
먼저 IAM 사용자를 이용하고, 나중에 IAM 역할로 전환할 수 있습니다. Curtis는 IAM 역할을 사용하는 것이 가장 좋은 방법이라고 추천하였습니다.
- 필요한 모든 디펜더시와 관련 소프트웨어/툴을 설치합니다.
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을 추가하여 정적 구성에 정책 요청이 있을 때, 알림을 받을 수 있습니다.
- 제목을 눌러 특정 요청 URL로 이동하여 요청한 내용을 승인하거나 확인할 수 있습니다.
- 배포 후에는 정적 구성에서 url을 수정해야 합니다.
- 또한,
SES를 통해 이메일 발송하는 부분
도 적용 하였다면 해당 url을 수정해야만 정책 요청/승인 링크가 정상 작동합니다.
Sentry
- Sentry를 추가하여 이슈가 발생하면 알림을 받을 수도 있습니다.
- Redis는 데이터를 캐시하는 데 사용되지만, S3 bucket을 백업으로 사용할 수도 있습니다. S3 bucket을 생성한 후, 정적 구성에 추가하고, central account에서
consoleme_s3_bucket
키로 inline polocy를 추가하여 사용 가능합니다.
- 그룹 매핑을 하기 위해서는 정적 구성에
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을 사용한다면 role tag 대신 그룹 매핑이 가능하지만, role tag를 사용하는 것을 더 추천하고 있습니다.
- 어드민 이메일을
can_edit_config
키에 추가를 해야만 ConsoleMe 웹 UI에서 접근이 가능합니다.
- 저희는 구글을 이용하여 로그인을 하도록 하였고 구글 그룹을 가져와서 사용하였습니다.
- 로그인 같은 경우
승인된 리디렉션 URI
에 해당 url을 추가해야 됩니다.
- 로그인이 성공적으로 작동한다면 그 다음, 구글 그룹을 가져올 수 있도록 추가해주면 됩니다. 정적 구성 파일 같은 경우 다음과 같습니다.
googleServiceAccountKeys.yaml
새 파일에 서비스 계정 키를 추가하고, 해당 파일을header_auth.yaml
에서 확장하여 사용할 수 있도록 하였습니다. 또한auth
및get_user_by_aws_alb_auth_settings
를 업데이트하여 Google에서 그룹을 받아올 수 있도록 수정하였습니다.
consoleme_auth
쿠키를 jwt.io 를 이용하여 JWT를 디코딩 한 후 그룹 정보를 확인할 수 있습니다.
역할 생성하기
- 처음부터 역할을 만들 수 있습니다.
기존 역할을 사용하여 역할 생성하기
- 기존 역할에서 복제할 대상을 선택하여 사용 가능합니다.
- 요청한 후
All Policy Requests
탭에서 요청을 확인할 수 있습니다.
AWS 로그인하기
- 이제 요청하여 승인받은 액세스 권한을 가진 역할을 사용하여 AWS에 로그인할 수 있습니다.
Central Account의 초기 IAM 사용자를 IAM 역할로 변환하는 방법
- 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가 빠르게 해결책을 제시해 주셔서 많은 도움을 얻게 되었습니다.