MongoDB의 인증, 권한 관리, 보안 설정을 정리합니다.

인증 활성화

MongoDB는 기본적으로 인증이 비활성화되어 있습니다. 운영 환경에서는 반드시 활성화해야 합니다.

초기 관리자 생성

// admin 데이터베이스에서 관리자 생성
use admin
db.createUser({
    user: "admin",
    pwd: "AdminPass123!",
    roles: [{ role: "userAdminAnyDatabase", db: "admin" }, "readWriteAnyDatabase"]
})

인증 활성화 (mongod.conf)

security:
  authorization: enabled
# 서비스 재시작
sudo systemctl restart mongod

인증 접속

mongosh -u admin -p AdminPass123! --authenticationDatabase admin
# 또는
mongosh "mongodb://admin:AdminPass123!@localhost:27017/admin"

사용자 관리

사용자 생성

use mydb
db.createUser({
    user: "devuser",
    pwd: "DevPass123!",
    roles: [
        { role: "readWrite", db: "mydb" }
    ]
})

// 여러 DB 권한
db.createUser({
    user: "appuser",
    pwd: "AppPass123!",
    roles: [
        { role: "readWrite", db: "production" },
        { role: "read", db: "analytics" }
    ]
})

사용자 조회/수정/삭제

// 사용자 목록
use admin
db.getUsers()

// 특정 사용자 정보
db.getUser("devuser")

// 비밀번호 변경
db.changeUserPassword("devuser", "NewPass456!")

// 역할 추가
db.grantRolesToUser("devuser", [{ role: "dbAdmin", db: "mydb" }])

// 역할 제거
db.revokeRolesFromUser("devuser", [{ role: "dbAdmin", db: "mydb" }])

// 사용자 삭제
db.dropUser("devuser")

내장 역할 (Built-in Roles)

데이터베이스 수준

역할 설명
read 읽기 전용
readWrite 읽기 + 쓰기
dbAdmin 인덱스, 통계, 컬렉션 관리
dbOwner readWrite + dbAdmin + userAdmin
userAdmin 사용자/역할 관리

클러스터 수준

역할 설명
clusterAdmin 클러스터 관리
clusterManager 클러스터 모니터링/관리
clusterMonitor 클러스터 모니터링 (읽기 전용)
hostManager 서버 관리

모든 데이터베이스

역할 설명
readAnyDatabase 모든 DB 읽기
readWriteAnyDatabase 모든 DB 읽기/쓰기
userAdminAnyDatabase 모든 DB 사용자 관리
dbAdminAnyDatabase 모든 DB 관리

슈퍼유저

역할 설명
root 모든 권한 (최고 관리자)

사용자 정의 역할

use admin
db.createRole({
    role: "appReadOnly",
    privileges: [
        {
            resource: { db: "mydb", collection: "" },  // 모든 컬렉션
            actions: ["find", "listCollections", "listIndexes"]
        }
    ],
    roles: []
})

// 사용자에게 커스텀 역할 부여
db.createUser({
    user: "reporter",
    pwd: "ReportPass!",
    roles: [{ role: "appReadOnly", db: "admin" }]
})

네트워크 보안

mongod.conf 설정

# 바인드 주소 제한
net:
  port: 27017
  bindIp: 127.0.0.1,192.168.1.100    # 특정 IP만 허용
  # bindIp: 0.0.0.0                   # 모든 인터페이스 (주의)

# TLS/SSL 활성화
net:
  tls:
    mode: requireTLS
    certificateKeyFile: /etc/ssl/mongodb.pem
    CAFile: /etc/ssl/ca.pem

방화벽 설정

# Ubuntu (ufw)
sudo ufw allow from 192.168.1.0/24 to any port 27017

# CentOS (firewalld)
sudo firewall-cmd --permanent --add-rich-rule='rule family="ipv4" source address="192.168.1.0/24" port port="27017" protocol="tcp" accept'

보안 체크리스트

항목 설명
인증 활성화 authorization: enabled
강력한 비밀번호 복잡도 높은 비밀번호 사용
최소 권한 원칙 필요한 권한만 부여
네트워크 제한 bindIp로 접근 IP 제한
TLS/SSL 전송 암호화
감사 로그 Enterprise에서 감사 로그 활성화
포트 변경 기본 27017 대신 다른 포트 사용
최신 버전 유지 보안 패치 적용

관련된 글 (mongodb > lecture-mongodb)