MongoDB 3.x 인증 알고리즘 변경
MongoDB 3.x 부터는 인증 알고리즘이 MONGODB-CR 에서 SCRAM-SHA-1 으로 변경되었다. 그런데 특정 사용자에 대해서 MONGODB-CR 방식을 적용해야할 필요가 생기기도 한다. 그래서 사용자마다 알고리즘을 달리 적용할 수 있을까?
결론부터 말하면 MongoDB 3.x 는 이를 지원하지만 지원하는 것 같지 않은 상태다. 공식적인 지원을 하지만 이를 구현하기 위해서는 서버를 중단해야하고 인증을 해제해야한 다음에 사용자 알고리즘을 고치고 다시 인증을 걸고 서버를 재시작해야 한다.
또, Replica Set 상태에서 Primary 에서 MONGODB-CR 인증을 설정한다고 하더라도 Secondary 에서는 SCRAM-SHA-1 으로 싱크가 된다. 그래서 프로그램상에서 Replica Set 에서 접속할때에 MONGODB-CR 인증방식으로 접속을 시도하면 Primary 에서는 정상으로 접속되나 Secondary 서버에서는 인증이 실패해 접속이 안된다.
이러한 한계에도 불구하고 MongoDB 3.x 인증 알고리즘 변경 은 다음과 같이하면 된다.
서버 셧다운
제일 번저 서버를 셧다운 해야한다. 이유는 인증모드를 해제하기 위해서다. 관리자로 로그인을 한 후에 다음과 같이 서버를 셧다운 한다.
1 2 3 4 5 6 7 8 9 10 |
> db.shutdownServer({force:true}) server should be down... 2016-06-11T01:35:35.931+0900 I NETWORK [thread1] trying reconnect to 127.0.0.1:27017 (127.0.0.1) failed 2016-06-11T01:35:35.932+0900 W NETWORK [thread1] Failed to connect to 127.0.0.1:27017, reason: errno:111 Connection refused 2016-06-11T01:35:35.932+0900 I NETWORK [thread1] reconnect 127.0.0.1:27017 (127.0.0.1) failed failed 2016-06-11T01:35:35.934+0900 I NETWORK [thread1] trying reconnect to 127.0.0.1:27017 (127.0.0.1) failed 2016-06-11T01:35:35.934+0900 W NETWORK [thread1] Failed to connect to 127.0.0.1:27017, reason: errno:111 Connection refused 2016-06-11T01:35:35.934+0900 I NETWORK [thread1] reconnect 127.0.0.1:27017 (127.0.0.1) failed failed > exit bye |
무인증 설정
이제 MongoDB 설정 파일에서 인증 부분을 주석처리해 무인증으로 만들고 서버를 시작한다.
1 2 3 4 |
security: #keyFile: "/home/instance1/mongodb/etc/.keyfile/mongodb_keyfile" #clusterAuthMode: "keyFile" authorization: "disabled" |
이렇게 한 후에 서버를 시작하면 인증없이 모든 것을 할 수 있게 된다.
MONGODB-CR 인증 계정 생성
MONGODB-CR 인증을 생성하기 위해서는 MongoDB 자체의 인증 방법을 먼저 변경을 해줘야 한다. 이 변경은 역시 무인증 서버상태에서만 가능하다.
1 2 3 4 5 |
> use admin switched to db admin > db.system.version.save({ "_id" : "authSchema", "currentVersion" : 3 }); WriteResult({ "nMatched" : 1, "nUpserted" : 0, "nModified" : 1 }) > |
authSchema 버전을 3으로 변경하는데 이게 MONGODB-CR 인증 방법을 말한다. 5번은 SCRAM-SHA-1 이다.
이제 생성하고자하는 계정의 데이터베이스로 가서 계정을 생성한다.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 |
> use test switched to db test > db.createUser({ ... user: "test1", ... pwd: "154321", ... roles: [ { role: "readWrite", db: "test" } ] ... }); Successfully added user: { "user" : "test1", "roles" : [ { "role" : "readWrite", "db" : "test" } ] } |
생성된 계정을 확인해보면 다음과 같다.
1 2 3 |
> db.system.users.find() { "_id" : "test.test1", "user" : "test1", "db" : "test", "credentials" : { "MONGODB-CR" : "d742f64096c71b3a2aef03165f428f76" }, "roles" : [ { "role" : "readWrite", "db" : "test" } ] } > |
인증방법 복원
MONGODB-CR 을 위한 계정을 생성했다면 SCRAM-SHA-1 로 바꾸고 서버에 인증을 걸어야 한다.
1 2 3 |
> db.system.version.save({ "_id" : "authSchema", "currentVersion" : 5 }); WriteResult({ "nMatched" : 1, "nUpserted" : 0, "nModified" : 1 }) > |
그리고 설정파일에 인증을 걸어준다.
1 2 3 4 |
security: keyFile: "/home/instance1/mongodb/etc/.keyfile/mongodb_keyfile" clusterAuthMode: "keyFile" authorization: "enabled" |
그리고 서버를 재시작해주면 된다.
문제점
문제점은 앞에서 이야기 했듯이 Replica Set 상태에서 Primary 에서 MONGODB-CR 인증으로 계정을 생성했다고 하더라도 Secodary 에서는 SCRAM-SHA-1 으로 싱크가 된다. 그래서 Secondary 서버에 MONGODB-CR로 인증할려면 오류를 낸다.