MongoDB 보안 강화 (권한 부여, TLS, 역할, 감사)
MongoDB난이도: 고급소요 시간: 10분(점검) – 2시간(전체 보안 강화)운영 중인 MongoDB(단일 서버, 레플리카 세트 또는 샤드 클러스터)를 무중단으로 보안 강화하는 시나리오 기반 runbook입니다. 읽기 전용 보안 점검, keyFile + transitionToAuth를 이용한 롤링 권한 부여, 최소 권한 custom role과 사용자, SCRAM-SHA-256, bindIp와 방화벽, allowTLS → preferTLS → requireTLS 전환, x.509 멤버 인증, 감사 로그(Enterprise/Percona), encryption at rest를 다루며, 마지막에 점검을 다시 실행해 위험이 해소되었음을 확인합니다. 이 사이트의 설치 가이드로 구축한 시스템에서는 권한 부여와 keyfile이 이미 활성화되어 있으므로 점검부터 시작해 RISK가 나온 시나리오만 적용하십시오. 일상 운영과 백업은 별도의 MongoDB 가이드에서 다룹니다.
구성: 단일 서버, 3개 이상 멤버의 레플리카 세트 또는 샤드 클러스터
시나리오
- 보안 상태 점검 (읽기 전용) — 아무것도 변경하지 않습니다. 인증 없는 접근, 수신 대기 주소, TLS, 인증 메커니즘, 고권한 사용자, 감사 및 encryption at rest 상태를 OK / WARN / RISK로 보고합니다. 어디서 시작해야 할지 모르면 이 항목을 선택하십시오.
- 전체 보안 강화 (모두 순서대로) — 점검 → internal auth + 권한 부여(transitionToAuth로 무중단) → 최소 권한 사용자 → SCRAM-SHA-256 → bindIp/방화벽 → TLS(allowTLS → preferTLS → requireTLS) → 감사(Enterprise/Percona) → 최종 점검. 레플리카 세트에서는 롤링으로 진행하며, 위험한 단계마다 확인을 요청합니다.
- 권한 부여 비활성: authorization 활성화 (keyFile, 무중단) — 누구나 사용자 이름과 비밀번호 없이 접속할 수 있습니다. 레플리카 세트와 샤드 클러스터에서는 keyFile + transitionToAuth로 롤링, 무중단 활성화하며, 단일 서버에서는 짧은 재시작이 한 번 필요합니다.
- 최소 권한 사용자와 custom role (애플리케이션, 백업, 모니터링) — 애플리케이션이 root 또는 공용 관리자 계정으로 접속하고 있습니다. 애플리케이션에 자신의 데이터베이스에서 필요한 작업만 허용하는 custom role과 백업·모니터링용 별도 사용자를 생성하고, cron/애플리케이션 측에서 비밀번호를 안전하게 보관하는 방법을 보여 줍니다.
- SCRAM-SHA-1 비활성화, SCRAM-SHA-256만 사용 — 기존 사용자의 자격 증명이 SHA-1로 저장되어 있거나 점검에서 SCRAM-SHA-1이 활성화된 것으로 나왔습니다. 사용자를 SHA-256으로 이전한 뒤 롤링 재시작으로 authenticationMechanisms를 좁힙니다.
- 네트워크 접근 제한 (bindIp 0.0.0.0, 방화벽) — mongod가 모든 인터페이스(0.0.0.0, bindIpAll)에서 수신 대기하거나 포트가 모두에게 열려 있습니다. bindIp를 localhost + 서버의 내부 IP로 줄이고, 방화벽은 멤버와 애플리케이션 네트워크만 허용합니다. 롤링, 무중단.
- 연결 암호화: TLS (allowTLS → preferTLS → requireTLS) — 애플리케이션과 멤버 사이, 멤버 간 트래픽이 암호화되지 않습니다. 인증서를 배포하고, 멤버를 먼저 롤링 재시작으로 allowTLS로 전환한 뒤 운영 중에 preferTLS로, 애플리케이션 준비가 끝나면 requireTLS로 올립니다. 선택 사항: 멤버 간 x.509 인증.
- 감사 로그 활성화 (Enterprise / Percona) — 누가 언제 로그인했는지, 사용자/역할 변경과 drop 작업을 기록해야 합니다. MongoDB Enterprise와 Percona Server for MongoDB에서는 auditLog로 활성화하며, Community에는 이 기능이 없습니다(대안을 안내합니다).
- Encryption at rest (디스크의 데이터 암호화) — 디스크나 백업을 도난당해도 데이터를 읽을 수 없어야 합니다. Enterprise/Percona에서는 멤버를 하나씩 initial sync로 다시 구축하여 WiredTiger 암호화를 활성화하고, Community에서는 데이터 디스크를 LUKS로 암호화합니다.
시작하기 전에
- 모든 mongod… 및 mongos… 서버에 대한 root/sudo 권한, 첫 번째 서버에서 다른 서버로의 SSH(keyfile과 인증서 복사용).
- …레플리카 세트가 정상: 모든 멤버가 PRIMARY/SECONDARY이고 지연이 낮습니다. 비정상 클러스터에서는 롤링 작업을 하지 않습니다.…mongod가 실행 중입니다.…
- 애플리케이션 목록과 담당자: 권한 부여/TLS가 필수가 되기 전에 각 애플리케이션의 연결 문자열을 변경해야 합니다. 연결 문자열에는 모든 멤버와 replicaSet=이 포함되어야 합니다(롤링 중 연결이 끊기지 않도록).
- 유지보수 윈도: 롤링 작업은 무중단이지만 primary가 바뀔 때마다 쓰기가 몇 초 대기합니다. 단일 서버에서 권한 부여/TLS를 활성화하면 짧은 중단이 필요합니다.
- 샤드 클러스터에서 권한 부여가 이미 활성화되어 있다면, 각 shard의 primary에 mongos의 …와 같은 이름과 비밀번호를 가진 shard-local 사용자(root)가 있어야 합니다. 멤버 단위 단계(롤링 재시작의 rs.stepDown, setParameter, 점검)는 shard 멤버에 직접 접속하며, mongos 사용자는 그곳에서 유효하지 않습니다. 확인: shard 멤버에서 mongosh --port <shard port>로 접속해 db.getSiblingDB("admin").auth("…", passwordPrompt()).
- 복원 테스트를 마친 최신 전체 백업.
- 감사와 encryption at rest를 위한 MongoDB Enterprise 라이선스 또는 Percona Server for MongoDB. Community에는 이 기능이 없습니다.
- 모든 서버에서 멤버 이름이 해석됨(DNS 또는 /etc/hosts). TLS에서는 이 이름으로 접속합니다.
가이드 단계
- 준비: 안전망과 보조 도구 — 설정과 상태 백업 · PyYAML 설치 · YAML 편집 도구 작성 (dbatlas-yaml) · 롤링 재시작 도구 작성 (dbatlas-mongod-restart) · 관리자 비밀번호를 임시 파일에 기록
- 상태 점검 (읽기 전용) — 네트워크, 프로세스, 파일 권한: … · 네트워크와 프로세스: … · 권한 부여, TLS, 파라미터: … · 권한 부여, TLS, 파라미터: … · 사용자, 역할, 인증 메커니즘 · 점검 결과를 시나리오에 매핑
- 권한 부여: 진단과 keyfile — 진단: 권한 부여가 정말 비활성인가? · 애플리케이션 연결 목록 작성 · keyfile 생성 · keyfile을 다른 서버로 복사 · keyfile 권한: … · keyfile 권한: …
- 권한 부여: 관리자 사용자 — 관리자 사용자 생성 (…) · shard-local 관리자: …
- 최소 권한 사용자와 custom role — 애플리케이션용 custom role 생성 (…@…) · 애플리케이션 사용자 생성 (…) · 백업 및 모니터링 사용자 · 최소 권한 검증 (…) · 애플리케이션과 cron 측에서 비밀번호 안전하게 보관
- 권한 부여: 인증 없는 연결이 남지 않았는지 확인 — 인증 없는 클라이언트 연결: …
- 권한 부여 강제 적용 (단일 서버) — authorization: enabled · 서비스 안전 재시작 (…)
- 권한 부여: 검증 — 인증 없는 접근이 거부되는가? · 최소 권한 검증 (…) · 롤백 경로 (필요 시)
- SCRAM-SHA-256: 사용자 이전 — SHA-1 자격 증명이 있는 사용자 · 사용자를 SCRAM-SHA-256만으로 축소
- SCRAM-SHA-256: 검증 — SHA-1 로그인이 거부되는가?
- 네트워크 접근: 방화벽 — 방화벽 규칙
- 네트워크 접근: 검증 — 수신 대기 주소: …
- TLS: 인증서 — 현재 TLS 상태 · 내부 CA와 서버 인증서 생성 · 인증서 배포 · 인증서 권한과 검증: … · 인증서 권한: …
- TLS: 애플리케이션 전환 — 애플리케이션을 TLS로 전환하고 TLS 연결 수 확인
- TLS: 검증 — 비 TLS 연결이 거부되는가: …
- 감사 로그: 사전 점검 — 이 mongod가 감사를 지원하는가: …
- 감사 로그: 검증과 로테이션 — 감사 레코드가 기록되는가: … · Community 대안: 인증 로그 모니터링
- Encryption at rest: 사전 점검과 백업 — 암호화 지원과 디스크 공간: … · 전체 백업을 받았습니까?
- Encryption at rest: 테스트 마커 — 평문 마커 기록
- Encryption at rest (Community): LUKS 데이터 디스크 — LUKS 디스크 준비: … · 데이터를 암호화 디스크로 이동: …
- 최종 점검 (보안 강화 후) — 네트워크, 프로세스, 파일 권한: … (최종 상태) · 네트워크와 프로세스: … (최종 상태) · 권한 부여, TLS, 파라미터: … (최종 상태) · 권한 부여, TLS, 파라미터: … (최종 상태) · 사용자, 역할, 인증 메커니즘 (최종 상태)
- 정리와 후속 작업 — 임시 비밀번호 파일 삭제 · 후속 작업: 모니터링과 주기 작업