在Android环境集成企业版或旗舰版SOC

SOC是一个端到端的服务,为RTOS、Linux、Android操作系统的物联网终端提供安全审计。本文介绍了如何在Android系统中集成企业版或旗舰版SOC。

前提条件

已通过IoT安全中心获取企业版或旗舰版SOC SDK

说明

企业版或旗舰版SOC SDK包含:安全运营管理-SOC(企业版)、安全运营管理-SOC(旗舰版),以下简称:SOC SDK。

SOC SDK Native集成

步骤一:集成SOC SDK到Android ROM编译环境

  1. 将下载好的SOC SDK保存到具有Android设备源代码及编译环境的计算机上,并解压缩到任意目录。

  2. 将dps_sdk目录复制到$ANDROID_SOURCE_HOME/external目录下。

  3. 在目标产品的Android makefile当中配置编译dps_sdk包,在device.mk(或对等功能的文件)当中加入以下代码:

    # build dps_sdk
    $(call inherit-product-if-exists,external/dps_sdk/dps_sdk.mk)
  4. 打开编辑$ANDROID_SOURCE_HOME/external/dps_sdk/dps_sdk.mk文件,编译内容如下:

    PRODUCT_PACKAGES += \
        dps_domain \
        dps_services \
        dps_pro \
        dps_extras \
        itls_client \

    编译内容

    是否必选

    描述

    dps_domain

    提供基础文件系统取证、进程分析、完整性检查功能,需要默认开启。

    dps_services

    dps_pro

    属于高阶功能,可提供进程行为、网络行为分析、漏洞修复等功能,建议开启,但开启后需要对Android系统上运行的APP做一些覆盖兼容性测试。

    dps_extra

    属于增强型工具,如果需要使用安全沙箱、安全控制台、安全网络扫描组件,请按需包含。

    itls_client

    为SOC增强型上云连接通道,基于 ID² 和 TEE CAP 鉴权上云,如果需要请包含,并参考“接入公有云物联网安全中心”中的“方法一”进行适当配置。

步骤二:编译前配置

  1. 用户可以在$ANDROID_SOURCE_HOME/external/dps_sdk/packages/configure.ini当中进行服务参数的配置,请参见configure.ini配置

    说明

    一般而言这个配置文件在SDK输出时已经配置好,ISV用户仅需要审核和微调,微调部分如下:在Android产品当中,往往会采用一个property属性来保存产品固件的版本号,每当产品进行OTA或者有线烧录的时候,这个版本号都会发生变化。请根据您的产品当中具体的这个属性值,对$ANDROID_SOURCE_HOME/external/dps_sdk/packages/configure.ini当中的MANAGED_VERSION进行仿写配置即可。

  2. SOC SDK为Android 7.0以上版本提供了支持原生AOSP的SELinux和Seccomp安全策略,请在开始编译产品镜像之前,确认SELinux和Seccomp policy被加入到Android源代码当中($DPS_SDK指代DPS SDK目录):

    • 找到对应的Android版本的SEPolicy目录,将$DPS_SDK/policy/sepolicy/dps_file_contexts当中的内容复制并粘贴到file_contexts文本最末尾。

    • 找到对应的Android版本的SEPolicy目录,将$DPS_SDK/policy/sepolicy/dps_android_X.te拷贝至该目录并重命名为dps.te。其中X代表Android版本对应字母号。

    • 找到Android源代码的frameworks/av/services/mediacodec/minijail/seccomp_policy目录,将$DPS_SDK/policy/seccomp_policy/dps_mediacodec-seccomp-arm.policy当中的内容复制并粘贴到mediacodec-seccomp-arm.policy文件末尾。

    • 找到Android源代码的frameworks/av/services/mediaextractor/minijail/seccomp_policy目录,将$DPS_SDK/policy/seccomp_policy/dps_mediaextractor-seccomp-arm.policy当中的内容复制并粘贴到mediaextractor-seccomp-arm.policy文件末尾。再将$DPS_SDK/policy/seccomp_policy/dps_mediaextractor-seccomp-x86.policy当中的内容复制并粘贴到mediaextractor-seccomp-x86.policy文件末尾。

    说明

    在Android 8以上的版本中,需要额外配置vendor的SEPolicy,一个vendor相关的定制 SEPolicy,范例请参考:policy/sepolicy/vendor/dps_android_o_bullhead.te

步骤三:SELinux调试

没有启用SELinux的设备可以跳过这一步。

在启用了SELinux的Android设备上必须要完成这一步调试,请参见Android SELinux策略开发

步骤四:(可选)内核安全增强

非必选步骤,针对内核审计相关强安全需求的用户,请参见Linux 内核功能依赖参考

步骤五:确认集成是否成功

  1. 开发阶段请务必将SELinux置为permissive模式,具体方法为在产品的BoardConfig.mk文件里加入一行如下命令:

    BOARD_KERNEL_CMDLINE += androidboot.selinux=permissive
  2. 完成上述的步骤之后,就可以按照通常设备ROM编译的方式进行编译了。编译结束之后通过几个checklist来确保SOC SDK成功集成到了设备ROM:

    1. 在编译工作机上,进入$ANDROID_SOURCE_HOME/out/target/<your_product>/目录。

    2. 确认system/bin/logd不存在。

    3. 确认system/bin/linker64以及system/bin/linker形成符号链接,指向./dps/bin/linker64和./dps/bin/linker。

    4. 确认system/bin/目录下具有dps文件夹,即/system/bin/dps存在,其中具有bin,lib(64),etc三个文件夹。

    5. 确认system/etc/init目录下存在dps.rc文件。

    6. 确认system/etc/seccomp_policy当中几个.policy文件以及/vendor/etc/seccomp_policy当中的几个.policy文件中含有DPS指定的syscall白单。

  3. 完成上述确认之后尝试刷机,并且进行开机check list:

    • 可以正常启动到launcher,adb功能以及logcat功能正常。

    • adb shell进入系统,通过ps命令,确认三个进程dpsd、logd、sagent均稳定运行(1分钟以内进程号不变)。

接入公有云物联网安全中心

SOC SDK需要和阿里云物联网平台服务端之间建立一个安全的MQTT连接,才能正常工作,因此,我们需要将它接入阿里云物联网平台。

下面介绍常用的两种接入阿里云物联网的方式,在集成过程中,只需要根据实际需求选中其中一种方式即可。

  • 方法一:推荐用于没有集成TEE-PRO的Android设备。

  • 方法二:推荐用于已经集成了TEE-PRO的Android设备。

方法一:复用ID2+TEE-CAP建立的iTLS上云通道

在目标设备Android系统当中,如果事先没有集成TEE-PRO,则可以通过APP+Linkkit SDK+ID2+TEE CAP建立iTLS上云通道,同时这个通道也可以给SOC复用。我们推荐您使用这种方式让SOC SDK连入阿里云物联网,通过ID2认证的MQTT over iTLS通道可以让你的数据传输更加安全。

整体的数据链路通道如下图所示:整体的数据链路通道具体操作步骤如下:

  1. $ANDROID_SOURCE_HOME/external/dps_sdk/dps_sdk.mk文件中确认启用了itls_client选项。

  2. 使用PC浏览器打开阿里云物联网平台控制台

  3. 进入控制台之后单击对应的实例,在左侧导航栏,选择设备管理 > 产品,单击创建产品

    注意

    认证方式必须选择ID²。

  4. 创建成功后,进入产品详情页面,单击上方Product Secret右侧的查看按钮,获取产品证书信息。

    说明

    请妥善保管产品证书信息,对应ProductKey和ProductSecret在后续步骤中会使用。

  5. 在Android Studio导入的SDK包中找到$ANDROID_SOURCE_HOME/external/dps_sdk/client/example/itls_client应用程序工程,选择res/raw/deviceinfo文件,将ProductKey和ProductSecret填入相应的字段。测试阶段可以在这里填写每个设备的唯一标识到deviceName字段。

    {
        "productKey": "<your_product_key>",
        "deviceName": "<unique_id_of_device>",
        "productSecret": "<your_product_secret>",
        "deviceSecret": "itls_secret",
        "subDevice": [
          {
              "productKey": "",
              "deviceName": ""
          },
          {
            "productKey": "",
            "deviceName": ""
        }
      ]
    }
  6. 完成之后编译运行这个APP,可使用自签证书对其进行签名,并输入打包好的apk文件,命名为itls_client.apk,复制到dps_sdk/client/prebuilt/itls_client.apk

  7. 重新编译系统镜象,此时这个itls_client.apk会被预装到目标设设备,开机自启动且在有网络连接的时候自动接入阿里云物联网平台。

说明

安全开发实践建议:

  • 上述的ProductKey和ProductSecret是产品账号的私密信息,建议不要明文配置到deviceinfo,而是通过nvram烧录等方式配置到ROM,并在APP当中通过接口获取。

  • 上述的deviceName由于当前产品的每个出货的设备个体都需要做到不相同且唯一,因此建议您根据自身设备ID对这个字段进行配置和获取(譬如使用IMEI,MAC或者烧录到nvram的设备ID等)。

  • 请对上述APP进行改造,确保系统开机之后自动启动(注册BOOT_COMPLETED broadcast receiver),以及网络切换之后重新激活。

  • 其它隐藏APP界面,launcher图标等您可自行决定处理。

方法二:自定义客户端接入上云

如果希望自定义客户端接入时,可使用SOC提供的客户端示例代码,自行修改后完成客户端上云。

客户端示例代码可参考SDK的client目录。您也可以独立编译,编译步骤如下:

  1. 请在dps_sdk.mk的PRODUCT_PACKAGES列表中添加cloud_agent_example项。

  2. 请自行在Android init.rc文件中启动客户端服务。并在SDK的packages/service.ini文件当中注释掉start sagent项目。

  3. 按照正常方式编译设备镜像,cloud_agent_example会被编译至镜像的/system/bin/目录下。

确认集成已成功

上述两种方法,无论采用哪一种,在配置完成,设备上线之后,即可在物联网平台控制台设备管理 > 设备以及物联网安全中心接入管理 > 直连设备 > 设备列表页面看到设备接入条目。

在物联网安全运营中心管理控制台中对此设备进行取证操作,稍置约5分钟后,界面提示若取证通过,即表明集成成功。