|  | .. _VNC security: | 
|  |  | 
|  | VNC security | 
|  | ------------ | 
|  |  | 
|  | The VNC server capability provides access to the graphical console of | 
|  | the guest VM across the network. This has a number of security | 
|  | considerations depending on the deployment scenarios. | 
|  |  | 
|  | .. _vnc_005fsec_005fnone: | 
|  |  | 
|  | Without passwords | 
|  | ~~~~~~~~~~~~~~~~~ | 
|  |  | 
|  | The simplest VNC server setup does not include any form of | 
|  | authentication. For this setup it is recommended to restrict it to | 
|  | listen on a UNIX domain socket only. For example | 
|  |  | 
|  | .. parsed-literal:: | 
|  |  | 
|  | |qemu_system| [...OPTIONS...] -vnc unix:/home/joebloggs/.qemu-myvm-vnc | 
|  |  | 
|  | This ensures that only users on local box with read/write access to that | 
|  | path can access the VNC server. To securely access the VNC server from a | 
|  | remote machine, a combination of netcat+ssh can be used to provide a | 
|  | secure tunnel. | 
|  |  | 
|  | .. _vnc_005fsec_005fpassword: | 
|  |  | 
|  | With passwords | 
|  | ~~~~~~~~~~~~~~ | 
|  |  | 
|  | The VNC protocol has limited support for password based authentication. | 
|  | Since the protocol limits passwords to 8 characters it should not be | 
|  | considered to provide high security. The password can be fairly easily | 
|  | brute-forced by a client making repeat connections. For this reason, a | 
|  | VNC server using password authentication should be restricted to only | 
|  | listen on the loopback interface or UNIX domain sockets. Password | 
|  | authentication is not supported when operating in FIPS 140-2 compliance | 
|  | mode as it requires the use of the DES cipher. Password authentication | 
|  | is requested with the ``password`` option, and then once QEMU is running | 
|  | the password is set with the monitor. Until the monitor is used to set | 
|  | the password all clients will be rejected. | 
|  |  | 
|  | .. parsed-literal:: | 
|  |  | 
|  | |qemu_system| [...OPTIONS...] -vnc :1,password=on -monitor stdio | 
|  | (qemu) change vnc password | 
|  | Password: ******** | 
|  | (qemu) | 
|  |  | 
|  | .. _vnc_005fsec_005fcertificate: | 
|  |  | 
|  | With x509 certificates | 
|  | ~~~~~~~~~~~~~~~~~~~~~~ | 
|  |  | 
|  | The QEMU VNC server also implements the VeNCrypt extension allowing use | 
|  | of TLS for encryption of the session, and x509 certificates for | 
|  | authentication. The use of x509 certificates is strongly recommended, | 
|  | because TLS on its own is susceptible to man-in-the-middle attacks. | 
|  | Basic x509 certificate support provides a secure session, but no | 
|  | authentication. This allows any client to connect, and provides an | 
|  | encrypted session. | 
|  |  | 
|  | .. parsed-literal:: | 
|  |  | 
|  | |qemu_system| [...OPTIONS...] \ | 
|  | -object tls-creds-x509,id=tls0,dir=/etc/pki/qemu,endpoint=server,verify-peer=off \ | 
|  | -vnc :1,tls-creds=tls0 -monitor stdio | 
|  |  | 
|  | In the above example ``/etc/pki/qemu`` should contain at least three | 
|  | files, ``ca-cert.pem``, ``server-cert.pem`` and ``server-key.pem``. | 
|  | Unprivileged users will want to use a private directory, for example | 
|  | ``$HOME/.pki/qemu``. NB the ``server-key.pem`` file should be protected | 
|  | with file mode 0600 to only be readable by the user owning it. | 
|  |  | 
|  | .. _vnc_005fsec_005fcertificate_005fverify: | 
|  |  | 
|  | With x509 certificates and client verification | 
|  | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ | 
|  |  | 
|  | Certificates can also provide a means to authenticate the client | 
|  | connecting. The server will request that the client provide a | 
|  | certificate, which it will then validate against the CA certificate. | 
|  | This is a good choice if deploying in an environment with a private | 
|  | internal certificate authority. It uses the same syntax as previously, | 
|  | but with ``verify-peer`` set to ``on`` instead. | 
|  |  | 
|  | .. parsed-literal:: | 
|  |  | 
|  | |qemu_system| [...OPTIONS...] \ | 
|  | -object tls-creds-x509,id=tls0,dir=/etc/pki/qemu,endpoint=server,verify-peer=on \ | 
|  | -vnc :1,tls-creds=tls0 -monitor stdio | 
|  |  | 
|  | .. _vnc_005fsec_005fcertificate_005fpw: | 
|  |  | 
|  | With x509 certificates, client verification and passwords | 
|  | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ | 
|  |  | 
|  | Finally, the previous method can be combined with VNC password | 
|  | authentication to provide two layers of authentication for clients. | 
|  |  | 
|  | .. parsed-literal:: | 
|  |  | 
|  | |qemu_system| [...OPTIONS...] \ | 
|  | -object tls-creds-x509,id=tls0,dir=/etc/pki/qemu,endpoint=server,verify-peer=on \ | 
|  | -vnc :1,tls-creds=tls0,password=on -monitor stdio | 
|  | (qemu) change vnc password | 
|  | Password: ******** | 
|  | (qemu) | 
|  |  | 
|  | .. _vnc_005fsec_005fsasl: | 
|  |  | 
|  | With SASL authentication | 
|  | ~~~~~~~~~~~~~~~~~~~~~~~~ | 
|  |  | 
|  | The SASL authentication method is a VNC extension, that provides an | 
|  | easily extendable, pluggable authentication method. This allows for | 
|  | integration with a wide range of authentication mechanisms, such as PAM, | 
|  | GSSAPI/Kerberos, LDAP, SQL databases, one-time keys and more. The | 
|  | strength of the authentication depends on the exact mechanism | 
|  | configured. If the chosen mechanism also provides a SSF layer, then it | 
|  | will encrypt the datastream as well. | 
|  |  | 
|  | Refer to the later docs on how to choose the exact SASL mechanism used | 
|  | for authentication, but assuming use of one supporting SSF, then QEMU | 
|  | can be launched with: | 
|  |  | 
|  | .. parsed-literal:: | 
|  |  | 
|  | |qemu_system| [...OPTIONS...] -vnc :1,sasl=on -monitor stdio | 
|  |  | 
|  | .. _vnc_005fsec_005fcertificate_005fsasl: | 
|  |  | 
|  | With x509 certificates and SASL authentication | 
|  | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ | 
|  |  | 
|  | If the desired SASL authentication mechanism does not supported SSF | 
|  | layers, then it is strongly advised to run it in combination with TLS | 
|  | and x509 certificates. This provides securely encrypted data stream, | 
|  | avoiding risk of compromising of the security credentials. This can be | 
|  | enabled, by combining the 'sasl' option with the aforementioned TLS + | 
|  | x509 options: | 
|  |  | 
|  | .. parsed-literal:: | 
|  |  | 
|  | |qemu_system| [...OPTIONS...] \ | 
|  | -object tls-creds-x509,id=tls0,dir=/etc/pki/qemu,endpoint=server,verify-peer=on \ | 
|  | -vnc :1,tls-creds=tls0,sasl=on -monitor stdio | 
|  |  | 
|  | .. _vnc_005fsetup_005fsasl: | 
|  |  | 
|  | Configuring SASL mechanisms | 
|  | ~~~~~~~~~~~~~~~~~~~~~~~~~~~ | 
|  |  | 
|  | The following documentation assumes use of the Cyrus SASL implementation | 
|  | on a Linux host, but the principles should apply to any other SASL | 
|  | implementation or host. When SASL is enabled, the mechanism | 
|  | configuration will be loaded from system default SASL service config | 
|  | /etc/sasl2/qemu.conf. If running QEMU as an unprivileged user, an | 
|  | environment variable SASL_CONF_PATH can be used to make it search | 
|  | alternate locations for the service config file. | 
|  |  | 
|  | If the TLS option is enabled for VNC, then it will provide session | 
|  | encryption, otherwise the SASL mechanism will have to provide | 
|  | encryption. In the latter case the list of possible plugins that can be | 
|  | used is drastically reduced. In fact only the GSSAPI SASL mechanism | 
|  | provides an acceptable level of security by modern standards. Previous | 
|  | versions of QEMU referred to the DIGEST-MD5 mechanism, however, it has | 
|  | multiple serious flaws described in detail in RFC 6331 and thus should | 
|  | never be used any more. The SCRAM-SHA-256 mechanism provides a simple | 
|  | username/password auth facility similar to DIGEST-MD5, but does not | 
|  | support session encryption, so can only be used in combination with TLS. | 
|  |  | 
|  | When not using TLS the recommended configuration is | 
|  |  | 
|  | :: | 
|  |  | 
|  | mech_list: gssapi | 
|  | keytab: /etc/qemu/krb5.tab | 
|  |  | 
|  | This says to use the 'GSSAPI' mechanism with the Kerberos v5 protocol, | 
|  | with the server principal stored in /etc/qemu/krb5.tab. For this to work | 
|  | the administrator of your KDC must generate a Kerberos principal for the | 
|  | server, with a name of 'qemu/somehost.example.com@EXAMPLE.COM' replacing | 
|  | 'somehost.example.com' with the fully qualified host name of the machine | 
|  | running QEMU, and 'EXAMPLE.COM' with the Kerberos Realm. | 
|  |  | 
|  | When using TLS, if username+password authentication is desired, then a | 
|  | reasonable configuration is | 
|  |  | 
|  | :: | 
|  |  | 
|  | mech_list: scram-sha-256 | 
|  | sasldb_path: /etc/qemu/passwd.db | 
|  |  | 
|  | The ``saslpasswd2`` program can be used to populate the ``passwd.db`` | 
|  | file with accounts. Note that the ``passwd.db`` file stores passwords | 
|  | in clear text. | 
|  |  | 
|  | Other SASL configurations will be left as an exercise for the reader. | 
|  | Note that all mechanisms, except GSSAPI, should be combined with use of | 
|  | TLS to ensure a secure data channel. |