欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页  >  IT编程

MongoDB数据库使用keyfile访问控制的方式部署副本集(实例教程)

程序员文章站 2022-06-09 23:13:33
简介 副本集强制访问控制需要配置: 使用内部认证机制保证副本集成员之间的安全 使用基于角色的访问控制保证连接客户端和副本集的安全 本教程中,副本集的每个成员使用了相同的内部认证机制和设置。 强制内部...

简介

副本集强制访问控制需要配置:

使用内部认证机制保证副本集成员之间的安全 使用基于角色的访问控制保证连接客户端和副本集的安全

本教程中,副本集的每个成员使用了相同的内部认证机制和设置。

强制内部认证即强制用户访问控制。为了连接到副本集,像mongo shell的客户端需要使用用户账号。

注意事项

keyfile安全

keyfiles是安全的最小格式,非常适合测试和开发环境。对于生产环境,推荐使用x.509 certificates。

访问控制

本文介绍了只在admin创建最少的管理用户。关于用户认证,本文使用了默认的scram-sha-1认证机制。scram-sha-1安全机制是最适合测试和开发环境的。对于生产环境,推荐使用x.509 certificates或ldap proxy authentication或kerberos authentication。

使用keyfile访问控制部署新副本集

1. 创建keyfile

使用keyfile认证,副本集中的每个mongod实例使用keyfile内容作为认证其他成员的共享密码。只有有正确的keyfile的mongod实例可以加入副本集。

keyfile的内容必须是6到1024个字符的长度,且副本集所有成员的内容必须相同。

**注意:

unix中,keyfile必须没有组权限或完全权限。windows系统中,keyfile权限没有被检查。**

你可以使用任意方法生成keyfile。例如,如下操作使用openssl生成复杂的随机的1024个字符串。然后使用chmod修改文件权限,只给文件拥有者提供读权限。

2. 把keyfile拷贝到每个副本集成员

把keyfile拷贝到副本集成员的服务器主机上。保证运行mongod实例的用户是keyfile的拥有者且能访问该文件。

避免存储keyfile的存储介质很容易从运行mongod实例的主机上失去连接,比如usb驱动或网络存储设备。

3. 强制启用副本集每个成员的访问控制

使用keyfile参数运行mongod,强制执行内部认证和基于角色的访问控制。

对于副本集的每个mongod实例,使用配置文件或命令行启动mongod。

**注意:

初始化之后就不能修改副本集名字了。所以这一步要选取一个合适的名字。**

配置文件

如果使用配置文件,使用security.keyfile选项设置keyfile的路径,使用replication.replsetname设置副本集名字。

security:
  keyfile: 
replication:
  replsetname: 

使用配置文件启动mongod:

mongod --config 

命令行

如果使用命令行,通过--keyfile和--replset参数启动mongod。

mongod --keyfile  --replset 

4. 通过localhost接口连接到副本集成员

使用mongo shell通过localhost接口连接到mongod实例。必须在同一物理机上运行mongo shell作为mongod实例。

localhost接口只有在没有创建用户的情况下可用。一旦创建了用户localhost接口就关闭了。

5. 初始化副本集

rs.initiate()方法初始化副本集,并且可以有可选的副本集配置文档。

副本集配置文档包括:

_id。_id必须和传给mongod的--replset参数匹配。 members。members是个数组,需要副本集的每个成员有个文档。

以下是包含三个成员的副本集例子:

rs.initiate(
  {
    _id : ,
    members: [
      { _id : 0, host : "mongo1.example.net:27017" },
      { _id : 1, host : "mongo2.example.net:27017" },
      { _id : 2, host : "mongo3.example.net:27017" }
    ]
  }
)

rs.initiate()触发选举,并选举出一个成员作为primary。

进行下一步操作之前要先连接到primary。使用rs.status()可以查看primary成员。

6. 创建管理员用户

**重要:

创建一个用户后,localhost异常就不可用了。

第一个用户必须有创建其他用户的权限,比如useradminanydatabase角色的用户。这保证了你以后可以创建其他用户。

如果没有一个用户有创建用户的权限,一旦localhost异常关闭你就不能创建或修改用户了,也不能进行必须的操作。**

使用db.createuser()方法添加用户。admin数据库的用户至少应该有useradminanydatabase角色。

必须连接到primary创建用户。

下面例子是在admin数据库创建了一个有useradminanydatabase角色的用户fred。

**重要:

密码应该是随机的,足够长的,复杂的,以保证,避免恶意访问。**

admin = db.getsiblingdb("admin")
admin.createuser(
  {
    user: "fred",
    pwd: "changeme1",
    roles: [ { role: "useradminanydatabase", db: "admin" } ]
  }
)

7. 使用管理员用户认证

在admin数据库认证。

在mongo shell中,使用db.auth()认证。例如,下面认证了管理员用户fred:

db.getsiblingdb("admin").auth("fred", "changeme1")

另外,通过mongo shell,使用-u ,-p 和--authenticationdatabase参数连接到副本集主库。

mongo -u "fred" -p "changeme1" --authenticationdatabase "admin"

8. 创建群管理员

clusteradmin角色授予副本集操作访问权限,例如配置副本集。

创建群管理员用户,并分配clusteradmin角色。

db.getsiblingdb("admin").createuser(
  {
    "user" : "ravi",
    "pwd" : "changeme2",
    roles: [ { "role" : "clusteradmin", "db" : "admin" } ]
  }
)

9. 创建其他用户(可选)

创建用户,允许客户端与副本集连接和交互。