将用户和组映射到角色

编辑

除了 nativefile 之外,所有 realm 都支持角色映射。

native 和 file realm 直接将角色分配给用户。Native realm 使用 用户管理 API。File realm 使用 基于文件的角色管理

您可以通过 角色映射 API (推荐)或 角色映射文件 来映射角色。

PKI、LDAP、AD、Kerberos、OpenID Connect、JWT 和 SAML realm 支持 角色映射 API。只有 PKI、LDAP 和 AD realm 支持 角色映射文件

PKI、LDAP、AD、Kerberos、OpenID Connect、JWT 和 SAML realm 还支持 委托授权。您可以为一个 realm 映射角色或使用委托授权;您不能同时使用两者。

要使用角色映射,您需要创建角色和角色映射规则。角色映射规则可以基于 realm 名称、realm 类型、用户名、组、其他用户元数据或这些值的组合。

当启用 匿名访问 时,匿名用户的角色也会分配给所有其他用户。

如果通过 API 以及角色映射文件创建了角色映射规则,则会合并这些规则。一个用户可能拥有一些通过 API 映射的角色,以及其他基于角色映射文件分配的角色。您可以通过 API 定义角色映射,或者通过 文件 管理它们。Elasticsearch 安全功能内部会合并这两种角色映射来源,因此一个用户有可能拥有一些通过 API 映射的角色,以及其他通过文件映射的角色。

未分配角色的用户将无权执行任何操作。换句话说,他们可能能够进行身份验证,但他们将没有角色。没有角色意味着没有权限,没有权限意味着没有授权来发出请求。

当您使用角色映射将角色分配给用户时,角色必须存在。角色有两种来源。可用的角色应使用 角色管理 API 添加,或在 角色文件 中定义。任何角色映射方法都可以使用任何角色管理方法。例如,当您使用角色映射 API 时,您可以将用户映射到 API 管理的角色和文件管理的角色(对于基于文件的角色映射也是如此)。

使用角色映射 API

编辑

您可以通过 添加角色映射 API 定义角色映射。

使用角色映射文件

编辑

要使用基于文件的角色映射,您必须在 YAML 文件中配置映射,并将其复制到集群中的每个节点。Puppet 或 Chef 等工具可以帮助完成此操作。

默认情况下,角色映射存储在 ES_PATH_CONF/role_mapping.yml 中,其中 ES_PATH_CONFES_HOME/config(zip/tar 安装)或 /etc/elasticsearch(软件包安装)。要指定不同的位置,请在 elasticsearch.yml 中的 Active DirectoryLDAPPKI realm 设置中配置 files.role_mapping 设置。

在角色映射文件中,安全角色是键,而组和用户是值。映射可以具有多对多关系。当您将角色映射到组时,该组中用户的角色是分配给该组的角色和分配给该用户的角色的组合。

默认情况下,Elasticsearch 每 5 秒检查一次角色映射文件中的更改。您可以通过更改 elasticsearch.yml 文件中的 resource.reload.interval.high 设置来更改此默认行为。由于这是 Elasticsearch 中的常见设置,因此更改其值可能会影响系统中的其他计划。

虽然*角色映射 API* 是管理角色映射的首选方法,但在以下几种用例中,使用 role_mapping.yml 文件会很有用

  1. 如果您想定义固定的角色映射,而没有人(除了具有对 Elasticsearch 节点物理访问权限的管理员)能够更改这些映射。
  2. 如果集群管理依赖于来自外部 realm 的用户,并且即使集群处于 RED 状态,也需要将这些用户的角色映射给他们。例如,通过 LDAP 或 PKI 进行身份验证并被分配管理员角色的管理员,以便他们可以执行纠正操作。

但请注意,role_mapping.yml 文件仅作为最小的管理功能提供,并非旨在涵盖所有用例并用于定义所有用例的角色。

您无法使用角色映射 API 查看、编辑或删除角色映射文件中定义的任何角色。

特定于 realm 的详细信息

编辑
Active Directory 和 LDAP realm
编辑

要在角色映射中指定用户和组,您可以使用它们的*专有名称* (DN)。DN 是一个唯一标识用户或组的字符串,例如 "cn=John Doe,cn=contractors,dc=example,dc=com"

Elasticsearch 安全功能仅支持 Active Directory 安全组。您无法将通讯组映射到角色。

例如,以下代码段使用基于文件的方法将 admins 组映射到 monitoring 角色,并将 John Doe 用户、users 组和 admins 组映射到 user 角色。

monitoring: 
  - "cn=admins,dc=example,dc=com" 
user:
  - "cn=John Doe,cn=contractors,dc=example,dc=com" 
  - "cn=users,dc=example,dc=com"
  - "cn=admins,dc=example,dc=com"

角色的名称。

LDAP 组或 Active Directory 安全组的专有名称。

LDAP 或 Active Directory 用户的专有名称。

您可以使用角色映射 API 定义等效映射,如下所示

resp = client.security.put_role_mapping(
    name="admins",
    roles=[
        "monitoring",
        "user"
    ],
    rules={
        "field": {
            "groups": "cn=admins,dc=example,dc=com"
        }
    },
    enabled=True,
)
print(resp)
const response = await client.security.putRoleMapping({
  name: "admins",
  roles: ["monitoring", "user"],
  rules: {
    field: {
      groups: "cn=admins,dc=example,dc=com",
    },
  },
  enabled: true,
});
console.log(response);
PUT /_security/role_mapping/admins
{
  "roles" : [ "monitoring", "user" ],
  "rules" : { "field" : { "groups" : "cn=admins,dc=example,dc=com" } },
  "enabled": true
}
resp = client.security.put_role_mapping(
    name="basic_users",
    roles=[
        "user"
    ],
    rules={
        "any": [
            {
                "field": {
                    "dn": "cn=John Doe,cn=contractors,dc=example,dc=com"
                }
            },
            {
                "field": {
                    "groups": "cn=users,dc=example,dc=com"
                }
            }
        ]
    },
    enabled=True,
)
print(resp)
const response = await client.security.putRoleMapping({
  name: "basic_users",
  roles: ["user"],
  rules: {
    any: [
      {
        field: {
          dn: "cn=John Doe,cn=contractors,dc=example,dc=com",
        },
      },
      {
        field: {
          groups: "cn=users,dc=example,dc=com",
        },
      },
    ],
  },
  enabled: true,
});
console.log(response);
PUT /_security/role_mapping/basic_users
{
  "roles" : [ "user" ],
  "rules" : { "any" : [
      { "field" : { "dn" : "cn=John Doe,cn=contractors,dc=example,dc=com" } },
      { "field" : { "groups" : "cn=users,dc=example,dc=com" } }
  ] },
  "enabled": true
}
PKI realm
编辑

PKI realm 支持将用户映射到角色,但您无法映射组,因为 PKI realm 没有组的概念。

这是一个使用基于文件的映射的示例

monitoring:
  - "cn=Admin,ou=example,o=com"
user:
  - "cn=John Doe,ou=example,o=com"

以下示例使用 API 创建等效映射

resp = client.security.put_role_mapping(
    name="admin_user",
    roles=[
        "monitoring"
    ],
    rules={
        "field": {
            "dn": "cn=Admin,ou=example,o=com"
        }
    },
    enabled=True,
)
print(resp)
const response = await client.security.putRoleMapping({
  name: "admin_user",
  roles: ["monitoring"],
  rules: {
    field: {
      dn: "cn=Admin,ou=example,o=com",
    },
  },
  enabled: true,
});
console.log(response);
PUT /_security/role_mapping/admin_user
{
  "roles" : [ "monitoring" ],
  "rules" : { "field" : { "dn" : "cn=Admin,ou=example,o=com" } },
  "enabled": true
}
resp = client.security.put_role_mapping(
    name="basic_user",
    roles=[
        "user"
    ],
    rules={
        "field": {
            "dn": "cn=John Doe,ou=example,o=com"
        }
    },
    enabled=True,
)
print(resp)
const response = await client.security.putRoleMapping({
  name: "basic_user",
  roles: ["user"],
  rules: {
    field: {
      dn: "cn=John Doe,ou=example,o=com",
    },
  },
  enabled: true,
});
console.log(response);
PUT /_security/role_mapping/basic_user
{
  "roles" : [ "user" ],
  "rules" : { "field" : { "dn" : "cn=John Doe,ou=example,o=com" } },
  "enabled": true
}