티스토리 뷰

Note

MongoDB - Enable Auth

팅기지마세요 2016. 12. 26. 00:37

간혹 몽고 셸에 접속할 때 "Access control is not enabled for the database."라는 경고문을 볼 수 있습니다.

이는 mongod 서비스를 "--auth" 인자 없이 실행하였기 때문에 발생하는 경고입니다.


https://docs.mongodb.com/v3.4/tutorial/enable-authentication/ 참조하여 요약


우선 미인증 모드의 mongod를 그대로 둔 채 몽고 셸을 열어 "admin"이라는 콜렉션을 생성합니다.

use admin;

그리고 다른 계정을 관리할 계정 관리 계정을 생성합니다.

단, 현재 만들 계정은 자기 자신이 생성된 "admin" db를 포함하여 다른 db를 조회하거나 수정할 권한이 없으며,

오직 다른 계정을 생성하고 수정할 수 있습니다.

db.createUser({ user: {{id}}[각주:1], pwd: {{password}}[각주:2], roles: [{ role: 'userAdminAnyDatabase', db: 'admin'}]});

"roles" 속성의 값이 배열로 되어있는 점을 유의하셔요.


이제 셸을 닫고 mongod 서비스를 재실행 합시다. 네, 뒤에 "--auth" 옵션을 추가하여 실행합니다.

윈도우 서비스의 경우엔 "sc config {{서비스 이름}} binPath= " 뒷부분을 수정하시면 되고, 혹은

"mongod.conf"의 security: 부분에 authorization: enabled 문구를 추가하여 별도의 인자 추가 없이도

인증 모드의 mongod 서비스를 시작하실 수 있습니다. 저의 리눅스 서버는 직접 환경 설정 파일을 수정하였습니다.


그냥 몽고 셸을 시작하면 "Access control is not enabled for the database." 경고문이 사라졌다는 걸 아실 수 있습니다.

하지만 이대로는 계정 정보를 입력하지 않았기 때문에 아무런 일을 할 수 없어요.

셸 시작 시 "-u {{id}} -p {{password}} admin"을 입력하여 아까 생성한 "admin" db의 계정을 "admin" db에 접속하며 시작하겠다고

명시적으로 선언할 수도 있고, 그냥 "mongo"로 셸을 연 다음

use admin; db.auth({{id}}, {{password}});

으로 아까의 계정에 접속할 수도 있습니다. "db.auth" 메소드는 성공 시 숫자 1을 반환하고, 실패하면 에러 메시지를 출력하고 숫자 0을 반환합니다. 반드시 "admin" db로 이동 후에 해당 메소드를 사용해야 한답니다.


이제 각 db를 관리할 계정을 생성하여야겠지요. 일단 저는 "root" 계정을 만들어, 모든 db에 대해 "readWrite" 권한을 부여하였습니다.

모든 계정은 자신이 소속된 db가 있어야 하고, 몽고 셸은 db 인자 없이 실행하면 "test" db를 사용하므로 "test" db에 "root" 계정을 만들게요.

use test; db.createUser({ user: 'root', pwd: {{root.password}}, roles: [{ role: 'readWrite', db: {{db1}} }, { role: 'readWrite', db: {{db2}} }, ... ]});

모든 db에 대해 동일한 "readWrite" 권한을 부여하고 있지만, 각 db 별로 배열 안에 나누어 둔 것을 보세요.


https://docs.mongodb.com/v3.4/tutorial/manage-users-and-roles/ 에서는 사용자 정의 권한을 만드는 법을 보실 수 있습니다.


이제 "root" 계정으로 접속할 시간입니다. 아까 했던 것처럼 셸 실행 시 입력하여도 되고, 셸 실행 후 "db.auth" 메소드를 사용하여 "root" 계정을 접속하실 수도 있습니다. 물론 "test" db로 이동한 후에 실행해야겠지요.


이런 식으로 각 db에 "readWrite"나 "read" 권한, 혹은 사용자 정의 권한이 부여된 계정을 만들어 다른 db에 대한 접근을 차단, 데이터 보안의 수준을 향상시킬 수 있습니다. 물론 개발 간에는 번거로울 수 있으니 "--auth" 옵션 없이 mongod 데몬을 돌리거나 저처럼 "root" 계정을 하나 만들어 활용하시는 게 좋겠죠? db를 추가하는 경우에는 아래와 같은 식으로 권한을 추가하실 수 있습니다.

db.grantRolesToUser({{id}}, [{ role: 'readWrite', db: {{db.name}} }]);

메소드 파라미터가 객체를 받는 것이 아니니 키 값 "roles" 부분은 빠졌지만, 배열의 내부 구성은 동일합니다.


더불어 맨 처음 생성한 계정 관리 계정에게 "admin" db의 조회 권한을 주는 것도 잊지 마셔요.

db.grantRolesToUser({{admin.id}}, [{ role: 'read', db: 'admin' }]);

"admin"의 "system.users" 콜렉션을 조회하여 다른 db의 계정 정보도 보실 수 있습니다. 물론 비밀번호는 암호화 되어 있어요.

  1. 계정 이름(문자열)을 입력합니다. [본문으로]
  2. 비밀번호(문자열)를 입력합니다. [본문으로]
댓글
공지사항
최근에 올라온 글
최근에 달린 댓글
Total
Today
Yesterday
링크