В OpenHarmony приложения и системные службы выполняются в независимых песочницах. Процессы и данные изолированы друг от друга для защиты безопасности данных приложений. Однако службы или приложения, работающие в песочницах, предоставляют некоторые API для реализации определенных функциональностей. Для доступа к этим API через процессы приложениям в других песочницах необходимы соответствующие разрешения, которые предоставляются и управляются на основе механизма управления разрешениями.
Управление разрешениями приложений предоставляет следующие функции:
Рисунок 1 Архитектура управления разрешениями приложений
Управление разрешениями приложений предоставляет управление разрешениями для подсистемы фреймворка приложений и предоставляет API для приложений, чтобы запрашивать разрешения и проверять статус предоставления разрешений. Открытое управление разрешениями приложений применяется к мини- и малым системам.
/base/security/permission_lite
├── interfaces # API
│ ├── innerkits # Внутренние API
│ └── kits # Внешние API
└── services # Сервисы
├── ipc_auth # Аутентификация IPC-коммуникации
├── js_api # Обертка JS API
├── pms # Логика и сервер управления разрешениями
├── pms_base # Регистрация сервисов
└── pms_client # Клиент управления разрешениями
API управления разрешениями приложений для мини- и малых систем могут вызываться только системными приложениями и службами. Следующая таблица описывает эти API.
API | Описание |
---|---|
int CheckPermission(int uid, const char *permissionName) | Проверяет, имеет ли приложение разрешение на доступ к API системной службы. |
int CheckSelfPermission(const char *permissionName) | Проверяет, имеет ли вызывающая сторона разрешение на доступ к API системной службы. |
int QueryPermission(const char *identifier, PermissionSaved **permissions, int *permNum) | Запрашивает все разрешения, запрошенные приложением, и проверяет, были ли запрошенные разрешения предоставлены. |
int GrantPermission(const char *identifier, const char *permName) | Предоставляет разрешение приложению. |
int RevokePermission(const char *identifier, const char *permName) | Отзывает разрешение у приложения. |
int GrantRuntimePermission(int uid, const char *permissionName) | Предоставляет разрешение во время выполнения приложения. |
int RevokeRuntimePermission(int uid, const char *permissionName) | Отзывает разрешение во время выполнения приложения. |
int UpdatePermissionFlags(const char *identifier, const char *permissionName, const int flags) | Обновляет флаги разрешения, указанного приложением. |
Следующая таблица описывает API аутентификации IPC для мини- и малых систем.
API | Описание |
---|---|
int GetCommunicationStrategy(RegParams params, PolicyTrans **policies, unsigned int *policyNum) | Получает политики доступа для API службы. Этот API может вызываться только System Ability Manager (SAMGR). |
int IsCommunicationAllowed(AuthParams params) | Проверяет, имеет ли процесс разрешение на доступ к API другого процесса. Этот API может вызываться только SAMGR. |
Управление Разрешениями Приложений для Мини- или Малой Системы
Следующий пример использует разработку управления разрешениями приложений для службы управления пакетами (BMS). Во время разработки объявите необходимые чувствительные разрешения в файле config.json. Во время установки приложения BMS вызывает API компонента управления разрешениями приложений для проверки наличия необходимых разрешений. Если они есть, установка продолжается; в противном случае установка завершается неудачей.
Во время разработки определите и объявите необходимое разрешение (ohos.permission.INSTALL_BUNDLE) для установки приложения. Если используется модель FA, объявите разрешение в файле config.json. Пример:
{
"module": {
"package": "ohos.demo.kitframework",
"deviceType": [
"phone", "tv","tablet", "car","smartWatch","sportsWatch","smartCamera", "smartVision"
],
"reqPermissions": [{
"name": "ohos.permission.INSTALL_BUNDLE",
"reason": "install bundle",
"usedScene": {
"ability": [
"KitFramework"
],
"when": "always"
}
},
{
"name": "ohos.permission.LISTEN_BUNDLE_CHANGE",
"reason": "install bundle",
"usedScene": {
"ability": [
"KitFramework"
],
"when": "always"
}
},
{
"name": "ohos.permission.GET_BUNDLE_INFO",
"reason": "install bundle",
"usedScene": {
"ability": [
"KitFramework"
],
"when": "always"
}
}
]
}
}
Если используется модель stage, объявите разрешение в файле module.json5. Пример:
{
"module": {
"requestPermissions": [{
"name": "ohos.permission.INSTALL_BUNDLE",
"reason": "install bundle",
"usedScene": {
"ability": [
"KitFramework"
],
"when": "always"
}
},
{
"name": "ohos.permission.LISTEN_BUNDLE_CHANGE",
"reason": "install bundle",
"usedScene": {
"ability": [
"KitFramework"
],
"when": "always"
}
},
{
"name": "ohos.permission.GET_BUNDLE_INFO",
"reason": "install bundle",
"usedScene": {
"ability": [
"KitFramework"
],
"when": "always"
}
}]
}
}
При разработке API установки приложения используйте API CheckPermission() для проверки, имеет ли BMS разрешение на установку приложения. Например, CheckPermission() вызывается с именем разрешения ohos.permission.INSTALL_BUNDLE в качестве входного параметра для проверки, имеет ли BMS разрешение на установку приложения. Если у BMS есть это разрешение, установка продолжается; в противном случае установка завершается неудачей.
constexpr static char PERMISSION_INSTALL_BUNDLE[] = "ohos.permission.INSTALL_BUNDLE";
bool Install(const char *hapPath, const InstallParam *installParam, InstallerCallback installerCallback)
{
if ((hapPath == nullptr) || (installerCallback == nullptr) || (installParam == nullptr)) {
HILOG_ERROR(HILOG_MODULE_APP, "BundleManager install failed due to nullptr parameters");
return false;
}
// Проверьте, предоставлено ли разрешение ohos.permission.INSTALL_BUNDLE.
if (CheckPermission(0, static_cast<const char *>(PERMISSION_INSTALL_BUNDLE)) != GRANTED) {
HILOG_ERROR(HILOG_MODULE_APP, "BundleManager install failed due to permission denied");
return false; // Установка приложения завершается неудачей.
}
// Процесс установки.
...
}
Аутентификация IPC для Мини- или Малой Системы
Следующий пример описывает, как использовать компонент аутентификации IPC для настройки политик доступа к функциям BMS. В этом примере служба, зарегистрированная BMS с SAMGR, называется bundlems, а зарегистрированная функция — BmsFeature.
Настройте политику доступа в заголовочном файле base/security/permission_lite/services/ipc_auth/include/policy_preset.h в директории исходного кода. Существует три типа политик доступа:
FeaturePolicy bmsFeature[] = {
{
"BmsFeature",
{
{
.type=FIXED, // Позволяет доступ из процессов с указанными UID.
.fixedUid={2, 3, 8}
},
{
.type=RANGE, // Позволяет доступ из процессов с UID в указанном диапазоне.
.uidMin=100,
.uidMax=__INT_MAX__,
},
}
},
{
"BmsInnerFeature",
{
{
.type=FIXED, // Позволяет доступ из процессов с указанными UID.
.fixedUid={2, 3, 8}
},
{
.type=RANGE,
.uidMin=100,
.uidMax=999,
},
}
},
};
Добавьте политики, настроенные на шаге 1, в глобальные настройки политик. Необходимо указать количество функций.
static PolicySetting g_presetPolicies[] = {
{"permissionms", pmsFeature, 1},
{"abilityms", amsFeature, 2},
{"bundlems", bmsFeature, 2}, // Функция BMS, определенная на шаге 1. Количество функций BMS равно 2.
{"dtbschedsrv", dmsFeature, 1},
{"samgr", samgrFeature, 1},
{"appspawn", appspawnFeature, 1},
{"WMS", wmsFeature, 1},
{"bundle_daemon", bdsFeature, 1},
};
Зарегистрируйте BmsFeature, определенную на шаге 1, с SAMGR.
const char BMS_SERVICE[] = "bundlems";
const char BMS_FEATURE[] = "BmsFeature";
static void Init()
{
SamgrLite *sm = SAMGR_GetInstance();
if (sm == nullptr) {
return;
}
// Зарегистрируйте службу с SAMGR.
sm->RegisterFeature(BMS_SERVICE, reinterpret_cast<Feature *>(BundleMsFeature::GetInstance()));
sm->RegisterFeatureApi(BMS_SERVICE, BMS_FEATURE,
GetBmsFeatureApi(reinterpret_cast<Feature *>(BundleMsFeature::GetInstance())));
HILOG_DEBUG(HILOG_MODULE_APP, "BundleMS feature start success");
}
APP_FEATURE_INIT(Init);
Когда указанные службы зарегистрированы с SAMGR, SAMGR вызывает GetCommunicationStrategy() компонента аутентификации IPC для получения политики доступа к службам. Когда другие службы или приложения обращаются к этим службам через IPC, SAMGR вызывает IsCommunicationAllowed() компонента аутентификации IPC для проверки прав вызывающей службы. Если политика доступа соблюдается, доступ предоставляется; в противном случае доступ отклоняется.
Подсистема безопасности
Вы можете оставить комментарий после Вход в систему
Неприемлемый контент может быть отображен здесь и не будет показан на странице. Вы можете проверить и изменить его с помощью соответствующей функции редактирования.
Если вы подтверждаете, что содержание не содержит непристойной лексики/перенаправления на рекламу/насилия/вульгарной порнографии/нарушений/пиратства/ложного/незначительного или незаконного контента, связанного с национальными законами и предписаниями, вы можете нажать «Отправить» для подачи апелляции, и мы обработаем ее как можно скорее.
Комментарии ( 0 )