MACsec را برای ویژگی های اترنت فعال کنید

این صفحه نحوه فعال کردن MACsec را برای ویژگی‌های اترنت توضیح می‌دهد.

از MACsec برای احراز هویت و رمزگذاری ارتباطات اترنت مورد استفاده توسط سیستم اطلاعات سرگرمی داخل خودرو (IVI) برای واحدهای ECU مختلف استفاده کنید و از داده ها در برابر دستکاری، پخش مجدد یا افشای اطلاعات محافظت کنید. این کار را با فعال کردن MACsec IEEE 802.11AE برای شبکه اترنت انجام دهید.

نمای کلی

برای فعال کردن MACsec، wpa_supplicant به عنوان شبح برای مدیریت توافق نامه کلید MACsec (MKA) استفاده می شود. یک MACsec HAL برای ذخیره کردن کلید پیش اشتراک‌گذاری شده MACsec تعریف شده است که به آن کلید ارتباط اتصال (CAK) می‌گویند. MACsec HAL فقط از CAK پشتیبانی می کند. این MACsec HAL مخصوص فروشنده، CAK را به طور ایمن در یک ذخیره سازی مقاوم در برابر دستکاری ذخیره می کند. تهیه کلید به پیاده سازی فروشنده بستگی دارد.

جریان MACsec

شکل 1 جریان 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 آماده باشد، یک دیمون خاص فروشنده باید به رابط 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>

MACsec HAL

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 را تست کنید

تست HAL MACsec در hardware/interfaces/automotive/macsec/aidl/vts/functional ارائه شده است.

برای اجرای تست:

$ atest VtsHalMacsecPskPluginV1Test

این addTestKey را فراخوانی می کند -- برای درج یک کلید تست در HAL و بررسی مقادیر مورد انتظار برای calcIcv , generateSak , wrapSak و unwrapSak .

برای تایید کارکرد MACsec، برای تست های یکپارچه سازی، بین دو ماشین در رابط MACsec پینگ کنید:

# ping -I macsec0 10.10.10.1

برای آزمایش Cuttlefish با میزبان، echo 8 > /sys/devices/virtual/net/cvd-ebr/bridge/group_fwd_mask در میزبان مورد نیاز است تا اجازه عبور از فریم‌های LLDP مورد نیاز برای MACsec را بدهد.