当服务尝试执行其无权执行的操作时,就会发生授权违规。在标准 permissionsOnly 强制执行模式下,软件定义型汽车 (SDV) 框架会检查正文或其虚拟机 (VM) 是否具有其政策中声明的所需权限。
您必须在安全背景下评估违规消息。并非每项违规都表示错误或尝试未经授权的访问。
所有授权决策都会记录在日志中。如需查看这些决策,请在 logcat 输出中搜索审核消息:
adb -s $SERIAL logcat | grep 'audit message'
授权成功
成功的检查会记录在 debug 级别。
这表示正文具有声明的所需权限:
D SdvServiceManagerServer: instance2:com.sdv.google.sample.bar.ServiceBundleBar/instance declares permission to access com.sdv.google.sample.foo.ServiceBundleFoo#foo-rpc, audit message: ...
违规和缺少权限
缺少权限时会发生违规。
当正文在其授权政策中缺少必要的权限(例如 client、server、publisher 或 subscriber),或者正文的虚拟机在虚拟机级政策中缺少必要的权限时,就会发生这种情况。
这会记录在 error 级别:
E SdvServiceManagerServer: Authz violation. instance2:com.sdv.google.sample.bar.ServiceBundleBar/instance does not declare permission to access com.sdv.google.sample.foo.ServiceBundleFoo#foo-rpc, audit message: Subject lacks 'client' permission...
修复
日志的 audit message 通常包含有关需要添加哪些内容才能解决违规问题的实用建议。
例如,您可能会看到如下所示的权限错误:
Subject 'vm:com.client.Bundle/default' lacks 'client' permission for service 'com.server.TargetType' with channel 'my-unit'. Add 'client { service: "com.server.TargetType" channel: "my-unit" }' to the subject's Authz policy
如需解决此问题,请将该规则添加到正文的授权政策 textproto:
client {
service: "com.server.TargetType"
channel: "my-unit"
}
如果错误消息表明正文的虚拟机中缺少权限,您
必须将其添加到虚拟机级政策,例如 <vm_name>.textproto 或
.default.textproto 在 com.oem.sdv.authz APEX 中:
allow_server {
service: "com.server.TargetType"
channel: "my-unit"
}
从 ACL 迁移
为了实现向后兼容和迁移,该框架支持 ACLs only、Lenient 和 Strict 模式,这些模式会考虑之前的访问控制列表 (ACL)。
仅限 ACL 模式
在 ACLs only 模式下,仅当 ACL 允许访问时,才允许访问。权限会被忽略。如果 ACL 拒绝访问,系统会记录错误:
E SdvServiceManagerServer: Authz violation. com.sdv.google.sample.foo.ServiceBundleFoo#foo-rpc denies access to instance2:com.sdv.google.sample.bar.ServiceBundleBar/instance, audit message: ...
宽松模式
在 Lenient 模式下,如果 ACL 或权限允许访问,则允许访问。
如果使用 ACL 授予访问权限但缺少权限,系统会将其记录为 debug 级别的软违规,以帮助您识别缺少的权限,同时保持系统正常运行:
D SdvServiceManagerServer: Permissions Authz violation (access granted by ACLs): instance2:com.sdv.google.sample.bar.ServiceBundleBar/instance does not declare permission to access com.sdv.google.sample.foo.ServiceBundleFoo#foo-rpc, audit message: ...
如果 ACL 和权限都失败,系统会将其记录为两者的错误:
E SdvServiceManagerServer: Authz violation. com.sdv.google.sample.foo.ServiceBundleFoo#foo-rpc denies access to instance2:com.sdv.google.sample.bar.ServiceBundleBar/instance, audit message: ...
E SdvServiceManagerServer: Authz violation. instance2:com.sdv.google.sample.bar.ServiceBundleBar/instance does not declare permission to access com.sdv.google.sample.foo.ServiceBundleFoo#foo-rpc, audit message: ...
严格模式
在 Strict 模式下,ACL 和权限都必须允许访问。如果 ACL 或权限失败,系统会拒绝访问并记录错误。