十五、安全
15.1 访问控制
由于Axon服务器是一个事件存储,可能包含敏感数据,因此在生产环境和类似生产环境中启用访问控制始终是一个很好的实践。启用访问控制将要求应用程序在访问Axon服务器服务(通过gRPC和HTTP)时提供令牌,并要求用户登录仪表板
要在Axon服务器(SE/EE)中启用访问控制,请将以下属性添加到axonserver.properties:
axoniq.axonserver.accesscontrol.enabled=true
15.1.1Axon服务器标准版
Axon Server Standard Edition为以下各项提供了基本的访问控制机制:
- 连接到Axon Server SE的客户端应用程序。
- 用户访问Axon服务器控制台。
15.1.1.1Axon框架客户端应用程序
应用程序需要提供一个有效的令牌,然后才能执行所有操作。对于用户,有两个组:(1)可以登录仪表板但不能管理用户的用户;(2)具有管理员角色的用户,允许他们管理用户。
应用程序必须提供令牌才能使用Axon服务器,在axonserver.properties文件中作出如下定义:
axoniq.axonserver.accesscontrol.token=[token]
您在这里设置的令牌必须由连接到Axon服务器的所有Axon框架应用程序使用。可以使用属性在客户端中设置访问令牌axon.axonserver.token=[token]。
如果使用的是REST API,则可以通过以下标头在HTTP请求中指定令牌:
AxonIQ-Access-Token: my-token-value-here
15.1.1.2 user-Axon Server SE UI控制台
您可以通过命令行或仪表板web应用程序创建用户。必须通过命令行创建初始用户,否则将无法登录到仪表板。
为此,请执行“注册用户”命令:
$ java -jar axonserver-cli.jar register-user -u username -r roles [-p password] -S http://[node]:[port] [-t token]
强制性参数
-u表示用户名。
-r表示用户的角色。通过提供逗号分隔的列表(不带空格)->READ,ADMIN指定多个角色。
-p是用户的密码。如果不使用-p选项指定密码,命令行界面将提示您输入密码
可选参数
-S表示要将命令发送到的服务器。如果未提供,则连接到http://localhost:8024默认。对于Axon Server SE,Axon Server SE的URL将是单个正在运行的节点。
-t是指要在命令发送到的服务器上进行身份验证的访问令牌。这应该与中的令牌设置相同axonserver.properties文件。
还可以使用Axon服务器SE提供的restapi/UI控制台添加用户。CLI还允许列出所有用户以及删除特定用户。
15.1.2 Axon服务器企业版
Axon Server Enterprise Edition为以下各项提供了细粒度的访问控制机制:
- 连接到Axon Server SE的客户端应用程序。
- 用户访问Axon服务器控制台。
在Axon服务器EE中,我们可以向允许特定操作的应用程序和用户授予特定的角色。除了只分配角色外,还必须指明角色是为哪个上下文授予的,这样只有一个上下文权限的应用程序/用户就不能从其他上下文访问数据
下面描述了各种角色的摘要:
15.1.2.1 Axon框架客户端应用程序
现在必须使用特定角色注册应用程序。因为每个请求都需要一个令牌或一个有效的用户,所以有一种特殊的方法来创建第一个应用程序和/或用户。第一个应用程序可以在Axon服务器节点上使用命令行界面创建,CLI必须从Axon服务器的安装目录运行。
要注册应用程序并获取访问令牌,请使用“register application”命令。此命令返回要使用的生成令牌。请注意,此令牌只生成一次,如果丢失,则必须删除应用程序并再次注册以获取新令牌。如果要自己定义令牌,可以在命令行命令中使用-T标志提供一个令牌:
$ java -jar axonserver-cli.jar register-application -a name -r roles [-d description] [-T apptoken] -S http://[node]:[port] [-t token]
强制性参数
-a _**_是指应用程序的名称。
-r表示应用程序的角色。通过提供逗号分隔列表(不带空格)指定多个角色,例如READ、ADMIN。
可选参数
-d是指对应用程序的描述。
-S表示要将命令发送到的服务器,如果未提供,则默认连接到http://localhost:8024。URL应该指向在Axon服务器EE集群中服务于\u admin上下文的任何节点。
-t是指要在命令发送到的服务器上进行身份验证的访问令牌。
-T以防您自己为新注册的应用程序定义令牌。
管理员角色仅对_ADMIN上下文有效,其他角色特定于其他上下文。除了角色名称之外,您还可以提供应用此角色的上下文,例如{role_name}@{context_name}。另外,如果在Axon服务器EE中没有提到上下文,那么将为所有注册的上下文(包括在授予角色后创建的上下文)将角色授予应用程序。
您在这里设置的令牌必须由连接到Axon服务器的所有Axon框架应用程序使用。可以使用属性在客户端中设置访问令牌axon.axonserver.token=[token]
如果使用的是REST API,则可以通过以下标头在HTTP请求中指定令牌:
AxonIQ-Access-Token: my-token-value-here
15.1.2.2 User-Axon Server EE UI控制台
当使用启用了访问控制的Axon服务器时,需要定义用户来访问Axon服务器EE仪表板。必须在Axon服务器节点上使用命令行界面创建第一个用户,并且必须从Axon Server的安装目录运行CLI。
为此,请执行“注册用户”命令:
$ java -jar axonserver-cli.jar register-user -u username -r roles [-p password] -S http://[node]:[port] [-t token]
强制性参数
-u表示用户名。
-r表示用户的角色。通过提供逗号分隔的列表(不带空格)指定多个角色。
-p是用户的密码。如果不使用-p选项指定密码,命令行界面将提示您输入密码
可选参数
-S表示要将命令发送到的服务器。如果未提供,则连接到http://localhost:8024默认。
-t是指要在命令发送到的服务器上进行身份验证的访问令牌。这应该与中的令牌设置相同axonserver.properties文件。
还可以使用Axon服务器EE提供的restapi/UI控制台添加用户。CLI还允许列出所有用户以及删除特定用户。
15.1.2.3 Axon服务器群集
如果启用了访问控制,集群中的节点还需要附加一个令牌,并在它们之间发送消息。必须在axonserver.properties文件在具有属性的每个节点上axoniq.axonserver.accesscontrol。内部令牌。对于所有节点,此属性的值必须相同,并且与SE的令牌具有可比性。如果您有一个正在运行的群集并希望启用访问控制,请确保在开始启用访问控制之前,首先在所有节点上配置此令牌。这样,您就可以一次将重新启动限制在单个节点上,并且永远不会失去完整的群集可用性。
15.2 SSL
Axon Server支持TLS/SSL(安全传输层协议/加密套接字协议层)来加密Axon服务器的所有网络流量-范围是从Axon框架客户端应用程序到Axon服务器(SE/EE)以及群集中的Axon服务器节点之间(仅限EE)。
Axon服务器(SE/EE)有两个端口(HTTP/gRPC)需要为SSL启用,因此需要使用两组不同的设置,每个端口一组。HTTP端口使用一般的springboot配置设置,并且需要一个Java兼容的keystore。对于gRPC端口,我们使用标准PEM文件。
对于SE和EE需要在axonserver.properties中设置以下属性:
对于Axon Server EE,我们有两个额外的内部gRPC端口设置;“...ssl.internal-cert-chain-file “和”...ssl.internal-trust-manager-file”。
第一种是用于集群内部通信的PEM证书,如果它与用于客户端连接的证书不同。最常见的原因是节点在内部(群集节点到群集节点)通信中使用的DNS名称与外部连接不同。
第二种方法是用于验证其他证书的(PEM)密钥库,当使用javajdk的CA密钥库不可用的授权对它们进行签名时,可能需要这些证书。
- 停机注意事项
需要记住的是,在Axon服务器集群上启用SSL需要停机,因为“...ssl.enabled “设置同时控制服务器端和客户端代码。这是有意的,因为期望所有节点在每个节点上都有单独的设置是不合理的,显示哪些节点使用SSL进行通信,哪些不使用SSL,建议在Axon服务器的安装阶段一开始就这样做。