SAMBA smbpasswd 與 passwd 的同步設定

Samba 本身有很多種密碼認證方式 , 如 ldap 也支援
但通常大家用的還是 /etc/samba/smbpasswd 來當作密碼儲存

如果 smb.conf 沒有特別寫 unix password sync = yes
那麼系統密碼( shadow ) 就會和 smbpasswd 不同步

要讓 shadow 的密碼和 smbpasswd 的密碼同步 , 需要考量到 user 如何改密碼

1. User 可以使用 smbpasswd 的指令改 SAMBA 的密碼 , 此時 /etc/shadow 也必須自動改
2. User 可以使用 passwd 來改 /etc/shadow 的密碼 , 改完後 /etc/samba/smbpasswd 也必須自動改

先考慮第一種吧 , 我個人試過如果在 smb.conf 使用 pam password change = yes 的選項 .. 實在是問題很多
所以原本的 unix password sync = yes 是比較容易設定的
但是看過很多文章 , 很多人使用了這個選項 , 其實也發生過失敗的情形
我自己一開始在設定也失敗了 , 我曾經想過 , 是不是 passwd chat 與 passwd program 的選項沒設定好
後來我試過很多次 , 終於找到原因了 , 也因此知道了 unix password sync 的做法

unix password sync 是可以讓 user 執行 smbpasswd 來改密碼時來讓 smbpasswd 和 passwd 這支程式做資料的對話
我們知道 , User 要改系統密碼是執行 passwd 的 , 執行完之後不是會問你舊密碼與要換成甚麼新密碼嗎 ?
smbpasswd 在更改 /etc/samba/smbpasswd 的同時  , 也要同時去執行 passwd 來與其對話
所以有些文章會加上
passwd program = /usr/bin/passwd %u
passwd chat = **NEW*password* %n\n *Retype*new*UNIX*password* %n\n *changed*

這段設定 , 看起來似乎是 ok 的 , 但是我們在裝 Linux 的時候 , 通常會把預設語系設定成中文
所以有些人莫名其妙會失敗 ... 若預設語系是中文的時候 , 則 smbpasswd 去執行 passwd 的時候 , 判斷字串就會有問題了
所以比較好的做法是要強迫語系是英文來執行 , 我自己在自己的機器上 smb.conf 設定如下( Fedora core  7 , CentOS 5 適用 )

        pam password change = No
        passwd chat = **NEW*UNIX*password* %n\n *Retype*new*UNIX*password* %n\n *successfully*
        passwd program = LANG=en_US /usr/bin/passwd %u
        unix password sync = Yes

注意到了沒 , passwd program = LANG=en_US /usr/bin/passwd %u 是不是有把環境變數 LANG 改了
這樣的寫法就比較沒有語系的問題了
寫完之後 , 也不用重新啟動 SAMBA , 直接用 smbpasswd 來改 SAMBA 密碼後 , 就會發現 /etc/shadow 內的密碼也跟著改了
好高興 , 因為這樣就可以把 SWAT 開放給 User , 也可以正常改密碼後就用新密碼登入了

寫到這兒 , 就是還要考量到第二種情況 , 如果直接執行 passwd 來改密碼, 那麼要如何讓 /etc/samba/smbpasswd 的內容也自動改
其實這個部分 , samba 是有提供 PAM 的做法 , 如果沒有 PAM 可能就難做了
我自己的做法是 , 到 /etc/pam.d/ 下找到 system-auth  , 用vi 打開

然後我把裡面 password 的部分都註解掉 , 改成下面三行
    password   requisite    pam_cracklib.so retry=3
    password   requisite    pam_unix.so shadow md5 use_authtok try_first_pass
    password   required     pam_smbpass.so use_authtok use_first_pass

這樣存檔後也不用重開機 , 就可以讓執行 passwd 的時候也同步修改 /etc/samba/smbpasswd 

所以總結來說 , 要完全同步
1. 修改 smb.conf 設定
2. 修改 PAM 設定

而 PAM 的設定可能不同 OS 有不同做法 , 但了解這些原理後應該都不難了

發佈留言