我目前正在领导一项工作,使我们的应用程序可以作为 Ubuntu Core 16.04 LTS 的 snap 包使用。我目前正在开发:
(classic)mike@localhost:~/$ uname -a
Linux localhost.localdomain 4.4.0-1030-raspi2 #37-Ubuntu SMP Thu Oct 20 15:06:25 UTC 2016 armv7l armv7l armv7l GNU/Linux
(classic)mike@localhost:~/$ snap --version
snap 2.28.5
snapd 2.29.3
series 16
kernel 4.4.0-1030-raspi2
请注意,树莓派不是我们的最终目标平台,但它暂时可以作为一个合适的 POC。
我的问题是关于连接非自动连接的 snap 接口,更具体地说,如何从代码 (c) 或通过 systemd 在服务启动时进行连接。我熟悉如何从命令行连接 snap:
snap connect [snap_name]:mount-observe :mount-observe
但是,我们的应用程序作为服务运行 - 命令行无法手动连接此接口,并且访问此接口和其他插件对于我们应用程序的正常功能是必需的。我非常渴望找到一种通过其他机制连接这些“非自动”插件的方法。
我尝试过运行类似这样的操作:
sprintf(command, "snap connect %s:mount-observe :mount-observe", SNAP_NAME);
system(command);
从 c 代码我也尝试运行:
snap connect [snap_name]:mount-observe :mount-observe
通过 snapcraft.yaml 在脚本中:
app:
command: bin/my-wrapper-that-will-call-my-app.sh
但似乎都没有提供所需的结果。我将看到如下安全策略异常:
Log: apparmor="ALLOWED" operation="exec" profile="snap.snap_name.my-service" name="/usr/bin/snap" pid=24603 comm="sh" requested_mask="x" denied_mask="x" fsuid=0 ouid=0 target="snap.snap_name.my-service-service//null-/usr/bin/snap"
File: /usr/bin/snap (exec)
Suggestions:
* adjust snap to ship 'snap'
* adjust program to use relative paths if the snap already ships 'snap'
并且,尽管我在开发模式下运行,仍然没有看到从“快照接口”输出连接的插头。
我在文档中找不到任何关于此类用法的参考资料 - 我遗漏了什么?我的工作流程不可能吗?如何连接接口而无需用户在命令行上进行交互 - 请考虑我的应用程序是一种服务 - 我的安装基础将没有命令行访问权限。
谨致问候,迈克·詹姆斯
答案1
Ubuntu 安全团队非常重视接口的开发。默认情况下,自动连接的接口要么风险相对较小(例如网络),要么会导致典型应用程序出现严重故障(例如 x11)。不自动连接的接口之所以这样,是有原因的:它们可能被滥用,并且对于典型应用程序来说并不是必需的。由于存在滥用的可能性,从 snap 内部连接接口会破坏限制的整个目的,这解释了为什么您无法做到这一点!
有两种方法可以连接特权接口。要么您的用户需要选择加入(即手动连接接口),要么您可以通过在论坛中创建主题来请求安全团队进行更彻底的审查论坛的“商店”类别,要求为您的 snap 做出例外,并让这些接口自动连接。这不是橡皮图章;您需要提供使用它们的理由,但这种例外并不罕见。