[libvirt] [PATCH v3 23/30] virSecuritySELinuxRestoreImageLabelInt: Don't skip non-local storage
Cole Robinson
crobinso at redhat.com
Tue Dec 10 20:35:50 UTC 2019
On 12/2/19 9:26 AM, Michal Privoznik wrote:
> This function is currently not called for any type of storage
> source that is not considered 'local' (as defined by
> virStorageSourceIsLocalStorage()). Well, NVMe disks are not
> 'local' from that point of view and therefore we will need to
> call this function more frequently.
>
> Signed-off-by: Michal Privoznik <mprivozn at redhat.com>
> ---
> src/security/security_apparmor.c | 25 ++++++++++++----
> src/security/security_dac.c | 30 +++++++++++++++++++
> src/security/security_selinux.c | 51 +++++++++++++++++++++++++++-----
> 3 files changed, 92 insertions(+), 14 deletions(-)
>
> diff --git a/src/security/security_apparmor.c b/src/security/security_apparmor.c
> index 21560b2330..7cea788931 100644
> --- a/src/security/security_apparmor.c
> +++ b/src/security/security_apparmor.c
> @@ -779,9 +779,8 @@ AppArmorSetSecurityImageLabel(virSecurityManagerPtr mgr,
> virSecurityDomainImageLabelFlags flags G_GNUC_UNUSED)
> {
> virSecurityLabelDefPtr secdef;
> -
> - if (!src->path || !virStorageSourceIsLocalStorage(src))
> - return 0;
> + g_autofree char *vfioGroupDev = NULL;
> + const char *path;
>
> secdef = virDomainDefGetSecurityLabelDef(def, SECURITY_APPARMOR_NAME);
> if (!secdef || !secdef->relabel)
> @@ -790,15 +789,29 @@ AppArmorSetSecurityImageLabel(virSecurityManagerPtr mgr,
> if (!secdef->imagelabel)
> return 0;
>
> + if (src->type == VIR_STORAGE_TYPE_NVME) {
> + const virStorageSourceNVMeDef *nvme = src->nvme;
> +
> + if (!(vfioGroupDev = virPCIDeviceAddressGetIOMMUGroupDev(&nvme->pciAddr)))
> + return -1;
> +
> + path = vfioGroupDev;
> + } else {
> + if (!src->path || !virStorageSourceIsLocalStorage(src))
> + return 0;
> +
> + path = src->path;
> + }
> +
> /* if the device doesn't exist, error out */
> - if (!virFileExists(src->path)) {
> + if (!virFileExists(path)) {
> virReportError(VIR_ERR_INTERNAL_ERROR,
> _("\'%s\' does not exist"),
> - src->path);
> + path);
> return -1;
> }
>
> - return reload_profile(mgr, def, src->path, true);
> + return reload_profile(mgr, def, path, true);
> }
>
> static int
> diff --git a/src/security/security_dac.c b/src/security/security_dac.c
> index a9a1fad5d7..411aa1b159 100644
> --- a/src/security/security_dac.c
> +++ b/src/security/security_dac.c
> @@ -911,6 +911,19 @@ virSecurityDACSetImageLabelInternal(virSecurityManagerPtr mgr,
> return -1;
> }
>
> + /* This is not very clean. But so far we don't have NVMe
> + * storage pool backend so that its chownCallback would be
> + * called. And this place looks least offensive. */
> + if (src->type == VIR_STORAGE_TYPE_NVME) {
> + const virStorageSourceNVMeDef *nvme = src->nvme;
> + g_autofree char *vfioGroupDev = NULL;
> +
> + if (!(vfioGroupDev = virPCIDeviceAddressGetIOMMUGroupDev(&nvme->pciAddr)))
> + return -1;
> +
> + return virSecurityDACSetOwnership(mgr, NULL, vfioGroupDev, user, group, false);
> + }
> +
> /* We can't do restore on shared resources safely. Not even
> * with refcounting implemented in XATTRs because if there
> * was a domain running with the feature turned off the
> @@ -1017,6 +1030,23 @@ virSecurityDACRestoreImageLabelSingle(virSecurityManagerPtr mgr,
> }
> }
>
> + /* This is not very clean. But so far we don't have NVMe
> + * storage pool backend so that its chownCallback would be
> + * called. And this place looks least offensive. */
> + if (src->type == VIR_STORAGE_TYPE_NVME) {
> + const virStorageSourceNVMeDef *nvme = src->nvme;
> + g_autofree char *vfioGroupDev = NULL;
> +
> + if (!(vfioGroupDev = virPCIDeviceAddressGetIOMMUGroupDev(&nvme->pciAddr)))
> + return -1;
> +
> + /* Ideally, we would check if there is not another PCI
> + * device within domain def that is in the same IOMMU
> + * group. But we're not doing that for hostdevs yet. */
> +
> + return virSecurityDACRestoreFileLabelInternal(mgr, NULL, vfioGroupDev, false);
> + }
> +
> return virSecurityDACRestoreFileLabelInternal(mgr, src, NULL, true);
> }
>
I think my suggested helpers will simplify selinux and apparmor a bit.
Not sure about DAC but I don't fully understand the chownCallback +
transaction stuff.
Looks mechanically sound AFAICT
Reviewed-by: Cole Robinson <crobinso at redhat.com>
- Cole
More information about the libvir-list
mailing list