第 21 章 安全性


Apache Karaf 提供高级且灵活的安全系统,由 JAAS (Java 身份验证和授权服务)驱动。

它提供动态安全系统。

Apache Karaf 安全框架在内部用来控制对以下的访问:

  • OSGi 服务(开发人员指南中所述)
  • 控制台命令
  • JMX 层
  • WebConsole

您的应用程序也可以使用安全框架(请参阅开发人员指南了解详细信息)。

21.1. Realms

Apache Karaf 可以管理多个域。realm 包含用于此域中身份验证和/或授权的登录模块的定义。登录模块定义域的身份验证和授权。

jaas:realm-list 命令列出当前定义的域:

karaf@root()> jaas:realm-list
Index | Realm Name | Login Module Class Name
-----------------------------------------------------------------------------------
1     | karaf      | org.apache.karaf.jaas.modules.properties.PropertiesLoginModule
2     | karaf      | org.apache.karaf.jaas.modules.publickey.PublickeyLoginModule

您可以看到 Apache Karaf 提供了名为 karaf 的默认域。

这个域有两个登录模块:

  • PropertiesLoginModule 使用 etc/users.properties 文件作为用户、组、角色和密码的后端。此登录模块验证用户并返回用户角色。
  • PublickeyLoginModule 特别供 SSHd 使用。它使用 etc/keys.properties 文件。此文件包含用户以及与每个用户关联的公钥。

Apache Karaf 提供额外的登录模块(请参阅开发人员指南),了解详细信息:

  • JDBCLoginModule 使用数据库作为后端
  • LDAPLoginModule 使用 LDAP 服务器作为后端
  • SyncopeLoginModule 使用 Apache Syncope 作为后端
  • OsgiConfigLoginModule 使用配置作为后端
  • Krb5LoginModule 使用 Kerberos 服务器作为后端
  • GSSAPILdapLoginModule 使用 LDAP 服务器作为后端,但将 LDAP 服务器身份验证委派给其他后端(通常为 Krb5LoginModule)

您可以使用 jaas:realm-manage 命令管理现有域、登录模块或创建自己的域。

21.1.1. 用户、组、角色和密码

正如我们所看到的那样,Apache Karaf 使用 PropertiesLoginModule。

此登录模块使用 etc/users.properties 文件作为用户、组、角色和密码的存储。

initial etc/users.properties 文件包含:

################################################################################
#
#    Licensed to the Apache Software Foundation (ASF) under one or more
#    contributor license agreements.  See the NOTICE file distributed with
#    this work for additional information regarding copyright ownership.
#    The ASF licenses this file to You under the Apache License, Version 2.0
#    (the "License"); you may not use this file except in compliance with
#    the License.  You may obtain a copy of the License at
#
#       http://www.apache.org/licenses/LICENSE-2.0
#
#    Unless required by applicable law or agreed to in writing, software
#    distributed under the License is distributed on an "AS IS" BASIS,
#    WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
#    See the License for the specific language governing permissions and
#    limitations under the License.
#
################################################################################

#
# This file contains the users, groups, and roles.
# Each line has to be of the format:
#
# USER=PASSWORD,ROLE1,ROLE2,...
# USER=PASSWORD,_g_:GROUP,...
# _g_\:GROUP=ROLE1,ROLE2,...
#
# All users, grousp, and roles entered in this file are available after Karaf startup
# and modifiable via the JAAS command group. These users reside in a JAAS domain
# with the name "karaf".
#
karaf = karaf,_g_:admingroup
_g_\:admingroup = group,admin,manager,viewer

我们可以在此文件中看到,默认情况下我们有一个用户:karaf。默认密码是 karaf

karaf 用户是一个组的成员: admingroup

组始终以 g 前缀:没有此前缀的条目是一个用户。

组定义了一组角色。默认情况下,admin group 定义组、adminmanagerviewer 角色。

这意味着 karaf 用户将具有由 admingroup 定义的角色。

21.1.1.1. 命令

jaas:* 命令在控制台中管理域、用户、组、角色。

21.1.1.1.1. jaas:realm-list

本节之前我们已使用过 jaas:realm-list

jaas:realm-list 命令列出每个域的 realm 和登录模块:

karaf@root()> jaas:realm-list
Index | Realm Name | Login Module Class Name
-----------------------------------------------------------------------------------
1     | karaf      | org.apache.karaf.jaas.modules.properties.PropertiesLoginModule
2     | karaf      | org.apache.karaf.jaas.modules.publickey.PublickeyLoginModule

我们这里有一个域(karaf),其中包含两个登录模块(PropertiesLoginModulePublickeyLoginModule)。

索引jaas:realm-manage 命令用来轻松识别我们要管理的 realm/login 模块。

21.1.1.1.2. jaas:realm-manage

realm/login 模块编辑模式中的 jaas:realm-manage 命令切换,您可以在其中管理登录模块中的用户、组和角色。

要识别要管理的 realm 和 login 模块,您可以使用 --index 选项。索引由 jaas:realm-list 命令显示:

karaf@root()> jaas:realm-manage --index 1

另一种方法是使用 --realm--module 选项。--realm 选项需要 realm 名称,-- module 选项需要登录模块类名称:

karaf@root()> jaas:realm-manage --realm karaf --module org.apache.karaf.jaas.modules.properties.PropertiesLoginModule
21.1.1.1.3. jaas:user-list

当您处于编辑模式时,您可以使用 jaas:user-list 列出登录模块中的用户:

karaf@root()> jaas:user-list
User Name | Group      | Role
--------------------------------
karaf     | admingroup | admin
karaf     | admingroup | manager
karaf     | admingroup | viewer

您可以根据角色查看用户名和组。

21.1.1.1.4. jaas:user-add

jaas:user-add 命令会在当前编辑的登录模块中添加新用户(和密码):

karaf@root()> jaas:user-add foo bar

要"提交"您的更改(在用户添加的地方),您必须执行 jaas:update 命令:

karaf@root()> jaas:update
karaf@root()> jaas:realm-manage --index 1
karaf@root()> jaas:user-list
User Name | Group      | Role
--------------------------------
karaf     | admingroup | admin
karaf     | admingroup | manager
karaf     | admingroup | viewer
foo       |            |

另一方面,如果要回滚用户添加,您可以使用 jaas:cancel 命令。

21.1.1.1.5. jaas:user-delete

jaas:user-delete 命令从当前编辑的登录模块中删除用户:

karaf@root()> jaas:user-delete foo

jaas:user-add 命令类似,您必须使用 jaas:update 来提交您的更改(或 jaas:cancel 要回滚):

karaf@root()> jaas:update
karaf@root()> jaas:realm-manage --index 1
karaf@root()> jaas:user-list
User Name | Group      | Role
--------------------------------
karaf     | admingroup | admin
karaf     | admingroup | manager
karaf     | admingroup | viewer
21.1.1.1.6. jaas:group-add

jaas:group-add 命令会在当前编辑的登录模块中为用户分配组(最终创建组):

karaf@root()> jaas:group-add karaf mygroup
21.1.1.1.7. jaas:group-delete

jaas:group-delete 命令从当前编辑的登录模块中的组中删除用户:

karaf@root()> jaas:group-delete karaf mygroup
21.1.1.1.8. jaas:group-role-add

jaas:group-role-add 命令在当前编辑的登录模块的组中添加了一个角色:

karaf@root()> jaas:group-role-add mygroup myrole
21.1.1.1.9. jaas:group-role-delete

jaas:group-role-delete 命令从当前编辑的登录模块中的组中删除角色:

karaf@root()> jaas:group-role-delete mygroup myrole
21.1.1.1.10. jaas:update

jaas:update 命令会在登录模块后端提交您的更改。例如,如果是 PropertiesLoginModule,则 etc/users.properties 仅在执行 jaas:update 命令后更新。

21.1.1.1.11. jaas:cancel

jaas:cancel 命令回滚您的更改,且不更新登录模块后端。

21.1.2. 密码加密

默认情况下,密码以明文形式存储在 etc/users.properties 文件中。

可以在 etc/org.apache.karaf.jaas.cfg 配置文件中启用加密:

################################################################################
#
#    Licensed to the Apache Software Foundation (ASF) under one or more
#    contributor license agreements.  See the NOTICE file distributed with
#    this work for additional information regarding copyright ownership.
#    The ASF licenses this file to You under the Apache License, Version 2.0
#    (the "License"); you may not use this file except in compliance with
#    the License.  You may obtain a copy of the License at
#
#       http://www.apache.org/licenses/LICENSE-2.0
#
#    Unless required by applicable law or agreed to in writing, software
#    distributed under the License is distributed on an "AS IS" BASIS,
#    WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
#    See the License for the specific language governing permissions and
#    limitations under the License.
#
################################################################################

#
# Boolean enabling / disabling encrypted passwords
#
encryption.enabled = false

#
# Encryption Service name
#   the default one is 'basic'
#   a more powerful one named 'jasypt' is available
#       when installing the encryption feature
#
encryption.name =

#
# Encryption prefix
#
encryption.prefix = {CRYPT}

#
# Encryption suffix
#
encryption.suffix = {CRYPT}

#
# Set the encryption algorithm to use in Karaf JAAS login module
# Supported encryption algorithms follow:
#   MD2
#   MD5
#   SHA-1
#   SHA-256
#   SHA-384
#   SHA-512
#
encryption.algorithm = MD5

#
# Encoding of the encrypted password.
# Can be:
#   hexadecimal
#   base64
#
encryption.encoding = hexadecimal

如果 encryption.enabled y 设为 true,则启用密码加密。

启用加密后,密码在第一次登录时加密。加密的密码的前缀为 \{CRYPT\}。要重新加密密码,您可以以明文形式重置密码(在 etc/users.properties 文件中),而无需 \{CRYPT\} 前缀和后缀。Apache Karaf 将检测到此密码的清除状态(因为它没有前缀为 \{CRYPT\}),并再次对其进行加密。

etc/org.apache.karaf.jaas.cfg 配置文件允许您定义高级加密行为:

  • encryption.prefix 属性定义"flag"密码加密的前缀。默认值为 \{CRYPT\}。
  • encryption.suffix 属性定义作为加密的密码"flag"的后缀。默认值为 \{CRYPT\}。
  • encryption.algorithm 属性定义用于加密的算法(摘要)。可能的值有 MD2,MD5,SHA-1,SHA-256,SHA-384,SHA-512。默认值为 MD5
  • encryption.encoding 属性定义加密密码的编码。可能的值有 十六进制base64。默认值为 十六进制

21.1.3. 通过密钥管理身份验证

对于 SSH 层,2019 年通过密钥支持身份验证,允许在不提供密码的情况下登录。

SSH 客户端(so bin/client 由 Karaf 本身提供,或者任何 ssh 客户端(如 OpenSSH)都使用一个公钥/私钥对,该密钥对将识别 Karaf SSHD (服务器端)上的自己。

允许连接的键存储在 etc/keys.properties 文件中,采用以下格式:

user=key,role

默认情况下,Tamener 允许 karaf 用户的密钥:

# karaf=AAAAB3NzaC1kc3MAAACBAP1/U4EddRIpUt9KnC7s5Of2EbdSPO9EAMMeP4C2USZpRV1AIlH7WT2NWPq/xfW6MPbLm1Vs14E7gB00b/JmYLdrmVClpJ+f6AR7ECLCT7up1/63xhv4O1fnxqimFQ8E+4P208UewwI1VBNaFpEy9nXzrith1yrv8iIDGZ3RSAHHAAAAFQCXYFCPFSMLzLKSuYKi64QL8Fgc9QAAAIEA9+GghdabPd7LvKtcNrhXuXmUr7v6OuqC+VdMCz0HgmdRWVeOutRZT+ZxBxCBgLRJFnEj6EwoFhO3zwkyjMim4TwWeotUfI0o4KOuHiuzpnWRbqN/C/ohNWLx+2J6ASQ7zKTxvqhRkImog9/hWuWfBpKLZl6Ae1UlZAFMO/7PSSoAAACBAKKSU2PFl/qOLxIwmBZPPIcJshVe7bVUpFvyl3BbJDow8rXfskl8wO63OzP/qLmcJM0+JbcRU/53JjTuyk31drV2qxhIOsLDC9dGCWj47Y7TyhPdXh/0dthTRBy6bqGtRPxGa7gJov1xm/UuYYXPIUR/3x9MAZvZ5xvE0kYXO+rx,admin
注意

为安全起见,这个密钥被禁用。我们鼓励每个客户端创建密钥对并更新 etc/keys.properties 文件。

创建密钥对的最简单方法是使用 OpenSSH。

您可以使用以下方法创建密钥对:

ssh-keygen -t dsa -f karaf.id_dsa -N karaf

您现在有公钥和私钥:

-rw-------  1 jbonofre jbonofre    771 Jul 25 22:05 karaf.id_dsa
-rw-r--r--  1 jbonofre jbonofre    607 Jul 25 22:05 karaf.id_dsa.pub

您可以在 etc/keys.properties 中的 karaf.id_dsa.pub 文件的内容中复制:

karaf=AAAAB3NzaC1kc3MAAACBAJLj9vnEhu3/Q9Cvym2jRDaNWkATgQiHZxmErCmiLRuD5Klfv+HT/+8WoYdnvj0YaXFP80phYhzZ7fbIO2LRFhYhPmGLa9nSeOsQlFuX5A9kY1120yB2kxSIZI0fU2hy1UCgmTxdTQPSYtdWBJyvO/vczoX/8I3FziEfss07Hj1NAAAAFQD1dKEzkt4e7rBPDokPOMZigBh4kwAAAIEAiLnpbGNbKm8SNLUEc/fJFswg4G4VjjngjbPZAjhkYe4+H2uYmynry6V+GOTS2kaFQGZRf9XhSpSwfdxKtx7vCCaoH9bZ6S5Pe0voWmeBhJXi/Sww8f2stpitW2Oq7V7lDdDG81+N/D7/rKDD5PjUyMsVqc1n9wCTmfqmi6XPEw8AAACAHAGwPn/Mv7P9Q9+JZRWtGq+i4pL1zs1OluiStCN9e/Ok96t3gRVKPheQ6IwLacNjC9KkSKrLtsVyepGA+V5j/N+Cmsl6csZilnLvMUTvL/cmHDEEhTIQnPNrDDv+tED2BFqkajQqYLgMWeGVqXsBU6IT66itZlYtrq4v6uDQG/o=,admin

并指定客户端使用 karaf.id_dsa 私钥:

bin/client -k ~/karaf.id_dsa

或 ssh

ssh -p 8101 -i ~/karaf.id_dsa karaf@localhost

21.1.4. RBAC

Apache Karaf 使用角色来控制对资源的访问:它是 RBAC (基于角色的访问控制)系统。

角色用于控制:

  • 访问 OSGi 服务
  • 访问控制台(控制命令的执行)
  • 访问 JMX (MBeans 和/或操作)
  • 访问 WebConsole

21.1.4.1. OSGi 服务

开发人员指南中介绍了有关 OSGi 服务 RBAC 支持的详细信息。

21.1.4.2. 控制台(Console)

控制台 RBAC 支持是 OSGi 服务 RBAC 的分类。实际上,在 Apache Karaf 中,所有控制台命令都定义为 OSGi 服务。

console 命令名称遵循 scope:name 格式。

ACL (Access Lists)在 etc/org.apache.karaf.command.acl.<scope>.cfg 配置文件中定义,其中 &lt ;scope&gt; 是命令范围。

例如,我们可以通过创建 etc/org.apache.karaf.command.acl.feature.cfg 配置文件来定义到 feature:* 命令的 ACL。在这个 etc/org.apache.karaf.command.acl.feature.cfg 配置文件中,您可以设置:

list = viewer
info = viewer
install = admin
uninstall = admin

在这里,我们定义了 feature:listfeature:info 命令可由具有 viewer 角色的用户执行,而 feature:installfeature:uninstall 命令只能由具有 admin 角色的用户执行。请注意,admin 组中的用户也具有 viewer 角色,因此 能够执行所有内容。

Apache Karaf 命令 ACL 可以使用 (在给定命令范围内)来控制访问:

  • 命令名称 regex (例如 name = role
  • 命令名称和选项或参数值 regex (例如 name[/.[0-9][0-9][0-9]+./] = role 仅执行名称,其参数值高于 100)

命令名称和选项/参数都支持完全匹配或正则表达式匹配。

默认情况下,Apache Karaf 定义以下命令 ACL:

  • etc/org.apache.karaf.command.acl.bundle.cfg 配置文件定义 bundle:* 命令的 ACL。此 ACL 将 system 捆绑包的执行限制为具有 admin 角色的用户,而非系统的 捆绑包的 bundle:* 命令则可由具有 manager 角色的用户执行。
  • etc/org.apache.karaf.command.acl.config.cfg 配置文件定义 config:* 命令的 ACL。此 ACL 将 config:* 命令的执行限制为带有 jmx.aclMapping, org.apache.karaf.command.acl, 和 org.apache.karaf.acl ruby 配置 PID 到具有 admin 角色的用户。对于其他配置 PID,具有 manager 角色的用户可以执行 config:* 命令。
  • etc/org.apache.karaf.command.acl.feature.cfg 配置文件定义 feature:* 命令的 ACL。只有具有 admin 角色的用户才能执行 feature:installfeature:uninstall 命令。其他 feature:* 命令可由任何用户执行。
  • etc/org.apache.karaf.command.acl.jaas.cfg 配置文件定义 jaas:* 命令的 ACL。只有具有 admin 角色的用户才能执行 jaas:update 命令。其他 jaas:* 命令可由任何用户执行。
  • etc/org.apache.karaf.command.acl.kar.cfg 配置文件定义 kar:* 命令的 ACL。只有具有 admin 角色的用户才能执行 kar:installkar:uninstall 命令。其他 kar:* 命令可由任何用户执行。
  • etc/org.apache.karaf.command.acl.shell.cfg 配置文件定义 shell:* 和"direct"命令的 ACL。只有具有 admin 角色的用户才能执行 shell:editshell:execshell:newshell:java 命令。其他 shell:* 命令可由任何用户执行。

您可以更改这些默认 ACL,并添加您自己的 ACL 以了解额外的命令范围(例如,对于 Apache Camel、…​ 中的 etc/org.apache.karaf.command.acl.cluster.cfg等等/org.apache.karaf.command.acl.camel.cfg )。

您可以通过编辑 etc/system.properties 中的 karaf.secured.services 属性来微调命令 RBAC 支持:

#
# By default, only Karaf shell commands are secured, but additional services can be
# secured by expanding this filter
#
karaf.secured.services = (&(osgi.command.scope=*)(osgi.command.function=*))

21.1.4.3. JMX

与 console 命令类似,您可以将 ACL (AccessList)定义为 JMX 层。

JMX ACL 在 etc/jmx.acl<ObjectName>.cfg 配置文件中定义,其中 & lt;ObjectName > 是一个 MBean 对象名称(用于实例 org.apache.karaf.bundle 代表 org.apache.karaf;type=Bundle MBean)。

etc/jmx.acl.cfg 是最通用的配置文件,在没有找到特定配置文件时使用。它包含"global"ACL 定义。

JMX ACL 可以使用 (在 JMX MBean 中)来控制访问:

  • 操作名称 regex (如 operation* = role
  • 操作参数值 regex (e.g. operation (java.lang.String, int)[/([1-4])?[0-9]/,/ ruby/] = role)

默认情况下,Apache Karaf 定义以下 JMX ACL:

  • etc/jmx.acl.org.apache.karaf.bundle.cfg 配置文件定义 org.apache.karaf:type=bundle MBean 的 ACL。此 ACL 限制了针对具有 admin 角色的用户的系统捆绑包的 setStartLevel ()start ()stop ()update () 操作。其他操作可由具有 manager 角色的用户执行。
  • etc/jmx.acl.org.apache.karaf.config.cfg 配置文件定义 org.apache.karaf:type=config MBean 的 ACL。此 ACL 限制了对具有 admin 角色的用户的 jmx.acl*org.apache.karaf.command.acl*org.apache.karaf.service.acl* 配置 PID 的更改。其他操作可由具有 manager 角色的用户执行。
  • etc/jmx.acl.org.apache.karaf.security.jmx.cfg 配置文件定义 org.apache.karaf:type=security,area=jmx MBean 的 ACL。此 ACL 限制具有 viewer 角色的用户的 canInvoke () 操作的调用。
  • etc/jmx.acl.osgi.compendium.cm.cfg 配置文件定义 osgi.compendium:type=cm MBean 的 ACL。此 ACL 限制了对具有 admin 角色的用户的 jmx.acl*org.apache.karaf.command.acl*org.apache.karaf.service.acl* 配置 PID 的更改。其他操作可由具有 manager 角色的用户执行。
  • etc/jmx.acl.java.lang.Memory.cfg 配置文件定义核心 JVM 内存 MBean 的 ACL。此 ACL 限制仅针对具有 manager 角色的用户调用 gc 操作。
  • etc/jmx.acl.cfg 配置文件是最通用的文件。当没有其他特定 ACL 匹配时,会使用此处定义的 ACL (通过特定的 ACL,它是其它 MBean 特定的 MBean 特定 etc/jmx.acl125.cfg 配置文件中定义的 ACL)。list*()get* () 是* () 操作,可由具有 viewer 角色的用户执行。set*() 和所有其他 *() 操作可由具有 admin 角色的用户执行。

21.1.4.4. WebConsole

默认情况下,Apache Karaf WebConsole 不可用。要启用它,您必须安装 webconsole 功能:

karaf@root()> feature:install webconsole

WebConsole 不支持目前的精细 RBAC,如控制台或 JMX。

具有 admin 角色的所有用户都可以记录 WebConsole 并执行任何操作。

21.1.5. SecurityMBean

Apache Karaf 提供了一个 JMX MBean,用于检查当前用户是否可以调用给定的 MBean 和/或操作。

canInvoke () 操作获取当前用户的角色,并检查一个角色是否可以调用 MBean 和/或操作,最终具有给定参数值。

21.1.5.1. 操作

  • 如果当前用户可以使用 objectName,false other 调用 MBean,则 canInvoke (objectName) 返回 true
  • 如果当前用户可以在 MBean 上调用带有 objectName,false 其他的 operation methodName,则 canInvoke (objectName, methodName) 返回 true
  • 如果当前用户可以调用带有 objectName 的 MBean 类型 parameterTypes 数组的 operation methodName,则 canInvoke ( objectName, methodName, parameter Types ) returns true
  • canInvoke (bulkQuery) 返回包含 bulkQuery 选项卡中每个操作的表格数据(如果 canInvoketruefalse )。

21.1.6. 安全供应商

有些应用程序需要特定的安全供应商可用,如 [BouncyCastle|http://www.bouncycastle.org]。

JVM 对此类 jars 的使用施加一些限制:它们必须签名并在引导类路径上可用。

部署这些提供程序的一种方法是将其放在 $JAVA_HOME/jre/lib/ext 的 JRE 文件夹中,并修改安全策略配置($JAVA_HOME/jre/lib/security/java.security)以注册此类提供程序。

虽然这种方法可以正常工作,但它具有全局效果,但要求您相应地配置所有服务器。

Apache Karaf 提供了配置额外安全提供程序的简单方法:* 将您的供应商 jar 置于 lib/ext * 中,修改 etc/config.properties 配置文件以添加下列属性

org.apache.karaf.security.providers = xxx,yyy

此属性的值是要注册的供应商类名称的逗号分隔列表。

例如,要添加 bouncycastle 安全供应商,您可以定义:

org.apache.karaf.security.providers = org.bouncycastle.jce.provider.BouncyCastleProvider

此外,您可能还希望提供从系统捆绑包中对这些提供程序的类的访问权限,以便所有捆绑包都可以访问这些捆绑包。

它可以通过修改同一配置文件中的 org.osgi.framework.bootdelegation 属性来实现:

org.osgi.framework.bootdelegation = ...,org.bouncycastle*
Red Hat logoGithubRedditYoutubeTwitter

学习

尝试、购买和销售

社区

关于红帽文档

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

让开源更具包容性

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

關於紅帽

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

© 2024 Red Hat, Inc.