【问题标题】:How do you turn on password hashing (SSHA) in openLDAP [closed]如何在 openLDAP 中打开密码散列(SSHA)[关闭]
【发布时间】:2012-07-28 17:08:18
【问题描述】:

对于我的一生,我似乎在任何地方都找不到这个,如果有人能给我一个链接,我将非常感激。

我们正在尝试在 openLDAP 中启用 SSHA 散列。默认情况下,它以明文形式存储密码,我认为这是犯罪行为,但嘿,我是一个广告人,所以我知道什么。但是您会认为,如果您愿意,他们会很容易找到打开散列所需的信息。你不会选择吗?

【问题讨论】:

  • 对于其他人来说值得注意的是:在您的身份验证数据库(LDAP、AD 或其他任何东西)中存储散列密码并不是它看起来的安全灵丹妙药。 SASL 极大地提高了线路(通过网络)的安全性,但要求原始密码对链路的两端都可用。因此,权衡是数据存储(散列)中更好的安全性与网络上更好的安全性(SASL)。
  • 来自man slapo-ppolicy:指定添加和修改请求中存在的明文密码在存储到数据库之前应该经过哈希处理。这违反了 X.500/LDAP 信息模型,但可能需要补偿不使用密码修改扩展操作来管理密码的 LDAP 客户端。

标签: hash passwords salt openldap ssha


【解决方案1】:

OpenLDAP 支持多种存储方案供管理员选择。您用于创建帐户的工具必须配置为进行散列。服务器将以客户端请求的格式存储密码。如果散列处理正确,ldapsearch 将显示散列后的密码,如下所示:

userPassword: {SSHA}d0Q0626PSH9VUld7yWpR0k6BlpQmtczb

详情请见http://www.openldap.org/doc/admin24/security.html

说到管理工具,我个人推荐http://phpldapadmin.sourceforge.net

【讨论】:

  • 真的吗?因此,您是说进行密码散列的唯一方法是让客户端或外部来源执行此操作。这似乎不太理想,而且有点危险。在 AD 世界中,它是集中完成和集中管理的。这让我难以置信。
  • 等等,如果密码是经过哈希处理的,那么服务器上的密码强度测试如何运行,我知道这是 openLDAP 吹捧的一项功能?
  • LDAP 只是一个目录。执行密码策略取决于身份验证层而不是存储层。真的,这就是 UNIX 世界的运作方式,有一种工具只做一件事并且做得很好。要实施密码策略,您需要配置用户用于更改密码的工具,无论是 Web 界面还是命令行实用程序。我知道这可能很难相信没有“中心”的东西可以做所有事情,但这就是模块化的想法。
  • 如果您想要一个完整的解决方案,其中所有配置均开箱即用,并在其之上提供管理界面,请考虑使用 FreeIPA。它有 LDAP(虽然 RedHat 的版本不是 OpenLDAP)、Kerberos 等,所有这些都预先配置为可以相互协作,并且在所有内容之上都有一个简洁的 Web 界面。 freeipa.org 不过有一个警告:你需要在 Fedora 或 RedHat EL 上运行它
  • 谢谢大家,我们成功了。我们的 openLDAP 现在正在处理传入密码的哈希 (ssha) 以及针对该哈希密码的身份验证。似乎很少使用或配置一次并留给“正常工作”的 LDAP 功能在参考和领域专业知识方面很少。经过几个小时的谷歌搜索,我只能找到一个链接,幸运的是,这是我唯一需要的。支持 Najmuddin 给我其中的一部分。奖品归他所有。
【解决方案2】:

LDAP 规范需要明文密码才能实现互操作性。上面给出的关于安全性的链接将为您提供服务器可以强制执行的默认哈希类型的选项,但请考虑其含义。

【讨论】:

  • 您对发送纯文本的要求是正确的。我想这就是为什么 openLDAP 需要先打开 SL 才能将其配置为开始散列密码。我的问题是,为什么它允许在关闭散列的情况下发送纯文本密码。安全方面,从一开始就打开散列并要求用户将其关闭不是更好吗?有点像 BSD 模型,默认情况下所有东西都关闭了,需要学习者打开危险的东西。
【解决方案3】:

你可以使用'password-hash'来改变散列算法,默认是SSHA(非明文)。

请注意,slapd 仅在客户端发送的密码是纯文本时才使用上述内容,如果您的客户端发送的是散列密码,它将按原样存储。

例如:使用 pam_ldap,使用 pam_password exop(或清除)

如果密码是经过哈希处理的,并且我知道这是 openLDAP 吹捧的一项功能,那么如何在服务器上运行密码强度测试?

如果您发送散列密码,slapd 无法执行强度测试,因此客户端必须以明文形式发送密码(ppolicy 可以选择接受/拒绝散列密码)。

注意:

  1. 确保您的客户使用 ssl/tls(因此密码不会以明文形式发送)
  2. userpassword 属性包含特殊字符 ({}),因此您必须执行 base64 -d 来识别所使用的哈希算法。

eg:通常返回的属性格式如下(::表示结果是base64编码的)

userPassword:: e1NTSEF9QjU0VXNmQWhJN1dQZ3FvbDVSQ1l5RHUzTlVqa1luVVhYV2ljbmc9PQ=
 =

$ echo e1NTSEF9QjU0VXNmQWhJN1dQZ3FvbDVSQ1l5RHUzTlVqa1luVVhYV2ljbmc9PQ==|openssl base64 -d
{SSHA}B54UsfAhI7WPgqol5RCYyDu3NUjkYnUXXWicng==

【讨论】:

  • 谢谢纳吉。您的建议成为我们解决方案的一部分。我关于测试强度的评论实际上是在质疑其他建议散列应该在发送到 LDAP 进行身份验证之前进行的人。上面的陈述是我想到的,让我对评论产生了怀疑。再次感谢...胜利归于你,我的朋友。
【解决方案4】:

当您尝试在添加/修改 LDAP 操作中存储 userPassword 属性时,userPassword 值存储为纯文本。但是您可以使用 OpenLDAP 中 ppolicy 覆盖模块中的 ppolicy_hash_cleartext 选项覆盖此行为。启用后,当客户端发送纯文本密码时,默认存储为SSHA。您可以从here找到更多关于在 OpenLADP 中启用哈希密码的详细信息

【讨论】:

    【解决方案5】:

    这是一个老问题,但仍然相关。由于其相对容易的暴力破解,不再推荐使用 SSHA(即 SHA-1)。

    更安全的散列算法是 SHA-512。使用 OpenSSL 1.1 可以在客户端生成更强的哈希,如下所示:

    _generate_password_hash() {
      local plaintext; plaintext="$1"
    
      command printf "{CRYPT}%s" "$(openssl passwd -6 -stdin <<< "${plaintext}")"
    }
    

    这将输出一个字符串,例如:

    {CRYPT}$6$SGIWzAbjh.3WoQQJ$vEFlcRBQpd2fJ8dxcbojr83pjQcXcJ.InRMzNRryTQ//fMYJoCRFWAPn22EvJyDikG.MNuUqRYqQtI97Clj2F0
    

    请注意开头的 {CRYPT} 而不是 {SSHA}

    例如,您可以使用 ldapmodify 应用密码:

    ldapmodify -h "${LDAP_HOST}" -D cn=user,dc=example,dc=com -W <<EOF
    dn: cn=user,dc=example,dc=com
    changetype: modify
    replace: userPassword
    userPassword: $(_generate_password_hash NEW_PASSWORD_HERE)
    EOF
    

    请注意,LibreSSL 有一组不同的哈希算法可用。如果openssl passwd --help 没有显示-6 选项,请使用openssl version 检查您的实际OpenSSL 版本。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2019-03-19
      • 2014-01-31
      • 2012-08-06
      • 2014-09-04
      • 1970-01-01
      • 2017-06-26
      • 2010-12-22
      相关资源
      最近更新 更多