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,6 +129,7 @@ Download the experimental binary installer at
129 * pcsys_network:: Network emulation 129 * pcsys_network:: Network emulation
130 * direct_linux_boot:: Direct Linux Boot 130 * direct_linux_boot:: Direct Linux Boot
131 * pcsys_usb:: USB emulation 131 * pcsys_usb:: USB emulation
  132 +* vnc_security:: VNC security
132 * gdb_usage:: GDB usage 133 * gdb_usage:: GDB usage
133 * pcsys_os_specific:: Target OS specific information 134 * pcsys_os_specific:: Target OS specific information
134 @end menu 135 @end menu
@@ -243,53 +244,6 @@ Set virtual RAM size to @var{megs} megabytes. Default is 128 MB. @@ -243,53 +244,6 @@ Set virtual RAM size to @var{megs} megabytes. Default is 128 MB.
243 Simulate an SMP system with @var{n} CPUs. On the PC target, up to 255 244 Simulate an SMP system with @var{n} CPUs. On the PC target, up to 255
244 CPUs are supported. 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 @item -audio-help 247 @item -audio-help
294 248
295 Will show the audio subsystem help: list of drivers, tunable 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,9 +266,6 @@ Set the real time clock to local time (the default is to UTC
312 time). This option is needed to have correct date in MS-DOS or 266 time). This option is needed to have correct date in MS-DOS or
313 Windows. 267 Windows.
314 268
315 -@item -full-screen  
316 -Start in full screen.  
317 -  
318 @item -pidfile file 269 @item -pidfile file
319 Store the QEMU process PID in @var{file}. It is useful if you launch QEMU 270 Store the QEMU process PID in @var{file}. It is useful if you launch QEMU
320 from a script. 271 from a script.
@@ -340,6 +291,117 @@ caption. The name will also be used for the VNC server. @@ -340,6 +291,117 @@ caption. The name will also be used for the VNC server.
340 291
341 @end table 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 USB options: 405 USB options:
344 @table @option 406 @table @option
345 407
@@ -862,8 +924,38 @@ Quit the emulator. @@ -862,8 +924,38 @@ Quit the emulator.
862 @item eject [-f] device 924 @item eject [-f] device
863 Eject a removable medium (use -f to force it). 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 @item screendump filename 960 @item screendump filename
869 Save screen into PPM image @var{filename}. 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,6 +1513,213 @@ plugged. You can use the option @option{-usbdevice} to do the same.
1421 When relaunching QEMU, you may have to unplug and plug again the USB 1513 When relaunching QEMU, you may have to unplug and plug again the USB
1422 device to make it work again (this is a bug). 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 @node gdb_usage 1723 @node gdb_usage
1425 @section GDB usage 1724 @section GDB usage
1426 1725