前言:公司新進了一批存儲,於是一臺新的R710服務器被用於這個存儲的載體,而這次因爲這個存儲大家都搶着用,於是,Samba的需求也就應聲而出,實際上按照網上鋪天蓋地的文檔,配置個samba非常簡單,即便是多部門多人使用,也僅僅只是多做一些設置。但是,爲了方便大家,我們遇到了一個新的需求:
讓用戶自己修改自己Samba賬號的密碼
目標:
配置Samba,讓用戶能夠修改自己的密碼
分析:
因爲之前沒有配置過這樣的內容,所以先google一下,於是網上的衆多網友給出了4種解決辦法:
方法一: 給予使用者 telnet/ssh 登入的權限,登陸到服務器運行smbpasswd進行修改密碼。 評論:很多其他部門的同事作爲Windows終端的用戶根本沒聽說過Linux,更別說使用了,即便是簡單的修改密碼,況且linux上給他們設置的賬號都是nologin,所以這種方式十分不科學。 方法二: 把samba建成pdc, windows加入域中, samba用戶通過windows登陸域, samba用戶在windows上按“ctrl+alt+del”修改密碼 評論:我們的網絡受其他分公司共同控制,而且這臺Linux不打算加域。 方法三: 採用LDAP來做。 評論:我們的LDAP離我們還略微遙遠……而這臺機器作爲我們的私有,不打算讓其他更多分公司的人所使用。 方法四: 或者是changepassword來通過web改密碼。 評論:在自己寫hosts的情況下,這種看似是比較簡單且人性化的了。 |
方案:
使用changepassword這個軟件達到“讓用戶自己修改Samba的密碼”的功效。
實際上,在深入的研究了網上所謂的使用changpassword方案讓用戶修改密碼之後,發現實際上原理是這樣的:
1.changepassword這個軟件是能讓用戶從web界面修改系統密碼的一款軟件,它並沒有讓你獲得修改samba密碼的功能!
2.而如何實現修改samba密碼的功能呢,就要用到pam_smbpass.so這個模塊,它纔是真正能讓samba密碼和系統密碼同步的利器!
於是,實際上的原理其實是,用戶通過Web頁面使用changepassword來修改系統的密碼,然後由pam_smbpass.so模塊自動將系統密碼同步給了samba,以達到用戶修改samba密碼的目的。
實現:
1.我的系統環境如下:
操作系統:CentOS 5.8
已裝服務:Samba,且啓動正常
2.安裝changerpassword,實現Web界面修改系統密碼
changerpassword的官網:http://changepassword.sourceforge.net/
wget http://sourceforge.net/projects/changepassword/files/changepassword/0.9/changepassword-0.9.tar.gz |
修改conf.h頭文件,設置軟件修改密碼使用的臨時目錄(本來爲/tmp,但是實際上是不能用的,要新建一個權限爲777的目錄)
vim conf.h |
將前三行的定義修改爲自己創建的目錄(這裏我修改到了/var/smbchangepwd目錄下):
// temporary directory and files to use |
創建需要用到的目錄(第二個爲編譯configure時候用到的cgidir)
mkdir –pv /var/smbchangepwd mkdir –pv /home/webuser/www/samba-change-passwd |
編譯安裝
./configure --enable-cgidir=/home/webuser/www/samba-change-passwd --enable-language=English --enable-smbpasswd=/etc/samba/smbpasswd --disable-squidpasswd --enable-logo=opentech.jpg |
這裏解釋一下:
--enable-cgidir : 這個目錄是Web頁面要讀取的目錄,一般可以設置爲網站的根目錄,或者網站根目錄下的某個目錄,比如/var/www/smb/,程序會將最後的web訪問頁放在這個目錄中。 --enable-language: 設置程序的顯示語言,裏面支持Chinese --enable-smbpasswd: smb的密碼文件存放位置 --disable-squidpasswd: 禁用squid同步密碼 --enable-logo:這是裝飾Web頁面中的標題的圖片,可以隨便指定,只要是http支持的圖片格式都可以,需要我們手動放一個圖片在cgidir中。 |
按照官方的來的話這裏只要直接make,完後make install 即可,但是,從我自己安裝的經驗來看,這裏一定會報錯的,報錯如下:
DSMBPASSWD=\"/etc/samba/smbpasswd\" -DSQUIDPASSWD=\"no\" -DLOGO=\"none\" -L./smbencrypt –ldes |
從報錯可以看到/usr/bin/ld: cannot find –ldes ,網上有不少解決辦法,實際上那都無法解決根本問題,而官方實際上也知道會遇到這個問題,於是我們只需重新編譯加載libdes即可:
cd smbencrypt/ |
這時從新make,make install即可完成安裝:
make make install |
安裝程序會拷貝一個叫changepassword.cgi的文件到我們指定的--cgidir目錄,這時,只要我們配置好http,確保能從web直接訪問到這個文件即可。當然,別忘了拷貝一個你喜歡的圖片到--cgidir所指定的那個目錄,名字當然就用那個--logo的名字~
這裏我的環境由於用的是lighttpd做的web,所以我在lighttpd上加入這樣的支持(這個根據自己Web配置不同自己添加Apache默認實際上不用配置的):
vim /etc/lighttpd/applications.conf |
OK,一切就緒後,我們打開Web,在瀏覽器中輸入:
http://你的ip/如果你還有目錄/changepassword.cgi
我這裏是:
3.實現samba與系統密碼同步
實際上配置samba與系統密碼同步的原理十分簡單,我們都知道密碼都是由Pam進行管理的,理論上,當我們使用命令來修改系統密碼的時候是調用了pam的密碼管理機制,才修改成功的,那麼我們其實只要在Pam里加上當修改系統密碼的時候也一起讓pam把samba的密碼給修改掉,我們就贏了~~
於是帶着這樣的想法,我們找到了一個模塊,samba官方提供的專門用於使用pam來管理密碼的模塊:pam_smbpass.so
它的位置位於:
x86 : /lib/security/pam_smbpass.so
x64 : /lib64/security/pam_smbpass.so
然後我們只需要將這個模塊加入到密碼驗證的機制裏即可:
vim /etc/pam.d/system-auth |
編輯system-auth這個pam文件
修改裏面的password段插入一行新的password行(這裏我的system-auth的配置,注意我加了一行關於pam_smbpass.so的內容):
auth required pam_env.so account required pam_unix.so password requisite pam_cracklib.so try_first_pass retry=3 session optional pam_keyinit.so revoke |
然後保存,這時理論上,當你修改系統密碼的時候,關聯的這個模塊也會修改samba的密碼。
但是這還不夠,我們還要對samba進行一些設置:
vim /etc/samba/smb.conf |
在[global]段設置samba的加密方式爲:
security = user |
注意,請務必註釋掉默認的passdb backend = tdbsam項
然後重啓samba:
/etc/init.d/smb restart |
如果一切正確的話,在/etc/samba下應該已經有一個 smbpasswd這個文件了。這個文件裏記錄的就是所有可以登陸samba的用戶以及密碼,初始情況下應該是空纔對。
接下來就需要我們手動使用smbpasswd –a 往裏添加用戶了。
注意:只有在smbpasswd中已經存在的系統用戶,當你修改該系統用戶的密碼的時候,纔會一同修改smbpasswd中的用戶。
這樣,我們就達成了讓用戶從Web修改自己用戶系統密碼,然後同步到smb的任務。
後記:
在剛開始打算查找如何完成這個samba配置的時候,從網上獲取了無數的內容,但是,發現網友全都是摘抄,根本沒有自己去驗證過配置的正確性,也根本沒有人能解釋爲什麼這樣配置。包括使用什麼:
# passwd chat = **NEW*NUIX*password* %n\n *Retype*new*UNIX*password* %n\n *successfully* |
這樣的配置我也試了,的確smb的密碼文件能刷新,但是實際上卻無法進行同步。
而smb官方給的文檔排版和分類也非常差,實在是不能忍。
關於更多的系統文章,歡迎光臨我的小站:魏延是反賊(www.weiyan.me)