在Android環(huán)境集成企業(yè)版或旗艦版SOC
SOC是一個端到端的服務(wù),為RTOS、Linux、Android操作系統(tǒng)的物聯(lián)網(wǎng)終端提供安全審計。本文介紹了如何在Android系統(tǒng)中集成企業(yè)版或旗艦版SOC。
前提條件
已通過IoT安全中心獲取企業(yè)版或旗艦版SOC SDK。也可以單擊下載SOC for Android SDK。
安全運營管理-SOC(企業(yè)版)、安全運營管理-SOC(旗艦版),以下簡稱:SOC SDK。
SOC SDK Native集成
步驟一:集成SOC SDK到Android ROM編譯環(huán)境
將下載好的SOC SDK保存到具有Android設(shè)備源代碼及編譯環(huán)境的計算機上,并解壓縮到任一目錄。
將dps_sdk目錄復(fù)制到
$ANDROID_SOURCE_HOME/external
目錄下。在目標產(chǎn)品的Android makefile當中配置編譯dps_sdk包,在device.mk(或?qū)Φ裙δ艿奈募┊斨屑尤胍韵麓a:
# build dps_sdk $(call inherit-product-if-exists,external/dps_sdk/dps_sdk.mk)
打開編輯
$ANDROID_SOURCE_HOME/external/dps_sdk/dps_sdk.mk
文件,編譯內(nèi)容如下:PRODUCT_PACKAGES += \ dps_domain \ dps_services \ dps_pro \ dps_extras \ itls_client \
編譯內(nèi)容
是否必選
描述
dps_domain
是
提供基礎(chǔ)文件系統(tǒng)取證、進程分析、完整性檢查功能,需要默認開啟。
dps_services
是
dps_pro
否
屬于高階功能,可提供進程行為、網(wǎng)絡(luò)行為分析、漏洞修復(fù)等功能,建議開啟,但開啟后需要對Android系統(tǒng)上運行的APP做一些覆蓋兼容性測試。
dps_extra
否
屬于增強型工具,如果需要使用安全沙箱、安全控制臺、安全網(wǎng)絡(luò)掃描組件,請按需包含。
itls_client
否
為SOC增強型上云連接通道,基于 ID2 和 TEE CAP 鑒權(quán)上云,如果需要請包含,并參考“接入公有云物聯(lián)網(wǎng)安全中心”中的“方法一”進行適當配置。
步驟二:編譯前配置
用戶可以在
$ANDROID_SOURCE_HOME/external/dps_sdk/packages/configure.ini
當中進行服務(wù)參數(shù)的配置,請參見configure.ini配置。說明一般而言這個配置文件在SDK輸出時已經(jīng)配置好,ISV用戶僅需要審核和微調(diào),微調(diào)部分如下:在Android產(chǎn)品當中,往往會采用一個property屬性來保存產(chǎn)品固件的版本號,每當產(chǎn)品進行OTA或者有線燒錄的時候,這個版本號都會發(fā)生變化。請根據(jù)您的產(chǎn)品當中具體的這個屬性值,對
$ANDROID_SOURCE_HOME/external/dps_sdk/packages/configure.ini
當中的MANAGED_VERSION進行仿寫配置即可。SOC SDK為Android 7.0以上版本提供了支持原生AOSP的SELinux和Seccomp安全策略,請在開始編譯產(chǎn)品鏡像之前,確認SELinux和Seccomp policy被加入到Android源代碼當中($DPS_SDK指代DPS SDK目錄):
找到對應(yīng)的Android版本的SEPolicy目錄,將
$DPS_SDK/policy/sepolicy/dps_file_contexts當中的內(nèi)容復(fù)制并粘貼到file_contexts
文本最末尾。找到對應(yīng)的Android版本的SEPolicy目錄,將
$DPS_SDK/policy/sepolicy/dps_android_X.te
拷貝至該目錄并重命名為dps.te。其中X代表Android版本對應(yīng)字母號。找到Android源代碼的
frameworks/av/services/mediacodec/minijail/seccomp_policy
目錄,將$DPS_SDK/policy/seccomp_policy/dps_mediacodec-seccomp-arm.policy
當中的內(nèi)容復(fù)制并粘貼到mediacodec-seccomp-arm.policy
文件末尾。找到Android源代碼的
frameworks/av/services/mediaextractor/minijail/seccomp_policy
目錄,將$DPS_SDK/policy/seccomp_policy/dps_mediaextractor-seccomp-arm.policy
當中的內(nèi)容復(fù)制并粘貼到mediaextractor-seccomp-arm.policy
文件末尾。再將$DPS_SDK/policy/seccomp_policy/dps_mediaextractor-seccomp-x86.policy
當中的內(nèi)容復(fù)制并粘貼到mediaextractor-seccomp-x86.policy
文件末尾。
說明在Android 8以上的版本中,需要額外配置vendor的SEPolicy,一個vendor相關(guān)的定制 SEPolicy,范例請參考:
policy/sepolicy/vendor/dps_android_o_bullhead.te
。
步驟三:SELinux調(diào)試
沒有啟用SELinux的設(shè)備可以跳過這一步。
在啟用了SELinux的Android設(shè)備上必須要完成這一步調(diào)試,請參見Android SELinux策略開發(fā)。
步驟四:(可選)內(nèi)核安全增強
非必選步驟,針對內(nèi)核審計相關(guān)強安全需求的用戶,請參見Linux 內(nèi)核功能依賴參考。
步驟五:確認集成是否成功
開發(fā)階段請務(wù)必將SELinux置為permissive模式,具體方法為在產(chǎn)品的BoardConfig.mk文件里加入一行如下命令:
BOARD_KERNEL_CMDLINE += androidboot.selinux=permissive
完成上述的步驟之后,就可以按照通常設(shè)備ROM編譯的方式進行編譯了。編譯結(jié)束之后通過幾個checklist來確保SOC SDK成功集成到了設(shè)備ROM:
在編譯工作機上,進入
$ANDROID_SOURCE_HOME/out/target/<your_product>/
目錄。確認system/bin/logd不存在。
確認system/bin/linker64以及system/bin/linker形成符號鏈接,指向./dps/bin/linker64和./dps/bin/linker。
確認system/bin/目錄下具有dps文件夾,即/system/bin/dps存在,其中具有bin,lib(64),etc三個文件夾。
確認system/etc/init目錄下存在dps.rc文件。
確認system/etc/seccomp_policy當中幾個.policy文件以及/vendor/etc/seccomp_policy當中的幾個.policy文件中含有DPS指定的syscall白單。
完成上述確認之后嘗試刷機,并且進行開機check list:
可以正常啟動到launcher,adb功能以及l(fā)ogcat功能正常。
adb shell進入系統(tǒng),通過ps命令,確認三個進程dpsd、logd、sagent均穩(wěn)定運行(1分鐘以內(nèi)進程號不變)。
接入公有云物聯(lián)網(wǎng)安全中心
SOC SDK需要和阿里云物聯(lián)網(wǎng)平臺服務(wù)端之間建立一個安全的MQTT連接,才能正常工作,因此,我們需要將它接入阿里云物聯(lián)網(wǎng)平臺。
下面介紹常用的兩種接入阿里云物聯(lián)網(wǎng)的方式,在集成過程中,只需要根據(jù)實際需求選中其中一種方式即可。
方法一:推薦用于沒有集成TEE-PRO的Android設(shè)備。
方法二:推薦用于已經(jīng)集成了TEE-PRO的Android設(shè)備。
方法一:復(fù)用ID2+TEE-CAP建立的iTLS上云通道
在目標設(shè)備Android系統(tǒng)當中,如果事先沒有集成TEE-PRO,則可以通過APP+Linkkit SDK+ID2+TEE CAP建立iTLS上云通道,同時這個通道也可以給SOC復(fù)用。我們推薦您使用這種方式讓SOC SDK連入阿里云物聯(lián)網(wǎng),通過ID2認證的MQTT over iTLS通道可以讓你的數(shù)據(jù)傳輸更加安全。
整體的數(shù)據(jù)鏈路通道如下圖所示:具體操作步驟如下:
在
$ANDROID_SOURCE_HOME/external/dps_sdk/dps_sdk.mk
文件中確認啟用了itls_client選項。使用PC瀏覽器打開阿里云物聯(lián)網(wǎng)平臺控制臺。
進入控制臺之后單擊對應(yīng)的實例,在左側(cè)導(dǎo)航欄,選擇設(shè)備管理 > 產(chǎn)品,單擊創(chuàng)建產(chǎn)品。
重要認證方式必須選擇ID2。
創(chuàng)建成功后,進入產(chǎn)品詳情頁面,單擊上方Product Secret右側(cè)的查看按鈕,獲取產(chǎn)品證書信息。
說明請妥善保管產(chǎn)品證書信息,對應(yīng)ProductKey和ProductSecret在后續(xù)步驟中會使用。
在Android Studio導(dǎo)入的SDK包中找到
$ANDROID_SOURCE_HOME/external/dps_sdk/client/example/itls_client
應(yīng)用程序工程,選擇res/raw/deviceinfo文件,請將ProductKey和ProductSecret填入相應(yīng)的字段。測試階段可以在這里填寫每個設(shè)備的身份標識到deviceName字段。{ "productKey": "<your_product_key>", "deviceName": "<unique_id_of_device>", "productSecret": "<your_product_secret>", "deviceSecret": "itls_secret", "subDevice": [ { "productKey": "", "deviceName": "" }, { "productKey": "", "deviceName": "" } ] }
完成之后編譯運行這個APP,可使用自簽證書對其進行簽名,并輸入打包好的apk文件,命名為itls_client.apk,復(fù)制到
dps_sdk/client/prebuilt/itls_client.apk
。重新編譯系統(tǒng)鏡象,此時這個itls_client.apk會被預(yù)裝到目標設(shè)設(shè)備,開機自啟動且在有網(wǎng)絡(luò)連接的時候自動接入阿里云物聯(lián)網(wǎng)平臺。
安全開發(fā)實踐建議:
上述的ProductKey和ProductSecret是產(chǎn)品賬號的私密信息,建議不要明文配置到deviceinfo,而是通過nvram燒錄等方式配置到ROM,并在APP當中通過接口獲取。
上述的deviceName由于當前產(chǎn)品的每個出貨的設(shè)備個體都需要做到不相同,因此建議您根據(jù)自身設(shè)備ID對這個字段進行配置和獲取(譬如使用IMEI,MAC或者燒錄到nvram的設(shè)備ID等)。
請對上述APP進行改造,確保系統(tǒng)開機之后自動啟動(注冊BOOT_COMPLETED broadcast receiver),以及網(wǎng)絡(luò)切換之后重新激活。
其它隱藏APP界面,launcher圖標等您可自行決定處理。
方法二:自定義客戶端接入上云
如果希望自定義客戶端接入時,可使用SOC提供的客戶端示例代碼,自行修改后完成客戶端上云。
客戶端示例代碼可參考SDK的client目錄。您也可以獨立編譯,編譯步驟如下:
請在dps_sdk.mk的PRODUCT_PACKAGES列表中添加cloud_agent_example項。
請自行在Android init.rc文件中啟動客戶端服務(wù)。并在SDK的packages/service.ini文件當中注釋掉start sagent項目。
按照正常方式編譯設(shè)備鏡像,cloud_agent_example會被編譯至鏡像的/system/bin/目錄下。
確認集成已成功
上述兩種方法,無論采用哪一種,在配置完成,設(shè)備上線之后,即可在物聯(lián)網(wǎng)平臺控制臺設(shè)備管理 > 設(shè)備以及物聯(lián)網(wǎng)安全中心接入管理 > 直連設(shè)備 > 設(shè)備列表頁面看到設(shè)備接入條目。
在物聯(lián)網(wǎng)安全運營中心管理控制臺中對此設(shè)備進行取證操作,稍置約5分鐘后,界面提示若取證通過,即表明集成成功。