MongoDB 3.2.20 Authentication Setting
MongoDB 3.2.20 버젼으로 진행된다. 설치와 cluster가 완료 되었다는 가정하에 진행이 된다. 또한 ElasticSearch와 MongoDB는 mongo-connect를 이용하여 연결 되어 있다.
고객사의 요청으로 MongoDB 접근에 대한 권한을 설정해야 하는 일이 생겼다.
간단하게 설정으로 해결되는 문제로 생각했는데 삽질이 컸다.
현재 MongoDB의 구조는 다음과 같다.
총 5대의 서버로 구성되어 있으며, 2대는 데이터를 적재하는 MongoDB, 1대는 Primary/Slave의 투표를 하는 ARBITER, 클러스터의 메타 데이터 및 구성 설정을 저장하는 config 서버, 마지막으로 클라이언트 응용 프로그램과 공유 된 클러스터 사이의 인터페이스를 제공하는 쿼리 라우터 역할 하는 mongos로 구성된다.
인증을 위한 KeyFile 생성
MongoDB는 다음 2가지 인증 매커니즘을 지원 합니다.
- SCRAM - 기본 인증 메커니즘
- x.509 인증서 인증
본 글에서는 간단하게 사용이 가능한 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에 모두 생성 해야 한다.
- mongos 설정
$> mongo --port 10001
>
> use admin;
> db.createUser(
{
user: "admin",
pwd: "1234",
roles: [ { role: "root", db: "admin" } ]
}
);
- repl1 설정
$> mongo --port 20001
>
> use admin;
> db.createUser(
{
user: "admin",
pwd: "1234",
roles: [ { role: "root", db: "admin" } ]
}
);
- 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 }