时间:2013年8月23日    
系统:CentOS release 6.3 (Final)x86_64    
硬件:DELL R420、DELL 1950    
说明:域环境下的Samba    
    工作组环境下的Samba    
要求:各个部门只对自己部门的share有读写权限,所有人对共有share都有读权限,特定的人对共有share有读写权限    
说明:这其实是两台服务器,一台是工作组环境下的,一台是域环境下的,工作组是客户公司的项目组用的,域环境下的是客户公司用的  
以下的全部过程均在虚拟机以及实际项目中实施,确定可以正确运行

第一步:安装相关组件
yum install samba4* krb5* -y  
samba4是什么就不用说了,krb5是为了以后将samba加入AD域而需要用到    
KRB(Kerberos协议)主要用于计算机网络的身份鉴别(Authentication), 其特点是用户只需输入一次身份验证信息就可以凭借此验证获得的票据(ticket-granting ticket)访问多个服务,即SSO(Single Sign On)。由于在每个Client和Service之间建立了共享密钥,使得该协议具有相当的安全性。


第二步:创建共享目录
mkdir /home/share -m 1777    
mkdir /home/project -m 1777    
mkdir /home/projectmgr -m 1777    
mkdir /home/filemgr -m 1777    
目录的权限根据自己的需求进行设定,因为这个是根据用户要求也就直接设置为1777


-从这开始是为工作组环境建立的Samba-

第三步:建立组及用户
1、创建组    
groupadd mgr    //建立mgr组    
groupadd periphery  //建立Periphery组    
groupadd filemgr    //建立filemgr组


2、建立用户并加入组    
useradd itadmin -s /sbin/nologin -M  //创建一个IT管理员,这个不加入组,这只是samba访问用户,所以不用登录系统,也没创建用户的家目录    
useradd jason -g project -s /sbin/nologin -M  //创建用户jason并将他加入project组    
useradd alix -g projectmgr -s /sbin/nologin -M //创建用户alix并将他加入projectmgr组    
useradd lili -g filemgr -s /sbin/nologin -M  //创建用户lili并将她加入filemgr组    

注:如果是之前己创建过的用户可以用    
usermod -g mgr lou    //将己存在的用户lou加入mgr组    

第四步:配置smb.conf
cp /etc/samba/smb.conf /etc/samba/smb.conf.bak  //备份一下samba的配置文件,    
vim /etc/samba/smb.conf    
下面绿色字体为原有的,粟色字体的为增加的,蓝色字体为修改的    
#================== Global Settings =====================    
[global]
dos charset = GB2312      
unix charset = GB2312      
display charset = GB2312

# ----------------------- Network Related Options -------------------------    
workgroup = MYGROUP --改为--> WORKGROUP     //指定机器在网络上所属的NT域名或组名(可改可不改)    
server string = Samba Server Version %v        //此选项是可选的,主要作用是Samba服务Windows系统注释    
netbios name = MYSAMBA    //这个改不改随意,它就象windows里的机器名    
interfaces = lo eth0192.168.88.35/24    //这里写本机IP地址,如果有多个网络也可以写多个IP    
hosts allow = 127.192.168.88.      //设定允许访问samba的IP地址或IP地址范围    
wins support = yes  //设定samba提供WINS服务,通常无特殊原因设为no,除非所处网络上没有主机提供WINS服务且需要samba提供WINS服务是才设yes    
dns proxy = yes --改为-->
no    
name resolve order = wins host lmhosts bcas      
bind interfaces only = yes

# --------------------------- Logging Options -----------------------------    
log file = /var/log/samba/log.%m    // log会在此目录中为每个登陆用户(Samba用户)建立不同的日志文件    
log level = 2    
max log size = 500

# ----------------------- Standalone Server Options ------------------------    
security = user    //设定安全级别为user    
passdb backend = tdbsam --改为-->  smbpasswd:/etc/samba/smbpasswd
# --------------------------- Printing Options -----------------------------    
load printers = yes    
cups options = raw

#============================ Share Definitions ==============================    
#如果注释掉了[homes]则用户就看不到自己的家目录    
#[homes]    
#    comment = Home Directories      
#    browseable = no      
#    writable = no      
#;    valid users = %S      
#;    valid users = MYDOMAIN\%S      
[printers]      
   comment = All Printers      
   path = /var/spool/samba      
   browseable = no      
   guest ok = no      
   writable = no      
   printable = yes

[share]      
comment = Share
   //定义共享目录名称,可用任意字符串    
path = /home/share    //设定共享目录路径    
public = no            //指定该共享是否允许guest账户访问    
available = yes    //用来指定该共享资源是否可用    
admin users = itadmin  //指定该共享的管理员,对该共享具有完全控制权限,如果用户验证方式设置成“security=share”时,此项无效。    
valid users = +mgr,+periphery,+filemgr  //用来指定允许访问该共享资源的用户,单个用户就直接写用户名,组就是“+组名”    
writable = yes        //是否允许写入,这项对下面的几项来说是首选,这项设置为NO,下面的create mask directory mask 等一系列预设值无效    
write list = +mgr,+periphery,+filemgr   //指定在该共享下有写入权限的用户    
create mask= 0755      //表示新建文件的预设值,文件所有者全部权限,组内用户及其他用户可读可执行    
directory mask= 0755    //表示新建目录的预设值,目录所有者全部权限,组内用户及其他用户可读可执行    
browseable = no  //指定该共享是否可以浏览    
[project]      
    comment = project      
    path = /home/project      
    public = no      
    available = yes      
    admin users = itadmin      
    writable = yes      
    write list = +periphery      
    valid users = +periphery      
    create mask= 0755      
    directory mask= 0755      
    browseable = no      
[projectmgr]      
    comment = projectmgr      
    path = /home/projectmgr      
    public = no      
    available = yes      
    admin users = itadmin      
    writable = yes      
    write list = +mgr      
    valid users = +mgr      
    create mask= 0755      
    directory mask= 0755      
    browseable = no      
[filemgr]      
    comment = filemgr      
    path = /home/filemgr      
    public = no      
    available = yes      
    admin users = itadmin      
    writable = yes      
    write list = +filemgr      
    valid users = +filemgr      
    create mask= 0755      
    directory mask= 0755      
    browseable = no

配置完后通过testparm来检查    
说明一点:
samba3.x的早期版本默认使用tdb库也就是smb.conf默认设定为passdb backend = tdbsam,只需要注释掉该行添加smb passwd file = /etec/samba/smbpasswd即可使用smbpasswd存储加密密钥。从samba3.5.6开始samba规范了passdb backend参数的使用,取消了smb passwd file设定,如果简单注释掉passdb backend参数,密钥文件也不会被存储到smbpasswd。所以很多人说怎么修改smb.conf的配置,smbpasswd文件都无法生成,就算手工创建,内容也是0字节。要用传统的文本方式存储只需这样设定passdb backend = smbpasswd:/etc/samba/smbpasswd(后面跟的是绝对路径)>,不要再写smb passwd file = /etc/samba/smbpasswd,该参数已经不适用于新版本的samba了。

启动smb及nmb服务    
service smb start    
service nmb start    
nmb 是Samba 的主要启动服务器,让其它机器能知道此机器共享了什么;如果不打开nmb服务器的话,只能通过IP来访问      
注意:在Samba服务器运行其间,更改了配置最好用service smb reload命令,不要用restart,这样可以防止用户在连接的过程中被中断      
将smb与nmb加入启动服务

chkconfig --level 35 smb on    
chkconfig --level 35 nmb on


查看端口    
netstat -antup |grep smb    
netstat -antup |grep nmb      

第五步:设置用户
smbpasswd -a itadmin
New SMB password:    
Retype new SMB password:      
Added user itadmin.      
注:如果想要让/etc/samba/sabpasswd生效,要先启动samba,不然还是以默认的tdbsam方式来记录密码
删除用户:smbpasswd -x username
更改用户密码:smbpasswd username


第六步:测试用户
linux用户端测试    
Smb //192.168.88.35/share -U lili    
Enter lili's password:    
Domain=[WORKGROUP] OS=[Unix] Server=[Samba 4.0.0rc4]    
Smb: \>ls    
.                  D    0 Sat Aug 24 02:21:22 2013    
..                 D    0 Sat Aug 24 00:18:49 2013    
Windows下测试用户就是在“运行”输入//192.168.88.35/share    
这时会弹出一个用户名和密码验证的窗口,输入自己的用户名及密码

image

第七步:安装changepassword
changepassword是一个可以让客户端通过浏览器来更改samba用户密码的工具,使用组环境来说用这个工具还是方便的    

1、安装changepassword运行的环境

yum install gcc httpd -y
gcc是开发包,httpd不用说了    

tar -zxvf changepassword-0.9.tar.gz
cd changepassword-0.9

./configure --enable-cgidir=/var/www/cgi-bin --enable-language=Chinese --enable-smbpasswd=/etc/samba/smbpasswd --disable-squidpasswd --enable-logo=opentech.jpg    
系统提示:
changepassword 0.9 Configuration      
--------------------------------      

Samba password file: /etc/samba/smbpasswd      
Squid password file: no      
Logo image     : opentech.jpg      
Using Language file: languages/Chinese.h      
Apache cgi-bin dir : /var/www/cgi-bin      

configure: creating ./config.status      
config.status: creating Makefile      


Don't forgot to copy opentech.jpg to your website root htdocs      

Now, type "make" and "make install"      

make && make install     

2、安装changepassword
在安装过程中可能会遇到以下一个报错

collect2:ld returned 1 exit status

make:***[changepassword.cgi] Error 1

这是因为缺少一个依赖包的原因,这个依赖包就在changepassword-0.9.tar.gz的目录包里,解压后在目录里有一个smbencrypt的目录,进入该目录,目录里有一个libdes-4.0.tar.gz文件,这个是changerpassword的一个依赖包,解压缩
tar -zxvf libdes-4.0.tar.gz
解压后有一个des目录,进入后
make
cp libdes.a ../
系统提示:
cp:是否覆盖../libdes.a?
Enter确认覆盖,退回changepassword目录

然后再回到changepassword-0.9的目录下再make && make install一次,这时系统会提示:

cp changepassowrd.cgi /var/www/cgi-bin/changepasword.cgi

chmod 4755 /var/www/cgi-bin/changepassword.cgi

changepassword就安装成功了

注:
--enable-cgidir=/var/www/cig-bin:指定http下的cig-bin路径      
--enable-language=Chinese:设定语言为中文      
--enable-smbpasswd=/etc/samba/smbpasswd:指定smbpasswd路径      
--disable-squidpasswd:关闭squid密码(changepassword是支持squid认证用户密码更改的)


swat是对Samba图形化管理的工具,也很方便简单
vim /etc/xinetd.d/swat    

only_from = 127.0.0.1 改为 only_form = 192.168.88.0/24(这是允话管理的ip地址范围,也可以是单个IP地址)    
disable = yes 改为 disable = no
image

保存并重启xinetd.d

service xinetd restart

第九步:修改samba配置
在smb.conf里增加    
pam password change = no      
passwd chat = **NEW*UNIX*password* %n\n *Retype*new*UNIX*password* %n\n *successfully*      
passwd program = LANG=en_US /usr/bin/passwd %u      
unix password sync = yes

增加的上面这些是为Changepassword增加的    
保存后重启smb

service smb restart

第十步:更改IPTABLES
iptables -A INPUT -p tcp -s 192.168.88.0/24 --dport 22 -j ACCEPT      
iptables -A INPUT -p udp -s 192.168.88.0/24 --dport 137 -j ACCEPT      
iptables -A INPUT -p udp -s 192.168.88.0/24 --dport 138 -j ACCEPT      
iptables -A INPUT -p tcp -m state --state NEW -s 192.168.88.0/24 --dport 139 -j ACCEPT      
iptables -A INPUT -p tcp -m state --state NEW -s 192.168.88.0/24 --dport 445 -j ACCEPT      
iptables -A INPUT -p tcp -m state --state NEW -s 192.168.88.0/24 --dport 80 -j ACCEPT      
iptables -A INPUT -p tcp -m state --state NEW -s 192.168.88.0/24 --dport 901 -j ACCEPT

重启IPTABLES,启动http
service iptables restart    
service httpd start      
将httpd加入启动服务
chkconfig --level 35 httpd on

第十一步:测试changepassword及swat
Changepassword

打开浏览器输入:192.168.88.35(youipaddress)/cgi-bin/changepassword.cgi,正确的情况下就可以看到下更改密码的窗口如下      

image

输入旧密码、新密码    

image

SWAT      
打开浏览器输入http://ip address:901(图形管理页面的端口是901)

image

-从这开始是为域环境建立的Samba-

Samba的安装和共享目录的建立过程就不再重复了,看第一步、第二步现在的主要工作是将samba加入己有的AD域中    
AD域:yk_wy.local    
AD域系统:Windows 2003标准版    
下面的配置中
绿色字体为原有的内容,红色字体为要修改的内容,蓝色字体为修改的内容,粟色字体为增加内容    
首先我关闭了SELINUX并清空了IPTABLES    
iptables -F    //清空iptables配置

vim /etc/selinux/config      
SELINUX=enforcing 改为 SELINUX=disable   //关闭SELINUX

第三步:编辑krb5
cp /etc/krb5.conf /etc/krb5.conf.bak    
vim /etc/krb5.conf      
[logging]      
default = FILE:/var/log/krb5libs.log      
kdc = FILE:/var/log/krb5kdc.log      
admin_server = FILE:/var/log/kadmind.log

[libdefaults]    
default_realm =
EXAMPLE.COM --改为-->YK_WY.LOCAL  //将默认区域名改为AD域的域名    
dns_lookup_realm = false    
dns_lookup_kdc = false      
ticket_lifetime = 24h      
renew_lifetime = 7d      
forwardable = true

[realms]
EXAMPLE.COM --改为--> YK_WY.LOCAL = {    //改为AD域名    
kdc =kerberos.example.com --改为-->192.168.88.2    //改为AD的IP地址    
admin_server =kerberos.example.com --改为-->192.168.88.2  //改为AD的IP地址    
}

[domain_realm]      
.example.com = EXAMPLE.COM --改为-->.yk_wy.local = YK_WY.LOCAL
example.com = EXAMPLE.COM --改为-->yk_wy.local = YK_WY.LOCAL

第四步:编辑nsswitch.conf
我们要将Samba加入windows域需要用到winbind,winbind是一款 Samba 组件,在CentOS它包含在了 samba-common 包中。 winbind 在Linux上实现了微软的RPC调用、可插式验证模块和名字服务切换,通过 samba 接口与windows 域控获得联系,可以使NT域用户能在Linux主机上以Linux用户身份进行操作。通过设定 Linux 服务器的 nss 配置,可以让系统通过 Winbind 程序来解析用户信息。      
NSS 是 Sun 公司开发用于定义系统中配置文件查找顺序的工具。他的配置文件在 /etc/nsswitch.conf 。通过他我们可以定义系统在登录时通过 Winbind 来获取用户信息        
cp /etc/nsswitch.conf /etc/nsswitch.conf.bak    
vim /etc/nsswitch.conf

passwd:   fileswinbind    //先读files 然后再通过winbind认证      
shadow:  fileswinbind      
group:   files
winbind

第五步:编辑smb.conf
cp /etc/samba/smb.conf /etc/samba/smb.conf.bak      
vim /etc/samba/smb.conf      
[global]      
   workgroup =
MYGROUP--改为-->YK_WY//AD域的域名      
password server =192.168.88.2  //AD的IP地址      
realm = YK_WY.LOCAL      
server string = Samba Server Version %v      
   netbios name =
MYSERVER--改为—> PMSAMBA
interfaces =lo eth0 192.168.12.2/24 192.168.13.2/24 --改为--> lo eth0 192.168.88.40
hosts allow =127. 192.168.12. 192.168.13. --改为-->
127. 192.168.88. 192.168.87.

 log file = /var/log/samba/log.%m    
   max log size = 50

   security =user --改为--> ADS
passdb backend = tdbsam

   idmap config * : range = 16777216-33554431      
   idmap config * : backend = tdb      
   template shell = /sbin/nologin      
   template homedir = /home/%U      
   winbind use default domain = Yes      
   winbind offline logon = Yes      
   winbind separator = /    
   winbind enum users = Yes      
   winbind enum groups = Yes

[homes]      
   comment = Home Directories      
path =
/home/%U      
valid users =YK_WY.LOCAL/%U
read only = No      
   browseable = No

root preexec = /bin/mkhome.sh %U %G
注:mkhome.sh脚本感谢51cto的ainbird2,正为此头疼看到他的《Samba通过ad域进行认证并限制空间大小》

[printers]      
   comment = All Printers      
   path = /var/spool/samba      
   browseable = no      
   guest ok = no      
   writable = no      
   printable = yes      
配置完后通过testparm来检查      
一般检测会提示:      
WARNING: The setting 'security=ads' should NOT be combined with the 'password server' parameter.      
(by default Samba will discover the correct DC to contact automatically).

系统认为己设置了“security = ADS”就不必设置“password server =”因为samba会自己认到,看到没什么影响,我也就没改

注1:在以前用的 idmap uid = 16777216-33554431 和 idmap gid = 16777216-33554431现在己不在使用      
注2:
mkhome.sh脚本      
vim /bin/mkhome.sh    
#!/bin/bash        
user=$1        
group=$2        
home=/home/$1        

if [ ! -d $home ] ; then        
mkdir -p $home        
chown $user $home        
chgrp $group $home        
chmod 700 $home                
fi

chmod 700 /bin/mkhome.sh //修改文件权限

启动smb、nmb和winbind    
service smb start      
service nmb start      
service winbind start      
将smb和nmb加入启动服务      
chkconfig --level 35 smb on    
chkconfig --level 35 nmb on    
chkconfig --level 35 winbind on

第六步:加入AD域
测试:
kinit administrator@YK_WY.LOCAL
Password for administrator@YK_WY.LOCAL:[输入AD管理员登录密码]    
没问题的话会直接回到bash

加入域
net ads join -U administrator@YK_WY.LOCAL
Enter administrator@YK_WY.LOCAL's password:[输入AD管理员登录密码]      
Using short domain name -- YK_WY        
Joined 'PMSAMBA' to realm 'yk_wy.local'        
No DNS domain configured for pmsamba. Unable to perform DNS Update.        
DNS update failed: NT_STATUS_INVALID_PARAMETER        
现在到域控上看一下,果然能看到SMB服务器了      


image

但是这并不表明己完全正确的加入到了域  
验证:    
wbinfo -t  //查看与AD主机是否己建立信任关系  
checking the trust secret for domain YK_WY via RPC calls succeeded
wbinfo -u  //显示AD的用户信息  
80114663    
dtz0016    
80115157    
80115140    
80114721    
80115447    
08084394    
pmfile-svr-backup    
test    
wbinfo -g  //显示AD的组信息  
财务部    
客房部    
工程部    
保卫部    
dnsadmins    
dnsupdateproxy    
人力资源及总务部

getent passwd  //显示本地和域中可登录用户  
08086126:*:16777220:16777221:Tian, Yu:/home/08086126:/bin/bash    
80111214:*:16777221:16777221:lili:/home/80111214:/bin/bash    
dtz0006:*:16777222:16777221:liuxa:/home/dtz0006:/bin/bash    
80111040:*:16777223:16777221:josno:/home/80111040:/bin/bash    
80112196:*:16777224:16777221:tony:/home/80112196:/bin/bash    
proxyserver:*:16777225:16777221:proxyserver:/home/proxyserver:/bin/bash    
financeserver1:*:16777226:16777221:financeserver1:/home/financeserver1:/bin/bash


getent group  //显示本地和域中的组  
财务部:x:16777233:80115249,80111024,80111065,financeserver2,80111040,80116007,80464399,80114598,financeserver1    
客房部:x:16777234:80111768,80114721,80115538    
物业部:x:16777235:80111545,pcpd0106,pcpd0110,pcpd0105,pcpd0107,pcpd0108,80111479,pcpd0109,80114531,ving card,80114663,80115447,80111347    
工程部:x:16777236:08086092,08086134,08086142,pcpd0112,80113293,80464225    
保卫部:x:16777237:80112246,pcpd0111,80112238,08086043,80112220,80114572,80115157,80112196    
dnsadmins:x:16777238:    
dnsupdateproxy:x:16777239:    
人力资源及总务部:x:16777240:80111156,80111149,80115140,80115926,kaoqin

其它的测试命令如  
net ads info  //查询AD域基本资料  
net getdomainsid  //查询AD域ID号码  
就不做了

注:退出域的命令是:net ads leave -U administrator
运行退出命令系统会提示:  
Delted account for 'PMSAMBA' in realm 'YK_WY.LOCAL'


第七步:IPTABLES设置
iptables -A INPUT -m state --state NEW -m tcp -p tcp --dport 22 -j ACCEPT
iptables -A INPUT -p udp -s 192.168.88.0/24 --dport 137:139 -j ACCEPT
iptables -A INPUT -A INPUT -p tcp -m state --state NEW -s 192.168.88.0/24 -m multiport --dport 137:139,445,80,901 -j ACCEPT


第八步:客户端测试

windows的用户登录域“运行”-“\\192.168.88.30”这时会看到以自己域帐号为名的目录,进入后新建或删除文件都没问题

image

第九步:windows域用户挂载共享目录
写个BAT文件设置为域用户的登录脚本,当域用户登录时会自行挂载共享目录  
@etho off    
if exist Z: net use Z: /del /y    
net use Z:
\\192.168.88.30\%USERNAME%


域环境下的另一种情况
之前的设置是设置了域用户在登录SAMBA之后都会有一个自己的目录,这个目录的建立与mkhome.sh这个脚本相关,如果只是建立了全体共享目录和部门的Share,不想让每个用户都有 自己的目录就不用脚本,或者直接将[homes]全部注释掉,另外在smb.conf的设置里要注意几点:
1、将 winbind separator = / --改为--> winbind separator = +,如果不改为 + 域内部门权限内的用户访问目录时也会要求用户和密码的验证(还没搞明白为什么)
2、在设置部门访问的时候 valid users = YK_WY.LOCAL/%U --改为--> valid users = @YK_WY.LOCAL+[部门]




---配置过程中遇到的问题---
组环境问题一:在编译changepassword时系统提示  
cp changepassword.cgi /var/www/cig-bin/changepassword.cgi    
cp: 无法创建普通文件"/var/www/cig-bin/changepassword.cgi": 没有那个文件或目录    
解决:这个是最不细心的一个表现……,在编译时把/var/www/cgi-bin写成了/var/www/cig-bin  

组环境问题二:在浏览器上通过changepassword修改用户密码时,输入正确也提示旧密码错误  
解决:这个是在创建samba用户时因想是不用登录系统的用户,所以也忘记给用户设置系统密码了,changepassword如果修改密码,必须和/etc/passwd内的密码同步,如果只设置samba密码,不设置系统密码,该程序是无法修改用户密码的。用户必须具有系统密码,并且这个系统密码要与samba密码一致  

组环境问题三:浏览器输入网址看到的是乱码

image

解决:修改 /etc/httpd/conf/httpd.conf文件中将 AddDefaultCharset UTF-8的值改为 GB2312

组环境问题四:从客户端(windowsXP)访问Samba速度十分慢,在运行里输入命令后得等一分钟时间吧,才会弹出登录认证窗口


域环境问题一:通过 kinit administrator@YK_WY.LOCAL 测试,系统提示  
kinit: Clock skew too great while getting initial credentials
解决:查看了一下samba的时钟与AD的钟相差2天时间,对samba进行调整 date 082315142013 再测试就没有提示了

域环境问题二:通过 net ads join -U administrator@YK_WY.LOCAL 命令加入域报错  
realm must be set in in /etc/samba/smb.conf for ADS join to succeed.    
Invalid configuration. Exiting....    
Failed to join domain: Invalid parameter    
解决:在smb.conf里没有配置 password server = [ad ip address]和 realm = [ad name]

域环境问题三:通过windows访问SMB服务器,系统报错:  
无任何网络提供程序接受指定的网络路径    
解决:配置这个域环境的SMB时忘了配置iptables,把SMB相应的端口设置一下就好了

域环境问题四:访问SMB上自己的目录时系统报错:  
\\192.168.88.30\08084394无法访问。您可能没有权限使用网络资源。请与这台服务器的管理员联系以查明你是否有访问权限。无任何网络提供程序接受指定的网络路径    
查看日志:tail /var/log/samba/log.hqb-virtual  
[2013/08/024 15:59:17.784198, 0] ../source3/smbd/service.c:828(make_connection_snum)    
canonicalize_connect_path failed for service 08084394, path /home/08084394    
解决:这又是一个不细心的典型,我把mkhome.sh建在了home目录下,而在smb.conf里却写成了 root preexec = /bin/mkhome.sh %U %G,懒的改了,把mkhome.sh移到bin下好了