samba配置文件smb.conf详解

前言

Samba的主配置文件叫smb.conf,默认在/etc/samba/目录下。
smb.conf含有多个段,每个段由段名开始,直到下个段名。每个段名放在方括号中间。每段的参数的格式是:名称=指。配置文件中一行一个段名和参数,段名和参数名不分大小写。
除了[global]段外,所有的段都可以看作是一个共享资源。段名是该共享资源的名字,段里的参数是该共享资源的属性。
Samba安装好后,使用testparm命令可以测试smb.conf配置是否正确。使用testparm –v命令可以详细的列出smb.conf支持的配置参数。

全局参数

==================Global Settings ===================
[global]

config file = /usr/local/samba/lib/smb.conf.%m
说明:config file可以让你使用另一个配置文件来覆盖缺省的配置文件。如果文件 不存在,则该项无效。这个参数很有用,可以使得samba配置更灵活,可以让一台samba服务器模拟多台不同配置的服务器。比如,你想让PC1(主机名)这台电脑在访问Samba Server时使用它自己的配置文件,那么先在/etc/samba/host/下为PC1配置一个名为smb.conf.pc1的文件,然后在smb.conf中加入:config file = /etc/samba/host/smb.conf.%m。这样当PC1请求连接Samba Server时,smb.conf.%m就被替换成smb.conf.pc1。这样,对于PC1来说,它所使用的Samba服务就是由smb.conf.pc1定义的,而其他机器访问Samba Server则还是应用smb.conf。

workgroup = WORKGROUP
说明:设定 Samba Server 所要加入的工作组或者域。

server string = Samba Server Version %v
说明:设定 Samba Server 的注释,可以是任何字符串,也可以不填。宏%v表示显示Samba的版本号。

netbios name = smbserver
说明:设置Samba Server的NetBIOS名称。如果不填,则默认会使用该服务器的DNS名称的第一部分。netbios name和workgroup名字不要设置成一样了。

interfaces = lo eth0 192.168.12.2/24 192.168.13.2/24
说明:设置Samba Server监听哪些网卡,可以写网卡名,也可以写该网卡的IP地址。

hosts allow = 127. 192.168.1. 192.168.10.1
说明:表示允许连接到Samba Server的客户端,多个参数以空格隔开。可以用一个IP表示,也可以用一个网段表示。hosts deny 与hosts allow 刚好相反。
例如:hosts allow=172.17.2.EXCEPT172.17.2.50
表示容许来自172.17.2..的主机连接,但排除172.17.2.50
hosts allow=172.17.2.0/255.255.0.0
表示容许来自172.17.2.0/255.255.0.0子网中的所有主机连接
hosts allow=M1,M2
表示容许来自M1和M2两台计算机连接
hosts allow=@xq
表示容许来自XQ网域的所有计算机连接

max connections = 0
说明:max connections用来指定连接Samba Server的最大连接数目。如果超出连接数目,则新的连接请求将被拒绝。0表示不限制。

deadtime = 0
说明:deadtime用来设置断掉一个没有打开任何文件的连接的时间。单位是分钟,0代表Samba Server不自动切断任何连接。

time server = yes/no
说明:time server用来设置让nmdb成为windows客户端的时间服务器。

log file = /var/log/samba/log.%m
说明:设置Samba Server日志文件的存储位置以及日志文件名称。在文件名后加个宏%m(主机名),表示对每台访问Samba Server的机器都单独记录一个日志文件。如果pc1、pc2访问过Samba Server,就会在/var/log/samba目录下留下log.pc1和log.pc2两个日志文件。

max log size = 50
说明:设置Samba Server日志文件的最大容量,单位为kB,0代表不限制。

security = user
说明:设置用户访问Samba Server的验证方式,一共有四种验证方式。

  1. share:用户访问Samba Server不需要提供用户名和口令, 安全性能较低。
  2. user:Samba Server共享目录只能被授权的用户访问,由Samba Server负责检查账号和密码的正确性。账号和密码要在本Samba Server中建立。
  3. server:依靠其他Windows NT/2000或Samba Server来验证用户的账号和密码,是一种代理验证。此种安全模式下,系统管理员可以把所有的Windows用户和口令集中到一个NT系统上,使用Windows NT进行Samba认证, 远程服务器可以自动认证全部用户和口令,如果认证失败,Samba将使用用户级安全模式作为替代的方式。
  4. domain:域安全级别,使用主域控制器(PDC)来完成认证。

passdb backend = tdbsam
说明:passdb backend就是用户后台的意思。目前有三种后台:smbpasswd、tdbsam和ldapsam。sam应该是security account manager(安全账户管理)的简写。
1.smbpasswd:该方式是使用smb自己的工具smbpasswd来给系统用户(真实
用户或者虚拟用户)设置一个Samba密码,客户端就用这个密码来访问Samba的资源。smbpasswd文件默认在/etc/samba目录下,不过有时候要手工建立该文件。
2.tdbsam:该方式则是使用一个数据库文件来建立用户数据库。数据库文件叫passdb.tdb,默认在/etc/samba目录下。passdb.tdb用户数据库可以使用smbpasswd –a来建立Samba用户,不过要建立的Samba用户必须先是系统用户。我们也可以使用pdbedit命令来建立Samba账户。pdbedit命令的参数很多,我列出几个主要的。

pdbedit –a username:新建Samba账户。
pdbedit –x username:删除Samba账户。
pdbedit –L:列出Samba用户列表,读取passdb.tdb数据库文件。
pdbedit –Lv:列出Samba用户列表的详细信息。
pdbedit –c “[D]” –u username:暂停该Samba用户的账号。
pdbedit –c “[]” –u username:恢复该Samba用户的账号。

3.ldapsam:该方式则是基于LDAP的账户管理方式来验证用户。首先要建立LDAP服务,然后设置“passdb backend = ldapsam:ldap://LDAP Server”

encrypt passwords = yes/no
说明:是否将认证密码加密。因为现在windows操作系统都是使用加密密码,所以一般要开启此项。不过配置文件默认已开启。

smb passwd file = /etc/samba/smbpasswd
说明:用来定义samba用户的密码文件。smbpasswd文件如果没有那就要手工新建。

username map = /etc/samba/smbusers
说明:用来定义用户名映射,比如可以将root换成administrator、admin等。不过要事先在smbusers文件中定义好。比如:root = administrator admin,这样就可以用administrator或admin这两个用户来代替root登陆Samba Server,更贴近windows用户的习惯。

guest account = nobody
说明:用来设置guest用户名。

socket options = TCP_NODELAY SO_RCVBUF=8192 SO_SNDBUF=8192
说明:用来设置服务器和客户端之间会话的Socket选项,可以优化传输速度。

domain master = yes/no
说明:设置Samba服务器是否要成为网域主浏览器,网域主浏览器可以管理跨子网域的浏览服务。

local master = yes/no
说明:local master用来指定Samba Server是否试图成为本地网域主浏览器。如果设为no,则永远不会成为本地网域主浏览器。但是即使设置为yes,也不等于该Samba Server就能成为主浏览器,还需要参加选举。

preferred master = yes/no
说明:设置Samba Server一开机就强迫进行主浏览器选举,可以提高Samba Server成为本地网域主浏览器的机会。如果该参数指定为yes时,最好把domain master也指定为yes。使用该参数时要注意:如果在本Samba Server所在的子网有其他的机器(不论是windows NT还是其他Samba Server)也指定为首要主浏览器时,那么这些机器将会因为争夺主浏览器而在网络上大发广播,影响网络性能。
如果同一个区域内有多台Samba Server,将上面三个参数设定在一台即可。

os level = 200
说明:设置samba服务器的os level。该参数决定Samba Server是否有机会成为本地网域的主浏览器。os level从0到255,winNT的os level是32,win95/98的os level是1。Windows 2000的os level是64。如果设置为0,则意味着Samba Server将失去浏览选择。如果想让Samba Server成为PDC,那么将它的os level值设大些。

domain logons = yes/no
说明:设置Samba Server是否要做为本地域控制器。主域控制器和备份域控制器都需要开启此项。

logon . = %u.bat
说明:当使用者用windows客户端登陆,那么Samba将提供一个登陆档。如果设置成%u.bat,那么就要为每个用户提供一个登陆档。如果人比较多,那就比较麻烦。可以设置成一个具体的文件名,比如start.bat,那么用户登陆后都会去执行start.bat,而不用为每个用户设定一个登陆档了。这个文件要放置在[netlogon]的path设置的目录路径下。

wins support = yes/no
说明:设置samba服务器是否提供wins服务。

wins server = wins服务器IP地址
说明:设置Samba Server是否使用别的wins服务器提供wins服务。

wins proxy = yes/no
说明:设置Samba Server是否开启wins代理服务。

dns proxy = yes/no
说明:设置Samba Server是否开启dns代理服务。

load printers = yes/no
说明:设置是否在启动Samba时就共享打印机。

printcap name = cups
说明:设置共享打印机的配置文件。

printing = cups
说明:设置Samba共享打印机的类型。现在支持的打印系统有:bsd, sysv, plp, lprng, aix, hpux, qnx

共享参数

================== Share Definitions ==================
[共享名]

comment = 任意字符串
说明:comment是对该共享的描述,可以是任意字符串。

path = 共享目录路径
说明:path用来指定共享目录的路径。可以用%u、%m这样的宏来代替路径里的unix用户和客户机的Netbios名,用宏表示主要用于[homes]共享域。例如:如果我们不打算用home段做为客户的共享,而是在/home/share/下为每个Linux用户以他的用户名建个目录,作为他的共享目录,这样path就可以写成:path = /home/share/%u; 。用户在连接到这共享时具体的路径会被他的用户名代替,要注意这个用户名路径一定要存在,否则,客户机在访问时会找不到网络路径。同样,如果我们不是以用户来划分目录,而是以客户机来划分目录,为网络上每台可以访问samba的机器都各自建个以它的netbios名的路径,作为不同机器的共享资源,就可以这样写:path = /home/share/%m 。

browseable = yes/no
说明:browseable用来指定该共享是否可以浏览。

writable = yes/no
说明:writable用来指定该共享路径是否可写。

available = yes/no
说明:available用来指定该共享资源是否可用。

admin users = 该共享的管理者
说明:admin users用来指定该共享的管理员(对该共享具有完全控制权限)。在samba 3.0中,如果用户验证方式设置成“security=share”时,此项无效。
例如:admin users =bobyuan,jane(多个用户中间用逗号隔开)。

valid users = 允许访问该共享的用户
说明:valid users用来指定允许访问该共享资源的用户。
例如:valid users = bobyuan,@bob,@tech(多个用户或者组中间用逗号隔开,如果要加入一个组就用“@+组名”表示。)

invalid users = 禁止访问该共享的用户
说明:invalid users用来指定不允许访问该共享资源的用户。
例如:invalid users = root,@bob(多个用户或者组中间用逗号隔开。)

write list = 允许写入该共享的用户
说明:write list用来指定可以在该共享下写入文件的用户。
例如:write list = bobyuan,@bob

public = yes/no
说明:public用来指定该共享是否允许guest账户访问。

guest ok = yes/no
说明:意义同“public”。

几个特殊共享:
[homes]
comment = Home Directories
browseable = no
writable = yes
valid users = %S
; valid users = MYDOMAIN%S

[printers]
comment = All Printers
path = /var/spool/samba
browseable = no
guest ok = no
writable = no
printable = yes

[netlogon]
comment = Network Logon Service
path = /var/lib/samba/netlogon
guest ok = yes
writable = no
share modes = no

[Profiles]
path = /var/lib/samba/profiles
browseable = no
guest ok = yes

本文转载自:http://yuanbin.blog.51cto.com/363003/115761,在此向原作者致敬。

samba中实现共享中所有创建的文件都属于指定用户的功能

方法很简单,但很实用。
在需要指定的共享中加入。

force user = 要指定的用户

例如,要求老师得能在“孙锡源”这个学生的共享文件夹中创建文件,但老师创建的文件所有者是老师本人,孙锡源没权限修改及删除文件。那么就可以加一行“force user = sxy”,让老师创建的文件的所有者也是孙锡源本人,这样孙锡源就可以操作文件了。

记录一个Linux下使用usermod修改用户家目录后产生的奇怪问题

问题描述:
学校机房的samba服务器中本来所有用户都是存放在/home目录下的,但是我在为用户统一修改权限时发现这样极不方便。因为老师和学生的权限肯定是不同的,但他们又都在同一个目录下,修改起来很麻烦。
我的解决办法是:在/home目录下新建一个teacher目录用来存放教师的用户家目录,再新建一个student用来存放学生的用户家目录,这样下次修改权限时就可以直接用通配符来分别为教师和学生修改了。
既然有了想法,就开始实施吧。
我选择使用usermod命令一个一个的辛苦的为每个用户修改家目录,而不是简单粗暴地修改/etc/passwd文件。
以下以“sxy”这个用户来做演示,注:此时我的工作目录在/home下,且/home/teacher与/home/student目录已创建。

usermod -md student/sxy sxy

修改后,查看/home下已经没有sxy这目录了,此目录已被迁移至/home/student下。
然而, 重点来了!!!!
虽然成功的迁移了目录,但是我用windows登陆samba服务器的时候点sxy这个共享目录竟然提示我“找不到路径”???注:此处的sxy共享是使用[homes]配置的。
排错过程:
我的第一步:怀疑,是不是因为samba的用户数据库中记录的还是旧的文件路径,要将用户重新加入数据库才能解决问题?
结果:用户重新加入samba数据库后问题依旧。
第二步:怀疑,是不是samba的[homes]字段必须使用默认的家目录路径,也是就是存放在/home下,不能自定义家目录?
结果:新建了一个系统用户“test”,创建用户时指定其家目录为/home/student/test并将其加入samba用户数据库中后,发现其家目录的共享可正常访问。
第三步:陷入沉思~~~随后怀疑,是不是因为usermod命令修改用户家目录改的不够彻底(比如说,某些系统配置文件中的用户家目录的路径还是以前的)。
结果:删除一个samba家目录共享无法访问的用户“lzl”,并在重新建立时使用相同的用户名,且指定家目录为/home/student/lzl同时加入到samba用户数据库中后samba的家目录共享又可以正常访问了。
第四步:感觉上,第三步中貌似找到了问题的原因。就在我准备一个个删除并重建用户时突然一个想法冒出来,我是不是可以切换到一个之前修改过家目录的“问题用户”上,来看看其家目录到底变没变。
结果:使用su – sxy命令尝试切换到“sxy”这个用户上时抛出错误:

第五步:我注意到,第四步的报错中的路径是相对路径而不是绝对路径,马上查看/etc/passwd文件,发现,所有的“问题用户”的家目录都是相对路径而正常用户都是绝对路径。
问题用户:

正常用户:

至此,问题的原因彻底搞清楚了,那就是因为我在使用usermod修改家目录时使用的是相对路径。
解决办法:使用usermod命令重新修改为绝对路径,或直接改/etc/passwd文件。

samba配置文件中的常用变量

先简单解释下什么是samba配置文件中的变量。

上图中,所有以“%”开头的字母都是变量(已用红色箭头指出)。各个变量代表的值已在下方标注。

%S = 当前服务名(如果有的话)  
%P = 当前服务的根目录(如果有的话)  
%u = 当前服务的用户名(如果有的话)  
%g = 当前用户说在的主工作组  
%U = 当前对话的用户名  
%G = 当前对话的用户的主工作组  
%H = 当前服务的用户的Home目录  
%v = Samba服务的版本号。  
%h = 运行Samba服务机器的主机名  
%m = 客户机的NETBIOS名称  
%L = 服务器的NETBIOS名称  
%M = 客户机的主机名  
%N = NIS服务器名  
%p = NIS服务的Home目录  
%R = 说采用的协议等级(值可以是CORE, COREPLUS, LANMAN1, LANMAN2,NT1)  
%d = 当前服务进程的ID  
%a = 客户机的结构(只能识别几项:Samba,WfWg,WinNT,Win95)  
%I = 客户机的IP  
%T = 当前日期和时间

以上内容摘录自:http://blog.csdn.net/xkq_lyx/article/details/12905863
 

CentOS 6下超实用的samba配置教程

介绍:
samba是在linux/unix上实现SMB协议的免费软件,通俗来说就是让linux/unix支持与windows间互相共享文件。
安装软件包:

yum install -y samba

samba配置文件介绍
samba配置文件的存放路径为

/etc/samba/

该目录下有以下三个文件:

lmhosts文件中记录着局域网中NetBIOS与IP地址的对应关系
smb.conf是samba的主配置文件,其内容由全局配置部分和共享配置部分组成。
smbusers文件记录着windowns中用户与linux中用户的对应关系,例如windows中的administrator管理员账户对应linux下的root用户。
samba的配置:
在开始配置前,首先明确下需求:
1、user11和user12用户可以通过samba共享来访问自己的家目录,且此共享仅本人可见。
2、创建三个共享,分别为share1、share2、share3,其共享的本地文件夹分别为/tmp/a1、/tmp/a2、/tmp/a3。
3、group1组的用户user1对share1共享有全部权限,group2组的用户user2对share2有全部权限,group3组的用户user3对share1和share2共享都有全部权限;对于share1和share2共享其他人有只读权限;share3为公共存储,所有人都有存取权。
4、所用用户新建的文件都是本人拥有全部权限,其他人只有只读权限。
知道了需求,那么现在就来根据需求来做具体配置吧:

vim /etc/samba/smb.conf                //使用vim文本编辑器打开配置文件

转到第248行,可以看到如下内容,看开头一行,[homes],home是家的意思,加s呢,变成复数了,可以理解成所有用户的家,哈哈,感觉我像是在讲英语。总之,通过配置此部分就可以满足需求1了。

comment选项是用来添加一个文本描述的。
browseable选项定义他人是否可以看到此共享,yes为可以,no为不可以(仅自己可见)。
writable选项用来定义共享是否可写。
valid users选项定义该共享规则对哪些用户启用。

看显而易见,我们只要设置valid users选项,让此共享配置仅对user11和user12用户生效即可满足需求1。

再来看需求2,新建三个共享,这个怎么破?其实很简单啦,配置文件里已经写好了现成的,我们只需要复制成三份就好。
转到配置文件的末尾,可以看到以[public]关键字开头的配置部分,这就是配置共享的模板。

复制前需要注意,这部分配置文件默认被注释掉了,如果你不想在复制完去一点点的删除三份注释符号的话那最好在复制之前把这一份注释符号删掉,如下图:

三个共享有了,但他们的配置文件是一摸一样的,那共享名和共享的文件夹一定也是一样的,要如何为每一个共享做定制呢?
先看这部分配置文件的简单介绍:

开头的[public]是共享名,可任意起,与实际的共享文件夹可以不同名。
comment是没用的文本介绍。
path是指定要共享的本地文件夹的路径。
public是用来指定是否共享的,有yes和no两个选项,至于这两个选项分别是啥意思我就不啰嗦了。
writable用于配置此共享是否支持写入。
printable指定是否支持打印,没有特殊需求的话这里都保持注释状态。
write list此选项用于决定哪些用户或组对此共享拥有写入权限,此处一般保持注释就好,因为linux的权限管理可比samba的好用多了。

以下是按照需求2修改过的配置文件,修改部分已经用红笔标出来了,对照上方配置选项的解释就可以轻松理解下图的配置内容了。

权限配置部分:
下面来看需求3,很明显这里是需要做权限控制了。但我不得不唠叨一下,samba自带的权限管理配置起来那是相当的蛋疼,而且功能弱爆了。所以这里我们使用linux系统权限管理加ACL来做权限控制。
关于ACL的介绍可以参考:

linux下acl权限详解


在配置权限前,我们先把所需要的用户与组都创建完,并把他们加入到samba用户数据库中,再把要共享的文件夹都创建出来。
新建用户:

useradd user11
useradd user12
useradd user1
useradd user2
useradd user3

新建组:

groupadd group1
groupadd group2
groupadd group3

将用户加入组:

usermod -G group1 user1
usermod -G group2 user2
usermod -G group3 user3

将系统用户加入到samba用户数据库中。

pdbedit -a user11
pdbedit -a user11
pdbedit -a user1
pdbedit -a user2
pdbedit -a user3

使用pebedit命令将系统用户加入samba用户数据库中时会提示输入两次密码,此密码可以与linux系统用户密码不相同,加入成功后会出现类似如下提示:

创建共享的文件夹:

mkdir /tmp/a1
mkdir /tmp/a2
mkdir /tmp/a3

接下来就进入到了最重要的文件夹权限配置阶段了。
先来看/tmp/a1目录的权限配置。
将目录所属组改为group1

chown :group1 /tmp/a1

此时目录/tmp/a1的权限为:

此时group1组的成员对目录是没有写权限的,下面就赋予其读写执行的权限:

chmod 775 /tmp/a1


此时group1组已经拥有了应有的权限,但需求3里面要求grou3组对该共享目录也拥有全部权限,这个就需要ACL来完成了。
执行如下命令:

setfacl -m g:group3:rwx /tmp/a1       //配置ACL权限使group3组的成员对/tmp/a1目录拥有全部权限

此时查看权限:

注意权限的最后多了一个+号,这证明ACL权限已经生效了,再执行。

getfacl /tmp/a1         //查看目录的ACL权限


只要有如上图画红线的部分即是配置成功。
至此/tmp/a1这个目录的全部权限已经配置完成,而/tmp/a2目录的权限与/tmp/a1的权限的配置方法雷同,这里不再赘述。
再来看下/tmp/a3目录的权限,很简单,给他777的权限即可。

chmod 777 /tmp/a3

最后的最后,来看看需求4吧,就差这一个了。
这里依然使用ACL权限来完成需求,而不通过修改samba的配置文件。
那要如何配置ACL呢?没错,只需要配置两条默认ACL权限即可。

setfacl -m d:u::rwx /tmp/a?    //这里使用通配符为所有以a开头而第二个字符为任意字符的文件夹配置权限
setfacl -m d:g::rx /tmp/a?

以/tmp/a1文件夹的acl权限为例:

getfacl /tmp/a1


可以看到如上图中红色标注的部分即为配置成功。
 
好啦,4个需求已经全部满足了,尽情测试吧。