This guide describes the steps needed to install and configure OpenLDAP on Centos 7 for use as a linked system with KeyHub.
Installing OpenLDAP
This part is based on the excellent guide provided at server world. Original can be found here.
you will need sudo rights throughout this guide. Either change into root or use sudo for all commands below. |
In this guide we use vi as a text editor. You can offcourse replace it by your favorite text editor. |
Step 1
-
Update your OS
yum update -y && yum upgrade -y
-
Install OpenLDAP Server and Client tools
yum -y install openldap-servers openldap-clients
-
Copy initial database configuration
cp /usr/share/openldap-servers/DB_CONFIG.example /var/lib/ldap/DB_CONFIG
-
Adjust rights
chown ldap: /var/lib/ldap/DB_CONFIG
-
Start OpenLDAP
systemctl start slapd
-
Enable OpenLDAP start at system boot
systemctl enable slapd
Step 2
-
Create a directory for the ldif files
mkdir /root/ldap
-
Change into this directory
cd ldap
-
Set OpenLDAP admin password
You might want to create a vault record in KeyHub and generate a password there ;)
Note the output for the next step.
slappasswd
-
Create chrootpw.ldif configuration file
vi chrootpw.ldif
-
Content of chrootpw.ldif
Use the output from the slappasswd step to replace the value in olcRootPW.
dn: olcDatabase={0}config,cn=config
changetype: modify
add: olcRootPW
olcRootPW: {SSHA}xxxxxxxxxxxxxxxxxxxxxxxx
-
Apply configuration
ldapadd -Y EXTERNAL -H ldapi:/// -f chrootpw.ldif
Step 3
-
Import basic schemas
ldapadd -Y EXTERNAL -H ldapi:/// -f /etc/openldap/schema/cosine.ldif
ldapadd -Y EXTERNAL -H ldapi:/// -f /etc/openldap/schema/nis.ldif
ldapadd -Y EXTERNAL -H ldapi:/// -f /etc/openldap/schema/inetorgperson.ldif
Step 4
Set your domain name in the OpenLDAP database.
-
Generate OpenLDAP manager’s password
You might want to create a vault record in KeyHub and generate a password there ;)
Note the output for the next step.
slappasswd
-
Create chdomain.ldif configuration file
vi chdomain.ldif
-
Content of chdomain.ldif
Use the output from the slappasswd step to replace the value in olcRootPW.
Make sure you replace dc=<MY_DOMAIN>, dc=<MY_TLD> with your own domain components. eg. dc=topicus-keyhub, dc=com |
dn: olcDatabase={1}monitor,cn=config
changetype: modify
replace: olcAccess
olcAccess: {0}to * by dn.base="gidNumber=0+uidNumber=0,cn=peercred,cn=external,cn=auth"
read by dn.base="cn=Manager,dc=<MY_DOMAIN>,dc=<MY_TLD>" read by * none
dn: olcDatabase={2}hdb,cn=config
changetype: modify
replace: olcSuffix
olcSuffix: dc=<MY_DOMAIN>,dc=<MY_TLD>
dn: olcDatabase={2}hdb,cn=config
changetype: modify
replace: olcRootDN
olcRootDN: cn=Manager,dc=<MY_DOMAIN>,dc=<MY_TLD>
dn: olcDatabase={2}hdb,cn=config
changetype: modify
add: olcRootPW
olcRootPW: {SSHA}xxxxxxxxxxxxxxxxxxxxxxxx
dn: olcDatabase={2}hdb,cn=config
changetype: modify
add: olcAccess
olcAccess: {0}to attrs=userPassword,shadowLastChange by
dn="cn=Manager,dc=<MY_DOMAIN>,dc=<MY_TLD>" write by anonymous auth by self write by * none
olcAccess: {1}to dn.base="" by * read
olcAccess: {2}to * by dn="cn=Manager,dc=<MY_DOMAIN>,dc=<MY_TLD>" write by * read
-
Apply configuration
ldapmodify -Y EXTERNAL -H ldapi:/// -f chdomain.ldif
-
Create basedomain.ldif configuration file
vi basedomain.ldif
-
Content of basedomain.ldif
Make sure you replace dc=<MY_DOMAIN>, dc=<MY_TLD> with your own domain components. |
dn: dc=<MY_DOMAIN>,dc=<MY_TLD>
objectClass: top
objectClass: dcObject
objectclass: organization
o: Server World
dn: cn=Manager,dc=<MY_DOMAIN>,dc=<MY_TLD>
objectClass: organizationalRole
cn: Manager
description: Directory Manager
dn: ou=People,dc=<MY_DOMAIN>,dc=<MY_TLD>
objectClass: organizationalUnit
ou: People
dn: ou=Group,dc=<MY_DOMAIN>,dc=<MY_TLD>
objectClass: organizationalUnit
ou: Group
-
Apply configuration
Make sure you replace dc=<MY_DOMAIN>, dc=<MY_TLD> with your own domain components. Use directory manager’s password when prompted. |
ldapadd -x -D cn=Manager,dc=<MY_DOMAIN>,dc=<MY_TLD> -W -f basedomain.ldif
Step 5
If a firewall is running you need to allow LDAP service. LDAP uses 389/TCP. Firewalld is the default firewall serice for Centos 7. The commands below will open port 389 on Firewalld.
firewall-cmd --add-service=ldap --permanent
firewall-cmd --reload
Configuring TLS
For a secure connection between KeyHub and OpenLDAP we advise to use StartTLS.
Step 1
Create certificates and keys if you don’t want to or can’t use an existing one. Otherwise you can use your own certificate and skip this step.
-
Create Server certificate
Replace <HOSTNAME>, <MY_DOMAIN> and <MY_TLD> with the host and domain name you used for your OpenLDAP installation. eg. ldap_server, topicus-keyhub and com |
-
Create root certificate and key
openssl genrsa -des3 -out rootCA.key 4096
openssl req -x509 -new -nodes -key rootCA.key -sha256 -days 1024 -out rootCA.crt
-
Create server private key
openssl genrsa -out <HOSTNAME>.key 2048
-
Create the server certificate configuration file
vi <HOSTNAME>.conf
-
Content
Don’t forget to change at least the CN. Other values can be changed to your liking. |
[req]
default_bits=2048
prompt = no
default_md = sha256
distinguished_name = dn
[dn]
C = NL
ST = Overijssel
L = Deventer
O = Topicus KeyHub
OU = KeyHub
emailAddress = info@<MY_DOMAIN>.<MY_TLD>
CN = <HOSTNAME>.<MY_DOMAIN>.<MY_TLD>
-
Create the server certificate signing request
openssl req -new -key <HOSTNAME>.key -out <HOSTNAME>.csr -config <HOSTNAME>.conf
-
Create the configuration for the alternative name
vi <HOSTNAME>.ext
-
Content
Change the DNS value to yours. eg. ldap_server.topicus-keyhub.com |
subjectAltName = DNS:<HOSTNAME>.<MY_DOMAIN>.<MY_TLD>
-
Create the server certificate
openssl x509 -req -in <HOSTNAME>.csr -CA ./rootCA.crt -CAkey ./rootCA.key -CAcreateserial -out <HOSTNAME>.<MY_DOMAIN>.<MY_TLD>.crt -days 500 -sha256 -extfile <HOSTNAME>.ext
-
Optionaly verify your certificate
openssl x509 -in <HOSTNAME>.<MY_DOMAIN>.<MY_TLD>.crt -text -noout
Step 2
Move the created certificates to the OpenLDAP directory and adjust the rights.
-
Move the certificates to /etc/openldap/certs
mv <HOSTNAME>* /etc/openldap/certs/
mv rootCA.* /etc/openldap/certs/
-
Set the rights for the certificates
chown ldap: /etc/openldap/certs/*
Step 3
Create the OpenLDAP configuration.
-
Create tlsverify.ldif configuration file
The order of the configuration lines in tlsverify.ldif is very important. |
vim tlsverify.ldif
-
Content of tlsverify.ldif
Check if the paths and names of the certificates exist and adjust if needed. The "-" in rule 20 is not a typo ;) |
dn: cn=config
changetype: modify
add: olcTLSCACertificateFile
olcTLSCACertificateFile: /etc/openldap/certs/rootCA.crt
dn: cn=config
changetype: modify
add: olcTLSCipherSuite
olcTLSCipherSuite: HIGH:+SSLv3:+TLSv1:+SASL:MEDIUM:+SSLv2:@STRENGTH:+SHA:+MD5:!NULL
dn: cn=config
changetype: modify
add: olcTLSVerifyClient
olcTLSVerifyClient: try
dn: cn=config
changetype: modify
replace: olcTLSCertificateKeyFile
olcTLSCertificateKeyFile: /etc/openldap/certs/<HOSTNAME>.key
-
replace: olcTLSCertificateFile
olcTLSCertificateFile: /etc/openldap/certs/<HOSTNAME>.<MY_DOMAIN>.<MY_TLD>.crt
Step 4
-
Run the configuartion
ldapmodify -Y EXTERNAL -H ldapi:/// -f tlsverify.ldif
Enable public Key provisioning
This step is needed to enable public key provisioning from KeyHub |
Step 1
-
Install openssh-ldap.
This is needed for adding the ssh key schema
yum -y install openssh-ldap
Step 2
Create the OpenLDAP configuration.
-
Create openssh-ldap.conf file (in this example this is done in /root/ldap)
vim /root/ldap/openssh-ldap.conf
-
Content of openssh-ldap.conf
The path of the files to be included depends on the installed version. |
include /etc/openldap/schema/core.schema
include /usr/share/doc/openssh-ldap-7.4p1/openssh-lpk-openldap.schema
-
Create the cn=config directory and files using slapcat
slapcat reads from the current database based on the created config file and outputs to the specified directory.
slapcat -f /root/ldap/openssh-ldap.conf -F /root/ldap -n 0
-
Copy /root/ldap/cn=config/cn=schema/cn={1}openssh-lpk-openldap.ldif to /root/ldap/openssh-ldap.ldif
cp cn\=config/cn\=schema/cn\=\{1\}openssh-lpk-openldap.ldif /root/ldap/openssh-ldap.ldif
-
Edit /root/ldap/openssh-ldap.ldif
-
Remove the lines similar to these
structuralObjectClass: olcSchemaConfig
entryUUID: 02a17a84-79a3-103b-9158-15bfba5efd60
creatorsName: cn=config
createTimestamp: 20210715102733Z
entryCSN: 20210715102733.168332Z#000000#000#000000
modifiersName: cn=config
modifyTimestamp: 20210715102733Z
-
Replace dn: cn={1}openssh-lpk-openldap with dn: cn=openssh-openldap,cn=schema,cn=config
-
Replace cn: {1}openssh-lpk-openldap with cn: openssh-openldap
-
Replace cn=openssh-openldap with cn=openssh-openldap,cn=schema,cn=config
The resulting file should look similar to this
# AUTO-GENERATED FILE - DO NOT EDIT!! Use ldapmodify.
# CRC32 d4505710
dn: cn=openssh-openldap,cn=schema,cn=config
objectClass: olcSchemaConfig
cn: openssh-openldap
olcAttributeTypes: {0}( 1.3.6.1.4.1.24552.500.1.1.1.13 NAME 'sshPublicKey' D
ESC 'MANDATORY: OpenSSH Public key' EQUALITY octetStringMatch SYNTAX 1.3.6.
1.4.1.1466.115.121.1.40 )
olcObjectClasses: {0}( 1.3.6.1.4.1.24552.500.1.1.2.0 NAME 'ldapPublicKey' DE
SC 'MANDATORY: OpenSSH LPK objectclass' SUP top AUXILIARY MUST ( sshPublicK
ey $ uid ) )
Step 3
-
Apply configuration
ldapadd -Y EXTERNAL -H ldapi:/// -f openssh-ldap.ldif
Step 4
-
Restart OpenLDAP
systemctl restart slapd
Install PBKDF2 module on OpenLDAP
OpenLDAP is not able to use PBKDF2 out of the box. PBKDF2 is a strong hashing algorithm using 64k iterations of SHA512. KeyHub is able to provision password hashes in PBKDF2 format.
Step 1
-
Download the PBKDF2 module from the Topicus servers
md5sum 198056d220b0d94750a05fa9c0dade6f pw-pbk2.tar.gz
wget https://files.topicus-keyhub.com/download/pw-pbk2.tar.gz
Step 2
-
Unpack pw-pbk2.tar.gz
This wil unpack in /usr/lib64/openldap/
tar xvfz ~/ldap/pw-pbk2.tar.gz
Step 3
-
If SELinux is enabled (this is default for Centos 7) you will need to set a context for these files
restorecon -v /usr/lib64/openldap/pw-pbkdf2.*
Step 4
-
Create the configuration file pbk.ldif
with the following content:
dn: cn=module{1},cn=config
objectClass: olcModuleList
cn: module{1}
olcModulePath: /usr/lib64/openldap
olcModuleLoad: pw-pbkdf2.la
-
Apply the configuration
ldapadd -Y EXTERNAL -H ldapi:/// -f pbk.ldif