MongoDB 4.2 admin 계정 설정하기

 

MongoDB admin 4.2 계정 설정하기

MongoDB 아틀라스 배포가 아닌, Linux서버에 직접 패키지를 올려 설치하게 되면, Authentication이 없습니다.

저 역시 CentOS7에 커뮤니티를 올려서 사용하고 있어서, 처음에는 /etc/mongo.conf 안의 Bind IP 설정이 허용하는대로 모든 접속을 허용합니다.

OS의 Firewalld 데몬인 떠있다면, Firewall에서 따로 포트 및 서비스를 허용하도록 추가를 해줘야합니다. 내부망에서만 붙거나, 앞단에 방화벽 장비들이 있으면 OS단에서는 중지해도 됩니다.

일단 DB에 누구나 접근이 가능하면 안되기 때문에 Authentication 설정을 해보도록 하겠습니다.

 

Admin 계정 생성

OS 터미널에서 mongodb로 접속하여 use admin 명령으로 admin DB로 이동한 후 아래와 같이 작성합니다.

$ mongo
MongoDB shell version v4.2.6
connecting to: mongodb://127.0.0.1:27017/?compressors=disabled&gssapiServiceName=mongodb
Implicit session: session { "id" : UUID("c8dfe45a-84c0-48c3-99e4-39b65a85780c") }
MongoDB server version: 4.2.6
> use admin
switched to db admin
> db.createUser(
...   {
...     user: "admin",
...     pwd: passwordPrompt(), // or cleartext password
...     roles: [ { role: "userAdminAnyDatabase", db: "admin" }, "readWriteAnyDatabase" ]
...   }
... )
Enter password:
Successfully added user: {
	"user" : "admin",
	"roles" : [
		{
			"role" : "userAdminAnyDatabase",
			"db" : "admin"
		},
		"readWriteAnyDatabase"
	]
}
> db.auth("admin",passwordPrompt())
Enter password:
1
>
>
> show dbs
admin   0.000GB
config  0.000GB
local   0.000GB
>

기존에 Admin DB는 존재하지만, Admin 계정이 활성화 되어 있지 않은 상태에서 admin 이라는 이름으로 계정을 설정한 것입니다.

admin 계정을 생성하는 방법은 몇가지가 있는데, 아래 같은 방식으로 생성하면 모든 데이터 베이스에 읽고 쓰기가 가능한 계정이 생성됩니다.

use admin

db.createUser(
  { 
     user: "admin", 
     pwd: passwordPrompt(), // or cleartext password 
     roles: [ { role: "userAdminAnyDatabase", db: "admin" }, "readWriteAnyDatabase" ] 
  }
)

하지만 이 경우 cluster manager 같은 role은 포함하지 않으며, 레플리카 셋이나 샤드 클러스터를 사용할 때는 clusterManager 라는 Role을 따로 부여 해야합니다. 또 Database drop 같은 명령은 먹히지 않습니다.

본인이 슈퍼 유저이며 DB를 관리하는 총 책임자라고 한다면,

use admin

db.createUser(
{
    user: "dba",
    pwd: passwordPrompt(), // or cleartext password 
    roles: [ "root" ]
})

root 권한을 줘서 생성할 수도 있습니다. 이 경우 정말 모든 권한을 가진 슈퍼유저 계정으로 생성이 됩니다.

 

security.authorization 옵션 활성화

/etc/mongo.conf 파일 안에 해당 옵션을 활성화 시켜줘야 authentication이 동작을 하기 때문에 파일을 수정해줘야 합니다.

해당 옵션을 변경하면 MongoDB를 재구동 해야하니 주의하시기 바랍니다.

# 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
    commitIntervalMs: 200

#  engine:
#  wiredTiger:
  wiredTiger:
    engineConfig:
      cacheSizeGB: 4
      journalCompressor: snappy
      directoryForIndexes: false
    collectionConfig:
      blockCompressor: snappy
    indexConfig:
      prefixCompression: true

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

# network interfaces
net:
  port: 27017
  bindIp: 0.0.0.0  # Enter 0.0.0.0,:: to bind to all IPv4 and IPv6 addresses or, alternatively, use the net.bindIpAll setting.


security:
  authorization: enabled

security 부분의 주석을 제거하고, authorization: enabled 옵션을 넣어 줍니다.

$ systemctl restart mongod

admin 계정으로 접속하는 방법은 아래와 같습니다.

$ mongo -u "admin" -p <your_password> --authenticationDatabase "admin"

or 

$ mongo -u "admin" -p --authenticationDatabase "admin"
MongoDB shell version v4.2.6
Enter password:

또는 mongo shell 안에서 접속할 수 있습니다.

반드시 admin DB로 이동하고 접속을 해야합니다.

use admin

> db.auth("admin", "<your_password>" )
1

or

> db.auth("admin",passwordPrompt())
Enter password:
1

 

만약 ReplicaSet과 샤드 클러스터를 이용해야 한다면, 계정에 clusterManager 권한을 부여 해야 합니다.

db.grantRolesToUser("admin",["clusterManager"])

부여하지 않은 경우 아래와 같이 에러 메시지가 출력됩니다.

rs0:PRIMARY> rs.status()
{
        "operationTime" : Timestamp(1614210287, 1),
        "ok" : 0,
        "errmsg" : "not authorized on admin to execute command { replSetGetStatus: 1.0, lsid: { id: UUID(\"de909cab-8b2e-486e-8d86-7a2186fb9d74\") }, $clusterTime: { clusterTime: Timestamp(1614210287, 1), signature: { hash: BinData(0, 16C2216301B5095CC9983E10935EF967B4F2C650), keyId: 6932979901905502211 } }, $db: \"admin\" }",
        "code" : 13,
        "codeName" : "Unauthorized",
        "$clusterTime" : {
                "clusterTime" : Timestamp(1614210287, 1),
                "signature" : {
                        "hash" : BinData(0,"FsIhYwG1CVzJmD4Qk175Z7TyxlA="),
                        "keyId" : NumberLong("6932979901905502211")
                }
        }
}

 

You may also like...

1 Response

  1. 2021년 2월 24일

    […] 하는데, admin 계정을 생성하고 계정 로그인을 적용하는 방법은 지난 포스팅(MongoDB 4.2 admin 계정 설정하기) 에서 […]

답글 남기기

이메일 주소는 공개되지 않습니다. 필수 항목은 *(으)로 표시합니다