使用 LDAP 用户名作为实体名称

Use LDAP username as the entity name

我正在使用 Hashicorp Vault 1.9.0 并启用了 LDAP 身份验证方法,该方法按预期正常工作,但我遇到了一个问题:

LDAP 是我们唯一的身份验证方法(当然,除了 Token 之外)并且 LDAP 用户不是事先在 Vault 中创建的。因此,当某些用户首次登录 Vault 时,Vault 会自动创建用户实体,使用通用名称,例如“entity_1fb81714”,并将 LDAP 用户名添加为该实体的别名。这工作得很好(但可能会更好)。有没有办法将 Vault 配置为使用 LDAP 用户名(与别名中使用的相同)作为实体名称,而不是通用的“entity_xxx”?

实体名称:

实体别名:

可以做,但是看到维护的时候可能会放弃...

所以你有一个随机名称的实体,“内部”有一个 entity-alias 具有给定用户的 sAMAccountName 属性。

背景

实体创建不是由 ldap 身份验证后端完成的。如果 Vault 找不到具有匹配实体别名的现有实体,将创建一个实体。

所以基本上它是这样做的:

  1. 尝试查找其中包含该别名的现有实体
  2. 如果找到 none,则创建一个新实体

问题是 Vault 不能使用实体别名属性值作为名称,因为您可以为任何给定实体使用多个实体别名。其他身份验证后端(如 Github)可能具有不同的实体别名属性。 Vault 无法决定应该使用哪一个,因此选择了一个随机名称。

可以完成

要为您的实体使用可预测的名称,您必须使用您选择的名称和别名预先创建实体,以便在用户使用时显示首先登录,Vault 会去寻找它。

出于以下三个原因,我建议您学会接受随机名称:

  1. 管理层
  2. 竞争条件
  3. 许可费用

管理

当用户来来去去时,您将不得不轮询您的 Active Directory 以获取更改和 create/delete 实体别名。请记住,Vault 不会验证实体别名是否有效,这是您的工作。不是一段复杂的代码,但它不会自行编写和维护,您可能有更好的事情要做。

竞争条件

即使有同步机制,在脚本的两次传递之间,用户登录 Vault 时仍然会发生变化。该用户将获得一个随机的实体名称。您的脚本可以解决这个问题并在下一个 运行 上修复它,但这会使您的同步代码更加复杂。

许可证

Vault Enterprise 按实体授予许可。为 Active Directory 中的每个人创建一个实体别名可能会很昂贵。您的脚本也可以解决这个问题,仅为给定组的成员创建实体别名,但是...您明白了。

你可能会这样:如果你想控制实体名称

ixe013 回答之后,我决定制作一个脚本来查找“entity_xxx”默认名称并将它们更改为 LDAP 适当的用户名。

成功了!

脚本的主要部分如下所示。

# GET THE VAULT ENTITY LIST
entity_list=$(curl --header "X-Vault-Token: $TOKEN" --request LIST "https://VAULT-SERVER/v1/identity/entity/name" | jq --raw-output .data.keys[])

# FOR EACH ENTITY
for e in $entity_list
do
    # GET THE ENTITY INFORMATION
    entity_info=$(curl --header "X-Vault-Token: $TOKEN" --request GET "https://VAULT-SERVER/v1/identity/entity/name/$e")

    # GET THE LDAP USERNAME
    user=$(echo $entity_info | jq --raw-output '.data.aliases[] | select(.mount_type=="ldap") | .name')

    # VERIFY IF LDAP USERNAME EXISTS AND IT IS DIFFERENT FROM ENTITY NAME
    if [[ $user != "" && $user != $e ]]
    then
        # GET THE ENTITY ID
        id=$(echo $entity_info | jq --raw-output .data.id)

        # FIX THE ENTITY NAME
        curl --header "X-Vault-Token: $TOKEN" --request POST "https://VAULT-SERVER/v1/identity/entity/id/$id" <<EOF
        {
            "name": "$user"
        }
EOF
    fi
done