@@ -488,51 +488,72 @@ OpenLDAP)
488488
489489.. list-table :: LDAP Settings
490490 :header-rows: 1
491+ :widths: 20 25 55
491492
492493 * - Setting
493- - OpenLDAP
494- - Active Directory
494+ - OpenLDAP / Active Directory
495495 - Description
496496 * - ``ldap.basedn ``
497- - `Ex: OU=APAC, DC=company, DC=com `
498- - `Ex: DC=company, DC=com `
499- - Sets the basedn for LDAP.
497+ - ``OU=APAC,DC=company,DC=com ``
498+ - Sets the base DN for LDAP searches.
500499 * - ``ldap.search.group.principle ``
501- - `Ex: CN=ACSGroup, DC=company, DC=com `
502- - `Ex: CN=ACSGroup, CN=Users, DC=company, DC=com `
503- - (optional) if set only Users from this group are listed.
500+ - ``CN=ACSGroup,DC=company,DC=com ``
501+ - *(Optional) * If set, only users belonging to this group are listed.
504502 * - ``ldap.bind.principal ``
505- - `Ex: CN=ACSServiceAccount, OU=APAC, DC=company, DC=com `
506- - ` Ex: CN=ACSServiceAccount, CN=Users, DC=company, DC=com `
507- - Service account that can list all the Users in the above basedn. Avoid using privileged account such as Administrator.
503+ - `` CN=ACSServiceAccount,OU=APAC,DC=company,DC=com ` `
504+ - Service account used to list users under the configured base DN.
505+ Avoid using privileged accounts such as `` Administrator `` .
508506 * - ``ldap.bind.password ``
509- - `****************** `
510- - `****************** `
511- - Password for a DN User. Is entered in plain text but gets stored encrypted.
507+ - ``**************** ``
508+ - Password for the bind DN. Entered in plain text but stored encrypted.
512509 * - ``ldap.user.object ``
513- - ` interorgperson `
514- - ` user `
515- - Object type of Users within LDAP .
510+ - * OpenLDAP: `` inetOrgPerson ` `
511+ * Active Directory: `` user ` `
512+ - LDAP object class representing user accounts .
516513 * - ``ldap.email.attribute ``
517- - `mail `
518- - `mail `
519- - Email attribute within ldap for a User.
514+ - ``mail ``
515+ - Attribute used to retrieve the user email address.
520516 * - ``ldap.firstname.attribute ``
521- - `givenname `
522- - `givenname `
523- - firstname attribute within ldap for a User.
517+ - ``givenName ``
518+ - Attribute used to retrieve the user first name.
524519 * - ``ldap.lastname.attribute ``
525- - `sn `
526- - `sn `
527- - lastname attribute within ldap for a User.
520+ - ``sn ``
521+ - Attribute used to retrieve the user last name.
528522 * - ``ldap.group.object ``
529- - ` groupOfUniqueNames `
530- - ` groupOfUniqueNames `
531- - Object type of groups within LDAP .
523+ - * OpenLDAP: `` groupOfUniqueNames ` `
524+ * Active Directory: `` group ` `
525+ - LDAP object class representing groups .
532526 * - ``ldap.group.user.uniquemember ``
533- - `uniquemember `
534- - `uniquemember `
535- - Attribute for uniquemembers within a group.
527+ - ``uniqueMember ``
528+ - Attribute defining user membership within a group.
529+ * - ``ldap.username.attribute ``
530+ - * OpenLDAP: ``uid ``
531+ * Active Directory: ``sAMAccountName ``
532+ - Sets the username attribute used within LDAP.
533+ * - ``ldap.nested.groups.enable ``
534+ - ``true ``
535+ - If true, nested groups will also be queried.
536+ * - ``ldap.provider ``
537+ - * OpenLDAP: ``openldap ``
538+ * Active Directory: ``microsoftad ``
539+ - LDAP provider (e.g. ``openldap ``, ``microsoftad ``).
540+
541+
542+
543+ Restart CloudStack Management Services
544+
545+
546+ After updating the configuration, restart the CloudStack Management Server:
547+
548+ .. code-block :: bash
549+
550+ systemctl restart cloudstack-management
551+
552+ Notes
553+
554+
555+ * Configuration changes do not take effect until the management service is restarted.
556+
536557
537558 .. note :: ``ldap.search.group.principle`` is required when using ``linkaccounttoldap``.
538559
@@ -566,7 +587,111 @@ You will need to know the path to the keystore and the password.
566587- ``ldap.truststore.password `` : truststore password
567588
568589
569- .. |button to dedicate a zone, pod,cluster, or host | image :: /_static/images/dedicate-resource-button.png
590+ Configuring LDAPS/ LDAP SSL Trust for LDAP Integration
591+ ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
592+
593+ When integrating Apache CloudStack with an LDAP directory over **LDAPS (TCP 636) **,
594+ the CloudStack Management Server must trust the TLS certificate presented by the
595+ LDAP server. This trust is established by importing the LDAP server certificate
596+ into a Java truststore and configuring CloudStack to use that truststore for LDAP
597+ communication.
598+
599+ Retrieve the LDAP Server Certificate
600+
601+
602+ 1. On a CloudStack Management Server, navigate to the CloudStack management
603+ configuration directory:
604+
605+ .. code-block :: bash
606+
607+ cd /etc/cloudstack/management/
608+
609+ 2. Retrieve **only the LDAP server certificate ** (not the full certificate chain
610+ or root CA):
611+
612+ .. code-block :: bash
613+
614+ echo " " | openssl s_client -connect ldap.example.com:636 -showcerts 2> /dev/null | \
615+ openssl x509 -out ldap-server-certificate.pem
616+
617+ 3. Verify the retrieved certificate:
618+
619+ .. code-block :: bash
620+
621+ openssl x509 -in ldap-server-certificate.pem -noout -text
622+
623+ Ensure that the certificate details (Subject, Issuer, and validity dates)
624+ match the LDAP server configuration.
625+
626+ Create and Populate a Java Truststore
627+
628+
629+ 1. Import the LDAP server certificate into a Java KeyStore (JKS):
630+
631+ .. code-block :: bash
632+
633+ keytool -importcert \
634+ -alias ldap-server \
635+ -file ldap-server-certificate.pem \
636+ -trustcacerts \
637+ -keystore cloudstack-ldap-truststore.jks \
638+ -storetype JKS
639+
640+ 2. Verify the contents of the truststore:
641+
642+ .. code-block :: bash
643+
644+ keytool -v -list -keystore cloudstack-ldap-truststore.jks
645+
646+ 3. Verify file permissions:
647+
648+ .. code-block :: bash
649+
650+ ls -l /etc/cloudstack/management/cloudstack-ldap-truststore.jks
651+
652+ Example output:
653+
654+ .. code-block :: text
655+
656+ -rw-r--r-- 1 root root 1332 <date> cloudstack-ldap-truststore.jks
657+
658+ Ensure that the CloudStack Management Server process has read access to the
659+ truststore file.
660+
661+ Distribute the Truststore
662+
663+
664+ If multiple CloudStack Management Servers are deployed:
665+
666+ * Copy the truststore file to **all management servers **
667+ * Ensure the **file path is identical ** on each server
668+ * Ensure file permissions allow CloudStack to read the truststore
669+
670+ Example path:
671+
672+ ::
673+
674+ /etc/cloudstack/management/cloudstack-ldap-truststore.jks
675+
676+
677+
678+ Restart CloudStack Management Services after updating the global settings.
679+
680+
681+ After updating the configuration, restart the CloudStack Management Server:
682+
683+ .. code-block :: bash
684+
685+ systemctl restart cloudstack-management
686+
687+ Notes
688+
689+
690+ * Configuration changes do not take effect until the management service is restarted.
691+ * Certificate renewal on the LDAP server requires repeating this procedure and
692+ redeploying the updated truststore.
693+
694+
570695
571696Using a SAML 2.0 Identity Provider for User Authentication
572697----------------------------------------------------------
0 commit comments