[컴][db] mongodb 를 production 에서 배포시 확인할 사항

deployment checklist / check list / 체크리스트 /배포전 / 배포 / 몽고db

mongodb 를 production 에서 배포전 확인할 사항

  • unix 계열 os(linux, macOS) 에서 ulimit 의 기본 setting 값을 변경해 줄 필요가 있다.
    • Install MongoDB Community Edition on Red Hat or CentOS — MongoDB Manual
    • UNIX ulimit Settings — MongoDB Manual
    • unix 계열 os 에서는 user 당 또는 process 당 threads, files, network connections 등과 같은 시스템 리소스를 제한하는 방법을 제공한다. ulimit 은 한 user 가 너무 많은 시스템 리소스를 사용하지 않게 막는다. 이것이 너무 낮은 경우 mongodb 의 일반적인 작업 과정동안에 이슈가 발생하게 만들 수 있다.
    • mongodb 4.4 부터는 ulimit 값이 64000 아래면 시작시 error 를 보여준다.
  • mongodb 마다 다른 machine 을 사용
  • 되도록 표준 MongoDB port 인 27017 을 사용
  • 가능하다면, replica set 또는 sharded cluster member 들을 설정할때 ipaddress 대신에 logical DNS hostname 을 사용하자. 그러면 ip address 가 변경돼도, 설정을 다시 하지 않아도 된다.
  • ---bind_ip option 은 MongoDB 가 실행되고 있는 ip address 에 mongodb instance 를 bind 한다고 보면 된다.
    • 3.6 버전 이후부터는 localhost 가 default 이다. --ipv6 옵션이 들어가면, localhost 의 IPv6 주소도 같이 listen 을 하게 된다. localhost 에만 bind 되면, 3.6 binary들은 같은 machine 에서 돌고 있는 clients로 부터 오는 connections 만 받을 수 있다. 외부 client 들은 binary들에 접속할 수 없다.
      다른 ip address 를 bind 하려면, configuration file 에서 net.bindIp를 설정하거나 --bind_ip option 을 사용해서 hostname들이나 ip address 들을 명시할 수 있다. (예: --bind_ip localhost,myhostname2,myhostname1)
    • 참고: MongoDB - Bind_IP Breaking changes and Replica set broken - Server Fault

보안

보안, 설치전 고려해야 할 사항

  • TLS/SSL 사용 : Configure mongod and mongos for TLS/SSL — MongoDB Manual
  • direct ssh root access 를 disable
  • security.clusterIpSourceAllowlist : 이것도 --auth를 사용해야 동작, 원하는 source ip address 나 ip address range 를 적을 수 있다.
  • trusted client 만 mongodb instance 가 사용하는 network interface에 접근가능하도록 한다.
  • db.createUser() 를 할 때 user 의 source ip address 도 정해준다.
  • mongodb 실행시에 dedicated user 계정으로 실행한다. 이 계정은 data 에만 접근할 수 있으면 된다.

계정, 인증

  • role, user 관련 commands : mongosh Methods — MongoDB Manual
  • 기본적으로 community version 에서 2개의 authentication mechanism 들을 제공, 기본값은 SCRAM 이다.
  • role 을 만드는 법
    • MongoDB what are the default user and password? - Stack Overflow
    • Use SCRAM to Authenticate Clients — MongoDB Manual
    • 처음에 user administrator 를 만들고, 추가적인 user 들을 만든다. 각 application 마다 고유한 mongodb 계정을 만들자.
    • role 을 만들때는 least privilege 원리를 따르자.그렇게 role 을 만들고, 각 user 가 필요한 만큼만 assign 해준다. user 는 여러개의 role 을 assign 받을 수 있다.
    • privileges : role 안에 privileges 를 설정하게 되어 있다.
    • database, collection, collection들의 set, cluster 같은 resource 를 적고, 그 resource 에 어떤 action 이 가능한지를 적게 된다.

{
    "roles" : [ 
        {
            "role" : "enableSharding",
            "db" : "userhabit",
            "isBuiltin" : true,
            "roles" : [],
            "inheritedRoles" : [],
            "privileges" : [ 
                {
                    "resource" : {
                        "db" : "",
                        "collection" : ""
                    },
                    "actions" : [ 
                        "enableSharding", 
                        "refineCollectionShardKey", 
                        "reshardCollection"
                    ]
                }
            ],
            "inheritedPrivileges" : [ 
                {
                    "resource" : {
                        "db" : "",
                        "collection" : ""
                    },
                    "actions" : [ 
                        "enableSharding", 
                        "refineCollectionShardKey", 
                        "reshardCollection"
                    ]
                }
            ]
        }, 
        ...
}

user administrator 만드는 법

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

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

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

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

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

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

# mongod.conf

...
#processManagement:

security:
  authorization: enabled
...

role 을 확인하는 법


db.runCommand(
    {
      rolesInfo: [
         { role: "associate", db: "products" },
         { role: "manager", db: "resources" }
      ],
      showPrivileges: true,
      showBuiltinRoles: true
    }
)

// role 을 볼 수 있다.
db.runCommand(
    {
      rolesInfo: 1,
      showPrivileges: true,
      showBuiltinRoles: true
    }
)

replica set 에서는 아래처럼 rs.secondaryOk() 를 해줘야 할 수 있다. 이건 session 당 한번 해주면 된다. [ref. 1]

mongo
> rs.secondaryOk()

See Also

  1. 쿠…sal: [컴][db] mongodb replica set 설정 절차
  2. 쿠...sal: [컴][db] mongo db 의 auth 활성화 및 계정 생성
  3. 쿠...sal: [컴][[db] mongodb 의 계정관련 보안 

References

  1. amazon ec2 - mongodb, replicates and error: { "$err" : "not master and slaveOk=false", "code" : 13435 } - Stack Overflow

댓글 없음:

댓글 쓰기