Cloud Modernization 24

루트 사용자와 IAM으로 인증과 권한의 출발선 나누기

관리자 계정이면 편하게 쓰면 된다고 생각하면 루트 사용자와 IAM 사용자/역할의 위험 경계가 보이지 않는다.

근거 · 교안 p99-p105

루트 사용자와 IAM으로 인증과 권한의 출발선 나누기 ?? ???

1장: 마스터키의 유혹: 루트 사용자가 정말 편리할까?

솔라가 노트북 화면을 뚫어지라 쳐다보고 있었다. 미간에 잡힌 옅은 주름이 명쾌하게 풀리지 않는 무언가와 씨름하고 있음을 보여주었다. 화면 한구석에는 단정한 글씨로 이런 문장이 적혀 있었다.

root 사용자는 모든 AWS 서비스에 대한 전체 액세스 권한을 가지며 일상 Task 용도로 사용하면 안 된다.

한참을 입술만 삐죽이던 솔라는 결국 노트북을 들고 거실에 있는 루나에게 향했다.

“언니, 나 이거 정말 이해가 안 돼.”

루나는 읽던 책에서 눈을 들어 솔라를 바라보았다. 솔라는 불만 가득한 얼굴로 노트북 화면을 가리켰다.

“여기, ‘루트 사용자는 일상적으로 쓰면 안 된다’고 하잖아. 아니, 모든 권한을 다 가진 계정이면 제일 편하고 좋은 거 아니야? 뭐 하나 하려고 할 때마다 권한 없다고 막히는 것보다 백배는 효율적이잖아. 왜 굳이 번거롭게 다른 걸 또 만들어서 쓰라는 거지?”

솔라의 목소리에는 ‘이렇게 당연하고 편한 길을 두고 왜 돌아가라는 건지 모르겠다’는 순수한 의문이 가득했다. 관리자 계정 하나로 모든 걸 처리하는 게 가장 깔끔한 방법이라고, 솔라는 생각하고 있었다.

루나는 솔라의 질문에 바로 답하는 대신, 잠시 창밖을 바라보았다. 그리고는 조용히 입을 열었다.

“솔라, 네가 아주 커다란, 100층짜리 최첨단 빌딩의 총괄 매니저가 되었다고 상상해 봐.”

“갑자기? 좋아, 내가 매니저야. 그래서?”

솔라는 뜬금없는 설정에 어리둥절했지만, 일단은 언니의 이야기에 귀를 기울였다.

“너한테는 그 빌딩의 모든 공간, 그러니까 모든 사무실, 서버실, 통신실, 사장실, 심지어 비밀 금고까지 단번에 열 수 있는 마스터키가 하나 주어져. 어때?”

“와, 최고지! 그 키 하나만 있으면 어디든 갈 수 있는 거잖아. 문제가 생겼을 때 다른 열쇠 찾으러 다닐 필요도 없고.”

솔라의 눈이 반짝였다. 역시나, 모든 것을 할 수 있는 권한은 멋진 것이었다.

“그래. 그럼 오늘 네가 할 일은 35층 구석에 있는 창고의 전구가 나갔는지 확인하는 거야. 아주 간단한 일이지. 뭘 들고 갈래?”

“당연히 마스터키지! 내 주머니에 항상 있을 거 아냐?”

솔라는 자신만만하게 대답했다. 루나는 고개를 살짝 끄덕였다.

“좋아. 마스터키를 주머니에 넣고 35층으로 가는 길에, 누군가와 부딪히면서 그만 열쇠를 떨어트렸어. 그리고 그걸 알아채지 못했지. 이제 어떻게 될까?”

“어…”

솔라의 표정이 처음으로 굳었다. 반짝이던 눈동자가 흔들리기 시작했다.

“그걸 주운 사람이 나쁜 마음을 먹는다면… 그 사람은 빌딩의 모든 곳을 열 수 있어. 기밀문서가 있는 사장실도, 모든 정보가 담긴 서버실도, 돈이 있는 금고도.”

“그… 그럼 빨리 알아채고 모든 문 잠금장치를 바꿔야지!”

“100층짜리 빌딩의 모든 잠금장치를? 그 비용과 시간은? 그리고 그 사이에 일어날 수 있는 일들은? 단지 창고 전구 하나 확인하러 가는 길에 일어난 일 때문에 빌딩 전체가 마비될 수도 있는 거야.”

루나의 차분한 목소리가 거실 공기를 무겁게 눌렀다. 솔라는 아무 말도 할 수 없었다. 방금 전까지 최고라고 생각했던 마스터키가 이제는 세상에서 가장 위험한 물건처럼 느껴졌다.

한참의 침묵 끝에 솔라가 입을 열었다.

“아… 알겠다. 마스터키를 잃어버리는 건, 그냥 창고 열쇠 하나를 잃어버리는 거랑은… 차원이 다른 문제구나. 편리함의 대가가 너무 커.”

솔라는 다시 자신의 노트북 화면을 바라보았다. 아까와는 전혀 다른 의미로 문장이 읽혔다.

root 사용자는 모든 AWS 서비스에 대한 전체 액세스 권한을 가지며 일상 Task 용도로 사용하면 안 된다.

“그럼 AWS의 루트 사용자도 이 마스터키랑 똑같은 거네. 이걸로 매일 로그인해서 작업하는 건, 빌딩 전체의 마스터키를 목에 걸고 다니면서 자판기 커피도 뽑아 마시고, 화장실도 가는 거랑 마찬가지인 거구나.”

솔라는 스스로가 내린 결론에 놀란 듯 작은 목소리로 중얼거렸다. 가장 효율적이라고 생각했던 방법이, 사실은 가장 무모한 방법이었던 것이다. 일상적인 편의를 위해 감당해야 하는 위험이 너무나도 치명적이었다.

루나는 조용히 고개를 끄덕였다. “심지어 디지털 키는 복제되기도 훨씬 쉽고, 순식간에 전 세계 어디로든 퍼져나갈 수 있지.”

“이제 알겠어. 루트 계정은 정말 꼭 필요할 때, 그러니까 빌딩 전체의 시스템을 바꿔야 할 때 같은 아주 특별한 경우에만 써야 하는 거구나. 절대 일상적인 로그인에 쓰면 안 되겠어.”

완전히 납득했다는 듯 솔라는 고개를 끄덕였다. 하지만 이내 새로운 궁금증이 고개를 들었다. 솔라의 미간에 다시 옅은 주름이 잡혔다.

“그런데 언니, 그렇게 위험하다는 건 알겠는데… 구체적으로 뭐가 어떻게 위험하다는 거야? 내 루트 계정이 해킹당하면, 그냥 내가 만든 서버 몇 개 날아가는 정도 아니야? 마스터키를 도둑맞으면 빌딩의 금고까지 털리는 건 상상이 되는데, 내 클라우드 계정에는 그 정도의 ‘금고’가 뭐가 있는 거지?”

2장: 분리된 책임: IAM, 왜 필요한가?

솔라의 질문이 거실 공기 중에 잠시 머물렀다. “내 클라우드 계정에는 그 정도의 ‘금고’가 뭐가 있는 거지?” 마스터키의 위험성은 알겠지만, 그게 구체적으로 자신의 디지털 자산에 어떤 의미인지 실감 나지 않는다는 목소리였다.

루나는 바로 대답하는 대신, 옆에 놓여 있던 서류철 하나를 집어 들었다. 평범한 사무용 서류철이었지만, 안에는 색깔이 다른 여러 개의 파일 폴더가 꽂혀 있었다. 루나는 서류철을 탁자 위에 놓고, 솔라 쪽으로 조용히 밀었다.

“이게 네 AWS 계정이라고 생각해 보자.”

루나는 서류철의 첫 번째 파란색 폴더를 가리켰다. “여긴 네가 만든 서버, 데이터베이스 같은 것들이 있어. 네가 ‘서버 몇 개’라고 말한 곳이지.” 이어서 그녀는 두 번째, 노란색 폴더를 톡톡 쳤다. “여긴 네 서비스를 이용하는 고객들의 개인 정보가 들어있고.” 마지막으로 그녀의 손가락은 가장 안쪽에 있는 붉은색 폴더 위에 멈췄다. “그리고 여기엔… 이 계정에 연결된 네 신용카드 정보, 그리고 이 계정 자체를 완전히 삭제할 수 있는 권한이 들어있어.”

솔라는 말없이 서류철을 내려다보았다. 파란 폴더, 노란 폴더, 그리고 붉은 폴더. 처음에는 그저 ‘서버 몇 개’라고 생각했던 자신의 계정이 전혀 다르게 보이기 시작했다. 단순한 작업 공간이 아니라, 중요한 정보들이 구획별로 나뉘어 보관된 하나의 금고처럼 느껴졌다.

“루트 계정, 즉 마스터키를 도둑맞는다는 건, 이 서류철 전체를 통째로 넘겨주는 거야.” 루나의 차분한 목소리가 이어졌다. “해커는 네 서버를 망가뜨리는 데서 그치지 않아. 노란 폴더를 열어서 고객 정보를 전부 빼돌릴 수도 있고, 붉은 폴더를 써서 네 카드로 엄청난 금액의 서비스를 사용해 버릴 수도 있지. 최악의 경우, 이 서류철 자체를 불태워버리듯 계정을 영원히 삭제해 버릴 수도 있고.”

“…….”

솔라는 입을 다물었다. 서버가 날아가는 것은 복구할 수 있을지도 모른다. 하지만 고객 정보 유출이나, 계정 자체의 소멸은 차원이 다른 문제였다. 마스터키를 잃어버린 빌딩 매니저가 마주할 재앙이, 이제야 자신의 일처럼 구체적으로 다가왔다.

“그럼… 그럼 어떻게 해? 마스터키를 안 쓸 수는 없잖아. 빌딩 전체 시스템을 바꿀 때처럼, 계정 전체에 대한 설정이 필요할 때도 있을 텐데.”

“맞아. 그래서 마스터키는 아주 안전한 곳에 보관해두고, 평소에는 다른 열쇠들을 쓰는 거야.”

루나는 마치 마술처럼, 서류철 옆에 크기와 모양이 다른 열쇠 꾸러미를 내려놓는 시늉을 했다.

“예를 들어, 개발 작업을 하는 사람에게는 파란 폴더, 즉 서버만 열 수 있는 열쇠를 주는 거지. 그 열쇠로는 고객 정보가 담긴 노란 폴더나 결제 정보가 있는 붉은 폴더는 절대 열 수 없어.”

“아…!”

“회계 담당자에게는 어떨까? 붉은 폴더의 결제 내역을 ‘보기만’ 할 수 있는 열쇠를 주는 거야. 결제 수단을 바꾸거나 계정을 삭제할 권한은 없이.”

솔라의 눈이 가늘어졌다. 머릿속에서 복잡했던 개념들이 하나의 원칙으로 정리되는 순간이었다.

“필요한 만큼만. 딱 그 일을 하는 데 필요한 최소한의 권한만 주는 거구나.”

솔라는 무릎을 탁 쳤다. “생각해 보니 당연한 거였네. 모든 직원에게 사장실 금고 열쇠를 주지는 않으니까. 각자 자기 역할에 맞는 열쇠만 가져야 안전한 거였어.”

루나는 부드럽게 미소 지었다. “바로 그거야. 클라우드에서도 마찬가지야. 모든 권한을 가진 루트 사용자로 모든 일을 처리하는 건 너무 위험하고 불필요해. 대신 각자의 역할과 책임에 맞는 권한을 가진 사용자들을 만들어서 써야 해. AWS에서는 이런 신원 및 액세스 관리를 해주는 서비스를 IAM(Identity and Access Management)이라고 불러.”

IAM. 솔라는 그 단어를 조용히 입안에서 굴려보았다. 이전에는 그저 복잡하고 번거로운 절차라고만 생각했던 것이, 이제는 각자의 책임과 역할을 명확히 나누는 안전한 경계선처럼 느껴졌다. 루트라는 강력하지만 위험한 출발선 대신, 각자의 역할에 맞는 여러 개의 출발선을 만드는 것. 그것이 보안의 시작이었다.

“알겠어. 이제 왜 루트 계정을 잠가두고 IAM을 써야 하는지 확실히 알겠어. 모든 걸 할 수 있는 한 명이 아니라, 각자 할 일만 할 수 있는 여러 명으로 나누는 게 핵심이구나.”

완전히 이해했다는 듯 솔라의 표정이 환해졌다. 하지만 그 밝음도 잠시, 그녀는 다시 노트북 화면을 힐끗 보더니 고개를 갸웃거렸다. 새로운 종류의 막막함이 그녀의 얼굴에 떠올랐다.

“그런데 언니, ‘개발자용 열쇠’나 ‘회계팀용 열쇠’는 어떻게 만드는 거야? 그냥 ‘개발자’라고 이름 붙이면 알아서 그렇게 작동하는 건 아닐 테고… 이 많은 권한들을 어떻게 조합해서 딱 맞는 열쇠를 만들 수 있지?”

3장: 안전한 경계: IAM으로 일상 업무 나누기

솔라의 질문이 남긴 막막함이 채 가시지 않은 거실. 솔라는 노트북 화면에 펼쳐진 수백 개의 체크박스와 권한 목록을 보며 한숨을 쉬었다. ‘개발자용 열쇠’와 ‘회계팀용 열쇠’를 만들어야 한다는 건 알겠다. 하지만 눈앞의 빼곡한 권한 목록은 마치 부품만 가득 쌓여있고 조립 설명서는 없는 DIY 가구 세트 같았다. 어디서부터 손대야 할지 감조차 오지 않았다.

그때, 루나가 조용히 다가와 탁자 위에 두꺼운 종이 카드 몇 장과 펜을 내려놓았다. 마치 게임에 쓰는 것 같은 아무것도 적히지 않은 하얀 카드였다. 솔라가 어리둥절한 표정으로 언니를 쳐다보자, 루나는 노트북 화면을 가리키며 말했다.

“그 수많은 목록에서 시작하니까 막막한 거야. 우리, 반대로 해보자. 권한 목록이 아니라, 그 열쇠를 쓸 사람에게서 시작하는 거야.”

루나는 펜을 들어 첫 번째 카드 상단에 ‘개발자’라고 적었다.

“자, 이 카드가 ‘개발자용 ID 카드’야. 이 카드를 가진 사람은 무엇을 할 수 있어야 할까? 그리고 더 중요하게는, 무엇을 할 수 없어야 할까?”

솔라는 잠시 생각에 잠겼다. ‘개발자’라는 역할에서 시작하니, 아까보다는 훨씬 생각이 명확해지는 기분이었다.

“음… 일단 개발자는 서버를 만들고, 코드를 배포하고, 데이터베이스에 접근할 수 있어야 해.”

솔라는 루나가 건넨 펜을 받아 ‘개발자’ 카드에 ‘서버 생성/수정/삭제’, ‘코드 배포’, ‘개발용 DB 접근’이라고 적어 내려갔다. 그러다 문득, 솔라의 펜이 멈칫했다.

“그런데 언니, 이러다 보면 결국 권한을 너무 많이 주게 되는 거 아닐까? 편리하자고 이것저것 다 넣어주다 보면… 마스터키랑 비슷해지는 거 아니야?”

“좋은 지적이야. 그럼 이렇게 물어볼게. 개발자가 고객 정보를 마음대로 볼 수 있어야 할까? 아니면 회사 결제 정보를 바꿀 수 있어야 할까?”

“아니! 그건 절대 안 되지!”

솔라는 질색하며 고개를 저었다. 루나의 질문에 지난번 서류철 비유가 떠올랐다. 개발자에게는 파란 폴더만 허용해야 했다. 노란 폴더와 붉은 폴더는 절대 만져서도 안 되었다. 솔라는 카드 아래쪽에 ‘고객 정보 접근 불가’, ‘결제 관련 설정 변경 불가’라고 단호하게 적었다. 이제야 비로소 제대로 된 ‘개발자용 열쇠’의 모습이 갖춰지는 것 같았다.

루나는 다음 카드를 내밀며 ‘감사자’라고 적었다.

“이번엔 감사자야. 이 사람의 역할은 뭘까?”

“감사자는… 시스템이 잘 돌아가는지, 보안 문제는 없는지 확인하는 사람이니까… 모든 걸 볼 수 있어야 하지 않을까? 서버 설정, 로그 기록 같은 것들.”

솔라는 자신 있게 말했지만, 곧 스스로 말을 정정했다.

“아, 아니지. ‘보기만’ 할 수 있어야겠구나. 뭔가를 바꾸거나 지우면 안 돼. 그건 감사자의 역할이 아니니까.”

솔라는 ‘감사자’ 카드에 ‘모든 리소스 읽기 전용(Read-Only) 접근’이라고 깔끔하게 정리해 적었다. 직접 ID 카드를 설계해보니, 지난 장에서 배웠던 ‘최소 권한 원칙’이 어떻게 적용되는지 피부로 느껴졌다. 각 역할에 필요한 책임과 권한의 경계가 선명하게 그려졌다.

마지막으로 루나는 ‘관리자’라고 적힌 카드를 건넸다. 솔라는 카드를 받아 들고 잠시 망설였다.

“‘관리자’라… 이건 루트랑 뭐가 다른 거지? 결국 모든 걸 다 할 수 있는 사람 아닌가?”

이전의 솔라였다면 ‘편리하니까 모든 권한을 주자’고 생각했겠지만, 이제는 아니었다. 그녀는 ‘관리자’라는 이름 뒤에 숨은 위험성을 경계하고 있었다.

“AWS에서 말하는 IAM 관리자는 빌딩의 총괄 매니저가 아니야. 보안팀 팀장에 가깝지.” 루나가 설명했다. “보안팀장은 다른 직원들의 ID 카드를 발급하고, 출입 권한을 조정하고, 누군가 카드를 잃어버리면 정지시킬 수 있어. 하지만 빌딩의 소유권을 팔거나, 건물 전체의 전력을 내려버릴 수는 없지. 그건 여전히 마스터키를 가진 빌딩 소유주, 즉 루트 계정의 몫이야.”

그제야 솔라는 무릎을 쳤다.

“아! IAM 관리자는 다른 사용자나 그룹, 역할 같은 ‘권한’ 자체를 관리하는 역할이구나. 계정의 근간을 바꾸는 게 아니라!”

솔라는 ‘관리자’ 카드에 ‘IAM 사용자, 그룹, 역할 생성 및 관리’, ‘권한 정책 할당’이라고 적었다. 그리고 덧붙였다. ‘계정 삭제, 결제 수단 변경 등 루트 권한 작업은 불가.’

솔라는 자신이 직접 만든 세 장의 카드를 탁자 위에 나란히 펼쳐보았다. 개발자, 감사자, 관리자. 각기 다른 책임과 권한을 가진 세 개의 명확한 역할. 이것은 더 이상 뒤죽박죽 섞인 권한의 목록이 아니었다. 명확한 원칙에 따라 설계된 ‘책임 분리 설계도’였다.

“이제 알겠어. IAM은 그냥 사용자를 추가하는 기능이 아니었어. 각자의 역할을 정의하고, 그 역할에 딱 맞는 책임의 경계를 그려주는 설계 도구였네.”

솔라는 자신이 만든 카드들을 뿌듯하게 바라보았다. 막막하기만 했던 노트북 화면 속 권한 목록이 이제는 이 설계도에 맞춰 조립할 수 있는 부품들로 보였다. 솔라는 카드를 한 손에 든 채, 다른 손으로 노트북의 마우스를 잡았다. 더 이상 망설임은 없었다. 첫 번째 IAM 사용자를 생성하기 위해, ‘사용자 추가’ 버튼을 클릭했다.