Política de autorización

El archivo de política de autorización es una única fuente de información para la configuración de autorización de la pila de comunicaciones del vehículo definido por software (SDV) para un paquete de servicios de SDV.

El archivo de política de autorización contiene la lista de permisos para este paquete de servicios, que especifica lo que puede hacer el paquete.

Esquema de Proto

El archivo de política de autorización usa el formato textproto para codificar la información pertinente.

El esquema de proto de la política de autorización es el siguiente:

message AuthzPolicy {
  // Optional. List of permissions to publish Data Tunnel publications.
  repeated Publisher publisher = 4;

  // Optional. List of permissions to discover and subscribe to Data Tunnel
  // publications.
  repeated Subscriber subscriber = 5;

  // Optional. List of permissions to serve an RPC server.
  repeated Server server = 6;

  // Optional. List of permissions to discover and call methods of an RPC
  // server.
  repeated Client client = 7;

  // Optional. Allow blanket "read" permission.
  //
  // Gives permission to discover and call all methods of all RPC servers,
  // as well as discover and subscribe to all publications.
  //
  // WARNING: This flag grants elevated permissions and should be used with a
  // good reason and for privileged agents only (e.g. Telemetry).
  bool allow_read_all = 8;
}

// Defines a permission to publish Data Tunnel publications.
message Publisher {
  // Required. Publication's protobuf message name.
  string message = 1;

  // Topic(s) to which this permission allows to publish to.
  //
  // Setting this field or setting 'allow_all_topics == true' is required.
  repeated string topic = 2;

  // Flag indicates that Service Bundle is allowed to register publication
  // of the 'message' type with any 'topic'
  //
  // Should only be set to 'true' if the 'topic' field is not set.
  bool allow_all_topics = 3;
}

// Defines a permission to discover and subscribe to Data Tunnel publications.
message Subscriber {
  // Required. Publication's protobuf message name.
  string message = 1;

  // Topic(s) to which this permission allows to subscribe to.
  //
  // Setting this field or setting 'allow_all_topics == true' is required.
  repeated string topic = 2;

  // Flag indicates that Service Bundle is allowed to discover and subscribe to
  // all publications of the 'message' type.
  //
  // Should only be set to 'true' if the 'topic' field is not set.
  bool allow_all_topics = 3;
}

// Defines a permission to serve an RPC server.
message Server {
  // Required. Server's protobuf service name.
  string service = 1;

  // Channel(s) which this permission allows to register.
  //
  // Setting this field or setting 'allow_all_channels == true' is required.
  repeated string channel = 2;

  // Flag indicates that Service Bundle is allowed to register RPC servers
  // of the 'service' type with any 'channel'
  //
  // Should only be set to 'true' if the 'channel' field is not set.
  bool allow_all_channels = 3;
}

// Defines a permission to discover and call methods of an RPC server.
message Client {
  // Required. Server's protobuf service name.
  string service = 1;

  // Channel(s) which this permission allows to discover and call methods on.
  //
  // Setting this field or setting 'allow_all_channels == true' is required.
  repeated string channel = 2;

  // Flag indicates that Service Bundle is allowed to discover and call all RPC
  // servers of the 'service' type.
  //
  // Should only be set to 'true' if the 'channel' field is not set.
  bool allow_all_channels = 3;
}

Ejemplo

# Allows this SB to register publication of TireStatus type with "left_tire" topic only.
publisher {
  message: "com.sdv.TireStatus"
  topic: "left_tire"
}

# Allows this SB to subscribe to publication of TireStatus type with "left_tire" topic only.
subscriber {
  message: "com.sdv.TireStatus"
  topic: "left_tire"
}

# Allows this SB to implement and serve UserPreferencesManager service on any channel.
server {
  service: "com.sdv.UserPreferencesManager"
  allow_all_channels: true
}

# Allows this SB to discover and call UserPreferencesManager service on any channel.
client {
  service: "com.sdv.UserPreferencesManager"
  allow_all_channels: true
}

Ejemplo de lectura privilegiada de todo

# Blanket read permission for privileged agents (e.g. Telemetry).
allow_read_all: true

Decisión de autorización

El sistema puede tomar las siguientes decisiones de autorización:

Permitido
El AuthzPolicy del sujeto contiene la regla de permiso requerida.
Rechazada de forma explícita
El AuthzPolicy del sujeto o el AuthzPolicy de la VM no contienen la regla de permiso requerida. Se muestra un mensaje de error claro que indica el permiso faltante.
Rechazada de forma implícita
Error del sistema o datos no válidos, como un archivo de política faltante, un error al analizar un nombre o una definición de unidad faltante.

Ejemplo de lógica de decisión

Los siguientes pasos ocurren cuando un paquete de servicios intenta llamar a com.sdv.UserPreferencesManager en el canal default:

  1. La pila de comunicaciones verifica el AuthzPolicy del paquete de servicios para el permiso client. Si falta el permiso, la solicitud se rechaza de forma explícita, lo que indica que el sujeto no tiene permiso.
  2. Para la comunicación entre VMs a través de la red en malla, el permiso de la VM host se verifica durante el intercambio de información de la malla de Service Discovery (SD), en lugar de solo durante el intento de acceso. La pila de comunicaciones verifica el VmAuthzPolicy de la VM host para determinar si la VM puede interactuar con el servicio.
  3. Si la política del sujeto y la política a nivel de la VM permiten la interacción, la solicitud se permite. De lo contrario, se rechaza de forma explícita, lo que indica que la VM no tiene permiso.

Para obtener más información sobre las políticas que se aplican entre las VMs, consulta Permisos a nivel de la VM.