UEFI secure boot support for pxe_ilo driver
https://blueprints.launchpad.net/ironic/+spec/uefi-secure-boot-pxe-ilo This spec proposes grub2 as a alternative bootloader for Ironic pxe driver to add support for UEFI secure boot to pxe_ilo driver. Change-Id: I5745fe5c30b0ba1eb67065218dec9c334884007a
This commit is contained in:
parent
795f4033cf
commit
5a212299c4
297
specs/liberty/uefi-secure-boot-pxe-ilo.rst
Normal file
297
specs/liberty/uefi-secure-boot-pxe-ilo.rst
Normal file
@ -0,0 +1,297 @@
|
||||
..
|
||||
This work is licensed under a Creative Commons Attribution 3.0 Unported
|
||||
License.
|
||||
|
||||
http://creativecommons.org/licenses/by/3.0/legalcode
|
||||
|
||||
==================================================
|
||||
UEFI Secure Boot support for pxe_iLO driver
|
||||
==================================================
|
||||
|
||||
Include the URL of your launchpad blueprint:
|
||||
|
||||
https://blueprints.launchpad.net/ironic/+spec/uefi-secure-boot-pxe-ilo
|
||||
|
||||
As part of Kilo release UEFI secure boot support was enabled for all the iLO
|
||||
drivers except pxe_ilo. It is important to have this feature supported for
|
||||
pxe_ilo driver so that security sensitive users of pxe_ilo driver could deploy
|
||||
more securely using Secure Boot feature of the UEFI. This spec proposes UEFI
|
||||
Secure Boot support in baremetal provisioning for pxe_ilo driver.
|
||||
|
||||
Problem description
|
||||
===================
|
||||
|
||||
Secure Boot is part of the UEFI specification (http://www.uefi.org). It helps
|
||||
to make sure that node boots using only software that is trusted by Admin/End
|
||||
user.
|
||||
|
||||
Secure Boot is different from TPM (Trusted Platform Module). TPM is a standard
|
||||
for a secure cryptoprocessor, which is dedicated microprocessor designed to
|
||||
secure hardware by integrating cryptographic keys into devices. Secure Boot is
|
||||
part of UEFI specification, which can secure the boot process by preventing
|
||||
the loading of drivers or OS loaders that are not signed with an acceptable
|
||||
digital signature.
|
||||
|
||||
When the node starts with secure boot enabled, system firmware checks the
|
||||
signature of each piece of boot software, including firmware drivers (Option
|
||||
ROMs), boot loaders and the operating system. If the signatures are good,
|
||||
the node boots, and the firmware gives control to the operating system.
|
||||
|
||||
The Admin and End users having security sensitivity with respect to baremetal
|
||||
provisioning owing to the workloads they intend to run on the provisioned
|
||||
nodes would be interested in using secure boot provided by UEFI.
|
||||
|
||||
Once secure boot is enabled for a node, it cannot boot using unsigned boot
|
||||
images. Hence it is important to use signed bootloaders and kernel if node
|
||||
were to be booted using secure boot.
|
||||
|
||||
This feature has been enabled for iscsi_ilo and agent_ilo driver during Kilo
|
||||
release. It needs to be enabled for pxe_ilo driver. This needs pxe_ilo driver
|
||||
should support signed UEFI bootloader for the nodes to boot in the UEFI secure
|
||||
boot environment.
|
||||
|
||||
Proposed change
|
||||
===============
|
||||
|
||||
This spec proposes to support UEFI secure boot for pxe_ilo driver and grub2 as
|
||||
an alternate bootloader for UEFI deploy for PXE drivers.
|
||||
|
||||
Preparing the environment
|
||||
-------------------------
|
||||
|
||||
* The operator informs the Ironic using the ``capabilities`` property of the
|
||||
node. The operator may add a new capability ``secure_boot=true`` in
|
||||
``capabilities`` within ``properties`` of that node. This is an optional
|
||||
property that can be used if node needs to be provisioned for secure boot.
|
||||
By default the behavior would be as if this property is set to 'false'. The
|
||||
inspection feature in iLO drivers can auto discover secure boot capability
|
||||
of the node and create node capability into that node object.
|
||||
|
||||
* If the user has ``secure_boot`` capability set in the flavor, pxe_ilo has
|
||||
ability to change the boot mode to UEFI and prepare the node for the secure
|
||||
boot on the fly using proliantutils library calls.
|
||||
|
||||
* Even if the ``secure_boot`` capability is set to ``true`` in the node's
|
||||
``properties/capabilities``, node can be used for normal non-secure boot
|
||||
deployments. Driver would use the ``secure_boot`` capability information from
|
||||
the node's ``instance_info`` field to provision node for UEFI secure boot.
|
||||
|
||||
Preparing flavor for secure boot
|
||||
--------------------------------
|
||||
|
||||
* The ``extra_specs`` field in the nova flavor should be used to indicate
|
||||
secure boot. User will need to create a flavor by adding
|
||||
"capabilities:secure_boot="true" to it.
|
||||
|
||||
* iLO driver will not do secure boot if "secure_boot" capability flavor is
|
||||
not present or set to "False". Nova scheduler will use secure_boot
|
||||
capability as one of the node selection criteria if "secure_boot" is
|
||||
present in extra_spec. If "secure_boot" is not present in extra_spec then
|
||||
Nova scheduler will not consider "secure_boot" capability as a node
|
||||
selection criteria.
|
||||
|
||||
* Ironic virt Driver will pass the flavor capability information to the driver
|
||||
as part of 'instance_info'. Having capability information as part of
|
||||
'instance_info' would help driver in preparing and decommissioning the node
|
||||
appropriately. With respect to secure boot feature, this information would be
|
||||
used by pxe_ilo driver for:-
|
||||
|
||||
* During provisioning, driver can turn on the secure boot capability to
|
||||
validate signatures of bootloaders and kernel.
|
||||
|
||||
* During teardown, secure boot mode would be disabled on the node.
|
||||
|
||||
Preparing bootloader and deploy images
|
||||
--------------------------------------
|
||||
|
||||
To support UEFI secure boot for pxe_ilo driver, pxe driver for Ironic should
|
||||
support signed UEFI bootloader. Currently 'elilo' is the default UEFI
|
||||
bootloader for all pxe drivers. Not all major linux distros ship signed 'elilo'
|
||||
bootloader. They ship signed 'grub2' bootloader.
|
||||
|
||||
Enabling grub2 bootloader requires steps similar to elilo. Steps are:-
|
||||
|
||||
* Copy signed shim and grub2 bootloader files into tftproot directory as
|
||||
bootx64.efi and grubx64.efi respectively .
|
||||
|
||||
* Create a master grub.cfg file under /tftpboot/grub
|
||||
|
||||
* Contents of master grub.cfg would look something like this.
|
||||
set default=master
|
||||
set timeout=5
|
||||
set hidden_timeout_quiet=false
|
||||
|
||||
menuentry "master" {
|
||||
configfile /tftpboot/$net_default_ip.conf
|
||||
}
|
||||
|
||||
This master grub.cfg gets loaded first during PXE boot. It tells grub to
|
||||
refer to the node specific config file in tftproot directory configured for
|
||||
PXE. The name of config file is coined using DHCP IP address that would be
|
||||
allocated to the node. This is to ensure that multiple grub.cfg files could
|
||||
be created for parallel deploys. The contents of $net_default_ip.conf is
|
||||
dynamically filled by PXE driver using grub template file.
|
||||
|
||||
Ironic needs to support 'grub2' as an alternate UEFI bootloader for following
|
||||
reasons:-
|
||||
|
||||
* No active development happening on 'elilo'
|
||||
|
||||
* All major linux distributions are supporting 'grub2' as a default UEFI
|
||||
bootloader.
|
||||
|
||||
* All major linux distributions provide signed 'grub2' bootloader which could
|
||||
be used in UEFI secure boot deploy with distro supplied cloud images.
|
||||
Otherwise users would need to build their own signed images for secure boot
|
||||
deploy.
|
||||
|
||||
* signed grub2 can be used for normal UEFI deploys as well.
|
||||
|
||||
All major linux distros ship their self signed 'grub2' and also provide
|
||||
Microsoft UEFI CA signed shim bootloader. The shim bootloader contains the UEFI
|
||||
signature of respective distros.
|
||||
|
||||
When node boots up using pxe, it loads Microsoft signed 'shim' boot loader
|
||||
which in turn loads the distro signed 'grub2'. Distro signed 'grub2' can
|
||||
validate and load the distro kernel.
|
||||
Shim bootloader is required as it is signed using Microsoft UEFI CA signature
|
||||
and recognizes corresponding linux vendors certificate as a valid certificate.
|
||||
Secure boot enabled HP Proliant UEFI systems are pre-loaded with Microsoft UEFI
|
||||
CA signatures.
|
||||
User signed images can be supported but user need to manually configure
|
||||
their keys to HP Proliant system ROM database using Proliant tools.
|
||||
|
||||
User can configure 'grub2' as a bootloader by changing the following existing
|
||||
variables in /etc/ironic/ironic.conf under pxe section:
|
||||
uefi_pxe_config_template
|
||||
uefi_pxe_bootfile_name
|
||||
|
||||
Alternatives
|
||||
------------
|
||||
|
||||
Add support for signed 'grub2' as a default UEFI bootloader in Ironic. But such
|
||||
a change would have backward compatibility impact.
|
||||
|
||||
Data model impact
|
||||
-----------------
|
||||
|
||||
None
|
||||
|
||||
State Machine Impact
|
||||
--------------------
|
||||
|
||||
None
|
||||
|
||||
REST API impact
|
||||
---------------
|
||||
|
||||
None
|
||||
|
||||
RPC API impact
|
||||
--------------
|
||||
|
||||
None
|
||||
|
||||
Client (CLI) impact
|
||||
-------------------
|
||||
None
|
||||
|
||||
Driver API impact
|
||||
-----------------
|
||||
|
||||
None
|
||||
|
||||
Nova driver impact
|
||||
------------------
|
||||
|
||||
None
|
||||
|
||||
Security impact
|
||||
---------------
|
||||
|
||||
This enhances security. Only correctly signed firmware, bootloader and OS can
|
||||
be booted. It provides users with the opportunity to run the software of their
|
||||
choice in the most secure manner.
|
||||
|
||||
Other end user impact
|
||||
---------------------
|
||||
|
||||
Users need to use properly signed deploy and boot components.
|
||||
Currently pxe_ilo driver would support deploy and boot images having 'shim' and
|
||||
'grub2' signed by Linux OS vendors.
|
||||
If user wants to use custom signed images, then he would need to manually
|
||||
configure their keys to UEFI using HP Proliant tools.
|
||||
If user were to use an unsigned image for deploy with flavor requesting
|
||||
UEFI secure boot, then deploy process would go through successfully, but
|
||||
final boot into instance image would fail. The signature validation of
|
||||
unsigned components would fail resulting in the failure of boot process. The
|
||||
appropriate boot failure message would get displayed on Node's console.
|
||||
|
||||
Scalability impact
|
||||
------------------
|
||||
|
||||
None
|
||||
|
||||
Performance Impact
|
||||
------------------
|
||||
|
||||
There is no performance impact due to signature validation in secure boot.
|
||||
|
||||
Other deployer impact
|
||||
---------------------
|
||||
|
||||
User can deploy only signed images with UEFI secure boot enabled.
|
||||
|
||||
Developer impact
|
||||
----------------
|
||||
|
||||
None
|
||||
|
||||
Implementation
|
||||
==============
|
||||
|
||||
Assignee(s)
|
||||
-----------
|
||||
|
||||
Primary assignee:
|
||||
Shivanand Tendulker (stendulker@gmail.com)
|
||||
|
||||
Work Items
|
||||
----------
|
||||
|
||||
1. Add support for grub2/shim as a alternate UEFI bootloaders for Ironic pxe
|
||||
driver.
|
||||
|
||||
2. Implement secure boot for pxe_ilo driver.
|
||||
|
||||
Dependencies
|
||||
============
|
||||
|
||||
Signed user images.
|
||||
The necessary DiskImageBuilder changes has been done to
|
||||
build signed Ubuntu and Fedora images.
|
||||
|
||||
Testing
|
||||
=======
|
||||
|
||||
Unit tests would be added for all newly added code.
|
||||
|
||||
Upgrades and Backwards Compatibility
|
||||
====================================
|
||||
|
||||
None. grub2 would be alternate bootloader, which user can use only if it needs
|
||||
UEFI secure boot functionality.
|
||||
|
||||
Documentation Impact
|
||||
====================
|
||||
|
||||
Newly added functionality would be appropriately documented.
|
||||
|
||||
References
|
||||
==========
|
||||
|
||||
1. UEFI specification http://www.uefi.org
|
||||
2. Proliantutils module - https://pypi.python.org/pypi/proliantutils
|
||||
3. HP UEFI System Utilities User Guide - http://www.hp.com/ctg/Manual/c04398276.pdf
|
||||
4. Secure Boot for Linux on HP Proliant servers http://h20195.www2.hp.com/V2/getpdf.aspx/4AA5-4496ENW.pdf
|
||||
|
Loading…
Reference in New Issue
Block a user