| .. _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. |