Commit f858dcaeba3aacf364a29f7dc2840ff19a1cc31d
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 |