安装MongoDB企业版(4.4.9) + 内部安全认证 + 开启静态加密

MongodDB部署企业版(4.4.9),开启静态加密

基础概要:

Architecture Reference Chart:在这里插入图片描述

根据规划将部署成两分片,三成员副本集(master+slaver+arbiter)的配置

安装启动顺序:config–>shard–>mongos

系统版本:centos7 64位

ipmodule
1.1.1.85shard1(sec); config
1.1.1.86shard2(sec); config;mongos
1.1.1.87shard1; config;mongos
1.1.1.67shard2
shard1-arbiter-
shard2-arbiter

一、安装MongoDB企业版(Enterprise Edition)

注:如果/etc/yum.repos.d/mongodb-enterprise.repo此目录中有以前安装的 MongoDB 的文件,则应将其删除。使用mongodb-enterprise-4.4.repo 上面的文件安装 MongoDB 4.4。

1、配置存储库。

创建一个/etc/yum.repos.d/mongodb-enterprise-4.4.repo文件,以便您可以使用以下命令直接安装 MongoDB 企业yum

sudo bash -c "cat > /etc/yum.repos.d/mongodb-enterprise-4.4.repo" << EOF
[mongodb-enterprise-4.4]
name=MongoDB Enterprise Repository
baseurl=https://repo.mongodb.com/yum/redhat/\$releasever/mongodb-enterprise/4.4/\$basearch/
gpgcheck=1
enabled=1
gpgkey=https://www.mongodb.org/static/pgp/server-4.4.asc
EOF
2、安装 MongoDB 企业版4.4.9 。
2.1、要安装特定版本,您必须单独指定每个组件包以及版本号,如下例所示:
sudo yum install -y mongodb-enterprise-4.4.9 mongodb-enterprise-server-4.4.9 mongodb-enterprise-shell-4.4.9 mongodb-enterprise-mongos-4.4.9 mongodb-enterprise-tools-4.4.9

2.2、固定特定版本的 MongoDB Enterprise。

尽管您可以指定任何可用的 MongoDB Enterprise 版本,yum但在更新版本可用时升级包。为防止意外升级,请通过将以下exclude指令添加到 /etc/yum.conf文件来固定包:

sudo bash -c "echo 'exclude=mongodb-enterprise,mongodb-enterprise-server,mongodb-enterprise-shell,mongodb-enterprise-mongos,mongodb-enterprise-tools'>>/etc/yum.conf"

二、运行MongoDB企业版

先决条件
每个部署都可能有独特的要求和设置;但是,以下阈值和设置对于mongod and mongos部署尤为重要:
# 推荐设置的值为
-f(文件大小):unlimited
-t(CPU时间):unlimited
-v(虚拟内存):unlimited 
-l(锁定内存大小):unlimited
-n(打开文件):64000
-m(内存大小):unlimited 
-u(进程/线程):64000

始终记得在更改设置后重新启动您的mongod实例 mongos,ulimit以确保更改生效。

要为这些版本配置nproc值,请创建一个名为 /etc/security/limits.d/99-mongodb-nproc.confnewsoft nprochard nprocvalues 的文件以增加进程限制

#修改系统文件打开数,直接生效
sudo bash -c "ulimit -n 1000000"
#永久生效
sudo bash -c "cat >> /etc/security/limits.conf" << Leo
*               soft    nofile  1000000
*               hard    nofile  1000000
*               soft    nproc   1000000
*               hard    nproc   1000000
Leo

# 修改mongo最大文件打开数
sudo bash -c "cat > /etc/security/limits.d/99-mongodb.conf" << LEO
#Default limit for number of user’s processes to prevent
# accidental fork bombs.
# # See rhbz #432903 for reasoning.
# #
# # * soft nproc 4096
# # root soft nproc unlimited
* soft nofile 1000000
* hard nofile 1000000
* soft fsize unlimited
* hard fsize unlimited
* soft cpu unlimited
* hard cpu unlimited
* soft nproc 500000
* hard nproc 500000
LEO

禁用SELinux

# 直接生效
setenforce 0
 
# 永久生效
vim /etc/sysconfig/selinux
SELINUX=disabled
1、创建所需的文件夹
sudo mkdir -p /var/opt/DB/mongodbEE/config
sudo mkdir -p /var/opt/DB/mongodbEE/config/metadata/
sudo mkdir -p /var/opt/DB/mongodbEE/config/log/
sudo mkdir -p /var/opt/DB/mongodbEE/shard
sudo mkdir -p /var/opt/DB/mongodbEE/shard/data
sudo mkdir -p /var/opt/DB/mongodbEE/shard/log
sudo mkdir -p /var/opt/DB/mongodbEE/mongos
sudo mkdir -p /var/opt/DB/mongodbEE/mongos/log
sudo mkdir -p /var/opt/DB/mongodbEE/arbiter
sudo mkdir -p /var/opt/DB/mongodbEE/slaver/log
sudo chown -R mongod:mongod /var/opt/DB/mongodbEE

2、创建config服务器,配置mongoconfig.conf,并启动
  • 选择85、86、87服务器配置
2.1、mongo-config配置文件 /var/opt/DB/mongodbEE/config/mongo.conf
processManagement:
   fork: true
net:
   bindIp: 0.0.0.0
   ##should be changed after clusters stable
   port: 27000
storage:
   dbPath: /var/opt/DB/mongodbEE/config/metadata/
replication:
   replSetName: cfgReplSet
sharding:
   clusterRole: configsvr
systemLog:
   verbosity: 0
   #traceAllExceptions: true
   destination: file
   path: "/var/opt/DB/mongodbEE/config/log/config.log"
   logAppend: true
   logRotate: reopen
   timeStampFormat: iso8601-local
#security:
   #authorization: enabled
   #transitionToAuth: true
   #clusterAuthMode: keyFile
#   keyFile: /var/opt/DB/mongodbEE/mongodb-keyfile
2.2、首次启动
sudo mongod -f /var/opt/DB/mongodbEE/config/mongo.conf
2.3、初始化配置config集群,找一台config配置即可
mongo --port 27000
use admin
rs.initiate(
  {
    _id: "cfgReplSet",
    configsvr: true,
    members: [
      { _id : 0, host : "1.1.1.85:27000" },
      { _id : 1, host : "1.1.1.86:27000" },
      { _id : 2, host : "1.1.1.87:27000" }
    ]
  }
)

3、配置shard服务器

不同的shard集修改replSetName: shard1即可

  • 85、87配置replSetName: shard1

  • 86、67配置replSetName: shard2

3.1、配置文件/var/opt/DB/mongodbEE/shard/shard.conf
processManagement:
   fork: true
   pidFilePath: /var/opt/DB/mongodbEE/shard/log/slaver1.pid
net:
   bindIp: 0.0.0.0
   ##should be changed after clusters stable
   port: 27001
   #maxIncomingConnections
   serviceExecutor: adaptive
   ##split net io and disk io, reuse network io and connection to reduce locks
storage:
   #indexBuildRetry set to false if mongod restart fail when there is rebuild index error
   dbPath: /var/opt/DB/mongodbEE/shard/data
   #directoryPerDB: true
   #directoryPerDB should be set when initial mongodb, can't use on existing db
   journal:
      enabled: true
      commitIntervalMs: 200
   #wiredTiger:
   #   collectionConfig:
   #     blockCompressor: zlib
   #   indexConfig:
   #     prefixCompression: true
      #none with highest query speed but snappy and zlib with lower IO, zlib will take more cpu and less IO than snappy
   #   engineConfig:
   #     directoryForIndexes: true
        #directoryForIndexes should be set when initial mongodb, can't use on existing db
replication:
   replSetName: shard1
sharding:
   clusterRole: shardsvr
systemLog:
   verbosity: 0
   #traceAllExceptions: true
   destination: file
   path: "/var/opt/DB/mongodbEE/shard/log/slaver1.log"
   logAppend: true
   logRotate: reopen
   timeStampFormat: iso8601-local
#   component:
#     sharding:
#       verbosity: 0
#     write:
#       verbosity: 0
#security:
   #authorization: enabled
   #transitionToAuth: true
   #clusterAuthMode: keyFile
#   keyFile: /var/opt/DB/mongodbEE/mongodb-keyfile
   #clusterIpSourceWhitelist: for whitelist of clients
   #ldap configuration might be used when ITSAC and mongodb should be enterprise version
3.2、首次启动
sudo mongod -f /var/opt/DB/mongodbEE/shard/shard.conf
3.3、选择shard1 && shard2 其中一台服务器配置副本集
mongo --port 27001
use admin
# run on shard1 server
rs.initiate(
  {
    _id: "shard1",
    members: [
      { _id : 0, host : "1.1.1.87:27001" },
      { _id : 1, host : "1.1.1.85:27001" }
    ]
  }
)

# ------------------------------------------------------------------------
mongo --port 27001
use admin
# run on shard2 server 
rs.initiate(
  {
    _id: "shard2",
    members: [
      { _id : 0, host : "1.1.1.67:27001" },
      { _id : 1, host : "1.1.1.86:27001" }
    ]
  }
)
4、添加arbiter到(shard1 && shard2)
  • 选择一台服务器配置即可,本文选择67服务器
4.1、创建所需的文件夹
sudo mkdir -p /var/opt/DB/mongodbEE/arbiter/shard1/log
sudo mkdir -p /var/opt/DB/mongodbEE/arbiter/shard1/data
sudo mkdir -p /var/opt/DB/mongodbEE/arbiter/shard2/log
sudo mkdir -p /var/opt/DB/mongodbEE/arbiter/shard2/data

4.2、配置shard1所需的arbiter /var/opt/DB/mongodbEE/arbiter/shard1/shard1.conf
processManagement:
   fork: true
   pidFilePath: /var/opt/DB/mongodbEE/arbiter/shard1/log/arbiter.pid
net:
   bindIp: 0.0.0.0
   port: 27026
   serviceExecutor: adaptive
storage:
   dbPath: /var/opt/DB/mongodbEE/arbiter/shard1/data
   journal:
      enabled: true
      commitIntervalMs: 200
replication:
   replSetName: shard1
sharding:
   clusterRole: shardsvr
systemLog:
   verbosity: 0
   destination: file
   path: "/var/opt/DB/mongodbEE/arbiter/shard1/log/arbiter.log"
   logAppend: true
   logRotate: reopen
   timeStampFormat: iso8601-local
#security:
#   authorization: enabled
   #transitionToAuth: true
#   keyFile: /var/opt/mongodbEE/mongodb-keyfile
4.3、配置shard2所需的arbiter /var/opt/DB/mongodbEE/arbiter/shard2/shard2.conf
processManagement:
   fork: true
   pidFilePath: /var/opt/DB/mongodbEE/arbiter/shard2/log/arbiter.pid
net:
   bindIp: 0.0.0.0
   port: 27027
   serviceExecutor: adaptive
storage:
   dbPath: /var/opt/DB/mongodbEE/arbiter/shard2/data
   journal:
      enabled: true
      commitIntervalMs: 200
replication:
   replSetName: shard2
sharding:
   clusterRole: shardsvr
systemLog:
   verbosity: 0
   destination: file
   path: "/var/opt/DB/mongodbEE/arbiter/shard2/log/arbiter.log"
   logAppend: true
   logRotate: reopen
   timeStampFormat: iso8601-local
#security:
#   authorization: enabled
   #transitionToAuth: true
#   keyFile: /var/opt/mongodbEE/mongodb-keyfile
4.4、首次启动
sudo mongod -f /var/opt/DB/mongodbEE/arbiter/shard1/shard1.conf
sudo mongod -f /var/opt/DB/mongodbEE/arbiter/shard2/shard2.conf
4.5、配置arbiter到对应的shard集中
mongo --port 27001
# shard1 上配置
rs.addArb("1.1.1.67:27026")
# shard2 上配置
rs.addArb("1.1.1.67:27027")
5、创建mongos客户端指定配置服务器,配置mongos.conf
  • mongos只是客户端,本文选择86、87服务进行的配置
5.1、mongos的启动配置文件 /var/opt/DB/mongodbEE/mongos/mongos.conf
processManagement:
   fork: true
   pidFilePath: /var/opt/DB/mongodbEE/mongos/log/mongos.pid
net:
   bindIp: 0.0.0.0
   ##should be changed after clusters stable
   port: 20000
   serviceExecutor: adaptive
sharding:
   configDB: cfgReplSet/1.1.1.85:27000,1.1.1.86:27000,1.1.1.87:27000
systemLog:
   verbosity: 0
   #traceAllExceptions: true
   destination: file
   path: "/var/opt/DB/mongodbEE/mongos/log/mongos.log"
   logAppend: true
   logRotate: reopen
   timeStampFormat: iso8601-local
#security:
   #authorization: enabled
   #transitionToAuth: true
   #clusterAuthMode: keyFile
#   keyFile: /var/opt/DB/mongodbEE/mongodb-keyfile
5.2、首次启动
sudo mongos -f /var/opt/DB/mongodbEE/mongos/mongos.conf

5.3、配置mongos集群

随便选择一台mongos服务器运行即可

mongo --port 20000
use admin

sh.addShard( "shard1/1.1.1.87:27001,1.1.1.85:27001,1.1.1.67:27026")
sh.addShard( "shard2/1.1.1.67:27001,1.1.1.86:27001,1.1.1.67:27027")

db.createUser(
  {
    user: "root",
    pwd: "root123",
    roles: [ { role: "root", db: "admin" } ]
  }
)

三、数据库添加内部安全认证

使用密钥文件身份验证,分片集群中的每个 mongod或实例使用密钥文件的内容作为共享密码来验证部署中的其他成员。mongos只有 具有正确密钥文件mongod的mongos实例才能加入分片集群。

客户端只能使用配置的客户端认证机制连接到分片集群。

注:加安全认证后使用用户登录才有增删改权限,否则只有查询权限

1、创建密钥文件

openssl生成复杂的伪随机 1024 字符串以用于密钥文件。然后它chmod用于更改文件权限以仅为文件所有者提供读取权限:

sudo bash -c "openssl rand -base64 756 > /var/opt/DB/mongodbEE/mongodb-keyfile"
sudo chmod 600 /var/opt/DB/mongodbEE/mongodb-keyfile
2、把生成的mongodb-keyfile文件拷贝到每个需要keyfile的服务器上,开启配置文件的注释

修改所有的配置文件,开启认证

security:
   #authorization: enabled
   keyFile: /var/opt/DB/mongodbEE/mongodb-keyfile
3、重启集群并生效:

关闭集群

# 停止mongos路由器
mongo --port 20000
db.getSiblingDB("admin").shutdownServer()

# shard关闭顺序 1、arbiter;2、secondary;3、master
mongo --port 27026
db.getSiblingDB("admin").shutdownServer()
mongo --port 27027
db.getSiblingDB("admin").shutdownServer()
mongo --port 27001
db.getSiblingDB("admin").shutdownServer()

# config关闭顺序 1、secondary;2、master
mongo --port 27000
db.getSiblingDB("admin").shutdownServer()

4、启动集群one by one
# 85->86->87
sudo numactl --interleave=all /usr/bin/mongod -f /var/opt/DB/mongodbEE/config/mongo.conf

# 87->67->85->86
sudo numactl --interleave=all /usr/bin/mongod -f /var/opt/DB/mongodbEE/shard/shard.conf
# ->67 && 67
sudo numactl --interleave=all /usr/bin/mongod -f /var/opt/DB/mongodbEE/arbiter/shard1/shard1.conf
sudo numactl --interleave=all /usr/bin/mongod -f /var/opt/DB/mongodbEE/arbiter/shard2/shard2.conf

# 86 && 87
sudo numactl --interleave=all /usr/bin/mongos -f /var/opt/DB/mongodbEE/mongos/mongos.conf

mongo --port 20000 --authenticationDatabase "admin" -u "root" -p "root123"
sh.startBalancer()
sh.getBalancerState()

5、登录
mongo --port 20000 --authenticationDatabase "admin" -u "root" -p "root123"
mongo --port 27000 --authenticationDatabase "admin" -u "root" -p "root123"
mongo --port 27001 --authenticationDatabase "admin" -u "root" -p "root123"

(Complete)

验证版本:

方法一、

db.serverBuildInfo().modules

方法二、

mongod -version

四、静态加密

简介:

企业功能

仅在 MongoDB Enterprise 中可用。

数据加密过程包括:

  • 生成主密钥。
  • 为每个数据库生成密钥。
  • 使用数据库密钥加密数据。
  • 使用主密钥加密数据库密钥

加密透明地发生在存储层;即从文件系统的角度来看,所有的数据文件都是完全加密的,数据只在内存中和传输过程中以未加密的状态存在。

1、MongoDB 的加密存储引擎支持主密钥的两种密钥管理选项:
  • 通过密钥管理互操作性协议 (KMIP) 与第三方密钥管理设备集成。推荐的
  • 通过密钥文件使用本地密钥管理。(本文使用)

MongoDB 无法加密现有数据。当您使用新密钥启用加密时,MongoDB 实例不能有任何预先存在的数据。如果您的 MongoDB 安装已经有现有数据,请参阅 Encrypt Existing Data at Rest了解更多步骤。

2、本地密钥管理

要使用密钥文件进行加密,您必须拥有一个包含单个 16 或 32 个字符的字符串的 base64 编码密钥文件。密钥文件只能由mongod进程的所有者访问。

2.1、 使用 16 或 32 个字符串创建 base64 编码的密钥文件。您可以使用您喜欢的任何方法生成编码的密钥文件。例如,
openssl rand -base64 32 > /var/opt/DB/mongodbEE/local-key/mongodb-keyfile
2.2、更新文件权限。
chmod 600 /var/opt/DB/mongodbEE/local-key/mongodb-keyfile

拷贝文件到所有需要的服务器上

2.3、要使用密钥文件,请从mongod以下选项开始:
  • --enableEncryption,
  • --encryptionKeyFile <path to keyfile>,
# 手动生效(本文并未使用,跳过)
mongod --enableEncryption --encryptionKeyFile  mongodb-keyfile

​ 所有mongod启动的配置文件添加如下内容(本文使用方式)

security:
   enableEncryption: true
   encryptionKeyFile: /var/opt/DB/mongodbEE/local-key/mongodb-keyfile
3、启动集群生效

注:3.1和3.2两个操作方式选择一个皆可。

3.1、只有初始化集群时才可以生效

启动集群,使用如下命令进行初始化mongo集群。或是参考(二)皆可。

========================================1、config)==========================================
# 85->86->87
sudo numactl --interleave=all /usr/bin/mongod -f /var/opt/DB/mongodbEE/config/mongo.conf
mongo --port 27000 --authenticationDatabase "admin"
use admin
rs.initiate(
  {
    _id: "cfgReplSet",
    configsvr: true,
    members: [
      { _id : 0, host : "1.1.1.85:27000" },
      { _id : 1, host : "1.1.1.86:27000" },
      { _id : 2, host : "1.1.1.87:27000" }
    ]
  }
)
=========================================2、shard)===========================================
# 87->67->85->86
sudo numactl --interleave=all /usr/bin/mongod -f /var/opt/DB/mongodbEE/shard/shard.conf
# ->67 && 67
sudo numactl --interleave=all /usr/bin/mongod -f /var/opt/DB/mongodbEE/arbiter/shard1/shard1.conf
sudo numactl --interleave=all /usr/bin/mongod -f /var/opt/DB/mongodbEE/arbiter/shard2/shard2.conf
mongo --port 27001 
use admin
# run on shard1 server
rs.initiate(
  {
    _id: "shard1",
    members: [
      { _id : 0, host : "1.1.1.87:27001" },
      { _id : 1, host : "1.1.1.85:27001" }
    ]
  }
)

db.createUser(
  {
    user: "root",
    pwd: "root123",
    roles: [ { role: "root", db: "admin" } ]
  }
)
# ------------------------------------------------------------------------
mongo --port 27001 
use admin
# run on shard2 server 
rs.initiate(
  {
    _id: "shard2",
    members: [
      { _id : 0, host : "1.1.1.67:27001" },
      { _id : 1, host : "1.1.1.86:27001" }
    ]
  }
)

db.createUser(
  {
    user: "root",
    pwd: "root123",
    roles: [ { role: "root", db: "admin" } ]
  }
)
# 再次重新登录shard进行配置
mongo --port 27001 --authenticationDatabase "admin" -u "root" -p "root123"
# shard1 上配置
rs.addArb("1.1.1.67:27026")
# shard2 上配置
rs.addArb("1.1.1.67:27027")

=========================================3、mongos)==========================================
# 86 && 87
sudo numactl --interleave=all /usr/bin/mongos -f /var/opt/DB/mongodbEE/mongos/mongos.conf

mongo --port 20000 --authenticationDatabase "admin"
use admin
sh.addShard( "shard1/1.1.1.87:27001,1.1.1.85:27001,1.1.1.67:27026")
sh.addShard( "shard2/1.1.1.67:27001,1.1.1.86:27001,1.1.1.67:27027")

db.createUser(
  {
    user: "root",
    pwd: "root123",
    roles: [ { role: "root", db: "admin" } ]
  }
)

mongo --port 20000 --authenticationDatabase "admin" -u "root" -p "root123"
sh.startBalancer()
sh.getBalancerState()
3.2、加密现有的静态数据

官网参考地址

4、验证加密密钥管理器是否使用密钥文件成功初始化。如果操作成功,该过程将记录以下消息:

查看对应的shard && config log日志即可

[initandlisten] Encryption key manager initialized with key file: <path to keyfile>

安装参考地址

TDE参考地址

配置文件设置和命令行选项映射

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值