Bậ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ã hoá Ethernet giao tiếp được sử dụng bởi hệ thống thông tin giải trí trong xe (IVI) cho nhiều đơn vị ECU, bảo vệ dữ liệu do can thiệp, phát lại hoặc tiết lộ thông tin. Có bật giao dịch mua này không MACsec IEEE 802.11AE cho mạng Ethernet.

Tổng quan

Để bật MACsec, wpa_supplicant được sử dụng làm trình nền để xử lý Bắt tay Thoả thuận về Khoá MACsec (MKA). HAL MACsec được định nghĩa để lưu trữ MACsec khoá chia sẻ trước, được gọi là khoá liên kết kết nối (CAK) một cách an toàn. Lớp trừu tượng phần cứng (HAL) cho MACsec 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 trường hợp can thiệp bộ nhớ bền bỉ. Việc cấp phép khoá sẽ phụ thuộc vào phương thức triển khai của nhà cung cấp.

Luồng MAC giây

Hình 1 minh hoạ luồng MACsec trên đầu phát trung tâm.

Hình 1: Luồng MACsec.

Bật MACsec

Để hỗ trợ cho các chức năng có khoá MACsec CAK, MACsec cho Ethernet phải được bật rõ ràng bằng HAL MACsec 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 sang PRODUCT_PACKAGES và tệp cấu hình cho wpa_supplicant_macsec, init rc tập lệnh đến 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 có nhiều mạng giao diện cần được bảo vệ bằng MACsec, bạn có thể bắt đầu 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

Khởi động 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ẽ trả về lỗi ngay lập tức. Để tránh tình trạng tương tranh, thời gian chờ (thời gian chờ mặc định là năm (5) giây) để /sys//class/net/${eth_interface} có thể cần thiết.

# 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

Việc định cấu hình địa chỉ IP của giao diện MACsec có thể được thực hiện dựa trên khả năng kết nối của hệ thống người quản lý sau khi zygote bắt đầu. Dưới đây là tệp XML mẫu có lớp phủ để kết nối. Nếu Địa chỉ IP cho giao diện MACsec cần sẵn sàng trước khi zygote khởi động, một tuỳ chọn dành riêng cho nhà cung cấp daemon sẽ cần theo dõi giao diện macsec0 và định cấu hình giao diện này vì trình quản lý kết nối hệ thống chỉ khởi động sau khi zygote 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>

HAL (Lớp trừu tượng phần cứng) cho MACsec

HAL (Lớp trừu tượng phần cứng) 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ệ CAK . Toàn bộ quá trình mã hoá và giải mã bằng khoá đều được thực hiện trực tiếp mà không để lộ khoá 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); }

Cách triển khai tệp đối chiếu

Cách triển khai tham chiếu được cung cấp trong hardware/interfaces/macsec/aidl/default, cung cấp một phần mềm triển khai HAL bằng các khoá được nhúng bên trong. Phương thức triển khai này chỉ cung cấp tham chiếu chức năng đến HAL vì các khoá không có bộ nhớ chống giả mạo hỗ trợ.

Kiểm thử HAL MACsec

Bài kiểm tra HAL (Lớp trừu tượng phần cứng) được cung cấp trong hardware/interfaces/automotive/macsec/aidl/vts/functional.

Cách chạy kiểm thử:

$ atest VtsHalMacsecPskPluginV1Test

Thao tác này sẽ gọi addTestKey-- để chèn khoá kiểm thử vào HAL và để xác minh dựa trên giá trị dự kiến cho calcIcv, generateSak, wrapSakunwrapSak.

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

# ping -I macsec0 10.10.10.1

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