편리하게 AWS EC2 인스턴스의 접속 관리하기

  • Post author:
  • Post category:칼럼
  • Post last modified:April 7, 2020
This entry is part 10 of 12 in the series Cloud Security

언제나 그렇듯 알게 모르게 고객의 안전을 최우선으로 생각하는 데일리에서…

개발 및 운영 환경에서 EC2 인스턴스에 터미널로 접속하는 건 매우 많은 제약을 받습니다. 방화벽, MFA로 방비한 VPN 등으로 여러 안전장치를 통해야 합니다. 물론 이러한 일련의 과정은 적절한 권한을 가진 사람이 적절한 수단으로 접속할 때는 최소한의 불편만 감수하면 되도록 설계되었습니다. 불편하면 우회할 길을 찾는 게 사람이니까요.

이러한 일련의 보안 강화 조치의 일환으로써 터미널 접속자에 대한 감사 로그를 더 확보하기로 했습니다. VPN 접속시 실시간 알람을 받는 것으로는 충분하지 않다는 의견에 따른 것입니다. 얼마 전에는 sshd의 로그를 Elasticsearch 등의 시스템으로 모아서 기존 모니터링 시스템과 통합하였습니다. 이로써 서버로 가는 일련의 과정은 모두 수집되고 적절한 통제를 받게 되었습니다.

여기에 더해 이번에는 ssh 접속키 관리체계를 개선하였습니다. 기존에는 터미널 접속시 필요한 ssh 공개키를 CloudConfig로 EC2 인스턴스를 생성할 때 밀어넣었습니다. 그런데 이 방법은 공개키를 바꾸거나 추가할 때 문제가 있습니다. 공개키 목록이 바뀌었다고 EC2 인스턴스 전체를 다시 생성할 수는 없으니 보통은 공개키 목록을 바꾸는 스크립트를 작성하고 그걸 AWS SSM Agent를 통해 전체 서버군에 적용합니다. 서버에 하나하나 접속해 작업하는 것보다야 낫지만 그다지 바람직하지는 않지요. 이에 몇 가지 대안을 고민해보았습니다.

우선 AlexRudd/key-manager와 같은 접근방법이 있습니다. S3에 공개키 목록을 밀어넣고 각 서버에서는 주기적으로 새 공개키 파일을 다운로드 받아 자동으로 갱신합니다. 장점도 있습니다만, 변경사항이 있을 때마다 누군가가 공개키 목록을 작성하고 S3에 업로드해야 합니다. 이 업무를 맡은 사람은 기분이 유쾌하지만은 않겠죠? 그래서 다른 방법을 모색했습니다.

widdix/aws-ec2-ssh의 접근 방법은 좀더 세련됩니다. 공개키 목록을 누군가 따로 관리하지 않습니다. 대신 공개키 사용자가 직접 자신의 공개키를 관리합니다. AWS IAM에는 사용자별로 SSH 공개키를 업로드하는 메뉴가 있습니다. 원래는 AWS판 GitHub라 할 수 있는 AWS CodeCommit 에서 쓸 공개키를 넣는 기능입니다만 AWS가 제공하는 API를 이용하면 다른 용도로도 사용가능합니다.

이 방식이라면 업무 담당자가 따로 필요 없고 퇴사자가 생겼을 때도 AWS 계정을 정리하면 터미널 접속권한도 자연스럽게 제거됩니다. 또한 AWS IAM 그룹별로 터미널 접속 계정의 권한도 제어하기 때문에 여러 모로 장점이 많습니다. 그런 까닭에 widdix/aws-ec2-ssh에 영향을 받은 다른 프로젝트도 여럿 있습니다. 다들 “이거 쓸만한데!”라고 생각하는 듯 싶군요.

이로써 ssh 공개키 관리는 자동화되었고 더 상세한 접속기록을 확보하게 됐습니다. 이어서 자세한 기술적 배경을 설명합니다. 구현에 관심 있는 분은 쭉 따라 읽어가시면 됩니다.

기술적 배경

CoreOS의 ssh 접속 로그 확보하는 법

fluentd 사용자라면 reevoo/fluent-plugin-systemd를 써서 Kafka로 로그를 보내고 다시 Kafka에서 로그를 빼내서 Elasticsearch 등으로 보내면 됩니다. fluent-plugin-systemd는 sshd 외의 다른 시스템 로그도 모두 수집합니다. 만약 sshd 로그에만 관심이 있다면 다음과 같이 하면 됩니다.

<source>
  @type systemd
  tag systemd.sshd
  path /var/log/journal
  filters [{ "_EXE": "/usr/sbin/sshd" }]
  read_from_head true
  <storage>
    @type local
    persistent false
    path sshd.pos
  </storage>
  <entry>
    field_map {"MESSAGE": "log", "_PID": ["process", "pid"], "_CMDLINE": "process", "_COMM": "cmd"}
    fields_strip_underscores true
    fields_lowercase true
  </entry>
</source>

CoreOS에 aws-ec2-ssh 적용하기

aws-ec2-ssh는 일련의 쉘 스크립트로 구성됩니다. 그런 까닭에 경로 문제와 같이 특정 운영체제에 의존적인 부분이 많습니다. 주요 리눅스 배포판에서는 문제가 없습니다만 CoreOS는 지원대상이 아니고 실제로 여러 문제가 있습니다.

  • Amazon Linux 2017.09
  • Ubuntu 16.04
  • SUSE Linux Enterprise Server 12 SP3
  • RHEL 7.4
  • CentOS 7

제일 큰 문제는 CoreOS에 Python이 없고 따라서 파이썬을 이용하는 AWS CLI도 작동하지 않는다는 겁니다. 이와 같은 문제를 해결하고자 andromedarabbit/aws-ec2-ssh 에서는 opsgang/docker_awscli 이용해 AWS CLI를 도커 컨테이너 안에서 실행합니다. 다만 도커 컨테이너를 실행하기 위해서는 권한 수준이 높아야 합니다. 이는 여러 보안 이슈로 이어질 수 있기 때문에 파이썬 의존적인 AWS CLI 대신 wallix/awless 같은 바이너리 도구를 이용하거나 AWS의 API를 직접 호출하는 식으로 개선해나갈 예정입니다.

andromedarabbit/aws-ec2-ssh에는 이와 더불어 대문자가 포함된 AWS IAM 계정에 대한 처리 등이 개선되었습니다. 충분히 개선한 후에 본 프로젝트에 Pull request를 보낼 예정입니다.

Author Details
Kubernetes, DevSecOps, AWS, 클라우드 보안, 클라우드 비용관리, SaaS 의 활용과 내재화 등 소프트웨어 개발 전반에 도움이 필요하다면 도움을 요청하세요. 지인이라면 가볍게 도와드리겠습니다. 전문적인 도움이 필요하다면 저의 현업에 방해가 되지 않는 선에서 협의가능합니다.