// -*- Mode: Go; indent-tabs-mode: t -*- /* * Copyright (C) 2020 Canonical Ltd * * This program is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License version 3 as * published by the Free Software Foundation. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program. If not, see . * */ package builtin import "github.com/snapcore/snapd/interfaces" /* * Microstack is a full OpenStack in a single snap package. * Virtual machines are spawned as QEMU processes with libvirt acting as a management * daemon (including for activities such as applying AppArmor profiles). * Networking is provided largely via OpenVSwitch and Neutron with dnsmasq acting * as an auxiliary daemon. tun/tap kernel module is used for creating virtual interfaces. * Virtual machines rely on KVM for virtualization acceleration and on vhost * framework in the kernel (vhost_net, vhost_scsi, vhost_vsock). * * This interface uses the controlsDeviceCgroup flag (which implies * `Delegate=true` on the systemd unit) since the snap already manages the * cgroup configuration of its containers. */ const microStackSupportSummary = `allows operating as the MicroStack service` const microStackSupportBaseDeclarationPlugs = ` microstack-support: allow-installation: false deny-auto-connection: true ` const microStackSupportBaseDeclarationSlots = ` microstack-support: allow-installation: slot-snap-type: - core deny-auto-connection: true ` const microStackSupportConnectedPlugAppArmor = ` # Used by QEMU to work with the kernel-side virtio implementations. /dev/vhost-net rw, /dev/vhost-scsi rw, /dev/vhost-vsock rw, # Used by QEMU to work with VFIO (https://www.kernel.org/doc/Documentation/vfio.txt). # For vfio hotplug on systems without static vfio (LP: #1775777) # VFIO userspace driver interface. /dev/vfio/vfio rw, # Access to VFIO group character devices such as /dev/vfio/ where is the group number. /dev/vfio/* rw, # Used by Nova for mounting images via qemu-nbd. /dev/nbd* rw, # Allow creating dm-* devices, /dev/ directories, /dev/mapper directory and symlinks under it. # Allow issuing ioctls to the Device Mapper for LVM tools via /dev/mapper/control. /dev/mapper/control rw, # Besides symlinks for LVs prefixed with a VG name this is also needed for DM devices created with # dm-crypt and other DM modules. /dev/mapper/{,**} rw, # Allow device mapper devices to be accessed. /dev/dm-* rw, /dev/microstack-*/{,**} rw, # Allow bcache devices to be accessed since DM devices may be set up on top of those. /dev/bcache[0-9]{,[0-9],[0-9][0-9]} rw, # bcache (up to 1000 devices) # Allow access to loop devices and loop-control to be able to associate a file with a loop device # for the purpose of using a file-backed LVM setup. /dev/loop-control rw, /dev/loop[0-9]* rw, # Description: this policy intentionally allows Microstack services to configure AppArmor # as libvirt generates AppArmor profiles for the utility processes it spawns. /sys/kernel/security/apparmor/{,**} r, /sys/kernel/security/apparmor/.remove w, /sys/kernel/security/apparmor/.replace w, # Used by libvirt to work with IOMMU. /sys/kernel/iommu_groups/{,**} r, /sys/bus/pci/devices/**/iommu_group/** r, # Used by libvirt's QEMU driver state initialization code path. # The path used is hard-coded in libvirt to /libvirt/qemu. /dev/hugepages/libvirt/ rw, /dev/hugepages/libvirt/** mrwklix, # Used by QEMU to get the maximum number of memory regions allowed in the vhost kernel module. /sys/module/vhost/parameters/max_mem_regions r, # Used by libvirt (cgroup-related): /sys/fs/cgroup/unified/cgroup.controllers r, /sys/fs/cgroup/cpuset/cpuset.cpus r, # Non-systemd layout: https://libvirt.org/cgroups.html#currentLayoutGeneric /sys/fs/cgroup/*/ r, /sys/fs/cgroup/*/machine/ rw, /sys/fs/cgroup/*/machine/** rw, # systemd-layout: https://libvirt.org/cgroups.html#systemdLayout /sys/fs/cgroup/*/machine.slice/machine-qemu*/{,**} rw, @{PROC}/[0-9]*/cgroup r, @{PROC}/cgroups r, # Used by libvirt. @{PROC}/filesystems r, @{PROC}/mtrr w, @{PROC}/@{pids}/environ r, @{PROC}/@{pids}/sched r, @{PROC}/@{pids}/task/@{tid}/sched r, @{PROC}/@{pids}/task/@{tid}/schedstat r, @{PROC}/*/status r, # Libvirt needs access to the PCI config space in order to be able to reset devices. /sys/devices/pci*/**/config rw, # Spice owner /{dev,run}/shm/spice.* rw, # Used by libvirt to create lock files for /dev/pts/ devices # when handling virsh console access requests. /run/lock/ r, /run/lock/LCK.._pts_* rwk, # Used by LVM tools. /run/lock/lvm/ rw, /run/lock/lvm/** rwk, # Files like /run/lvm/pvs_online, /run/lvm/vgs_online, /run/lvm/hints /run/lvm/ rw, /run/lvm/** rwlk, /run/dmeventd-client rwlk, /run/dmeventd-server rwlk, # Used by targetcli tools to work with LIO. /sys/kernel/config/target/ rw, /sys/kernel/config/target/** rw, # Used by targetcli. /{var/,}run/targetcli.lock rwlk, # Paths accessed by iscsid during its operation. /run/lock/iscsi/ rw, /run/lock/iscsi/** rwlk, /sys/devices/virtual/iscsi_transport/tcp/** r, /sys/devices/virtual/iscsi_transport/iser/** r, /sys/class/iscsi_session/** rw, /sys/class/iscsi_host/** r, /sys/devices/platform/host*/scsi_host/host*/** rw, /sys/devices/platform/host*/session*/connection*/iscsi_connection/connection*/** rw, /sys/devices/platform/host*/session*/iscsi_session/session*/** rw, /sys/devices/platform/host*/session*/target*/** rw, /sys/devices/platform/host*/iscsi_host/host*/** rw, # While the block-devices interface allows rw access, Libvirt also needs to be able to lock those. /dev/sd{,[a-h]}[a-z] rwk, /dev/sdi[a-v] rwk, # os-brick needs access to those when detaching a scsi device from an instance. /sys/block/sd{,[a-h]}[a-z]/device/delete rw, /sys/block/sdi[a-v]/device/delete rw, # Used by open-iscsi to avoid being killed by the OOM killer. owner @{PROC}/@{pid}/oom_score_adj rw, # Allow running utility processes under the specialized AppArmor profiles. # These profiles will prevent utility processes escaping confinement. capability mac_admin, # MicroStack services such as libvirt use a server/client design where # unix sockets are used for IPC. capability chown, # Required by Nova. capability dac_override, capability dac_read_search, capability fowner, # Used by libvirt to alter process capabilities via prctl. capability setpcap, # Used by libvirt to create device special files. capability mknod, # Allow libvirt to apply policy to spawned VM processes. change_profile -> libvirt-[0-9a-f]*-[0-9a-f]*-[0-9a-f]*-[0-9a-f]*-[0-9a-f]*, # Allow sending signals to the spawned VM processes. signal (read, send) peer=libvirt-*, # Allow reading certain proc entries, see ptrace(2) "Ptrace access mode checking". # For ourselves: ptrace (read, trace) peer=@{profile_name}, # For VM processes libvirt spawns: ptrace (read, trace) peer=libvirt-*, # Used by neutron-ovn-agent. unmount /run/netns/ovnmeta-*, # Required by libvirtd to detect and utilise AMD SEV capabilities for AMD CPU's /dev/sev rw, ` const microStackSupportConnectedPlugSecComp = ` # Description: allow MicroStack to operate by allowing the necessary system calls to be used by various services. # (libvirt, qemu, qemu-img, Nova, Neutron, Keystone, Glance, Cinder) # Note that this profile necessarily contains the union of all the syscalls each of the # utilities requires. We rely on MicroStack to generate specific AppArmor profiles # for each child process, to further restrict their abilities. mknod - |S_IFBLK - mknodat - - |S_IFBLK - ` const microstackSupportServiceSnippet = interfaces.PlugServicesServiceSectionSnippet(`Delegate=true`) type microStackInterface struct { commonInterface } var microStackSupportConnectedPlugKmod = []string{ `vhost`, // Core vhost module. `vhost-net`, // Used to offload virtio interface data plane into the kernel module. `vhost-scsi`, // Used to offload virtio-scsi device data plane into the kernel module. `vhost-vsock`, // virtio-vsock device support. `pci-stub`, // May be used for binding a PCI device driver to a stub driver. `vfio`, // The core VFIO driver for secure device assignment https://www.kernel.org/doc/html/latest/driver-api/vfio.html `vfio-pci`, // PCI-specific VFIO functionality. `nbd`, // The Network Block Device driver used by Nova (e.g. for block live migration). `dm-mod`, // Device mapper. `dm-thin-pool`, // DM thin pools used by the LVM driver in Cinder. `dm-snapshot`, // DM snapshots used by the LVM driver in Cinder. `iscsi-tcp`, // A module providing iscsi initiator functionality used by Nova via os-brick. `target-core-mod`, // A module providing ConfigFS infrastructure utilized in LIO (which is used by Cinder for iSCSI targets). } func init() { registerIface(µStackInterface{commonInterface{ name: "microstack-support", summary: microStackSupportSummary, implicitOnCore: true, implicitOnClassic: true, controlsDeviceCgroup: true, baseDeclarationSlots: microStackSupportBaseDeclarationSlots, baseDeclarationPlugs: microStackSupportBaseDeclarationPlugs, connectedPlugAppArmor: microStackSupportConnectedPlugAppArmor, connectedPlugSecComp: microStackSupportConnectedPlugSecComp, connectedPlugKModModules: microStackSupportConnectedPlugKmod, serviceSnippets: []interfaces.PlugServicesSnippet{microstackSupportServiceSnippet}, }}) }