Step 0 : 前言
Linux 下的 samba(File server) 身份驗證可以轉給 Windows NT/AD 網域來幫我們驗證,那 Linux 其他的服務(如:telnet , ssh , X Window , FTP , SMPT , POP3 , IMAP , Apache , Proxy)也可以將他轉給 Windows NT/AD 網域來幫我們做驗證身份嗎??有的 "winbind",什麼是 winbind,它是由 samba 套件所提供的. winbind 是一個獨立 daman ,它主要是能讓系統能取得 NT/AD 網域內使用者帳號來當做 Linux 的身份驗證.
winbind 是依據 Microsoft RPC calls 應用在 Linux 系統上.再配合 PAM(Pluggable Authentication Modules) 以及 NSS(Name Service Switch),所實做出來的.所以他的架構如下:
Step 1: 安裝
[root@benjr ~]#rpm -ivh samba-common-3....i386.rpm [root@benjr ~]#rpm -ivh samba-client-3....i386.rpm [root@benjr ~]#rpm -ivh samba-3.....i386.rpm [root@benjr ~]#rpm -ivh redhat-config-samba-...i386.rpm
這邊主要是用 samba 3.X 版,而 winbind 主要是由 samba-common-3….i386.rpm 所提供,但是使用 winbind 時還需要 samba 的功能,所以 samba 相關套件也要安裝.
Step 2: samba 加入 Windows 網域的設定
我們假設已經有一個 Windows AD 網域 SUN.COM 的存在了
由於 winbind 要取得 Windows NT / AD 網域的資料,所以要得到 windows 的信賴,方法就是將 Linux 主機加入 Windows 的網域內.方法可以參考下面連結:
samba Join Domain – https://benjr.tw/704 這邊談到 samba 2.x 與 samba 3.x 加入 Domain 的方法
Step 3 :NSS 的設定檔
Linux 系統採用 NSS(Name Service Switch)的設定來決定帳號取得的來源.因為我們會用到 winbind 所以必須在/etc/nsswitch 中加入 winbind 的帳號取得模式.
[root@benjr ~]#vi /etc/nsswitch ...............略................................. passwd: files winbind shadow: files group: files winbind
這邊主要是加入 winbind 的支援.
系統會依據這個設定檔來決定載入哪些模組 files 會載入 /lib/libnss_files.so ,此時系統就會依據 /etc/passwd , /etc/shadow , /etc/group 這些檔案來做查詢,如果找不到適當的使用者資料時,系統會再依據 /etc/nsswitch 的設定檔來決定載入下一個模組,也就是 /lib/libnss_winbind.so,此時 winbind 會去和 windows NT/AD 網域做身份確認.來決定使用者能否登入系統.
此時本機端就可以使用 NT/AD 網域的使用者登入
但是用這些 NT/AD 網域的使用者登入時後你會發現家目錄都沒有自動建立,所以可以用下面的方式來建立.
[root@benjr ~]#vi /etc/pam.d/system-auth ---------------------------------------------------------------------------------------- session required /lib/security/$ISA/pam_mkhomedir.so skel=/etc/skel umask=0022
還要新增 /home/SUN 的目錄,因為有關 Domain user 皆是存放在 /home/SUN 目錄下
[root@benjr ~]# mkdir /home/SUN
Step 4: Winbind 設定檔
winbind 與 samba 使用同一個設定檔,也就是 /etc/samba/smb.conf
[root@benjr ~]#vi /etc/samba/smb.conf ------------------------------------------------------------------------ #use uids from 10000 to 20000 for domain users idmap uid = 10000-20000 #use gids from 10000 to 20000 for domain groups idmap gid = 10000-20000 #separate domain and username with '+' ,like DOMAIN+username winbind separator = + #Users without a domain component winbind use default domain = yes #allow enumeration of winbind users and groups winbind enum users = no winbind enum groups = no #give winbind users a real shell and home directory (only needed if they have telnet access) template homedir = /home/%D%U template shell =/bin/bash #cache user and group information before querying Windows NT server again winbind cache time = 300
重新啟動服務
[root@benjr ~]#service winbind restart
檢查一下 Winbind 是否順利取得 NT/AD 網域內的帳號
[root@benjr ~]#wbinfo -u Administrator Guest TsInternetUser Krbtgt user1 user2 HOST/unsvr01 NTSVR$
可以看到 Windows 網域中的使用者了,其中的 user1,user2 是我自己在 NT/AD 網域中加入的,等一下就可以用這些使用者帳號來登入 Linux server.而 HOST/unsvr01 與 NTSVR$ 都是電腦名稱.
說明:
idmap uid = 10000-20000
idmap gid = 10000-20000
由 NT/AD 網域得到的使用者 uid/gid 範圍為 10000-20000
[root@benjr ~]#getent passwd ................略................. user1:x:500:500::/home/user1:/bin/bash user2:x:501:501::/home/user2:/bin/bash SUN\Administrator:x:10000:10000:Administrator:/home/SUN/administrator:/bin/false SUN\Guest:x:10001:10000:Guest:/home/SUN/guest:/bin/false SUN\krbtgt:x:10002:10000:krbtgt:/home/SUN/krbtgt:/bin/false SUN\user1:x:10003:10000:user1:/home/SUN/user1:/bin/false SUN\user2:x:10005:10000:user2:/home/SUN/user2:/bin/false
可以看到使用者的 uid 由 10000 開始起跳,而 gid 也是由 10000 開始起跳(相同網域的使用者會相同的 gid)
winbind separator = +
剛才可以看到使用者為 SUN\winuser1 ,預設使用 "\ "來連結網域與使用者成為使用者名稱,你也可以使用其他符號來連結.
[root@benjr ~]#getent passwd ................略................. SUN+user2:x:10005:10000:user2:/home/SUN/user2:/bin/false
符號由 "\" 變成 "+"
winbind use default domain = yes
使用者名稱預設使用 "\ "來連結網域與使用者,但是如果你不需使用網域名稱來辨識時,就直接把使用者當成使用者名稱.
[root@benjr ~]#getent passwd ................略................. user2:x:10005:10000:user2:/home/SUN/winuser2:/bin/false
可以看到使用者名稱不再包括網域名稱了
template homedir = /home/%D/%U
使用者登入時使用的家目錄,%D表示為網域 %U表示為使用者.
template shell =/bin/bash
使用者登入的時要使用的 shell
[root@benjr ~]#getent passwd ................略................. SUN\user2:x:10005:10000:winuser2:/home/SUN/winuser2:/bin/bash
可以看到 user2 的家目錄為 /home/SUN/user2,但這目錄不一定存在,你必須自己建立,而 user2 的 shell 使用 /bin/bash.
winbind cache time = 300
預設 winbind 每 300 秒,去快取 NT/AD 網域的使用者資料
winbind enum users = no
在使用指令 #getent passwd 是否要將 NT/AD 網域的使用者也列出.預設是 yes
winbind enum groups = no
在使用指令 #getent group 是否要將 NT/AD 網域的群組也列出.預設是 yes
5 thoughts on “Linux – samba winbind”