[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]
[Qemu-devel] [PULL 09/15] migration: add support for a "tls-authz" migra
From: |
Juan Quintela |
Subject: |
[Qemu-devel] [PULL 09/15] migration: add support for a "tls-authz" migration parameter |
Date: |
Mon, 25 Mar 2019 18:47:00 +0100 |
From: "Daniel P. Berrange" <address@hidden>
The QEMU instance that runs as the server for the migration data
transport (ie the target QEMU) needs to be able to configure access
control so it can prevent unauthorized clients initiating an incoming
migration. This adds a new 'tls-authz' migration parameter that is used
to provide the QOM ID of a QAuthZ subclass instance that provides the
access control check. This is checked against the x509 certificate
obtained during the TLS handshake.
For example, when starting a QEMU for incoming migration, it is
possible to give an example identity of the source QEMU that is
intended to be connecting later:
$QEMU \
-monitor stdio \
-incoming defer \
...other args...
(qemu) object_add tls-creds-x509,id=tls0,dir=/home/berrange/qemutls,\
endpoint=server,verify-peer=yes \
(qemu) object_add authz-simple,id=auth0,identity=CN=laptop.example.com,,\
O=Example Org,,L=London,,ST=London,,C=GB \
(qemu) migrate_incoming tcp:localhost:9000
Reviewed-by: Juan Quintela <address@hidden>
Signed-off-by: Daniel P. Berrange <address@hidden>
Signed-off-by: Juan Quintela <address@hidden>
---
hmp.c | 9 +++++++++
migration/migration.c | 8 ++++++++
migration/tls.c | 2 +-
qapi/migration.json | 14 +++++++++++++-
4 files changed, 31 insertions(+), 2 deletions(-)
diff --git a/hmp.c b/hmp.c
index 6bbbe1ad85..92941142af 100644
--- a/hmp.c
+++ b/hmp.c
@@ -441,6 +441,9 @@ void hmp_info_migrate_parameters(Monitor *mon, const QDict
*qdict)
monitor_printf(mon, "%s: %" PRIu64 "\n",
MigrationParameter_str(MIGRATION_PARAMETER_MAX_POSTCOPY_BANDWIDTH),
params->max_postcopy_bandwidth);
+ monitor_printf(mon, " %s: '%s'\n",
+ MigrationParameter_str(MIGRATION_PARAMETER_TLS_AUTHZ),
+ params->has_tls_authz ? params->tls_authz : "");
}
qapi_free_MigrationParameters(params);
@@ -1783,6 +1786,12 @@ void hmp_migrate_set_parameter(Monitor *mon, const QDict
*qdict)
p->tls_hostname->type = QTYPE_QSTRING;
visit_type_str(v, param, &p->tls_hostname->u.s, &err);
break;
+ case MIGRATION_PARAMETER_TLS_AUTHZ:
+ p->has_tls_authz = true;
+ p->tls_authz = g_new0(StrOrNull, 1);
+ p->tls_authz->type = QTYPE_QSTRING;
+ visit_type_str(v, param, &p->tls_authz->u.s, &err);
+ break;
case MIGRATION_PARAMETER_MAX_BANDWIDTH:
p->has_max_bandwidth = true;
/*
diff --git a/migration/migration.c b/migration/migration.c
index b36cf9c9a0..d5c218a22b 100644
--- a/migration/migration.c
+++ b/migration/migration.c
@@ -757,6 +757,8 @@ MigrationParameters *qmp_query_migrate_parameters(Error
**errp)
params->tls_creds = g_strdup(s->parameters.tls_creds);
params->has_tls_hostname = true;
params->tls_hostname = g_strdup(s->parameters.tls_hostname);
+ params->has_tls_authz = true;
+ params->tls_authz = g_strdup(s->parameters.tls_authz);
params->has_max_bandwidth = true;
params->max_bandwidth = s->parameters.max_bandwidth;
params->has_downtime_limit = true;
@@ -1331,6 +1333,12 @@ static void migrate_params_apply(MigrateSetParameters
*params, Error **errp)
s->parameters.tls_hostname = g_strdup(params->tls_hostname->u.s);
}
+ if (params->has_tls_authz) {
+ g_free(s->parameters.tls_authz);
+ assert(params->tls_authz->type == QTYPE_QSTRING);
+ s->parameters.tls_authz = g_strdup(params->tls_authz->u.s);
+ }
+
if (params->has_max_bandwidth) {
s->parameters.max_bandwidth = params->max_bandwidth;
if (s->to_dst_file) {
diff --git a/migration/tls.c b/migration/tls.c
index 3b9e8c9263..5171afc6c4 100644
--- a/migration/tls.c
+++ b/migration/tls.c
@@ -94,7 +94,7 @@ void migration_tls_channel_process_incoming(MigrationState *s,
tioc = qio_channel_tls_new_server(
ioc, creds,
- NULL, /* XXX pass ACL name */
+ s->parameters.tls_authz,
errp);
if (!tioc) {
return;
diff --git a/qapi/migration.json b/qapi/migration.json
index ff3616f4c2..0a85aadd15 100644
--- a/qapi/migration.json
+++ b/qapi/migration.json
@@ -541,6 +541,12 @@
# hostname must be provided so that the server's x509
# certificate identity can be validated. (Since 2.7)
#
+# @tls-authz: ID of the 'authz' object subclass that provides access control
+# checking of the TLS x509 certificate distinguished name.
+# This object is only resolved at time of use, so can be deleted
+# and recreated on the fly while the migration server is active.
+# If missing, it will default to denying access (Since 4.0)
+#
# @max-bandwidth: to set maximum speed for migration. maximum speed in
# bytes per second. (Since 2.8)
#
@@ -582,7 +588,7 @@
'compress-level', 'compress-threads', 'decompress-threads',
'compress-wait-thread',
'cpu-throttle-initial', 'cpu-throttle-increment',
- 'tls-creds', 'tls-hostname', 'max-bandwidth',
+ 'tls-creds', 'tls-hostname', 'tls-authz', 'max-bandwidth',
'downtime-limit', 'x-checkpoint-delay', 'block-incremental',
'multifd-channels',
'xbzrle-cache-size', 'max-postcopy-bandwidth',
@@ -693,6 +699,7 @@
'*cpu-throttle-increment': 'int',
'*tls-creds': 'StrOrNull',
'*tls-hostname': 'StrOrNull',
+ '*tls-authz': 'StrOrNull',
'*max-bandwidth': 'int',
'*downtime-limit': 'int',
'*x-checkpoint-delay': 'int',
@@ -773,6 +780,10 @@
# associated with the migration URI, if any. (Since 2.9)
# Note: 2.8 reports this by omitting tls-hostname instead.
#
+# @tls-authz: ID of the 'authz' object subclass that provides access control
+# checking of the TLS x509 certificate distinguished name. (Since
+# 4.0)
+#
# @max-bandwidth: to set maximum speed for migration. maximum speed in
# bytes per second. (Since 2.8)
#
@@ -821,6 +832,7 @@
'*cpu-throttle-increment': 'uint8',
'*tls-creds': 'str',
'*tls-hostname': 'str',
+ '*tls-authz': 'str',
'*max-bandwidth': 'size',
'*downtime-limit': 'uint64',
'*x-checkpoint-delay': 'uint32',
--
2.20.1
- [Qemu-devel] [PULL 00/15] Migration patches, Juan Quintela, 2019/03/25
- [Qemu-devel] [PULL 15/15] migration/postcopy: Update the bandwidth during postcopy, Juan Quintela, 2019/03/25
- [Qemu-devel] [PULL 13/15] Migration/colo.c: Add the necessary checks for colo_do_failover, Juan Quintela, 2019/03/25
- [Qemu-devel] [PULL 14/15] Migration/colo.c: Make user obtain the last COLO mode info after failover, Juan Quintela, 2019/03/25
- [Qemu-devel] [PULL 09/15] migration: add support for a "tls-authz" migration parameter,
Juan Quintela <=
- [Qemu-devel] [PULL 10/15] migration/rdma: Check qemu_rdma_init_one_block, Juan Quintela, 2019/03/25
- [Qemu-devel] [PULL 07/15] multifd: Add some padding, Juan Quintela, 2019/03/25
- [Qemu-devel] [PULL 02/15] multifd: Rename "size" member to pages_alloc, Juan Quintela, 2019/03/25
- [Qemu-devel] [PULL 12/15] Migration/colo.c: Add new COLOExitReason to handle all failover state, Juan Quintela, 2019/03/25
- [Qemu-devel] [PULL 11/15] Migration/colo.c: Fix COLO failover status error, Juan Quintela, 2019/03/25
- [Qemu-devel] [PULL 06/15] multifd: Change default packet size, Juan Quintela, 2019/03/25
- [Qemu-devel] [PULL 08/15] multifd: Drop x-, Juan Quintela, 2019/03/25
- [Qemu-devel] [PULL 05/15] multifd: Be flexible about packet size, Juan Quintela, 2019/03/25
- [Qemu-devel] [PULL 03/15] multifd: Create new next_packet_size field, Juan Quintela, 2019/03/25