openharmony安全子系统之设备安全等级
概念 每个设备都有自己的安全等级,不同的安全等级的设备有着不同的策略。如下为不同的设备安全等级的策略。 SL1为OpenHarmony设备中最低的安全等级。这类设备通常搭载轻量级系统和使用低端微处理器,业务形态较为单一,不涉及敏感数据的处理。本安全等级要求消除常见的错误,支持软件的完整性保护。若无法满足本等级的要求,则只能作为配件受OpenHarmony设备操控,无法反向操控OpenH
概念
每个设备都有自己的安全等级,不同的安全等级的设备有着不同的策略。如下为不同的设备安全等级的策略。
SL1为OpenHarmony设备中最低的安全等级。这类设备通常搭载轻量级系统和使用低端微处理器,业务形态较为单一,不涉及敏感数据的处理。本安全等级要求消除常见的错误,支持软件的完整性保护。若无法满足本等级的要求,则只能作为配件受OpenHarmony设备操控,无法反向操控OpenHarmony设备并进行更复杂的业务协同。
SL2安全等级的OpenHarmony设备,可对自身数据进行标记并定义访问控制规则,实现自主的访问控制,需要具备基础的抗渗透能力。此级别设备可支持轻量化的可安全隔离环境,用于部署少量必需的安全业务。
SL3安全等级的OpenHarmony设备,具备较为完善的安全保护能力。其操作系统具有较为完善的安全语义,可支持强制访问控制。系统可结构化为关键保护元素和非关键保护元素,其关键保护元素被明确定义的安全策略模型保护。此级别设备应具备一定的抗渗透能力,可对抗常见的漏洞利用方法。
SL4安全等级的OpenHarmony设备,可信基应保持足够的精简,具备防篡改的能力。SL4的实现应足够精简和安全,可对关键保护元素的访问控制进行充分的鉴定和仲裁。此级别设备具备相当的抗渗透能力,可抑制绝大多数软件攻击。
SL5安全等级的OpenHarmony设备,为OpenHarmony设备中具备最高等级安全防护能力的设备。系统核心软件模块应进行形式化验证。关键硬件模块如可信根、密码计算引擎等应具备防物理攻击能力,可应对实验室级别的攻击。此级别设备应具备高安全单元,如专用的安全芯片,用于强化设备的启动可信根、存储可信根、运行可信根。
运作机制
当“超级虚拟终端”内的各个设备有了自己的“设备安全等级”,这个“超级虚拟终端”的内部,各类用户数据的处理或流转便有了决策依据。例如:分布式文件存储服务,在处理某些敏感数据时,默认不允许相关数据存储在安全等级低于SL3的设备。OpenHarmony设备的默认安全等级为SL1,设备制造商可以根据设备实际情况定制更高的安全等级。详细请参考章节定制设备安全等级。
开发指导
场景介绍
各子系统在处理、流转各类用户数据时,可以调用DSLM模块提供的接口,获取相关设备的安全等级信息。并结合其所处理数据的实际情况,决策数据的进一步处理。
接口说明
所有接口均为native C内部接口,仅提供底层能力,不对App开放。相关接口列表如下:
接口名 | 说明 |
---|---|
int32_t RequestDeviceSecurityInfo(const DeviceIdentify *identify, const RequestOption *option, DeviceSecurityInfo **info); | 请求获取某设备的设备安全等级信息(同步接口) |
int32_t RequestDeviceSecurityInfoAsync(const DeviceIdentify *identify, const RequestOption *option, DeviceSecurityInfoCallback callback); | 请求获取某设备的设备安全等级信息(异步接口) |
void FreeDeviceSecurityInfo(DeviceSecurityInfo *info); | 释放设备安全等级信息 |
int32_t GetDeviceSecurityLevelValue(const DeviceSecurityInfo *info, int32_t *level); | 从设备安全等级信息中提取对应的设备安全等级 |
开发步骤
1 编译依赖添加
external_deps += [ "device_security_level:dslm_sdk" ]
2 头文件依赖添加
#include "device_security_defines.h" // 关键数据结构定义头文件
#include "device_security_info.h" // 接口函数定义头文件
3 接口调用
void CheckDestDeviceSecurityLevel(const DeviceIdentify *device, RequestOption *option)
{
// 设备安全等级信息指针
DeviceSecurityInfo *info = NULL;
// 调用同步接口获取设备的安全等级等级信息
int32_t ret = RequestDeviceSecurityInfo(device, option, &info);
if (ret != SUCCESS) {
// 获取信息失败。此场景建议开发者根据实际情况进行重试
return;
}
int32_t level = 0;
// 从设备安全等级信息中提取设备安全等级字段
ret = GetDeviceSecurityLevelValue(info, &level);
if (ret != SUCCESS) {
// 提取信息失败, 此场景建议开发者根据实际情况进行重试
FreeDeviceSecurityInfo(info);
return;
}
// 成功获取到设备安全等级,确认当前操作允许的最低安全等级
// 假设当前操作允许的最低设备安全等级为3
if (level >= 3) {
// 目标设备的设备安全等级满足要求, 相关业务正常处理
} else {
// 目标设备的设备安全等级不满足要求, 建议开发者结合实际业务场景进行相应处理,例如告警、弹窗提示用户等
}
// 结束处理前,需要释放内存
FreeDeviceSecurityInfo(info);
}
工具配置设备等级使用介绍
1 签名密钥初始化:
./dslm_cred_tool.py init
2 凭据文件的生成:
生成一个名为cred.txt的凭据文件,并指定设备型号为rk3568、设备版本号为3.0.0、设备安全等级为SL3等payload信息。
./dslm_cred_tool.py create --field-manufacture OHOS --field-brand rk3568 --field-model rk3568 --field-software-version 3.0.0 --field-security-level SL3 --cred-file cred.txt
上述命令可以生成一个凭据示例文件如下:
cat cred.txt
eyJ0eXAiOiAiRFNMIn0=.eyJ0eXBlIjogImRlYnVnIiwgIm1hbnVmYWN0dXJlIjogIk9IT1MiLCAiYnJhbmQiOiAicmszNTY4IiwgIm1vZGVsIjogInJrMzU2OCIsICJzb2Z0d2FyZVZlcnNpb24iOiAiMy4wLjAiLCAic2VjdXJpdHlMZXZlbCI6ICJTTDMiLCAic2lnblRpbWUiOiAiMjAyMjAyMDkxNTUzMDMiLCAidmVyc2lvbiI6ICIxLjAuMSJ9.MGQCMEqZy/snsRyjMupnEvTpQfhQn+IcdCc5Q3NGxllNQVhoZX8PNyw6ATTgyx+26ghmtQIwVH5KwQ4/VejxckeHmtkBVhofhgmRapzvyVnyiB3PdsU7nvHk8A/zC7PFy1CWBG3z.W3sidXNlclB1YmxpY0tleSI6ICJNSG93RkFZSEtvWkl6ajBDQVFZSkt5UURBd0lJQVFFTEEySUFCQzFXRUxSVlU1NGp1U1ZXWlUrT29CM3hacFd5MWg3QW5uSFdKWm5QbTB3S2l0ZlJZelJKZ3FiUGQyZ3ltVXBUWVl1cmhyRDQxbFdPbUNzcmt0VWdaNTFXdGNCTmc5SG1GODkzc2ZHVFM5eUJNS0JoMGcxSHZaSVFSN1k0S3FXaWpnPT0iLCAic2lnbmF0dXJlIjogIk1HUUNNRFVicTZ2Z2R1YVF0bFVwOTR0azd4VjRJcEx2WVZWY3Y4aFNOTkw0azdPRHhmbEVGTHJFaUdPRWhwMUcweGFGYlFJd1pUbTk1cWx4OTBFZnptV3VIOGlEY2ZWYVlQS2N5SEYwR2ZFcEUzb1NESzQwZEFOZ0FJMWVQY09rTzBPOTdnTFAifSwgeyJ1c2VyUHVibGljS2V5IjogIk1Ib3dGQVlIS29aSXpqMENBUVlKS3lRREF3SUlBUUVMQTJJQUJGKzY1a0lSYTM2dkE4QVZWNXFrcUozYXpXTkdGQy9oaVdPL0tFNHR0S1pMOUsyNlhzQ2hQbjVNc3BlT2F3b1dqSU02bTVLOFZTcU1DYlZNN0svY0VRU0tYdDJTeVJGZERVZU9TaFZmQm9YVmxqaXRUU2puN0V5Q2pERVZiWjFRNEE9PSIsICJzaWduYXR1cmUiOiAiTUdRQ01HanF2cnZ5VW1YNVZLVVc1UkFkUTNkZ2hBYmNBazBRQnppQlFWMVFZUTNQMVFPSzdMckM1b0RObXh6T2Y0QUtmd0l3SzVWU2x3ZG5JSUR6Zm9PUXBEUVAycGhTVGgxSGVjbXJRK1F4VGxWelo0aHJsdnJyd2xCNnp0T3pWRFdNblRELyJ9LCB7InVzZXJQdWJsaWNLZXkiOiAiTUhvd0ZBWUhLb1pJemowQ0FRWUpLeVFEQXdJSUFRRUxBMklBQkZCa2FDNE9mc2VTREt2cW8vbU5VaUtXQ3JtK1VDNGFQcjVsODRNM2tMVCtDdkd3OWhqOGJ6d2I1MzNtVVlFZVhWWWtUdFlRYWRURkRJZXV1dGIzNU1QZDlEKytNMFRFWnZvcTY4NFhoYTVQMzBUbVRhK0ZvOG02UWliZWc3TmFQdz09IiwgInNpZ25hdHVyZSI6ICJNR1FDTURJcmpNYzhvODVPRHFZT0R4c05PcmpYdUhvWjM5endpZlhVTkdDc0lkN2xjU2FWcnhCVlNqRjRyaWg5Y1R6T3dRSXdWQXA3RUF5c1pucEI5REJWVWczQzlMeGQ3eTQxWEMwYVVPcGZUKzI3REVvWmM1WVVldDFGa1FwdmFQckduaFhVIn1d
3 凭据文件的校验:
./dslm_cred_tool.py verify --cred-file cred.txt
验证回显如下:
head:
{
"typ": "DSL"
}
payload:
{
"type": "debug",
"manufacture": "OHOS",
"brand": "rk3568",
"model": "rk3568",
"softwareVersion": "3.0.0",
"securityLevel": "SL3",
"signTime": "20220209155303",
"version": "1.0.1"
}
verify success!
4 将生成的凭据文件推送到调试设备中并使之生效:
临时关闭系统写保
hdc_std target mount
hdc_std shell "setenforce 0"
将刚刚生成的凭据文件推送到设备中:
hdc_std file send cred.txt /system/etc/dslm_finger.cfg
重启设备使新的凭据文件生效:
hdc_std reboot
更多推荐
所有评论(0)