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.
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_macsec
và macsec-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
, wrapSak
và unwrapSak
.
Để 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.