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
- 3.6 버전 이후부터는 localhost 가 default 이다.
보안
보안, 설치전 고려해야 할 사항
- 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 이다.
- SCRAM 은 단순하게 id/pw 를 사용하는 방식이라고 보면 된다. 특정 id/pw 가 어느 database 에 접속할 수 있는지 설정해 주면 된다.
- SCRAM — MongoDB Manual
- x.509 — MongoDB Manual
- 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 을 확인하는 법
- mongodb 에 처음부터 만들어져 있는(built-in) 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
- 쿠…sal: [컴][db] mongodb replica set 설정 절차
- 쿠...sal: [컴][db] mongo db 의 auth 활성화 및 계정 생성
- 쿠...sal: [컴][[db] mongodb 의 계정관련 보안
댓글 없음:
댓글 쓰기