일반적인 RDB의 경우, 설치와 동시에 root 비밀번호를 생성하고 즉시 인증 체계를 생성합니다. 그러나 mongod 커맨드를 입력하여 켤 수 있는 MongoDB Server는 기본적으로 보안 모델이 없이 실행됩니다. 따라서 별도의 인증 절차를 가지고 있지 않습니다. 이 때문에 2017년 1월에는 이런 약점을 노린 랜섬웨어가 발생하기도 했습니다. MongoDB는 되도록이면 외부로부터의 신뢰되지 않은 접속을 허용하지 않는, 보안에 문제가 되지 않는 환경에서 보안 모델 없이 실행하는 것을 지향하고 있으나, 어쨌든 MongoDB도 ID와 비밀번호로 접근하는 기본적인 보안 모델을 가지고 있으니 이를 통해 MongoDB Server에 인증 과정을 추가해 보도록 합시다.

관리자 계정 생성하기

mongod로 별도의 보안 모델이 없는 MongoDB Server를 실행하고, MongoDB Shell에 접속합니다.

> mongo
MongoDB shell version v3.6.3
connecting to: mongodb://127.0.0.1:27017
MongoDB server version: 3.6.3

MongoDB에는 admin이라는 데이터베이스가 존재하며, 해당 데이터베이스에 사용자를 추가합니다.

> use admin
> db.createUser({
    user: 'username',
    pwd: 'password',
    roles: ['userAdminAnyDatabase']
})

db.createUser()현재 사용하고 있는 데이터베이스(여기서는 admin)에 사용자를 추가합니다. 여기에는 사용자 이름, 비밀번호와 함께 권한(roles)을 array로 정의합니다. MongoDB에서 빌트인으로 제공하고 있는 권한은 MongoDB Built-In Roles에서 확인할 수 있습니다.

위에서 정의한 userAdminAnyDatabase어느 데이터베이스든 사용자를 생성하고 제거할 수 있다는 것을 의미합니다. 모든 권한을 가지게 하려면 root를 사용하면 되고, MongoDB 2.4 이하의 경우 db.addUser()를 통해 사용자를 추가합니다.

MongoDB Server 재시작하기

이제 MongoDB shell에서 빠져나와, 별도의 보안 모델을 가진 MongoDB Server를 실행하도록 합시다.

> mongod --auth

Ubuntu와 같은 리눅스 시스템에서 service mongod start처럼 service를 이용할 경우, config 파일을 통해 실행됩니다. 이 경우 /etc/mongod.conf를 다음처럼 수정하고 재시작(service mongod restart)하면 됩니다.

MongoDB 2.x

auth=true

MongoDB 3.x

security:
    authorization: enabled

admin 데이터베이스에 관리자 인증하기

두 가지 방법으로 데이터베이스에 인증을 진행할 수 있습니다. 첫 번째 방법은 쉘에 접속하여 db.auth()를 사용하는 것입니다.

> mongo
MongoDB shell version v3.6.3
connecting to: mongodb://127.0.0.1:27017
MongoDB server version: 3.6.3
...
> use admin
> db.auth('username', 'password')
1
>

위처럼 1이 나오면 성공입니다. 두 번째 방법은, 쉘에 접속하는 것과 동시에 인증을 거치는 것입니다.

> mongo -u username -p password --authenticationDatabase admin

test 데이터베이스로 접속되나, admin 데이터베이스에는 인증이 완료된 상태일 것입니다. 인증과 함께 admin 데이터베이스로 접근하려면, 명령어에 명시만 해 주면 됩니다.

> mongo admin -u username -p password --authenticationDatabase admin

일반 사용자 만들기

성공적으로 관리자 계정을 만들고 인증을 완료했으면, 일반 사용자를 만들도록 합시다. 관리자 계정을 만들었던 것처럼 계정을 만들고자 하는 데이터베이스를 use한 다음 db.createUser()를 실행하면 됩니다.

> use test_db
> db.createUser({
    user: 'username',
    pwd: 'password',
    roles: ['dbOwner']
})

dbOwner라는 권한은 해당 데이터베이스에 대한 모든 수정/삭제 권한을 가진다는 것을 의미합니다. 이번에도 db.auth()를 통해 인증을 진행해 봅시다.

> db.auth('username', 'password')
1
>

MongoDB 공식 매뉴얼의 'enable authentication' 문서가 많은 도움이 되었습니다.

'데이터베이스 > MongoDB' 카테고리의 다른 글

[MongoDB] Dump와 Resotre  (0) 2018.09.06

+ Recent posts