RH254小结(六)Samba服务器的搭建理论篇 中提到了samba与NFS、FTP主流文件共享服务的异同,samba的程序包、配置文件与常用命令,Samba firewalld防火墙与selinux配置等。本篇主要实现几个日常工作环境中的几个需要。本篇测试以下几个需求:

1、创建public共享项,path目录/opt/share,实现所有用户可读(匿名访问),只有admin组和teacher用户可以写,并且默认创建的文件权限为644,目录为755;

2、创建site共享项,path目录/opt/www ,实现只有smb1、smb2两个用户可以访问,并且smb1可以读写,smb2只读;

3、创建homes共享项,path目录/home/登陆用对应的用户名(如smb1连接,则path为/home/smb1;smb2连接,path为/home/smb2),并且用户连接上后自动执行备份家目录;

4、无论创建的什么共享项,客户端上使用user1、user2、user3用户连接时自动映射为服务器端的smb1用户;

测试环境:

Samba服务器:192.168.0.109
Linux客户端: 192.168.0.110
win7客户机: 192.168.0.111

一、Samba安装配置部分

ulimit配置:

这主要是避免在启动Samba时出现以下警告信息:rlimit_max: increasing rlimit_max (1024) tominimum Windows limit (16384)

配置内核参数

ulimit -n 16384

vi /etc/security/limits.conf

#在最后加入以下内容
* – nofile 16384

samba安装与配置操作:

 1安装相关软件包
 2# yum -y install samba samba-client cifs-utils   或 yum -y insatll samba*  cifs-utils
 3备份smb.conf配置文件,并将其中的注释部分清理掉方便查看和配置
 4# cd /etc/samba/
 5# cp smb.conf smb.conf.bak
 6# grep -v '^#\|^;\|^$' smb.conf.bak  > smb.conf
 7设置smb和nmb两个服务开机启动,并启动这两个服务
 8# systemctl enable smb nmb
 9# systemctl start smb nmb
10# systemctl status smb nmb   //查看并确认

firewalld 防火墙配置:

1# firewall-cmd --permanent --add-service=samba   或
2# firewall-cmd --permanent --add-port=137-138/udp
3# firewall-cmd --permanent --add-port=139/tcp --add-port=445/tcp
4也可以进行富文本规则配置,如只允许某网段通行,并设置日志标记等
5# firewall-cmd --permanent --add-rich-rule='rule family="ipv4" source address="192.168.0.0/24" service name="samba" log prefix="samba" level="info" limit value="1/m" accept'

按上面的步骤操作并增删后,/etc/samba/smb.conf 的global 配置如下:

 1[global]
 2        workgroup = MYGROUP
 3        server string = Samba Server Version %v
 4        log file = /var/log/samba/log.%m
 5        # maximum size of 50KB per log file, then rotate:
 6        max log size = 50
 7        security = user
 8        #map to guest = Bad User
 9        passdb backend = tdbsam
10        #display charset = UTF-8   //该参数在新版本中已经取消
11        unix charset = UTF-8
12        dos charset = cp936
13        #username map = /etc/samba/smbusers
14        load printers = no

注:上面的字符串部分不能少,少了会出现win下创建的带汉字的文件在linux下查看是乱码;linux下创建的带汉字的文件在win下查看是乱码的情况。

二、public 匿名访问需求

smb.conf中的配置:

<pre data-language="XML">```markup
[global]项中增加如下行:
map to guest = Bad User  //开启匿名访问
[public]
       comment = Public dir
       path = /opt/share
       public = yes     //该包等价于 guest ok = yes
       #writable = yes
       readonly = yes
       printable = no
       write list = teacher, +admin
       create mask = 0644
       directory mask = 0755

这里需要注意的是

<span style="color:#E53333;"><span style="color:#000000;">1、</span>writeable = yes 行和后面的write list行是有冲突的</span>。writeable开启后,是所有用户都有写的权限,而write list 是只允许某些用户可写。如果两者都开启的话,writeable会覆盖后面的权限,即所有用户都可写;

2、admin和teacher的逗号后有空格,admin前的可以跟+、&amp;、@三个符号,这三个符号后面的名字都代表用户组,三者的区别如下:

```bash
+ 只在本机的密码文件组中查找
& 只在nis服务中查找
@ 先通过NIS服务器查找,nis找不到再到本机查找

增加相应的用户和组:

1# groupadd  admin
2# useradd teacher -s /sbin/nologin
3# pdbedit  -a -u teacher
4可以使用以下方法将一个用户增加到admin组内:
5# usermod  用户名 -a -G admin

Selinux配置

1# mkdir -p /opt/share
2# chcon -Rt samba_share_t  /opt/share

selinux权限没有关或者开了selinux没有配置策略,正常挂载后,查看时会报权限拒绝:

1# mount -t cifs //192.168.0.109/public /mnt
2Password for root@//192.168.0.109/public:     //不用输入密码,直接回车
3# ls /mnt/
4ls: reading directory /mnt/: Permission denied

测试:

我们先在windows上使用teacher用户验证可以写入:

samba-anon-write

就像上面描述的,需要注意的是,当我们默认用root用话创建的目录,teacher用户是无法写入的。处理办法有三种:1、设置目录权限为777;2、将目录属主设置为teacher;3、通过acl 进行权限设置。由于samba一般会涉及到多个用户登陆,第二种方法用的较少,方法1、3根据具体的情况而定。

关于网络盘映射到本机也可以通过依次点击计算机---映射网络驱动器进行增加,如下图:

win7-netdisk

测试完可以写的权限,可以再测试在匿名连接时的方法(需要将之前的cmd退出,再开一个,不然还默认不指定用户时用的还是teacher用户),测试步骤如下:

net-use-disk

同样也可以在运行中输入\\192.168.0.109\public 进行访问测试。

win7-samba

以上是windows客户机的测试,在linux上也一样,可以通过usermod将一个用户增加到admin组进行测试,具体大致步骤如下:

1服务端增加用户ybk,并将其增加到admin组下
2# useradd ybk -G admin -s /sbin/nologin或
3# useradd ybk -s /sbin/nologin
4# usermod -G admin
5匿名登陆
6# mount.cifs //192.168.0.109/public  /mnt
7admin组下的用户登陆
8# mount.cifs //192.168.0.109/public  /mnt -o username=ybk

具体测试步骤略。

三、允许个别用户访问需求

smb.conf 配置如下:

 1[site]
 2       comment = www site
 3       path = /opt/www
 4       #writeable = yes
 5       #readonly = yes
 6       valid users = smb1, smb2  //指定允许连接的用户
 7       write list = smb1
 8       printable = no
 9       create mask = 0644
10       directory mask = 0755

同样,这里绝对不能加writeable=yes,其和write list冲突,但是readonly=yes开启不影响。同样,便于测试,这里将/opt/www权限设为了777 并通过chcon设置www目录的安全上下文。

当前samba用户列表:

1# pdbedit -L
2teacher:1002:
3smb1:1004:
4ybk:1003:
5smb2:1005:

测试:

 1匿名挂载提示没权限,用teacher同用一样
 2# mount //192.168.0.109/site /mnt/
 3Password for root@//192.168.0.109/site:
 4mount error(13): Permission denied
 5Refer to the mount.cifs(8) manual page (e.g. man mount.cifs)
 6使用smb1用户挂载并写入测试
 7mount //192.168.0.109/site /mnt/smb1 -o username=smb1
 8Password for smb1@//192.168.0.109/site:  ****
 9# cd /mnt/smb1/
10# echo 'test' > write
11# ll
12total 8
13-rw-r--r--. 1 1004 1005  5 Aug 20 00:59 write
14-rw-r--r--. 1 root root 15 Aug 20 00:48 www_site
15smb2用户测试,可以查看无法写入
16# mount //192.168.0.109/site /mnt/smb2 -o username=smb2
17Password for smb2@//192.168.0.109/site:  ****
18# cd /mnt/smb2
19# cat www_site
20www.361way.com
21# echo 'aaaaa' > smb2
22-bash: smb2: Permission denied

三、home目录共享与自动备份

变量部分

Samba为我们提供了很多有用的变量,可以很方便的进行一些特殊需求操作:
%S:取代目前的设定项目值,如下的示例:

1[homes]
2   valid users = %S

如果使用361way用户登陆,上面的[homes]就会变会[361way] 。

%m:代表 Client 端的 NetBIOS 主机名
%M:代表 Client 端的 Internet 主机名,即hostname
%L:代表 SAMBA 主机的 NetBIOS 主机名
%H:代表用户的家目录
%U:代表目前登入的使用者的使用者名称
%g:代表登入的使用者的组名
%h:代表目前这部 SAMBA 主机的 HOSTNAME
%I:代表 Client 的 IP
%T:代表目前的日期与时间

homes项的配置如下,这里就用到了上面提到的变量部分:

1[homes]
2        comment = Home Directories
3        path = /home/%u    //这行开启与不开启的作用相同
4        browseable = no
5        writable = yes    //这行要开启,不开启无法写入
6        #root postexec = mkdir -p /opt/samba/backup/%u ;tar cfz /opt/samba/backup/%U/%T.tar.gz /home/%U
7        #preexec = echo \"%u connected to %S from %m (%I)\" >> /tmp/log
8        root preexec = /var/lib/samba/scripts/backup.sh

上面path路径也可以是非home的,同样可以使用上面的变量值

preexec与postexec

关于备份部分,上面还用到了一个知识点,即preexec(连接前执行)、root preexec、postexec(连接关闭后执行)、root postexec 。加了root就是以root权限执行。不过这里备份这一项做的算是成功了一半。按照官方的man手册其,为我们提供了这样的示例:

1postexec = /etc/umount /cdrom
2Default: postexec =
3Example: postexec = echo \"%u disconnected from %S from %m (%I)\" >> /tmp/log

即在后面直接跟上命令与samba内部变量,这块我在实验环境多次测试不成功 。不过后面跟一个shell 脚本,将要执行的内容放在脚本中,可以成功执行,但是无法将上面提到samba变量在脚本中应用。所以只能算是成功了一半。最后得出的半吊子结果就是

1、exec后面无法带多条命令,如上面的mkdir与tar之间用分号隔开的写法。
2、因为%T的输出于中间有无法空格,无法与前面部分放在一起用;%U%I 这类可以一起用。
3、无法直接使用echo 输出到文件;

总之功能略有些鸡肋,不过其可以顺序执行多条exec 语句,所以上面的exec部分我实现了如下功能:

1root postexec = rm -rf  /tmp/backup/%U.tar.gz  或 mv /tmp/backup/%U.tar.gz /tmp/backup/%U_back.tar.gz
2root postexec = tar cfz /tmp/backup/%U.tar.gz /home/%U

每次挂载时先将老的备份删除或重命名后,再进行备份。如果文件较多的情况下,建议还是放到postexec后再执行,测试功能时可以使用preexec 。当然该功能也并非完全鸡肋,想到的一个应用场景就是用前挂ISO文件到目录,用后再umount iso 文件,有点类似于auotfs的用法。

Selinux

这部分的实验里有两部分和selinux有关:home目录的使用、exec脚本位置的存放位置,这两部分selinux 要使用的部分在默认的smb.conf 配置中都为我们提到了:

1使用home目录时,需要执行下条
2# setsebool -P samba_enable_home_dirs on
3使用exec脚本时,需将脚本放到下面的位置,并执行如下命令
4# restorecon -R -v /var/lib/samba/scripts

四、用户映射

在全局配置中增加如下部分:

1username map = /etc/samba/smbusers

smbusers文件的内容如下:

1smb1 = user1 user2 user3
2如有其他映射关系也可以再增加一条,如:
3root = administrator  admin123

篇幅所限,这部分功能的测试结果不再粘贴。每次配置变动,都可以使用testparm测试smb.conf文件的正确性。最后完整的配置如下:

 1[global]
 2        workgroup = MYGROUP
 3        server string = Samba Server Version %v
 4        log file = /var/log/samba/log.%m
 5        # maximum size of 50KB per log file, then rotate:
 6        max log size = 50
 7        security = user
 8        passdb backend = tdbsam
 9        map to guest = Bad User
10        unix charset = UTF-8
11        dos charset = cp936
12        username map = /etc/samba/smbusers
13        load printers = no
14[public]
15       comment = Public dir
16       path = /opt/share
17       public = yes
18       #writable = yes
19       readonly = yes
20       printable = no
21       write list = teacher, +admin
22       create mask = 0644
23       directory mask = 0755
24[site]
25       comment = www site
26       path = /opt/www
27       public = yes
28       #writable = yes
29       #readonly = yes
30       valid users = smb1, smb2
31       write list = smb1
32       printable = no
33       create mask = 0644
34       directory mask = 0755
35[homes]
36        comment = Home Directories
37        #path = /home/%u
38        browseable = no
39        writable = yes
40        root preexec = rm -rf  /tmp/backup/%U.tar.gz
41        root preexec = tar cfz /tmp/backup/%U.tar.gz /home/%U
42        #root preexec = tar cfz /tmp/backup/%U%I.tar.gz /home/%U
43        #root preexec = /var/lib/samba/scripts/echotest

参数相关页面:
smb.conf man page
centos中文件站
unixmen