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