使用Puppet配置OpenLDAP主/从复制

时间:2020-03-21 11:42:30  来源:igfitidea点击:

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