13,656 瀏覽數

LDAP-帳號伺服器

基礎篇將使用 OpenLDAP 做為使用者身份登入帳號驗證伺服器

Step 0 .前製工作

你要先安裝,初步設定好你的 OPENLDAP ,可以參考下面這篇 LDAP(安裝)

step 1. OpenLDAP 目錄架構圖

接下的範例皆以此圖為輪廓
linux_client01

LDAP 的全名是:Lightweight Directory Access Protocol,我們可以透過 TCP/IP 所提供的目錄服務, 裡面的資料可以包含使用者的登入資料或是使用的 mail 以及其他有用資訊. 這服務已經普遍應用在很多作業系統上例如:Novell 的 NDS(NetWare Directory Services) 及 Microsoft 的 AD(Active Directory) 等.而在 Linux 下就是 openldap , 先來說明一下 LDAP 的連線字串的表示方式:LDAP://Server/DN,其 DN 可包含了下面三種東西:

  • CN:Common Name
  • OU:Organizational Unit
  • DC:Domain Component

在新增 LDAP 的分錄檔 (LDAP Data Interchange Format) 先來說說 LDAP 的資料表示法,如果我們再公司要找一個人一定會先問在哪一個單位怎麼稱呼.這就是典型的 DN(Distinguished Name) 也就是 LDAP 的資料表示法.如剛剛所說要表示一筆人員的記錄可以使用:我們會看到如下的 DN 字串表示式:
cn=Roy,ou=Hardware,dc=benjr,dc=tw

  • cn=Roy 有一位 Roy 先生
  • ou=Hardware 是在 hardware 部門工作
  • dc=benjr,dc=tw 效命於 benjr.tw 這一家公司.

這一長串就是 DN(Distinguished Name) ,通常我們在表示一個物件時是從小到大來表示. 而這 DN 必須為唯一,也就是說在 benjr.tw 公司的 hardware 部門是不能同時有兩個 Roy ,但不同公司或部門是可以允許有不同的 Roy 存在.但在搜尋時卻是以大到小的方式,如同 DNS .先從 公司名稱,部門單位,人名 搜尋下來.
現在來新增最頂端的分錄檔 (LDAP Data Interchange Format)

Step 2. 新增第一筆 LDAP 的分錄檔( BDN.LDIF )

一開始我們先來新增 DC:Domain Component, BDN.ldif (Base Distinguish Name) 資料至 openldap
I. 新增第一筆 BDN.ldif 檔

[root@benjr ~]# vi BDN.ldif
dn:dc=benjr,dc=tw
objectclass:top
objectclass:Domain
dc:benjr
  • dn: distingush name(每一筆的dn在LDAP內必須唯一,因為搜尋是以dn為基礎),dc=benjr,dc=tw 必須和之前 slapd.conf 相符合
  • objectclass: top 與 objectclass:Domain 指定 ldap server 此筆資料為最上層的搜尋基礎,而所有的 objectclass 皆定義在 schema 目錄內.因此 slapd.conf 在最前面才會先 include 這些必要的 schema 檔
  • dc:benjr 是 objectclass:Domain 必須要的資料,也就是我們的網域節點名稱,以我們為範例 benjr.tw 的 dc 就是 benjr

note:在編輯時要注意不要產生任何空白字元否則在加入時會產生錯誤.如果你是使用 windows 下的編輯軟體記得要先做 #dos2unix 因為 unix 和 windows 的換行有些許的不同.

執行 ldapadd

[root@benjr ~]# ldapadd -x -D "cn=root,dc=benjr,dc=tw"  -W -f BDN.ldif
Enter LDAP Password:
adding new entry "dc=benjr,dc=tw"
  • x  : 使用簡單的驗證(亦即,不用進行 SASL 認證)
  • D : 指定 dn (Distinguished Name) 識別名稱連結 LDAP directory.
  • W: 使用互動式輸入管理者密碼,有別於 -w(小寫)在需緊接著密令後面鍵入密碼
  • f  : 指定 LDIF 檔名

這樣就成功加入一筆資料

執行 ldapsearch

[root@benjr ~]# ldapsearch -x -b 'dc=benjr,dc=tw'
version: 2
#
# filter: (objectclass=*)
# requesting: ALL
#
# benjr, tw
dn: dc=benjr,dc=tw
objectClass: top
objectclass:Domain
dc:benjr
# search result
search: 2
result: 0 Success
# numResponses: 2
# numEntries: 1
  • x  : 使用簡單的驗證(亦即,不用進行 SASL 認證)
  • b: 指定 BDN(Base Distinguished Name),也就是篩選條件.

先前加入的資料也成功搜尋到了,接下來我要新增 ou(organizationalUnit) 來存放使用者的資訊.

Step 3. 新增使用者 LDAP 的分錄檔( LDIF )

在將 user 加入 LDAP 前,要新增的是 OU:Organizational Unit,我設定的是 People 這個 ou(organizationalUnit) 用來未來加入新使用者的資訊.

[root@benjr ~]# vi people.ldif
dn:ou=People,dc=benjr,dc=tw
objectclass:organizationalUnit
ou:People
[root@benjr ~]# ldapadd -x -D "cn=root,dc=benjr,dc=tw"  -W -f people.ldif
Enter LDAP Password:
adding new entry "ou=People,dc=benjr,dc=tw"
[root@benjr ~]# ldapsearch -x -b 'ou=People,dc=benjr,dc=tw'
version: 2
#
# filter: (objectclass=*)
# requesting: ALL
#
# People, benjr, tw
dn: ou=People,dc=benjr,dc=tw
objectClass: organizationalUnit
ou: people
# search result
search: 2
result: 0 Success
# numResponses: 7
# numEntries: 6

可以看到  'ou=People,dc=benjr,dc=tw' 成功加入
為什麼使用 People 這個 ou (organizational Unit),因為接下來新增的使用者利用系統提供的工具將/etc/passwd 的使用者轉換成 ldap 的使用者(Step 4 將會介紹).
我將手動寫一個在 poeple 的 ou 之下 dn 寫法 ex: dn: uid=user,unit=People,dc=benjr,dc=tw.

[root@benjr ~]# vi ldapuser1.ldif
dn: uid=ldapuser1,ou=People,dc=benjr,dc=tw
uid: ldapuser1
cn: ldapuser1
objectClass: account
objectClass: posixAccount
objectClass: top
objectClass: shadowAccount
shadowLastChange: 11933
shadowMax: 99999
shadowWarning: 7
loginShell: /bin/bash
uidNumber: 502
gidNumber: 502
homeDirectory: /home/user

userPassword: 不用先設定.之後再用 ldappasswd 設定即可
我們先看看每行所代表的意義.
dn: uid=ldapuser1,ou=People,dc=benjr,dc=tw 每一筆資料都要有唯一 dn(distingush name) ,以供查詢時使用
dn: 中的 uid,ou 名稱都可以自己定義,你可以依你的喜好來定義,如 dn:useridentificationname=user,unit=People,dc=benjr,dc=tw .
我們是要新增 login 的 user 所以要有 userid , userPassword , 而這些屬性包括在哪些 object 你可以查 /etc/openldap/schema 目錄中的 *.schema 檔中都有定義.userid 定義在cosime.schema 中的 account .

[root@benjr ~]# cat /etc/openldap/schema/cosime.schema
……………..略……………………
objectclass ( 0.9.2342.19200300.100.4.5 NAME 'account'
        SUP top STRUCTURAL
        MUST userid
        MAY ( description $ seeAlso $ localityName $
                organizationName $ organizationalUnitName $ host )
        )

其中的 MUST 是當你引用這個物件就一定要使用這個屬性,而 MAY 就屬於選擇性屬性你可以引用或者不用.userPassword 定義在 nis.schema 中的 shadowAccount

[root@benjr ~]# cat /etc/openldap/schema/nis.schema
……………..略……………………
objectclass ( 1.3.6.1.1.1.2.1 NAME 'shadowAccount' SUP top AUXILIARY
        DESC 'Additional attributes for shadow passwords'
        MUST uid
        MAY ( userPassword $ shadowLastChange $ shadowMin $
              shadowMax $ shadowWarning $ shadowInactive $
              shadowExpire $ shadowFlag $ description ) )
[root@benjr ~]# ldapadd -x -D "cn=root,dc=benjr,dc=tw"  -W -f ldapuser1.ldif
Enter LDAP Password:
adding new entry "uid=user,ou=People,dc=benjr,dc=tw"

非常恭喜你成功的加入第一筆使用者資料.相信你在加入時也遇到很多錯誤而這不是人做的工作,將會被後面介紹的工具取代.來搜尋一下結果吧

[root@benjr ~]# ldapsearch -x -b 'ou=People,dc=benjr,dc=tw'
version: 2
#
# filter: (objectclass=*)
# requesting: ALL
#
# People, benjr, tw
dn: ou=People,dc=benjr,dc=tw
objectClass: organizationalUnit
ou: people
dn: ldapuid1=user,ou=People,dc=benjr,dc=tw
uid: ldapuser1
cn: ldapuser1
objectClass: account
objectClass: posixAccount
objectClass: top
objectClass: shadowAccount
shadowLastChange: 11933
shadowMax: 99999
shadowWarning: 7
loginShell: /bin/bash
uidNumber: 501
gidNumber: 501
homeDirectory: /home/user
# search result
search: 2
result: 0 Success
# numResponses: 7
# numEntries: 6

可以看到  'uid=ldapuser1,ou=People,dc=benjr,dc=tw' 成功加入 最後再設定使用者密碼即可

[root@benjr ~]# ldappasswd -x -D "cn=root,dc=benjr,dc=tw" -W "uid=ldapuser1,ou=People,dc=benjr,dc=tw" -S
New password:
Re-enter new password:
Enter bind password:
Result: Success (0)
[root@benjr ~]# ldapsearch -x -b 'ou=People,dc=benjr,dc=tw'
# ldapuser1, People, benjr, tw
dn: uid=ldapuser1,ou=People,dc=benjr,dc=tw
uid: ldapuser1
cn: ldapuser1
objectClass: account
objectClass: posixAccount
objectClass: top
objectClass: shadowAccount
shadowLastChange: 11933
shadowMax: 99999
shadowWarning: 7
loginShell: /bin/bash
uidNumber: 501
gidNumber: 501
homeDirectory: /home/ldapuser1
userPassword:: e1NTSEF9YUtuMFNWT0ZrcW5qSks3Q2FBVytzdUtJYnFUdUFWZkw=

可以看到 userPassword 已經設定好了

Step 4. OpenLDAP 有提供工具將 /etc/passwd 的使用者,轉換成 LDAP 的使用者

工具存放在 /usr/share/openldap/migeation
首先編輯 /usr/share/openldap/migeation/migrate_common.ph 檔並

[root@benjr ~]# vi /usr/share/openldap/migeation/migrate_common.ph
# Default DNS domain
$DEFAULT_MAIL_DOMAIN = "benjr.tw";
# Default base
$DEFAULT_BASE = "dc=benjr,dc=tw";

修改 $DEFAULT_MAIL_DOMAIN = "benjr.tw"; 以及 #DEFAULT_BASE = "dc=benjr,dc=tw"; 成系統欲設定的組織領域名稱.接下來開始轉換

[root@benjr ~]# /usr/share/openldap/migeation/migrate_passwd.pl /etc/passwd > passwd.ldif

轉出來的 LDIF 檔內容就如同之前所用的範例將它加入到 LDAP Server 上 (#ldapadd -x -D "cn=root,dc=benjr,dc=tw"  -W -f passwd.ldif),此時 Linux user 就可以用這帳號登入.
其他還有針對不同的使用者資料來做轉換,如
/etc/ flat files  (migrate_all_offline.sh , migrate_all_online.sh)
包括 /etc/aliases , /etc/fstab , /etc/hosts , /etc/networks , /etc/passwd , /etc/group , /etc/services , /etc/protocols , /etc/rpc , /etc/netgroup 都會做轉換.
NIS (migrate_all_nis_offline.sh , migrate_all_nis_online.sh)
NIS+(migrate_all_nisplus_offline.sh , migrate_all_nisplus_online.sh)
Netinfo(migrate_all_netinfo_offline.sh , migrate_all_netinfo_online.sh)
online 代表直接將資料轉換到正在運作的 LDAP Server 上. 

Step 5. LDAP  Linux client 端設定

在設定完成之後就可以將 Linux 的客戶端指向 LDAP ,要將 Client 指向 LDAP server 的主要要修改設定檔為 /etc/openldap/ldap.conf ,不過 RehHat Linux 有直接提供指令 # setup / Authentication configuration (純文字介面) 或是 # system-config-authentication (GUI 介面) 來設定
不過要改的的設定有兩處.
1.User Information :
Authentication01
此處主要設定 /etc/openldap/ldap.conf , /etc/nsswitch.conf 這兩個檔.

修改 /etc/openldap/ldap.conf 主要是給客戶端應用程式來使用.ldap 客戶端會依據這邊的設定為基礎對 LDAP Server 進行搜尋.

[root@benjr ~]# cat /etc/openldap/ldap.conf
URI ldap://172.16.0.53
BASE dc=benjr,dc=tw

修改 /etc/nsswitch.conf 會新增一項 ldap , 

[root@benjr ~]# cat /etc/nsswitch.conf
passwd:     files ldap
shadow:     files ldap
group:      files  ldap

/etc/nsswitch.conf 主要作用為資料查詢時決定要用哪些方式 ,如 file , nisplus , ldap 等.像是密碼驗證身份 (passwd / shadow / group) 時除了本機的檔案( /etc/passwd , /etc/shadow, /etc/group) 可查詢外,如果找不到時還會把 client 身分驗證的工作指向 LDAP server 做查詢.而 LDAP server 的 IP 設定在 /etc/openldap/ldap.conf

2.Authentication :
Authentication03
此處主要設定 /etc/pam.d/system-auth,修改之後 /etc/pam.d/system.auth 會新增許多項與 ldap 有關的設定.

[root@benjr ~]# cat /etc/pam.d/system-auth
auth        required      /lib/security/pam_env.so
auth        sufficient    /lib/security/pam_unix.so likeauth nullok
auth        sufficient    /lib/security/pam_ldap.so use_first_pass
auth        required      /lib/security/pam_deny.so
account     required      /lib/security/pam_unix.so
account     [default=bad success=ok user_unknown=ignore ] pam_ldap.so
password    required      /lib/security/pam_cracklib.so retry=3 type=
password    sufficient    /lib/security/pam_unix.so nullok use_authtok md5 shado
w
password    sufficient    /lib/security/pam_ldap.so use_authtok
password    required      /lib/security/pam_deny.so
session     required      /lib/security/pam_limits.so
session     required      /lib/security/pam_unix.so
session     optional      /lib/security/pam_ldap.so

在以前 Unix-like 系統每個程式都有屬於自己一套的驗證方式.現在將這些驗證集中起來管理就叫做 PAM(Pluggable Authentication Modules).而 PAM 是一種認證(authentication)和授權(authorization)的架構.認證是證實你的身份過程,而授權是依據使用者身份來決定是否有權限存取系統的過程
PAM 優點如下:

  • 為多種程式提共單一的驗證機制(Authentication scheme)
  • 提供給管理者以及程式設計者單一彈性的管理方式
  • 讓程式設計者不需再對身份密碼再做額外的處理

PAM 其主要有三項功能

  • 可動態載入函數庫( libraries )
  • 安全機制集中管理
  • 配置檔在載入時才生效

關於 PAM 請參考 Pluggable Authentication Modules

現在 Linux Client 就可以用 LDAP 帳號登入了

Step 6. NFS 和 Automount

在還沒登入 Linux client 端時,我們先預想一個問題就是個別的使用者的相對的家目錄.當我們使用 LDAP 作為身分驗證實當我們登入帳號時,會出現 "No directory /home/ldapuser1" 這個錯誤訊息是指出目前 Linux LDAP Client 系統並沒有 /home/ldapuser1 的目錄,如果我們必須自己建立實在不是很聰明的 方式,所以建議使用 NFS 並搭配 automount 來掛載使用者的家目錄.

LDAP Server – NFS:
要設定 nfs 的檔案分享只需修改設定檔即可,它的設定檔位於 /etc/exports

[root@benjr ~]# vi /etc/exports
/home 172.16.0.*(rw)

主要分成三段設定值.

  • /home
    為欲分享的目錄
  • 172.16.0.*
    為可存取此分享目錄的 IP 區段,也可以寫成 172.16.0.0/255.255.255.0,或者為網域名稱 *.example.com ,以上的設定都可以配合 ?,* 來使用
  • 其他參數

    • ro: 分享目錄為僅可讀.
    • rw: 分享目錄為可讀+寫.但是還是會受到檔案本身權限 rwx 的限制.
    • root_squash: 若 client 以 root 的身份作存取, nfs 會把 root 所寫入的檔案擁有者以及群組會轉換成 nfsnobod.
    • no_root_squash: 預設 nfs 不允許 user 以 root 的身份寫入檔案,在未設定此一 option 時, root所寫入的檔案擁有者以及群組會轉換成nfsnobod.
    • all_squash: 不管使用者為何都將其權限轉變成 nfsnobod.

修改後必須重新啟動服務.

[root@benjr ~]# service nfs reload

or

[root@benjr ~]# exportfs -r

Linux LDAP Client – Automount:
autofs 主要的設定檔有兩個 1.auto.master 2. auto.misc 都儲存在 /etc/ 的目錄下.

  • /etc/auto.master 設定檔

    [root@benjr ~]# vi /etc/auto.master
    /home /etc/auto.remote –timeout=60
    

    /home  自動掛載點,可移除裝置將掛在這個目錄下.
    /etc/auto.remote 設定哪些可移除裝置需自動掛載的設定檔.
    –timeout=60 預設60秒後,移除非作用的掛載裝置.前兩個為必要值,這個為選擇性的參數.

  • /etc/auto.misc 設定檔

    [root@benjr ~]# vi /etc/auto.remote
    * -rw,soft,intr 172.16.0.53:/home/&
    

    /home/& 代表 /home 目錄下的任何子目錄,而 * 代表 /home/& 所相對應的名稱.比如進入到 /home/ben 目錄時就表示要掛載 172.16.0.53:/home/ben .若是要進入 /home/steven 時,那麼就會自動把 192.168.1.211 的 /home/steven 掛進來。
    而這些常用的參數如下面所列:

    • rw
      r(read) + w(write) 在自動掛載時以可讀寫的方式掛載
    • soft
      假如無法連接遠端主機或是沒有回應,在一段時間過後就直接回報錯誤並不是重試. return an error and don't retry after the timeout period expired
    • intr
      autofs 允許我們使用 ctrl+C 去做中斷連接遠端的動作,為了防止連接設定錯誤建議使用這參數以中斷過長時間的遠端連接.

    fstype 目前 autofa 可支援的遠端檔案系統如下:
    NFS:
    remote-home  -fstype=nfs,rw   ip_of_remote_server:/home
    SMB:
    host_share  -fstype=smbfs,username=windowsuser,password=windowspassword,uid=500,gid=100 ://ip_of_remote_server/share

重新啟動 autofs daemon 

[root@benjr ~]# service autofs restart
[root@benjr ~]# chkconfig autofs on

現在登入就不會再出現 "No directory /home/ldapuser1" 這個錯誤訊息.

5 個網友的想法 “LDAP-帳號伺服器

  1. 自動參照通知: LDAP-用於 samba PDC 認證 | Benjr.tw

  2. 自動參照通知: Samba-使用 LDAP 目錄認證 | Benjr.tw

  3. 自動參照通知: LDAP – GUI 操作介面 | Benjr.tw

  4. 自動參照通知: LDAP-安裝 | Benjr.tw

  5. 自動參照通知: LDAP | Benjr.tw

發表迴響