使用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服务器。