第 1 章 配置身份存储
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 正在运行。
流程
在 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"}
将用户添加到域,并配置用户的角色。
添加用户。
语法
/subsystem=elytron/filesystem-realm=<filesystem_realm_name>:add-identity(identity=<user_name>)
Example
/subsystem=elytron/filesystem-realm=exampleSecurityRealm:add-identity(identity=user1) {"outcome" => "success"}
设置用户的密码。
语法
/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"}
为用户设置角色。
语法
/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"}
创建一个引用
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 服务器接口或部署在服务器上的应用程序。
先决条件
- JBoss EAP 正在运行。
您已创建了一个
secret-key-credential-store
。如需更多信息,请参阅 为独立服务器创建一个
secret-key-credential-store
。
流程
在 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"}
将用户添加到域,并配置用户的角色。
添加用户。
语法
/subsystem=elytron/filesystem-realm=<filesystem_realm_name>:add-identity(identity=<user_name>)
Example
/subsystem=elytron/filesystem-realm=exampleSecurityRealm:add-identity(identity=user1) {"outcome" => "success"}
设置用户的密码。
语法
/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"}
为用户设置角色。
语法
/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"}
创建一个引用
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 正在运行。
流程
创建密钥存储。
语法
/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"}
在密钥对存储中创建密钥对。
语法
/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"}
将密钥对持久化到密钥存储文件。
语法
/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 服务器接口或服务器上部署的应用程序。
先决条件
- JBoss EAP 正在运行。
您已创建了一个
secret-key-credential-store
。如需更多信息 ,请参阅使用管理 CLI 创建密钥对。
流程
在 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"}
将用户添加到域,并配置用户的角色。
添加用户。
语法
/subsystem=elytron/filesystem-realm=<filesystem_realm_name>:add-identity(identity=<user_name>)
Example
/subsystem=elytron/filesystem-realm=exampleSecurityRealm:add-identity(identity=user1) {"outcome" => "success"}
设置用户的密码。
语法
/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"}
为用户设置角色。
语法
/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"}
创建一个引用
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
中引用的密钥对。另外,轮转密钥是一个好的做法。
先决条件
- 您已生成了一个密钥对。
您已创建了一个启用了完整性检查的
filesystem-realm
。如需更多信息,请参阅 创建一个支持完整性的
filesystem-realm
。
流程
在现有密钥存储中创建密钥对。
语法
/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"}
将密钥对持久化到密钥存储文件。
语法
/subsystem=elytron/key-store=<key_store_name>:store()
Example
/subsystem=elytron/key-store=exampleKeystore:store() { "outcome" => "success", "result" => undefined }
更新密钥存储别名以引用新密钥对。
语法
/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" } }
重新加载服务器。
reload
使用新密钥对,用新签名更新
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
转换为加密的。
先决条件
您有一个现有的
filesystem-realm
。如需更多信息,请参阅 在 Elytron 中创建一个
filesystem-realm
。您已创建了一个
secret-key-credential-store
。如需更多信息,请参阅 为独立服务器创建一个
secret-key-credential-store
。- JBoss EAP 正在运行。
流程
将未加密的
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
选项查看命令执行的摘要。使用生成的 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 服务器接口或部署在服务器上的应用程序。
其他资源
-
filesystem-realm
属性 -
secret-key-credential-store
属性 -
在 Elytron 中创建一个加密的
filesystem-realm
如需有关 WildFly Elytron 工具
filesystem-realm-encrypt
命令的更多信息,请运行filesystem-realm-encrypt --help
命令:$ JBOSS_HOME/bin/elytron-tool.sh filesystem-realm-encrypt --help
1.1.6. 在现有 filesystem-realm
中添加完整性支持
如果您在 Elytron 中配置了 filesystem-realm
,您可以使用 WildFly Elytron 工具使用密钥对签名,以启用完整性检查。
1.1.6.1. 使用管理 CLI 创建密钥对
在 Elytron 中使用密钥对创建密钥存储。
先决条件
- JBoss EAP 正在运行。
流程
创建密钥存储。
语法
/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"}
在密钥对存储中创建密钥对。
语法
/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"}
将密钥对持久化到密钥存储文件。
语法
/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
-integrityfilesystem-realm
-realm 创建一个带有完整性检查的 filesystem-realm。
您可以将 filesystem-realm-integrity
命令用于以下用例:
-
从现有
filesystem-realm
创建一个带有完整性检查的新filesystem-realm
。 -
向现有的
filesystem-realm
添加完整性检查。
先决条件
您有一个现有的
filesystem-realm
。如需更多信息,请参阅 在 Elytron 中创建一个
filesystem-realm
。您已生成了一个密钥对。
如需更多信息 ,请参阅使用管理 CLI 创建密钥对。
- JBoss EAP 正在运行。
流程
使用现有的
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
选项查看命令执行的摘要。使用生成的 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 服务器接口或服务器上部署的应用程序。
其他资源
-
filesystem-realm
属性 - 在 Elytron 中创建一个支持完整性的 filesystem-realm
有关 WildFly Elytron 工具
filesystem-realm-integrity
命令的更多信息,请运行filesystem-realm-integrity --help
命令:$ JBOSS_HOME/bin/elytron-tool.sh filesystem-realm-integrity --help