• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
1# 基于设备分类和数据分级的访问控制 (ArkTS)
2<!--Kit: ArkData-->
3<!--Subsystem: DistributedDataManager-->
4<!--Owner: @baijidong-->
5<!--Designer: @widecode; @htt1997-->
6<!--Tester: @yippo; @logic42-->
7<!--Adviser: @ge-yafang-->
8
9## 基本概念
10
11分布式数据管理对数据实施分类分级保护,提供基于数据安全标签以及设备安全等级的访问控制机制。
12
13数据安全标签和设备安全等级越高,加密措施和访问控制措施越严格,数据安全性越高。
14
15
16### 数据安全标签
17
18按照数据分类分级规范要求,可将数据分为S1、S2、S3、S4四个安全等级。
19
20  | 风险等级 | 风险标准 | 定义 | 样例 |
21| -------- | -------- | -------- | -------- |
22| 严重 | S4 | 业界法律法规定义的特殊数据类型,涉及个人的最私密领域的信息或一旦泄露、篡改、破坏、销毁可能会给个人或组织造成重大的不利影响的数据。 | 政治观点、宗教和哲学信仰、工会成员资格、基因数据、生物信息、健康和性生活状况,性取向等或设备认证鉴权、个人信用卡等财物信息等。 |
23| 高 | S3 | 数据的泄露、篡改、破坏、销毁可能会给个人或组织导致严峻的不利影响。 | 个人实时精确定位信息、运动轨迹等。 |
24| 中 | S2 | 数据的泄露、篡改、破坏、销毁可能会给个人或组织导致严重的不利影响。 | 个人的详细通信地址、姓名昵称等。 |
25| 低 | S1 | 数据的泄露、篡改、破坏、销毁可能会给个人或组织导致有限的不利影响。 | 性别、国籍、用户申请记录等。 |
26
27
28### 设备安全等级
29<!--RP1-->
30根据设备安全能力(例如是否有TEE、是否有安全存储芯片等),将设备安全等级分为SL1、SL2、SL3、SL4、SL5五个等级。例如,开发板rk3568、hi3516为安全等级低的SL1设备,平板为安全等级高的SL4设备。
31
32在设备组网时,可以通过`hidumper -s 3511`命令查看设备的安全等级。如果查询无结果可以通过service_control start dslm_service主动拉起对应进程,之后再使用hidumper命令查询。例如,rk3568设备的安全等级查询如下:
33<!--RP1End-->
34<!--Del-->
35![zh-cn_image_0000001542496993](figures/zh-cn_image_0000001542496993.png)
36<!--DelEnd-->
37
38## 跨设备同步访问控制机制
39
40数据跨设备同步时,基于数据安全标签和设备安全等级进行访问控制。数据库的数据安全标签不高于对端设备的设备安全等级时,数据才能同步。具体访问控制矩阵如下:
41
42|设备安全级别|可同步的数据安全标签|
43|---|---|
44|SL1|S1|
45|SL2|S1~S2|
46|SL3|S1~S3|
47|SL4|S1~S4|
48|SL5|S1~S4|
49<!--RP2-->
50例如,对于类似rk3568、hi3516的开发板设备,设备安全等级为SL1。若创建数据安全标签为S1的数据库,则此数据库数据可以在这些设备间同步;若创建的数据库标签为S2-S4,则不能在这些设备间同步。
51<!--RP2End-->
52
53## 场景介绍
54
55分布式数据库的访问控制机制确保了数据存储和同步时的安全能力。在创建数据库时,应当基于数据分类分级规范合理地设置数据库的安全标签,确保数据库内容和数据标签的一致性。
56
57
58## 使用键值型数据库实现数据分级
59
60键值型数据库,通过securityLevel参数设置数据库的安全等级。此处以创建安全等级为S3的数据库为例。
61
62具体接口及功能,可见[分布式键值数据库](../reference/apis-arkdata/js-apis-distributedKVStore.md)。
63> **说明**:
64>
65> 在单设备使用场景下,KV数据库支持修改securityLevel开库参数进行安全等级升级。数据库安全等级升级操作需要注意以下几点:
66> * 该操作不支持需要进行跨设备同步的数据库,不同安全等级的数据库之间不能进行数据同步,需要跨设备同步的数据库如果要升级安全等级,建议重新创建更高安全等级的数据库。
67> * 该操作需在关闭当前数据库之后,通过修改securityLevel开库参数重新设置数据库的安全等级,再进行开库操作。
68> * 该操作只支持升级,不支持降级。例如支持S2->S3的升级,不支持S3->S2的降级。
69
70
71```ts
72import { AbilityConstant, ConfigurationConstant, UIAbility, Want } from '@kit.AbilityKit';
73import { hilog } from '@kit.PerformanceAnalysisKit';
74import { distributedKVStore } from '@kit.ArkData';
75import { BusinessError } from '@kit.BasicServicesKit';
76
77export default class EntryAbility extends UIAbility {
78  onCreate(want: Want, launchParam: AbilityConstant.LaunchParam): void {
79    this.context.getApplicationContext().setColorMode(ConfigurationConstant.ColorMode.COLOR_MODE_NOT_SET);
80    hilog.info(0x0000, 'testTag', '%{public}s', 'Ability onCreate');
81    let kvManager: distributedKVStore.KVManager;
82    let kvStore: distributedKVStore.SingleKVStore;
83    let context = this.context;
84    const kvManagerConfig: distributedKVStore.KVManagerConfig = {
85      context: context,
86      bundleName: 'com.example.datamanagertest'
87    }
88    try {
89      kvManager = distributedKVStore.createKVManager(kvManagerConfig);
90      console.info('Succeeded in creating KVManager.');
91      try {
92        const options: distributedKVStore.Options = {
93          createIfMissing: true,
94          encrypt: true,
95          backup: false,
96          autoSync: false,
97          kvStoreType: distributedKVStore.KVStoreType.SINGLE_VERSION,
98          securityLevel: distributedKVStore.SecurityLevel.S3
99        };
100        kvManager.getKVStore<distributedKVStore.SingleKVStore>('storeId', options, (err, store: distributedKVStore.SingleKVStore) => {
101          if (err) {
102            console.error(`Failed to get KVStore. Code:${err.code},message:${err.message}`);
103            return;
104          }
105          console.info('Succeeded in getting KVStore.');
106          kvStore = store;
107        });
108      } catch (e) {
109        let error = e as BusinessError;
110        console.error(`An unexpected error occurred. Code:${error.code},message:${error.message}`);
111      }
112    } catch (e) {
113      let error = e as BusinessError;
114      console.error(`Failed to create KVManager. Code:${error.code},message:${error.message}`);
115    }
116  }
117}
118```
119
120## 使用关系型数据库实现数据分级
121
122关系型数据库,通过securityLevel参数设置数据库的安全等级。此处以创建安全等级为S3的数据库为例。
123
124具体接口及功能,可见[关系型数据库](../reference/apis-arkdata/arkts-apis-data-relationalStore.md)。
125
126
127
128```ts
129import { UIAbility } from '@kit.AbilityKit';
130import { relationalStore } from '@kit.ArkData';
131import { BusinessError } from '@kit.BasicServicesKit';
132
133export default class EntryAbility extends UIAbility {
134  async onCreate(): Promise<void> {
135    let store: relationalStore.RdbStore | undefined = undefined;
136    let context = this.context;
137
138    try {
139      const STORE_CONFIG: relationalStore.StoreConfig = {
140        name: 'RdbTest.db',
141        securityLevel: relationalStore.SecurityLevel.S3
142      };
143      store = await relationalStore.getRdbStore(context, STORE_CONFIG);
144      console.info('Succeeded in getting RdbStore.')
145    } catch (e) {
146      const err = e as BusinessError;
147      console.error(`Failed to get RdbStore. Code:${err.code}, message:${err.message}`);
148    }
149  }
150}
151```
152