MongoDB replica set 보안 설정

수하·2021년 10월 2일
0

MongoDB

목록 보기
2/2

저번 포스트에 이어서 MongoDB Replica set 설정을 해보도록 할 것이다.
이번엔 MongoDB root 사용자 설정, keyfile 설정 등 security 관련 설정을 할 예정이다.

MongoDB 보안 설정하기

1. root 계정 생성

로그인 처리를 위해서 mongo shell에 접속한 후 root 유저를 생성한다.

use admin
db.createUser({user:"[유저네임]", pwd:"[비밀번호]", roles: ["root"]})

2. 인증 모드 설정

인증모드는 반드시 root 유저를 생성한 후 설정해야 한다.

keyfile 생성

keyfile 없이 security.authorization: enabled 설정을 하게 되면 오류가 발생한다. 올바른 인증을 위해 security.keyFile 설정을 추가해야 하고 생성한 key는 최소한의 권한만 줘야 한다.

Keyfile은 어떠한 방법으로 생성해도 무관한데, base64 character set 로만 이루어진 6-1024자의 파일로 생성해야 한다. 또한 unix 시스템에서는 keyfile에는 group, world 권한을 주면 안되고 소유자에게만 권한을 주어야 한다. (400, 600과 같이)

아래 명령어로 openssl을 사용하여 1024자 key를 생성한다.

openssl rand -base64 756 > [keyfile 경로]
chmod 400 [keyfile 경로]

replicat set에 있는 모든 mongod는 동일한 key를 공유해야 하므로, 모든 mongod 노드에 keyfile을 복제하여 넣어준다.

security 설정 변경

저번 mongod.conf 파일 설정에서 security 항목에 keyFile 설정을 추가해준다. (Primary, secondary, arbiter 모두 추가해준다.) 그리고 모든 mongod 인스턴스를 재기동한다.

systemLog: 
   ...
security:
   authorization: enabled
   keyFile: [keyfile 경로]

💡 보안을 위해서는 mongoDB 기본 포트도 변경하는 것이 좋다.

난 arbiter를 포함한 모든 mongod 노드의 포트를 변경하여 다시 실행하였다.

cfg = rs.conf()
cfg.members[0].host = "호스트명:새 포트번호" // 기존 호스트마다 변경된 포트 정보 수정
rs.reconfig(cfg, {force: true}) // force 옵션을 줘서 강제 재실행

이후 rs.conf() 를 찍어보면서 수정한 포트 정보가 잘 반영되었는지 확인해야 한다.


3. 로그인 해보기

mongo -u [root 유저네임] -p 를 입력하고 mongo shell 에 접속하여 rs.status()를 해본다.
모든 replica set 구성원 정보가 정상적으로 조회된다면 authentication 설정이 된 것이다.

Arbiter conf 파일에 security 설정을 누락하여 실행했었는데, 아래와 같이 not reachable/healthy 오류가 발생하고, authenticated: false 상태로 확인이 되었다.

{
			"_id" : 3,
			"name" : "[host:port]",
			"health" : 0,
			"state" : 6,
			"stateStr" : "(not reachable/healthy)",
			"uptime" : 0,
			"lastHeartbeat" : ISODate("2021-10-02T12:20:43.963Z"),
			"lastHeartbeatRecv" : ISODate("1970-01-01T00:00:00Z"),
			"pingMs" : NumberLong(0),
			"lastHeartbeatMessage" : "",
			"authenticated" : false,
			"syncSourceHost" : "",
			"syncSourceId" : -1,
			"infoMessage" : "",
			"configVersion" : -1,
			"configTerm" : -1
		}

Arbiter의 로그를 확인해보니, 아래처럼 keyFile 파라미터가 없어 authenticate에 실패하였다는 오류를 확인할 수가 있다.

{
    ...
    "msg": "Authentication failed",
    "attr": {
        ...
        "error": "AuthenticationFailed: It is not possible to authenticate as the __system user on servers started without a --keyFile parameter"
    }
}

Arbiter의 conf에도 security.authorization과 keyFile 설정을 하고 나면 정상적으로 arbiter 정보도 조회가 된다.



Fin!

0개의 댓글