虚拟机级授权政策

虚拟机级权限用于为软件定义型汽车 (SDV) 网状网络中不同虚拟机之间的通信定义授权政策。如果某个虚拟机遭到入侵,这些权限可提供纵深防御安全性。

您必须同时授予服务级权限和虚拟机级权限,才能允许跨虚拟机通信。

Proto 架构

虚拟机级权限使用 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;
}

授权决定

评估遵循严格的优先级顺序,其中“拒绝”会替换相同粒度的“允许”。默认情况下,所有跨虚拟机通信都会被拒绝。

优先级评估顺序

决定逻辑会按以下顺序检查权限:

  1. 精细拒绝:如果特定实例(消息 + 主题或服务 + 通道) 与 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: "*"
}