From: "Daniel P. Berrange" <berrange@redhat.com>
To: qemu-devel@nongnu.org
Cc: Kevin Wolf <kwolf@redhat.com>,
Paolo Bonzini <pbonzini@redhat.com>,
Max Reitz <mreitz@redhat.com>
Subject: [Qemu-devel] [PATCH v5 15/16] nbd: enable use of TLS with qemu-nbd server
Date: Thu, 4 Feb 2016 13:50:21 +0000 [thread overview]
Message-ID: <1454593822-7321-16-git-send-email-berrange@redhat.com> (raw)
In-Reply-To: <1454593822-7321-1-git-send-email-berrange@redhat.com>
This modifies the qemu-nbd program so that it is possible to
request the use of TLS with the server. It simply adds a new
command line option --tls-creds which is used to provide the
ID of a QCryptoTLSCreds object previously created via the
--object command line option.
For example
qemu-nbd --object tls-creds-x509,id=tls0,endpoint=server,\
dir=/home/berrange/security/qemutls \
--tls-creds tls0 \
--exportname default
TLS requires the new style NBD protocol, so if no export name
is set (via --export-name), then we use the default NBD protocol
export name ""
TLS is only supported when using an IPv4/IPv6 socket listener.
It is not possible to use with UNIX sockets, which includes
when connecting the NBD server to a host device.
Signed-off-by: Daniel P. Berrange <berrange@redhat.com>
---
qemu-nbd.c | 62 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++-
qemu-nbd.texi | 4 ++++
2 files changed, 65 insertions(+), 1 deletion(-)
diff --git a/qemu-nbd.c b/qemu-nbd.c
index 27c27e0..ab1aed9 100644
--- a/qemu-nbd.c
+++ b/qemu-nbd.c
@@ -43,6 +43,7 @@
#define QEMU_NBD_OPT_DISCARD 3
#define QEMU_NBD_OPT_DETECT_ZEROES 4
#define QEMU_NBD_OPT_OBJECT 5
+#define QEMU_NBD_OPT_TLSCREDS 6
static NBDExport *exp;
static bool newproto;
@@ -55,6 +56,7 @@ static int shared = 1;
static int nb_fds;
static QIOChannelSocket *server_ioc;
static int server_watch = -1;
+static QCryptoTLSCreds *tlscreds;
static void usage(const char *name)
{
@@ -343,7 +345,7 @@ static gboolean nbd_accept(QIOChannel *ioc, GIOCondition cond, gpointer opaque)
nb_fds++;
nbd_update_server_watch();
nbd_client_new(newproto ? NULL : exp, cioc,
- NULL, NULL, nbd_client_closed);
+ tlscreds, NULL, nbd_client_closed);
object_unref(OBJECT(cioc));
return TRUE;
@@ -403,6 +405,37 @@ static QemuOptsList qemu_object_opts = {
};
+
+static QCryptoTLSCreds *nbd_get_tls_creds(const char *id, Error **errp)
+{
+ Object *obj;
+ QCryptoTLSCreds *creds;
+
+ obj = object_resolve_path_component(
+ object_get_objects_root(), id);
+ if (!obj) {
+ error_setg(errp, "No TLS credentials with id '%s'",
+ id);
+ return NULL;
+ }
+ creds = (QCryptoTLSCreds *)
+ object_dynamic_cast(obj, TYPE_QCRYPTO_TLS_CREDS);
+ if (!creds) {
+ error_setg(errp, "Object with id '%s' is not TLS credentials",
+ id);
+ return NULL;
+ }
+
+ if (creds->endpoint != QCRYPTO_TLS_CREDS_ENDPOINT_SERVER) {
+ error_setg(errp,
+ "Expecting TLS credentials with a server endpoint");
+ return NULL;
+ }
+ object_ref(obj);
+ return creds;
+}
+
+
int main(int argc, char **argv)
{
BlockBackend *blk;
@@ -442,6 +475,7 @@ int main(int argc, char **argv)
{ "verbose", 0, NULL, 'v' },
{ "object", 1, NULL, QEMU_NBD_OPT_OBJECT },
{ "export-name", 1, NULL, 'x' },
+ { "tls-creds", 1, NULL, QEMU_NBD_OPT_TLSCREDS },
{ NULL, 0, NULL, 0 }
};
int ch;
@@ -459,6 +493,7 @@ int main(int argc, char **argv)
BlockdevDetectZeroesOptions detect_zeroes = BLOCKDEV_DETECT_ZEROES_OPTIONS_OFF;
QDict *options = NULL;
const char *export_name = NULL;
+ const char *tlscredsid = NULL;
/* The client thread uses SIGTERM to interrupt the server. A signal
* handler ensures that "qemu-nbd -v -c" exits with a nice status code.
@@ -635,6 +670,9 @@ int main(int argc, char **argv)
exit(EXIT_FAILURE);
}
} break;
+ case QEMU_NBD_OPT_TLSCREDS:
+ tlscredsid = optarg;
+ break;
}
}
@@ -651,6 +689,28 @@ int main(int argc, char **argv)
exit(EXIT_FAILURE);
}
+ if (tlscredsid) {
+ if (sockpath) {
+ error_report("TLS is only supported with IPv4/IPv6");
+ exit(EXIT_FAILURE);
+ }
+ if (device) {
+ error_report("TLS is not supported with a host device");
+ exit(EXIT_FAILURE);
+ }
+ if (!export_name) {
+ /* Set the default NBD protocol export name, since
+ * we *must* use new style protocol for TLS */
+ export_name = "";
+ }
+ tlscreds = nbd_get_tls_creds(tlscredsid, &local_err);
+ if (local_err) {
+ error_report("Failed to get TLS creds %s",
+ error_get_pretty(local_err));
+ exit(EXIT_FAILURE);
+ }
+ }
+
if (disconnect) {
int nbdfd = open(argv[optind], O_RDWR);
if (nbdfd < 0) {
diff --git a/qemu-nbd.texi b/qemu-nbd.texi
index 5fbe486..edeaf9f 100644
--- a/qemu-nbd.texi
+++ b/qemu-nbd.texi
@@ -66,6 +66,10 @@ Export QEMU disk image using NBD protocol.
@item -x NAME, --export-name=NAME
set the NDB volume export name. This switches the server to use
the new style NBD protocol negotiation
+@item --tls-creds=ID
+ enable mandatory TLS encryption for the server by setting the ID
+ of the TLS credentials object previously created with the --object
+ option.
@item -v, --verbose
display extra debugging information
@item -h, --help
--
2.5.0
next prev parent reply other threads:[~2016-02-04 13:51 UTC|newest]
Thread overview: 19+ messages / expand[flat|nested] mbox.gz Atom feed top
2016-02-04 13:50 [Qemu-devel] [PATCH v5 00/16] Implement TLS support to QEMU NBD server & client Daniel P. Berrange
2016-02-04 13:50 ` [Qemu-devel] [PATCH v5 01/16] qom: add helpers for UserCreatable object types Daniel P. Berrange
2016-02-04 13:50 ` [Qemu-devel] [PATCH v5 02/16] qemu-nbd: add support for --object command line arg Daniel P. Berrange
2016-02-04 13:50 ` [Qemu-devel] [PATCH v5 03/16] nbd: convert block client to use I/O channels for connection setup Daniel P. Berrange
2016-02-04 13:50 ` [Qemu-devel] [PATCH v5 04/16] nbd: convert qemu-nbd server " Daniel P. Berrange
2016-02-04 13:50 ` [Qemu-devel] [PATCH v5 05/16] nbd: convert blockdev NBD " Daniel P. Berrange
2016-02-04 13:50 ` [Qemu-devel] [PATCH v5 06/16] nbd: convert to using I/O channels for actual socket I/O Daniel P. Berrange
2016-02-04 13:50 ` [Qemu-devel] [PATCH v5 07/16] nbd: invert client logic for negotiating protocol version Daniel P. Berrange
2016-02-04 13:50 ` [Qemu-devel] [PATCH v5 08/16] nbd: make server compliant with fixed newstyle spec Daniel P. Berrange
2016-02-04 13:50 ` [Qemu-devel] [PATCH v5 09/16] nbd: make client request fixed new style if advertized Daniel P. Berrange
2016-02-04 13:50 ` [Qemu-devel] [PATCH v5 10/16] nbd: allow setting of an export name for qemu-nbd server Daniel P. Berrange
2016-02-04 13:50 ` [Qemu-devel] [PATCH v5 11/16] nbd: always query export list in fixed new style protocol Daniel P. Berrange
2016-02-04 13:50 ` [Qemu-devel] [PATCH v5 12/16] nbd: use "" as a default export name if none provided Daniel P. Berrange
2016-02-04 13:50 ` [Qemu-devel] [PATCH v5 13/16] nbd: implement TLS support in the protocol negotiation Daniel P. Berrange
2016-02-04 13:50 ` [Qemu-devel] [PATCH v5 14/16] nbd: enable use of TLS with NBD block driver Daniel P. Berrange
2016-02-04 13:50 ` Daniel P. Berrange [this message]
2016-02-04 13:50 ` [Qemu-devel] [PATCH v5 16/16] nbd: enable use of TLS with nbd-server-start command Daniel P. Berrange
2016-02-04 16:25 ` Eric Blake
2016-02-04 16:30 ` Daniel P. Berrange
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=1454593822-7321-16-git-send-email-berrange@redhat.com \
--to=berrange@redhat.com \
--cc=kwolf@redhat.com \
--cc=mreitz@redhat.com \
--cc=pbonzini@redhat.com \
--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 an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.