

本文属于机器翻译版本。若本译文内容与英语原文存在差异，则一律以英文原文为准。

# 管理 Amazon DocumentDB 用户
<a name="security.managing-users"></a>

在 Amazon DocumentDB 中，用户与密码一起使用才能通过集群的身份验证。每个集群都有在创建集群时建立的主登录凭证。

**注意**  
 所有在 **2020 年 3 月 26 日**之前创建的新用户都已被授予 `dbAdminAnyDatabase`、`readWriteAnyDatabase` 和 `clusterAdmin` 角色。建议您重新评估所有用户并根据需要修改角色，以便为集群中所有用户强制执行最低权限。  
有关更多信息，请参阅 [使用基于角色的访问控制进行数据库访问](role_based_access_control.md)。

## 主用户和 `serviceadmin` 用户
<a name="security.managing-users-master"></a>

新创建的 Amazon DocumentDB 集群有两个用户：主用户和 `serviceadmin` 用户。

*主用户*是单个特权用户，可以执行管理任务并创建具有角色的其他用户。首次连接到 Amazon DocumentDB 集群时，必须使用主登录凭证进行身份验证。主用户在创建 Amazon DocumentDB 集群时收到该集群的这些管理权限，并被授予 `root` 角色。

在创建集群时会隐式创建 `serviceadmin` 用户。每个 Amazon DocumentDB 集群都有一个 `serviceadmin` 用户，该用户为 AWS 提供管理集群的功能。您无法登录、删掉、重命名、更改密码，或者修改 `serviceadmin` 的权限。任何此类尝试都会导致错误。

**注意**  
无法删除 Amazon DocumentDB 集群的主用户和 `serviceadmin` 用户，也无法撤销主用户的 `root` 角色。  
如果您忘记了主用户密码，则可以使用 AWS 管理控制台 或 AWS CLI 重置密码。

## 创建其他用户
<a name="security.managing-users-creating"></a>

作为主用户（或具有 `createUser` 角色的任何用户）连接后，您可以创建新用户，如下所示。

```
db.createUser(
    {
        user: "sample-user-1",
        pwd: "password123",
        roles: 
            [{"db":"admin", "role":"dbAdminAnyDatabase" }]
    }
)
```

要查看用户的详细信息，可以使用 `show users` 命令，如下所示。您还可以使用 `dropUser` 命令删除用户。有关更多信息，请参阅 [通用命令](role_based_access_control.md#role_based_access_control-common_commands)。

```
show users
{ 
    "_id" : "serviceadmin",
    "user" : "serviceadmin",
    "db" : "admin",
    "roles" : [
    	{
            "role" : "root",
            "db" : "admin"
        }
    ]
},

{ 
    "_id" : "myPrimaryUser",
    "user" : "myPrimaryUser",
    "db" : "admin",
    "roles" : [
    	{
            "role" : "root",
            "db" : "admin"
        }
    ]
},

{
    "_id" : "sample-user-1",
    "user" : "sample-user-1",
    "db" : "admin",
    "roles" : [
    	{
            "role" : "dbAdminAnyDatabase",
            "db" : "admin"
    	}
    ]
}
```

在上面的示例中，新用户 `sample-user-1` 受 `admin` 数据库的限制。对于新用户来说，情况总是如此。Amazon DocumentDB 没有 `authenticationDatabase` 的概念，因此所有身份验证都是在 `admin` 数据库中进行的。

在创建用户时，如果在指定角色时省略 `db` 字段，则 Amazon DocumentDB 会隐式地将该角色归属于发出连接的数据库。例如，如果您的连接是针对数据库 `sample-database` 发出的，并且您运行以下命令，则用户 `sample-user-2` 将在 `admin` 数据库中创建并具有对数据库 `readWrite` 的 `sample-database` 权限。

```
db.createUser(
    {
        user: "sample-user-2", 
        pwd: "password123", 
        roles: 
            ["readWrite"]
    }
)
```

创建具有跨所有数据库范围的角色的用户（例如，`readInAnyDatabase`）需要在创建用户时处于 `admin` 数据库上下文，或者在创建用户时明确指定角色的数据库。

要切换数据库上下文，可以使用以下命令。

```
use admin
```

要了解有关基于角色的访问控制以及对集群用户强制执行最低权限的更多信息，请参阅[使用基于角色的访问控制进行数据库访问](role_based_access_control.md)。

## 自动轮换 Amazon DocumentDB 的密码
<a name="security.managing-users-rotating-passwords"></a>

借助 AWS Secrets Manager，您可以将代码中的硬编码凭证（包括密码）替换为对 Secrets Manager 的 API 调用，从而以编程方式检索密钥。这有助于确保检查您的代码的人不会泄露密钥，因为其中根本不包含密钥。此外，您还可以配置 Secrets Manager 以根据指定的计划自动轮换密钥。这使您能够将长期密钥替换为短期密钥，这有助于显著减少泄露风险。

借助 Secrets Manager，您可以使用 Secrets Manager 提供的 AWS Lambda 函数自动轮换 Amazon DocumentDB 的密码（即*密钥*）。

有关 AWS Secrets Manager 以及与 Amazon DocumentDB 的本机集成的更多信息，请参阅以下内容：
+ [博客：如何在 AWS Secrets Manager 中轮换 Amazon DocumentDB 和 Amazon Redshift 凭证](https://aws.amazon.com/blogs/security/how-to-rotate-amazon-documentdb-and-amazon-redshift-credentials-in-aws-secrets-manager/)
+ [什么是 AWS Secrets Manager？](https://docs.aws.amazon.com/secretsmanager/latest/userguide/intro.html)
+ [轮换 AWS Secrets Manager 密钥](https://docs.aws.amazon.com/secretsmanager/latest/userguide/rotating-secrets-documentdb.html)
+ [Secrets Manager 中的 Amazon DocumentDB 凭证](https://docs.aws.amazon.com/secretsmanager/latest/userguide/reference_secret_json_structure.html#reference_secret_json_structure_docdb)