您的位置:首页 > 运维架构 > Linux

配置Samba支持用户Web直接修改自己的登录密码

2012-09-14 10:48 656 查看
前言:公司新进了一批存储,于是一台新的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)
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  linux samba pam