1 В избранное 0 Ответвления 0

OSCHINA-MIRROR/openharmony-security_permission_lite

Присоединиться к Gitlife
Откройте для себя и примите участие в публичных проектах с открытым исходным кодом с участием более 10 миллионов разработчиков. Приватные репозитории также полностью бесплатны :)
Присоединиться бесплатно
Клонировать/Скачать
README_zh.md 23 КБ
Копировать Редактировать Web IDE Исходные данные Просмотреть построчно История
Отправлено 26.05.2025 09:01 4937db8

Управление разрешениями приложений

Введение

В OpenHarmony приложения и системные службы выполняются в отдельных песочницах, где пространство процессов и данные программы изолированы друг от друга, что обеспечивает безопасность данных приложений. Однако службы или приложения, выполняющиеся в отдельных песочницах, должны предоставлять некоторые API для реализации необходимых функций. Приложения в других песочницах, которые хотят получить доступ к этим API, должны быть авторизованы с помощью механизма управления разрешениями системы.- Управление разрешениями приложений предоставляет механизм определения разрешений, который позволяет системным службам и приложениям определять новые разрешения для своих чувствительных API. Другие приложения должны запросить эти разрешения, чтобы получить доступ к чувствительным API.

  • Управление разрешениями приложений также предоставляет механизм запроса разрешений, который позволяет приложениям запрашивать разрешения, определенные системой или другими приложениями. После успешного запроса разрешений приложения могут получить доступ к чувствительным API, предоставляемым системой или другими приложениями.
  • Управление разрешениями приложений также предоставляет некоторые необходимые функции для пользователей, чтобы облегчить им просмотр и управление состоянием разрешений.Рис. 1 Архитектура управления разрешениями приложений

Управление разрешениями приложений предоставляет функции управления разрешениями для подсистемы программной архитектуры и предоставляет интерфейсы для запроса разрешений и проверки состояния разрешений для верхних приложений. Функции управления разрешениями приложений, представленные в данном открытом исходном коде, применимы к легковесной, малой и стандартной системе.- Легковесная система (mini system) предназначена для процессоров типа MCU, таких как Arm Cortex-M и RISC-V 32-битные устройства, где ресурсы аппаратуры крайне ограничены. Минимальное требование к памяти составляет ≥128 КБ. Она может предоставлять различные легковесные сетевые протоколы, легковесные графические фреймворки и множество компонентов для чтения и записи IOT-шин. Примеры поддерживаемых продуктов включают модули связи для умного дома, сенсорные устройства и носимые устройства.

  • Малая система (small system) предназначена для устройств с процессорами типа Arm Cortex-A, где минимальное требование к памяти составляет ≥1 МБ. Она может предоставлять более высокие возможности безопасности, стандартные графические фреймворки и возможности декодирования и кодирования видео для мультимедиа. Примеры поддерживаемых продуктов включают IP-камеры, электронные глаза, маршрутизаторы для умного дома и видеорегистраторы для умного вождения.## Содержание
/base/security/permission_lite
├── interfaces                         # Слой интерфейсов
│   ├── innerkits                      # Внутренний слой интерфейсов
│   └── kits                           # Внешний слой интерфейсов
└── services                           # Слой сервисов
    ├── ipc_auth                       # IPC-коммуникационная аутентификация
    ├── js_api                         # Упаковка JS API
    ├── pms                            # Логика управления правами и сервисы
    ├── pms_base                       # Регистрация сервисов
    └── pms_client                     # Клиентская часть сервиса управления правами

Использование

Описание интерфейса Управление правами для легких систем и малых систем: В настоящее время доступно только для вызова системными приложениями и службами, конкретные API-интерфейсы приведены ниже:

Интерфейс

Описание

int CheckPermission(int uid, const char *permissionName)

Проверяет, имеет ли процесс приложения с указанным UID разрешение на доступ к 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)

Отзывает указанное разрешение у приложения во время выполнения.

2 ">

Динамически отозвать указанное разрешение приложению во время выполнения

int UpdatePermissionFlags(const char *identifier, const char *permissionName, const int flags)

Обновить флаги указанного разрешения приложения

**Автоматическая проверка прав доступа для легковесных и малых систем IPC-коммуникации**:
Интерфейс Описание
int GetCommunicationStrategy(RegParams params, PolicyTrans **policies, unsigned int *policyNum) В процессе регистрации службы используется для запроса соответствующих политик доступа для вызываемого интерфейса. Используется только Samgr.
int IsCommunicationAllowed(AuthParams params) Проверяет, имеет ли процесс-источник права на вызов интерфейсов процесса-приемника. Используется только Samgr.

Использование

Управление правами доступа для легковесных и малых систем:Использование: В качестве примера рассмотрим разработку управления правами доступа для пакетного менеджера. В процессе разработки необходимо определить чувствительные права доступа и объявить их в файле config.json. При установке приложения пакетный менеджер вызывает интерфейсы компонента управления правами доступа для проверки наличия этих прав. Если права присутствуют, установка продолжается, в противном случае установка завершается неудачей. В процессе разработки, менеджер пакетов явно указывает необходимость установки приложения (ohos.permission.INSTALL_BUNDLE) и объявляет этот пермишен; FA модель: необходимо объявить пермишены в файле config.json, пример: json { "module": { "package": "ohos.demo.kitframework", "deviceType": [ "phone", "tv", "tablet", "car", "smartWatch", "sportsWatch", "smartCamera", "smartVision" ], "reqPermissions": [{ "name": "ohos.permission.INSTALL_BUNDLE", "reason": "установка пакета", "usedScene": { "ability": [ "KitFramework" ], "when": "always" } }, { "name": "ohos.permission.LISTEN_BUNDLE_CHANGE", "reason": "установка пакета", "usedScene": { "ability": [ "KitFramework" ], "when": "always" } }, { "name": "ohos.permission.GET_BUNDLE_INFO", "reason": "установка пакета", "usedScene": { "ability": [ "KitFramework" ], "when": "always" } } ] } } Stage модель: необходимо объявить пермишены в файле module.json5, пример: ```json {

     "module": {
        "requestPermissions": [{
          "name": "ohos. permission. INSTALL_BUNDLE",
          "reason": "установка пакета",
          "usedScene": {
            "ability": [
              "KitFramework"
            ],
            "when": "always"
          }
        },
        {
          "name": "ohos. permission. LISTEN_BUNDLE_CHANGE",
          "reason": "установка пакета",
          "usedScene": {
            "ability": [
              "KitFramework"
            ],
            "when": "always"
          }
        },
        {
          "name": "ohos. permission. GET_BUNDLE_INFO",
          "reason": "установка пакета",
          "usedScene": {
            "ability": [
              "KitFramework"
            ],
            "when": "always"
          }
        }]
      }
    }
    ```2. Когда пакетный менеджер разрабатывает интерфейсы для установки приложений, он вызывает соответствующие интерфейсы управления правами для проверки наличия прав на установку приложений. Например, он вызывает интерфейс CheckPermission с именем права "ohos. permission. INSTALL_BUNDLE" в качестве параметра для проверки наличия прав на установку пакетного менеджера. Если права есть, процесс установки продолжается, в противном случае возвращается сообщение об ошибке установки.    ```c++
    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-сервиса, использующего метод IPC-коммуникаций. Здесь BMS регистрируется в Samgr как сервис bundlems, а открытые интерфейсы регистрируются как BmsFeature.

1. В файле policy_preset.h, расположенном в заголовках базовых файлов безопасности в директории base/security/permission_lite/services/ipc_auth/include, настраиваются соответствующие политики доступа. Основные типы политик доступа:

    (1) Тип RANGE: разрешает доступ для процессов с определенным диапазоном UID, требуется указать uidMin и uidMax;

    (2) Тип FIXED: разрешает доступ для процессов с определенными UID, требуется указать fixedUid, максимум 8 значений;    (3) Тип BUNDLENAME: разрешает доступ только для определенных приложений, требуется указать bundleName (имя пакета).

    ```c++
    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,
                },
            }
        },
    };
    ```

2. Добавьте политику для функции Feature, определенной в шаге 1, в глобальную политику, указав количество функций:

    ```c++
    static PolicySetting g_presetPolicies[] = {
        {"permissionms", pmsFeature, 1},
        {"abilityms", amsFeature, 2},
        {"bundlems", bmsFeature, 2},  // Функция BMS, определенная в шаге 1, количество функций равно 2
        {"dtbschedsrv", dmsFeature, 1},
        {"samgr", samgrFeature, 1},
        {"appspawn", appspawnFeature, 1},
        {"WMS", wmsFeature, 1},
        {"bundle_daemon", bdsFeature, 1},
    };
    ```

3. Зарегистрируйте BmsFeature, определенную в шаге 1, в Samgr:    ```c++
    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 функция запущена успешно");
    }
    APP_FEATURE_INIT(Init);
    ```После выполнения вышеуказанных разработочных шагов, при регистрации службы в Samgr, Samgr будет использовать интерфейс GetCommunicationStrategy компонента IPC-коммуникационной аутентификации для получения политики доступа к службе. Когда другие службы или приложения обращаются к этим службам посредством IPC, Samgr будет использовать интерфейс IsCommunicationAllowed компонента IPC-коммуникационной аутентификации для проверки разрешений службы вызывающего. Если разрешения соответствуют политике доступа, вызывающая служба сможет получить доступ к интерфейсу разработчика, в противном случае доступ будет отклонён.

## Связанные репозитории<a name="section1371113476307"></a>
Подсистема безопасности
**[security_permission_lite](https://gitee.com/openharmony/security_permission_lite/blob/master/README_zh.md)**

Опубликовать ( 0 )

Вы можете оставить комментарий после Вход в систему

1
https://api.gitlife.ru/oschina-mirror/openharmony-security_permission_lite.git
git@api.gitlife.ru:oschina-mirror/openharmony-security_permission_lite.git
oschina-mirror
openharmony-security_permission_lite
openharmony-security_permission_lite
master