VM 層級授權政策

VM 層級權限會定義授權政策,用於軟體定義車輛 (SDV) 網狀網路中不同 VM 之間的通訊。萬一其中一個 VM 遭到入侵,這些磁碟就能提供縱深防禦安全機制。

您必須授予服務層級和 VM 層級的權限,才能允許跨 VM 通訊。

Proto 結構定義

VM 層級權限是以 textproto 格式的單一 VmAuthzPolicy 訊息定義。

message VmAuthzPolicy {
  repeated Publisher allow_publisher = 1;
  repeated Publisher deny_publisher = 2;
  repeated Subscriber allow_subscriber = 3;
  repeated Subscriber deny_subscriber = 4;
  repeated Server allow_server = 5;
  repeated Server deny_server = 6;
  repeated Client allow_client = 7;
  repeated Client deny_client = 8;
}

// Reuses the same Publisher message from AuthzPolicy, but uses "*" for
// wildcards.
message Publisher {
  string message = 1;
  repeated string topic = 2;
}

// Reuses the same Subscriber message from AuthzPolicy, but uses "*" for
// wildcards.
message Subscriber {
  string message = 1;
  repeated string topic = 2;
}

// Reuses the same Server message from AuthzPolicy, but uses "*" for
// wildcards.
message Server {
  string service = 1;
  repeated string channel = 2;
}

// Reuses the same Client message from AuthzPolicy, but uses "*" for
// wildcards.
message Client {
  string service = 1;
  repeated string channel = 2;
}

授權決策

評估作業會遵循嚴格的優先順序,在相同精細度下,「拒絕」會覆寫「允許」。根據預設,系統會拒絕所有跨 VM 通訊。

優先順序評估順序

決策邏輯會依下列順序檢查權限:

  1. 精細拒絕:如果特定執行個體 (Message+Topic 或 Service+Channel) 符合 deny_ 規則,系統會明確拒絕
  2. 精細允許:如果特定執行個體符合 allow_ 規則,則會允許
  3. 拒絕類型:如果整個訊息類型或服務介面符合deny_規則 (topic: "*"channel: "*"),系統會明確拒絕
  4. 類型為「允許」:如果整個訊息類型或服務介面符合 allow_ 規則 (topic: "*"channel: "*"),則為「允許」
  5. 全面拒絕:如果所有訊息類型或服務都遭到拒絕 (message: "*"service: "*"),則為明確拒絕
  6. 全面允許:如果允許所有訊息類型或服務 (message: "*"service: "*"),則為「允許」
  7. 隱含預設:如果沒有相符的規則,系統會隱含拒絕。系統預設為拒絕所有要求。

範例

以下範例說明授權政策的評估方式。

精細允許覆寫類型拒絕

# Deny door unlock publications by default...
deny_publisher {
  message: "com.sdv.security.UnlockDoors"
  topic: "*"
}

# ...but allow it for the driver door.
allow_publisher {
  message: "com.sdv.security.UnlockDoors"
  topic: "driver_door"
}

類型拒絕會覆寫全面允許

# Allow all client calls globally (blanket allow)...
allow_client {
  service: "*"
  channel: "*"
}

# ...except for the firmware update service (system-wide deny).
deny_client {
  service: "com.sdv.diagnostic.FirmwareUpdate"
  channel: "*"
}