调试权限违规问题

当服务尝试执行其无权执行的操作时,就会发生授权违规。在标准 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: ...

违规和缺少权限

缺少权限时会发生违规。

当正文在其授权政策中缺少必要的权限(例如 clientserverpublishersubscriber),或者正文的虚拟机在虚拟机级政策中缺少必要的权限时,就会发生这种情况。

这会记录在 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.textprotocom.oem.sdv.authz APEX 中:

allow_server {
    service: "com.server.TargetType"
    channel: "my-unit"
}

从 ACL 迁移

为了实现向后兼容和迁移,该框架支持 ACLs onlyLenientStrict 模式,这些模式会考虑之前的访问控制列表 (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 或权限失败,系统会拒绝访问并记录错误。