

# 在 RDS for SQL Server 上为 SQL Server 登录名使用密码策略
<a name="SQLServer.Concepts.General.PasswordPolicy.Using"></a>

Amazon RDS 支持您为运行 Microsoft SQL Server 的 Amazon RDS 数据库实例设置密码策略。使用这一点为使用 SQL Server 身份验证对数据库实例进行身份验证的登录名设置复杂性、长度和锁定要求。

## 关键术语
<a name="SQLServer.Concepts.General.PasswordPolicy.Using.KT"></a>

**登录**  
在 SQL Server 中，可以对数据库实例进行身份验证的服务器级主体称为**登录名**。其它数据库引擎可能会将此主体称为*用户*。在 RDS for SQL Server 中，登录名可以使用 SQL Server 身份验证或 Windows 身份验证进行身份验证。

**SQL Server 登录名**  
使用用户名和密码通过 SQL Server 身份验证进行身份验证的登录名是 SQL Server 登录名。您通过数据库参数配置的密码策略仅适用于 SQL Server 登录名。

**Windows 登录名**  
基于 Windows 主体并使用 Windows 身份验证进行身份验证的登录名是 Windows 登录名。您可以在 Active Directory 中为 Windows 登录名配置密码策略。有关更多信息，请参阅 [将 Active Directory 用于 RDS for SQL Server](User.SQLServer.ActiveDirectoryWindowsAuth.md)。

## 为每个登录名启用和禁用策略
<a name="SQLServer.Concepts.General.PasswordPolicy.EnableDisable"></a>

 每个 SQL Server 登录名都有用于 `CHECK_POLICY` 和 `CHECK_EXPIRATION` 的标志。默认情况下，创建新登录名时，`CHECK_POLICY` 设置为 `ON`，而 `CHECK_EXPIRATION` 设置为 `OFF`。

如果为登录名启用 `CHECK_POLICY`，则 RDS for SQL Server 会根据复杂性和最小长度要求验证密码。锁定策略也适用。用于启用 `CHECK_POLICY` 和 `CHECK_EXPIRATION` 的示例 T-SQL 语句：

```
ALTER LOGIN [master_user] WITH CHECK_POLICY = ON, CHECK_EXPIRATION = ON;
```

如果启用 `CHECK_EXPIRATION`，则密码受密码使用期限策略的约束。用于检查是否设置了 `CHECK_POLICY` 和 `CHECK_EXPIRATION` 的 T-SQL 语句：

```
SELECT name, is_policy_checked, is_expiration_checked FROM sys.sql_logins;
```

## 密码策略参数
<a name="SQLServer.Concepts.General.PasswordPolicy.PWDPolicyParams"></a>

所有密码策略参数都是动态的，不需要重启数据库即可生效。下表列出了您可以设置来修改 SQL Server 登录名的密码策略的数据库参数：


****  

| 数据库参数 | 描述 | 允许的值 | 默认值 | 
| --- | --- | --- | --- | 
| rds.password\$1complexity\$1enabled | 创建或更改 SQL Server 登录名的密码时，必须满足密码复杂性要求。必须满足以下约束：[\[See the AWS documentation website for more details\]](http://docs.aws.amazon.com/zh_cn/AmazonRDS/latest/UserGuide/SQLServer.Concepts.General.PasswordPolicy.Using.html)  | 0、1 | 0 | 
| rds.password\$1min\$1length | SQL Server 登录名的密码中所需的最小字符数。 | 0-14 | 0 | 
| rds.password\$1min\$1age | 用户在更改 SQL Server 登录名密码之前必须使用该密码的最少天数。当设置为 0 时，可以立即更改密码。 | 0-998 | 0 | 
| rds.password\$1max\$1age | 可以使用 SQL Server 登录名密码的最大天数，之后用户需要更改密码。设置为 0 时，密码从不过期。 | 0-999 | 42 | 
| rds.password\$1lockout\$1threshold | 导致 SQL Server 登录名被锁定的连续失败登录尝试次数。 | 0-999 | 0 | 
| rds.password\$1lockout\$1duration | 锁定的 SQL Server 登录名在被解锁之前必须等待的分钟数。 | 1-60 | 10 | 
| rds.password\$1lockout\$1reset\$1counter\$1after | 登录尝试失败后必须经过的分钟数，之后才会将失败的登录尝试计数器重置为 0。 | 1-60 | 10 | 

**注意**  
有关 SQL Server 密码策略的更多信息，请参阅[密码策略](https://learn.microsoft.com/en-us/sql/relational-databases/security/password-policy)。  
密码复杂性和最小长度策略也适用于所包含的数据库中的数据库用户。有关更多信息，请参阅[包含的数据库](https://learn.microsoft.com/en-us/sql/relational-databases/databases/contained-databases)。

以下约束适用于密码策略参数：
+ 除非 `rds.password_max_age` 设置为 0，否则 `rds.password_min_age` 参数必须小于 `rds.password_max_age parameter`
+ `rds.password_lockout_reset_counter_after` 参数必须小于或等于 `rds.password_lockout_duration` 参数。
+ 如果 `rds.password_lockout_threshold` 设置为 0，则 `rds.password_lockout_duration` 和 `rds.password_lockout_reset_counter_after` 不适用。

### 现有登录名的注意事项
<a name="SQLServer.Concepts.General.PasswordPolicy.ExistingLogins"></a>

修改实例上的密码策略后，**不会**根据新的密码复杂性和长度要求对登录名的现有密码进行追溯性评估。只有新密码才会根据新策略进行验证。

SQL Server **确实**会根据使用期限要求评估现有密码。

修改密码策略后，密码可能会立即过期。例如，如果登录名已启用 `CHECK_EXPIRATION`，其密码上次更改是在 100 天前，并且您将 `rds.password_max_age` 参数设置为 5 天，则密码将立即过期，并且登录名需要在下次尝试登录时更改其密码。

**注意**  
RDS for SQL Server 不支持密码历史记录策略。历史记录策略可禁止登录名重用以前用过的密码。

### 多可用区部署的注意事项
<a name="SQLServer.Concepts.General.PasswordPolicy.MAZPasswords"></a>

多可用区实例的失败登录尝试计数器和锁定状态不会在节点之间复制。如果在多可用区实例失效转移时登录名被锁定，则登录名可能已经在新节点上被解锁。

# 主登录名的密码注意事项
<a name="SQLServer.Concepts.General.PasswordPolicy.MasterLogin"></a>

创建 RDS for SQL Server 数据库实例时，不会根据密码策略评估主用户密码。在对主用户执行操作时，特别是在 `ModifyDBInstance` 命令中设置 `MasterUserPassword` 时，也不会根据密码评估新的主密码。在这两种情况下，您都可以为不符合密码策略的主用户设置密码，并且操作仍然会成功。如果不符合该策略，则 RDS 会尝试引发 RDS 事件，并建议设置强密码。请注意，只对主用户使用强密码。

当主用户密码不符合密码策略要求时，RDS 会尝试生成以下事件消息：
+ 已创建主用户，但密码不符合密码策略的最小长度要求。请考虑使用更强的密码。
+ 已创建主用户，但密码不符合密码策略的复杂性要求。请考虑使用更强的密码。
+ 已重置主用户密码，但密码不符合密码策略的最小长度要求。请考虑使用更强的密码。
+ 已重置主用户密码，但密码不符合密码策略的复杂性要求。请考虑使用更强的密码。

默认情况下，创建主用户时，`CHECK_POLICY` 和 `CHECK_EXPIRATION` 设置为 `OFF`。要将密码策略应用于主用户，必须在创建数据库实例后，手动为主用户启用这些标志。启用这些标志后，直接在 SQL Server 中修改主用户密码（例如，通过 T-SQL 语句或 SSMS），来根据密码策略验证新密码。

**注意**  
如果主用户被锁定，则可以通过使用 `ModifyDBInstance` 命令重置主用户密码来为该用户解锁。

## 修改主用户密码
<a name="SQLServer.Concepts.General.PasswordPolicy.MasterLogin.Reset"></a>

可以使用 [ModifyDBInstance](https://docs.aws.amazon.com/AmazonRDS/latest/APIReference/API_ModifyDBInstance.html) 命令修改主用户密码。

**注意**  
重置主用户密码时，RDS 会为主用户重置各种权限，而主用户可能会失去某些权限。如果主用户已被锁定，则重置主用户密码也会解除其锁定。

RDS 会验证新的主用户密码，如果密码不符合策略，则尝试发出 RDS 事件。即使密码不符合密码策略，RDS 也会设置密码。