MongoDB 3.2.20 Authentication Setting

MongoDB 3.2.20 버젼으로 진행된다. 설치와 cluster가 완료 되었다는 가정하에 진행이 된다. 또한 ElasticSearch와 MongoDB는 mongo-connect를 이용하여 연결 되어 있다.

고객사의 요청으로 MongoDB 접근에 대한 권한을 설정해야 하는 일이 생겼다.

간단하게 설정으로 해결되는 문제로 생각했는데 삽질이 컸다.

현재 MongoDB의 구조는 다음과 같다.

MongoDB Architecute

총 5대의 서버로 구성되어 있으며, 2대는 데이터를 적재하는 MongoDB, 1대는 Primary/Slave의 투표를 하는 ARBITER, 클러스터의 메타 데이터 및 구성 설정을 저장하는 config 서버, 마지막으로 클라이언트 응용 프로그램과 공유 된 클러스터 사이의 인터페이스를 제공하는 쿼리 라우터 역할 하는 mongos로 구성된다.

인증을 위한 KeyFile 생성

MongoDB는 다음 2가지 인증 매커니즘을 지원 합니다.

본 글에서는 간단하게 사용이 가능한 SCRMA을 이용합니다

키 생성 명령어

openssl rand -base64 756 > <path-to-keyfile>
chmod 400 <path-to-keyfile>

생성된 키를 각 설정 파일에 설정 해야 한다.

security:
  keyFile: <path-to-keyfile>
replication:
  replSetName: <replicaSetName>
net:
   bindIp: localhost,<ip address>

Server-A(20001), Server-B(20002), Server-C(20003), Server-D(20004)의 설정파일에 security: keyFile: 이 모두 설정되어야 한다. Server-F(10001)는 실행시 option으로 처리 한다.

재기동 옵션 A~D, F

/usr/bin/mongod --config /etc/mongod_repl1.conf
/usr/bin/mongod --config /etc/mongod_repl2.conf
/usr/bin/mongod --config /etc/mongod_repl3_arbiter.conf
/usr/bin/mongod --config /etc/mongod_repl4_config.conf --configsvr
/usr/bin/mongos --configdb localhost:20004 --port 10001 --fork --logpath /var/lib/mongodb/mongod_mongos.log --chunkSize 1 --keyFile /etc/m_key

MongoDB 재기동 & 계정 생성

설정이 완료된 이후에 MongoDB를 재기동 한다.

재기동이 완료 되면 계정을 생성 한다.

여기서는 단순하게 계정을 생성 하도록 한다. 계정 생성은 mongos와 repl1에 모두 생성 해야 한다.

  1. mongos 설정 ~~~ $> mongo –port 10001

use admin; db.createUser( { user: “admin”, pwd: “1234”, roles: [ { role: “root”, db: “admin” } ] } );

2. repl1 설정

$> mongo –port 20001

use admin; db.createUser( { user: “admin”, pwd: “1234”, roles: [ { role: “root”, db: “admin” } ] } );

3. mongo-connector 실행(생성한 계정의 id/pw를 option에 추가 한다.)

/usr/bin/python /usr/bin/mongo-connector -m localhost:10001 -t localhost:9200 -d elastic2_doc_manager -a admin -p 1234 ~~~

테스트

계정 처리가 완료 되면, 데이터를 조회/삽입 해본다.

$> mongo --port 10001

mongos> db.test.find({})
Error: error: {
	"ok" : 0,
	"errmsg" : "not authorized on test to execute command { find: \"test\", filter: {} }",
	"code" : 13
}
mongos>
mongos> use admin
switched to db admin
mongos> db.auth("admin", "1234")
1
mongos> db.test.find({})
mongos> db.test.insert({"x":1, "y":10})
WriteResult({ "nInserted" : 1 })
mongos> db.test.find({})
{ "_id" : ObjectId("5b6b76a593ec1b18e1f5f441"), "x" : 1, "y" : 10 }

참고자료


Posted by lahuman