【问题标题】:How to securely authenticate AD user in Powershell (encrypt credentials)如何在 Powershell 中安全地验证 AD 用户(加密凭据)
【发布时间】:2014-03-05 16:46:12
【问题描述】:

我的应用程序要求用户通过 Active Directory 的身份验证。我们正在考虑使用 System.DirectoryServices.DirectoryEntry 执行一个 PowerShell 脚本,我们将用户名和密码传递给该脚本。

我在另一个答案中看到 System.DirectoryServices.DirectoryEntry 使用 LDAP 读取 AD 信息这一事实。 LDAP 协议本身未加密。您可以使用 LDAPS,但这需要设置 CA。我想知道此命令生成的网络流量默认情况下是否安全 - 即是否可以通过网络嗅探密码?

编辑 我发现您可以将其他选项传递给 DirectoryEntry 实例。这是示例代码:

$username = $args[0]
$password = $args[1]

Function Test-ADAuthentication {
    param($username,$password)
    (new-object directoryservices.directoryentry "",$username,$password,Secure -bor Sealing).psbase.name -ne $null
}

Test-ADAuthentication $username $password

第四个参数是一个枚举AuthenticationTypes http://msdn.microsoft.com/en-us/library/system.directoryservices.authenticationtypes(v=vs.90).aspx

似乎感兴趣的值是:Secure & Sealing,它们结合起来将加密凭据

非常感谢您的阅读。

【问题讨论】:

    标签: .net windows powershell active-directory


    【解决方案1】:

    这是我发现在 Powershell 脚本中向 AD 验证用户的最佳解决方案。根据 MS 文档,协商和密封标志一起将加密数据:http://msdn.microsoft.com/en-us/library/system.directoryservices.accountmanagement.contextoptions(v=vs.110).aspx

    $username = $args[0]
    $password = $args[1]
    
    $pc = New-Object -TypeName System.DirectoryServices.AccountManagement.PrincipalContext 'Domain', $system.Domain
    
    return $pc.ValidateCredentials($username, $password, [DirectoryServices.AccountManagement.ContextOptions]::Negotiate -bor [DirectoryServices.AccountManagement.ContextOptions]::Sealing)
    

    【讨论】:

      【解决方案2】:

      如果我没记错的话,不可能以未加密的方式向 Active Directory 进行身份验证。每个域控制器在接受凭据之前都会与客户端建立某种加密连接。

      Powershell 使用与其他客户端相同的方法对 DC 进行身份验证。也就是说,无论您是在 Windows 8 登录屏幕、Sharepoint 页面、定制程序还是 Powershell 提示符中输入凭据,DC 都将以相同的方式进行身份验证。您可以通过组策略修改 AD 的身份验证机制,但每种机制都会对数据进行加密。

      在几分钟的谷歌搜索中,我没有找到太多文档,但是华盛顿大学的这篇文章很好地概述了 LDAP 以及与 AD 相关的 LDAP。跳到“Active Directory 支持四种 SASL 身份验证机制”这一行

      http://www.netid.washington.edu/documentation/ldapAuth.aspx

      另外,GPO 的两个链接与登录安全相关。与您的问题无关,但它们可能很方便: http://technet.microsoft.com/en-us/library/dn169021%28v=ws.10%29.aspx http://technet.microsoft.com/en-us/library/jj852258%28v=ws.10%29.aspx

      【讨论】:

      • 嗨,迈克尔。感谢您的时间。就 LDAP 而言 - 默认情况下它不会加密,除非您使用 LDAPS 协议,我已经知道了。我不相信您的第二段 - Powershell 只是使用我上面的代码示例中的 .NET 库 - 除非所有 powershell 流量都被加密?但是,我现在找到了如何启用 Secure+Sealing 身份验证,根据文档,它将使用 Kerberos 提供安全身份验证...
      猜你喜欢
      • 1970-01-01
      • 2012-10-05
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-10-12
      相关资源
      最近更新 更多