Hello mates,
Please, can you help me identify if some snapd interfaces should be extended and/or is there a proper interface we are not using?
node-exporter is a server application that exports host metrics in Prometheus format.
We are trying to come up with a proper snapcraft.yaml definition in order to be able to export host’s metrics in a strict confinement.
After installing the snap and enabling all its exporters:
sudo snap set node-exporter collectors="buddyinfo cgroups cpu_vulnerabilities drm drbd ethtool interrupts ksmd lnstat logind meminfo_numa mountstats network_route perf processes qdisc slabinfo softirqs sysctl systemd tcpstat wifi xfrm zoneinfo"
I see a lot of errors in syslog.
My gut feeling is that some of the files node-exporter cannot access should be enabled in some the snapd interfaces.
/sys/fs/btrfs//proc/softirqs/proc/spl/kstat/zfs//proc/buddyinfo/proc/slabinfo/proc/sys/kernel/random/poolsize/sys/kernel/mm/ksm/full_scans/proc/sys/kernel/threads-max
I tried with a custom plug, but the errors are still there:
@@ -11,6 +11,22 @@ confinement: strict
base: core24
adopt-info: node-exporter
+plugs:
+ proc-sys-kernel-random:
+ interface: system-files
+ read:
+ - /lib/systemd/systemd-logind
+ - /proc/buddyinfo
+ - /proc/slabinfo
+ - /proc/softirqs
+ - /proc/spl/kstat/zfs
+ - /proc/sys/kernel/random/poolsize
+ - /proc/sys/kernel/random/write_wakeup_threshold
+ - /proc/sys/kernel/threads-max
+ - /proc/sys/kernel/threads-max
+ - /sys/fs/btrfs
+ - /sys/kernel/mm/ksm/full_scans
+
parts:
wrapper:
plugin: dump
@@ -49,3 +65,4 @@ apps:
- mount-observe
- network-observe
- system-observe
+ - proc-sys-kernel-random
Besides, there are some apparmor DENIED messages.
The log lines from syslog are:
2025-08-16T13:35:12.626012-03:00 guille kernel: audit: type=1400 audit(1755362112.624:427589): apparmor="DENIED" operation="capable" class="cap" profile="snap.node-exporter.node-exporter" pid=1745355 comm="node_exporter" capability=12 capname="net_admin"
2025-08-16T13:35:12.629993-03:00 guille kernel: audit: type=1400 audit(1755362112.628:427590): apparmor="DENIED" operation="open" class="file" profile="snap.node-exporter.node-exporter" name="/sys/fs/btrfs/" pid=1745355 comm="node_exporter" requested_mask="r" denied_mask="r" fsuid=0 ouid=0
2025-08-16T13:35:12.631983-03:00 guille kernel: audit: type=1400 audit(1755362112.630:427591): apparmor="DENIED" operation="open" class="file" profile="snap.node-exporter.node-exporter" name="/proc/softirqs" pid=1745355 comm="node_exporter" requested_mask="r" denied_mask="r" fsuid=0 ouid=0
2025-08-16T13:35:12.631986-03:00 guille kernel: audit: type=1400 audit(1755362112.630:427592): apparmor="DENIED" operation="open" class="file" profile="snap.node-exporter.node-exporter" name="/proc/spl/kstat/zfs/" pid=1745355 comm="node_exporter" requested_mask="r" denied_mask="r" fsuid=0 ouid=0
2025-08-16T13:35:12.632045-03:00 guille node-exporter.node-exporter[1745355]: time=2025-08-16T16:35:12.631Z level=ERROR source=collector.go:168 msg="collector failed" name=softirqs duration_seconds=1.3615e-05 err="couldn't get softirqs: open /proc/softirqs: permission denied"
2025-08-16T13:35:12.633312-03:00 guille node-exporter.node-exporter[1745355]: time=2025-08-16T16:35:12.633Z level=ERROR source=collector.go:168 msg="collector failed" name=buddyinfo duration_seconds=1.1271e-05 err="couldn't get buddyinfo: open /proc/buddyinfo: permission denied"
2025-08-16T13:35:12.633982-03:00 guille kernel: audit: type=1400 audit(1755362112.632:427593): apparmor="DENIED" operation="open" class="file" profile="snap.node-exporter.node-exporter" name="/proc/buddyinfo" pid=1745355 comm="node_exporter" requested_mask="r" denied_mask="r" fsuid=0 ouid=0
2025-08-16T13:35:12.634574-03:00 guille node-exporter.node-exporter[1745355]: time=2025-08-16T16:35:12.634Z level=ERROR source=collector.go:168 msg="collector failed" name=slabinfo duration_seconds=1.1491e-05 err="couldn't get slabinfo: open /proc/slabinfo: permission denied"
2025-08-16T13:35:12.634983-03:00 guille kernel: audit: type=1400 audit(1755362112.633:427594): apparmor="DENIED" operation="open" class="file" profile="snap.node-exporter.node-exporter" name="/proc/slabinfo" pid=1745355 comm="node_exporter" requested_mask="r" denied_mask="r" fsuid=0 ouid=0
2025-08-16T13:35:12.652310-03:00 guille node-exporter.node-exporter[1745355]: time=2025-08-16T16:35:12.652Z level=ERROR source=collector.go:168 msg="collector failed" name=entropy duration_seconds=3.9745e-05 err="failed to get kernel random stats: open /proc/sys/kernel/random/poolsize: permission denied"
2025-08-16T13:35:12.652934-03:00 guille node-exporter.node-exporter[1745355]: time=2025-08-16T16:35:12.652Z level=ERROR source=collector.go:168 msg="collector failed" name=ksmd duration_seconds=2.5778e-05 err="open /sys/kernel/mm/ksm/full_scans: permission denied"
2025-08-16T13:35:12.653006-03:00 guille kernel: audit: type=1400 audit(1755362112.651:427595): apparmor="DENIED" operation="open" class="file" profile="snap.node-exporter.node-exporter" name="/proc/sys/kernel/random/poolsize" pid=1745355 comm="node_exporter" requested_mask="r" denied_mask="r" fsuid=0 ouid=0
2025-08-16T13:35:12.653016-03:00 guille kernel: audit: type=1400 audit(1755362112.651:427596): apparmor="DENIED" operation="open" class="file" profile="snap.node-exporter.node-exporter" name="/sys/kernel/mm/ksm/full_scans" pid=1745355 comm="node_exporter" requested_mask="r" denied_mask="r" fsuid=0 ouid=0
2025-08-16T13:35:12.659989-03:00 guille kernel: audit: type=1400 audit(1755362112.658:427597): apparmor="DENIED" operation="capable" class="cap" profile="snap.node-exporter.node-exporter" pid=1745355 comm="node_exporter" capability=2 capname="dac_read_search"
2025-08-16T13:35:12.659997-03:00 guille kernel: audit: type=1400 audit(1755362112.658:427598): apparmor="DENIED" operation="capable" class="cap" profile="snap.node-exporter.node-exporter" pid=1745355 comm="node_exporter" capability=1 capname="dac_override"
2025-08-16T13:35:12.734453-03:00 guille node-exporter.node-exporter[1745355]: time=2025-08-16T16:35:12.734Z level=ERROR source=collector.go:168 msg="collector failed" name=processes duration_seconds=0.110195732 err="unable to retrieve limit number of threads: open /proc/sys/kernel/threads-max: permission denied"
2025-08-16T13:35:12.734553-03:00 guille node-exporter.node-exporter[1745355]: time=2025-08-16T16:35:12.734Z level=ERROR source=collector.go:168 msg="collector failed" name=logind duration_seconds=0.099305684 err="unable to get seats: An AppArmor policy prevents this sender from sending this message to this recipient; type=\"method_call\", sender=\":1.64728\" (uid=0 pid=1745355 comm=\"/snap/node-exporter/1941/bin/node_exporter --colle\" label=\"snap.node-exporter.node-exporter (enforce)\") interface=\"org.freedesktop.login1.Manager\" member=\"ListSeats\" error name=\"(unset)\" requested_reply=\"0\" destination=\"org.freedesktop.login1\" (uid=0 pid=8852 comm=\"/usr/lib/systemd/systemd-logind\" label=\"unconfined\")"