Skip to content

Commit dd6e81b

Browse files
committed
mgr/cepahadm: added some logic to avoid loading unknown certs/keys
Those keys can be already present in the monstore because they were used/generated by previous versions of cert_store (new certmgr). Since they are not in use anymore we should not load them. Signed-off-by: Redouane Kachach <[email protected]>
1 parent 40e5ab7 commit dd6e81b

File tree

3 files changed

+26
-7
lines changed

3 files changed

+26
-7
lines changed

src/pybind/mgr/cephadm/module.py

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -709,6 +709,7 @@ def _init_cert_mgr(self) -> None:
709709
self.cert_mgr.register_cert_key_pair('iscsi', 'iscsi_ssl_cert', 'iscsi_ssl_key', TLSObjectScope.SERVICE)
710710
self.cert_mgr.register_cert_key_pair('nvmeof', 'nvmeof_server_cert', 'nvmeof_server_key', TLSObjectScope.SERVICE)
711711
self.cert_mgr.register_cert_key_pair('nvmeof', 'nvmeof_client_cert', 'nvmeof_client_key', TLSObjectScope.SERVICE)
712+
712713
self.cert_mgr.register_cert('nvmeof', 'nvmeof_root_ca_cert', TLSObjectScope.SERVICE)
713714
self.cert_mgr.register_cert('rgw', 'rgw_frontend_ssl_cert', TLSObjectScope.SERVICE)
714715
self.cert_mgr.register_key('nvmeof', 'nvmeof_encryption_key', TLSObjectScope.SERVICE)

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

Lines changed: 9 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -543,6 +543,8 @@ def test_tlsobject_store_load(self, _get_store_prefix, cephadm_module: CephadmOr
543543
nvmeof_server_key = 'nvmeof-server-key'
544544
nvmeof_client_key = 'nvmeof-client-key'
545545
nvmeof_encryption_key = 'nvmeof-encryption-key'
546+
unknown_cert_entity = 'unknown_per_service_cert'
547+
unknown_cert_key = 'unknown_per_service_key'
546548

547549
def _fake_prefix_store(key):
548550
if key == 'cert_store.cert.':
@@ -551,27 +553,33 @@ def _fake_prefix_store(key):
551553
f'{TLSOBJECT_STORE_CERT_PREFIX}nvmeof_server_cert': json.dumps({'nvmeof.foo': Cert(nvmeof_server_cert, True).to_json()}),
552554
f'{TLSOBJECT_STORE_CERT_PREFIX}nvmeof_client_cert': json.dumps({'nvmeof.foo': Cert(nvmeof_client_cert, True).to_json()}),
553555
f'{TLSOBJECT_STORE_CERT_PREFIX}nvmeof_root_ca_cert': json.dumps({'nvmeof.foo': Cert(nvmeof_root_ca_cert, True).to_json()}),
556+
f'{TLSOBJECT_STORE_CERT_PREFIX}{unknown_cert_entity}': json.dumps({'unkonwn.foo': Cert(rgw_frontend_rgw_foo_host2_cert, True).to_json()}),
554557
}
555558
elif key == 'cert_store.key.':
556559
return {
557560
f'{TLSOBJECT_STORE_KEY_PREFIX}grafana_key': json.dumps({'host1': PrivKey(grafana_host1_key).to_json()}),
558561
f'{TLSOBJECT_STORE_KEY_PREFIX}nvmeof_server_key': json.dumps({'nvmeof.foo': PrivKey(nvmeof_server_key).to_json()}),
559562
f'{TLSOBJECT_STORE_KEY_PREFIX}nvmeof_client_key': json.dumps({'nvmeof.foo': PrivKey(nvmeof_client_key).to_json()}),
560563
f'{TLSOBJECT_STORE_KEY_PREFIX}nvmeof_encryption_key': json.dumps({'nvmeof.foo': PrivKey(nvmeof_encryption_key).to_json()}),
564+
f'{TLSOBJECT_STORE_KEY_PREFIX}{unknown_cert_key}': json.dumps({'unkonwn.foo': PrivKey(nvmeof_encryption_key).to_json()}),
561565
}
562566
else:
563567
raise Exception(f'Get store with unexpected value {key}')
564568

565569
_get_store_prefix.side_effect = _fake_prefix_store
566-
cephadm_module.cert_mgr.load()
570+
cephadm_module._init_cert_mgr()
571+
567572
assert cephadm_module.cert_mgr.cert_store.known_entities['rgw_frontend_ssl_cert']['rgw.foo'] == Cert(rgw_frontend_rgw_foo_host2_cert, True)
568573
assert cephadm_module.cert_mgr.cert_store.known_entities['nvmeof_server_cert']['nvmeof.foo'] == Cert(nvmeof_server_cert, True)
569574
assert cephadm_module.cert_mgr.cert_store.known_entities['nvmeof_client_cert']['nvmeof.foo'] == Cert(nvmeof_client_cert, True)
570575
assert cephadm_module.cert_mgr.cert_store.known_entities['nvmeof_root_ca_cert']['nvmeof.foo'] == Cert(nvmeof_root_ca_cert, True)
571576
assert cephadm_module.cert_mgr.key_store.known_entities['grafana_key']['host1'] == PrivKey(grafana_host1_key)
577+
assert unknown_cert_entity not in cephadm_module.cert_mgr.cert_store.known_entities
578+
572579
assert cephadm_module.cert_mgr.key_store.known_entities['nvmeof_server_key']['nvmeof.foo'] == PrivKey(nvmeof_server_key)
573580
assert cephadm_module.cert_mgr.key_store.known_entities['nvmeof_client_key']['nvmeof.foo'] == PrivKey(nvmeof_client_key)
574581
assert cephadm_module.cert_mgr.key_store.known_entities['nvmeof_encryption_key']['nvmeof.foo'] == PrivKey(nvmeof_encryption_key)
582+
assert unknown_cert_key not in cephadm_module.cert_mgr.key_store.known_entities
575583

576584
def test_tlsobject_store_get_cert_key(self, cephadm_module: CephadmOrchestrator):
577585

src/pybind/mgr/cephadm/tlsobject_store.py

Lines changed: 16 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -41,6 +41,7 @@ def __init__(self, mgr: 'CephadmOrchestrator',
4141
self.known_entities: Dict[str, Any] = {key: {} for key in all_known_entities}
4242
self.per_service_name_tlsobjects = known_entities[TLSObjectScope.SERVICE]
4343
self.per_host_tlsobjects = known_entities[TLSObjectScope.HOST]
44+
self.global_tlsobjects = known_entities[TLSObjectScope.GLOBAL]
4445
self.store_prefix = f'{TLSOBJECT_STORE_PREFIX}{tlsobject_class.STORAGE_PREFIX}.'
4546

4647
def determine_tlsobject_target(self, entity: str, target: Optional[str]) -> Tuple[Optional[str], Optional[str]]:
@@ -56,8 +57,10 @@ def get_tlsobject_scope_and_target(self, entity: str, service_name: Optional[str
5657
return TLSObjectScope.SERVICE, service_name
5758
elif entity in self.per_host_tlsobjects:
5859
return TLSObjectScope.HOST, host
59-
else:
60+
elif entity in self.global_tlsobjects:
6061
return TLSObjectScope.GLOBAL, None
62+
else:
63+
return TLSObjectScope.UNKNOWN, None
6164

6265
def get_tlsobject(self, entity: str, service_name: Optional[str] = None, host: Optional[str] = None) -> Optional[TLSObjectProtocol]:
6366
self._validate_tlsobject_entity(entity, service_name, host)
@@ -78,11 +81,13 @@ def save_tlsobject(self, entity: str, tlsobject: str, service_name: Optional[str
7881
key: self.tlsobject_class.to_json(self.known_entities[entity][key])
7982
for key in self.known_entities[entity]
8083
}
81-
else:
84+
self.mgr.set_store(self.store_prefix + entity, json.dumps(j))
85+
elif scope == TLSObjectScope.GLOBAL:
8286
self.known_entities[entity] = tlsobject
8387
j = self.tlsobject_class.to_json(tlsobject)
84-
85-
self.mgr.set_store(self.store_prefix + entity, json.dumps(j))
88+
self.mgr.set_store(self.store_prefix + entity, json.dumps(j))
89+
else:
90+
logger.error(f'Trying to save entity {entity} with a not-supported/unknown TLSObjectScope scope {scope.value}')
8691

8792
def rm_tlsobject(self, entity: str, service_name: Optional[str] = None, host: Optional[str] = None) -> None:
8893
"""Remove a tlsobjectificate for a specific entity, service, or host."""
@@ -137,14 +142,19 @@ def list_tlsobjects(self) -> List[Tuple[str, Type[TLSObjectProtocol], Optional[s
137142
def load(self) -> None:
138143
for k, v in self.mgr.get_store_prefix(self.store_prefix).items():
139144
entity = k[len(self.store_prefix):]
145+
if entity not in self.known_entities:
146+
logger.warning(f"TLSObjectStore: Discarding unkown entity '{entity}'")
147+
continue
140148
entity_targets = json.loads(v)
141-
self.known_entities[entity] = {}
142149
if entity in self.per_service_name_tlsobjects or entity in self.per_host_tlsobjects:
150+
self.known_entities[entity] = {}
143151
for target in entity_targets:
144152
tlsobject = self.tlsobject_class.from_json(entity_targets[target])
145153
if tlsobject:
146154
self.known_entities[entity][target] = tlsobject
147-
else:
155+
elif entity in self.global_tlsobjects:
148156
tlsobject = self.tlsobject_class.from_json(entity_targets)
149157
if tlsobject:
150158
self.known_entities[entity] = tlsobject
159+
else:
160+
logger.error(f"TLSObjectStore: Found a known entity {entity} with unknown scope!")

0 commit comments

Comments
 (0)