MongoDB 인증 및 권한 모델
MySQL과 같은 전통적인 RDBMS와 달리 MongoDB의 사용자 계정과 권한은 인스턴스 전체가 아닌 특정 데이터베이스 단위로 종속됩니다. 따라서 보안을 강화하려면 각 데이터베이스별로 적절한 권한을 가진 사용자를 개별적으로 생성해야 합니다.
1. 전역 관리자 계정 생성
가장 먼저 전체 데이터베이스의 사용자를 관리할 수 있는 루트급 관리자 계정을 생성해야 합니다. MongoDB에는 기본적으로 admin 데이터베이스가 존재하지 않을 수 있지만, use admin 명령어를 통해 생성 및 접근이 가능합니다.
// admin 데이터베이스 컨텍스트로 전환
use admin
// 전역 사용자 관리자 계정 생성
db.createUser({
user: "globalAdmin",
pwd: "Adm1n$ecureP@ss",
roles: [
{ role: "userAdminAnyDatabase", db: "admin" }
]
})
위 코드에서 userAdminAnyDatabase 역할은 모든 데이터베이스에 대해 사용자 생성 및 관리 권한을 부여합니다.
2. 주요 내장 역할(Built-in Roles) 가이드
MongoDB는 세분화된 접근 제어를 위해 다양한 내장 역할을 제공합니다.
- 데이터베이스 사용자 역할:
read(읽기 전용),readWrite(읽기 및 쓰기) - 데이터베이스 관리 역할:
dbAdmin(인덱스 및 통계 관리),dbOwner(해당 DB의 모든 권한),userAdmin(사용자 관리) - 클러스터 관리 역할:
clusterAdmin,clusterManager,clusterMonitor,hostManager - 백업 및 복원 역할:
backup,restore - 전역 데이터베이스 역할:
readAnyDatabase,readWriteAnyDatabase,userAdminAnyDatabase,dbAdminAnyDatabase(모두adminDB에서만 할당 가능) - 슈퍼 유저 역할:
root(최상위 권한)
3. 계정 인증 테스트
생성한 계정이 정상적으로 작동하는지 db.auth() 메서드를 통해 검증할 수 있습니다.
// 인증 시도 (성공 시 1, 실패 시 0 반환)
db.auth("globalAdmin", "Adm1n$ecureP@ss")
4. 보안 인증 활성화 및 서비스 재시작
계정을 생성한 후, MongoDB 설정 파일에서 인증(Authentication) 기능을 활성화해야 합니다.
# /etc/mongod.conf 파일 수정
sudo nano /etc/mongod.conf
설정 파일에서 security 블록의 주석을 해제하고 authorization을 enabled로 변경합니다. YAML 문법 특성상 들여쓰기에 유의해야 합니다.
security:
authorization: enabled
설정 적용을 위해 MongoDB 데몬을 재시작합니다.
sudo systemctl restart mongod
5. 서비스용 데이터베이스 및 사용자 생성
이제 전역 관리자로 로그인하여 실제 서비스에서 사용할 데이터베이스와 전용 계정을 생성합니다.
// admin DB에서 전역 관리자 인증
use admin
db.auth("globalAdmin", "Adm1n$ecureP@ss")
// 새로운 비즈니스 데이터베이스로 전환
use inventoryDB
// 데이터베이스 소유자(dbOwner) 계정 생성
// 인덱스 생성, 컬렉션 삭제 등 해당 DB의 모든 관리 권한 보유
db.createUser({
user: "inventoryManager",
pwd: "M@nagerP@ss2023",
roles: [ { role: "dbOwner", db: "inventoryDB" } ]
})
// 애플리케이션 연결용 읽기/쓰기 계정 생성
// 데이터 CRUD 작업만 가능하며 스키마 변경 등은 불가
db.createUser({
user: "appReadWrite",
pwd: "AppS3rviceP@ss",
roles: [ { role: "readWrite", db: "inventoryDB" } ]
})
6. 애플리케이션 연결 문자열(URI)
생성된 읽기/쓰기 전용 계정을 사용하여 애플리케이션에서 MongoDB에 접속할 때는 다음과 같은 URI 형식을 사용합니다.
mongodb://appReadWrite:AppS3rviceP@ss@localhost:27017/inventoryDB