[libvirt] [PATCH v3 1/2] security: add new internal function "virSecurityManagerGetBaseLabel"

Daniel P. Berrange berrange at redhat.com
Thu Oct 17 13:05:41 UTC 2013


On Fri, Sep 06, 2013 at 06:29:55PM +0200, Giuseppe Scrivano wrote:
> virSecurityManagerGetBaseLabel queries the default settings used by
> a security model.
> 
> Signed-off-by: Giuseppe Scrivano <gscrivan at redhat.com>
> ---
>  src/libvirt_private.syms         |  1 +
>  src/security/security_apparmor.c |  8 ++++++++
>  src/security/security_dac.c      | 34 ++++++++++++++++++++++++----------
>  src/security/security_dac.h      |  7 +++----
>  src/security/security_driver.h   |  4 ++++
>  src/security/security_manager.c  | 22 ++++++++++++++++++++--
>  src/security/security_manager.h  |  2 ++
>  src/security/security_nop.c      | 10 ++++++++++
>  src/security/security_selinux.c  | 12 ++++++++++++
>  src/security/security_stack.c    |  9 +++++++++
>  10 files changed, 93 insertions(+), 16 deletions(-)
> 
> diff --git a/src/libvirt_private.syms b/src/libvirt_private.syms
> index 35f0f1b..aea7e94 100644
> --- a/src/libvirt_private.syms
> +++ b/src/libvirt_private.syms
> @@ -1033,6 +1033,7 @@ virSecurityDriverLookup;
>  # security/security_manager.h
>  virSecurityManagerClearSocketLabel;
>  virSecurityManagerGenLabel;
> +virSecurityManagerGetBaseLabel;
>  virSecurityManagerGetDOI;
>  virSecurityManagerGetModel;
>  virSecurityManagerGetMountOptions;
> diff --git a/src/security/security_apparmor.c b/src/security/security_apparmor.c
> index adc9918..2d74cdd 100644
> --- a/src/security/security_apparmor.c
> +++ b/src/security/security_apparmor.c
> @@ -931,6 +931,12 @@ AppArmorGetMountOptions(virSecurityManagerPtr mgr ATTRIBUTE_UNUSED,
>      return opts;
>  }
>  
> +static const char *
> +AppArmorGetBaseLabel(virSecurityManagerPtr mgr ATTRIBUTE_UNUSED,
> +                     int virtType ATTRIBUTE_UNUSED)
> +{
> +    return NULL;
> +}
>  
>  virSecurityDriver virAppArmorSecurityDriver = {
>      .privateDataLen                     = 0,
> @@ -972,4 +978,6 @@ virSecurityDriver virAppArmorSecurityDriver = {
>      .domainSetSecurityTapFDLabel        = AppArmorSetFDLabel,
>  
>      .domainGetSecurityMountOptions      = AppArmorGetMountOptions,
> +
> +    .getBaseLabel                       = AppArmoryGetBaseLabel,
>  };
> diff --git a/src/security/security_dac.c b/src/security/security_dac.c
> index 6876bd5..019c789 100644
> --- a/src/security/security_dac.c
> +++ b/src/security/security_dac.c
> @@ -47,22 +47,25 @@ struct _virSecurityDACData {
>      gid_t *groups;
>      int ngroups;
>      bool dynamicOwnership;
> +    char *baselabel;
>  };
>  
> -void
> -virSecurityDACSetUser(virSecurityManagerPtr mgr,
> -                      uid_t user)
> +/* returns -1 on error, 0 on success */
> +int
> +virSecurityDACSetUserAndGroup(virSecurityManagerPtr mgr,
> +                              uid_t user,
> +                              gid_t group)
>  {
>      virSecurityDACDataPtr priv = virSecurityManagerGetPrivateData(mgr);
>      priv->user = user;
> -}
> -
> -void
> -virSecurityDACSetGroup(virSecurityManagerPtr mgr,
> -                       gid_t group)
> -{
> -    virSecurityDACDataPtr priv = virSecurityManagerGetPrivateData(mgr);
>      priv->group = group;
> +
> +    if (virAsprintf(&priv->baselabel, "%u:%u",
> +                    (unsigned int) user,
> +                    (unsigned int) group) < 0)
> +        return -1;
> +
> +    return 0;
>  }
>  
>  void
> @@ -217,6 +220,7 @@ virSecurityDACClose(virSecurityManagerPtr mgr)
>  {
>      virSecurityDACDataPtr priv = virSecurityManagerGetPrivateData(mgr);
>      VIR_FREE(priv->groups);
> +    VIR_FREE(priv->baselabel);
>      return 0;
>  }
>  
> @@ -1170,6 +1174,14 @@ virSecurityDACGetMountOptions(virSecurityManagerPtr mgr ATTRIBUTE_UNUSED,
>      return NULL;
>  }
>  
> +static const char *
> +virSecurityDACGetBaseLabel(virSecurityManagerPtr mgr,
> +                           int virt ATTRIBUTE_UNUSED)
> +{
> +    virSecurityDACDataPtr priv = virSecurityManagerGetPrivateData(mgr);
> +    return priv->baselabel;
> +}
> +
>  virSecurityDriver virSecurityDriverDAC = {
>      .privateDataLen                     = sizeof(virSecurityDACData),
>      .name                               = SECURITY_DAC_NAME,
> @@ -1212,4 +1224,6 @@ virSecurityDriver virSecurityDriverDAC = {
>      .domainSetSecurityTapFDLabel        = virSecurityDACSetTapFDLabel,
>  
>      .domainGetSecurityMountOptions      = virSecurityDACGetMountOptions,
> +
> +    .getBaseLabel                       = virSecurityDACGetBaseLabel,
>  };
> diff --git a/src/security/security_dac.h b/src/security/security_dac.h
> index 02432a5..dbcf56f 100644
> --- a/src/security/security_dac.h
> +++ b/src/security/security_dac.h
> @@ -25,10 +25,9 @@
>  
>  extern virSecurityDriver virSecurityDriverDAC;
>  
> -void virSecurityDACSetUser(virSecurityManagerPtr mgr,
> -                           uid_t user);
> -void virSecurityDACSetGroup(virSecurityManagerPtr mgr,
> -                            gid_t group);
> +int virSecurityDACSetUserAndGroup(virSecurityManagerPtr mgr,
> +                                  uid_t user,
> +                                  gid_t group);

It would be desirable to have this re-factoring done in a separate,
prior, patch from that which adds the GetBaseLabel hook.

> diff --git a/src/security/security_manager.c b/src/security/security_manager.c
> index 92fb504..c4b8f10 100644
> --- a/src/security/security_manager.c
> +++ b/src/security/security_manager.c
> @@ -146,8 +146,10 @@ virSecurityManagerPtr virSecurityManagerNewDAC(const char *virtDriver,
>      if (!mgr)
>          return NULL;
>  
> -    virSecurityDACSetUser(mgr, user);
> -    virSecurityDACSetGroup(mgr, group);
> +    if (virSecurityDACSetUserAndGroup(mgr, user, group) < 0) {
> +        virSecurityManagerDispose(mgr);
> +        return NULL;
> +    }

Likewise this block


> diff --git a/src/security/security_selinux.c b/src/security/security_selinux.c
> index 38de060..1c2ea64 100644
> --- a/src/security/security_selinux.c
> +++ b/src/security/security_selinux.c
> @@ -1827,6 +1827,17 @@ virSecuritySELinuxRestoreSecuritySmartcardCallback(virDomainDefPtr def,
>  }
>  
>  
> +static const char *
> +virSecuritySELinuxGetBaseLabel(virSecurityManagerPtr mgr, int virtType)
> +{
> +    virSecuritySELinuxDataPtr priv = virSecurityManagerGetPrivateData(mgr);
> +    if (virtType == VIR_DOMAIN_VIRT_QEMU)
> +        return priv->alt_domain_context;

alt_domain_context is not guaranteed to be present, so you need to have

   if (virtType == VIR_DOMAIN_VIRT_QEMU && priv->alt_domain_context)
       ....


Daniel
-- 
|: http://berrange.com      -o-    http://www.flickr.com/photos/dberrange/ :|
|: http://libvirt.org              -o-             http://virt-manager.org :|
|: http://autobuild.org       -o-         http://search.cpan.org/~danberr/ :|
|: http://entangle-photo.org       -o-       http://live.gnome.org/gtk-vnc :|




More information about the libvir-list mailing list