前言:公司新进了一批存储,于是一台新的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)