centos7下ldap+kerberos實現單點登錄

1、 LDAP概念

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

#中文文檔html

 

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

#官方英文文檔mysql

 

  LDAP的英文全稱是Lightweight Directory Access Protocol,通常都簡稱爲LDAP相似DNS的樹形結構來組織信息web

  通常狀況下,LDAP須要結合Kerberos作認證,kerberos提供了一個不須要傳輸密碼的狀況下,能夠給你和你想使用的服務之間創建信任關係的服務並且不須要你每次都輸入密碼。實現單點登錄sql

 

一、 entry

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

 

二、 dn

  每個條目都有一個惟一的標識名(distinguished Name DN編程

  相似URI的功能centos

 

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

  其中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 組織單元中。

 

三、 Attribute

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

  屬性不是隨便定義的,須要符合必定的規則,而這個規則能夠經過schema制定。好比,若是一個entry沒有包含在 inetorgperson 這個 schema 中的objectClass: inetOrgPerson,那麼就不能爲它指定employeeNumber屬性,由於employeeNumber是在inetOrgPerson中定義的。

 

一些經常使用的別名:

  dn:一條entry的惟一路徑

  cn:用戶的全名

  sn:用戶的姓

  uid:用戶的登錄名稱

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

  o:組織名稱(公司名)

  ou:部門名稱

  mail:郵件地址

 

四、 schema

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

  好比:電話號碼,就不能輸入英文字母,不然報錯

  openlda默認自帶RFC標準的schema,若是沒有特殊需求,導入便可

 

五、 ObjectClass

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

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

 

六、  LDIF

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

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

 

2、 LDAP安裝配置

一、 安裝LDAP服務端

yum源:

  1.centos7OS

  2.epel

 

yum install -y openldap-servers openldap-clients

  #openldap-servers,服務端

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

 

二、 配置

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

 

OpenLDAP 2.4有兩種配置方式:

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

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

 

2.一、 主配置

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.二、 測試配置文件

slaptest -u

 

2.三、 啓動服務

systemctl start slapd

systemctl enable slapd

 

三、 導入schema

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

 

四、 定義命名空間

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

 

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工具,將上面的定義,寫進數據庫

 

五、 查詢

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

  #默認查詢全部內容

 

六、 migrationtools遷移用戶

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

 

6.一、 安裝

yum install -y migrationtools

 

6.二、 遷移用戶組

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.三、 查詢

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.四、 修改密碼

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

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

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

 

七、 安裝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

 

八、 LDAP客戶端

  

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

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

 

注意:

  若是要經過客戶端的sssd進行LDAP認證,必須開啓TLS加密。sssd不支持不加密的認證通道。

 

8.一、 使用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用戶在客戶端本地是沒辦法建立家目錄的

 

九、 配置TLS加密

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

 

若是要經過客戶端的sssd進行LDAP認證,必須開啓TLS加密。sssd不支持不加密的認證通道。

 

9.一、 建立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.二、 生成用戶證書

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.三、 配置服務端

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.四、 測試

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

  #-Z,使用加密鏈接

 

9.五、 配置客戶端

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服務自動啓動

 

十、 nfs共享家目錄

10.一、 服務端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.二、 客戶端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

 

3、 kerberos

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

  也就是密碼要由kerberos來存儲

 

一、 名稱解釋

  KDC,票據分發中心

  realm,就是域名,要大寫

 

注意:

  Kerberos 要求參與通訊的主機的時鐘同步。票據具備必定有效期,所以,若是主機的時鐘與 Kerberos 服務器的時鐘不一樣步,認證會失敗。默認設置要求時鐘的時間相差不超過 10 分鐘。

 

二、 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,若是能解開,說明客戶端可信。

 

三、 安裝kerberos

yum install -y krb5-server

  #安裝kerberos

 

四、 配置

通用配置文件

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

 

五、 初始化kerberos

kdb5_util create -s -r EXAMPLE.COM

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

  #-s,表示將密碼保存爲文件,不用每次啓服務時,須要輸入密碼

 

systemctl start kadmin

systemctl start krb5kdc

systemctl enable krb5kdc

systemctl enable kadmin

 

六、 建立票據

6.一、 principal概念

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

 

6.二、 建立principal

kadmin.local

?

  #查看幫助

addprinc root/admin

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

  #並建立密碼

addprinc demouser1

addprinc demouser2

  #設置兩個用戶的密碼

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

addprinc -randkey host/node2.example.com

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

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

listprincs

  #列出建立的princ

quit

 

七、 客戶端配置

SSSDLDAP目錄中查找用戶,而後聯繫Kerberos KDC進行身份驗證並獲取票證。

 

這麼多配置文件,很容易出錯,因此建議使用工具,進行配置:

  authconfig,命令行

  authconfig-tui,文本圖形

  authconfig-gtk,圖形

 

7.一、 裝包

yum install -y  krb5-workstation sssd pam_krb5

  #krb5-workstationkerberos客戶端

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

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

 

7.二、 配置文件

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.三、 導入keytab

keytab必須爲:/etc/krb5.keytab

 

kadmin

  #遠程連到KDC服務器

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

ktadd host/node1.example.com

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

 

7.四、 配置

authconfig-tui

 

 

八、 配置ssh

  SSH登錄,經過kerberos認證,無需輸入密碼

  GSSAPIGeneric Security Services Application Program InterfaceGSSAPI 自己是一套 API,由 IETF 標準化。

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

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

 

8.一、 ssh服務端和客戶端啓用ASSAPI

vi /etc/ssh/ssh_config

  GSSAPIAuthentication yes

  GSSAPIDelegateCredentials yes

 

vi /etc/ssh/sshd_config

  GSSAPIAuthentication yes

  GSSAPICleanupCredentials yes

 

systemctl restart sshd

 

8.二、 測試

ssh demouser1@node1

  #不須要輸入密碼就對了

klist

  #列出票據

 

九、 配置nfs secure

  NFS默認不須要身份驗證,帶來不少安全問題,經過kerberos來保護NFS的安全

 

  前提:

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

 

9.一、 在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.二、 安裝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.六、 客戶端

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

相關文章
相關標籤/搜索