Add configurable-hash-algorithms spec
Change-Id: I0bc3e35da621f1c90bdca6fe0e2c92c99f97eb6b Signed-off-by: Stephen Finucane <stephenfin@redhat.com>
This commit is contained in:
parent
8d5d0c7572
commit
4c4dd06f46
230
specs/2024.2/approved/glance/configurable-hash-algorithms.rst
Normal file
230
specs/2024.2/approved/glance/configurable-hash-algorithms.rst
Normal file
@ -0,0 +1,230 @@
|
||||
..
|
||||
This work is licensed under a Creative Commons Attribution 3.0 Unported
|
||||
License.
|
||||
|
||||
http://creativecommons.org/licenses/by/3.0/legalcode
|
||||
|
||||
=================================
|
||||
User-configurable hash algorithms
|
||||
=================================
|
||||
|
||||
Include the URL of your launchpad blueprint:
|
||||
|
||||
https://blueprints.launchpad.net/glance/+spec/configurable-hash-algorithms
|
||||
|
||||
Allow end-users to specify a hash algorithm to be used when creating a new
|
||||
image, allowing them to compare existing hashes provided by the creator of the
|
||||
image with hashes returned by Glance, rather than having to generate the hashes
|
||||
themselves on the client side.
|
||||
|
||||
Problem description
|
||||
===================
|
||||
|
||||
As described `in the docs
|
||||
<https://docs.openstack.org/glance/latest/user/os_hash_algo.html>`__, the
|
||||
Secure Hash Algorithm feature adds image properties that may be used to verify
|
||||
image integrity based on its hash. Two properties are added, ``os_hash_algo``
|
||||
which contains the name of the hash algorithm used to generate the hash, and
|
||||
``os_hash_value`` which contains the hash itself.
|
||||
|
||||
We would like to be able to use ``web-download`` to upload an image
|
||||
to Glance - be that an OpenShift release images or a stock CentOS Stream or
|
||||
Ubuntu image - and then verify the hash of the uploaded image against a
|
||||
signature given by the image provider. However, currently the hash algorithm
|
||||
represented by ``os_hash_algo`` is not user-configurable: it can only be
|
||||
configured by the ``[DEFAULT] hashing_algorithm`` configuration option. This
|
||||
defaults to ``sha512``, which was chosen as it was more performant than SHA-256
|
||||
(see :doc:`/specs/rocky/implemented/glance/multihash`), but SHA-512 signatures
|
||||
are not published by all image providers: for example, while Debian publishes
|
||||
SHA-512 signatures (`source
|
||||
<https://cdimage.debian.org/debian-cd/current/amd64/iso-cd/>`__), Ubuntu only
|
||||
publishes SHA-256 signatures (`source <https://releases.ubuntu.com/24.04/>`__)
|
||||
as does Fedora (`source
|
||||
<https://fedora.ip-connect.vn.ua/linux/releases/40/Workstation/x86_64/iso/>`__).
|
||||
When signatures are not provided in a suitable format, it is necessary to
|
||||
either ask an admin to change the hash algorithm (which affects the entire
|
||||
deployment and might not be possible, particularly in public cloud
|
||||
environments) or generate the hash on the client-side before uploading the
|
||||
image (which limits the usefulness of the ``web-download`` image import
|
||||
mechanism). We would like to address this gap.
|
||||
|
||||
Proposed change
|
||||
===============
|
||||
|
||||
To resolve this, we propose allowing users to select the hash algorithm to be
|
||||
used when creating the image. We will rename the ``[DEFAULT]
|
||||
hashing_algorithm`` config option to ``[DEFAULT] default_hashing_algorithm``
|
||||
(providing an alias for the older name) and add a new config option,
|
||||
``[DEFAULT] allowed_hashing_algorithms``, which will be a list of algorithms
|
||||
that are permitted to specified by the user and will initially default to
|
||||
``['sha512', 'sha256', 'sha1', 'md5']``. In this way, users can select a
|
||||
hashing algorithm that suits their use case while operators can still restrict
|
||||
certain algorithms to e.g. maintain regulatory compliance.
|
||||
|
||||
Alternatives
|
||||
------------
|
||||
|
||||
- Instead of allowing users to specify the hash algorithm to be used, we could
|
||||
start storing multiple hash algorithms. This would require replacing the two
|
||||
image properties, ``os_hash_algo`` and ``os_hash_value`` with either a new
|
||||
map-like property or flat algorithm-specific properties (e.g.
|
||||
``os_hash_value.sha512``).
|
||||
|
||||
This was rejected because it has a far larger API impact, would require
|
||||
database changes, and would increase CPU utilisation due to the need to
|
||||
generate multiple hashes for every image.
|
||||
|
||||
- Instead on introducing a new configuration option, we could modify the
|
||||
behavior of the existing ``[DEFAULT] hashing_algorithm`` option such
|
||||
that it now accepts a list of allowed hashing algorithms, with the first item
|
||||
(index 0) being the default used.
|
||||
|
||||
This was rejected because it overloads the option to have two purposes - both
|
||||
configuring a default and configuring allowed options - which could be
|
||||
confusing for operators. In addition, any deployments that have non-default
|
||||
values (e.g. ``sha256``) will have those values persisted and the value will
|
||||
now affect both default and allowed hashing algorithms, which may be
|
||||
undesirable from an operator perspective yet easy to miss.
|
||||
|
||||
Data model impact
|
||||
-----------------
|
||||
|
||||
None.
|
||||
|
||||
REST API impact
|
||||
---------------
|
||||
|
||||
The ``POST /images`` API will now allow users to specify the ``os_hash_algo``
|
||||
property during image creation. If a user specifies an unsupported algorithm,
|
||||
the request will be rejected with a HTTP 400 (Bad Request) error and
|
||||
appropriate error message.
|
||||
|
||||
Security impact
|
||||
---------------
|
||||
|
||||
There are a number of potential issues with these but we believe none of them
|
||||
are actual issues.
|
||||
|
||||
- A malicious user could rely on a hash collision with a (significantly) weaker
|
||||
or insecure algorithm to trick users into believing they are downloading e.g.
|
||||
an official Ubuntu image when in fact they are downloading a weaker image.
|
||||
|
||||
Using this would require that the malicious user has the ability to create
|
||||
public or community images, or they would require the potential victim to
|
||||
accept a share request for a shared image. This is unlikely in a public cloud
|
||||
environment. In addition, and perhaps more importantly, a hash collision
|
||||
attack using SHA-256 or SHA-512 has not been publicly demonstrated. This is
|
||||
obviously not the case for SHA1 and MD5 but as both algorithms' lack of
|
||||
security is well documented and well known, there should be no expectation of
|
||||
security from end-users.
|
||||
|
||||
- A malicious user could conduct a denial-of-service attack on Glance by
|
||||
uploading images using an expensive hashing algorithm.
|
||||
|
||||
The set of hashing algorithms that a user can specify will be
|
||||
operator-configurable, meaning only well-known, well-understood algorithms
|
||||
will be permitted by default. In addition, such a hashing algorithm would
|
||||
have to be **astoundingly** expensive to make a dent in the existing overhead
|
||||
costs of downloading and storing a glance image. We are not aware of any such
|
||||
hash algorithms in practical use.
|
||||
|
||||
- Use of a particular algorithm could cause the operator to run afoul of
|
||||
regulatory requirements.
|
||||
|
||||
The supported hashing algorithms will be operator-configurable. The operator
|
||||
can merely disable those that are not permitted due to e.g. FIPS compliance
|
||||
requirements.
|
||||
|
||||
Notifications impact
|
||||
--------------------
|
||||
|
||||
None.
|
||||
|
||||
Other end user impact
|
||||
---------------------
|
||||
|
||||
This field is already supported by openstacksdk but is currently silently
|
||||
ignored. This will no longer be the case. Put another way, this will now work:
|
||||
|
||||
.. code-block:: python
|
||||
|
||||
import openstack
|
||||
|
||||
conn = openstack.connect()
|
||||
openstack.enable_logging(debug=True)
|
||||
|
||||
image = conn.image.create_image(
|
||||
'foobar',
|
||||
os_hash_algo='sha256',
|
||||
)
|
||||
print(image)
|
||||
|
||||
Or, using OpenStackClient (OSC):
|
||||
|
||||
.. code-block:: shell
|
||||
|
||||
openstack image create --property os_hash_algo=sha256 foobar
|
||||
|
||||
We may wish to add a new helper alias to the ``image create`` command in
|
||||
OpenStackClient, to allow users to specify this well-known alias easily but
|
||||
this is a nice-to-have.
|
||||
|
||||
Performance Impact
|
||||
------------------
|
||||
|
||||
None.
|
||||
|
||||
Other deployer impact
|
||||
---------------------
|
||||
|
||||
Deployers will now have the ability to configure the hashing algorithms that
|
||||
users can use when creating image. While this will default to a sensible set of
|
||||
default algorithms, they may wish to tweak this further to meet regulatory or
|
||||
organisational requirements.
|
||||
|
||||
Developer impact
|
||||
----------------
|
||||
|
||||
None.
|
||||
|
||||
Implementation
|
||||
==============
|
||||
|
||||
Assignee(s)
|
||||
-----------
|
||||
|
||||
Primary assignee:
|
||||
stephen.finucane
|
||||
|
||||
Other contributors:
|
||||
None
|
||||
|
||||
Work Items
|
||||
----------
|
||||
|
||||
- Add the new configuration option
|
||||
- Add necessary API logic to allow the user to specify this option during image
|
||||
creation and respect it during image upload.
|
||||
- Update documentation
|
||||
|
||||
Dependencies
|
||||
============
|
||||
|
||||
None.
|
||||
|
||||
Testing
|
||||
=======
|
||||
|
||||
Unit test and manual testing should suffice here, though we can also test this
|
||||
via a new Tempest test.
|
||||
|
||||
Documentation Impact
|
||||
====================
|
||||
|
||||
We will need to update the API documentation along with the Secure Hash
|
||||
Algorithm feature documentation.
|
||||
|
||||
References
|
||||
==========
|
||||
|
||||
None.
|
Loading…
Reference in New Issue
Block a user