เปิดใช้ MACsec สำหรับฟีเจอร์อีเทอร์เน็ต

หน้านี้จะอธิบายวิธีเปิดใช้ MACsec สำหรับฟีเจอร์อีเทอร์เน็ต

ใช้ MACsec เพื่อตรวจสอบสิทธิ์และเข้ารหัสการสื่อสารผ่านอีเทอร์เน็ตที่ใช้โดยระบบสาระบันเทิงภายในรถ (IVI) สำหรับ ECU แต่ละหน่วย ซึ่งจะปกป้องข้อมูลจากการดัดแปลง การบันทึกซ้ำ หรือการเปิดเผยข้อมูล โดยเปิดใช้ MACsec IEEE 802.11AE สำหรับเครือข่ายอีเทอร์เน็ต

ภาพรวม

หากต้องการเปิดใช้ MACsec ระบบจะใช้ wpa_supplicant เป็น Daemon สำหรับจัดการแฮนด์เชค MACsec Key (MKA) MACsec HAL มีการกำหนดไว้สำหรับจัดเก็บคีย์ MACsec ที่แชร์ล่วงหน้าซึ่งเรียกว่าคีย์การเชื่อมต่อ (CAK) อย่างปลอดภัย HAL ของ MACsecรองรับเฉพาะ CAK HAL ของ MACsec สำหรับผู้ให้บริการรายนี้จะจัดเก็บ CAK อย่างปลอดภัยในพื้นที่เก็บข้อมูลที่ป้องกันการแทรกแซง การจัดสรรคีย์จะขึ้นอยู่กับการใช้งานของผู้ให้บริการ

โฟลว์ MACsec

รูปที่ 1 แสดงการไหลของ 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 จะเริ่มต้น Daemon เฉพาะผู้ให้บริการจะต้องฟังอินเทอร์เฟซ 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