centos7下ldap+kerberos實現單點登陸


一、 LDAP概念

http://wiki.jabbercn.org/index.php/OpenLDAP2.4%E7%AE%A1%E7%90%86%E5%91%98%E6%8C%87%E5%8D%97

#中文文檔

 

http://www.openldap.org/doc/admin24/

#官方英文文檔

 

  LDAP的英文全稱是Lightweight Directory Access Protocol,一般都簡稱為LDAP類似DNS的樹形結構來組織信息

  一般情況下,LDAP需要結合Kerberos做認證,kerberos提供了一個不需要傳輸密碼的情況下,可以給你和你想使用的服務之間建立信任關系的服務而且不需要你每次都輸入密碼。實現單點登陸

 

1、 entry

  條目,也叫記錄項,是LDAP中最基本的顆粒,就像字典中的詞條,或者是數據庫中的記錄。通常對LDAP的添加、刪除、更改、檢索都是以條目為基本對象的。

 

2、 dn

  每一個條目都有一個唯一的標識名(distinguished Name DN

  類似URI的功能

 

  CN, OU, DC 都是 LDAP 連接服務器的端字符串中的區別名稱(DN, distinguished   name 
  LDAP連接服務器的連接字串格式為:ldap://servername/DN   
  

  其中DN有三個屬性,分別是CN,OU,DC   

    DC (Domain Component)

    OU (Organizational Unit)

    CN (Common Name)

 

  CN=Common Name 為用戶名或服務器名,最長可以到80個字符,可以為中文;

  OU=Organization Unit為組織單元,最多可以有四級,每級最長32個字符,可以為中文;

  O=Organization 為組織名,可以3—64個字符長

  C=Country為國家名,可選,為2個字符長

 

例如:CN=test,OU=developer,DC=domainname,DC=com 
  在上面的代碼中 cn=test 可能代表一個用戶名,ou=developer 代表一個 active directory 中的組織單位。這句話的含義可能就是說明 test 這個對象處在domainname.com 域的 developer 組織單元中。

 

3、 Attribute

  每個條目都可以有很多屬性(Attribute),比如常見的人都有姓名、地址、電話等屬性。每個屬性都有名稱及對應的值,屬性值可以有單個、多個,比如你有多個郵箱。

  屬性不是隨便定義的,需要符合一定的規則,而這個規則可以通過schema制定。比如,如果一個entry沒有包含在 inetorgperson 這個 schema 中的objectClass: inetOrgPerson,那么就不能為它指定employeeNumber屬性,因為employeeNumber是在inetOrgPerson中定義的。

 

一些常用的別名:

  dn:一條entry的唯一路徑

  cn:用戶的全名

  sn:用戶的姓

  uid:用戶的登陸名稱

  c:兩個字符的國家代碼,比如:中國,cn

  o:組織名稱(公司名)

  ou:部門名稱

  mail:郵件地址

 

4、 schema

  schema定義了哪些屬性可用,以及屬性的格式(類似mysql的約束)

  比如:電話號碼,就不能輸入英文字母,否則報錯

  openlda默認自帶RFC標准的schema,如果沒有特殊需求,導入即可

 

5、 ObjectClass

  對象類是屬性的集合,LDAP預想了很多人員組織機構中常見的對象,並將其封裝成對象類。

  比如人員(person)含有姓(sn)、名(cn)、電話(telephoneNumber)、密碼(userPassword)等屬性單位職工(organizationalPerson)是人員(person)的繼承類,除了上述屬性之外還含有職務(title)、郵政編碼(postalCode)、通信地址(postalAddress)等屬性。

 

6、  LDIF

  LDIFLDAP Data Interchange Format,數據交換格式)是LDAP數據庫信息的一種文本格式,用於數據的導入導出,每行都是“屬性: 值”對

  LDIF文件是OpenLDAP操作數據或修改配置的一切來源

 

二、 LDAP安裝配置

1、 安裝LDAP服務端

yum源:

  1.centos7OS

  2.epel

 

yum install -y openldap-servers openldap-clients

  #openldap-servers,服務端

  #openldap-clients,客戶端工具箱,包含ldapadd等工具

 

2、 配置

https://www.openldap.org/doc/admin24/slapdconf2.html

 

OpenLDAP 2.4有兩種配置方式:

  (1)slapd.conf配置文件,這是舊版本的配置方式

  (2)數據庫(cn=config),這是新的推薦的配置方式

 

2.1、 主配置

slappasswd

  #產生一個加密過后的密碼

 

vi /etc/openldap/slapd.d/cn\=config/olcDatabase\=\{2\}hdb.ldif

  olcSuffix: dc=example,dc=com

  olcRootDN: cn=Manager,dc=example,dc=com

  olcRootPW: {SSHA}oe7odi30W9Jy4YbqW348HV4p7B5n6khU

  olcAccess: {0}to attrs=userPassword by self write by dn.base="cn=Manager,dc=example,dc=com" write by anonymous auth by * none

  olcAccess: {1}to * by dn.base="cn=Manager,dc=example,dc=com" write by self write by * read

  #定義一個管理員,中Manager,並且設定密碼

  #注意,密碼為上面slappasswd命令創建的加密過后的密碼

 

2.2、 測試配置文件

slaptest -u

 

2.3、 啟動服務

systemctl start slapd

systemctl enable slapd

 

3、 導入schema

ls /etc/openldap/schema/*.ldif |xargs -I {} ldapadd -Y EXTERNAL -H ldapi:/// -f {}

 

4、 定義命名空間

也就是定義整個組織的架構

 

vi /etc/openldap/base.ldif

  dn: dc=example,dc=com

  objectclass: dcObject

  objectclass: organization

  dc: example

  o: ldap

  #定義suffix,也就是目錄樹的最頂端

 

  dn: ou=People,dc=example,dc=com

  objectclass: organizationalUnit

  ou: People

  #在根下面定義一個分支,叫people,使用部門這個類,表示這定義的是一個部門信息

 

  dn: ou=Group,dc=example,dc=com

  objectclass: organizationalUnit

  ou: Group

 

注意:

  1.多個dn之間必須使用一個空行來隔離

  2.最后一個dn定義完成之后,不能有空行

  3.dn最左邊的定義項(RDN),必須出現在屬性描述里

 

ldapadd -x -D cn=Manager,dc=example,dc=com -W -f /etc/openldap/base.ldif

  #使用ldapadd工具,將上面的定義,寫進數據庫

 

5、 查詢

ldapsearch -x -D cn=Manager,dc=example,dc=com -w

  #默認查詢所有內容

 

6、 migrationtools遷移用戶

  migrationtools,將本地/etc/passwd/etc/group文件,轉換成ldif文件

 

6.1、 安裝

yum install -y migrationtools

 

6.2、 遷移用戶組

useradd demouser1

useradd demouser2

 

vi /usr/share/migrationtools/migrate_common.ph

  $DEFAULT_MAIL_DOMAIN = "example.com";

  $DEFAULT_BASE = "dc=example,dc=com";

  $EXTENDED_SCHEMA = 1;

 

grep demo /etc/passwd > /tmp/users

grep demo /etc/group > /tmp/groups

 

cd /usr/share/migrationtools/

./migrate_passwd.pl /tmp/users /tmp/users.ldif

./migrate_group.pl /tmp/groups /tmp/groups.ldif

 

ldapadd -x -D cn=Manager,dc=example,dc=com -w redhat -f /tmp/groups.ldif

ldapadd -x -D cn=Manager,dc=example,dc=com -w redhat -f /tmp/users.ldif

 

注意:

  默認,會有一個Manager的管理員

 

6.3、 查詢

ldapsearch -H ldap://172.25.254.142 -x -b "ou=People,dc=example,dc=com"

  #查詢ouPeople的信息

 

ldapsearch -H ldap://172.25.254.142 -x -b "uid=demouser1,dc=example,dc=com"

  #查詢uiddemouser1的信息

 

6.4、 修改密碼

ldappasswd -x -D "cn=Manager,dc=example,dc=com"  \

-w redhat "cn=demouser1,dc=example,dc=com" -s New_PASS

  #管理員修改普通用戶密碼

 

7、 安裝web

yum install -y httpd phpldapadmin

  #phpldapadminldapweb程序,在EPEL源中

 

vi /etc/phpldapadmin/config.php

  $servers->setValue('server','host','127.0.0.1');

  $servers->setValue('server','port',389);

  $servers->setValue('server','base',array('dc=example,dc=com'));

  $servers->setValue('login','auth_type','session');

  #取消上述行的注釋

  // $servers->setValue('login','attr','uid');

  #將這行注釋掉

 

vi /etc/httpd/conf.d/phpldapadmin.conf

  <IfModule mod_authz_core.c>

      # Apache 2.4

      Require all granted

    </IfModule>

 

vi /etc/openldap/base.ldif

  dn: dc=example,dc=com

  o: ldap

  objectclass: dcObject

  objectclass: organization

  dc: example

  #定義根節點

 

ldapadd -f /etc/openldap/base.ldif -x -D cn=Manager,dc=example,dc=com -W

  #創建根節點

  #注意,根節點必須命令行創建,web沒法創建根

 

systemctl start httpd

systemctl enable httpd

 

firefox http://172.25.254.142/phpldapadmin/

usernamecn=Manager,dc=example,dc=com

 

8、 LDAP客戶端

  

方法一,pam直接去找ldap服務器,這樣如果中間網絡出問題,客戶端就沒辦法登陸

方法二,在客戶端上安裝一個緩存服務(sssd或nss),pam找這個緩存服務去拿認證信息,然后緩存服務和ldap服務器通訊,拿到認證信息交給pam,並緩存到本地,這樣,就可以實現客戶端脫機狀態也可登陸。

 

注意:

  如果要通過客戶端的sssd進行LDAP認證,必須開啟TLS加密。sssd不支持不加密的認證通道。

 

8.1、 使用NSS配置

有兩個圖形工具,都可以:

system-config-authentication

  #純圖形化

 

authconfig-tui

  #字符圖形化

 

yum install -y nss-pam-ldapd

  #nss-pam-ldapd,是pam模塊和nss模塊的集合

  #PAM身份驗證服務使用 OpenLDAP 服務器中的用戶

 

authconfig-tui

 

 

getent passwd demouser1

id demouser1

 

注意,

  默認ldap用戶在客戶端本地是沒辦法創建家目錄的

 

9、 配置TLS加密

http://www.openldap.org/doc/admin24/tls.html#Server%20Certificates

 

如果要通過客戶端的sssd進行LDAP認證,必須開啟TLS加密。sssd不支持不加密的認證通道。

 

9.1、 創建CA機構

cd /etc/pki/CA

(umask 077;openssl genrsa -out private/cakey.pem 2048)

openssl req -new -x509 -key private/cakey.pem -out cacert.pem -days 3650

touch serial index.txt

echo 01 > serial

 

9.2、 生成用戶證書

cd /etc/pki/tls/certs

(umask 077;openssl genrsa -out slapd.key 1024)

  #創建key

openssl req -new -key slapd.key -out slapd.csr

  #創建請求文件

 

openssl ca -in slapd.csr -out slapd.crt -days 3650

  #CA機構生成用戶證書

 

注意:

  ldap用戶必須有讀取證書的權限

 

chown root.ldap slapd.*

chmod 750 slapd.*

 

9.3、 配置服務端

vi /etc/openldap/slapd.d/cn\=config.ldif

  olcTLSCACertificateFile: /etc/pki/CA/cacert.pem

  olcTLSCertificateFile: /etc/pki/tls/certs/slapd.crt

  olcTLSCertificateKeyFile: /etc/pki/tls/certs/slapd.key

  #指定3個文件的位置

  #刪除TLSCACertificatePath

 

systemctl restart slapd

 

注意:

  1.TLSCACertificatePath,CA證書所在目錄,指定的路徑下面只能放CA證書,不能放其它證書

  2.TLSCACertificatePatholcTLSCACertificateFile這兩個參數沖突,二選一

 

9.4、 測試

ldapsearch -x  -D "cn=Manager,dc=example,dc=com" -W -Z

  #-Z,使用加密連接

 

9.5、 配置客戶端

yum install -y sssd

  #使用sssd緩存用戶信息,實現單點登陸

mkdir /etc/openldap/cacerts/

  #sssd默認查找ca證書的路徑

 

scp root@server.example.com:/etc/pki/CA/cacert.pem /etc/openldap/cacerts/

 

  #在server端,將CA證書拷過來

 

 

authconfig-tui

 

 

注意:

  1.會更改三個配置文件:/etc/sssd/sssd.conf /etc/nsswithch.conf/etc/pam.d/system-auth

  2.配置結束,sssd服務自動啟動

 

10、 nfs共享家目錄

10.1、 服務端NFS共享

yum install -y nfs-utils

 

vi /etc/exports

  /home *(rw,sync)

 

systemctl start rpcbind

systemctl enable rpcbind

systemctl start nfs-server

systemctl enable nfs-server

 

10.2、 客戶端autofs掛載

yum install -y nfs-utils autofs

 

vi /etc/auto.master

  /home /etc/auto.autofs --timout=600

 

vi /etc/auto.autofs

  * kerberos.example.com:/home/&

 

systemctl enable autofs

systemctl start autofs

 

三、 kerberos

  kerberosldap結合,ldap存儲用戶信息,kerberos實現認證

  也就是密碼要由kerberos來存儲

 

1、 名稱解釋

  KDC,票據分發中心

  realm,就是域名,要大寫

 

注意:

  Kerberos 要求參與通信的主機的時鍾同步。票據具有一定有效期,因此,如果主機的時鍾與 Kerberos 服務器的時鍾不同步,認證會失敗。默認設置要求時鍾的時間相差不超過 10 分鍾。

 

2、 kerbors身份驗證過程

有一個中間人叫KDC(鑰匙分發中心),他為用戶端生成好密碼,並分發給用戶

  1.KDC知道所有人的密碼,因為客戶端的密碼就是由KDC生成的

  2.每個人都知道自己的密碼

  3.所有人都向KDC申請驗證

 

  客戶端輸入用戶密碼-->密碼hash保存到本地,用戶名以明文發給KDC,請求驗證

  KDC收到請求,在數據庫搜索該用戶,找到,就用該用戶的密碼hash值加密一個TGTkey1),發送給客戶端。

  客戶端收到TGT(key1),如果上面輸入的密碼正確,就可以解密,驗證成功,並將解開的TGT緩存到本地

  客戶端-->KDC申請訪問某個服務的請求,KDC生成一個新的TGT,將新的TGTkey1加密,生成key2;再用服務的密碼加密,生成key3,都發給客戶端

  客戶端拿到這兩個加密的TGT,將用自己key1解開key2;然后用解開的新TGT加密系統當前的時間戳,生成key4,然后將key4key3一起發給要訪問的服務

  服務收到這兩個key,用自己的密碼解開key3,拿到TGT,然后解開key4,如果能解開,說明客戶端可信。

 

3、 安裝kerberos

yum install -y krb5-server

  #安裝kerberos

 

4、 配置

通用配置文件

vi /etc/krb5.conf

  [logging]

   default = FILE:/var/log/krb5libs.log

   kdc = FILE:/var/log/krb5kdc.log

   admin_server = FILE:/var/log/kadmind.log

 

  [libdefaults]

   dns_lookup_realm = false

   ticket_lifetime = 24h

   renew_lifetime = 7d

   forwardable = true

   rdns = false

   default_realm = EXAMPLE.COM

   default_ccache_name = KEYRING:persistent:%{uid}

 

  [realms]

   EXAMPLE.COM = {

    kdc = kerberos.example.com

    admin_server = kerberos.example.com

   }

  #注意,要能解析

 

  [domain_realm]

   .example.com = EXAMPLE.COM

   example.com = EXAMPLE.COM

 

注意:

  不管服務端,還是客戶端,都會用到/etc/krb5.conf

 

5、 初始化kerberos

kdb5_util create -s -r EXAMPLE.COM

  #創建kerberos的數據庫,並設置數據庫密碼

  #-s,表示將密碼保存為文件,不用每次啟服務時,需要輸入密碼

 

systemctl start kadmin

systemctl start krb5kdc

systemctl enable krb5kdc

systemctl enable kadmin

 

6、 創建票據

6.1、 principal概念

Kerberos認證的唯一IDprincipal,由primaryinstancerealm三部分

 

6.2、 創建principal

kadmin.local

?

  #查看幫助

addprinc root/admin

  #創建一個用戶root,角色是admin

  #並創建密碼

addprinc demouser1

addprinc demouser2

  #設置兩個用戶的密碼

  #注意,這兩個用戶信息存在LDAP中

addprinc -randkey host/node2.example.com

  #創建主機,即kerberos客戶端主機

  #-randkey,主機密碼隨機設置

listprincs

  #列出創建的princ

quit

 

7、 客戶端配置

SSSDLDAP目錄中查找用戶,然后聯系Kerberos KDC進行身份驗證並獲取票證。

 

這么多配置文件,很容易出錯,所以建議使用工具,進行配置:

  authconfig,命令行

  authconfig-tui,文本圖形

  authconfig-gtk,圖形

 

7.1、 裝包

yum install -y  krb5-workstation sssd pam_krb5

  #krb5-workstationkerberos客戶端

  #sssd,安全服務守護進程,負責檢索和緩存用戶信息和身份驗證信息

  #pam_krb5,默認,kerberos會繞過pam,安裝此包,就是讓使用pam的應用程序可以使用kerberos進行身份驗證

 

7.2、 配置文件

scp root@server.example.com:/etc/krb5.conf node1:/etc

  #拷貝kerberos服務器的/etc/krb5.conf過來

mkdir /etc/krb5.conf.d/

  #因為配置文件里有includedir /etc/krb5.conf.d/,所以必須創建這個目錄,否則下面的命令失敗

  #也可以將配置文件中的inludedir刪掉

 

7.3、 導入keytab

keytab必須為:/etc/krb5.keytab

 

kadmin

  #遠程連到KDC服務器

  #連接信息,在配置文件中

ktadd host/node1.example.com

  #根據配置文件,連接到kerberos服務器,將主機的key下載到本地

 

7.4、 配置

authconfig-tui

 

 

8、 配置ssh

  SSH登陸,通過kerberos認證,無需輸入密碼

  GSSAPIGeneric Security Services Application Program InterfaceGSSAPI 本身是一套 API,由 IETF 標准化。

  其最主要也是著名的實現是基於 Kerberos 的。一般說到 GSSAPI 都暗指 Kerberos 實現。

  GSSAPI 是一套通用網絡安全系統接口。該接口是對各種不同的客戶端服務器安全機制的封裝,以消除安全接口的不同,降低編程難度。

 

8.1、 ssh服務端和客戶端啟用ASSAPI

vi /etc/ssh/ssh_config

  GSSAPIAuthentication yes

  GSSAPIDelegateCredentials yes

 

vi /etc/ssh/sshd_config

  GSSAPIAuthentication yes

  GSSAPICleanupCredentials yes

 

systemctl restart sshd

 

8.2、 測試

ssh demouser1@node1

  #不需要輸入密碼就對了

klist

  #列出票據

 

9、 配置nfs secure

  NFS默認不需要身份驗證,帶來很多安全問題,通過kerberos來保護NFS的安全

 

  前提:

    NFS服務端和客戶端先配置好kerberos驗證

 

9.1、 在NFS服務端遠程創建principal

kadmin -p root/admin

  #使用root登陸到KDC

addprinc -randkey host/server.example.com

addprinc -randkey host/client.example.com

  #創建nfs服務器和客戶端的host principal

addprinc -randkey nfs/server.example.com

addprinc -randkey nfs/client.example.com

  #創建nfs服務端和客戶端的service principal

 

ktadd host/server.example.com

 

ktadd nfs/server.example.com

 

  #默認會將兩個principal,以追加的方式保存到本地的/etc/krb5.keytab

 

q

 

10.2、 安裝nfs-server

yum install krb5-workstation

yum install nfs-utils

mkdir -p /share

chown demouser1.demouser1 /share

 

vi /etc/exports

         /share *(rw,sec=krb5p)

 

vi /etc/sysconfig/nfs

  RPCNFSDARGS="-V 4.2"

  #開啟NFS4.2版本

  #注意,在centos7.1之后,需要重啟系統才能生效

 

systemctl start nfs-server

systemctl start nfs-secure-server

  #注意,centos7.1之后,不再使用nfs-secure-server服務,改用rpc-gssd

  

10.6、 客戶端

kadmin -p root/admin

ktadd host/client.example.com

ktadd nfs/client.example.com

 

systemctl restart nfs-secure

mkdir /mnt/share

showmout -e server.example.com

mount -o sec=krb5p,v4.2 server.example.com:/share /mnt/share

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM