หน้านี้อธิบายวิธีเปิดใช้ MACsec สำหรับฟีเจอร์อีเทอร์เน็ต
ใช้ MACsec เพื่อตรวจสอบสิทธิ์และเข้ารหัสอีเทอร์เน็ต การสื่อสารที่ใช้โดยระบบสาระบันเทิงในยานพาหนะ (IVI) สำหรับหน่วย ECU ที่แตกต่างกัน ข้อมูลจากการปลอมแปลง เล่นซ้ำ หรือการเปิดเผยข้อมูล เปิดใช้การซื้อนี้ไหม MACsec IEEE 802.11AE สำหรับเครือข่ายอีเทอร์เน็ต
ภาพรวม
ในการเปิดใช้ MACsec จะใช้ wpa_supplicant
เป็น Daemon สำหรับจัดการกับ
ข้อตกลงคีย์ MACsec Key (MKA) MACsec HAL มีไว้เพื่อจัดเก็บ MACsec
คีย์ที่แชร์ล่วงหน้าซึ่งเรียกว่าคีย์การเชื่อมโยงการเชื่อมต่อ (CAK) อย่างปลอดภัย MACsec HAL
รองรับเฉพาะ CAK MACsec HAL ของผู้ให้บริการแต่ละรายนี้จัดเก็บ CAK ไว้อย่างปลอดภัยในการงัดแงะ
พื้นที่เก็บข้อมูลที่ไม่อีกด้วย โดยการจัดสรรคีย์จะขึ้นอยู่กับการใช้งานของผู้ให้บริการ
โฟลว์ MACsec
รูปที่ 1 แสดงการไหลของ MACsec บนเครื่องเล่นวิทยุ
เปิดใช้ MACsec
หากต้องการรองรับฟังก์ชันการทำงานที่มีคีย์ MACsec CAK นั้น MACsec สำหรับอีเทอร์เน็ตต้อง ด้วย MACsec HAL ของผู้ให้บริการโดยตรง
หากต้องการเปิดใช้ฟีเจอร์ ให้เปิดใช้ 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 จะเริ่มต้น ซึ่งเป็นข้อมูลเฉพาะผู้ให้บริการ Daemon จะต้องฟังอินเทอร์เฟซ macsec0 และกำหนดค่าแทนเนื่องจาก เครื่องมือจัดการการเชื่อมต่อของระบบจะเริ่มทำงานหลังจากไซโกตเริ่มทำงานเท่านั้น
# 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 เนื่องจากคีย์ไม่ได้สนับสนุนพื้นที่เก็บข้อมูลป้องกันการงัดแงะ
ทดสอบ MACsec HAL
การทดสอบ MACsec HAL จะมีให้ใน
hardware/interfaces/automotive/macsec/aidl/vts/functional
วิธีทำการทดสอบ
$ atest VtsHalMacsecPskPluginV1Test
การดำเนินการนี้จะเรียกใช้ addTestKey
เพื่อแทรกคีย์ทดสอบลงใน HAL และยืนยันกับ
ค่าที่คาดไว้สำหรับ calcIcv
, generateSak
, wrapSak
และ
unwrapSak
เพื่อยืนยันว่า MACsec กำลังทำงาน สำหรับการทดสอบการผสานรวม ให้ใช้คำสั่ง ping ระหว่างเครื่องสองเครื่องใน อินเทอร์เฟซ MACsec:
# ping -I macsec0 10.10.10.1
วิธีทดสอบหมึกกระดองกับโฮสต์
echo 8 > /sys/devices/virtual/net/cvd-ebr/bridge/group_fwd_mask
ในโฮสต์คือ
ที่จำเป็นต่อการอนุญาตให้ส่งผ่านเฟรม LLDP ที่จำเป็นสำหรับ MACsec