[libvirt] [PATCH v3 2/3] security: Introduce SetSocketLabel

Daniel Veillard veillard at redhat.com
Fri Aug 26 09:00:06 UTC 2011


On Fri, Aug 26, 2011 at 10:23:47AM +0200, Jiri Denemark wrote:
> This API labels all sockets created until ClearSocketLabel is called in
> a way that a vm can access them (i.e., they are labeled with svirt_t
> based label in SELinux).
> ---
> Notes:
>     Version 3:
>     - new patch
> 
>  src/libvirt_private.syms        |    1 +
>  src/security/security_dac.c     |    9 +++++++++
>  src/security/security_driver.h  |    3 +++
>  src/security/security_manager.c |   10 ++++++++++
>  src/security/security_manager.h |    2 ++
>  src/security/security_nop.c     |    7 +++++++
>  src/security/security_selinux.c |   38 ++++++++++++++++++++++++++++++++++++++
>  src/security/security_stack.c   |   17 +++++++++++++++++
>  8 files changed, 87 insertions(+), 0 deletions(-)
> 
> diff --git a/src/libvirt_private.syms b/src/libvirt_private.syms
> index c3e33b4..2a453bc 100644
> --- a/src/libvirt_private.syms
> +++ b/src/libvirt_private.syms
> @@ -911,6 +911,7 @@ virSecurityManagerSetHostdevLabel;
>  virSecurityManagerSetProcessFDLabel;
>  virSecurityManagerSetProcessLabel;
>  virSecurityManagerSetSavedStateLabel;
> +virSecurityManagerSetSocketLabel;
>  virSecurityManagerVerify;
>  
>  # sexpr.h
> diff --git a/src/security/security_dac.c b/src/security/security_dac.c
> index 6df4087..e5465fc 100644
> --- a/src/security/security_dac.c
> +++ b/src/security/security_dac.c
> @@ -675,6 +675,14 @@ virSecurityDACSetDaemonSocketLabel(virSecurityManagerPtr mgr ATTRIBUTE_UNUSED,
>  
>  
>  static int
> +virSecurityDACSetSocketLabel(virSecurityManagerPtr mgr ATTRIBUTE_UNUSED,
> +                             virDomainObjPtr vm ATTRIBUTE_UNUSED)
> +{
> +    return 0;
> +}
> +
> +
> +static int
>  virSecurityDACClearSocketLabel(virSecurityManagerPtr mgr ATTRIBUTE_UNUSED,
>                                   virDomainObjPtr vm ATTRIBUTE_UNUSED)
>  {
> @@ -715,6 +723,7 @@ virSecurityDriver virSecurityDriverDAC = {
>      virSecurityDACRestoreSecurityImageLabel,
>  
>      virSecurityDACSetDaemonSocketLabel,
> +    virSecurityDACSetSocketLabel,
>      virSecurityDACClearSocketLabel,
>  
>      virSecurityDACGenLabel,
> diff --git a/src/security/security_driver.h b/src/security/security_driver.h
> index 73c8f04..94f27f8 100644
> --- a/src/security/security_driver.h
> +++ b/src/security/security_driver.h
> @@ -43,6 +43,8 @@ typedef int (*virSecurityDomainRestoreImageLabel) (virSecurityManagerPtr mgr,
>                                                     virDomainDiskDefPtr disk);
>  typedef int (*virSecurityDomainSetDaemonSocketLabel)(virSecurityManagerPtr mgr,
>                                                       virDomainObjPtr vm);
> +typedef int (*virSecurityDomainSetSocketLabel) (virSecurityManagerPtr mgr,
> +                                                virDomainObjPtr vm);
>  typedef int (*virSecurityDomainClearSocketLabel)(virSecurityManagerPtr mgr,
>                                                  virDomainObjPtr vm);
>  typedef int (*virSecurityDomainSetImageLabel) (virSecurityManagerPtr mgr,
> @@ -102,6 +104,7 @@ struct _virSecurityDriver {
>      virSecurityDomainRestoreImageLabel domainRestoreSecurityImageLabel;
>  
>      virSecurityDomainSetDaemonSocketLabel domainSetSecurityDaemonSocketLabel;
> +    virSecurityDomainSetSocketLabel domainSetSecuritySocketLabel;
>      virSecurityDomainClearSocketLabel domainClearSecuritySocketLabel;
>  
>      virSecurityDomainGenLabel domainGenSecurityLabel;
> diff --git a/src/security/security_manager.c b/src/security/security_manager.c
> index d30ebcf..b2fd0d0 100644
> --- a/src/security/security_manager.c
> +++ b/src/security/security_manager.c
> @@ -170,6 +170,16 @@ int virSecurityManagerSetDaemonSocketLabel(virSecurityManagerPtr mgr,
>      return -1;
>  }
>  
> +int virSecurityManagerSetSocketLabel(virSecurityManagerPtr mgr,
> +                                     virDomainObjPtr vm)
> +{
> +    if (mgr->drv->domainSetSecuritySocketLabel)
> +        return mgr->drv->domainSetSecuritySocketLabel(mgr, vm);
> +
> +    virSecurityReportError(VIR_ERR_NO_SUPPORT, __FUNCTION__);
> +    return -1;
> +}
> +
>  int virSecurityManagerClearSocketLabel(virSecurityManagerPtr mgr,
>                                         virDomainObjPtr vm)
>  {
> diff --git a/src/security/security_manager.h b/src/security/security_manager.h
> index 8d614a7..38342c2 100644
> --- a/src/security/security_manager.h
> +++ b/src/security/security_manager.h
> @@ -55,6 +55,8 @@ int virSecurityManagerRestoreImageLabel(virSecurityManagerPtr mgr,
>                                          virDomainDiskDefPtr disk);
>  int virSecurityManagerSetDaemonSocketLabel(virSecurityManagerPtr mgr,
>                                             virDomainObjPtr vm);
> +int virSecurityManagerSetSocketLabel(virSecurityManagerPtr mgr,
> +                                     virDomainObjPtr vm);
>  int virSecurityManagerClearSocketLabel(virSecurityManagerPtr mgr,
>                                         virDomainObjPtr vm);
>  int virSecurityManagerSetImageLabel(virSecurityManagerPtr mgr,
> diff --git a/src/security/security_nop.c b/src/security/security_nop.c
> index 67d3ff6..a68a6c0 100644
> --- a/src/security/security_nop.c
> +++ b/src/security/security_nop.c
> @@ -59,6 +59,12 @@ static int virSecurityDomainSetDaemonSocketLabelNop(virSecurityManagerPtr mgr AT
>      return 0;
>  }
>  
> +static int virSecurityDomainSetSocketLabelNop(virSecurityManagerPtr mgr ATTRIBUTE_UNUSED,
> +                                              virDomainObjPtr vm ATTRIBUTE_UNUSED)
> +{
> +    return 0;
> +}
> +
>  static int virSecurityDomainClearSocketLabelNop(virSecurityManagerPtr mgr ATTRIBUTE_UNUSED,
>                                                  virDomainObjPtr vm ATTRIBUTE_UNUSED)
>  {
> @@ -172,6 +178,7 @@ virSecurityDriver virSecurityDriverNop = {
>      virSecurityDomainRestoreImageLabelNop,
>  
>      virSecurityDomainSetDaemonSocketLabelNop,
> +    virSecurityDomainSetSocketLabelNop,
>      virSecurityDomainClearSocketLabelNop,
>  
>      virSecurityDomainGenLabelNop,
> diff --git a/src/security/security_selinux.c b/src/security/security_selinux.c
> index f87c9a5..cddbed5 100644
> --- a/src/security/security_selinux.c
> +++ b/src/security/security_selinux.c
> @@ -1137,6 +1137,43 @@ done:
>  }
>  
>  static int
> +SELinuxSetSecuritySocketLabel(virSecurityManagerPtr mgr,
> +                              virDomainObjPtr vm)
> +{
> +    const virSecurityLabelDefPtr secdef = &vm->def->seclabel;
> +    int rc = -1;
> +
> +    if (secdef->label == NULL)
> +        return 0;
> +
> +    if (!STREQ(virSecurityManagerGetModel(mgr), secdef->model)) {
> +        virSecurityReportError(VIR_ERR_INTERNAL_ERROR,
> +                               _("security label driver mismatch: "
> +                                 "'%s' model configured for domain, but "
> +                                 "hypervisor driver is '%s'."),
> +                               secdef->model, virSecurityManagerGetModel(mgr));
> +        goto done;
> +    }
> +
> +    VIR_DEBUG("Setting VM %s socket context %s",
> +              vm->def->name, secdef->label);
> +    if (setsockcreatecon(secdef->label) == -1) {
> +        virReportSystemError(errno,
> +                             _("unable to set socket security context '%s'"),
> +                             secdef->label);
> +        goto done;
> +    }
> +
> +    rc = 0;
> +
> +done:
> +    if (security_getenforce() != 1)
> +        rc = 0;
> +
> +    return rc;
> +}
> +
> +static int
>  SELinuxClearSecuritySocketLabel(virSecurityManagerPtr mgr,
>                                  virDomainObjPtr vm)
>  {
> @@ -1313,6 +1350,7 @@ virSecurityDriver virSecurityDriverSELinux = {
>      SELinuxRestoreSecurityImageLabel,
>  
>      SELinuxSetSecurityDaemonSocketLabel,
> +    SELinuxSetSecuritySocketLabel,
>      SELinuxClearSecuritySocketLabel,
>  
>      SELinuxGenSecurityLabel,
> diff --git a/src/security/security_stack.c b/src/security/security_stack.c
> index 404ff65..f263f5b 100644
> --- a/src/security/security_stack.c
> +++ b/src/security/security_stack.c
> @@ -355,6 +355,22 @@ virSecurityStackSetDaemonSocketLabel(virSecurityManagerPtr mgr,
>  
>  
>  static int
> +virSecurityStackSetSocketLabel(virSecurityManagerPtr mgr,
> +                               virDomainObjPtr vm)
> +{
> +    virSecurityStackDataPtr priv = virSecurityManagerGetPrivateData(mgr);
> +    int rc = 0;
> +
> +    if (virSecurityManagerSetSocketLabel(priv->secondary, vm) < 0)
> +        rc = -1;
> +    if (virSecurityManagerSetSocketLabel(priv->primary, vm) < 0)
> +        rc = -1;
> +
> +    return rc;
> +}
> +
> +
> +static int
>  virSecurityStackClearSocketLabel(virSecurityManagerPtr mgr,
>                                   virDomainObjPtr vm)
>  {
> @@ -419,6 +435,7 @@ virSecurityDriver virSecurityDriverStack = {
>      virSecurityStackRestoreSecurityImageLabel,
>  
>      virSecurityStackSetDaemonSocketLabel,
> +    virSecurityStackSetSocketLabel,
>      virSecurityStackClearSocketLabel,
>  
>      virSecurityStackGenLabel,

  ACK, looks fine. My only concern would be about availability of
  setsockcreatecon() , hopefully it's supported on all systems where
  SELinux is detected,

Daniel

-- 
Daniel Veillard      | libxml Gnome XML XSLT toolkit  http://xmlsoft.org/
daniel at veillard.com  | Rpmfind RPM search engine http://rpmfind.net/
http://veillard.com/ | virtualization library  http://libvirt.org/




More information about the libvir-list mailing list