Skip to content

Commit e17fb64

Browse files
committed
mgr/cephadm: add the VIP to the internal mgmt-gateway cert SAN list
Include the VIP as part of the mgmt-gateway internal server certificate SAN list when operating in HA mode. Otherwise the communication between internal services might fail. Fixes: https://tracker.ceph.com/issues/73384 Signed-off-by: Redouane Kachach <[email protected]>
1 parent fb7ca2a commit e17fb64

File tree

3 files changed

+62
-7
lines changed

3 files changed

+62
-7
lines changed

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

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -323,9 +323,9 @@ def get_dependencies(cls, mgr: "CephadmOrchestrator",
323323
def __init__(self, mgr: "CephadmOrchestrator"):
324324
self.mgr: "CephadmOrchestrator" = mgr
325325

326-
def get_self_signed_certificates_with_label(self, svc_spec: ServiceSpec, daemon_spec: CephadmDaemonDeploySpec, label: str) -> TLSCredentials:
326+
def get_self_signed_certificates_with_label(self, svc_spec: ServiceSpec, daemon_spec: CephadmDaemonDeploySpec, label: str, ip_addr: Optional[str] = None) -> TLSCredentials:
327327
svc_name = svc_spec.service_name()
328-
ip = self.mgr.inventory.get_addr(daemon_spec.host)
328+
ip = ip_addr or self.mgr.inventory.get_addr(daemon_spec.host)
329329
host_fqdn = self.mgr.get_fqdn(daemon_spec.host)
330330
tls_creds = self.mgr.cert_mgr.get_self_signed_tls_credentials(svc_name, host_fqdn, label)
331331
if not tls_creds:

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

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -120,7 +120,8 @@ def generate_config(self, daemon_spec: CephadmDaemonDeploySpec) -> Tuple[Dict[st
120120
'enable_oauth2_proxy': bool(oauth2_proxy_endpoints),
121121
}
122122

123-
tls_creds = self.get_self_signed_certificates_with_label(svc_spec, daemon_spec, INTERNAL_CERT_LABEL)
123+
ip = self.get_mgmt_gw_ip(svc_spec, daemon_spec)
124+
tls_creds = self.get_self_signed_certificates_with_label(svc_spec, daemon_spec, INTERNAL_CERT_LABEL, ip)
124125
daemon_config = {
125126
"files": {
126127
"nginx.conf": self.mgr.template.render(self.SVC_TEMPLATE_PATH, main_context),

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

Lines changed: 58 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -4960,7 +4960,7 @@ class TestMgmtGateway:
49604960
@patch("cephadm.services.cephadmservice.CephadmService.get_certificates",
49614961
lambda instance, dspec, ips=None: TLSCredentials(ceph_generated_cert, ceph_generated_key))
49624962
@patch("cephadm.services.mgmt_gateway.MgmtGatewayService.get_self_signed_certificates_with_label",
4963-
lambda instance, svc_spec, dspec, label: TLSCredentials(ceph_generated_cert, ceph_generated_key))
4963+
lambda instance, svc_spec, dspec, label, ip: TLSCredentials(ceph_generated_cert, ceph_generated_key))
49644964
@patch("cephadm.module.CephadmOrchestrator.get_mgr_ip", lambda _: '::1')
49654965
@patch('cephadm.cert_mgr.CertMgr.get_root_ca', lambda instance: cephadm_root_ca)
49664966
@patch("cephadm.services.mgmt_gateway.get_dashboard_endpoints", lambda _: (["ceph-node-2:8443", "ceph-node-2:8443"], "https"))
@@ -5206,7 +5206,7 @@ def get_services_endpoints(name):
52065206
@patch("cephadm.services.cephadmservice.CephadmService.get_certificates",
52075207
lambda instance, dspec, ips=None: TLSCredentials(ceph_generated_cert, ceph_generated_key))
52085208
@patch("cephadm.services.mgmt_gateway.MgmtGatewayService.get_self_signed_certificates_with_label",
5209-
lambda instance, svc_spec, dspec, label: TLSCredentials(ceph_generated_cert, ceph_generated_key))
5209+
lambda instance, svc_spec, dspec, label, ip: TLSCredentials(ceph_generated_cert, ceph_generated_key))
52105210
@patch("cephadm.module.CephadmOrchestrator.get_mgr_ip", lambda _: '::1')
52115211
@patch('cephadm.cert_mgr.CertMgr.get_root_ca', lambda instance: cephadm_root_ca)
52125212
@patch("cephadm.services.mgmt_gateway.get_dashboard_endpoints", lambda _: (["ceph-node-2:8443", "ceph-node-2:8443"], "https"))
@@ -5544,12 +5544,66 @@ def get_services_endpoints(name):
55445544
use_current_daemon_image=False,
55455545
)
55465546

5547+
@patch("cephadm.serve.CephadmServe._run_cephadm")
5548+
@patch("cephadm.services.mgmt_gateway.MgmtGatewayService.get_service_endpoints")
5549+
@patch("cephadm.services.mgmt_gateway.MgmtGatewayService.get_service_discovery_endpoints")
5550+
@patch("cephadm.services.mgmt_gateway.MgmtGatewayService.get_self_signed_certificates_with_label")
5551+
@patch("cephadm.services.cephadmservice.CephadmService.get_certificates",
5552+
lambda instance, dspec, ips=None: TLSCredentials(ceph_generated_cert, ceph_generated_key))
5553+
@patch("cephadm.module.CephadmOrchestrator.get_mgr_ip", lambda _: '::1')
5554+
@patch('cephadm.cert_mgr.CertMgr.get_root_ca', lambda instance: cephadm_root_ca)
5555+
@patch("cephadm.services.mgmt_gateway.get_dashboard_endpoints",
5556+
lambda _: (["ceph-node-2:8443", "ceph-node-2:8443"], "https"))
5557+
def test_mgmt_gateway_internal_cert_san_includes_vip(
5558+
self,
5559+
get_self_signed_mock,
5560+
get_service_discovery_endpoints_mock,
5561+
get_service_endpoints_mock,
5562+
_run_cephadm,
5563+
cephadm_module: CephadmOrchestrator,
5564+
):
5565+
vip = "10.0.0.200"
5566+
5567+
def get_services_endpoints(name):
5568+
if name == 'prometheus':
5569+
return ["192.168.100.100:9095", "192.168.100.101:9095"]
5570+
if name == 'grafana':
5571+
return ["ceph-node-2:3000", "ceph-node-2:3000"]
5572+
if name == 'alertmanager':
5573+
return ["192.168.100.100:9093", "192.168.100.102:9093"]
5574+
if name == 'oauth2-proxy':
5575+
return []
5576+
return []
5577+
5578+
_run_cephadm.side_effect = async_side_effect(('{}', '', 0))
5579+
get_service_endpoints_mock.side_effect = get_services_endpoints
5580+
get_service_discovery_endpoints_mock.return_value = ["ceph-node-0:8765", "ceph-node-2:8765"]
5581+
get_self_signed_mock.return_value = TLSCredentials(ceph_generated_cert, ceph_generated_key)
5582+
5583+
server_port = 5555
5584+
spec = MgmtGatewaySpec(
5585+
port=server_port,
5586+
virtual_ip=vip, # HA mode
5587+
ssl_cert=ceph_generated_cert,
5588+
ssl_key=ceph_generated_key,
5589+
)
5590+
5591+
with with_host(cephadm_module, 'ceph-node'):
5592+
with with_service(cephadm_module, spec):
5593+
# Ensure VIP was used when minting the internal cert (so it goes into SANs)
5594+
# get_self_signed_certificates_with_label(svc_spec, daemon_spec, label, ip)
5595+
args, _ = get_self_signed_mock.call_args
5596+
assert args[2] == 'internal'
5597+
assert args[3] == vip
5598+
deployed = json.loads(_run_cephadm.call_args.kwargs['stdin'])
5599+
assert deployed['config_blobs']['files']['nginx_internal.crt'] == ceph_generated_cert
5600+
55475601
@patch("cephadm.serve.CephadmServe._run_cephadm")
55485602
@patch("cephadm.services.mgmt_gateway.MgmtGatewayService.get_service_endpoints")
55495603
@patch("cephadm.services.cephadmservice.CephadmService.get_certificates",
55505604
lambda instance, dspec, ips=None: TLSCredentials(ceph_generated_cert, ceph_generated_key))
55515605
@patch("cephadm.services.mgmt_gateway.MgmtGatewayService.get_self_signed_certificates_with_label",
5552-
lambda instance, svc_spec, dspec, label: TLSCredentials(ceph_generated_cert, ceph_generated_key))
5606+
lambda instance, svc_spec, dspec, label, ip: TLSCredentials(ceph_generated_cert, ceph_generated_key))
55535607
@patch("cephadm.module.CephadmOrchestrator.get_mgr_ip", lambda _: '::1')
55545608
@patch('cephadm.cert_mgr.CertMgr.get_root_ca', lambda instance: cephadm_root_ca)
55555609
@patch("cephadm.services.mgmt_gateway.get_dashboard_endpoints", lambda _: (["ceph-node-2:8443", "ceph-node-2:8443"], "https"))
@@ -5563,7 +5617,7 @@ def test_oauth2_proxy_service(self, get_service_endpoints_mock, _run_cephadm, ce
55635617
@patch("cephadm.services.oauth2_proxy.OAuth2ProxyService.get_certificates",
55645618
lambda instance, dspec, ips=None: TLSCredentials(ceph_generated_cert, ceph_generated_key))
55655619
@patch("cephadm.services.mgmt_gateway.MgmtGatewayService.get_self_signed_certificates_with_label",
5566-
lambda instance, svc_spec, dspec, label: TLSCredentials(ceph_generated_cert, ceph_generated_key))
5620+
lambda instance, svc_spec, dspec, label, ip: TLSCredentials(ceph_generated_cert, ceph_generated_key))
55675621
@patch("cephadm.module.CephadmOrchestrator.get_mgr_ip", lambda _: '::1')
55685622
@patch('cephadm.cert_mgr.CertMgr.get_root_ca', lambda instance: cephadm_root_ca)
55695623
@patch("cephadm.services.mgmt_gateway.get_dashboard_endpoints", lambda _: (["ceph-node-2:8443", "ceph-node-2:8443"], "https"))

0 commit comments

Comments
 (0)