Manage Secrets with OpenStack Key Manager
How to integrate OpenStack Key Manager (Barbican) with your OpenStack deployment.
Abstract
Making open source more inclusive Copy linkLink copied to clipboard!
Red Hat is committed to replacing problematic language in our code, documentation, and web properties. We are beginning with these four terms: master, slave, blacklist, and whitelist. Because of the enormity of this endeavor, these changes will be implemented gradually over several upcoming releases. For more details, see our CTO Chris Wright’s message.
Chapter 1. Overview Copy linkLink copied to clipboard!
OpenStack Key Manager (barbican) is the secrets manager for Red Hat OpenStack Platform. You can use the barbican API and command line to centrally manage the certificates, keys, and passwords used by OpenStack services. Barbican currently supports the following use cases described in this guide:
- Symmetric encryption keys - used for Block Storage (cinder) volume encryption, ephemeral disk encryption, and Object Storage (swift) encryption, among others.
- Asymmetric keys and certificates - used for glance image signing and verification, among others.
In this release, barbican offers integration with the Block Storage (cinder) and Compute (nova) components.
Chapter 2. Choosing a backend Copy linkLink copied to clipboard!
Secrets (such as certificates, API keys, and passwords) can either be stored as an encrypted blob in the barbican database, or directly in a secure storage system.
To store the secrets as an encrypted blob in the barbican database, the following options are available.
-
Simple crypto plugin - The simple crypto plugin is enabled by default and uses a single symmetric key to encrypt the blob of secrets. This key is stored in plain text in the
barbican.conffile.
The simple crypto plugin is currently the only plugin supported by Red Hat.
- PKCS#11 crypto plugin - The PKCS#11 crypto plugin encrypts secrets with project-specific key encryption keys (KEK), which are stored in the barbican database. These project-specific KEKs are encrypted by a master KEK, which is stored in a hardware security module (HSM). All encryption and decryption operations take place in the HSM, rather than in-process memory. The PKCS#11 plugin communicates with the HSM through the PKCS#11 protocol. Because the encryption is done in secure hardware, and a different KEK is used per project, this option is more secure than the simple crypto plugin.
Regarding high availability (HA) options: The barbican service runs within Apache and is configured by director to use HAProxy for high availability. HA options for the back end layer will depend on the back end being used. For example, for simple crypto, all the barbican instances have the same encryption key in the config file, resulting in a simple HA configuration.
2.1. Migrating between backends Copy linkLink copied to clipboard!
Barbican allows you to define a different backend for a project. If no mapping exists for a project, then secrets are stored in the global default backend. This means that multiple backends can be configured, but there must be at least one global backend defined. The heat templates supplied for the different backends contain the parameters that set each backend as the default.
If you do store secrets in a certain backend and then decide to migrate to a new backend, you can keep the old backend available while enabling the new backend as the global default (or as a project-specific backend). As a result, the old secrets remain available through the old backend.
Chapter 3. Installing Barbican Copy linkLink copied to clipboard!
Barbican is not enabled by default in Red Hat OpenStack Platform. This procedure describes how you can deploy barbican in an existing OpenStack deployment. Barbican runs as a containerized service, so this procedure also describes how to prepare and upload the new container images:
This procedure configures barbican to use the simple_crypto backend. Additional backends are available, such as PKCS11 and DogTag, however they are not supported in this release.
On the undercloud node, create an environment file for barbican. This will instruct director to install barbican (when its included in openstack overcloud deploy […])
cat /home/stack/configure-barbican.yaml parameter_defaults: BarbicanSimpleCryptoGlobalDefault: true
$ cat /home/stack/configure-barbican.yaml parameter_defaults: BarbicanSimpleCryptoGlobalDefault: trueCopy to Clipboard Copied! Toggle word wrap Toggle overflow -
BarbicanSimpleCryptoGlobalDefault- Sets this plugin as the global default plugin. Further options are also configurable:
-
BarbicanPassword- Sets a password for the barbican service account. -
BarbicanWorkers- Sets the number of workers forbarbican::wsgi::apache. Uses'%{::processorcount}'by default. -
BarbicanDebug- Enables debugging. -
BarbicanPolicies- Defines policies to configure for barbican. Uses a hash value, for example:{ barbican-context_is_admin: { key: context_is_admin, value: 'role:admin' } }. This entry is then added to/etc/barbican/policy.json. Policies are described in detail in a later section. -
BarbicanSimpleCryptoKek- The Key Encryption Key (KEK) is generated by director, if none is specified.
-
-
This step prepares new container images for barbican. You will need to include the
configure-barbican.yamland all the relevant template files. Change the following example to suit your deployment:Copy to Clipboard Copied! Toggle word wrap Toggle overflow Upload the new container images to the undercloud registry:
openstack overcloud container image upload --debug --config-file container-images-with-barbican.yaml
$ openstack overcloud container image upload --debug --config-file container-images-with-barbican.yamlCopy to Clipboard Copied! Toggle word wrap Toggle overflow Prepare the new environment file:
Copy to Clipboard Copied! Toggle word wrap Toggle overflow To apply these changes to your deployment: update the overcloud and specify all the heat template files that you used in your previous openstack overcloud deploy […]. For example:
Copy to Clipboard Copied! Toggle word wrap Toggle overflow
3.1. Add users to the creator role on Overcloud Copy linkLink copied to clipboard!
Users must be members of the creator role in order to create and edit barbican secrets, or to create encrypted volumes that store their secret in barbican.
Retrieve the
idof thecreatorrole:Copy to Clipboard Copied! Toggle word wrap Toggle overflow NoteYou will not see the
creatorrole unless OpenStack Key Manager (barbican) is installed.Assign a user to the
creatorrole and specify the relevant project. In this example, a user nameduser1in theproject_aproject is added to thecreatorrole:openstack role add --user user1 --project project_a 4e9c560c6f104608948450fbf316f9d7
openstack role add --user user1 --project project_a 4e9c560c6f104608948450fbf316f9d7Copy to Clipboard Copied! Toggle word wrap Toggle overflow
3.1.1. Test barbican functionality Copy linkLink copied to clipboard!
This section describes how to test that barbican is working correctly.
Create a test secret. For example:
Copy to Clipboard Copied! Toggle word wrap Toggle overflow Retrieve the payload for the secret you just created:
Copy to Clipboard Copied! Toggle word wrap Toggle overflow
3.2. Understanding policies Copy linkLink copied to clipboard!
Barbican uses policies to determine which users are allowed to perform actions against the secrets, such as adding or deleting keys. To implement these controls, keystone project roles (such as creator you created earlier) are mapped to barbican internal permissions. As a result, users assigned to those project roles receive the corresponding barbican permissions.
3.2.1. Viewing the default policy Copy linkLink copied to clipboard!
The default policy is defined in code and typically does not require any amendments. You can view the default policy by generating it from the barbican source code:
Perform the following steps on a non-production system, because additional components may be downloaded and installed. This example switches to the
queensbranch, so you must adapt this if using a different version.git clone https://github.com/openstack/barbican cd /home/stack/barbican git checkout origin/stable/queens tox -e genpolicy
git clone https://github.com/openstack/barbican cd /home/stack/barbican git checkout origin/stable/queens tox -e genpolicyCopy to Clipboard Copied! Toggle word wrap Toggle overflow This generates a policy file within a subdirectory that contains the default settings:
etc/barbican/policy.yaml.sample. Note that this path refers to a subdirectory within the repository, not your system’s/etcdirectory. The contents of this file are explained in the following step.The
policy.yaml.samplefile you generated describes the policies used by barbican. The policy is implemented by four different roles that define how a user interacts with secrets and secret metadata. A user receives these permissions by being assigned to a particular role:-
admin- Can delete, create/edit, and read secrets. -
creator- Can create/edit, and read secrets. Can not delete secrets. -
observer- Can only read data. audit- Can only read metadata. Can not read secrets.For example, the following entries list the
admin,observer, andcreatorkeystone roles for each project. On the right, notice that they are assigned therole:admin,role:observer, androle:creatorpermissions:Copy to Clipboard Copied! Toggle word wrap Toggle overflow These roles can also be grouped together by barbican. For example, rules that specify
admin_or_creatorcan apply to members of eitherrule:adminorrule:creator.
-
Further down in the file, there are
secret:putandsecret:deleteactions. To their right, notice which roles have permissions to execute these actions. In the following example,secret:deletemeans that onlyadminandcreatorrole members can delete secret entries. In addition, the rule states that users in theadminorcreatorrole for that project can delete a secret in that project. The project match is defined by thesecret_project_matchrule, which is also defined in the policy.secret:delete": "rule:admin_or_creator and rule:secret_project_match"
secret:delete": "rule:admin_or_creator and rule:secret_project_match"Copy to Clipboard Copied! Toggle word wrap Toggle overflow
Chapter 4. Managing secrets in barbican Copy linkLink copied to clipboard!
4.1. Listing secrets Copy linkLink copied to clipboard!
Secrets are identified by their URI, indicated as a href value. This example shows the secret you created in the previous step:
4.2. Adding new secrets Copy linkLink copied to clipboard!
Create a test secret. For example:
4.3. Updating secrets Copy linkLink copied to clipboard!
You cannot change the payload of a secret (other than deleting the secret), but if you initially created a secret without specifying a payload, you can later add a payload to it by using the update function. For example:
openstack secret update https://192.168.123.163:9311/v1/secrets/ca34a264-fd09-44a1-8856-c6e7116c3b16 'TestPayload-updated'
$ openstack secret update https://192.168.123.163:9311/v1/secrets/ca34a264-fd09-44a1-8856-c6e7116c3b16 'TestPayload-updated'
$
4.4. Deleting secrets Copy linkLink copied to clipboard!
You can delete a secret by specifying its URI. For example:
openstack secret delete https://192.168.123.163:9311/v1/secrets/ecc7b2a4-f0b0-47ba-b451-0f7d42bc1746
$ openstack secret delete https://192.168.123.163:9311/v1/secrets/ecc7b2a4-f0b0-47ba-b451-0f7d42bc1746
$
4.5. Generate a symmetric key Copy linkLink copied to clipboard!
Symmetric keys are suitable for certain tasks, such as nova disk encryption and swift object encryption.
Generate a new 256-bit key using
order createand store it in barbican. For example:Copy to Clipboard Copied! Toggle word wrap Toggle overflow -
--mode- Generated keys can be configured to use a particular mode, such asctrorcbc. For more information, see NIST SP 800-38A.
-
View the details of the order to identify the location of the generated key, shown here as the
Secret hrefvalue:Copy to Clipboard Copied! Toggle word wrap Toggle overflow Retrieve the details of the secret:
Copy to Clipboard Copied! Toggle word wrap Toggle overflow
4.6. Backup and Restore Keys Copy linkLink copied to clipboard!
The process for backup and restore of encryption keys will vary depending on the type of back end:
4.6.1. Backup and restore the simple crypto back end Copy linkLink copied to clipboard!
Two separate components need to be backed up for simple crypto back end: the KEK and the database. It is recommended that you regularly test your backup and restore process.
4.6.1.1. Backup and restore the KEK Copy linkLink copied to clipboard!
For the simple crypto back end, you need to backup the barbican.conf file that contains the master KEK is written. This file must be backed up to a security hardened location. The actual data is stored in the Barbican database in an encrypted state, described in the next section.
-
To restore the key from a backup, you need to copy the restored
barbican.confover the existingbarbican.conf.
4.6.1.2. Backup and restore the back end database Copy linkLink copied to clipboard!
This procedure describes how to backup and restore a barbican database for the simple crypto back end. To demonstrate this, you will generate a key and upload the secrets to barbican. You will then backup the barbican database, and delete the secrets you created. You will then restore the database and confirm that the secrets you created earlier have been recovered.
Be sure you are also backing up the KEK, as this is also an important requirement. This is described in the previous section.
4.6.1.2.1. Create the test secret Copy linkLink copied to clipboard!
On the overcloud, generate a new 256-bit key using
order createand store it in barbican. For example:Copy to Clipboard Copied! Toggle word wrap Toggle overflow Create a test secret:
Copy to Clipboard Copied! Toggle word wrap Toggle overflow Confirm that the secrets were created:
Copy to Clipboard Copied! Toggle word wrap Toggle overflow
4.6.1.2.2. Backup the barbican database Copy linkLink copied to clipboard!
Run these steps while logged in to the controller-0 node.
Only the user barbican has access to the barbican database. So the barbican user password is required to backup or restore the database.
Retrieve barbican user password. For example:
sudo grep -r "barbican::db::mysql::password" /etc/puppet/hieradata
[heat-admin@controller-0 ~]$ sudo grep -r "barbican::db::mysql::password" /etc/puppet/hieradata /etc/puppet/hieradata/service_configs.json: "barbican::db::mysql::password": "seDJRsMNRrBdFryCmNUEFPPev",Copy to Clipboard Copied! Toggle word wrap Toggle overflow Backup the barbican database:
mysqldump -u barbican -p"seDJRsMNRrBdFryCmNUEFPPev" barbican > barbican_db_backup.sql
[heat-admin@controller-0 ~]$ mysqldump -u barbican -p"seDJRsMNRrBdFryCmNUEFPPev" barbican > barbican_db_backup.sqlCopy to Clipboard Copied! Toggle word wrap Toggle overflow Database backup is stored in /home/heat-admin
ll
[heat-admin@controller-0 ~]$ ll total 36 -rw-rw-r--. 1 heat-admin heat-admin 36715 Jun 19 18:31 barbican_db_backup.sqlCopy to Clipboard Copied! Toggle word wrap Toggle overflow
4.6.1.2.3. Delete the test secrets Copy linkLink copied to clipboard!
On the overcloud, delete the secrets you created previously, and verify they no longer exist. For example:
openstack secret delete http://10.0.0.104:9311/v1/secrets/93f62cfd-e008-401f-be74-bf057c88b04a openstack secret delete http://10.0.0.104:9311/v1/secrets/f664b5cf-5221-47e5-9887-608972a5fefb openstack secret list
(overcloud) [stack@undercloud-0 ~]$ openstack secret delete http://10.0.0.104:9311/v1/secrets/93f62cfd-e008-401f-be74-bf057c88b04a (overcloud) [stack@undercloud-0 ~]$ openstack secret delete http://10.0.0.104:9311/v1/secrets/f664b5cf-5221-47e5-9887-608972a5fefb (overcloud) [stack@undercloud-0 ~]$ openstack secret list (overcloud) [stack@undercloud-0 ~]$Copy to Clipboard Copied! Toggle word wrap Toggle overflow
4.6.1.2.4. Restore the databases Copy linkLink copied to clipboard!
Run these steps while logged in to the controller-0 node.
Make sure you have the barbican database on the controller which grants access to the
barbicanuser for database restoration:Copy to Clipboard Copied! Toggle word wrap Toggle overflow
9) Restore the backup file to the barbican database:
+
sudo mysql -u barbican -p"seDJRsMNRrBdFryCmNUEFPPev" barbican < barbican_db_backup.sql
[heat-admin@controller-0 ~]$ sudo mysql -u barbican -p"seDJRsMNRrBdFryCmNUEFPPev" barbican < barbican_db_backup.sql
[heat-admin@controller-0 ~]$
4.6.1.2.5. Verify the restore process Copy linkLink copied to clipboard!
On the overcloud, verify that the test secrets were restored successfully:
Copy to Clipboard Copied! Toggle word wrap Toggle overflow
Chapter 5. Encrypting cinder volumes Copy linkLink copied to clipboard!
You can use barbican to manage your Block Storage (cinder) encryption keys. This configuration uses LUKS to encrypt the disks attached to your instances, including boot disks. Key management is transparent to the user; when you create a new volume using luks as the encryption type, cinder generates a symmetric key secret for the volume and stores it in barbican. When booting the instance (or attaching an encrypted volume), nova retrieves the key from barbican and stores the secret locally as a Libvirt secret on the Compute node.
Nova formats encrypted volumes during their first use if they are unencrypted. The resulting block device is then presented to the Compute node.
If you intend to update any configuration files, be aware that certain OpenStack services now run within containers; this applies to keystone, nova, and cinder, among others. As a result, there are administration practices to consider:
-
Do not update any configuration file you might find on the physical node’s host operating system, for example,
/etc/cinder/cinder.conf. The containerized service does not reference this file. Do not update the configuration file running within the container. Changes are lost once you restart the container.
Instead, if you must change containerized services, update the configuration file in
/var/lib/config-data/puppet-generated/, which is used to generate the container.For example:
-
keystone:
/var/lib/config-data/puppet-generated/keystone/etc/keystone/keystone.conf -
cinder:
/var/lib/config-data/puppet-generated/cinder/etc/cinder/cinder.conf nova:
/var/lib/config-data/puppet-generated/nova_libvirt/etc/nova/nova.confChanges are applied after you restart the container.
On nodes running the
cinder-volumeandnova-computeservices, confirm that nova and cinder are both configured to use barbican for key management:crudini --get /var/lib/config-data/puppet-generated/cinder/etc/cinder/cinder.conf key_manager backend crudini --get /var/lib/config-data/puppet-generated/nova_libvirt/etc/nova/nova.conf key_manager backend
$ crudini --get /var/lib/config-data/puppet-generated/cinder/etc/cinder/cinder.conf key_manager backend castellan.key_manager.barbican_key_manager.BarbicanKeyManager $ crudini --get /var/lib/config-data/puppet-generated/nova_libvirt/etc/nova/nova.conf key_manager backend castellan.key_manager.barbican_key_manager.BarbicanKeyManagerCopy to Clipboard Copied! Toggle word wrap Toggle overflow Create a volume template that uses encryption. When you create new volumes they can be modeled off the settings you define here:
Copy to Clipboard Copied! Toggle word wrap Toggle overflow Create a new volume and specify that it uses the
LuksEncryptor-Template-256settings:NoteEnsure that the user creating the encrypted volume has the
creatorbarbican role on the project. For more information, see theGrant user access to the creator rolesection.Copy to Clipboard Copied! Toggle word wrap Toggle overflow The resulting secret is automatically uploaded to the barbican backend.
Use barbican to confirm that the disk encryption key is present. In this example, the timestamp matches the LUKS volume creation time:
Copy to Clipboard Copied! Toggle word wrap Toggle overflow Attach the new volume to an existing instance. For example:
openstack server add volume testInstance Encrypted-Test-Volume
$ openstack server add volume testInstance Encrypted-Test-VolumeCopy to Clipboard Copied! Toggle word wrap Toggle overflow The volume is then presented to the guest operating system and can be mounted using the built-in tools.
5.1. Migrate existing volume keys to Barbican Copy linkLink copied to clipboard!
Previously, deployments might have used ConfKeyManager to manage disk encryption keys. This meant that a fixed key was generated and then stored in the nova and cinder configuration files. The key IDs can be migrated to barbican using the following procedure. This utility works by scanning the databases for encryption_key_id entries within scope for migration to barbican. Each entry gets a new barbican key ID and the existing ConfKeyManager secret is retained.
Previously, you could reassign ownership for volumes encrypted using ConfKeyManager. This is not possible for volumes that have their keys managed by barbican.
Activating barbican will not break your existing keymgr volumes.
After it is enabled, the migration process runs automatically, but it requires some configuration, described in the next section. The actual migration runs in the cinder-volume and cinder-backup process, and you can track the progress in the cinder log files.
-
cinder-volume- migrates keys stored in cinder’s Volumes and Snapshots tables. -
cinder-backup- migrates keys in the Backups table.
5.1.1. Overview of the migration steps Copy linkLink copied to clipboard!
- Deploy the barbican service.
Add the
creatorrole to the cinder service. For example:#openstack role create creator #openstack role add --user cinder creator --project service
#openstack role create creator #openstack role add --user cinder creator --project serviceCopy to Clipboard Copied! Toggle word wrap Toggle overflow -
Restart the
cinder-volumeandcinder-backupservices. -
cinder-volumeandcinder-backupautomatically begin the migration process. -
Monitor the logs for the message indicating migration has finished and check that no more volumes are using the
ConfKeyManagerall-zeros encryption key ID. -
Remove the
fixed_keyoption fromcinder.confandnova.conf. You must determine which nodes have this setting configured. -
Remove the
creatorrole from the cinder service.
5.1.2. Behavioral differences Copy linkLink copied to clipboard!
Barbican-managed encrypted volumes behave differently than volumes that use ConfKeyManager:
- You cannot transfer ownership of encrypted volumes, because it is not currently possible to transfer ownership of the barbican secret.
- Barbican is more restrictive about who is allowed to read and delete secrets, which can affect some cinder volume operations. For example, a user cannot attach, detach, or delete a different user’s volumes.
5.1.3. Reviewing the migration process Copy linkLink copied to clipboard!
This section describes how you can view the status of the migration tasks. After you start the process, one of these entries appears in the logs. This indicates whether the migration started correctly, or it identifies the issue it encountered:
-
Not migrating encryption keys because the ConfKeyManager is still in use. -
Not migrating encryption keys because the ConfKeyManager's fixed_key is not in use. -
Not migrating encryption keys because migration to the 'XXX' key_manager backend is not supported.- This message is unlikely to appear; it is a safety check to handle the code ever encountering another Key Manager backend other than barbican. This is because the code only supports one migration scenario: From ConfKeyManager to barbican. -
Not migrating encryption keys because there are no volumes associated with this host.- This may occur whencinder-volumeis running on multiple hosts, and a particular host has no volumes associated with it. This arises because every host is responsible for handling its own volumes. -
Starting migration of ConfKeyManager keys. Migrating volume <UUID> encryption key to Barbican- During migration, all of the host’s volumes are examined, and if a volume is still using the ConfKeyManager’s key ID (identified by the fact that it’s all zeros (00000000-0000-0000-0000-000000000000)), then this message appears.-
For
cinder-backup, this message uses slightly different capitalization:Migrating Volume [...]orMigrating Backup [...]
-
For
After each host examines all of its volumes, the host displays a summary status message:
`No volumes are using the ConfKeyManager's encryption_key_id.` `No backups are known to be using the ConfKeyManager's encryption_key_id.`
`No volumes are using the ConfKeyManager's encryption_key_id.` `No backups are known to be using the ConfKeyManager's encryption_key_id.`Copy to Clipboard Copied! Toggle word wrap Toggle overflow You may also see the following entries:
There are still %d volume(s) using the ConfKeyManager's all-zeros encryption key ID.There are still %d backup(s) using the ConfKeyManager’s all-zeros encryption key ID.Note that both of these messages can appear in thecinder-volumeandcinder-backuplogs. Whereas each service only handles the migration of its own entries, the service is aware of the the other’s status. As a result,cinder-volumeknows ifcinder-backupstill has backups to migrate, andcinder-backupknows if thecinder-volumeservice has volumes to migrate.Although each host migrates only its own volumes, the summary message is based on a global assessment of whether any volume still requires migration This allows you to confirm that migration for all volumes is complete. Once you receive confirmation, remove the
fixed_keysetting fromcinder.confandnova.conf. See the Clean up the fixed keys section below for more information.
5.1.4. Troubleshooting the migration process Copy linkLink copied to clipboard!
5.1.4.1. Role assignment Copy linkLink copied to clipboard!
The barbican secret can only be created when the requestor has the creator role. This means that the cinder service itself requires the creator role, otherwise a log sequence similar to this will occur:
-
Starting migration of ConfKeyManager keys. -
Migrating volume <UUID> encryption key to Barbican -
Error migrating encryption key: Forbidden: Secret creation attempt not allowed - please review your user/project privileges -
There are still %d volume(s) using the ConfKeyManager's all-zeros encryption key ID.
The key message is the third one: Secret creation attempt not allowed. To fix the problem, update the cinder account’s privileges:
-
Run
openstack role add --project service --user cinder creator -
Restart the
cinder-volumeandcinder-backupservices.
As a result, the next attempt at migration should succeed.
5.1.5. Clean up the fixed keys Copy linkLink copied to clipboard!
The encryption_key_id was only recently added to the Backup table, as part of the Queens release. As a result, pre-existing backups of encrypted volumes are likely to exist. The all-zeros encryption_key_id is stored on the backup itself, but it won’t appear in the Backup database. As such, it is impossible for the migration process to know for certain whether a backup of an encrypted volume exists that still relies on the all-zeros ConfKeyMgr key ID.
After migrating your key IDs into barbican, the fixed key remains in the configuration files. This may present a security concern to some users, because the fixed_key value is not encrypted in the .conf files. To address this, you can manually remove the fixed_key values from your nova and cinder configurations. However, first complete testing and review the output of the log file before you proceed, because disks that are still dependent on this value will not be accessible.
Review the existing
fixed_keyvalues. The values must match for both services.crudini --get /var/lib/config-data/puppet-generated/cinder/etc/cinder/cinder.conf keymgr fixed_key crudini --get /var/lib/config-data/puppet-generated/nova_libvirt/etc/nova/nova.conf keymgr fixed_key
crudini --get /var/lib/config-data/puppet-generated/cinder/etc/cinder/cinder.conf keymgr fixed_key crudini --get /var/lib/config-data/puppet-generated/nova_libvirt/etc/nova/nova.conf keymgr fixed_keyCopy to Clipboard Copied! Toggle word wrap Toggle overflow -
IMPORTANT: Make a backup of the existing
fixed_keyvalues. This allows you to restore the value if something goes wrong, or if you need to restore a backup that uses the old encryption key. Delete the
fixed_keyvalues:crudini --del /var/lib/config-data/puppet-generated/cinder/etc/cinder/cinder.conf keymgr fixed_key crudini --del /var/lib/config-data/puppet-generated/nova_libvirt/etc/nova/nova.conf keymgr fixed_key
crudini --del /var/lib/config-data/puppet-generated/cinder/etc/cinder/cinder.conf keymgr fixed_key crudini --del /var/lib/config-data/puppet-generated/nova_libvirt/etc/nova/nova.conf keymgr fixed_keyCopy to Clipboard Copied! Toggle word wrap Toggle overflow
Chapter 6. Encrypt at-rest swift objects Copy linkLink copied to clipboard!
By default, objects uploaded to Object Storage are stored unencrypted. Because of this, it is possible to access objects directly from the file system. This can present a security risk if disks are not properly erased before they are discarded. When you have barbican enabled, the Object Storage service (swift) can transparently encrypt and decrypt your stored (at-rest) objects. At-rest encryption is distinct from in-transit encryption in that it refers to the objects being encrypted while being stored on disk.
Swift performs these encryption tasks transparently, with the objects being automatically encrypted when uploaded to swift, then automatically decrypted when served to a user. This encryption and decryption is done using the same (symmetric) key, which is stored in barbican.
You cannot disable encryption after you have enabled encryption and added data to the swift cluster, because the data is now stored in an encrypted state. Consequently, the data will not be readable if encryption is disabled, until you re-enable encryption with the same key.
6.1. Enable at-rest encryption for swift Copy linkLink copied to clipboard!
-
You can enable the swift encryption capabilities by including
SwiftEncryptionEnabled: Truein your environment file, then re-runningopenstack overcloud deployusing/home/stack/overcloud_deploy.sh. Note that you still need to enable barbican, as described in the Install Barbican chapter. Confirm that swift is configured to use at-rest encryption:
crudini --get /var/lib/config-data/puppet-generated/swift/etc/swift/proxy-server.conf pipeline-main pipeline
$ crudini --get /var/lib/config-data/puppet-generated/swift/etc/swift/proxy-server.conf pipeline-main pipeline pipeline = catch_errors healthcheck proxy-logging cache ratelimit bulk tempurl formpost authtoken keystone staticweb copy container_quotas account_quotas slo dlo versioned_writes kms_keymaster encryption proxy-logging proxy-serverCopy to Clipboard Copied! Toggle word wrap Toggle overflow The result should include an entry for
encryption.
Chapter 7. Validate glance images Copy linkLink copied to clipboard!
After enabling Barbican, you can configure the Image Service (glance) to verify that an uploaded image has not been tampered with. In this implementation, the image is first signed with a key that is stored in barbican. The image is then uploaded to glance, along with the accompanying signing information. As a result, the image’s signature is verified before each use, with the instance build process failing if the signature does not match.
Barbican’s integration with glance means that you can use the openssl command with your private key to sign glance images before uploading them.
7.1. Enable glance image validation Copy linkLink copied to clipboard!
In your environment file, enable image verification with the VerifyGlanceSignatures: True setting. You must re-run the openstack overcloud deploy command for this setting to take effect.
To verify that glance image validation is enabled, run the following command on an overcloud Compute node:
sudo crudini --get /var/lib/config-data/puppet-generated/nova_libvirt/etc/nova/nova.conf glance verify_glance_signatures
$ sudo crudini --get /var/lib/config-data/puppet-generated/nova_libvirt/etc/nova/nova.conf glance verify_glance_signatures
If you use Ceph as the back end for the Image and Compute services, a CoW clone is created. Therefore, Image signing verification cannot be performed.
7.2. Validate an image Copy linkLink copied to clipboard!
To configure a glance image for validation, complete the following steps:
Confirm that glance is configured to use barbican:
sudo crudini --get /var/lib/config-data/puppet-generated/glance_api/etc/glance/glance-api.conf key_manager backend
$ sudo crudini --get /var/lib/config-data/puppet-generated/glance_api/etc/glance/glance-api.conf key_manager backend castellan.key_manager.barbican_key_manager.BarbicanKeyManagerCopy to Clipboard Copied! Toggle word wrap Toggle overflow Generate a certificate:
openssl genrsa -out private_key.pem 1024 openssl rsa -pubout -in private_key.pem -out public_key.pem openssl req -new -key private_key.pem -out cert_request.csr openssl x509 -req -days 14 -in cert_request.csr -signkey private_key.pem -out x509_signing_cert.crt
openssl genrsa -out private_key.pem 1024 openssl rsa -pubout -in private_key.pem -out public_key.pem openssl req -new -key private_key.pem -out cert_request.csr openssl x509 -req -days 14 -in cert_request.csr -signkey private_key.pem -out x509_signing_cert.crtCopy to Clipboard Copied! Toggle word wrap Toggle overflow Add certificate to the barbican secret store:
source ~/overcloudrc openstack secret store --name signing-cert --algorithm RSA --secret-type certificate --payload-content-type "application/octet-stream" --payload-content-encoding base64 --payload "$(base64 x509_signing_cert.crt)" -c 'Secret href' -f value
$ source ~/overcloudrc $ openstack secret store --name signing-cert --algorithm RSA --secret-type certificate --payload-content-type "application/octet-stream" --payload-content-encoding base64 --payload "$(base64 x509_signing_cert.crt)" -c 'Secret href' -f value https://192.168.123.170:9311/v1/secrets/5df14c2b-f221-4a02-948e-48a61edd3f5bCopy to Clipboard Copied! Toggle word wrap Toggle overflow NoteRecord the resulting UUID for use in a later step. In this example, the certificate’s UUID is
5df14c2b-f221-4a02-948e-48a61edd3f5b.Use
private_key.pemto sign the image and generate the.signaturefile. For example:openssl dgst -sha256 -sign private_key.pem -sigopt rsa_padding_mode:pss -out cirros-0.4.0.signature cirros-0.4.0-x86_64-disk.img
$ openssl dgst -sha256 -sign private_key.pem -sigopt rsa_padding_mode:pss -out cirros-0.4.0.signature cirros-0.4.0-x86_64-disk.imgCopy to Clipboard Copied! Toggle word wrap Toggle overflow Convert the resulting
.signaturefile into base64 format:base64 -w 0 cirros-0.4.0.signature > cirros-0.4.0.signature.b64
$ base64 -w 0 cirros-0.4.0.signature > cirros-0.4.0.signature.b64Copy to Clipboard Copied! Toggle word wrap Toggle overflow Load the base64 value into a variable to use it in the subsequent command:
cirros_signature_b64=$(cat cirros-0.4.0.signature.b64)
$ cirros_signature_b64=$(cat cirros-0.4.0.signature.b64)Copy to Clipboard Copied! Toggle word wrap Toggle overflow Upload the signed image to glance. For
img_signature_certificate_uuid, you must specify the UUID of the signing key you previously uploaded to barbican:Copy to Clipboard Copied! Toggle word wrap Toggle overflow You can view glance’s image validation activities in the Compute log:
/var/log/containers/nova/nova-compute.log. For example, you can expect the following entry when the instance is booted:2018-05-24 12:48:35.256 1 INFO nova.image.glance [req-7c271904-4975-4771-9d26-cbea6c0ade31 b464b2fd2a2140e9a88bbdacf67bdd8c a3db2f2beaee454182c95b646fa7331f - default default] Image signature verification succeeded for image d3396fa0-2ea2-4832-8a77-d36fa3f2ab27
2018-05-24 12:48:35.256 1 INFO nova.image.glance [req-7c271904-4975-4771-9d26-cbea6c0ade31 b464b2fd2a2140e9a88bbdacf67bdd8c a3db2f2beaee454182c95b646fa7331f - default default] Image signature verification succeeded for image d3396fa0-2ea2-4832-8a77-d36fa3f2ab27Copy to Clipboard Copied! Toggle word wrap Toggle overflow