On 10/18/2016 07:21 AM, Daniel P. Berrange wrote:
On Tue, Oct 18, 2016 at 06:59:57AM -0400, John Ferlan wrote:
>
>
> On 10/18/2016 02:27 AM, Pavel Hrdina wrote:
> [...]
>
>>>
>>> "As default behaviour I think it is desirable that we can turn TLS on
>>> for every VM at once - I tend to view it as a host network integration
>>> task, rather than a VM configuration task. Same rationale that we use
>>> for TLS wth VNC/SPICE."
>>
>> Don't forget this part of the same review:
>>
>> "There's no reason we can't have a tri-state TLS flag against the
chardev
>> in the XML too, to override the default behaviour of cfg->chardevTLS"
>>
>> That also means to override chardev_tls = "0" by
"tls='yes'".
>
> If the default cfg behaviour is "1", then that tells us "someone"
has
> set up the TLS environment and thus the domain/chardev override would be
> "no".
>
> If the default cfg behaviour is "0", then that means we cannot guarantee
> the environment necessary has been set up and we cannot allow the
> domain/chardev setting to enable TLS.
We have two separate tasks at the host level
- Setup of TLS certificates (ie put the PEM files in the right places)
- Global default for use of TLS by chardevs
We only have a config option in qemu.conf for the latter. ie if
chardev_tls=1, this is implicitly saying that TLS certs are deployed
in right place. IIUC, you're saying that if chardev_tls=0, then we
should interpret that to meant TLS certs are *not* deployed.
If someone has gone through the trouble of setting up their environment
because they found in qemu.conf support was added, why would they set
chardev_tls=0 afterwards? IOW: Are we assuming something or are we over
engineering things?
Why would someone set up and define chardevTLSx509certdir and then have
chardevTLS=0? Maybe, they believe this will disable TLS for every
domain. After all, why would disabling a global setting allow some
localized setting override that.
Just because there's a "default" environment, why should we assume that
because they added "tls='yes'" into their domain that that is the
environment they want?
Maybe they do have a chardev specific environment, but also decided to
comment it out when they commented out chardev_tls=1? So we're assuming
that by finding that "tls='yes'" in the domain that the domain should
use that environment? How can we be so sure that's what's desired?
This is the problem with two triggers - which one do you pull and which
one has a bullet in the chamber? We're having a hard enough time
agreeing on the implementation. Now the customer has to figure out all
the permutations and possibilities.
Personally, if I disable a global variable/value, then I wouldn't expect
some other definition to override that. For example, if I set my SELinux
to be "permissive" or "disabled", then I'm probably not very happy
if
something ignores that and decides to be "enforcing".
Pavel is saying that if chardev_tls=0 in qemu.conf, and tls=1 in the
XML, then we should assume that TLS certs *are* deployed on the host
in the right place. I think this is not unreasonable - we can easily
check to see if the certs exist on disk in this case.
FWIW: Remember how qemu_conf.c sets things up...
During qemuStateInitialize, we call virQEMUDriverConfigNew which will
set a default directory path for "cfg->defaultTLSx509certdir" and then
will use that as a default value for vnc, spice, and chardev. There is
no check "if" that directory structure exists.
Once the defaults are set up, then if "chardev_tls_x509_cert_dir" is
defined, it will override the default (similar for others).
So chardevTLSx509certdir always has some default value, but is that the
certificate environment we want to use for chardev's? How do we know?
IOW, I agree that we should have a tri-state at the XML level
- no tls attribute in XML - honour chardev_tls from qemu.conf
- tls=1 in XML, then turn on TLS
- tls=0 in XML, then don't use TLS
So if we get this far, then a qemu_domain.c function, such as
bool
qemuDomainSupportTLSChardevTCP(virQEMUDriverConfigPtr cfg,
const virDomainChrSourceDef *dev)
{
if (cfg->chardevTLS && dev->data.tcp.haveTLS != VIR_TRISTATE_BOOL_NO)
return true;
if (!cfg->chardevTLS && dev->data.tcp.haveTLS ==
VIR_TRISTATE_BOOL_YES &&
virFileExists(cfg->chardevTLSx509certdir))
return true;
return false;
}
where I suppose we could also compare chardevTLSx509certdir and
defaultTLSx509certdir... Still how do we know that by merely having the
environment there and "tls='yes'" in the domain chardev config that
this
is what's desired. It might well be, but it may also be that the
clearing of the global chardev_tls was meant to disable regardless of
what the domain setting was.
John