From: Anthony Liguori <anthony@codemonkey.ws>
To: qemu-devel@nongnu.org
Subject: [Qemu-devel] [6652] chroot and change user support (Nolan)
Date: Fri, 27 Feb 2009 22:09:45 +0000 [thread overview]
Message-ID: <E1LdAtt-0001f7-QI@cvs.savannah.gnu.org> (raw)
Revision: 6652
http://svn.sv.gnu.org/viewvc/?view=rev&root=qemu&revision=6652
Author: aliguori
Date: 2009-02-27 22:09:45 +0000 (Fri, 27 Feb 2009)
Log Message:
-----------
chroot and change user support (Nolan)
Resent with fixed formatting.
This patch adds two new command line options:
-chroot <dir>
-runas <user>
This is useful for running qemu as an unprivileged user in a chroot
jail. To avoid having to populate the jail, chrooting happens right
before the start of guest execution.
Signed-off-by: Nolan Leake <nolan@sigbus.net>
Signed-off-by: Anthony Liguori <aliguori@us.ibm.com>
Modified Paths:
--------------
trunk/qemu-doc.texi
trunk/vl.c
Modified: trunk/qemu-doc.texi
===================================================================
--- trunk/qemu-doc.texi 2009-02-27 20:14:29 UTC (rev 6651)
+++ trunk/qemu-doc.texi 2009-02-27 22:09:45 UTC (rev 6652)
@@ -1161,6 +1161,14 @@
@item -echr 20
@end table
+@item -chroot dir
+Immediately before starting guest execution, chroot to the specified
+directory. Especially useful in combination with -runas.
+
+@item -runas user
+Immediately before starting guest execution, drop root privileges, switching
+to the specified user.
+
@end table
@c man end
Modified: trunk/vl.c
===================================================================
--- trunk/vl.c 2009-02-27 20:14:29 UTC (rev 6651)
+++ trunk/vl.c 2009-02-27 22:09:45 UTC (rev 6652)
@@ -52,6 +52,7 @@
#include <zlib.h>
#ifndef _WIN32
+#include <pwd.h>
#include <sys/times.h>
#include <sys/wait.h>
#include <termios.h>
@@ -4075,6 +4076,10 @@
#endif
"-tb-size n set TB size\n"
"-incoming p prepare for incoming migration, listen on port p\n"
+#ifndef _WIN32
+ "-chroot dir Chroot to dir just before starting the VM.\n"
+ "-runas user Change to user id user just before starting the VM.\n"
+#endif
"\n"
"During emulation, the following keys are useful:\n"
"ctrl-alt-f toggle full screen\n"
@@ -4192,6 +4197,8 @@
QEMU_OPTION_old_param,
QEMU_OPTION_tb_size,
QEMU_OPTION_incoming,
+ QEMU_OPTION_chroot,
+ QEMU_OPTION_runas,
};
typedef struct QEMUOption {
@@ -4322,6 +4329,8 @@
#endif
{ "tb-size", HAS_ARG, QEMU_OPTION_tb_size },
{ "incoming", HAS_ARG, QEMU_OPTION_incoming },
+ { "chroot", HAS_ARG, QEMU_OPTION_chroot },
+ { "runas", HAS_ARG, QEMU_OPTION_runas },
{ NULL },
};
@@ -4632,6 +4641,10 @@
const char *pid_file = NULL;
int autostart;
const char *incoming = NULL;
+ int fd;
+ struct passwd *pwd;
+ const char *chroot_dir = NULL;
+ const char *run_as = NULL;
qemu_cache_utils_init(envp);
@@ -5287,6 +5300,12 @@
case QEMU_OPTION_incoming:
incoming = optarg;
break;
+ case QEMU_OPTION_chroot:
+ chroot_dir = optarg;
+ break;
+ case QEMU_OPTION_runas:
+ run_as = optarg;
+ break;
}
}
}
@@ -5739,7 +5758,6 @@
if (daemonize) {
uint8_t status = 0;
ssize_t len;
- int fd;
again1:
len = write(fds[1], &status, 1);
@@ -5753,14 +5771,49 @@
TFR(fd = open("/dev/null", O_RDWR));
if (fd == -1)
exit(1);
+ }
- dup2(fd, 0);
- dup2(fd, 1);
- dup2(fd, 2);
+#ifndef _WIN32
+ if (run_as) {
+ pwd = getpwnam(run_as);
+ if (!pwd) {
+ fprintf(stderr, "User \"%s\" doesn't exist\n", run_as);
+ exit(1);
+ }
+ }
- close(fd);
+ if (chroot_dir) {
+ if (chroot(chroot_dir) < 0) {
+ fprintf(stderr, "chroot failed\n");
+ exit(1);
+ }
+ chdir("/");
}
+ if (run_as) {
+ if (setgid(pwd->pw_gid) < 0) {
+ fprintf(stderr, "Failed to setgid(%d)\n", pwd->pw_gid);
+ exit(1);
+ }
+ if (setuid(pwd->pw_uid) < 0) {
+ fprintf(stderr, "Failed to setuid(%d)\n", pwd->pw_uid);
+ exit(1);
+ }
+ if (setuid(0) != -1) {
+ fprintf(stderr, "Dropping privileges failed\n");
+ exit(1);
+ }
+ }
+#endif
+
+ if (daemonize) {
+ dup2(fd, 0);
+ dup2(fd, 1);
+ dup2(fd, 2);
+
+ close(fd);
+ }
+
main_loop();
quit_timers();
net_cleanup();
reply other threads:[~2009-02-27 22:09 UTC|newest]
Thread overview: [no followups] expand[flat|nested] mbox.gz Atom feed
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=E1LdAtt-0001f7-QI@cvs.savannah.gnu.org \
--to=anthony@codemonkey.ws \
--cc=qemu-devel@nongnu.org \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for NNTP newsgroup(s).