[컴][db] mongo db 의 auth 활성화 및 계정 생성

authentication enable 시키기 / 켜기 / 끄기 / 유저 생성 / 어드민 생성 / auth / create user account /몽고 계정 / 몽고 auth

mongo db 의 auth 활성화 및 계정 생성

목차

  1. admin 계정 생성
  2. mongodb 에서 auth 가 동작하도록 하기
  3. auth 를 enable 한 mongo db 에 접속하기
  4. 일반 유저 계정 생성
  5. user administrator 만드는 법
  6. user 수정 방법
  7. 모든 유저 목록 확인 방법
    1. built-in roles
  8. user 삭제 방법
  9. built-in roles
    1. 현재 만들어져 있는 role 확인방법

admin 계정 생성

  1. 처음에는 auth 가 없는 상태로 실행
  2. mongo db 에 접속
  3. admin database 에 가서 userAdminAnyDatabase 라는 role 을 가진 관리자 계정을 만든다.
    • userAdminAnyDatabase 라는 role 이 있으면, local, config db 를 제외한 모든 database 에서 user 와 role 을 만들고, 수정할 수 있다.
use admin
db.createUser(
  {
    user: "admin",
    pwd: "thisismypassword",
    roles: [{role: "userAdminAnyDatabase", db: "admin"}],
  }
)

아래처럼 admin database 에 admin 계정(user) 이 만들어졌다. 어느 database 에 내 account가 있는지도 알고 있어야 한다. 접속할때 필요하다.

use admin
db.getCollection("system.users").find({})
   .projection({})
   .sort({_id:-1})
   .limit(100)

result:

{
    "_id" : "admin.admin",
    "userId" : UUID("c87ab8bb-c2e3-45f1-b520-8d3c9d2b443e"),
    "user" : "admin",
    "db" : "admin",
    "credentials" : {
        "SCRAM-SHA-1" : {
            "iterationCount" : 10000,
            "salt" : "imiTMPzMuRLBMsLDYouRpg==",
            "storedKey" : "tfp58ai5BmtwCF+JLZk0d397o/Q=",
            "serverKey" : "bjsYcuSPeL5yg0umyLMsqSiem9Q="
        },
        "SCRAM-SHA-256" : {
            "iterationCount" : 15000,
            "salt" : "K0EYVz7W8GYA1AfWgfT1gQYGk1p/acUIP2Dtlw==",
            "storedKey" : "lCxXFEo+wpsPilU7ew5K/hSClewFYObOkf/nmf+Rk/g=",
            "serverKey" : "2WOC9EdHtuaOQTp6OjkJzOMDsggqEE6kce50W6BGS4I="
        }
    },
    "roles" : [
        {
            "role" : "userAdminAnyDatabase",
            "db" : "admin"
        }
    ]
}

mongodb 에서 auth 가 동작하도록 하기

이렇게 계정을 만들고 난후 --auth 를 사용하면 된다. --auth 를 사용하면 그때부터 mongodb 에 접속하면, 인증을 하고 사용해야 한다. (참고)

mongod --auth --port 27017 --dbpath /var/lib/mongodb

또는 configuration file 에 설정을 해줄 수도 있다.

# mongod.conf

...
#processManagement:

security:
  authorization: enabled
...

auth 를 enable 한 mongo db 에 접속하기

아래처럼 접속할 수도 있다. 다만 이경우 bash history 등에 남으니 주의해야 한다.

  • mongo "mongodb://admin:thisismypassword@localhost:27017/admin?authSource=admin"
  • mongo "mongodb://admin@localhost:27017/admin?authSource=admin"
c:\Program Files\MongoDB\Server\5.0\bin>mongo "mongodb://localhost:27017"
MongoDB shell version v5.0.2
connecting to: mongodb://localhost:27017/?compressors=disabled&gssapiServiceName=mongodb
Implicit session: session { "id" : UUID("c2b8347a-cbb9-43ac-9f93-3a97e3a02c20") }
MongoDB server version: 5.0.2
================
Warning: the "mongo" shell has been superseded by "mongosh",
which delivers improved usability and compatibility.The "mongo" shell has been deprecated and will be removed in
an upcoming release.
We recommend you begin using "mongosh".
For installation instructions, see
https://docs.mongodb.com/mongodb-shell/install/
================
> show databases;
> use anotherdb
switched to db anotherdb
> db.auth("admin")
Enter password:
Error: Authentication failed.
0
> use admin
switched to db admin
> db.auth("admin", "thisismypassword")
1

일반 유저 계정 생성

user 를 만들때는 특정 database로 가서 만들어야 한다.

이 user에 대한 credential 은 admin db 에 만들어지지만 이 db 가 갈 수 있는 기본 database 를 지정하는 느낌이라고 보면 된다. 그래서 user role을 부여할 때 다른 database 에 대한 권한을 추가로 줄 수 있다.(참고: How to Create New Users in MongoDB)

db.createUser(
    {
        user: "test1",          // user 이름
        pwd: passwordPrompt(),   // 여기에 암호를 직접 넣어도 된다.
        roles: [
            { role: "readWrite", db: "mytestdb2" }, // mytestdb2 에 대해 readWrite 권한
            { role: "read", db: "test" }            // test db 에 대해 read 권한
        ]
    }
)

user administrator 만드는 법

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

user 수정 방법

// permission 을 추가하는 법
use admin
db.grantRolesToUser(
   "myUserAdmin",
   {
     roles: [ 
       { role: "userAdminAnyDatabase", db: "admin" }, 
       { role: "dbAdminAnyDatabase", db: "admin" }, 
       { role: "readWriteAnyDatabase", db: "admin" } 
     ]
   }
)
// permission 을 삭제하는 법
use admin
db.revokeRolesFromUser(
   "myUserAdmin",
   [ { role: "userAdminAnyDatabase", db: "admin" },]
)

updateUser 를 이용하면 update를 한다. 그래서 기존의 role이 지워지고, 새롭게 set 된다.

use admin
db.updateUser(
   "myUserAdmin",
   {
     roles: [ { role: "userAdminAnyDatabase", db: "admin" } ]
   }
)
// pw 변경
use admin
db.updateUser("root", {pwd: "new-password" }) 

모든 유저 목록 확인 방법

db.getSiblingDB("admin").getCollection("system.users").find({})

user 삭제 방법

admin db 에 있는 myuser 라는 user 삭제

use admin
db.dropUser("myuser")

built-in roles

roles:

  • __queryableBackup
  • __system
  • backup
  • clusterAdmin
  • clusterManager
  • clusterMonitor
  • dbAdmin
  • dbAdminAnyDatabase
  • dbOwner
  • enableSharding
  • hostManager
  • read
  • readAnyDatabase
  • readWrite
  • readWriteAnyDatabase
  • restore
  • root : 이 녀석이 최고 권한이라고 보면 된다.
  • userAdmin
  • userAdminAnyDatabase

현재 만들어져 있는 role 확인방법

db.runCommand(
    {
      rolesInfo: 1,
      showPrivileges: true,
      showBuiltinRoles: true
    }
)

ip address 로 제한하기

192.168.0.2에서 접근한 user 만 인증해준다.

다만 주의할 것은 만약 local이 192.168.0.2인데 local에서 test 를 하려고 한다면, mongo mongodb://localhost 가 아니라 mongo mongodb://192.168.0.2 로 접근해야 된다. localhost 로 하면 auth 가 안된다.

use admin
db.createUser(
  {
    user: "admin",
    pwd: "thisismypassword",
    roles: [{role: "userAdminAnyDatabase", db: "admin"}],
    authenticationRestrictions: [
      clientSource: ['192.168.0.2'],
      // serverSource: ['192.168.0.2']
    ]
  }
)

serverSource 도 있다. 아래처럼 계정을 만들면, server의 ip 가 ’192.168.0.2’인 곳에서만 인증을 해주는 것이다. 참고로 serverSource: [] 은 어느서버에서도 인증을 안해주겠다가 된다.

use admin
db.createUser(
  {
    user: "admin",
    pwd: "thisismypassword",
    roles: [{role: "userAdminAnyDatabase", db: "admin"}],
    authenticationRestrictions: [
      serverSource: ['192.168.0.2']
    ]
  }
)

See Also

  1. 쿠…sal: [컴][db] mongodb 를 production 에서 배포시 확인할 사항

Reference

  1. MongoDB Authentication | MongoDB

댓글 없음:

댓글 쓰기