使用Puppet配置OpenLDAP主/从复制
我们将使用Puppet来配置一对具有主从复制的OpenLDAP服务器。
测试环境
我们安装了两个要配置的CentOS 7服务器,如下所示:
ldap1.hl.local(10.11.1.11)将配置为LDAP主服务器
ldap2.hl.local(10.11.1.12)将配置为LDAP从属
两台服务器都将SELinux设置为强制模式。
Puppet配置
Puppet Master 在Katello服务器上运行。
我们使用camptocamp-openldap Puppet模块来配置OpenLDAP。
请参阅模块文档以获取支持的功能和可用的配置选项。
有关如何手动配置OpenLDAP服务器的教程 文章,请参见此处(CentOS 7)和此处(Debian)。
请注意,以下说明适用于两个LDAP服务器。
防火墙配置,以允许从homelab LAN进行LDAPS访问:
firewall { '007 allow LDAPS':
dport => [636],
source => '10.11.1.0/24',
proto => tcp,
action => accept,
}
确保PKCS#8格式的私钥(我们之前创建的私钥)可用。
file {'/etc/pki/tls/private/hl.pem':
ensure => file,
source => 'puppet:///homelab_files/hl.pem',
owner => '0',
group => 'ldap',
mode => '0640',
}
配置LDAP服务器(注意我们如何绑定到SSL端口):
class { 'openldap::server':
ldap_ifs => ['127.0.0.1:389/'],
ldaps_ifs => ['0.0.0.0:636/'],
ssl_cert => '/etc/pki/tls/certs/hl.crt',
ssl_key => '/etc/pki/tls/private/hl.pem',
}
配置数据库:
openldap::server::database { 'dc=top':
ensure => present,
directory => '/var/lib/ldap',
suffix => 'dc=top',
rootdn => 'cn=admin,dc=top',
rootpw => '{SSHA}cGfSAyREZC5XnJa77iP+EdR8BrvZfUuo',
}
配置架构:
openldap::server::schema { 'cosine':
ensure => present,
path => '/etc/openldap/schema/cosine.schema',
}
openldap::server::schema { 'inetorgperson':
ensure => present,
path => '/etc/openldap/schema/inetorgperson.schema',
require => Openldap::Server::Schema["cosine"],
}
openldap::server::schema { 'nis':
ensure => present,
path => '/etc/openldap/schema/nis.ldif',
require => Openldap::Server::Schema["inetorgperson"],
}
配置ACL:
$homelab_acl = {
'0 to attrs=userPassword,shadowLastChange' => [
'by dn="cn=admin,dc=top" write',
'by dn="cn=reader,dc=top" read',
'by self write',
'by anonymous auth',
'by * none',
],
'1 to dn.base=""' => [
'by * read',
],
'2 to *' => [
'by dn="cn=admin,dc=top" write',
'by dn="cn=reader,dc=top" read',
'by self write',
'by users read',
'by anonymous auth',
'by * none',
],
}
openldap::server::access_wrapper { 'dc=top' :
acl => $homelab_acl,
}
基本配置:
file { '/root/.ldap_config.ldif':
ensure => file,
source => 'puppet:///homelab_files/ldap_config.ldif',
owner => '0',
group => '0',
mode => '0600',
notify => Exec['configure_ldap'],
}
exec { 'configure_ldap':
command => 'ldapadd -c -x -D cn=admin,dc=top -w PleaseChangeMe -f /root/.ldap_config.ldif && touch /root/.ldap_config.done',
path => '/usr/bin:/usr/sbin:/bin:/sbin',
provider => shell,
onlyif => ['test -f /root/.ldap_config.ldif'],
unless => ['test -f /root/.ldap_config.done'],
}
文件“ ldap_config.ldif”的内容可以在下面看到。
我们为LDAP复制创建一个只读帐户'cn = reader,dc = top',我们还创建一个LDAP用户'uid = igi,ou = Users,dc = hl.local,dc = top'登录到homelab服务器。
dn: cn=reader,dc=top
objectClass: simpleSecurityObject
objectclass: organizationalRole
description: LDAP Read-only Access
userPassword: {SSHA}NrBn6Kd4rW8jmf+KWmfbTMFOkcC43ctF
dn: dc=hl.local,dc=top
o: hl.local
dc: hl.local
objectClass: dcObject
objectClass: organization
dn: ou=Users,dc=hl.local,dc=top
objectClass: organizationalUnit
ou: Users
dn: uid=igi,ou=Users,dc=hl.local,dc=top
uid: igi
uidNumber: 5001
gidNumber: 5001
objectClass: top
objectClass: person
objectClass: inetOrgPerson
objectClass: posixAccount
objectClass: shadowAccount
userPassword: {SSHA}aBLnLxAUZAqwwII6fNUzizyOY/YAowtt
cn: igi
gn: igi
sn: Admin
mail: Hyman@theitroad
shadowLastChange: 16890
shadowMin: 0
shadowMax: 99999
shadowWarning: 14
shadowInactive: 3
loginShell: /bin/bash
homeDirectory: /home/guests/igi
dn: ou=Groups,dc=hl.local,dc=top
objectClass: organizationalUnit
ou: Groups
dn: cn=igi,ou=Groups,dc=hl.local,dc=top
gidNumber: 5001
objectClass: top
objectClass: posixGroup
cn: igi
LDAP主服务器
在主节点上配置同步提供程序:
file { '/root/.ldap_syncprov.ldif':
ensure => file,
source => 'puppet:///homelab_files/ldap_syncprov.ldif',
owner => '0',
group => '0',
mode => '0600',
notify => Exec['configure_syncprov'],
}
exec { 'configure_syncprov':
command => 'ldapadd -c -Y EXTERNAL -H ldapi:///-f /root/.ldap_syncprov.ldif && touch /root/.ldap_syncprov.done && systemctl restart slapd',
path => '/usr/bin:/usr/sbin:/bin:/sbin',
provider => shell,
onlyif => [
'test -f /root/.ldap_syncprov.ldif',
'test -f /root/.ldap_config.done'
],
unless => ['test -f /root/.ldap_syncprov.done'],
}
主服务器的文件“ ldap_syncprov.ldif”的内容如下所示。
dn: cn=module,cn=config
objectClass: olcModuleList
cn: module
olcModulePath: /usr/lib64/openldap
olcModuleLoad: syncprov.la
dn: olcOverlay=syncprov,olcDatabase={2}hdb,cn=config
objectClass: olcOverlayConfig
objectClass: olcSyncProvConfig
olcOverlay: syncprov
olcSpSessionLog: 100
LDAP从服务器
在从属节点上配置复制:
file { '/root/.ldap_replication.ldif':
ensure => file,
source => 'puppet:///homelab_files/ldap_replication.ldif',
owner => '0',
group => '0',
mode => '0600',
notify => Exec['configure_replication'],
}
exec { 'configure_replication':
command => 'ldapadd -c -Y EXTERNAL -H ldapi:///-f /root/.ldap_replication.ldif && touch /root/.ldap_replication.done && systemctl restart slapd',
path => '/usr/bin:/usr/sbin:/bin:/sbin',
provider => shell,
onlyif => ['test -f /root/.ldap_config.done'],
unless => ['test -f /root/.ldap_replication.done'],
}
从属服务器的文件“ ldap_replication.ldif”的内容如下。
请注意我们如何绑定到SSL端口。
dn: olcDatabase={2}hdb,cn=config
changetype: modify
add: olcSyncRepl
olcSyncRepl: rid=001
provider=ldaps://ldap1.hl.local:636/
searchbase="dc=hl.local,dc=top"
type=refreshAndPersist
retry="60 10 300 +"
schemachecking=on
bindmethod=simple
binddn="cn=reader,dc=top"
credentials=PleaseChangeMe
tls_reqcert=never
tls_cert=/etc/pki/tls/certs/hl.crt
tls_cacert=/etc/pki/tls/certs/hl.crt
tls_key=/etc/pki/tls/private/hl.pem
结果
我们应该以以下LDAP结构结束:
在LDAP主服务器上创建的所有内容都应自动同步到从服务器。
调试LDAP问题
如果遇到问题,请尝试运行以下命令以在调试模式下启动LDAP服务器并登录到控制台:
# slapd -h ldapi:///-u ldap -d 255
日志可能很难解析,但是借助Google搜索和一点运气,我们应该能够弄清楚发生了什么。
配置所有Homelab服务器以使用LDAP身份验证
我们使用Puppet模块sgnl05-sssd来配置SSSD。
将以下内容添加到主homelab环境列表文件“ /etc/puppetlabs/code/environments/homelab/manifests/site.pp”中,以便将其应用于所有服务器。
请注意如何将SSSD配置为同时使用两个LDAP服务器来实现冗余。
class {'::sssd':
ensure => 'present',
config => {
'sssd' => {
'domains'
=> 'default',
'config_file_version' => 2,
'services'
=> ['nss', 'pam'],
},
'domain/default' => {
'id_provider'
=> 'ldap',
'auth_provider'
=> 'ldap',
'cache_credentials' => true,
'default_shell'
=> '/bin/bash',
'mkhomedir'
=> true,
'ldap_search_base'
=> 'dc=hl.local,dc=top',
'ldap_uri'
=> 'ldaps://ldap1.hl.local,ldaps://ldap2.hl.local',
'ldap_id_use_start_tls' => false,
'ldap_tls_reqcert'
=> 'never',
'ldap_default_bind_dn' => 'cn=reader,dc=top',
'ldap_default_authtok' => 'PleaseChangeMe',
}
}
}
在Puppet应用了上述配置之后,我们应该能够使用LDAP用户登录所有homelab服务器。

