UBUNTU_Network Authentication(二)

访问控制

对应该授予哪些类型的访问(读、写等)用户的资源的管理称为访问控制。所涉及的配置指令称为访问控制列表或ACL。
对应该授予哪些类型的访问(读、写等)用户的资源的管理称为访问控制。所涉及的配置指令称为访问控制列表或ACL。
当我们安装slapd包时,各种ACL会自动设置。我们将查看这些缺省值的一些重要结果,并在此过程中了解acl的工作方式和配置方式。
为了获得LDAP查询的有效ACL,我们需要查看正在查询的数据库的ACL条目以及特殊前端数据库实例的ACL条目。属于后者的acl作为缺省值,以防前者的acl不匹配。前端数据库是第二个要查询的数据库,要应用的ACL是第一个要匹配的(“第一个匹配者获胜”)。下面的命令将分别给出mdb数据库(“dc=example,dc=com”)和前端数据库的acl:

sudo ldapsearch -Q -LLL -Y EXTERNAL -H ldapi:/// -b \
cn=config '(olcDatabase={1}mdb)' olcAccess

dn: olcDatabase={1}mdb,cn=config
olcAccess: {0}to attrs=userPassword by self write by anonymous auth by * none
olcAccess: {1}to attrs=shadowLastChange by self write by * read
olcAccess: {2}to * by * read

注:rootDN始终具有对其数据库的完全权限,不需要包含在任何ACL中。

sudo ldapsearch -Q -LLL -Y EXTERNAL -H ldapi:/// -b \
cn=config '(olcDatabase={-1}frontend)' olcAccess
dn: olcDatabase={-1}frontend,cn=config
olcAccess: {0}to * by dn.exact=gidNumber=0+uidNumber=0,cn=peercred,cn=external
 ,cn=auth manage by * break
olcAccess: {1}to dn.exact="" by * read
olcAccess: {2}to dn.base="cn=Subschema" by * read

前两个acl至关重要:

olcAccess: {0}to attrs=userPassword by self write by anonymous auth by * none
olcAccess: {1}to attrs=shadowLastChange by self write by * read

为了便于消化,可以用不同的方式表示:

to attrs=userPassword
by self write
 by anonymous auth
 by * none
to attrs=shadowLastChange
 by self write
 by * read

这些acl执行以下功能:

  • 为userPassword属性提供匿名’auth’访问,以便用户进行身份验证或绑定。也许与直觉相反,“通过匿名认证”是需要的,甚至当匿名访问不需要DIT,否则这将是一个先有鸡还是先有蛋的问题:在身份验证之前,所有用户都是匿名的。
  • 自写ACL将对userPassword属性的写访问权限授予通过身份验证为属性所在dn的用户。换句话说,用户可以更新自己条目的userPassword属性。
  • userPassword属性是所有其他用户都无法访问的,除了始终具有访问权限的rootDN,不需要显式地提到。
  • 为了让用户使用passwd或其他实用程序更改自己的密码,用户自己的shadowLastChange属性需要是可写的。所有其他目录用户都可以读取这个属性的内容。
  • 这个DIT可以被匿名搜索,因为这个ACL中的’to * by * read’授予了任何人(包括匿名)对其他所有内容的读访问权限:
to *
 by * read

如果这是不需要的,那么您需要更改acl。要强制在绑定请求期间进行身份验证,可以使用’olcRequire: authc’指令(或与修改后的ACL一起使用)。
如前所述,没有为slapd-config数据库创建管理帐户(“rootDN”)。
但是,有一个被授予完全访问权限的SASL标识。它表示本地主机的超级用户(root/ sudo)。这里是:
dn.exact=gidNumber=0+uidNumber=0,cn=peercred,cn=external,cn=auth
以下命令将显示slapd-config数据库的acl:

sudo ldapsearch -Q -LLL -Y EXTERNAL -H ldapi:/// -b \
cn=config '(olcDatabase={0}config)' olcAccess
dn: olcDatabase={0}config,cn=config
olcAccess: {0}to * by dn.exact=gidNumber=0+uidNumber=0,cn=peercred,
 cn=external,cn=auth manage by * break

由于这是一个SASL标识,我们在调用有问题的LDAP实用程序时需要使用SASL机制,我们在本指南中已经看到了很多次。这是外部机制。有关示例,请参见前面的命令。注意:

  1. 为了匹配ACL,必须使用sudo作为根标识。
  2. 外部机制通过IPC (UNIX域套接字)工作。这意味着您必须使用ldapi URI的格式。
    获取所有acl的简单方法如下:
sudo ldapsearch -Q -LLL -Y EXTERNAL -H ldapi:/// -b \
cn=config '(olcAccess=*)' olcAccess olcSuffix

TLS

在对OpenLDAP服务器进行身份验证时,最好使用加密的会话。这可以使用传输层安全(TLS)来实现。
在这里,我们将使用自己的证书颁发机构,然后创建并签署LDAP服务器证书,由于slapd是使用gnutls库编译的,所以我们将使用certtool工具来完成这些任务。

  1. 安装gnutls-bin和ssl-cert
sudo apt install gnutls-bin ssl-cert
  1. 为证书颁发机构创建私钥
sudo sh -c "certtool --generate-privkey > /etc/ssl/private/cakey.pem"
  1. 创建模板文件/etc/ssl/ca.info定义CA
cn = Example Company
ca
cert_signing_key
  1. 创建自签名ca证书:
sudo certtool --generate-self-signed \
--load-privkey /etc/ssl/private/cakey.pem \
--template /etc/ssl/ca.info \
--outfile /etc/ssl/certs/cacert.pem
  1. 为服务器创建一个私钥
sudo certtool --generate-privkey \
--bits 1024 \
--outfile /etc/ssl/private/ldap01_slapd_key.pem

注:将文件名中的ldap01替换为服务器的主机名。为将要使用它们的主机和服务命名证书和密钥将有助于使事情变得清晰。

  1. 创建/etc/ssl/ldap01.info文件:
organization = Example Company
cn = ldap01.example.com
tls_www_server
encryption_key
signing_key
expiration_days = 3650

以上证书有效期是10年,相应的调整有效期。

  1. 创建服务器证书:
sudo certtool --generate-certificate \
--load-privkey /etc/ssl/private/ldap01_slapd_key.pem \
--load-ca-certificate /etc/ssl/certs/cacert.pem \
--load-ca-privkey /etc/ssl/private/cakey.pem \
--template /etc/ssl/ldap01.info \
--outfile /etc/ssl/certs/ldap01_slapd_cert.pem
  1. 更改文件属主属性:
sudo chgrp openldap /etc/ssl/private/ldap01_slapd_key.pem
sudo chmod 0640 /etc/ssl/private/ldap01_slapd_key.pem
sudo gpasswd -a openldap ssl-cert
  1. 重启slapd
systemctl restart slapd.service 

您的服务器现在可以接受新的TLS配置了。
创建certinfo,Ldif和以下内容(相应地调整,我们的示例假设我们使用https://www.cacert.org):创建了certs。

dn: cn=config
add: olcTLSCACertificateFile
olcTLSCACertificateFile: /etc/ssl/certs/cacert.pem

add: olcTLSCertificateFile
olcTLSCertificateFile: /etc/ssl/certs/ldap01_slapd_cert.pem

add: olcTLSCertificateKeyFile
olcTLSCertificateKeyFile: /etc/ssl/private/ldap01_slapd_key.pem

使用ldapmodify命令通过slapd-config数据库告诉slapd我们的TLS工作:

sudo ldapmodify -Y EXTERNAL -H ldapi:/// -f certinfo.ldif

与普遍的看法相反,您不需要在/etc/default/slapd中使用ldaps://来使用加密。你应该:

SLAPD_SERVICES="ldap:/// ldapi:///"

注:不赞成使用TLS/SSL (ldaps://)的LDAP,而使用StartTLS。后者指的是现有的
LDAP会话(监听TCP端口389)被TLS/SSL保护,而LDAPS,如
HTTPS是一种独特的加密协议,它在TCP端口636上运行。

副本TLS

如果您已经在服务器之间建立了副本,通常的做法是对复制通信流进行加密(StartTLS)以防止泄露。这与我们在上面所做的对身份验证进行加密不同。在本节中,我们将在tls身份验证工作的基础上进行构建。
假设你已经创建了副本在Provider和Consumer之间,副本在1.6部分已经配置了TLS。
如前所述,副本的目标(对于我们来说)是LDAP服务的高可用性。由于我们在提供者上使用TLS进行身份验证,我们将要求在消费者上使用相同的TLS。然而,除此之外,我们还希望对副本流量进行加密。接下来要做的是为消费者创建一个密钥和证书,然后进行相应的配置。我们将在提供者上生成密钥/证书,以避免创建另一个CA证书,然后将必要的材料转移到消费者。

  1. 在Provider上,创建一个保存目录(将用于最终的传输),然后创建消费者的私钥:
mkdir ldap02-ssl
cd ldap02-ssl
sudo certtool --generate-privkey \
--bits 1024 \
--outfile ldap02_slapd_key.pem

为消费者服务器创建一个信息文件ldap02.info,并相应地调整其值:

organization = Example Company
cn = ldap02.example.com
tls_www_server
encryption_key
signing_key
expiration_days = 3650

创建消费者证书:

sudo certtool --generate-certificate \
--load-privkey ldap02_slapd_key.pem \
--load-ca-certificate /etc/ssl/certs/cacert.pem \
--load-ca-privkey /etc/ssl/private/cakey.pem \
--template ldap02.info \
--outfile ldap02_slapd_cert.pem

复制CA证书:

cp /etc/ssl/certs/cacert.pem .

传输ldap02-ssl目录到消费者端,使用scp:

cd ..
scp -r ldap02-ssl user@consumer:
  1. 在消费者端配置TLS认证:
sudo apt install ssl-cert
sudo gpasswd -a openldap ssl-cert
sudo cp ldap02_slapd_cert.pem cacert.pem /etc/ssl/certs
sudo cp ldap02_slapd_key.pem /etc/ssl/private
sudo chgrp openldap /etc/ssl/private/ldap02_slapd_key.pem
sudo chmod 0640 /etc/ssl/private/ldap02_slapd_key.pem
sudo systemctl restart slapd.service

创建文件/etc/ssl/certinfo.ldif:

dn: cn=config
add: olcTLSCACertificateFile
olcTLSCACertificateFile: /etc/ssl/certs/cacert.pem

add: olcTLSCertificateFile
olcTLSCertificateFile: /etc/ssl/certs/ldap02_slapd_cert.pem

add: olcTLSCertificateKeyFile
olcTLSCertificateKeyFile: /etc/ssl/private/ldap02_slapd_key.pem

配置slapd-config数据库:

sudo ldapmodify -Y EXTERNAL -H ldapi:/// -f certinfo.ldif

配置/etc/default/slapd为Provider (SLAPD_SERVICES)。

  1. 在消费端:

为消费者端复制配置TLS。通过添加一些TLS选项来修改现有的olcSyncrepl属性。这样,我们将第一次看到如何更改属性的值。
创建consumer_sync_tls.Ldif,内容如下:

dn: olcDatabase={1}mdb,cn=config
replace: olcSyncRepl
olcSyncRepl: rid=0 provider=ldap://ldap01.example.com bindmethod=simple
 binddn="cn=admin,dc=example,dc=com" credentials=secret searchbase="dc=example,dc=com"
 logbase="cn=accesslog" logfilter="(&(objectClass=auditWriteObject)(reqResult=0))"
 schemachecking=on type=refreshAndPersist retry="60 +" syncdata=accesslog
 starttls=critical tls_reqcert=demand

额外的选项分别指定了消费者必须使用StartTLS和CA证书来验证提供者的身份。还要注意用于更改属性值的LDIF语法(‘replace’)。

确认修改:

sudo ldapmodify -Y EXTERNAL -H ldapi:/// -f consumer_sync_tls.ldif
sudo systemctl restart slapd.service
  1. 在Provider端:

检查是否已经建立了TLS会话。在/var/log/syslog中,如果你设置了’conns’级别的日志,你应该会看到类似于:

slapd[3620]: conn=1047 fd=20 ACCEPT from IP=10.153.107.229:57922 (IP=0.0.0.0:389)
slapd[3620]: conn=1047 op=0 EXT oid=1.3.6.1.4.1.1466.20037
slapd[3620]: conn=1047 op=0 STARTTLS
slapd[3620]: conn=1047 op=0 RESULT oid= err=0 text=
slapd[3620]: conn=1047 fd=20 TLS established tls_ssf=128 ssf=128
slapd[3620]: conn=1047 op=1 BIND dn="cn=admin,dc=example,dc=com" method=128
slapd[3620]: conn=1047 op=1 BIND dn="cn=admin,dc=example,dc=com" mech=SIMPLE ssf=0
slapd[3620]: conn=1047 op=1 RESULT tag=97 err=0 text
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

IForFree

整理不易,望多支持!

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值