지금 바로 구현해야 할 5가지 필수 MongoDB 보안 구성
인증, 최소 권한 역할, 네트워크 바인딩, TLS, 감사 로깅 확인을 통해 MongoDB를 안전하게 보호하세요.
지금 바로 구현해야 할 MongoDB 보안 구성 5가지
MongoDB 보안 문제는 대개 간단한 실수에서 시작됩니다. 데이터베이스가 있어서는 안 되는 곳에서 수신 대기하거나, 허용해서는 안 되는 사용자를 받아들이거나, 암호화 없이 트래픽을 전송하는 경우입니다. MongoDB 구성에는 명시적인 인증, 세분화된 역할, 프라이빗 네트워크 노출, TLS 및 유용한 감사 기록이 필요합니다.
이 가이드는 무단 액세스 가능성을 줄이고 의심스러운 활동을 더 쉽게 조사할 수 있도록 하는 5가지 프로덕션 확인 사항을 보여줍니다.
1. 필수 액세스 제어 및 강력한 인증 활성화
먼저 권한 부여가 활성화되어 있는지 확인하세요. 권한 부여가 없으면 서버에 도달할 수 있는 클라이언트가 배포 시작 및 구성 방식에 따라 데이터를 읽거나 변경할 수 있습니다.
인증 활성화 방법
인증은 일반적으로 시작 시 구성 파일(mongod.conf) 또는 명령줄 플래그를 통해 활성화됩니다.
구성 파일 (/etc/mongod.conf):
# /etc/mongod.conf 스니펫
security:
authorization: enabled
명령줄:
mongod --auth --dbpath /var/lib/mongodb
관리자 사용자 생성
권한 부여를 활성화하기 전에 첫 번째 관리 사용자를 생성하거나 초기 설정 중에 MongoDB의 localhost 예외를 사용하세요. 첫 번째 사용자가 생성된 후 권한 부여를 활성화한 상태로 다시 시작하고 모든 액세스에 명명된 계정을 사용하세요.
예시: mongosh를 통해 루트 사용자 생성
먼저 데이터베이스에 연결합니다(이미 인증 없이 실행 중이거나 localhost 예외를 사용하는 경우):
use admin
db.createUser(
{
user: "mongoAdmin",
pwd: passwordPrompt(), // 안전하게 비밀번호 입력 요청
roles: [ { role: "root", db: "admin" } ]
}
)
경고: 항상 비밀 관리자에 저장된 강력한 비밀번호를 사용하세요. 스크립트나 구성 파일에 중요한 자격 증명을 하드코딩하지 마세요.
2. 세분화된 역할 기반 액세스 제어(RBAC) 구현
인증을 활성화한 후 다음 단계는 최소 권한 원칙(PoLP) 을 수립하는 것입니다. 이는 모든 사용자, 애플리케이션 및 서비스 계정이 필요한 작업을 수행하는 데 필요한 최소한의 권한만 가져야 함을 의미합니다.
애플리케이션 연결에는 root 또는 readWriteAnyDatabase 역할을 사용하지 마세요. 대신 특정 데이터베이스 또는 컬렉션에 대한 특정 권한을 부여하는 사용자 지정 역할을 정의하세요.
실용적인 RBAC 단계
- 사용자 지정 역할 정의: 기본 제공 역할(
read,readWrite)이 충분하지 않은 경우 세분화된 액세스 작업(예: 특정 컬렉션에 대한insert및find만)으로 역할을 생성하세요. - 애플리케이션 사용자 분리: 다양한 애플리케이션 계층에 대한 전용 사용자를 생성하세요(예: 백엔드용
app_rw, 분석용reporting_ro). - 외부 도구 액세스 제한: 관리 도구가 꼭 필요한 경우에만 권한 있는 계정을 사용하여 연결하도록 하세요.
예시: 특정 데이터베이스에 대한 읽기 전용 사용자 생성
use users_db
db.createUser(
{
user: "reporting_svc",
pwd: passwordPrompt(),
roles: [ { role: "read", db: "users_db" } ] // users_db에 대한 읽기 전용 액세스
}
)
3. 엄격한 네트워크 바인딩 및 방화벽 구성
네트워크 구성은 데이터베이스의 경계 방어입니다. 많은 패키지화된 MongoDB 설치가 기본적으로 localhost에 바인딩되지만, 컨테이너 이미지, 사용자 지정 명령줄 및 복사된 구성 파일이 0.0.0.0을 노출할 수 있습니다. 기본값이 안전하다고 가정하지 말고 항상 유효한 bindIp를 확인하세요.
bindIp 제한
주요 보안 조치는 구성 파일에서 bindIp 설정을 정의하는 것입니다. 이는 MongoDB가 수신 대기해야 하는 IP 주소 또는 호스트 이름을 명시적으로 지정합니다.
구성 파일 (/etc/mongod.conf):
# 바인딩할 IP 또는 호스트 이름 목록
# 로컬 액세스 전용인 경우 127.0.0.1 사용
# 애플리케이션 서버에서만 액세스하려면 내부 IP 사용
net:
port: 27017
bindIp: 127.0.0.1, 10.0.1.5, localhost
외부 방화벽 구현(보안 그룹)
bindIp(MongoDB 프로세스를 제한함) 외에도 외부 방화벽(iptables, AWS 보안 그룹 또는 Azure 네트워크 보안 그룹 등)을 사용하여 서버에 도달하기 전에 트래픽을 필터링해야 합니다.
모범 사례: 애플리케이션 서버, 로드 밸런서 및 관리 점프 박스에서만 MongoDB 포트(기본값 27017)에 대한 인바운드 트래픽을 허용하세요.
4. 전송 중 데이터 암호화(TLS) 적용
클라이언트, 셸, 드라이버 및 MongoDB 간에 전송되는 데이터는 TLS(전송 계층 보안)로 암호화되어야 합니다. 암호화되지 않은 연결을 통해 자격 증명, 쿼리 및 결과를 전송하면 도청 및 중간자 공격에 데이터가 노출됩니다.
MongoDB는 암호화된 트래픽과 선택적 클라이언트 인증서 유효성 검사 모두를 위한 기본 TLS 구성을 지원합니다.
TLS 활성화
암호화를 활성화하려면 유효한 TLS 인증서를 생성하거나 획득하고 구성 파일에서 해당 위치를 지정해야 합니다.
구성 파일 (/etc/mongod.conf):
net:
tls:
mode: requireTLS
# 결합된 인증서 및 키 파일 경로
certificateKeyFile: /etc/ssl/mongodb.pem
# 인증 기관 파일 경로(클라이언트 유효성 검사용)
CAFile: /etc/ssl/ca.pem
TLS를 사용한 클라이언트 연결
서버가 TLS를 요구하면 모든 클라이언트는 적절한 보안 플래그를 사용하여 연결해야 합니다:
mongosh "mongodb://[email protected]/admin?authSource=admin" --tls --tlsCAFile /path/to/ca.pem
팁: 프로덕션에서는
mode: requireTLS를 사용하여 모든 연결이 보호되도록 하세요.preferTLS모드는 일반적으로 마이그레이션 또는 테스트 중에만 사용됩니다.
5. 감사 활성화 및 활동 로그 모니터링
강력한 액세스 제어 및 암호화가 있어도 손상된 내부 계정 또는 권한 상승으로 인해 보안 위협이 발생할 수 있습니다. 포괄적인 감사를 활성화하면 규정 준수, 법의학 분석 및 의심스러운 행동 탐지에 중요한 작업 기록을 제공합니다.
MongoDB의 감사 기능은 관리 작업, 인증 시도, 권한 부여 실패 및 선택된 데이터 작업을 기록할 수 있습니다. 가용성은 MongoDB 에디션 또는 플랫폼에 따라 다릅니다. 예를 들어, 감사는 MongoDB Enterprise 및 MongoDB Atlas에서 사용할 수 있는 반면, 자체 관리형 Community 배포는 다른 로깅 및 모니터링 접근 방식이 필요합니다.
감사 구성
감사는 구성 파일의 auditLog 섹션을 통해 구성됩니다. 대상(파일, syslog, 콘솔) 및 필터 기준을 지정할 수 있습니다.
구성 파일 (/etc/mongod.conf):
auditLog:
destination: file
path: /var/log/mongodb/audit.log
format: JSON
# 인증 및 관리 변경과 같은 주요 보안 이벤트에 초점
filter: '{ atype: { $in: [ "authenticate", "authCheck", "createCollection", "createUser", "dropDatabase" ] } }'
필수 모니터링 중점 영역
- 실패한 인증 시도: 갑작스러운 증가는 잠재적인 무차별 대입 공격을 나타냅니다.
- 사용자/역할 생성/삭제: 모든 권한 변경은 기록되고 검토되어야 합니다.
- 데이터베이스 또는 컬렉션 삭제: 파괴적인 작업에 대해 즉시 알림이 필요합니다.
MongoDB 감사 로그를 Splunk, Elastic Stack 또는 Datadog과 같은 중앙 집중식 로그 관리 시스템과 통합하여 알림 및 보존을 수행하세요.
결론
모든 MongoDB 배포 중에 다음 5가지 제어 사항을 검토하세요: 권한 부여가 활성화되어 있고, 애플리케이션 사용자에게 세분화된 역할이 있으며, bindIp 및 방화벽이 네트워크 액세스를 제한하고, 클라이언트가 TLS를 요구하며, 보안 이벤트가 모니터링 시스템으로 전달됩니다. 이러한 확인 사항이 백업, 패치 또는 비밀번호 교체를 대체하지는 않지만, 가장 일반적인 구성 격차를 먼저 해소합니다.