หน้านี้จะอธิบายวิธีเปิดใช้ MACsec สำหรับฟีเจอร์อีเทอร์เน็ต
ใช้ MACsec เพื่อตรวจสอบสิทธิ์และเข้ารหัสการสื่อสารผ่านอีเทอร์เน็ตที่ใช้โดยระบบสาระบันเทิงภายในรถ (IVI) สำหรับ ECU แต่ละหน่วย ซึ่งจะปกป้องข้อมูลจากการดัดแปลง การบันทึกซ้ำ หรือการเปิดเผยข้อมูล โดยเปิดใช้ MACsec IEEE 802.11AE สำหรับเครือข่ายอีเทอร์เน็ต
ภาพรวม
หากต้องการเปิดใช้ MACsec ระบบจะใช้ wpa_supplicant เป็นเดรัมสำหรับจัดการแฮนด์เชคข้อตกลงเกี่ยวกับคีย์ MACsec (MKA) HAL ของ MACsec ได้รับการกําหนดไว้สําหรับจัดเก็บคีย์ MACsec ที่แชร์ไว้ล่วงหน้า ซึ่งเรียกว่าคีย์การเชื่อมโยงการเชื่อมต่อ (CAK) อย่างปลอดภัย HAL ของ MACsecรองรับเฉพาะ CAK HAL ของ MACsec สำหรับผู้ให้บริการรายนี้จะจัดเก็บ CAK อย่างปลอดภัยในพื้นที่เก็บข้อมูลที่ป้องกันการแทรกแซง การจัดสรรคีย์จะขึ้นอยู่กับการใช้งานของผู้ให้บริการ
โฟลว์ MACsec
รูปที่ 1 แสดงขั้นตอนการเข้ารหัส MACsec บนเครื่องเล่นวิทยุ
เปิดใช้ MACsec
หากต้องการรองรับฟังก์ชันการทำงานด้วยคีย์ CAK ของ MACsec คุณต้องเปิดใช้ MACsec สำหรับอีเทอร์เน็ตอย่างชัดเจนด้วย HAL ของ MACsec สำหรับผู้ให้บริการโดยเฉพาะ
หากต้องการเปิดใช้ฟีเจอร์นี้ ให้เปิดใช้ wpa_supplicant_macsec และ macsec-service เฉพาะของผู้ให้บริการเป็น PRODUCT_PACKAGES และไฟล์การกําหนดค่าสําหรับ wpa_supplicant_macsec ให้เปลี่ยนสคริปต์ init rc เป็น PRODUCT_COPY_FILES
เช่น ไฟล์ [device-product].mk นี้
# MACSEC HAL
# This is a mock MACsec HAL implementation with keys embedded in it. Replace with vendor specific HAL
PRODUCT_PACKAGES += android.hardware.automotive.macsec-service
# wpa_supplicant build with MACsec support
PRODUCT_PACKAGES += wpa_supplicant_macsec
# configuration file for wpa_supplicant with MACsec
PRODUCT_COPY_FILES += \
$(LOCAL_PATH)/wpa_supplicant_macsec.conf:$(TARGET_COPY_OUT_VENDOR)/etc/wpa_supplicant_macsec.conf \
$(LOCAL_PATH)/wpa_supplicant_macsec.rc:$(TARGET_COPY_OUT_VENDOR)/etc/init/wpa_supplicant_macsec.rc
เช่น wpa_supplicant_macsec.conf
# wpa_supplicant_macsec.conf
eapol_version=3
ap_scan=0
fast_reauth=1
# Example configuration for MACsec with preshared key
# mka_cak is not actual key but index for MACsec HAL to specify which key to use
# and make_cak must be either 16 digits or 32 digits depends the actually CAK key length.
network={
key_mgmt=NONE
eapol_flags=0
macsec_policy=1
macsec_replay_protect=1
macsec_replay_window=0
mka_cak=00000000000000000000000000000001
mka_ckn=31323334
mka_priority=128
}
ตัวอย่าง wpa_supplicant_macsec.conf ใน eth0 เมื่ออินเทอร์เฟซเครือข่ายหลายรายการต้องได้รับการปกป้องโดย MACsec คุณจะเริ่มต้นบริการหลายรายการได้
# wpa_supplicant_macsec.rc
service wpa_supplicant_macsec /vendor/bin/hw/wpa_supplicant_macsec \
-dd -i eth0 -Dmacsec_linux -c /vendor/etc/wpa_supplicant_macsec.conf
oneshot
เริ่ม wpa_supplicant_macsec หลังจากที่อินเทอร์เฟซอีเทอร์เน็ตพร้อมใช้งาน หากอีเทอร์เน็ตของระบบยังไม่พร้อม wpa_supplicant จะแสดงข้อผิดพลาดทันที
คุณอาจต้องรอ (ระยะหมดเวลาเริ่มต้นคือ 5 วินาที) /sys//class/net/${eth_interface} เพื่อหลีกเลี่ยงเงื่อนไขการแข่งขัน
# init.target.rc
on late-fs
…
wait /sys/class/net/eth0
start wpa_supplicant_macsec
…
กำหนดค่าที่อยู่ IP สำหรับอินเทอร์เฟซ MACsec
ผู้จัดการการเชื่อมต่อของระบบจะกำหนดค่าที่อยู่ IP ของอินเทอร์เฟซ MACsec ได้เมื่อ zygote เริ่มทำงาน ต่อไปนี้คือตัวอย่างไฟล์ XML การวางซ้อนสําหรับการเชื่อมต่อ หากที่อยู่ IP สำหรับอินเทอร์เฟซ MACsec ต้องพร้อมใช้งานก่อน zygote จะเริ่มทำงาน โปรแกรมเดรัมเฉพาะของผู้ให้บริการจะต้องรอฟังอินเทอร์เฟซ macsec0 และกำหนดค่าแทน เนื่องจากตัวจัดการการเชื่อมต่อของระบบจะเริ่มทำงานหลังจากที่ zygote เริ่มทำงานเท่านั้น
# Example of com.google.android.connectivity.resources overlay config
<?xml version="1.0" encoding="utf-8"?>
<!-- Resources to configure the connectivity module based on each OEM's preference. -->
<resources xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
<!-- Whether the internal vehicle network should remain active even when no
apps requested it. -->
<bool name="config_vehicleInternalNetworkAlwaysRequested">true</bool>
<string-array translatable="false" name="config_ethernet_interfaces">
<!-- Not metered, trusted, not vpn, vehicle, not vcn managed, restricted -->
<item>macsec0;11,14,15,27,28;ip=10.10.10.2/24 gateway=10.10.10.1 dns=4.4.4.4,8.8.8.8</item>
</string-array>
<string translatable="false" name="config_ethernet_iface_regex">macsec\\d</string>
</resources>
HAL ของ MACsec
HAL สำหรับ MACsec เฉพาะผู้ให้บริการต้องใช้งานฟังก์ชันต่อไปนี้เพื่อปกป้องคีย์ CAK
การเข้ารหัสและการถอดรหัสทั้งหมดด้วยคีย์จะดำเนินการโดยตรงโดยไม่ต้องเปิดเผยคีย์ให้ wpa_supplicant
/**
* MACSEC pre-shared key plugin for wpa_applicant
*
* The goal of this service is to provide function for using the MACSEC CAK
*
*/
@VintfStability
interface IMacsecPSKPlugin {
/**
* For xTS test only, not called in production
*
* @param keyId is key id to add
* @param CAK, CAK key to set
* @param CKN, CKN to set
*
* @return ICV.
*/
void addTestKey(in byte[] keyId, in byte[] CAK, in byte[] CKN);
/**
* Use ICV key do AES CMAC same as ieee802_1x_icv_aes_cmac in wpa_supplicant
*
* @param keyId is key id to be used for AES CMAC
* @param data
*
* @return ICV.
*/
byte[] calcICV(in byte[] keyId, in byte[] data);
/**
* KDF with CAK key to generate SAK key same as ieee802_1x_sak_aes_cmac in wpa_supplicant
*
* @param keyId is key id to be used for KDF
* @param seed is key seed (random number)
* @param sakLength generated SAK length (16 or 32)
*
* @return SAK key.
*/
byte[] generateSAK(in byte[] keyId, in byte[] data, in int sakLength);
/**
* Encrypt using KEK key, this is same as aes_wrap with kek.key in wpa_supplicant
* which used to wrap a SAK key
*
* @param keyId is key id to be used for encryption
* @param sak is SAK key (16 or 32 bytes) to be wrapped.
*
* @return wrapped data using KEK key.
*/
byte[] wrapSAK(in byte[] keyId, in byte[] sak);
/**
* Decrypt using KEK key, this is same as aes_unwrap with kek.key in wpa_supplicant
* which used to unwrap a SAK key
*
* @param keyId is key id to be used for decryption
* @param sak is wrapped SAK key.
*
* @return unwrapped data using KEK key.
*/
byte[] unwrapSAK(in byte[] keyId, in byte[] sak);
}
การใช้งานอ้างอิง
การใช้งานอ้างอิงมีอยู่ใน hardware/interfaces/macsec/aidl/default ซึ่งให้บริการการใช้งานซอฟต์แวร์ HAL ที่มีคีย์ฝังอยู่ภายใน การใช้งานนี้ให้ข้อมูลอ้างอิงฟังก์ชันการทำงานแก่ HAL เท่านั้น เนื่องจากไม่มีพื้นที่เก็บข้อมูลที่ป้องกันการแทรกแซง
ทดสอบ HAL ของ MACsec
การทดสอบ HAL ของ MACsec มีให้ใน
hardware/interfaces/automotive/macsec/aidl/vts/functional
วิธีทำการทดสอบ
$ atest VtsHalMacsecPskPluginV1Test
ซึ่งจะเรียก addTestKey-- เพื่อแทรกคีย์ทดสอบลงใน HAL และตรวจสอบกับค่าที่คาดไว้สำหรับ calcIcv, generateSak, wrapSak และ unwrapSak
หากต้องการยืนยันว่า MACsec ทํางานอยู่ ให้ทำการทดสอบการผสานรวมโดย ping ระหว่างเครื่อง 2 เครื่องในอินเทอร์เฟซ MACsec โดยทำดังนี้
# ping -I macsec0 10.10.10.1
หากต้องการทดสอบ Cuttlefish กับโฮสต์ คุณต้องใช้ echo 8 > /sys/devices/virtual/net/cvd-ebr/bridge/group_fwd_mask ในโฮสต์เพื่ออนุญาตให้ส่งผ่านเฟรม LLDP ที่จําเป็นสําหรับ MACsec