지금까지 MongoDB의 기본 사용법부터 복제 세트를 통한 고가용성 확보, 샤딩을 통한 대규모 데이터 처리 방법까지 정말 많은 것을 배웠습니다.
하지만 우리가 애써 구축하고 저장한 소중한 데이터가 안전하게 보호되지 않는다면 모든 노력이 물거품이 될 수 있습니다.
데이터베이스 보안은 아무리 강조해도 지나치지 않습니다. 권한 없는 접근으로부터 데이터를 보호하고, 중요한 정보가 유출되거나 손상되는 것을 막아야 합니다.
MongoDB는 이를 위해
인증
,
권한 부여
,
암호화
등 다양한 보안 장치를 제공합니다.
🚀
1. 인증 (Authentication) 🔗
인증은 데이터베이스에 접속하려는 사용자가
정말로 자신이 주장하는 그 사용자인지 확인
하는 과정입니다.
놀랍게도, MongoDB를 처음 설치하면 기본적으로
인증 기능이 활성화되어 있지 않습니다
.
오류 발생
👍
데이터베이스에 대한 접근 제어가 활성화되어 있지 않습니다. 데이터와 설정에 대한 읽기 및 쓰기 접근이 무제한입니다.
즉, 네트워크를 통해 MongoDB 서버에 접속할 수 있는 사람이라면 누구나 특별한 제약 없이 데이터에 접근할 수 있다는 의미입니다.
이는 개발 환경에서는 편리할 수 있지만, 실제 운영 환경에서는 매우 위험한 상태입니다. 따라서 운영 환경에서는 반드시 인증 기능을 활성화해야 합니다.
➡️
첫 관리자 사용자 생성 절차 (인증 활성화 전 또는 로컬호스트 예외 사용 시) 🔗
인증 없이 MongoDB 서버를 시작합니다. (또는 localhost
예외가 활성화된 상태로 접속)
admin
데이터베이스에 접속하여 userAdminAnyDatabase
역할을 가진 사용자를 생성합니다.
// mongosh
use admin
db. createUser ({
user: "myAdminUser" ,
pwd: passwordPrompt (), // 비밀번호를 안전하게 입력받음
roles: [ { role: "userAdminAnyDatabase" , db: "admin" } ]
})
이제 myAdminUser
사용자는 다른 사용자들을 관리할 수 있는 강력한 권한을 갖게 됩니다.
어드민 유저 설정
이제 인증을 활성화하려면 MongoDB 설정 파일(보통 mongod.conf
또는 mongod.cfg
)을 수정하거나, 서버 실행 시 옵션을 추가해야 합니다.
security :
authorization : enabled
또는 서버 실행 시 --auth
옵션을 추가합니다.
mongod --auth --port 27017 --dbpath /data/db # 기타 필요한 옵션들과 함께
mongosh 에 접속할 때도 --authenticationDatabase
옵션을 사용하여 인증할 데이터베이스를 지정할 수 있습니다.
mongosh --port 27017 -u < usernam e > -p < passwor d > --authenticationDatabase admin
✅
SCRAM: MongoDB의 기본 인증 방식 🔗
MongoDB는 기본적으로
SCRAM(Salted Challenge Response Authentication Mechanism)
이라는 인증 방식을 사용합니다.
SCRAM은 비밀번호를 직접 네트워크로 전송하지 않고, 서버와 클라이언트 간의 질의-응답 과정을 통해 안전하게 인증을 수행하는 방식입니다.
관리자 사용자를 만든 후에는, 필요에 따라 다양한 권한을 가진 일반 사용자들을 생성하고 관리할 수 있습니다.
use myAppDB // 사용자를 생성할 데이터베이스로 전환
db. createUser ({
user: "appUser" ,
pwd: passwordPrompt (),
roles: [
{ role: "readWrite" , db: "myAppDB" }, // myAppDB에 대한 읽기/쓰기 권한
{ role: "read" , db: "logsDB" } // logsDB에 대한 읽기 권한
]
})
사용자 정보 보기
:
db.getUsers()
또는
db.getUser("username")
사용자 정보 수정 (db.updateUser
)
: 역할 변경, 비밀번호 변경 등
사용자 삭제 (db.dropUser
)
:
db.dropUser("username")
인증 과정 흐름도
🚀
2. 권한 부여 (Authorization) 🔗
인증을 통해 사용자의 신원이 확인되었다면, 다음 단계는 해당 사용자에게
어떤 작업을 허용할지 결정
하는 것입니다.
이것이 바로 권한 부여, 즉 Authorization입니다.
MongoDB는
RBAC(Role-Based Access Control, 역할 기반 접근 제어)
모델을 사용합니다.
RBAC는 사용자에게 직접 권한을 하나하나 부여하는 대신,
역할(Role)
을 정의하고 사용자에게 역할을 할당하는 방식입니다.
역할에는 특정 자원(데이터베이스, 컬렉션 등)에 대한 특정 행동(읽기, 쓰기, 생성 등)의 집합인
권한(Privilege)
이 포함됩니다.
RBAC 개념도
✅
MongoDB 내장 역할 (Built-in Roles) 🔗
MongoDB는 자주 사용되는 권한 조합을 미리 정의해 놓은 다양한 내장 역할을 제공합니다.
read
: 지정된 데이터베이스의 모든 컬렉션에서 데이터를 읽을 수 있는 권한.
readWrite
: 지정된 데이터베이스의 모든 컬렉션에서 데이터를 읽고 쓸 수 있는 권한.
dbAdmin
: 데이터베이스 관리 작업(인덱스 생성, 컬렉션 관리 등) 수행 권한. (데이터 읽기/쓰기 권한은 포함하지 않음)
userAdmin
: 해당 데이터베이스의 사용자 및 역할 관리 권한.
➡️
클러스터 관리자 역할 (admin 데이터베이스에 정의됨) 🔗
clusterAdmin
: 복제 세트, 샤딩 등 클러스터 전체 관리 작업 권한.
userAdminAnyDatabase
: 모든 데이터베이스의 사용자 및 역할 관리 권한. (첫 관리자에게 부여했던 역할)
readAnyDatabase
, readWriteAnyDatabase
등.
➡️
모든 데이터베이스에 대한 슈퍼유저 역할 🔗
root
(매우 강력한 권한이므로 신중하게 사용해야 합니다).
✅
사용자 정의 역할 (Custom Roles) 🔗
내장 역할만으로는 필요한 권한을 세밀하게 제어하기 어렵다면, 직접 역할을 만들 수 있습니다. db.createRole()
명령어를 사용합니다.
use myAppDB
db. createRole ({
role: "inventoryManager" ,
privileges: [
{ resource: { db: "myAppDB" , collection: "products" }, actions: [ "find" , "update" , "insert" ] },
{ resource: { db: "myAppDB" , collection: "orders" }, actions: [ "find" ] }
],
roles: [ // 다른 역할 상속 가능
// { role: "read", db: "myAppDB" } // 예시: read 역할 상속
]
})
이제 inventoryManager
역할을 사용자에게 부여하면, 해당 사용자는 myAppDB
의 products
컬렉션에는 읽기/쓰기/삽입 작업을, orders
컬렉션에는 읽기 작업만 수행할 수 있게 됩니다.
인증과 권한 부여를 통해 허가된 사용자만 데이터에 접근하고 작업을 수행하도록 만들었다면, 이제 데이터 자체를 보호하는 방법에 대해 알아봅시다.
암호화는 데이터를 권한 없는 사람이 보더라도 그 내용을 알 수 없도록 만드는 기술입니다.
MongoDB는 크게 두 가지 종류의 암호화를 지원합니다.
✅
3.1. 저장 데이터 암호화 (Encryption at Rest) 🔗
데이터가 디스크에 저장될 때 암호화하는 방식입니다. 만약 물리적인 디스크나 백업 파일이 유출되더라도, 암호화 키 없이는 데이터를 해독할 수 없습니다.
Encryption at Rest
✅
3.2. 전송 중 데이터 암호화 (Encryption in Transit - TLS/SSL) 🔗
클라이언트와 MongoDB 서버 간, 또는 MongoDB 복제 세트/샤드 클러스터 멤버 간에 네트워크를 통해 데이터가 전송될 때, 중간에서 데이터를 가로채더라도 내용을 알 수 없도록 암호화하는 방식입니다.
TLS(Transport Layer Security)
또는 그 이전 버전인
SSL(Secure Sockets Layer)
프로토콜을 사용합니다.
MongoDB 설정 파일에서 net.ssl
관련 옵션을 설정하여 활성화할 수 있습니다.
net :
port : 27017
bindIp : 0.0.0.0 # 실제 운영 환경에서는 특정 IP 또는 호스트명 권장
ssl :
mode : requireSSL # 또는 preferSSL, allowSSL
PEMKeyFile : /etc/ssl/mongodb.pem # 서버 인증서와 개인 키가 포함된 파일
CAFile : /etc/ssl/ca.pem # 신뢰하는 인증 기관(CA)의 인증서 파일 (클라이언트 인증 시 필요)
# clusterFile, clusterPassword 등의 옵션도 클러스터 내부 통신 암호화 시 사용
mode
: TLS/SSL 사용 정책 (disabled
, allowSSL
, preferSSL
, requireSSL
). 운영 환경에서는 requireSSL
사용을 강력히 권장합니다.
PEMKeyFile
: 서버의 공개 인증서와 암호화된 개인 키를 포함하는 PEM 형식 파일 경로입니다.
CAFile
: 클라이언트 인증서의 유효성을 검사할 때 사용할 CA 인증서 파일 경로입니다.
복제 세트 멤버 간, 샤드 클러스터 구성 요소(몽고스, 컨피그 서버, 샤드) 간의 내부 통신도 반드시 TLS/SSL로 암호화해야 안전합니다.
TLS/SSL
위에서 설명한 핵심 기능 외에도 다음과 같은 보안 수칙을 지키는 것이 중요합니다.
오늘은 MongoDB 데이터를 안전하게 보호하기 위한 세 가지 핵심 기둥인
인증(Authentication)
,
권한 부여(Authorization)
, 그리고
데이터 암호화(Encryption)
에 대해 자세히 알아보았습니다.
인증을 통해 신원을 확인하고, 역할 기반 접근 제어(RBAC)를 통해 적절한 권한을 부여하며, 저장되거나 전송되는 데이터를 암호화함으로써 다층적인 보안 체계를 구축할 수 있습니다.
다음 시간에는 MongoDB와 함께 사용할 수 있는 유용한
툴 및 유틸리티
에 대해 알아보겠습니다. MongoDB Compass GUI부터 백업/복원 도구까지, 개발과 운영에 도움이 되는 도구들을 살펴보겠습니다.