从 Microsoft Entra ID 中删除密码用法

密码是可用的最不安全的身份验证方法之一。 它们容易受到各种威胁的攻击,包括网络钓鱼、凭据填充、暴力攻击和社会工程。 若要在 Microsoft Entra ID 中实现无密码身份验证的好处,必须确保密码不再作为租户中的登录选项提供。

密码混淆确保用户无法通过使用密码进行身份验证。 它强制他们使用更安全的防钓鱼无密码凭据,例如 Windows Hello 企业版、FIDO2 安全密钥或 Microsoft Authenticator 中的密码密钥。 由于在加密后没有已知的密码引用,因此会减少攻击者的攻击面。

本文提供了有关如何为从本地 Active Directory 域服务(AD DS)同步的混合用户和Microsoft Entra ID中的云用户加密密码的指导。

先决条件

从本地 AD DS 同步的混合用户帐户的争用密码

将用户从本地 AD DS 同步到 Microsoft Entra ID 的组织应在本地环境中加密用户密码,因为本地环境是同步用户帐户及其密码的权限源。 如果你的组织使用云身份验证并将密码哈希同步到 Microsoft Entra ID,那么这些被加密的密码也会同步到云端。 同步过程可确保用户在本地或云中不知道其密码,防止用户使用并促使用户使用更安全的无密码凭据。

使用脚本生成的随机值对本地用户密码进行打乱

在 Active Directory 中,无法从用户帐户中删除密码属性。 因此,为了防止密码被使用,可以定期混淆密码。

如果旧版应用程序仍需要密码进行身份验证,则用户可以继续使用自助密码重置(SSPR)将密码设置为已知状态以在一段时间内访问这些应用,直到其密码再次发生争用。

可以使用以下脚本定期将用户重置为已知状态的任何密码进行混淆处理。

该脚本允许你在你的 AD DS 域中加密用户的密码。 它生成 64 个字符的随机密码,并为变量名称$samAccountName中指定的用户设置密码。 必须修改脚本中的$samAccountName变量,以面向相应的用户。 在本地 AD DS 中使用具有适当权限的管理员帐户的凭据。

注意

一定要从安全受信任的环境中执行脚本,并确保脚本未被记录日志。 将脚本执行的主机视为特权主机,并给予与域控制器相同的安全级别。

$samAccountName = <sAMAccountName of the user>

Import-Module ActiveDirectory

function Generate-RandomPassword{
    [CmdletBinding()]
    param (
      [int]$Length = 64
    )
  $chars = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789!@#$%^&*()-_=+[]{};:,.<>/?\|`~"
  $random = New-Object System.Random
  $password = ""
  for ($i = 0; $i -lt $Length; $i++) {
    $index = $random.Next(0, $chars.Length)
    $password += $chars[$index]
  }
  return $password
}

Import-Module ActiveDirectory

$NewPassword = ConvertTo-SecureString -String (Generate-RandomPassword) -AsPlainText -Force

Set-ADAccountPassword -Identity $samAccountName -NewPassword $NewPassword -Reset

注释

如果密码争用脚本的运行频率低于当前密码期限策略,则应考虑将密码期限提高到大于此频率,或者将密码期限设置为 0,这会禁用密码过期。

在 Microsoft Entra ID 中随机化云用户帐户的密码

基于云的无密码用户应将其密码设置为随机值。 随机化密码可防止用户知道密码并使用密码进行身份验证。 (可选)如果最终用户遇到需要密码的应用程序,组织可以允许其重置其密码。 定期运行脚本,以混淆用户重置的密码并恢复到已知状态。

以下示例 PowerShell 脚本生成 64 个字符的随机密码,并将其设置为变量名为 $userId 的用户,在 Microsoft Entra ID 中应用。 修改脚本 的$userId 变量以匹配环境,然后在 PowerShell 会话中运行它。 当系统提示对Microsoft Entra ID进行身份验证时,请使用与可重置密码角色相关联的帐户凭据。

$userId = "<UPN of the user>"

function Generate-RandomPassword{
    [CmdletBinding()]
    param (
      [int]$Length = 64
    )
  $chars = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789!@#$%^&*()-_=+[]{};:,.<>/?\|`~"
  $random = New-Object System.Random
  $password = ""
  for ($i = 0; $i -lt $Length; $i++) {
    $index = $random.Next(0, $chars.Length)
    $password += $chars[$index]
  }
  return $password
}

Set-ExecutionPolicy -ExecutionPolicy RemoteSigned -Scope CurrentUser -Force
Install-Module Microsoft.Graph -Scope CurrentUser
Import-Module Microsoft.Graph.Users.Actions
Connect-MgGraph -Environment China -ClientId 'YOUR_CLIENT_ID' -TenantId 'YOUR_TENANT_ID' -Scopes "UserAuthenticationMethod.ReadWrite.All" -NoWelcome

$passwordParams = @{
 UserId = $userId
 AuthenticationMethodId = "28c10230-6103-485e-b985-444c60001490"
 NewPassword = Generate-RandomPassword
}

Reset-MgUserAuthenticationMethodPassword @passwordParams

注意

一定要从安全受信任的环境中执行脚本,并确保脚本未被记录日志。 将脚本执行的主机视为特权主机,并给予与域控制器相同的安全级别。

有关完全强制实施防钓鱼身份验证的组织的更多注意事项

如果组织不再需要密码,因为所有应用程序和方案都与无密码凭据兼容,则你可能不再需要为用户提供自助密码恢复选项。 请考虑禁用允许用户绕过已混淆密码并重新获得密码访问权限的工具。