Bare Metal Trust Using Intel TXT
This provides a trusted boot solution, to determine the node is trusted or not after deployed with Ironic, leveraging Intel TXT to measure BIOS, Option ROM and Kernel/Ramdisk. Talk and Demo: https://www.openstack.org/summit/openstack-paris-summit-2014/ session-videos/presentation/trusted-bare-metal-what-and-39-s-that Co-Authored-By: Bhandaru, Malini K <malini.k.bhandaru@intel.com> Co-Authored-By: Villalovos, John L <john.l.villalovos@intel.com> Change-Id: I046030cc42f943435ec6fc078c31228c1b22bd99
This commit is contained in:
parent
2e27b16688
commit
79f20e08ad
227
specs/liberty/bare-metal-trust-using-intel-txt.rst
Normal file
227
specs/liberty/bare-metal-trust-using-intel-txt.rst
Normal file
@ -0,0 +1,227 @@
|
||||
..
|
||||
This work is licensed under a Creative Commons Attribution 3.0 Unported
|
||||
License.
|
||||
|
||||
http://creativecommons.org/licenses/by/3.0/legalcode
|
||||
|
||||
==========================================
|
||||
Bare Metal Trust Using Intel TXT
|
||||
==========================================
|
||||
https://blueprints.launchpad.net/ironic/+spec/bare-metal-trust-using-intel-txt
|
||||
|
||||
This blueprint uses Intel TXT[4], which builds a chain of trust rooted in
|
||||
special purpose hardware called Trusted Platform Module (TPM)[3] and measures
|
||||
the BIOS, boot loader, Option ROM and the Kernel/Ramdisk, to determine
|
||||
whether a bare metal node deployed by Ironic may be trusted.
|
||||
|
||||
Problem description
|
||||
===================
|
||||
The bare metal tenant has the ability to introduce rootkits and other malware
|
||||
on the host. Prior to releasing the host to a new tenant, it is prudent to
|
||||
ensure the machine is in a known good state.
|
||||
|
||||
Using Intel TXT[4], the TPM[3], Trusted Boot[1], and remote authentication[2],
|
||||
it is possible to confirm that the BIOS, boot loader, Option ROM, and the
|
||||
Kernel/Ramdisk are all in a known good state.
|
||||
|
||||
Proposed change
|
||||
===============
|
||||
Add a new boot mode, trusted boot:
|
||||
|
||||
* Read value "capabilities:trusted_boot" from flavor. Pass boolean value
|
||||
"trusted_boot" to ironic.drivers.modules.deploy_utils.switch_pxe_config().
|
||||
Switch to "trusted_boot" section.
|
||||
|
||||
* Add a new section "trusted_boot" in PXE Configuration. It will make
|
||||
use of mboot.c32 which supports multiple loading. It loads TBOOT first.
|
||||
TBOOT will measure Kernel/Ramdisk before loading them.
|
||||
PXE config template::
|
||||
|
||||
label trusted_boot
|
||||
kernel mboot
|
||||
append tboot.gz --- {{pxe_options.aki_path}} root={{ ROOT }} ro text
|
||||
{{ pxe_options.pxe_append_params|default("", true) }} intel_iommu=on
|
||||
--- {{pxe_options.ari_path}}
|
||||
|
||||
* Modify iPXE configuration. As iPXE doesn't support multiple loading and
|
||||
pxelinux supports HTTP/FTP/TFTP, we choose to load pxelinux.0 and use
|
||||
above pxe_config.template again. By default, pxelinux will look for its
|
||||
configuration file using TFTP. We need to specify DHCP options 209/210
|
||||
in trusted_boot.ipxe::
|
||||
|
||||
#209 = pxelinux config path
|
||||
#210 = pxelinux root
|
||||
set 210:string http://$myip:port/
|
||||
set 209:string http://$myip:port/pxelinux.cfg/${mac:hexraw}
|
||||
chain http://$myip:port/pxelinux.0
|
||||
|
||||
* iPXE config example::
|
||||
|
||||
label trusted_boot
|
||||
kernel mboot
|
||||
append tboot.gz
|
||||
--- http://10.239.48.36:8081/ff2b0eb9-7fa8-4745-8caa-ee757d72410f/kernel
|
||||
root=UUID=2d2d2d75-48ce-4530-9bd1-790f2b357b1e ro text nofb nomodeset
|
||||
vga=normal intel_iommu=on
|
||||
--- http://10.239.48.36:8081/ff2b0eb9-7fa8-4745-8caa-ee757d72410f/ramdisk
|
||||
|
||||
Add a clean task to ironic.drivers.modules.pxe.PXEDeploy() to validate the
|
||||
integrity of firmware, which is not enabled by default:
|
||||
|
||||
* Boot a customized image on release nodes/manage nodes with trusted boot.
|
||||
* Send http requests (httplib) to poll the result from an additional service
|
||||
like OAT[2].
|
||||
* If it is trusted, go to the available state. Otherwise, mark it as clean
|
||||
failed state.
|
||||
|
||||
Alternatives
|
||||
------------
|
||||
Secure Boot[5] is used for the same purpose. The main difference is secure boot
|
||||
will verify the signature before executing while trusted boot uses a hardware
|
||||
root of trust and can be configured to verify each component before executing
|
||||
or execute all components and capture "measurements" (aka extended hash
|
||||
computations) for post verification. So if a node is changed, trusted boot will
|
||||
still boot it up but give a warning to users. Secure boot will not boot it up
|
||||
at all.
|
||||
|
||||
They are complementary, both making the cloud more secure. It is recommended to
|
||||
boot nodes with secure boot under uefi and boot nodes with trusted boot under
|
||||
legacy BIOS. The next step is to combine them together but that is out of the
|
||||
scope of this spec.
|
||||
|
||||
Data model impact
|
||||
-----------------
|
||||
None
|
||||
|
||||
State Machine Impact
|
||||
--------------------
|
||||
Add a clean task to run trusted_boot once nodes are released.
|
||||
|
||||
REST API impact
|
||||
---------------
|
||||
None
|
||||
|
||||
Client (CLI) impact
|
||||
-------------------
|
||||
None
|
||||
|
||||
RPC API impact
|
||||
--------------
|
||||
None
|
||||
|
||||
Driver API impact
|
||||
-----------------
|
||||
None
|
||||
|
||||
Nova driver impact
|
||||
------------------
|
||||
Will pass the extra_spec "capabilities:trusted_boot=True" to Ironic
|
||||
|
||||
Security impact
|
||||
---------------
|
||||
Increased confidence in bare metal nodes being free of rootkits and other
|
||||
malware. Intel TXT and TPM are leveraged.
|
||||
|
||||
Other end user impact
|
||||
---------------------
|
||||
None
|
||||
|
||||
Scalability impact
|
||||
------------------
|
||||
Our experiments indicate handling concurrent attestation requests is linear
|
||||
in the number of requests. Attestation occurs on the node release path,
|
||||
and thus is not latency sensitive.
|
||||
|
||||
Performance Impact
|
||||
------------------
|
||||
There is an extra attestation step during trusted boot which spends several
|
||||
seconds. But for bare metal trust no dynamic attestation requests are
|
||||
entertained. So this is a non-issue.
|
||||
|
||||
|
||||
Other deployer impact
|
||||
---------------------
|
||||
* Create a special flavor with 'capabilities:trusted_boot=True'
|
||||
|
||||
* Set ``trusted_boot``:``True`` as capability in node.properties.
|
||||
|
||||
* Additionally two items need to be provided with tftpboot/httpboot folder
|
||||
- "mboot.c32" - Support multiple loading from /usr/lib/syslinux/mboot.c32
|
||||
- "tboot.gz" - a pre-kernel module to do measurement.
|
||||
|
||||
* Set up each machine, enable Intel TXT, VT-x and VT-d and take ownership
|
||||
of the TPM, reboots, and captures the platform configuration register (PCR)
|
||||
values. This is to create the whitelist values that will be registered in
|
||||
the attestation service at initialization time.
|
||||
|
||||
* Set up an OAT-Server and create the whitelist with all known types of
|
||||
hardwares from previous step.
|
||||
|
||||
* Create customized images with OAT-Client.
|
||||
|
||||
* The following parameter is added into newly created [trusted_boot] section
|
||||
in ironic.conf.
|
||||
|
||||
- clean_priority_bare_metal_attestation: default value of the clean task.
|
||||
The default value is 0, which means disable.
|
||||
|
||||
* Change the priority of above clean task to enable it.
|
||||
|
||||
Developer impact
|
||||
----------------
|
||||
None
|
||||
|
||||
Implementation
|
||||
==============
|
||||
|
||||
Assignee(s)
|
||||
-----------
|
||||
|
||||
Primary assignee:
|
||||
tan-lin-good
|
||||
|
||||
Work Items
|
||||
----------
|
||||
* Add trusted_boot section to pxe_config.template
|
||||
* Add trusted_boot.ipxe
|
||||
* Support trusted_boot flag and switch to trusted_boot.
|
||||
* Add a new clean task.
|
||||
* A dib element to create customized images.
|
||||
|
||||
Dependencies
|
||||
============
|
||||
* TBOOT[1]
|
||||
* OAT[2]
|
||||
* Hardware Support: TPM and Intel TXT
|
||||
|
||||
|
||||
Testing
|
||||
=======
|
||||
Will add unit tests.
|
||||
Planning on adding third party hardware CI testing.
|
||||
|
||||
Upgrades and Backwards Compatibility
|
||||
====================================
|
||||
None.
|
||||
Backwards compatibility is achieved by not requesting "trusted"
|
||||
bare metal. Custom tenant images are accommodated by deploying an initial
|
||||
standard image that has the OAT client embedded. Today Fedora releases come
|
||||
bundled with the OAT client. This solution approach, while increasing the
|
||||
number of boots preserves us from having to doctor the tenant image by way
|
||||
of injecting the OAT client into the same, or requiring that bare metal
|
||||
users provide images with an OAT client included.
|
||||
|
||||
Documentation Impact
|
||||
====================
|
||||
Will document usage and benefits.
|
||||
Here is a doc for the technical detail of Bare metal trust:
|
||||
https://wiki.openstack.org/wiki/Bare-metal-trust
|
||||
|
||||
References
|
||||
==========
|
||||
1. http://sourceforge.net/projects/tboot/
|
||||
2. https://github.com/OpenAttestation/OpenAttestation
|
||||
3. http://en.wikipedia.org/wiki/Trusted_Platform_Module
|
||||
4. http://en.wikipedia.org/wiki/Trusted_Execution_Technology
|
||||
5. https://review.openstack.org/#/c/135228/
|
||||
6. http://docs.openstack.org/admin-guide-cloud/content/trusted-compute-pools.html
|
Loading…
Reference in New Issue
Block a user