配置Samba支持用戶Web直接修改自己的登錄密碼

前言:公司新進了一批存儲,於是一臺新的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
tar zxvf changepassword-0.9.tar.gz
cd changepassword-0.9

修改conf.h頭文件,設置軟件修改密碼使用的臨時目錄(本來爲/tmp,但是實際上是不能用的,要新建一個權限爲777的目錄)

vim conf.h

將前三行的定義修改爲自己創建的目錄(這裏我修改到了/var/smbchangepwd目錄下):

// temporary directory and files to use
char TMPFILE[]="/var/smbchangepwd/changepassword-shadow-XXXXXX";
char TMPSMBFILE[]="/var/smbchangepwd/changepassword-smb-XXXXXX";
char TMPSQUIDFILE[]="/var/smbchangepwd/changepassword-squid-XXXXXX";

創建需要用到的目錄(第二個爲編譯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: skipping incompatible ./smbencrypt/libdes.a when searching for –ldes
/usr/bin/ld: cannot find –ldes
collect2: ld returned 1 exit status
make: *** [changepassword.cgi] Error 1

從報錯可以看到/usr/bin/ld: cannot find –ldes ,網上有不少解決辦法,實際上那都無法解決根本問題,而官方實際上也知道會遇到這個問題,於是我們只需重新編譯加載libdes即可:

cd  smbencrypt/
tar -xzvf libdes-4.04b.tar.gz
cd des/
make
cp libdes.a ../
cd ../..

這時從新make,make install即可完成安裝:

make
make install

安裝程序會拷貝一個叫changepassword.cgi的文件到我們指定的--cgidir目錄,這時,只要我們配置好http,確保能從web直接訪問到這個文件即可。當然,別忘了拷貝一個你喜歡的圖片到--cgidir所指定的那個目錄,名字當然就用那個--logo的名字~

這裏我的環境由於用的是lighttpd做的web,所以我在lighttpd上加入這樣的支持(這個根據自己Web配置不同自己添加Apache默認實際上不用配置的):

vim /etc/lighttpd/applications.conf
else $HTTP["host"] =~ "^samba" {
    server.document-root = "/home/webuser/www/samba-change-passwd"
    cgi.assign = ( ".cgi" => "" )
}

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
auth        sufficient    pam_unix.so nullok try_first_pass
auth        requisite     pam_succeed_if.so uid >= 500 quiet
auth        required      pam_deny.so

account     required      pam_unix.so
account     sufficient    pam_succeed_if.so uid < 500 quiet
account     required      pam_permit.so

password    requisite     pam_cracklib.so try_first_pass retry=3
password    required      /lib64/security/pam_smbpass.so nullok use_authtok try_first_pass
password    sufficient    pam_unix.so md5 shadow nullok try_first_pass use_authtok
password    required      pam_deny.so

session     optional      pam_keyinit.so revoke
session     required      pam_limits.so
session     [success=1 default=ignore] pam_succeed_if.so service in crond quiet use_uid
session     required      pam_unix.so

然後保存,這時理論上,當你修改系統密碼的時候,關聯的這個模塊也會修改samba的密碼。

但是這還不夠,我們還要對samba進行一些設置:

vim /etc/samba/smb.conf

在[global]段設置samba的加密方式爲:

        security = user
#      passdb backend = tdbsam
        encrypt passwords = yes
        smb passwd file = /etc/samba/smbpasswd
        pam password change = yes

注意,請務必註釋掉默認的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*
#       passwd program = /usr/bin/passwd %u
#       unix password sync = yes

這樣的配置我也試了,的確smb的密碼文件能刷新,但是實際上卻無法進行同步。

而smb官方給的文檔排版和分類也非常差,實在是不能忍。

 


關於更多的系統文章,歡迎光臨我的小站:魏延是反賊(www.weiyan.me)

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章