前言:公司新进了一批存储,于是一台新的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)
转载于:https://blog.51cto.com/foreveryan/990494