Commit f858dcaeba3aacf364a29f7dc2840ff19a1cc31d

Authored by ths
1 parent 6f43024c

Document all VNC authentication options, by Daniel P. Berrange.


git-svn-id: svn://svn.savannah.nongnu.org/qemu/trunk@3140 c046a42c-6fe2-441c-8c8c-71466251a162
Showing 1 changed file with 351 additions and 52 deletions
qemu-doc.texi
... ... @@ -129,6 +129,7 @@ Download the experimental binary installer at
129 129 * pcsys_network:: Network emulation
130 130 * direct_linux_boot:: Direct Linux Boot
131 131 * pcsys_usb:: USB emulation
  132 +* vnc_security:: VNC security
132 133 * gdb_usage:: GDB usage
133 134 * pcsys_os_specific:: Target OS specific information
134 135 @end menu
... ... @@ -243,53 +244,6 @@ Set virtual RAM size to @var{megs} megabytes. Default is 128 MB.
243 244 Simulate an SMP system with @var{n} CPUs. On the PC target, up to 255
244 245 CPUs are supported.
245 246  
246   -@item -nographic
247   -
248   -Normally, QEMU uses SDL to display the VGA output. With this option,
249   -you can totally disable graphical output so that QEMU is a simple
250   -command line application. The emulated serial port is redirected on
251   -the console. Therefore, you can still use QEMU to debug a Linux kernel
252   -with a serial console.
253   -
254   -@item -no-frame
255   -
256   -Do not use decorations for SDL windows and start them using the whole
257   -available screen space. This makes the using QEMU in a dedicated desktop
258   -workspace more convenient.
259   -
260   -@item -vnc display
261   -
262   -Normally, QEMU uses SDL to display the VGA output. With this option,
263   -you can have QEMU listen on VNC display @var{display} and redirect the VGA
264   -display over the VNC session. It is very useful to enable the usb
265   -tablet device when using this option (option @option{-usbdevice
266   -tablet}). When using the VNC display, you must use the @option{-k}
267   -option to set the keyboard layout if you are not using en-us.
268   -
269   -@var{display} may be in the form @var{interface:d}, in which case connections
270   -will only be allowed from @var{interface} on display @var{d}. Optionally,
271   -@var{interface} can be omitted. @var{display} can also be in the form
272   -@var{unix:path} where @var{path} is the location of a unix socket to listen for
273   -connections on.
274   -
275   -
276   -@item -k language
277   -
278   -Use keyboard layout @var{language} (for example @code{fr} for
279   -French). This option is only needed where it is not easy to get raw PC
280   -keycodes (e.g. on Macs, with some X11 servers or with a VNC
281   -display). You don't normally need to use it on PC/Linux or PC/Windows
282   -hosts.
283   -
284   -The available layouts are:
285   -@example
286   -ar de-ch es fo fr-ca hu ja mk no pt-br sv
287   -da en-gb et fr fr-ch is lt nl pl ru th
288   -de en-us fi fr-be hr it lv nl-be pt sl tr
289   -@end example
290   -
291   -The default is @code{en-us}.
292   -
293 247 @item -audio-help
294 248  
295 249 Will show the audio subsystem help: list of drivers, tunable
... ... @@ -312,9 +266,6 @@ Set the real time clock to local time (the default is to UTC
312 266 time). This option is needed to have correct date in MS-DOS or
313 267 Windows.
314 268  
315   -@item -full-screen
316   -Start in full screen.
317   -
318 269 @item -pidfile file
319 270 Store the QEMU process PID in @var{file}. It is useful if you launch QEMU
320 271 from a script.
... ... @@ -340,6 +291,117 @@ caption. The name will also be used for the VNC server.
340 291  
341 292 @end table
342 293  
  294 +Display options:
  295 +@table @option
  296 +
  297 +@item -nographic
  298 +
  299 +Normally, QEMU uses SDL to display the VGA output. With this option,
  300 +you can totally disable graphical output so that QEMU is a simple
  301 +command line application. The emulated serial port is redirected on
  302 +the console. Therefore, you can still use QEMU to debug a Linux kernel
  303 +with a serial console.
  304 +
  305 +@item -no-frame
  306 +
  307 +Do not use decorations for SDL windows and start them using the whole
  308 +available screen space. This makes the using QEMU in a dedicated desktop
  309 +workspace more convenient.
  310 +
  311 +@item -full-screen
  312 +Start in full screen.
  313 +
  314 +@item -vnc display[,option[,option[,...]]]
  315 +
  316 +Normally, QEMU uses SDL to display the VGA output. With this option,
  317 +you can have QEMU listen on VNC display @var{display} and redirect the VGA
  318 +display over the VNC session. It is very useful to enable the usb
  319 +tablet device when using this option (option @option{-usbdevice
  320 +tablet}). When using the VNC display, you must use the @option{-k}
  321 +parameter to set the keyboard layout if you are not using en-us. Valid
  322 +syntax for the @var{display} is
  323 +
  324 +@table @code
  325 +
  326 +@item @var{interface:d}
  327 +
  328 +TCP connections will only be allowed from @var{interface} on display @var{d}.
  329 +By convention the TCP port is 5900+@var{d}. Optionally, @var{interface} can
  330 +be omitted in which case the server will bind to all interfaces.
  331 +
  332 +@item @var{unix:path}
  333 +
  334 +Connections will be allowed over UNIX domain sockets where @var{path} is the
  335 +location of a unix socket to listen for connections on.
  336 +
  337 +@item @var{none}
  338 +
  339 +VNC is initialized by not started. The monitor @code{change} command can be used
  340 +to later start the VNC server.
  341 +
  342 +@end table
  343 +
  344 +Following the @var{display} value there may be one or more @var{option} flags
  345 +separated by commas. Valid options are
  346 +
  347 +@table @code
  348 +
  349 +@item @var{password}
  350 +
  351 +Require that password based authentication is used for client connections.
  352 +The password must be set separately using the @code{change} command in the
  353 +@ref{pcsys_monitor}
  354 +
  355 +@item @var{tls}
  356 +
  357 +Require that client use TLS when communicating with the VNC server. This
  358 +uses anonymous TLS credentials so is susceptible to a man-in-the-middle
  359 +attack. It is recommended that this option be combined with either the
  360 +@var{x509} or @var{x509verify} options.
  361 +
  362 +@item @var{x509=/path/to/certificate/dir}
  363 +
  364 +Valid if @var{tls} is specified. Require that x509 credentials are used
  365 +for negotiating the TLS session. The server will send its x509 certificate
  366 +to the client. It is recommended that a password be set on the VNC server
  367 +to provide authentication of the client when this is used. The path following
  368 +this option specifies where the x509 certificates are to be loaded from.
  369 +See the @ref{vnc_security} section for details on generating certificates.
  370 +
  371 +@item @var{x509verify=/path/to/certificate/dir}
  372 +
  373 +Valid if @var{tls} is specified. Require that x509 credentials are used
  374 +for negotiating the TLS session. The server will send its x509 certificate
  375 +to the client, and request that the client send its own x509 certificate.
  376 +The server will validate the client's certificate against the CA certificate,
  377 +and reject clients when validation fails. If the certificate authority is
  378 +trusted, this is a sufficient authentication mechanism. You may still wish
  379 +to set a password on the VNC server as a second authentication layer. The
  380 +path following this option specifies where the x509 certificates are to
  381 +be loaded from. See the @ref{vnc_security} section for details on generating
  382 +certificates.
  383 +
  384 +@end table
  385 +
  386 +@item -k language
  387 +
  388 +Use keyboard layout @var{language} (for example @code{fr} for
  389 +French). This option is only needed where it is not easy to get raw PC
  390 +keycodes (e.g. on Macs, with some X11 servers or with a VNC
  391 +display). You don't normally need to use it on PC/Linux or PC/Windows
  392 +hosts.
  393 +
  394 +The available layouts are:
  395 +@example
  396 +ar de-ch es fo fr-ca hu ja mk no pt-br sv
  397 +da en-gb et fr fr-ch is lt nl pl ru th
  398 +de en-us fi fr-be hr it lv nl-be pt sl tr
  399 +@end example
  400 +
  401 +The default is @code{en-us}.
  402 +
  403 +@end table
  404 +
343 405 USB options:
344 406 @table @option
345 407  
... ... @@ -862,8 +924,38 @@ Quit the emulator.
862 924 @item eject [-f] device
863 925 Eject a removable medium (use -f to force it).
864 926  
865   -@item change device filename
866   -Change a removable medium.
  927 +@item change device setting
  928 +
  929 +Change the configuration of a device
  930 +
  931 +@table @option
  932 +@item change @var{diskdevice} @var{filename}
  933 +Change the medium for a removable disk device to point to @var{filename}. eg
  934 +
  935 +@example
  936 +(qemu) change cdrom /path/to/some.iso
  937 +@end example
  938 +
  939 +@item change vnc @var{display,options}
  940 +Change the configuration of the VNC server. The valid syntax for @var{display}
  941 +and @var{options} are described at @ref{sec_invocation}. eg
  942 +
  943 +@example
  944 +(qemu) change vnc localhost:1
  945 +@end example
  946 +
  947 +@item change vnc password
  948 +
  949 +Change the password associated with the VNC server. The monitor will prompt for
  950 +the new password to be entered. VNC passwords are only significant upto 8 letters.
  951 +eg.
  952 +
  953 +@example
  954 +(qemu) change vnc password
  955 +Password: ********
  956 +@end example
  957 +
  958 +@end table
867 959  
868 960 @item screendump filename
869 961 Save screen into PPM image @var{filename}.
... ... @@ -1421,6 +1513,213 @@ plugged. You can use the option @option{-usbdevice} to do the same.
1421 1513 When relaunching QEMU, you may have to unplug and plug again the USB
1422 1514 device to make it work again (this is a bug).
1423 1515  
  1516 +@node vnc_security
  1517 +@section VNC security
  1518 +
  1519 +The VNC server capability provides access to the graphical console
  1520 +of the guest VM across the network. This has a number of security
  1521 +considerations depending on the deployment scenarios.
  1522 +
  1523 +@menu
  1524 +* vnc_sec_none::
  1525 +* vnc_sec_password::
  1526 +* vnc_sec_certificate::
  1527 +* vnc_sec_certificate_verify::
  1528 +* vnc_sec_certificate_pw::
  1529 +* vnc_generate_cert::
  1530 +@end menu
  1531 +@node vnc_sec_none
  1532 +@subsection Without passwords
  1533 +
  1534 +The simplest VNC server setup does not include any form of authentication.
  1535 +For this setup it is recommended to restrict it to listen on a UNIX domain
  1536 +socket only. For example
  1537 +
  1538 +@example
  1539 +qemu [...OPTIONS...] -vnc unix:/home/joebloggs/.qemu-myvm-vnc
  1540 +@end example
  1541 +
  1542 +This ensures that only users on local box with read/write access to that
  1543 +path can access the VNC server. To securely access the VNC server from a
  1544 +remote machine, a combination of netcat+ssh can be used to provide a secure
  1545 +tunnel.
  1546 +
  1547 +@node vnc_sec_password
  1548 +@subsection With passwords
  1549 +
  1550 +The VNC protocol has limited support for password based authentication. Since
  1551 +the protocol limits passwords to 8 characters it should not be considered
  1552 +to provide high security. The password can be fairly easily brute-forced by
  1553 +a client making repeat connections. For this reason, a VNC server using password
  1554 +authentication should be restricted to only listen on the loopback interface
  1555 +or UNIX domain sockets. Password ayuthentication is requested with the @code{password}
  1556 +option, and then once QEMU is running the password is set with the monitor. Until
  1557 +the monitor is used to set the password all clients will be rejected.
  1558 +
  1559 +@example
  1560 +qemu [...OPTIONS...] -vnc :1,password -monitor stdio
  1561 +(qemu) change vnc password
  1562 +Password: ********
  1563 +(qemu)
  1564 +@end example
  1565 +
  1566 +@node vnc_sec_certificate
  1567 +@subsection With x509 certificates
  1568 +
  1569 +The QEMU VNC server also implements the VeNCrypt extension allowing use of
  1570 +TLS for encryption of the session, and x509 certificates for authentication.
  1571 +The use of x509 certificates is strongly recommended, because TLS on its
  1572 +own is susceptible to man-in-the-middle attacks. Basic x509 certificate
  1573 +support provides a secure session, but no authentication. This allows any
  1574 +client to connect, and provides an encrypted session.
  1575 +
  1576 +@example
  1577 +qemu [...OPTIONS...] -vnc :1,tls,x509=/etc/pki/qemu -monitor stdio
  1578 +@end example
  1579 +
  1580 +In the above example @code{/etc/pki/qemu} should contain at least three files,
  1581 +@code{ca-cert.pem}, @code{server-cert.pem} and @code{server-key.pem}. Unprivileged
  1582 +users will want to use a private directory, for example @code{$HOME/.pki/qemu}.
  1583 +NB the @code{server-key.pem} file should be protected with file mode 0600 to
  1584 +only be readable by the user owning it.
  1585 +
  1586 +@node vnc_sec_certificate_verify
  1587 +@subsection With x509 certificates and client verification
  1588 +
  1589 +Certificates can also provide a means to authenticate the client connecting.
  1590 +The server will request that the client provide a certificate, which it will
  1591 +then validate against the CA certificate. This is a good choice if deploying
  1592 +in an environment with a private internal certificate authority.
  1593 +
  1594 +@example
  1595 +qemu [...OPTIONS...] -vnc :1,tls,x509verify=/etc/pki/qemu -monitor stdio
  1596 +@end example
  1597 +
  1598 +
  1599 +@node vnc_sec_certificate_pw
  1600 +@subsection With x509 certificates, client verification and passwords
  1601 +
  1602 +Finally, the previous method can be combined with VNC password authentication
  1603 +to provide two layers of authentication for clients.
  1604 +
  1605 +@example
  1606 +qemu [...OPTIONS...] -vnc :1,password,tls,x509verify=/etc/pki/qemu -monitor stdio
  1607 +(qemu) change vnc password
  1608 +Password: ********
  1609 +(qemu)
  1610 +@end example
  1611 +
  1612 +@node vnc_generate_cert
  1613 +@subsection Generating certificates for VNC
  1614 +
  1615 +The GNU TLS packages provides a command called @code{certtool} which can
  1616 +be used to generate certificates and keys in PEM format. At a minimum it
  1617 +is neccessary to setup a certificate authority, and issue certificates to
  1618 +each server. If using certificates for authentication, then each client
  1619 +will also need to be issued a certificate. The recommendation is for the
  1620 +server to keep its certificates in either @code{/etc/pki/qemu} or for
  1621 +unprivileged users in @code{$HOME/.pki/qemu}.
  1622 +
  1623 +@menu
  1624 +* vnc_generate_ca::
  1625 +* vnc_generate_server::
  1626 +* vnc_generate_client::
  1627 +@end menu
  1628 +@node vnc_generate_ca
  1629 +@subsubsection Setup the Certificate Authority
  1630 +
  1631 +This step only needs to be performed once per organization / organizational
  1632 +unit. First the CA needs a private key. This key must be kept VERY secret
  1633 +and secure. If this key is compromised the entire trust chain of the certificates
  1634 +issued with it is lost.
  1635 +
  1636 +@example
  1637 +# certtool --generate-privkey > ca-key.pem
  1638 +@end example
  1639 +
  1640 +A CA needs to have a public certificate. For simplicity it can be a self-signed
  1641 +certificate, or one issue by a commercial certificate issuing authority. To
  1642 +generate a self-signed certificate requires one core piece of information, the
  1643 +name of the organization.
  1644 +
  1645 +@example
  1646 +# cat > ca.info <<EOF
  1647 +cn = Name of your organization
  1648 +ca
  1649 +cert_signing_key
  1650 +EOF
  1651 +# certtool --generate-self-signed \
  1652 + --load-privkey ca-key.pem
  1653 + --template ca.info \
  1654 + --outfile ca-cert.pem
  1655 +@end example
  1656 +
  1657 +The @code{ca-cert.pem} file should be copied to all servers and clients wishing to utilize
  1658 +TLS support in the VNC server. The @code{ca-key.pem} must not be disclosed/copied at all.
  1659 +
  1660 +@node vnc_generate_server
  1661 +@subsubsection Issuing server certificates
  1662 +
  1663 +Each server (or host) needs to be issued with a key and certificate. When connecting
  1664 +the certificate is sent to the client which validates it against the CA certificate.
  1665 +The core piece of information for a server certificate is the hostname. This should
  1666 +be the fully qualified hostname that the client will connect with, since the client
  1667 +will typically also verify the hostname in the certificate. On the host holding the
  1668 +secure CA private key:
  1669 +
  1670 +@example
  1671 +# cat > server.info <<EOF
  1672 +organization = Name of your organization
  1673 +cn = server.foo.example.com
  1674 +tls_www_server
  1675 +encryption_key
  1676 +signing_key
  1677 +EOF
  1678 +# certtool --generate-privkey > server-key.pem
  1679 +# certtool --generate-certificate \
  1680 + --load-ca-certificate ca-cert.pem \
  1681 + --load-ca-privkey ca-key.pem \
  1682 + --load-privkey server server-key.pem \
  1683 + --template server.info \
  1684 + --outfile server-cert.pem
  1685 +@end example
  1686 +
  1687 +The @code{server-key.pem} and @code{server-cert.pem} files should now be securely copied
  1688 +to the server for which they were generated. The @code{server-key.pem} is security
  1689 +sensitive and should be kept protected with file mode 0600 to prevent disclosure.
  1690 +
  1691 +@node vnc_generate_client
  1692 +@subsubsection Issuing client certificates
  1693 +
  1694 +If the QEMU VNC server is to use the @code{x509verify} option to validate client
  1695 +certificates as its authentication mechanism, each client also needs to be issued
  1696 +a certificate. The client certificate contains enough metadata to uniquely identify
  1697 +the client, typically organization, state, city, building, etc. On the host holding
  1698 +the secure CA private key:
  1699 +
  1700 +@example
  1701 +# cat > client.info <<EOF
  1702 +country = GB
  1703 +state = London
  1704 +locality = London
  1705 +organiazation = Name of your organization
  1706 +cn = client.foo.example.com
  1707 +tls_www_client
  1708 +encryption_key
  1709 +signing_key
  1710 +EOF
  1711 +# certtool --generate-privkey > client-key.pem
  1712 +# certtool --generate-certificate \
  1713 + --load-ca-certificate ca-cert.pem \
  1714 + --load-ca-privkey ca-key.pem \
  1715 + --load-privkey client-key.pem \
  1716 + --template client.info \
  1717 + --outfile client-cert.pem
  1718 +@end example
  1719 +
  1720 +The @code{client-key.pem} and @code{client-cert.pem} files should now be securely
  1721 +copied to the client for which they were generated.
  1722 +
1424 1723 @node gdb_usage
1425 1724 @section GDB usage
1426 1725  
... ...