RH254小结(七)Samba服务器的搭建实战篇

2015年8月20日 发表评论 阅读评论

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安装与配置操作:

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

firewalld 防火墙配置:

# firewall-cmd --permanent --add-service=samba   或
# firewall-cmd --permanent --add-port=137-138/udp
# firewall-cmd --permanent --add-port=139/tcp --add-port=445/tcp
也可以进行富文本规则配置,如只允许某网段通行,并设置日志标记等
# 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 配置如下:

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

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

二、public 匿名访问需求

smb.conf中的配置:

[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

这里需要注意的是

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

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

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

增加相应的用户和组:

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

Selinux配置

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

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

# mount -t cifs //192.168.0.109/public /mnt
Password for root@//192.168.0.109/public:     //不用输入密码,直接回车
# ls /mnt/
ls: 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组进行测试,具体大致步骤如下:

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

具体测试步骤略。

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

smb.conf 配置如下:

[site]
       comment = www site
       path = /opt/www
       #writeable = yes
       #readonly = yes
       valid users = smb1, smb2  //指定允许连接的用户
       write list = smb1
       printable = no
       create mask = 0644
       directory mask = 0755

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

当前samba用户列表:

# pdbedit -L
teacher:1002:
smb1:1004:
ybk:1003:
smb2:1005:

测试:

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

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

变量部分

Samba为我们提供了很多有用的变量,可以很方便的进行一些特殊需求操作:

%S:取代目前的设定项目值,如下的示例:

[homes]
   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项的配置如下,这里就用到了上面提到的变量部分:

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

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

preexec与postexec

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

postexec = /etc/umount /cdrom
Default: postexec =
Example: 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部分我实现了如下功能:

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

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

Selinux

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

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

四、用户映射

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

username map = /etc/samba/smbusers

smbusers文件的内容如下:

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

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

[global]
        workgroup = MYGROUP
        server string = Samba Server Version %v
        log file = /var/log/samba/log.%m
        # maximum size of 50KB per log file, then rotate:
        max log size = 50
        security = user
        passdb backend = tdbsam
        map to guest = Bad User
        unix charset = UTF-8
        dos charset = cp936
        username map = /etc/samba/smbusers
        load printers = no
[public]
       comment = Public dir
       path = /opt/share
       public = yes
       #writable = yes
       readonly = yes
       printable = no
       write list = teacher, +admin
       create mask = 0644
       directory mask = 0755
[site]
       comment = www site
       path = /opt/www
       public = yes
       #writable = yes
       #readonly = yes
       valid users = smb1, smb2
       write list = smb1
       printable = no
       create mask = 0644
       directory mask = 0755
[homes]
        comment = Home Directories
        #path = /home/%u
        browseable = no
        writable = yes
        root preexec = rm -rf  /tmp/backup/%U.tar.gz
        root preexec = tar cfz /tmp/backup/%U.tar.gz /home/%U
        #root preexec = tar cfz /tmp/backup/%U%I.tar.gz /home/%U
        #root preexec = /var/lib/samba/scripts/echotest

参数相关页面:

smb.conf man page

centos中文件站

unixmen




本站的发展离不开您的资助,金额随意,欢迎来赏!