搜索

第 1 章 配置身份存储

download PDF

1.1. 创建 filesystem-realm

1.1.1. Elytron 中的文件系统域

有了文件系统安全域 filesystem-realm ,您可以在 Elytron 中使用基于文件系统的身份存储来存储用户凭证和属性。Elytron 将每个身份以及关联的凭证和属性存储在文件系统的 XML 文件中。XML 文件的名称是身份的名称。您可以将多个凭证和属性与每个身份关联。

默认情况下,身份存储在文件系统中,如下所示:

  • Elytron 对存储身份的目录结构应用两级目录哈希。例如,名为 "user1" 的身份存储在 u/s/user1.xml

    这样做是为了克服某些文件系统对您可以在单个目录中存储的文件数量的限制,以及出于性能方面的原因。

    使用 levels 属性配置要应用的目录哈希的级数。

  • 在被用作文件名之前,身份名称是 Base32 编码的。这样做的原因是某些文件系统区分大小写,或者可能会限制文件名中允许的字符集。

    您可以通过将属性 encoded 设为 false 来关闭编码。

有关其他属性及其默认值的详情,请参考 filesystem-realm 属性

Encryption

当将身份存储在身份文件中时,filesystem-realm 对明文密码、散列密码和属性使用 Base64 编码。为提高安全性,您可以使用存储在凭证存储中的 secret 密钥来加密明文密码、散列密码和属性。secret 密钥用于加密和解密密码和属性。

完整性检查

要确保使用 filesystem-realm 创建的身份不会被篡改,您可以通过在创建过程中引用 filesystem-realm 中的密钥对来启用对 filesystem-realm 的完整性检查。

完整性检查在 filesystem-realm 中可以正常工作,如下所示:

  • 当您在启用了完整性检查的 filesystem-realm 中创建身份时,Elytron 会创建身份文件,并为其生成签名。
  • 每当读取身份文件时,例如,当为身份验证更新身份或加载身份时,Elytron 会针对签名验证身份文件内容,以确保文件自上次授权写以来没有被篡改。
  • 当您更新具有关联签名的现有身份时,Elytron 会更新内容并在原始内容通过验证后生成新的签名。

    如果验证失败,您会收到以下失败信息:

    {
        "outcome" => "failed",
        "failure-description" => "WFLYCTL0158: Operation handler failed:java.lang.RuntimeException: WFLYELY01008: Failed to obtain the authorization identity.",
        "rolled-back" => true
    }

1.1.2. 在 Elytron 中创建一个 filesystem-realm

创建一个 filesystem-realm 和一个引用域的安全域,来保护 JBoss EAP 服务器界面或服务器上部署的应用程序。

先决条件

  • JBoss EAP 正在运行。

流程

  1. 在 Elytron 中创建一个 filesystem-realm

    语法

    /subsystem=elytron/filesystem-realm=<filesystem_realm_name>:add(path=<file_path>)

    Example

    /subsystem=elytron/filesystem-realm=exampleSecurityRealm:add(path=fs-realm-users,relative-to=jboss.server.config.dir)
    {"outcome" => "success"}

  2. 将用户添加到域,并配置用户的角色。

    1. 添加用户。

      语法

      /subsystem=elytron/filesystem-realm=<filesystem_realm_name>:add-identity(identity=<user_name>)

      Example

      /subsystem=elytron/filesystem-realm=exampleSecurityRealm:add-identity(identity=user1)
      {"outcome" => "success"}

    2. 设置用户的密码。

      语法

      /subsystem=elytron/filesystem-realm=<filesystem_realm_name>:set-password(identity=<user_name>, clear={password=<password>})

      Example

      /subsystem=elytron/filesystem-realm=exampleSecurityRealm:set-password(identity=user1, clear={password="passwordUser1"})
      {"outcome" => "success"}

    3. 为用户设置角色。

      语法

      /subsystem=elytron/filesystem-realm=<filesystem_realm_name>:add-identity-attribute(identity=<user_name>, name=<roles_attribute_name>, value=[<role_1>,<role_N>])

      Example

      /subsystem=elytron/filesystem-realm=exampleSecurityRealm:add-identity-attribute(identity=user1, name=Roles, value=["Admin","Guest"])
      {"outcome" => "success"}

  3. 创建一个引用 filesystem-realm 的安全域。

    语法

    /subsystem=elytron/security-domain=<security_domain_name>:add(default-realm=<filesystem_realm_name>,permission-mapper=default-permission-mapper,realms=[{realm=<filesystem_realm_name>,role-decoder="<role_decoder_name>"}])

    Example

    /subsystem=elytron/security-domain=exampleSecurityDomain:add(default-realm=exampleSecurityRealm,permission-mapper=default-permission-mapper,realms=[{realm=exampleSecurityRealm}])
    {"outcome" => "success"}

验证

  • 要验证 Elytron 是否可以从 filesystem-realm 加载身份,请使用以下命令:

    语法

    /subsystem=elytron/security-domain=<security_domain_name>:read-identity(name=<username>)

    Example

    /subsystem=elytron/security-domain=exampleSecurityDomain:read-identity(name=user1)
    {
        "outcome" => "success",
        "result" => {
            "name" => "user1",
            "attributes" => {"Roles" => [
                "Admin",
                "Guest"
            ]},
            "roles" => [
                "Guest",
                "Admin"
            ]
        }
    }

现在,您可以使用创建的安全域来向管理界面和应用程序添加身份验证和授权。如需更多信息,请参阅 保护管理界面和应用程序

1.1.3. 在 Elytron 中创建一个加密的 filesystem-realm

创建一个加密的 filesystem-realm 来保护 JBoss EAP 应用程序或服务器接口,并确保用户凭据已加密,因此是安全的。

1.1.3.1. 为独立服务器创建一个 secret-key-credential-store

使用管理 CLI 创建一个 secret-key-credential-store。当您创建 secret-key-credential-store 时,JBoss EAP 默认会生成一个 secret 密钥。生成的密钥的名称是 key,其大小为 256 位。

先决条件

  • JBoss EAP 正在运行。
  • 您为在其下运行 JBoss EAP 的用户帐户至少提供了对包含 secret-key-credential-store 的目录的读/写权限。

流程

  • 使用以下命令,使用管理 CLI 来创建一个 secret-key-credential-store

    语法

    /subsystem=elytron/secret-key-credential-store=<name_of_credential_store>:add(path="<path_to_the_credential_store>", relative-to=<path_to_store_file>)

    Example

    /subsystem=elytron/secret-key-credential-store=examplePropertiesCredentialStore:add(path=examplePropertiesCredentialStore.cs, relative-to=jboss.server.config.dir)
    {"outcome" => "success"}

1.1.3.2. 创建一个加密的 filesystem-realm

创建一个加密的 filesystem-realm 和一个引用域的安全域,来保护 JBoss EAP 服务器接口或部署在服务器上的应用程序。

先决条件

流程

  1. 在 Elytron 中创建一个加密的 filesystem-realm

    语法

    /subsystem=elytron/filesystem-realm=<filesystem_realm_name>:add(path=<file_path>,credential-store=<name_of_credential_store>,secret-key=<key>)

    Example

    /subsystem=elytron/filesystem-realm=exampleSecurityRealm:add(path=fs-realm-users,relative-to=jboss.server.config.dir, credential-store=examplePropertiesCredentialStore, secret-key=key)
    {"outcome" => "success"}

  2. 将用户添加到域,并配置用户的角色。

    1. 添加用户。

      语法

      /subsystem=elytron/filesystem-realm=<filesystem_realm_name>:add-identity(identity=<user_name>)

      Example

      /subsystem=elytron/filesystem-realm=exampleSecurityRealm:add-identity(identity=user1)
      {"outcome" => "success"}

    2. 设置用户的密码。

      语法

      /subsystem=elytron/filesystem-realm=<filesystem_realm_name>:set-password(identity=<user_name>, clear={password=<password>})

      Example

      /subsystem=elytron/filesystem-realm=exampleSecurityRealm:set-password(identity=user1, clear={password="passwordUser1"})
      {"outcome" => "success"}

    3. 为用户设置角色。

      语法

      /subsystem=elytron/filesystem-realm=<filesystem_realm_name>:add-identity-attribute(identity=<user_name>, name=<roles_attribute_name>, value=[<role_1>,<role_N>])

      Example

      /subsystem=elytron/filesystem-realm=exampleSecurityRealm:add-identity-attribute(identity=user1, name=Roles, value=["Admin","Guest"])
      {"outcome" => "success"}

  3. 创建一个引用 filesystem-realm 的安全域。

    语法

    /subsystem=elytron/security-domain=<security_domain_name>:add(default-realm=<filesystem_realm_name>,permission-mapper=default-permission-mapper,realms=[{realm=<filesystem_realm_name>,role-decoder="<role_decoder_name>"}])

    Example

    /subsystem=elytron/security-domain=exampleSecurityDomain:add(default-realm=exampleSecurityRealm,permission-mapper=default-permission-mapper,realms=[{realm=exampleSecurityRealm}])
    {"outcome" => "success"}

验证

  • 要验证 Elytron 是否可以从加密的 filesystem-realm 加载身份,请使用以下命令:

    语法

    /subsystem=elytron/security-domain=<security_domain_name>:read-identity(name=<username>)

    Example

    /subsystem=elytron/security-domain=exampleSecurityDomain:read-identity(name=user1)
    {
        "outcome" => "success",
        "result" => {
            "name" => "user1",
            "attributes" => {"Roles" => [
                "Admin",
                "Guest"
            ]},
            "roles" => [
                "Guest",
                "Admin"
            ]
        }
    }

现在,您可以使用创建的安全域来向管理界面和应用程序添加身份验证和授权。

1.1.4. 在 Elytron 中创建一个支持完整性的 filesystem-realm

创建一个支持完整性的 filesystem-realm 来保护 JBoss EAP 应用或服务器接口,并确保用户凭据未被篡改。

1.1.4.1. 使用管理 CLI 创建密钥对

在 Elytron 中使用密钥对创建密钥存储。

先决条件

  • JBoss EAP 正在运行。

流程

  1. 创建密钥存储。

    语法

    /subsystem=elytron/key-store=<key_store_name>:add(path=<path_to_key_store_file>,credential-reference={<password>})

    Example

    /subsystem=elytron/key-store=exampleKeystore:add(path=keystore, relative-to=jboss.server.config.dir, type=JKS, credential-reference={clear-text=secret})
    {"outcome" => "success"}

  2. 在密钥对存储中创建密钥对。

    语法

    /subsystem=elytron/key-store=<key_store_name>:generate-key-pair(alias=<alias>,algorithm=<key_algorithm>,key-size=<size_of_key>,validity=<validity_in_days>,distinguished-name="<distinguished_name>")

    Example

    /subsystem=elytron/key-store=exampleKeystore:generate-key-pair(alias=localhost,algorithm=RSA,key-size=1024,validity=365,distinguished-name="CN=localhost")
    {"outcome" => "success"}

  3. 将密钥对持久化到密钥存储文件。

    语法

    /subsystem=elytron/key-store=<key_store_name>:store()

    Example

    /subsystem=elytron/key-store=exampleKeystore:store()
    {
        "outcome" => "success",
        "result" => undefined
    }

其他资源

1.1.4.2. 创建支持完整性的 filesystem-realm

创建一个支持完整性的 filesystem-realm,以及一个引用域的安全域,来保护 JBoss EAP 服务器接口或服务器上部署的应用程序。

先决条件

流程

  1. 在 Elytron 中创建 filesystem-realm

    语法

    /subsystem=elytron/filesystem-realm=<filesystem_realm_name>:add(path=<file_path>,key-store=<key_store_name>,key-store-alias=<key_store_alias>)

    Example

    /subsystem=elytron/filesystem-realm=exampleSecurityRealm:add(path=fs-realm-users,relative-to=jboss.server.config.dir, key-store=exampleKeystore, key-store-alias=localhost)
    {"outcome" => "success"}

  2. 将用户添加到域,并配置用户的角色。

    1. 添加用户。

      语法

      /subsystem=elytron/filesystem-realm=<filesystem_realm_name>:add-identity(identity=<user_name>)

      Example

      /subsystem=elytron/filesystem-realm=exampleSecurityRealm:add-identity(identity=user1)
      {"outcome" => "success"}

    2. 设置用户的密码。

      语法

      /subsystem=elytron/filesystem-realm=<filesystem_realm_name>:set-password(identity=<user_name>, clear={password=<password>})

      Example

      /subsystem=elytron/filesystem-realm=exampleSecurityRealm:set-password(identity=user1, clear={password="passwordUser1"})
      {"outcome" => "success"}

    3. 为用户设置角色。

      语法

      /subsystem=elytron/filesystem-realm=<filesystem_realm_name>:add-identity-attribute(identity=<user_name>, name=<roles_attribute_name>, value=[<role_1>,<role_N>])

      Example

      /subsystem=elytron/filesystem-realm=exampleSecurityRealm:add-identity-attribute(identity=user1, name=Roles, value=["Admin","Guest"])
      {"outcome" => "success"}

  3. 创建一个引用 filesystem-realm 的安全域。

    语法

    /subsystem=elytron/security-domain=<security_domain_name>:add(default-realm=<filesystem_realm_name>,permission-mapper=default-permission-mapper,realms=[{realm=<filesystem_realm_name>,role-decoder="<role_decoder_name>"}])

    Example

    /subsystem=elytron/security-domain=exampleSecurityDomain:add(default-realm=exampleSecurityRealm,permission-mapper=default-permission-mapper,realms=[{realm=exampleSecurityRealm}])
    {"outcome" => "success"}

验证

  • 要验证 Elytron 是否可以从 filesystem-realm 加载身份,请使用以下命令:

    语法

    /subsystem=elytron/security-domain=<security_domain_name>:read-identity(name=<username>)

    Example

    /subsystem=elytron/security-domain=exampleSecurityDomain:read-identity(name=user1)
    {
        "outcome" => "success",
        "result" => {
            "name" => "user1",
            "attributes" => {"Roles" => [
                "Admin",
                "Guest"
            ]},
            "roles" => [
                "Guest",
                "Admin"
            ]
        }
    }

现在,您可以使用创建的安全域来向管理界面和应用程序添加身份验证和授权。如需更多信息,请参阅 保护管理界面和应用程序

1.1.4.3. 在启用了支持完整性的现有 filesystem-realm 中更新密钥对

当现有密钥被泄露的时,您可以更新在启用了支持完整性的 filesystem-realm 中引用的密钥对。另外,轮转密钥是一个好的做法。

先决条件

流程

  1. 在现有密钥存储中创建密钥对。

    语法

    /subsystem=elytron/key-store=<key_store_name>:generate-key-pair(alias=<alias>,algorithm=<key_algorithm>,key-size=<size_of_key>,validity=<validity_in_days>,distinguished-name="<distinguished_name>")

    Example

    /subsystem=elytron/key-store=exampleKeystore:generate-key-pair(alias=localhost2,algorithm=RSA,key-size=1024,validity=365,distinguished-name="CN=localhost")
    {"outcome" => "success"}

  2. 将密钥对持久化到密钥存储文件。

    语法

    /subsystem=elytron/key-store=<key_store_name>:store()

    Example

    /subsystem=elytron/key-store=exampleKeystore:store()
    {
        "outcome" => "success",
        "result" => undefined
    }

  3. 更新密钥存储别名以引用新密钥对。

    语法

    /subsystem=elytron/filesystem-realm=<filesystem_realm_name>:write-attribute(name=key-store-alias, value=<key_store_alias>)

    Example

    /subsystem=elytron/filesystem-realm=exampleSecurityRealm:write-attribute(name=key-store-alias, value=localhost2)
    {
        "outcome" => "success",
        "response-headers" => {
            "operation-requires-reload" => true,
            "process-state" => "reload-required"
        }
    }

  4. 重新加载服务器。

    reload
  5. 使用新密钥对,用新签名更新 filesystem-realm 中的文件。

    语法

    /subsystem=elytron/filesystem-realm=<filesystem_realm_name>:update-key-pair()

    Example

    /subsystem=elytron/filesystem-realm=exampleSecurityRealm:update-key-pair()
    {"outcome" => "success"}

验证

  • 使用以下管理 CLI 命令验证 filesystem-realm 中引用的密钥对是否已被更新:

    语法

    /subsystem=elytron/filesystem-realm=<filesystem_realm_name>:read-resource()

    Example

    /subsystem=elytron/filesystem-realm=exampleSecurityRealm:read-resource()
    {
        "outcome" => "success",
        "result" => {
            "credential-store" => undefined,
            "encoded" => true,
            "hash-charset" => "UTF-8",
            "hash-encoding" => "base64",
            "key-store" => "exampleKeystoreFSRealm",
            "key-store-alias" => "localhost2",
            "levels" => 2,
            "secret-key" => undefined,
            "path" => "fs-realm-users",
            "relative-to" => "jboss.server.config.dir"
        }
    }

filesystem-realm 中引用的密钥对已被更新。

1.1.5. 加密一个未加密的 filesystem-realm

如果您在 Elytron 中配置了一个 filesystem-realm,您可以使用 WildFly Elytron 工具对其添加加密。

1.1.5.1. 为独立服务器创建一个 secret-key-credential-store

使用管理 CLI 创建一个 secret-key-credential-store。当您创建 secret-key-credential-store 时,JBoss EAP 默认会生成一个 secret 密钥。生成的密钥的名称是 key,其大小为 256 位。

先决条件

  • JBoss EAP 正在运行。
  • 您为在其下运行 JBoss EAP 的用户帐户至少提供了对包含 secret-key-credential-store 的目录的读/写权限。

流程

  • 使用以下命令,使用管理 CLI 来创建一个 secret-key-credential-store

    语法

    /subsystem=elytron/secret-key-credential-store=<name_of_credential_store>:add(path="<path_to_the_credential_store>", relative-to=<path_to_store_file>)

    Example

    /subsystem=elytron/secret-key-credential-store=examplePropertiesCredentialStore:add(path=examplePropertiesCredentialStore.cs, relative-to=jboss.server.config.dir)
    {"outcome" => "success"}

1.1.5.2. 将未加密的 filesystem-realm 转换为加密的 filesystem-realm

您可以使用 WildFly Elytron 工具 filesystem-realm - encrypt 命令将未加密的 filesystem-realm 转换为加密的。

先决条件

流程

  1. 将未加密的 filesystem-realm 转换为加密的。

    语法

    $ JBOSS_HOME/bin/elytron-tool.sh filesystem-realm-encrypt --input-location <existing_filesystem_realm_name> --output-location JBOSS_HOME/standalone/configuration/<target_filesystem_realm_name> --credential-store <path_to_credential_store>/<credential_store>

    Example

    $ JBOSS_HOME/bin/elytron-tool.sh filesystem-realm-encrypt --input-location JBOSS_HOME/standalone/configuration/fs-realm-users --output-location JBOSS_HOME/standalone/configuration/fs-realm-users-enc --credential-store JBOSS_HOME/standalone/configuration/examplePropertiesCredentialStore.cs
    
    Creating encrypted realm for: JBOSS_HOME/standalone/configuration/fs-realm-users
    Found credential store and alias, using pre-existing key

    WildFly Elytron 命令 filesystem-realm-encrypt 创建一个使用 --output-location 参数指定的 filesystem-realm。它还会在 filesystem-realm 的根目录处创建一个 CLI 脚本,您可以使用它来在 elytron 子系统中添加 filesystem-realm 资源。

    提示

    使用 --summary 选项查看命令执行的摘要。

  2. 使用生成的 CLI 脚本,在 elytron 子系统中添加 filesystem-realm 资源。

    语法

    $ JBOSS_HOME/bin/jboss-cli.sh --connect --file=<target_filesystem_realm_directory>/<target_filesystem_realm_name>.cli

    Example

    $ JBOSS_HOME/bin/jboss-cli.sh --connect --file=JBOSS_HOME/standalone/configuration/fs-realm-users-enc/encrypted-filesystem-realm.cli

您可以使用加密的 filesystem-realm 创建一个引用域的安全域,来保护 JBoss EAP 服务器接口或部署在服务器上的应用程序。

其他资源

1.1.6. 在现有 filesystem-realm中添加完整性支持

如果您在 Elytron 中配置了 filesystem-realm,您可以使用 WildFly Elytron 工具使用密钥对签名,以启用完整性检查。

1.1.6.1. 使用管理 CLI 创建密钥对

在 Elytron 中使用密钥对创建密钥存储。

先决条件

  • JBoss EAP 正在运行。

流程

  1. 创建密钥存储。

    语法

    /subsystem=elytron/key-store=<key_store_name>:add(path=<path_to_key_store_file>,credential-reference={<password>})

    Example

    /subsystem=elytron/key-store=exampleKeystore:add(path=keystore, relative-to=jboss.server.config.dir, type=JKS, credential-reference={clear-text=secret})
    {"outcome" => "success"}

  2. 在密钥对存储中创建密钥对。

    语法

    /subsystem=elytron/key-store=<key_store_name>:generate-key-pair(alias=<alias>,algorithm=<key_algorithm>,key-size=<size_of_key>,validity=<validity_in_days>,distinguished-name="<distinguished_name>")

    Example

    /subsystem=elytron/key-store=exampleKeystore:generate-key-pair(alias=localhost,algorithm=RSA,key-size=1024,validity=365,distinguished-name="CN=localhost")
    {"outcome" => "success"}

  3. 将密钥对持久化到密钥存储文件。

    语法

    /subsystem=elytron/key-store=<key_store_name>:store()

    Example

    /subsystem=elytron/key-store=exampleKeystore:store()
    {
        "outcome" => "success",
        "result" => undefined
    }

其他资源

1.1.6.2. 为 filesystem-realm启用完整性检查

您可以使用 WildFly Elytron 工具 filesystem-realm -integrity 命令从现有的非空 filesystem-realm -realm 创建一个带有完整性检查的 filesystem-realm。

您可以将 filesystem-realm-integrity 命令用于以下用例:

  • 从现有 filesystem-realm 创建一个带有完整性检查的新 filesystem-realm
  • 向现有的 filesystem-realm 添加完整性检查。

先决条件

流程

  1. 使用现有的 filesystem-realm 并使用密钥对签名具有完整性的 filesystem-realm

    要为现有 filesystem-realm 添加完整性支持,请使用以下命令省略 --output-location--realm-name 选项。如果您指定了 --output-location--realm-name 选项,命令会创建一个带有完整性检查的新 filesystem-realm,而无需更新现有检查。

    语法

    $ JBOSS_HOME/bin/elytron-tool.sh filesystem-realm-integrity  --input-location <path_to_existing_filesystem_realm> --keystore <path_to_key_store_file> --password <keystore_password> --key-pair <key_pair_alias> --output-location <path_for_new_filesystem_realm> --realm-name <name_of_new_filesystem_realm>

    Example

    $ JBOSS_HOME/bin/elytron-tool.sh filesystem-realm-integrity --input-location JBOSS_HOME/standalone/configuration/fs-realm-users/ --keystore JBOSS_HOME/standalone/configuration/keystore --password secret --key-pair localhost --output-location JBOSS_HOME/standalone/configuration/fs-realm-users --realm-name exampleRealmWithIntegrity

    示例输出

    Creating filesystem realm with integrity verification for: JBOSS_HOME/standalone/configuration/fs-realm-users

    WildFly Elytron 命令 filesystem-realm-integrity 创建一个使用 --output-location 参数指定的 filesystem-realm。它还会在 filesystem-realm 的根目录处创建一个 CLI 脚本,您可以使用它来在 elytron 子系统中添加 filesystem-realm 资源。

    提示

    使用 --summary 选项查看命令执行的摘要。

  2. 使用生成的 CLI 脚本,在 elytron 子系统中添加 filesystem-realm 资源。

    语法

    $ JBOSS_HOME/bin/jboss-cli.sh --connect --file=<target_filesystem_realm_directory>/<target_filesystem_realm_name>.cli

    Example

    $ JBOSS_HOME/bin/jboss-cli.sh --connect --file=JBOSS_HOME/standalone/configuration/fs-realm-users/exampleRealmWithIntegrity.cli

您可以使用 filesystem-realm 创建一个引用域的安全域,来保护 JBoss EAP 服务器接口或服务器上部署的应用程序。

其他资源

Red Hat logoGithubRedditYoutubeTwitter

学习

尝试、购买和销售

社区

关于红帽文档

通过我们的产品和服务,以及可以信赖的内容,帮助红帽用户创新并实现他们的目标。

让开源更具包容性

红帽致力于替换我们的代码、文档和 Web 属性中存在问题的语言。欲了解更多详情,请参阅红帽博客.

關於紅帽

我们提供强化的解决方案,使企业能够更轻松地跨平台和环境(从核心数据中心到网络边缘)工作。

© 2024 Red Hat, Inc.