On Mon, Feb 03, 2020 at 07:36:09PM +0100, Ján Tomko wrote: > [adding virtiofs list] > > On Mon, Feb 03, 2020 at 04:43:51PM +0000, Daniel P. Berrangé wrote: > > On Thu, Jan 30, 2020 at 06:06:26PM +0100, Ján Tomko wrote: > > > Start virtiofsd for each <filesystem> device using it. > > > > > > Pre-create the socket for communication with QEMU and pass it > > > to virtiofsd. > > > > > > Note that virtiofsd needs to run as root. > > > > So we're not able to use virtiofsd with the session libvirtd > > which runs completely unprivileged ? > > > > Not with the version of virtiofsd currently merged in the QEMU tree. > > > I can understand the need to run as root if we want to support > > chown() of files, or DAC_OVERRIDE, but I'm surprised it isn't > > possible to run virtiofsd unprivileged & simply have a reduced > > featureset where it can only create files as that one user. > > > > Apart from the possibly missing features (I don't know how well > virtiofsd internals are ready for those), current version of the > daemon sets up namespaces and the seccomp sandbox. > > > > > > +int > > > +qemuVirtioFSStart(virLogManagerPtr logManager, > > > + virQEMUDriverPtr driver, > > > + virDomainObjPtr vm, > > > + virDomainFSDefPtr fs) > > > +{ > > > + g_autoptr(virQEMUDriverConfig) cfg = virQEMUDriverGetConfig(driver); > > > + g_autoptr(virCommand) cmd = NULL; > > > + g_autofree char *socket_path = NULL; > > > + g_autofree char *pidfile = NULL; > > > + g_autofree char *logpath = NULL; > > > + pid_t pid = (pid_t) -1; > > > + VIR_AUTOCLOSE fd = -1; > > > + VIR_AUTOCLOSE logfd = -1; > > > + int ret = -1; > > > + int rc; > > > > > + > > > + if (!(pidfile = qemuVirtioFSCreatePidFilename(cfg, vm->def, fs->info.alias))) > > > + goto cleanup; > > > + > > > + if (!(socket_path = qemuVirtioFSCreateSocketFilename(vm, fs->info.alias))) > > > + goto cleanup; > > > + > > > + if ((fd = qemuVirtioFSOpenChardev(driver, vm, socket_path)) < 0) > > > + goto cleanup; > > > + > > > + logpath = qemuVirtioFSCreateLogFilename(cfg, vm->def, fs->info.alias); > > > + > > > + if (cfg->stdioLogD) { > > > + if ((logfd = virLogManagerDomainOpenLogFile(logManager, > > > + "qemu", > > > + vm->def->uuid, > > > + vm->def->name, > > > + logpath, > > > + 0, > > > + NULL, NULL)) < 0) > > > + goto cleanup; > > > + } else { > > > + if ((logfd = open(logpath, O_WRONLY | O_CREAT | O_APPEND, S_IRUSR | S_IWUSR)) < 0) { > > > + virReportSystemError(errno, _("failed to create logfile %s"), > > > + logpath); > > > + goto cleanup; > > > + } > > > + if (virSetCloseExec(logfd) < 0) { > > > + virReportSystemError(errno, _("failed to set close-on-exec flag on %s"), > > > + logpath); > > > + goto error; > > > + } > > > + } > > > + > > > + if (!(cmd = qemuVirtioFSBuildCommandLine(cfg, fs, &fd))) > > > + goto cleanup; > > > + > > > + virCommandSetPidFile(cmd, pidfile); > > > + virCommandSetOutputFD(cmd, &logfd); > > > + virCommandSetErrorFD(cmd, &logfd); > > > + virCommandNonblockingFDs(cmd); > > > + virCommandDaemonize(cmd); > > > > We're not mandating "root" here, it is just inheriting the user that > > libvirtd runs as. So IIUC ,this will run virtofsd as non-root when > > used with session libvirtd, unless there's a check somewhere else > > that prevents this scenario ? > > I'll add a check. > > > > > I'm also wondering about cgroups placement in this method, and > > any use of SELinux > > > > Placing it into a cgroup should be easy, AFAIK it does not need to > access any devices. > > As for SELinux, I don't think there's anything to be done other than > updating the selinux-policy. Recursively relabeling the whole directory > feels intrusive. Even if we don't do relabelling, we'll still need more than just policy work I believe. If we assume a new "virtiofsd_t" SELinux type. Ff QEMU is launched svirt_t:s0:c123,c532, we will need to explicitly spawn virtiofsd with the matching MCS category eg virtiofsd_t:s0:c123,c532. The policy should be written such that the UNIX domain socket used for comms between QEMU and virtiofsd requires this matching MCS category label. This ensures that QEMU Guest-A can't connect to a virtiofsd used by QEMU Guest-B and vica-verca. Regards, Daniel -- |: https://berrange.com -o- https://www.flickr.com/photos/dberrange :| |: https://libvirt.org -o- https://fstop138.berrange.com :| |: https://entangle-photo.org -o- https://www.instagram.com/dberrange :|