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