

# 在 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.amazonaws.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>

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