Criteri di autorizzazione

Il file dei criteri di autorizzazione è un'unica fonte di riferimento per la configurazione dell'autorizzazione dello stack di comunicazione del veicolo definito dal software (SDV) per un bundle di servizi SDV.

Il file della policy di autorizzazione contiene l'elenco delle autorizzazioni per questo bundle di servizi, che specifica cosa può fare il bundle.

Schema proto

Il file della policy di autorizzazione utilizza il formato textproto per codificare le informazioni pertinenti.

Lo schema proto del criterio di autorizzazione è il seguente:

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;
}

Esempio

# 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
}

Esempio di lettura privilegiata di tutti i dati

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

Decisione sull'autorizzazione

Il sistema può prendere le seguenti decisioni di autorizzazione:

Contenuti consentiti
L'oggetto AuthzPolicy contiene la regola di autorizzazione richiesta.
Negata esplicitamente
L'AuthzPolicy del soggetto o della VM non contiene la regola di autorizzazione richiesta.AuthzPolicy Viene restituito un messaggio di errore chiaro che indica l'autorizzazione mancante.
Negata implicitamente
Errore di sistema o dati non validi, ad esempio un file di policy mancante, un errore di analisi di un nome o una definizione di unità mancante.

Esempio di logica decisionale

I seguenti passaggi vengono eseguiti quando un bundle di servizi tenta di chiamare com.sdv.UserPreferencesManager sul canale default:

  1. Lo stack di comunicazione controlla AuthzPolicy del service bundle per l'autorizzazione client. Se l'autorizzazione non è presente, la richiesta viene Negata in modo esplicito, a indicare che il soggetto non dispone dell'autorizzazione.
  2. Per la comunicazione tra VM sulla rete mesh, l'autorizzazione della VM host viene controllata durante lo scambio di informazioni mesh di Service Discovery (SD), anziché solo durante il tentativo di accesso. Lo stack di comunicazione controlla il VmAuthzPolicy della VM host per determinare se la VM è autorizzata a interagire con il servizio.
  3. Se sia la policy del soggetto sia la policy a livello di VM consentono l'interazione, la richiesta è consentita. In caso contrario, viene negata esplicitamente, a indicare che la VM non dispone dell'autorizzazione.

Per saperne di più sulle norme applicate tra le VM, consulta Autorizzazioni a livello di VM.