블로그 이미지
BJcomm
bjcomm

공지사항

최근에 올라온 글

최근에 달린 댓글

최근에 받은 트랙백

글 보관함

calendar

1 2 3 4 5 6 7
8 9 10 11 12 13 14
15 16 17 18 19 20 21
22 23 24 25 26 27 28
29 30 31
12-21 19:44

mongoDB 인증설정하기

2018. 1. 30. 19:31 | Posted by bjcomm

mongoDB 인증설정하기


mongoDB는 기본적으로 사용자가 등록되어 있지 않으며, 사용자이름과 암호 없이 모든 데이터 베이스에 접근이 가능하다.

개발 단계에서는 모든 데이터베이스에 쉽게 접근하는것이 편하니까 이렇게 쓰는게 편하긴 한데, 실제로 서비스를 하게 되면 사용자의 권한을 제한하여 혹시 모를 사고에 대해서 최소한의 조치를 취해 놓는것을 추천한다.

그래서 이번에는 mongoDB의 사용자 인증을 하는 방법을 알아보겠다.

인증하는 방법을 간략하게 설명하면,

  •  mongod로 서버 실행
  •  mongo 쉘에 접속
  • administrator 생성
  • mongod 재실행
  • mongo로 쉘에 다시 접속
  • administrator 계정으로 로그인
  • 사용자 등록과 권한 부여

이렇게 등록을 하고 난 후에는 사용하고자 하는 어플리케이션에 사용자의 id와 password를 통해 접속을 하면 된다.

 

mongod 접속하기

mongod --port 27017 --dbpath /data/db

기본 port는 27017이고, 만약에 포트가 다르다면 위와 같이 쓴다.

기본 dbpath는 ‘/data/db’이고, 만약에 다르다면 위와 같이 접속하면 된다.

mongod를 이용하여 서버를 구동시키는 방법은 기존에도 많이 언급되어 있으므로 자세한 설명은 생략한다.

 

mongo쉘에 접속하기

mongo --port 27017

만약에 기본포트를 그대로 사용한다면 –port는 생략해도 된다.

 

administrator생성하기

> use admin
> db.createUser(
 {
 user: "myUserAdmin",
 pwd: "abc123",
 roles: [ { role: "userAdminAnyDatabase", db: "admin" } ]
 })

createUser를 이용해 계정을 생성한다.

여기에서 role을 userAdminAnyDatabase로 설정하는게 좋다.

role관련한 부분은 https://docs.mongodb.com/manual/core/authorization/ 링크를 참고.

 

Successfully added user: {
  "user" : "myUserAdmin",
  "roles" : [
   {
     "role" : "userAdminAnyDatabase",
     "db" : "admin"
   }
 ]
}

등록이 성공적으로 완료되면 admin이라는 database가 생성되고, 위와 같은 메세지를 볼 수 있다.

 

mongoDB 종료 및 mongo 쉘 종료

둘다 Ctrl+C로 종료하면 된다.

 

mongoDB 서버 인증모드로 재시작

–auth 옵션을 붙여서 서버를 실행하면 되고, 만약에 설정파일을 이용한다면 securiry.authrization 세팅을 하면 된다.

mongod --auth

만약에 기본 포트와 데이터베이스 경로가 다르다면 --port--dbpath를 이용해서 실행해야 한다.

인증모드로 접속을 하게 되면 권한이 없는 사람은 검색 조차 되지 않는다.

 

administrator로 접속하기

administrator로 접속하는 방법은 2가지가 있다.

하나는 mongo쉘에 접속할 때 인증하는 방법과, 접속한 후에 인증하는 방법이다.

mongo --port 27017 -u "myUserAdmin" -p "abc123" --authenticationDatabase "admin"

-u <username> -p <password> --authenticationDatabase <database> 옵션을 붙이면 된다.

기본적으로 데이터베이스마다 유저관리를 하게 되어있어서, 내가 등록한 데이터베이스에 가서 인증을 실행해야 한다.

우리는 admin이라는 데이터베이스에 등록을 했기 때문에 인증데이터베이스를 선택해줘야 인증이 된다.

 

mongo로 접속한 후에 인증하는 방법은

db.auth(<username>, <password>)를 입력하면 된다.

$ mongo

> use admin
> db.auth("myUserAdmin", "abc123" )
1

1이 출력되면 인증이 완료된 것이다.

 

권한이 제한된 사용자 등록

내가 사용할 데이터베이스의 이름이 “test”라면, 아래와 같이 등록하면 된다.

> use test
> db.createUser(
 {
 user: "myTester",
 pwd: "xyz123",
 roles: [ { role: "readWrite", db: "test" },
 { role: "read", db: "reporting" } ]
 })

위와 같이 한명의 사용자에게 데이터베이스마다 다른 권한을 부여해줄수도 있다.
test데이터베이스에서는 읽고 쓰기가 가능하고, reporting 데이터베이스에서는 읽기만 가능하다.
https://docs.mongodb.com/manual/core/authorization/

 

등록된 사용자로 접속하기

mongo --port 27017 -u "myTester" -p "xyz123" --authenticationDatabase "test"

 

위의 방법대로 진행하면 mongodb에서 인증을 설정할 수 있다. 하지만 위에 나온 내용은 mongodb홈페이지에서 제공하는 설명이고 각자 다른 환경에서 세팅을 하다보면 예상치 못한 문제들이 일어나서 난감할 수 있다.

 

 

실제서버에 적용하기


리눅스 환경에서 mongodb를 설치했다면 자동으로 프로세스에 등록이 되어 항상 자동실행하게 되어있다.

하지만 윈도우 환경에서는 mongod라는 명령어를 통해서 서버를 구동시켜야 한다.

여기에서 오는 차이점이 존재하는데, 그건 바로 설정에 관련된 파일이다.

프로세스에 의해서 실행된 서버와 mongod를 이용해 실행되는 서버에서 사용하는 설정파일이 다르다는 것이다.

 

일단 기존에 설명했던 일련의 인증모드 설정 방법을 전부 따라서 해본 후에 실제로 mongodb의 프로세스가 실행되고 있는지 확인해 보자.

$ ps -ef | grep "mongod"
mongod 3953 1 0 09:11 ? 00:00:08 /usr/bin/mongod -f /etc/mongod.conf

위와 같이 mongod의 프로세스가 검출된다면 mongodb가 실행되고 있는 것이다.

그렇다면 /etc/mongod.conf 파일을 살펴보도록 한다.

# mongod.conf

# for documentation of all options, see:
# http://docs.mongodb.org/manual/reference/configuration-options/

# where to write logging data.
systemLog:
 destination: file
 logAppend: true
 path: /var/log/mongodb/mongod.log

# Where and how to store data.
storage:
 dbPath: /var/lib/mongo
 journal:
 enabled: true
# engine:
# mmapv1:
# wiredTiger:

# how the process runs
processManagement:
 fork: true # fork and run in background
 pidFilePath: /var/run/mongodb/mongod.pid # location of pidfile

# network interfaces
net:
 port: 27017
 bindIp: 127.0.0.1 # Listen to local interface only, comment to listen on all interfaces.


#security: disable
security:
 authorization: enabled

#operationProfiling:

#replication:

#sharding:

## Enterprise-Only Options

#auditLog:

#snmp:

 

이 곳의 설정에서 중요하게 보아야 할 곳은 dbpathbindIp이다.

dbpath는 데이터베이스를 저장하는 경로를 설정한 것이고, bindIp는 mongodb서버의 ip 주소이다.

bindIp의 경우, 다른 서버에 mongodb를 설치했다면 접속할 서버의 ip주소를 직접 써주면 된다.

 

mongod를 이용해 서버를 시작할 경우에는 ‘data/db’ 디렉토리가 디폴트로 설정되어 있지만, 리눅스에서 프로세스에 자동으로 mongod가 올라 갈 때는 mongod.conf를 이용한다는 사실을 주의 해야한다.

인증모드로 mongodb의 서버를 실행하기 위해서는 mongod --auth로 실행을 해야 한다.

mongod.conf에서 mongod –auth 역할을 해주는 옵션이 있는데 그것이 바로 security부분이다.

security:
  authorization: enabled

위와 같이 authorization 옵션을 켜줘야 한다.

 

전체적으로 database경로와 security 옵션을 확인하고 mongod의 서비스를 재시작 해보자.

$ service mongod restart

위와 같이 service 명령어로 mongodb 서버를 재시작 할 수 있다.

 

리눅스에서 세팅을 전부 맞게 설정했는데 failed가 되는 경우가 있다.

$ service mongod restart
Stopping mongod:                                         [ OK ]
Starting mongod:                                         [FAILED]

위와 같이 stop은 되는데 start가 안되는 경우는 권한 문제일 가능성이 제일 크다.

mongodb가 갖는 권한과 데이터베이스를 쓸 디렉토리의 권한이 달라서 재시작이 안될수도 있다.

database의 디렉토리를 생성했을 경우에 user권한의 디렉토리 일 것이고, sudo로 디렉토리를 생성했으면 root권한일 것이다.

이 권한을 mongod로 바꿔줘야 한다.

 

$ chown -R mongod:mongod data

위의 data는 데이터베이스가 저장될 디렉토리이다.

 

$ sudo service mongod start
Starting mongod:           [ OK ]

데이터베이스가 저장될 디렉토리의 권한을 mongod로 설정해 준 후 실행을 해보면 정상적으로 서버가 동작한다.