Recommanded Free YOUTUBE Lecture: <% selectedImage[1] %>

MongoDB 인증

MongoDB의 기본 실행 설정은 "NoAuth"이다. 설정의 "auth=true"가 주석처리됐다.
$ cat /etc/mongodb.conf
....
# auth = true
....
네트워크에 접근만 가능하다면, 누구든 데이터베이스에 접근 할 수 있다. 사설 네트워크라고 하더라도 취약점이 있을 수 있고 특히 내부 사용자일 경우 마음대로 접근 할 수 있으므로(보안사고는 "내부"에서 부터 시작된다.) 역시 접근 보안 설정은 해줘야 겠다.

User Administrator

접근제어를 위해서는 데이터베이스에 "userAdmin"이나 "userAdminAnyDatabase"역할을 가진 사용자가 있어야 한다. 이 사용자는 사용자의 생성, 역할 할당과 취소, 데이터베이스에 대한 권한 설정들을 할 수 있는 어드민 계정이다.

먼저 접근제어가 없는 상태로 몽고디비를 실행한다. 몽고디비 설정 파일의 "auth=true"을 주석처라하고 service restart 하거나, 쉘에서 직접 실행한다.
$ mongod --port 27017 --dbpath /home/mongo
mongo 쉘을 이용해서 몽고디비에 연결한다.
$ mongo --port 27017

이제 어드민 유저를 만든다. 어드민 유저는 userAdminAnyDatabase룰을 가진다. 나는 "yundream"이라는 어드민 계정 "admin" 데이터베이스에 추가했다.
> use admin
switched to db admin
> db.createUser(
...   {
...     user: "yundream",
...     pwd: "asdf!@#$",
...     roles: [ { role: "userAdminAnyDatabase", db: "admin" } ]
...   }
... )
Successfully added user: {
	"user" : "yundream",
	"roles" : [
		{
			"role" : "userAdminAnyDatabase",
			"db" : "admin"
		}
	]
}

몽고디비를 auth 모드로 재 시작한다. 주석을 풀고 service restart 하거나 --auth 옵션을 주고 실행한다.
$ mongod --auth --port 27017 --dbpath /home/mongo

관리자 계정으로 접근해보자.
$ mongo -u "yundream" -p 'asdf!@#$' --authenticationDatabase "admin"
MongoDB shell version: 3.2.11
Enter password: 
connecting to: asdf!@#$

이제 관리자 계정을 이용해서, 서비스 배포에 필요한 유저를 추가하면 된다. "addressBook"이라는 데이터베이스를 위한 계정을 만들어보자.
db.createUser(
  {
    user: "addressApp",
    pwd: "12345678",
    roles: [ { role: "readWrite", db: "addressBook" } ]
  }
)
데이터베이스에 읽기/쓰기 권한을 가진 "addressApp"이라는 유저를 만들었다. 이 유저로 접근해보자.
$ mongo -u "addressApp" -p '12345678' --authenticationDatabase "addressBook"
MongoDB shell version: 3.2.11
Enter password: 
connecting to: 12345678
>