Skip to content

Commit a5fadac

Browse files
authored
Merge pull request ceph#60966 from gbregman/main
mgr/cephadm/nvmeof: Add encryption key file for nvmeof encryption
2 parents 2a864ad + dbe8c92 commit a5fadac

File tree

7 files changed

+26
-0
lines changed

7 files changed

+26
-0
lines changed

src/cephadm/cephadmlib/daemons/nvmeof.py

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -100,6 +100,7 @@ def _get_tls_cert_key_mounts(
100100
'client_cert',
101101
'client_key',
102102
'root_ca_cert',
103+
'encryption_key',
103104
]:
104105
if fn in files:
105106
mounts[

src/pybind/mgr/cephadm/inventory.py

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -438,6 +438,7 @@ def _save_certs_and_keys(self, spec: ServiceSpec) -> None:
438438
for key_attr in [
439439
'server_key',
440440
'client_key',
441+
'encryption_key',
441442
]:
442443
key = getattr(nvmeof_spec, key_attr, None)
443444
if key:
@@ -490,6 +491,7 @@ def _rm_certs_and_keys(self, spec: ServiceSpec) -> None:
490491
self.mgr.cert_key_store.rm_cert('nvmeof_root_ca_cert', service_name=spec.service_name())
491492
self.mgr.cert_key_store.rm_key('nvmeof_server_key', service_name=spec.service_name())
492493
self.mgr.cert_key_store.rm_key('nvmeof_client_key', service_name=spec.service_name())
494+
self.mgr.cert_key_store.rm_key('nvmeof_encryption_key', service_name=spec.service_name())
493495

494496
def get_created(self, spec: ServiceSpec) -> Optional[datetime.datetime]:
495497
return self.spec_created.get(spec.service_name())
@@ -1969,6 +1971,7 @@ class CertKeyStore():
19691971
'ingress_ssl_key',
19701972
'nvmeof_server_key',
19711973
'nvmeof_client_key',
1974+
'nvmeof_encryption_key',
19721975
]
19731976

19741977
known_certs: Dict[str, Any] = {}
@@ -2005,6 +2008,7 @@ def _init_known_cert_key_dicts(self) -> None:
20052008
'ingress_ssl_key': {}, # service-name -> key
20062009
'nvmeof_server_key': {}, # service-name -> key
20072010
'nvmeof_client_key': {}, # service-name -> key
2011+
'nvmeof_encryption_key': {}, # service-name -> key
20082012
}
20092013

20102014
def get_cert(self, entity: str, service_name: str = '', host: str = '') -> str:

src/pybind/mgr/cephadm/services/nvmeof.py

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -91,6 +91,9 @@ def prepare_create(self, daemon_spec: CephadmDaemonDeploySpec) -> CephadmDaemonD
9191
daemon_spec.extra_files['client_key'] = spec.client_key
9292
daemon_spec.extra_files['root_ca_cert'] = spec.root_ca_cert
9393

94+
if spec.encryption_key:
95+
daemon_spec.extra_files['encryption_key'] = spec.encryption_key
96+
9497
daemon_spec.final_config, daemon_spec.deps = self.generate_config(daemon_spec)
9598
daemon_spec.deps = []
9699
return daemon_spec

src/pybind/mgr/cephadm/templates/services/nvmeof/ceph-nvmeof.conf.j2

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -9,6 +9,7 @@ state_update_notify = {{ spec.state_update_notify }}
99
state_update_interval_sec = {{ spec.state_update_interval_sec }}
1010
enable_spdk_discovery_controller = {{ spec.enable_spdk_discovery_controller }}
1111
enable_key_encryption = {{ spec.enable_key_encryption }}
12+
encryption_key = /encryption.key
1213
enable_prometheus_exporter = {{ spec.enable_prometheus_exporter }}
1314
prometheus_exporter_ssl = False
1415
prometheus_port = 10008

src/pybind/mgr/cephadm/tests/test_cephadm.py

Lines changed: 13 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1797,15 +1797,18 @@ def test_cert_store_save_key(self, _set_store, cephadm_module: CephadmOrchestrat
17971797
grafana_host1_key = 'fake-grafana-host1-key'
17981798
nvmeof_client_key = 'nvmeof-client-key'
17991799
nvmeof_server_key = 'nvmeof-server-key'
1800+
nvmeof_encryption_key = 'nvmeof-encryption-key'
18001801
grafana_host1_key = 'fake-grafana-host1-cert'
18011802
cephadm_module.cert_key_store.save_key('grafana_key', grafana_host1_key, host='host1')
18021803
cephadm_module.cert_key_store.save_key('nvmeof_client_key', nvmeof_client_key, service_name='nvmeof.foo')
18031804
cephadm_module.cert_key_store.save_key('nvmeof_server_key', nvmeof_server_key, service_name='nvmeof.foo')
1805+
cephadm_module.cert_key_store.save_key('nvmeof_encryption_key', nvmeof_encryption_key, service_name='nvmeof.foo')
18041806

18051807
expected_calls = [
18061808
mock.call(f'{CERT_STORE_KEY_PREFIX}grafana_key', json.dumps({'host1': PrivKey(grafana_host1_key).to_json()})),
18071809
mock.call(f'{CERT_STORE_KEY_PREFIX}nvmeof_client_key', json.dumps({'nvmeof.foo': PrivKey(nvmeof_client_key).to_json()})),
18081810
mock.call(f'{CERT_STORE_KEY_PREFIX}nvmeof_server_key', json.dumps({'nvmeof.foo': PrivKey(nvmeof_server_key).to_json()})),
1811+
mock.call(f'{CERT_STORE_KEY_PREFIX}nvmeof_encryption_key', json.dumps({'nvmeof.foo': PrivKey(nvmeof_encryption_key).to_json()})),
18091812
]
18101813
_set_store.assert_has_calls(expected_calls)
18111814

@@ -1822,15 +1825,19 @@ def test_cert_store_key_ls(self, _set_store, cephadm_module: CephadmOrchestrator
18221825
'ingress_ssl_key': False,
18231826
'nvmeof_client_key': False,
18241827
'nvmeof_server_key': False,
1828+
'nvmeof_encryption_key': False,
18251829
}
18261830
assert cephadm_module.cert_key_store.key_ls() == expected_ls
18271831

18281832
cephadm_module.cert_key_store.save_key('nvmeof_client_key', 'xxx', service_name='nvmeof.foo')
18291833
cephadm_module.cert_key_store.save_key('nvmeof_server_key', 'xxx', service_name='nvmeof.foo')
1834+
cephadm_module.cert_key_store.save_key('nvmeof_encryption_key', 'xxx', service_name='nvmeof.foo')
18301835
expected_ls['nvmeof_server_key'] = {}
18311836
expected_ls['nvmeof_server_key']['nvmeof.foo'] = True
18321837
expected_ls['nvmeof_client_key'] = {}
18331838
expected_ls['nvmeof_client_key']['nvmeof.foo'] = True
1839+
expected_ls['nvmeof_encryption_key'] = {}
1840+
expected_ls['nvmeof_encryption_key']['nvmeof.foo'] = True
18341841
assert cephadm_module.cert_key_store.key_ls() == expected_ls
18351842

18361843
@mock.patch("cephadm.module.CephadmOrchestrator.get_store_prefix")
@@ -1844,6 +1851,7 @@ def test_cert_store_load(self, _get_store_prefix, cephadm_module: CephadmOrchest
18441851
nvmeof_root_ca_cert = 'nvmeof-root-ca-cert'
18451852
nvmeof_server_key = 'nvmeof-server-key'
18461853
nvmeof_client_key = 'nvmeof-client-key'
1854+
nvmeof_encryption_key = 'nvmeof-encryption-key'
18471855

18481856
def _fake_prefix_store(key):
18491857
if key == 'cert_store.cert.':
@@ -1858,6 +1866,7 @@ def _fake_prefix_store(key):
18581866
f'{CERT_STORE_KEY_PREFIX}grafana_key': json.dumps({'host1': PrivKey(grafana_host1_key).to_json()}),
18591867
f'{CERT_STORE_KEY_PREFIX}nvmeof_server_key': json.dumps({'nvmeof.foo': PrivKey(nvmeof_server_key).to_json()}),
18601868
f'{CERT_STORE_KEY_PREFIX}nvmeof_client_key': json.dumps({'nvmeof.foo': PrivKey(nvmeof_client_key).to_json()}),
1869+
f'{CERT_STORE_KEY_PREFIX}nvmeof_encryption_key': json.dumps({'nvmeof.foo': PrivKey(nvmeof_encryption_key).to_json()}),
18611870
}
18621871
else:
18631872
raise Exception(f'Get store with unexpected value {key}')
@@ -1871,6 +1880,7 @@ def _fake_prefix_store(key):
18711880
assert cephadm_module.cert_key_store.known_keys['grafana_key']['host1'] == PrivKey(grafana_host1_key)
18721881
assert cephadm_module.cert_key_store.known_keys['nvmeof_server_key']['nvmeof.foo'] == PrivKey(nvmeof_server_key)
18731882
assert cephadm_module.cert_key_store.known_keys['nvmeof_client_key']['nvmeof.foo'] == PrivKey(nvmeof_client_key)
1883+
assert cephadm_module.cert_key_store.known_keys['nvmeof_encryption_key']['nvmeof.foo'] == PrivKey(nvmeof_encryption_key)
18741884

18751885
def test_cert_store_get_cert_key(self, cephadm_module: CephadmOrchestrator):
18761886
cephadm_module.cert_key_store._init_known_cert_key_dicts()
@@ -1898,13 +1908,16 @@ def test_cert_store_get_cert_key(self, cephadm_module: CephadmOrchestrator):
18981908

18991909
grafana_host1_key = 'fake-grafana-host1-cert'
19001910
nvmeof_server_key = 'nvmeof-server-key'
1911+
nvmeof_encryption_key = 'nvmeof-encryption-key'
19011912
cephadm_module.cert_key_store.save_key('grafana_key', grafana_host1_key, host='host1')
19021913
cephadm_module.cert_key_store.save_key('grafana_key', grafana_host1_key, host='host1')
19031914
cephadm_module.cert_key_store.save_key('nvmeof_server_key', nvmeof_server_key, service_name='nvmeof.foo')
1915+
cephadm_module.cert_key_store.save_key('nvmeof_encryption_key', nvmeof_encryption_key, service_name='nvmeof.foo')
19041916

19051917
assert cephadm_module.cert_key_store.get_key('grafana_key', host='host1') == grafana_host1_key
19061918
assert cephadm_module.cert_key_store.get_key('nvmeof_server_key', service_name='nvmeof.foo') == nvmeof_server_key
19071919
assert cephadm_module.cert_key_store.get_key('nvmeof_client_key', service_name='nvmeof.foo') == ''
1920+
assert cephadm_module.cert_key_store.get_key('nvmeof_encryption_key', service_name='nvmeof.foo') == nvmeof_encryption_key
19081921

19091922
with pytest.raises(OrchestratorError, match='Attempted to access priv key for unknown entity'):
19101923
cephadm_module.cert_key_store.get_key('unknown_entity')

src/pybind/mgr/cephadm/tests/test_services.py

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -399,6 +399,7 @@ def test_nvmeof_config(self, _get_name, _run_cephadm, cephadm_module: CephadmOrc
399399
state_update_interval_sec = 5
400400
enable_spdk_discovery_controller = False
401401
enable_key_encryption = True
402+
encryption_key = /encryption.key
402403
enable_prometheus_exporter = True
403404
prometheus_exporter_ssl = False
404405
prometheus_port = 10008

src/python-common/ceph/deployment/service_spec.py

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1335,6 +1335,7 @@ def __init__(self,
13351335
state_update_interval_sec: Optional[int] = 5,
13361336
enable_spdk_discovery_controller: Optional[bool] = False,
13371337
enable_key_encryption: Optional[bool] = True,
1338+
encryption_key: Optional[str] = None,
13381339
omap_file_lock_duration: Optional[int] = 20,
13391340
omap_file_lock_retries: Optional[int] = 30,
13401341
omap_file_lock_retry_sleep_interval: Optional[float] = 1.0,
@@ -1422,6 +1423,8 @@ def __init__(self,
14221423
self.enable_spdk_discovery_controller = enable_spdk_discovery_controller
14231424
#: ``enable_key_encryption`` encrypt DHCHAP and PSK keys before saving in OMAP
14241425
self.enable_key_encryption = enable_key_encryption
1426+
#: ``encryption_key`` gateway encryption key
1427+
self.encryption_key = encryption_key
14251428
#: ``enable_prometheus_exporter`` enables Prometheus exporter
14261429
self.enable_prometheus_exporter = enable_prometheus_exporter
14271430
#: ``verify_nqns`` enables verification of subsystem and host NQNs for validity

0 commit comments

Comments
 (0)