当使用 AREX 录制生产上真实流量时,在涉及客户安全数据或者一些商业性敏感数据的情况下,我们需要针对某些敏感信息通过脱敏规则进行数据的变形,实现敏感隐私数据的可靠保护。
AREX 0.6.0 版本提供了数据脱敏功能,用户通过 AREX 进行生产环境真实流量的录制,AREX 会在将数据存储到数据库时对其进行脱敏处理,并且可以选择开启应用权限管理,在前端报告页面展示加密后的数据给无权限的用户。
数据落库时的脱敏主要是指对 AREX 数据库中 Mocker 表,ReplayRunDetails 表和 ReplayCompareResult 表进行加密,在进行数据落库时对数据进行脱敏,以保护敏感信息的安全性。
在 AREX 中,为了实现这一功能,采用了一种基于 SPI(Service Provider Interface)机制的动态加载加密方式的实现方法。SPI 机制允许在应用程序中加载外部的 JAR 包,以扩展应用程序的功能。
为了方便用户使用,AREX 提供了一个加密 JAR 包,其中使用了 AES(Advanced Encryption Standard)加密算法来实现数据加密。AES 是一种对称加密算法,被广泛应用于数据保护领域。用户可以通过提供该加密 JAR 包的 URL 链接,让 AREX 在数据落库时使用 AES 算法对敏感数据进行加密,从而保护数据的安全性。
以下以 AREX 提供的加密 JAR 包为例说明如何使用数据脱敏功能。
在 System Setting 页面,填写加密 JAR 包的 URL 链接。填写完成后,需要重启 arex-storage
和 arex-schedule
服务才能使加密生效。
如果使用系统提供的加密 JAR 包,则还需要配置 AES 密钥文件。具体的配置方法可以参考下一节的说明。
接上文,在使用系统提供的加密 JAR 包时,需要进行密钥文件的配置,arex-storage
和 arex-schedule
服务需要读取 AES 算法的密钥,以确保服务能够正确地进行加密操作。
将 AES 密钥文件 aesKey.bin
存放在 deployments 文件夹中的 arex-extension/arex-storage 和 arex-extension/arex-schedule 目录中。需要注意的是,存放密钥文件的位置和文件名需要严格按照要求进行,否则服务可能无法正确读取密钥文件。
在生成密钥文件时,文件名和后缀名是固定的,不能更改。生成代码如下:
import javax.crypto.KeyGenerator;
import javax.crypto.SecretKey;
import java.io.File;
import java.io.FileOutputStream;
public class AesKeyWriter {
private static final String AES_KEY_FOLDER_PATH = "./extension";
private static final String AES_KEY_FILE_PATH = AES_KEY_FOLDER_PATH + "/aesKey.bin";
private static void writeAesKey(String keyFilePath) {
try {
File extensionFolder = new File(AES_KEY_FOLDER_PATH);
extensionFolder.mkdirs();
// AES key generation
KeyGenerator keyGenerator = KeyGenerator.getInstance("AES");
// The key length can be adjusted as needed. aes only supports 128-bit, 192-bit or 256-bit keys
keyGenerator.init(256);
SecretKey secretKey = keyGenerator.generateKey();
byte[] keyBytes = secretKey.getEncoded();
// write key to file
FileOutputStream fos = new FileOutputStream(keyFilePath);
fos.write(keyBytes);
fos.close();
} catch (Exception e) {
throw new RuntimeException(e);
}
}
public static void main(String[] args) {
writeAesKey(AES_KEY_FILE_PATH);
}
}
如果需要实现自己开发的加密算法,需要实现拓展接口的 jar 包中的 DataDesensitization 接口方法,并在 /META-INF/services 文件夹下指定具体实现的方法签名,可以参考 AREX 提供的 JAR 实现。拓展接口的 JAR 包坐标如下:
<dependency>
<groupId>com.arextest</groupId>
<artifactId>arex-extension</artifactId>
<version>0.0.1</version>
</dependency>
注意点:
加密 JAR 需要可逆,保证录制流量可以用于回放的关键。如果加密不可逆,那么录制的流量在回放时无法正确解密,从而导致回放失败。
在使用 Maven 进行打包时,需要注意将依赖的 jar 包一起打包,以便运行时能够正确加载依赖的类和资源文件。Maven 打包配置如下:
<build>
<plugins>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-assembly-plugin</artifactId>
<version>3.0.0</version>
<executions>
<execution>
<id>make-assembly</id> <!-- this is used for inheritance merges -->
<phase>package</phase> <!-- bind to the packaging phase -->
<goals>
<goal>single</goal>
</goals>
</execution>
</executions>
<configuration>
<descriptorRefs>
<descriptorRef>jar-with-dependencies</descriptorRef>
</descriptorRefs>
</configuration>
</plugin>
</plugins>
</build>
用户可以在应用注册前自行选择是否开启权限验证功能,开启后,注册成功的被测应用只有有权限的用户才能够对系统的配置进行修改。没有应用权限的用户,数据会进行脱敏展示,无权查看详细内容。
如果需要开启应用权限,需要在注册应用前在 docker-compose.yml 文件中 arex-api-service、arex-storage-service、arex-schedule-service 3 个项目的启动参数中添加如下参数:
-Darex.app.auth.switch=true // 默认为 false,即不开启应用权限验证功能
即:
arex-api-service:
...
environment:
- TZ=Asia/Shanghai
- JAVA_OPTS=-Darex.mongo.uri=$AREX_MONGO_URI
-Darex.redis.uri=$AREX_REDIS_URI
-Darex.storage.service.url=http://arex-storage-service:8080
-Dspring.config.additional-location=/usr/local/tomcat/additional-config/
-Dspring.config.name=application,oauth
-Darex.app.auth.switch=true
...
arex-storage-service:
...
environment:
- TZ=Asia/Shanghai
- JAVA_OPTS=-Darex.mongo.uri=$AREX_MONGO_URI
-Darex.redis.uri=$AREX_REDIS_URI
-Darex.api.service.api=http://arex-api-service:8080
-Darex.app.auth.switch=true
...
arex-schedule-service:
...
environment:
- TZ=Asia/Shanghai
- JAVA_OPTS=-Darex.mongo.uri=$AREX_MONGO_URI
-Darex.redis.uri=$AREX_REDIS_URI
-Darex.storage.service.api=http://arex-storage-service:8080
-Darex.api.service.api=http://arex-api-service:8080
-Darex.app.auth.switch=true
...
下面的表格展示了在开启验证功能后,不同用户的各项操作权限。
注意:在关闭验证时,无权限用户可以进行所有操作。但在开启验证后,无权限用户将无法进行某些操作,如修改配置、删除应用和查看录制详情。而有权限的用户的功能不受影响,可以继续进行所有操作。
AREX Agent 是实现服务录制回放的核心组件,使用录制功能前需要在被测应用中配置 Agent。
通过浏览器访问 AREX 前端页面,点击 Replay 进入回放页面,点击菜单栏左上角 “+” 新建一个应用,并输入应用名称。
在成功创建新的应用后,如下所示,将自动生成该应用的 Agent 的启动参数。
即:
java -javaagent:</path/to/arex-agent.jar> -Darex.service.name=21fdcdbf919eaae0 -Darex.storage.service.host=<storage.service.host:port> -jar <your-application.jar>
其中:
用户可以复制这些参数并根据自己的需求进行修改,之后只需将这些参数粘贴到被测服务中即可启动应用,完成注册。
需要注意的是,新创建的应用的 Owner 将自动设置为创建该应用的用户。
接下来,使用 Agent 启动参数,启动应用即可。
首先,通过 git 进行 arex-agent-java
项目的拉取,自行编译:
git clone https://github.com/arextest/arex-agent-java.git
cd arex-agent-java
mvn clean package -DskipTests
编译成功后可在 arex-agent-java 文件夹得到一个名为 arex-agent-jar 的新文件夹,其中包含两个 jar 包:
可以用以下命令进行编译:
mvn clean package -DskipTests -Pjar-with-version
粘贴刚才生成的 Agent 的启动参数并运行,启动 Agent 运行应用:
java -javaagent:</path/to/arex-agent.jar> -Darex.service.name=21fdcdbf919eaae0 -Darex.storage.service.host=<storage.service.host:port> -jar <your-application.jar>
如果应用开启了应用鉴权,那么也就开启了录制内容的前端脱敏。非 Owner 用户无法查看用户录制的数据。
有权限用户详情页展示:
无权限用户详情页展示: