[libvirt] [PATCH v2]LXC: Helper function for checking ownership of dir when userns enabled

Chen HanXiao chenhanxiao at cn.fujitsu.com
Tue Aug 20 09:52:50 UTC 2013


Hi
	Any comments?

Thanks

> -----Original Message-----
> From: libvir-list-bounces at redhat.com
[mailto:libvir-list-bounces at redhat.com]
> On Behalf Of Chen HanXiao
> Sent: Wednesday, August 14, 2013 9:30 AM
> To: 'Daniel P. Berrange'
> Cc: libvir-list at redhat.com
> Subject: Re: [libvirt] [PATCH v2]LXC: Helper function for checking
ownership of
> dir when userns enabled
> 
> 
> 
> > -----Original Message-----
> > From: Daniel P. Berrange [mailto:berrange at redhat.com]
> > Sent: Saturday, August 10, 2013 12:54 AM
> > To: Chen Hanxiao
> > Cc: libvir-list at redhat.com
> > Subject: Re: [libvirt] [PATCH v2]LXC: Helper function for checking
ownership of
> > dir when userns enabled
> >
> > On Fri, Aug 09, 2013 at 04:05:58PM +0800, Chen Hanxiao wrote:
> > > From: Chen Hanxiao <chenhanxiao at cn.fujitsu.com>
> > >
> > > If we enable userns, the ownership of dir we provided for containers
> > > should match the uid/gid in idmap.
> > > Currently, the debug log is very implicit or misleading sometimes.
> > > This patch will help clarify this for us when using
> > > debug log or virsh.
> >
> > I do recall hitting some permission issue once, but can't remember
> > just what it was. Can you describe exactly how to reproduce the
> > problem ?
> >
> 
> 1)  Enable user namespace in kernel
> 2)  Add idmap for container
> 3)  Don't change the ownership of devices/ filesystem/ source dir  ( leave
> them to 'root' for instance)
> 4)  Start the container
> 
> Usually I got an input/output error by virsh, which is not a good hint.
> 
> 
> > > Signed-off-by: Chen Hanxiao <chenhanxiao at cn.fujitsu.com>
> > > ---
> > >  src/lxc/lxc_container.c |   46
> > ++++++++++++++++++++++++++++++++++++++++++++++
> > >  1 files changed, 46 insertions(+), 0 deletions(-)
> > >
> > > diff --git a/src/lxc/lxc_container.c b/src/lxc/lxc_container.c
> > > index b910b10..2ccdc61 100644
> > > --- a/src/lxc/lxc_container.c
> > > +++ b/src/lxc/lxc_container.c
> > > @@ -1815,6 +1815,49 @@ lxcNeedNetworkNamespace(virDomainDefPtr
> > def)
> > >      return false;
> > >  }
> > >
> > > +/*
> > > + * Helper function for helping check
> > > + * whether we have enough privilege
> > > + * to operate the source dir when userns enabled
> > > + * @vmDef: pointer to vm definition structure
> > > + * Returns 0 on success or -1 in case of error
> > > + */
> > > +static int
> > > +lxcContainerUsernsSrcOwnershipCheck(virDomainDefPtr vmDef)
> > > +{
> > > +    struct stat buf;
> > > +    size_t i;
> > > +    uid_t uid;
> > > +    gid_t gid;
> > > +
> > > +    VIR_DEBUG("vmDef->nfss %d", (int)vmDef->nfss);
> > > +    for (i = 0; i < vmDef->nfss; i++) {
> > > +        VIR_DEBUG("dst is %s, src is %s",
> > > +                  vmDef->fss[i]->dst,
> > > +                  vmDef->fss[i]->src);
> > > +
> > > +        uid = vmDef->idmap.uidmap[0].target;
> > > +        gid = vmDef->idmap.gidmap[0].target;
> > > +
> > > +        if (lstat(vmDef->fss[i]->src, &buf) < 0) {
> > > +            virReportSystemError(errno, _("Cannot access '%s'"),
> > > +                                 vmDef->fss[i]->src);
> > > +            return -1;
> > > +        } else if (uid != buf.st_uid || gid != buf.st_gid) {
> > > +            VIR_DEBUG("In userns uid is %d, gid is %d\n",
> > > +                      uid, gid);
> > > +            errno = EINVAL;
> > > +
> > > +            virReportSystemError(errno,
> > > +                                  _("[userns] Src dir '%s' does not
> > belong to uid/gid: %d/%d"),
> > > +                                 vmDef->fss[i]->src, uid, gid);
> > > +            return -1;
> > > +        }
> > > +    }
> > > +
> > > +    return 0;
> > > +}
> > > +
> > >  /**
> > >   * lxcContainerStart:
> > >   * @def: pointer to virtual machine structure
> > > @@ -1866,6 +1909,9 @@ int lxcContainerStart(virDomainDefPtr def,
> > >          if (userns_supported()) {
> > >              VIR_DEBUG("Enable user namespace");
> > >              cflags |= CLONE_NEWUSER;
> > > +            if (lxcContainerUsernsSrcOwnershipCheck(def) < 0) {
> > > +                return -1;
> > > +            }
> > >          } else {
> > >              virReportSystemError(VIR_ERR_CONFIG_UNSUPPORTED,
> > "%s",
> > >                                   _("Kernel doesn't support user
> > namespace"));
> >
> >
> > 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 :|
> 
> 
> 
> --
> libvir-list mailing list
> libvir-list at redhat.com
> https://www.redhat.com/mailman/listinfo/libvir-list





More information about the libvir-list mailing list