Kích hoạt MACsec cho các tính năng ethernet

Trang này giải thích cách bật MACsec cho các tính năng ethernet.

Sử dụng MACsec để xác thực và mã hóa giao tiếp ethernet được hệ thống thông tin giải trí trên xe (IVI) sử dụng cho các đơn vị ECU khác nhau, bảo vệ dữ liệu khỏi bị giả mạo, phát lại hoặc tiết lộ thông tin. Thực hiện việc mua này để kích hoạt MACsec IEEE 802.11AE cho mạng ethernet.

Tổng quan

Để bật MACsec, wpa_supplicant được sử dụng làm daemon để xử lý bắt tay Thỏa thuận khóa MACsec (MKA). MACsec HAL được xác định để lưu trữ khóa chia sẻ trước MACsec, được gọi là khóa liên kết kết nối (CAK) một cách an toàn. MACsec HAL chỉ hỗ trợ CAK. MACsec HAL dành riêng cho nhà cung cấp này lưu trữ CAK một cách an toàn trong bộ lưu trữ chống giả mạo. Việc cung cấp khóa phụ thuộc vào việc triển khai của nhà cung cấp.

luồng MACsec

Hình 1 minh họa luồng MACsec trên thiết bị đầu.

Hình 1 : Luồng MACsec.

Bật MACsec

Để cung cấp hỗ trợ cho các chức năng bằng khóa MACsec CAK, MACsec cho ethernet phải được bật rõ ràng bằng MACsec HAL dành riêng cho nhà cung cấp.

Để bật tính năng này, hãy bật wpa_supplicant_macsecmacsec-service dành riêng cho nhà cung cấp thành PRODUCT_PACKAGES và tệp cấu hình cho wpa_supplicant_macsec , init rc thành PRODUCT_COPY_FILES .

Ví dụ: tệp [device-product].mk này:

# 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

Ví dụ: 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
}

Mẫu wpa_supplicant_macsec.conf trên eth0 . Khi nhiều giao diện mạng cần được bảo vệ bởi MACsec, bạn có thể khởi động nhiều dịch vụ.

# 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

Bắt đầu wpa_supplicant_macsec sau khi giao diện ethernet sẵn sàng. Nếu ethernet hệ thống chưa sẵn sàng, wpa_supplicant sẽ ngay lập tức trả về lỗi. Để tránh tình trạng cạnh tranh, có thể cần phải chờ (thời gian chờ mặc định là năm (5) giây) cho /sys//class/net/${eth_interface} .

# init.target.rc
on late-fs
    …
    wait /sys/class/net/eth0
    start wpa_supplicant_macsec
    …

Định cấu hình địa chỉ IP cho giao diện MACsec

Trình quản lý kết nối hệ thống có thể thực hiện việc cấu hình địa chỉ IP giao diện MACsec sau khi hợp tử khởi động. Đây là một ví dụ về tệp XML lớp phủ để kết nối. Nếu địa chỉ IP cho giao diện MACsec cần phải sẵn sàng trước khi hợp tử khởi động, thì daemon dành riêng cho nhà cung cấp sẽ cần lắng nghe giao diện macsec0 và định cấu hình giao diện đó thay vì trình quản lý kết nối hệ thống chỉ khởi động sau khi hợp tử khởi động.

# 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 dành riêng cho nhà cung cấp MACsec phải triển khai các chức năng sau để bảo vệ khóa CAK. Tất cả quá trình mã hóa và giải mã bằng khóa được thực hiện trực tiếp mà không để lộ khóa cho 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); }

Thực hiện tham khảo

Việc triển khai tham chiếu được cung cấp trong hardware/interfaces/macsec/aidl/default , cung cấp cách triển khai phần mềm của HAL với các khóa được nhúng bên trong. Việc triển khai này chỉ cung cấp tham chiếu chức năng cho HAL vì các khóa không được hỗ trợ bởi bộ lưu trữ chống giả mạo.

Kiểm tra MACsec HAL

Kiểm tra MACsec HAL được cung cấp trong hardware/interfaces/automotive/macsec/aidl/vts/functional .

Để chạy thử nghiệm:

$ atest VtsHalMacsecPskPluginV1Test

Lệnh này gọi addTestKey -- để chèn khóa kiểm tra vào HAL và để xác minh các giá trị dự kiến ​​cho calcIcv , generateSak , wrapSakunwrapSak .

Để xác nhận MACsec đang hoạt động, để kiểm tra tích hợp, hãy ping giữa hai máy trong giao diện MACsec:

# ping -I macsec0 10.10.10.1

Để kiểm tra Mực nang với máy chủ, cần có echo 8 > /sys/devices/virtual/net/cvd-ebr/bridge/group_fwd_mask trong máy chủ để cho phép truyền qua các khung LLDP cần thiết cho MACsec.