3,777 瀏覽數

Samba-使用 LDAP 目錄認證

samba(使用 LDAP 目錄認證)
一般的 samba server 密碼是存在 /etc/samba/smbpasswd 中,它是一般的文字檔,對於較少使用者的 samba server 並不會有太大的問題,但是當使用者眾多時就會有以下的問題產生

  1. 查詢是循序進行,所以效能將會是瓶頸.
  2. 每一台 samba server 必須自己維護 smbpasswd 檔,當有多台 samba server 帳號的同步就是問題了.
  3. smbpasswd 檔的格式限制了每個使用者可以維護的屬性.

這時就可以使用 LDAP 目錄來做身份驗證來解決以上的問題,關於 LDAP 是什麼可以查看 LDAP(序) 說明

Step0:需求

1.openldap (RedHat 光碟中 openldap.rpm 可找到)
2.samba3.x  (可到 samba 網站下載)
note: samba 2.x 預設的版本並不支援 LDAP 目錄的認證,需要重新編輯過才能使用請參考 samba PDC 使用LDAP認證

Setp1: 安裝

samba 3.x 安裝之前先移除 samba 2.x 的版本

[root@benjr ~]# rpm -e samba-swat
[root@benjr ~]# rpm -e samba-client
[root@benjr ~]# rpm -e redhat-config-samba
[root@benjr ~]# rpm -e  samba
[root@benjr ~]# rpm -e samba-common
[root@benjr ~]# rpm -ivh samba-3…..i386.rpm

安裝 OpenLDAP ,在 RedHat 第三片光碟片中的目錄 /mnt/cdrom/ReaHat/RPMS/可以找到所需的程式

[root@benjr ~]# rpm -ivh openldap…..rpm #rpm -ivh openldap-clients…..rpm
[root@benjr ~]# rpm -ivh openldap-servers…..rpm

Step2: OpenLDAP 的設定

[root@benjr ~]# vi /etc/openldap/slapd.conf
include  /etc/openldap/schema/core.schema
include  /etc/openldap/schema/cosine.schema
include  /etc/openldap/schema/inetorgperson.schema
include  /etc/openldap/schema/nis.schema 
include  /etc/openldap/schema/samba.schema
………………略……………………………
database ldbm
suffix  "dc=example,dc=com"
rootdn  "cn=Manager,dc=example,dc=com"
rootpw  {SSHA}83DJ4KVwqlk1uh9k2uDb8+NT1U4RgkEs   
………………略……………………………   

加入 include  /etc/openldap/schema/samba.schema 這一行,以支援 samba 使用 LDAP 的認證
note: samba.schema 檔案包在 samba.xxxx.rpm 中,安裝後存放在 /usr/share/doc/samba-3.0.0/examples/LDAP/ 目錄下.所以要手動複製檔案至  /etc/openldap/schema/ 目錄下.

[root@benjr ~]# cp /usr/share/doc/samba-3.0.0/examples/LDAP/samba.schema  /etc/openldap/schema/

上述以 example.com 為範例
suffix  "dc=example,dc=com"        
管理者為 Manager
rootdn  "cn=Manager,dc=example,dc=com"   
使用管理者密碼
rootpw  {SSHA}83DJ4KVwqlk1uh9k2uDb8+NT1U4RgkEs  
管理者密碼的產生

[root@benjr ~]# slappasswd
New password
Re-enter new password
{SSHA}83DJ4KVwqlk1uh9k2uDb8+NT1U4RgkEs

接下來再拷到 /etc/openldap/sldap.conf  的 rootpw 即可(怎麼拷,可以用滑鼠的左右建來做)
重新啟動 openldap

[root@benjr ~]# service ldap restart

Step3:新增 LDAP 的分錄檔

I. 現在新增第一筆 BDN.ldif (Base Distinguish Name)資料至 openldap

[root@benjr ~]# vi BDN.ldif
dn:dc=example,dc=com
objectclass:top

至於他們各代表什麼意思請參考 LDAP(帳號伺服器)

執行 ldapadd 將資料加入 OpenLDAP 中

[root@benjr ~]# ldapadd -x -D "cn=Manager,dc=example,dc=com"  -W -f BDN.ldif
Enter LDAP Password:
adding new entry "dc=example,dc=com"

這樣就成功加入一筆資料

II.新增使用者資料至 openldap
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_BASE = "dc=example,dc=com";

修改 #DEFAULT_BASE = "dc=example,dc=com"; 成系統欲設定的組織領域名稱,在轉換之前 user1 必須先存在 /etc/passwd 中,所以先新增 user1 這個使用者

[root@benjr ~]# adduser user
[root@benjr ~]# passwd user1
Changing password for user1 user1
New password:
Retype new password:
passwd: all authentication tokens updated successfully

我們只需要轉換 user1 這個使用者所以我必須先精簡 /etc/passwd 檔案成只有 user1 這個使用者

[root@benjr ~]# cp /etc/passwd /etc/openldap/user1
[root@benjr ~]# vi /etc/openldap/user1
user1:x:500:500::/home/user1:/bin/bash

接下來開始轉換

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

轉出來的 LDIF 檔內容就如同下面所用的範例,但我只是做簡單設定所以直接將使用者放置在根目錄下,而不是用 ou=People 來存放(所以要移除 ou=People)

dn: uid=user1,dc=example,dc=com
uid: user1
cn: user1
objectClass: account
objectClass: posixAccount
objectClass: top
objectClass: shadowAccount
userPassword: {crypt}$1$YKgbc0rJ$Db9hUhK.eYQdmi6NFyz8U.
shadowLastChange: 12374
shadowMax: 99999
shadowWarning: 7
loginShell: /bin/bash
uidNumber: 500
gidNumber: 500
homeDirectory: /home/user1

至於他們各代表什麼意思請參考 LDAP(帳號伺服器)
執行 ldapadd 將資料加入 OpenLDAP 中

[root@benjr ~]# ldapadd -x -D "cn=Manager,dc=example,dc=com"  -W -f user1.ldif
Enter LDAP Password:
adding new entry "uid=user1,dc=example,dc=com"

這樣就成功加入一筆資料,來搜尋一下結果吧

[root@benjr ~]# ldapsearch -x -b 'ou=People,dc=example,dc=com'
version: 2
#
# filter: (objectclass=*)
# requesting: ALL
#
# People, example, com
dn: ou=People,dc=example,dc=com
objectClass: organizationalUnit
………………略……………………

可以看到  'uid=user1,dc=example,dc=com' 成功加入,但這樣的資料還無法給 samba 來使用,最後我會再將 samba 所需的補上去.

Step4: samba 的設定

[root@benjr ~]# vi /etc/samba/smb.conf 
workgroup = EXAMPLE
netbios name =sun01
ldap admin dn = "cn=Manager,dc=example,dc=com"
passdb backend = ldapsam:ldap://192.0.0.1, guest
ldap ssl = off
ldap suffix = "dc=example,dc=com"
security = user
encrypt passwords = yes

說明

  • workgroup = EXAMPLE
    #所在的網域名稱,也是 OpenLDAP 之前設定的
  • netbios name =sun01           
    #
    netbios name 也就是 windows 的電腦名稱
  • ldap admin dn = "cn=Manager,dc=example,dc=com"      
    #
    OpenLDAP 之前設定的管理者
  • passdb backend = ldapsam:ldap://192.0.0.1, guest
    #指定身份驗證交給 ldap server 來處理,其中的 IP 就是你的 OpenLDAP server 的 IP
  • ldap ssl = off
    #指定資料在網路傳送是否經由 ssl 加密,可用選項為 off:不使用 1.on(default):使用 2.ssl 加密  3.start tls:使用 tls(相似於 ssl) 加密
  • ldap suffix = "dc=example,dc=com"
    # samba 會從此資料路徑開始找起
  • security = user            
    # 密碼驗證指定為 user
  • encrypt passwords = yes
    #
    密碼的傳送要先加密

重新啟動 samba server

[root@benjr ~]#service smb restart
Restarting SMB services: Shutting down SMB services :    [  OK  ]
Starting down SMB services:

samba 要與 openldap 溝通前,samba 要先將 openldap 的密碼存在 /etc/samba/secrets.tdb,密碼就是剛剛設定 openldap 時要一樣

[root@benjr ~]# smbpasswd -w secret
setting stored password for "cn=Manager,dc=example,dc=com" in secrets.tdb

最後我們還要修改 openldap 使用者的資料,才能給 samba 使用

step5: LDAP 加入 sambaAccount

使用 smbpasswd 加入 sambaAccount 至 openldap 使用者

[root@benjr ~]# smbpasswd -a user1
New SMB password:
Retype new SMB password:
Added user user1

來搜尋一下結果吧!!

[root@benjr ~]# ldapsearch -x -b "uid=user1,dc=example,dc=com"
dn: uid=user1,dc=example,dc=com
………………略……………………
sambaSID: S-1-5-21-710610727-3552547972-1245264387-2000
sambaPrimaryGroupSID: S-1-5-21-710610727-3552547972-1245264387-2001
sambaPwdCanChange: 1069184314
sambaPwdMustChange: 2147483647
sambaLMPassword: FC26CDB2863917C1AAD3B435B51404EE
sambaNTPassword: 00B2C85DDFBD8CC81602D6FC7340EB0B
sambaPwdLastSet: 1069184314
sambaAcctFlags: [U          ]

可以看到很多以 samba 開頭的資料這些都是 openLDAP 要驗證 samba 使用者所需的資料

  • sambaSID:
    The security identifier(SID) of the user.The Windows equivalent of UNIX UIDs.
  • sambaPrimaryGroupSID:
    The security Identifier(SID) of the primary group of the user
  • sambaPwdCanChange:
    Specifies the time (UNIX time format) from which on the user is allowed to chamge his password. If attribute is not set,the user will be free to change his password whenever the wants.
  • sambaPwdMustChange:
    Specifies the time (UNIX time format) since when the user is forced to change his password. If this value is set to “0″, the user will have to change his password at first login. If this attribute is not set , then the password will never expire.
  • sambaLMPassword:
    The LANMAN password 16-byte hash stored as a character represemtation of a hexadecimal
  • sambaNTPassword:
    The LANMAN password 16-byte hash stored as a character represemtation of a hexadecimal
  • sambaPwdLastSet:
    The integer time in seconds since 1970 when the lmPassword and ntPassword attributes were last set
  • sambaAcctFlags:
    string of 11 characters surrounded by square brackets [] representing account flags such as U(user),W(workatation),X(no password expiration),I(Domain trust account),H(Home dir required),S(Server trust account), and D(Disabled)

現在來試一試是否可以使用 LDAP 做為 samba 的驗證

[root@benjr ~]# smbclient -L sun01 -U user1
Password:
Sharename      Type      Comment
———         —-      ——-
IPC$              IPC       IPC Service (Samba Server)
ADMIN$       IPC       IPC Service (Samba Server)
user1              Disk      Home Directories
Server            Comment
———        ——-
Workgroup    Master
———       ——-

成功了

發表迴響