열려버린 판도라의 상자 (IAM)

문과생 성시은의 AWS 정복기

by 혼북헌터 민짱

VPC라는 견고한 울타리가 생긴 뒤, ‘이노베이트’의 사무실에는 얼마 만인지 모를 평온이 찾아왔다. 성시은은 매일 아침 사무실에 출근해, 습관처럼 커피를 내리며 대시보드에 떠 있는 성장 지표를 확인하는 일이 즐거웠다. 그래프의 모든 선이 아름다운 우상향 곡선을 그리고 있었다. 더 이상 서버가 터질까 봐, 느려질까 봐 심장을 졸이지 않아도 된다는 사실이 그녀에게 ‘대표’라는 직함의 무게를 견딜 힘을 주었다. 그녀는 이제야말로 진짜 스타트업의 CEO가 된 것 같았다.


그 평온을 깨뜨린 것은, 언제나 그렇듯 사소하고 일상적인 요청이었다.


“저… 팀장님들, 혹시 바쁘신가요?”


목소리의 주인공은 일주일 전 새로 합류한 마케팅 인턴 김민아 씨였다. 대학생다운 풋풋함과 반짝이는 열정으로 가득 찬, 팀의 새로운 활력소였다.


“아니요, 괜찮아요. 무슨 일이에요, 민아 씨?”


이철민이 새로 산 기계식 키보드를 경쾌하게 두드리다 말고 고개를 들었다. 기계식 특유의 ‘찰칵’ 거리는 소리가 그의 넘치는 에너지를 대변하는 듯했다.


“다음 주부터 진행할 ‘N행시 챌린지’ 캠페인 배너 이미지를 S3에 직접 올려야 하는데, 제가 방법을 잘 몰라서요. 혹시 어떻게 하면 되는지 알려주실 수 있을까요?”


“아, 그거요? 간단하죠.”


이철민이 자신의 자리에서 일어날 기미도 없이 크게 말했다. 그는 지금 새로 도입한 프레임워크에 푹 빠져 있었다. 그의 머릿속은 온통 어떻게 하면 코드를 더 간결하고 빠르게 만들 수 있을까 하는 생각뿐이었다.


“음… 서준 님께 부탁드리면 안 될까요? 그쪽이 인프라 담당이시니까.”


시은이 조심스럽게 말했다. 박서준은 지난 며칠간 말이 부쩍 줄었다. 그는 묵묵히, 하지만 집요하게 기존 코드들을 리팩토링하며 기술 부채를 갚아나가는 중이었다. 그의 모니터 주변에는 ‘건드리지 마시오’라는 아우라가 짙게 깔려 있었다.


“에이, 서준이 형 지금 정신없어요. 어제 제가 짠 코드 리뷰하다가 머리 쥐어뜯고 있던데요. 이런 간단한 일로 방해하면 안 되죠.”


실제로 박서준은 두통이 온다는 듯 관자놀이를 꾹꾹 누르며 모니터를 노려보고 있었다. 시은은 그를 방해하고 싶지 않았다. 인턴의 간단한 파일 업로드 요청 하나 때문에, 어렵게 잡은 그의 집중력을 깨뜨리고 싶지 않았다.


“그럼… 철민 님 계정으로 잠시 접속해서 올리라고 하면 안 될까요? 금방 끝날 것 같은데. 옆에서 알려주면서요.”


시은의 말에, 이철민이 무릎을 탁 쳤다.


“오, 좋은 생각! 그게 제일 빠르겠네요! 민아 씨, 이리 와봐요. 내가 지금 AWS 접속할 수 있는 키를 줄게요. 이걸로 내 컴퓨터에 설정하면, 민아 씨 컴퓨터에서도 S3에 파일 올릴 수 있어요. 끝나면 꼭 말해주고!”


그는 자신의 AWS 액세스 키 ID와 시크릿 액세스 키가 저장된 텍스트 파일을 열었다. 알파벳과 숫자가 무작위로 뒤섞인, 세상에 단 하나뿐인 자신의 디지털 신분증이자 만능 열쇠였다.


그는 그것을 복사해서 김민아 씨에게 슬랙 다이렉트 메시지로 보내려 했다. ‘이게 제일 빠르지. 역시 난 효율적이야.’ 그렇게 생각하며 엔터 키를 누르려는 바로 그 순간이었다.


“잠깐만요.”


사무실 입구에서 들려온 나직하지만 얼음장처럼 차가운 목소리. 그 목소리가 이철민의 손가락을, 사무실의 모든 움직임을 얼어붙게 만들었다. 약속도 없이 나타난 안민준이었다. 그는 팔짱을 낀 채, 마치 모든 것을 처음부터 지켜보고 있었다는 듯 이철민을 뚫어져라 쳐다보고 있었다.


“지금… 뭘 하려고 하신 겁니까?”


“아, 민준 님! 어서 오세요. 하하.” 철민이 멋쩍게 웃으며 말했다. “아니, 그게… 인턴분이 이미지 좀 올려야 한다고 해서요. 제 키를 잠시 빌려주려고요. 금방 끝나니까요. 효율적이잖아요.”


“효율적이요?”


안민준은 대답 대신 시은에게 시선을 돌렸다.


“성 대표님. 이 건물 보안 카드, 몇 개나 가지고 계십니까?”


“네? 저는 제 것 하나뿐인데요. 대표 카드요.”


“그렇겠죠. 그런데 만약 청소하시는 아주머니가 잠깐 들어와서 화장실만 청소해야 한다고 해서, 성 대표님의 ‘대표 카드’를 그냥 빌려준다고 생각해 보시죠. 그분은 정말 화장실 청소만 하고 나갈 거라고 어떻게 확신하죠?”


그는 천천히 사무실 안으로 걸어 들어왔다. 그의 발걸음 소리가 유난히 크게 울렸다.


“그 카드는 대표님 사무실 문을 열 수 있습니다. 회사의 모든 기밀 서류가 있는 곳이죠. 재무팀 금고를 열 수도 있습니다. 회사의 모든 자금이 있는 곳이죠. 그리고… 어젯밤 박 개발자님이 겨우 구축한, 우리 회사의 심장이 있는 서버실 문을 열 수도 있습니다. 그런데도 빌려주실 겁니까?”


시은의 얼굴이 새하얗게 질렸다. 그녀는 그제야 이철민이 하려던 행동의 의미를 깨달았다.


“지금 이철민 개발자님이 하려던 게 바로 그겁니다.” 민준의 목소리는 조용했지만, 회의실 전체를 압도했다.

“개발자에게 발급된 액세스 키는, 이 건물 전체의 거의 모든 문을 열 수 있는 ‘마스터키’나 다름없습니다. 그걸, 이제 막 입사한, 우리가 아직 잘 알지도 못하는 인턴에게 그냥 건네주겠다고요?”


“에이, 설마요. 민아 씨가 그럴 사람도 아니고… 그리고 금방 지우면 되죠.” 철민이 항변했지만, 그의 목소리는 모기 소리처럼 작아졌다.


“사람을 믿고 안 믿고의 문제가 아닙니다. 시스템의 문제입니다.” 민준은 사무실 중앙의 화이트보드로 걸어가 마커를 들었다. “만약 민아 씨의 노트북이 악성코드에 감염되어 있었다면요? 그 키는 복사되는 즉시 해커의 손에 넘어갑니다. 그럼 해커는 이철민 개발자인 척, 우리 시스템에 들어와 모든 데이터를 지우거나, 비트코인을 채굴하는 수백 대의 비싼 서버를 만들고 사라질 수도 있습니다. 다음 달 AWS 청구서에 수억 원이 찍혀 나오는 거죠. 회사는 그걸로 끝입니다.”


사무실에는 침묵이 흘렀다. 모두가 숨을 죽였다. 판도라의 상자가 열리기 직전이었다는 사실을, 그들은 이제야 깨달았다.


“AWS의 보안 철학은 아주 간단합니다.” 민준이 화이트보드에 썼다. ‘최소 권한의 원칙(Principle of Least Privilege)’. “딱, 정말 딱 필요한 만큼의 열쇠만 주는 겁니다. 그 이상은 절대 주지 않는 거죠.”


그는 화이트보드에 커다란 빌딩 그림을 그리기 시작했다.


“이 빌딩이 우리 AWS 계정입니다. 이 빌딩을 처음 지으면, ‘건물주’가 가진 단 하나뿐인 루트(Root) 사용자 키가 생깁니다. 모든 문을 열 수 있는 전설의 마스터키죠. 그래서 이 키는 어떻게 해야 할까요?”


“금고에 넣어둬야죠.” 시은이 대답했다.


“맞습니다. 금고에 넣어두고, 금고에 이중, 삼중으로 잠금장치(MFA, 다중 인증)를 걸어둔 뒤, 평소에는 절대 쓰면 안 됩니다. 건물 전체가 불타서 재건축해야 할 때나 쓰는 겁니다.”


그는 건물주 키에 커다란 X자를 쳤다.


“그리고 직원들에게는 각자의 IAM 사용자(User)를 만들어 줍니다. 이건 ‘성시은’, ‘박서준’ 이름이 적힌 개인 사원증 같은 겁니다. 이 사원증 자체가 신분 인증이죠.”


“그럼 인턴에게도 IAM 사용자를 만들어 주면 되겠네요?” 시은이 물었다.


“맞습니다. 하지만 사원증만 준다고 끝이 아니죠. 이 사원증으로 어떤 문을 열 수 있는지 정해줘야 합니다. 그걸 정책(Policy)이라고 부릅니다. 일종의 ‘업무 규정집’이죠.”


민준은 ‘마케팅팀 인턴’이라는 사원증 옆에 작은 열쇠 꾸러미를 그렸다.


“이 정책이라는 열쇠 꾸러미에는 아주 구체적으로 적혀 있는 겁니다. ‘S3라는 이름의 1층 창고에만 들어갈 수 있음’, ‘그중에서도 마케팅 배너 폴더라는 선반에만 접근 가능함’, ‘파일을 올리는 행동만 가능함’, ‘파일을 지우거나 다른 폴더를 보는 건 절대 불가능함’. 이렇게요.”


그의 설명에 철민과 서준의 눈이 동그래졌다. 그렇게까지 세밀한 권한 설정이 가능하다는 사실에 놀라는 눈치였다.


“더 좋은 방법도 있습니다. 그룹(Group)을 만드는 거죠. ‘마케팅팀’이라는 그룹을 만들고, 그 그룹에 필요한 열쇠 꾸러미를 통째로 주는 겁니다. 그리고 김민아 씨를 마케팅팀 그룹에 소속시키는 거죠. 나중에 다른 마케팅 직원이 들어와도, 그 사람을 그룹에 넣기만 하면 똑같은 권한을 갖게 되니 관리가 편해집니다. 부서별로 권한을 주는 것과 같죠.”


“와… 대박인데요.” 철민이 진심으로 감탄했다.


“여기서 끝이 아닙니다.” 민준의 눈이 반짝였다. “인턴이나, 저 같은 외부 컨설턴트, 혹은 프로그램에게는 사원증보다 더 좋은 게 있습니다. 바로 역할(Role)이라는 겁니다. 이건 ‘임시 방문증’ 같은 개념이에요.”


그는 말을 이었다. “김민아 씨에게 ‘마케팅 이미지 업로더’라는 이름의 임시 방문증을 주는 겁니다. 이 방문증은 딱 1시간만 유효하고, 오직 S3의 특정 폴더에만 접근할 수 있는 권한을 가지고 있죠. 1시간이 지나면 자동으로 효력이 사라집니다. 훨씬 안전하죠. 키를 주고, 나중에 뺏는 걸 깜빡할 필요도 없고요.”


시은은 온몸에 소름이 돋는 것을 느꼈다. 이것은 단순히 서버를 빌려 쓰는 차원의 이야기가 아니었다. 거대한 시스템을 안전하고 효율적으로 운영하기 위한 깊은 철학이 담겨 있었다. 사람의 실수를, 사람의 선의에 기댄 허술한 믿음을 원천적으로 방지하는 시스템. 그녀가 막연하게 꿈꿔왔던 바로 그것이었다.


“서준 님, 철민 님.”


시은이 두 사람을 돌아보며 말했다. 그녀의 목소리에는 이제 막 회사를 창업한 초보 대표의 불안감이 아닌, 자신의 왕국을 지키려는 군주의 단호함이 깃들어 있었다.


“지금 당장 우리 회사 IAM 정책부터 전부 다시 만듭시다. 루트 계정은 오늘부로 봉인합니다. 그리고 각자 역할에 맞는 최소한의 권한만 가진 사용자를 새로 만들어요. 그리고 앞으로는… 절대, 절대 액세스 키를 개인 메시지로 공유하는 일은 없도록 합시다. 이건 규칙입니다.”


그녀는 잠시 숨을 골랐다가, 굳어있는 김민아 씨를 향해 부드럽게 웃으며 말했다.


“민아 씨, 미안해요. 많이 놀랐죠? 저희가 아직 이런 시스템이 부족해서 그래요. 괜찮다면, 오늘 저희의 첫 번째 ‘역할(Role)’ 사용자가 되어줄래요?”


그녀의 말에 사무실의 얼어붙었던 공기가 조금씩 녹기 시작했다.


▶ 4화 기술 TIP

IAM (Identity and Access Management): AWS의 리소스에 대한 접근을 안전하게 제어하기 위한 서비스입니다. ‘누가(Identity) 무엇을(Access) 할 수 있는지 관리(Management)’하는 AWS 보안의 핵심 중추입니다. IAM을 통해 사용자, 그룹, 역할 등을 생성하고, 각각에 필요한 권한을 정책을 통해 부여할 수 있습니다.

루트 사용자 (Root User): AWS 계정을 처음 생성할 때 만들어지는 ‘신’과 같은 존재입니다. 모든 서비스와 리소스에 대한 완전한 접근 권한을 가지므로, 일상적인 작업에는 절대 사용하지 않고 안전하게 보관해야 합니다. MFA(Multi-Factor Authentication, 다중 인증)를 설정하여 보안을 강화하는 것이 필수적입니다.

IAM 사용자 (User): AWS와 상호 작용하는 사람 또는 애플리케이션을 의미합니다. 각 사용자는 고유한 자격 증명(콘솔 접속용 비밀번호, 프로그래밍 방식 접근용 액세스 키)을 가집니다.

IAM 그룹 (Group): 사용자의 집합입니다. 여러 사용자에게 동일한 권한을 부여해야 할 때, 각 사용자에게 개별적으로 정책을 할당하는 대신 그룹에 정책을 할당하고 사용자를 그룹에 추가하면 관리가 매우 편리해집니다. ‘마케팅팀’, ‘개발팀’처럼 부서 단위로 권한을 관리하는 것과 같습니다.

IAM 정책 (Policy): 권한 그 자체를 정의하는 JSON 형식의 문서입니다. ‘어떤 주체(Principal)가 어떤 서비스(Effect: Allow/Deny)의 어떤 행동(Action)을 어떤 자원(Resource)에 대해 허용하거나 거부할 것인지’를 명시합니다.

IAM 역할 (Role): 특정 권한을 가진 IAM의 또 다른 정체성으로, 사용자나 EC2 같은 AWS 서비스가 ‘맡을(Assume)’ 수 있는 임시 자격 증명을 제공합니다. 액세스 키 같은 장기 자격 증명을 공유하는 대신 역할을 사용하여 임시적인 권한을 부여하는 것이 훨씬 안전하고 권장되는 방식입니다.

최소 권한의 원칙 (Principle of Least Privilege): IAM을 관통하는 가장 중요한 보안 원칙입니다. 사용자나 서비스에 업무 수행에 필요한 ‘최소한의’ 권한만을 부여하여, 자격 증명이 유출되거나 실수가 발생하더라도 피해를 최소화하는 것을 목표로 합니다.

keyword
월, 수, 금 연재