【Linux】Samba服务

一、介绍: 

 在早期的网络世界中,文件数据在不同主机之间的传输大多是使用ftp,但是使用ftp服务传输档案使得我们无法直接修改主机上面的档案数据。NFS服务可以实现在客户端的机器上直接使用服务器上面的文件,但是NFS主要在unix系列操作系统上使用。windows上面也有类似的文件系统,那就是cifs(Common Internet File system,通用internet文件系统),cifs的最简单的用途就是“网上邻居”,但是cifs只能让windows机器沟通。所以,为了实现windows和unix系列系统之间能够相互沟通,就产生了samba服务。

samba是架构在NetBIOS(Network Basic Input/Output System,网上基本输入输出系统)这个通信协议上面所开发出来的。NetBIOS是由IBM发展出来,目的是要让局域网络内少数计算机进行网络连接的一个通信协议,因此NetBIOS是无法跨越路由的,而现在Samba不仅能与局域网主机分享资源,还能与全世界的电脑分享资源,就是由NetBIOS ove TCP/IP技术解决。由于NetBIOS在局域网内实在是很好用,所以微软的网络架构就使用了这个协议。而samba最早发展的时候,其实是想要让linux系统可以加入windows的系统当中来共享使用彼此的文件数据,所以samba就架构在NetBIOS发展出来了。

samba的主要功能如下:

  1. 进行文件共享。
  2. 可以提供使用者登入samba主机时的身份认证,以提供不同身份的个别资料。
  3. 可以进行windows网络上的主机名称解析(NetBIOS name)。

NetBIOS当初发展就着眼在局域网内的快速数据交流,而因为是定义在局域网内,因此它并没有使用类似TCP/IP之类的传输协议,也就不需要IP的设置。这样一来数据如何在两台主机间交流呢?其实主机在NetBIOS协议当中的定义为使用“NetBIOS Name”,每一台主机必须要有不同的NetBIOS Name才行。假设使用网上邻居来设置文件数据的访问,想要登录某台计算机使用它所提供的文件数据时,必须要加入该计算机的工作组,并且需要给自己的机器设置一个NetBIOS Name,在同一个组中,NetBIOS Name是独一无二的。是否能登录对方主机或者是使用对方主机所提供的资源,还要看对方主机有没有提供我们使用的权限。

Samba通过两个服务来控制管理工作组和Samba主机共享的目录,分别是:

  1. nmbd:这个服务是来管理工作组、NetBIOS Name等的解析。主要利用UDP协议开启port137、port138来负责名称解析的任务。
  2. smbd:这个服务的主要功能是用来管理samba主机共享的目录、文件与打印机等。主要利用可靠的TCP协议来传输数据,开放的端口为139和445(不一定存在)。

Samba服务的相关软件包说明:

  1. Samba:该软件主要提供了smb服务器所需的各项服务程序(smbd及nmbd)、相关的文件。
  2. Samba-client:这个软件提供了当linux作为samba client时,所需要的工具命令。例如挂载samba文件格式的mount.cifs。
  3. Samba-common:这个软件提供的则是服务器与客户端都会使用到的数据,包括samba的主要配置文件(smb.conf)等。

Samba服务的主配置文件/etc/samba/smb.conf                     //在该文件中,“#”和“;”都是注释符号;且不区分大小写。

主配置文件的内容:

1、[global]定义全局性配置:

[global]

workgroup = MYGROUP                                            //设定 Samba Server 所要加入的工作组或者域

 

server string = Samba Server Version %v             //主机的简易说明

;       netbios name = MYSERVER                             //主机的NetBIOS名称

;       interfaces = lo eth0 192.168.12.2/24 192.168.13.2/24        //设置samba服务器监听的网卡,可以写网卡名称或ip地址

;       hosts allow = 127. 192.168.12. 192.168.13.                        //设置允许连接到samba服务器的客户端

【hosts deny = 可以设置不允许连接到samba服务器的客户端】

 log file = /var/log/samba/log.%m                           //产生日志文件的命名

 max log size = 50                                                  //定义日志文件最大容量(单位是KB,如果是0表示不限制)

 security = user                                        //设置用户访问samba服务器的验证方式,一共四种,他们的验证方式如下:

share:用户访问samba server不需要提供用户名和密码,安全性能较低,deprecated(已弃用)

user:samba server共享目录只能被授权的用户访问,由samba server负责检查账号和密码的正确性。账号和密码要在samba server中建立

server:和user安全级别类似,但用户名和密码是递交到另外的server去验证,如果递交失败,就退到user安全级别,deprecated(已弃用)

domain:这个安全级别要求网络上存在一台windows的主域控制器,samba把用户名和密码递交给它去验证。

passdb backend = tdbsam                       //密码文件已经转为使用数据库了,默认的数据库格式为tdbsam,默认的文件放置到/var/lib/samba/private/passwd.tdb。

load printers = yes                         //设置在samba服务启动时是否共享打印机设备

cups options = raw                           //打印机的选项

 

2、[homes] 定义对用户家目录的共享配置(由于在linux上面每位用户均有家目录,例如user1的用户主目录为/home/user1,当user1使用samba时,就会发现多了个//127.0.0.1/user1/的资源可用,由于设置的不可浏览,除了自己能看见自己的家目录,别人是不可以浏览的):

[homes]

comment = Home Directories

browseable = no

writable = yes

3、[printers] 定义打印机共享配置:

[printers]

comment = All Printers

path = /var/spool/samba                                     //打印的文件队列暂时放到该目录下

browseable = no

guest ok = no                                                       //游客是否能打印

writable = no

printable = yes

为了简化设置,samba提供很多不同的变量供我们使用:

符号

释义

符号

释义

%m

客户端主机的NetBIOS名

%M

客户端主机的FQDN

%H

当前用户家目录路径

%U

当前登录的用户的用户名

%g

当前登录的用户所属组

%h

samba服务器的主机名

%L

samba服务器的NetBIOS名

%I

客户端主机的IP

%T

当前的日期和时间

%S

取代当前的[]里面的内容

共享文件设置参数 

[share]                                                    //自定义共享名称

comment = this is share text                  //共享描述

path = 所共享的目录路径

public = yes/no                        //设置共享是否允许guest账号访问

guest ok = yes/no                    //功能同public一样

browseable = yes/no               //是否让所有用户看到这个项目,如果是no就表示隐藏

writable = yes/no                     //用户是否具有可写权限

read only = yes/no                   //设置共享是否具有只读权限read only=no和writable = yes等价,如与以上设置发生冲突, 放在后面的设置生效

admin user = root                      //设置共享的管理员,多用户之间使用逗号隔开。

valid users = username            //设置允许访问共享的用户,如果为空,将允许所有用户访问。例如valid users = user1,user2,@group1(多用户和组用逗号分开,@group表示组)

invalid users =  username          //设置不允许访问共享的用户

write list = username                  //如果writable=no,该字段中用户或组可读写,例如write list = user1,@group1

create mask = 0700                     //创建文件的权限为700

directory mode = 0700                //创建的目录权限为700

实验一:用户家目录共享

要求:你的SMB服务器必须是work工作组的一个成员,任何用户均可以通过samba共享使用密码redhat读取自己的家目录的文件,无法访问其他人的家目录。测试用户为xiaoming和xiaohong。

服务端IP地址:192.168.9.131

客户端IP地址:192.168.9.132

服务端:

[[email protected] ~]# systemctl stop firewalld

注意:如果防火墙开启,需要添加防火墙规则 firewall-cmd --permanent --add-service=samba

[[email protected] ~]# setenforce 0

注意:

  1. Selinux开启的状态下,需要对共享的目录执行:chcon -t samba_share_t /public
  2. Selinux开启的情况下,需要执行setsebool -P samba_enable_home_dirs on   否则,用户不能进入自己的家目录

装包:

[[email protected] ~]# yum install samba -y

[[email protected] ~]# vim /etc/samba/smb.conf

[global]

        workgroup = work

        security = user

[homes]

        browseable = no

        writeable = yes

重启服务:

[ro[email protected] ~]# systemctl restart smb nmb

添加普通用户

[[email protected] ~]# useradd xiaoming

[[email protected] ~]# useradd xiaohong

添加samba用户

1、smbpasswd:使用SMB服务的smbpasswd命令给系统用户设置SMB密码

smbpasswd -a 增加用户

smbpasswd -x 删除用户

2、管理samba用户的数据库

pdbedit -a username                                      //新建samba账户

pdbedit -x username                                      //删除samba账户

pdbedit -L                                                        //列出samba用户列表,读取passdb.tdb数据库文件

[[email protected] ~]# smbpasswd -a xiaoming

[[email protected] ~]# pdbedit -a xiaohong

[[email protected] ~]# pdbedit -L

[[email protected] ~]# touch /home/xiaoming/xiaoming

[[email protected] ~]# touch /home/xiaohong/xiaohong

客户端测试:

[[email protected] ~]# yum install samba-client -y

[[email protected] ~]# smbclient -L //192.168.9.131                                  //访问被拒绝

Enter root's password:

session setup failed: NT_STATUS_LOGON_FAILURE

[[email protected] ~]# smbclient -L //172.24.8.151 -U xiaoming                             //使用xiaoming和xiaohong可以登录

[[email protected] ~]# smbclient -L //172.24.8.151 -U xiaohong

[[email protected] ~]# smbclient //172.24.8.151/xiaoming -U xiaoming                       //可以查看服务端的文件

smb: \> ls

使用不同的用户查看家目录时访问会被拒绝: 

[[email protected] ~]# smbclient //172.24.8.151/xiaohong -U xiaohong

smb: \> mget 文件名(可将文件下载到当前的工作目录)

挂载两个用户的家目录并使用

[[email protected] ~]# mkdir  -pv /share/xiao{hong,ming}

[[email protected] share]# mount //172.24.8.151/xiaoming /share/xiaoming -o username=xiaoming,password=redhat

[[email protected] share]# mount //172.24.8.151/xiaohong /share/xiaohong -o username=xiaohong,password=redhat

使用windows访问samba共享:\\服务器ip地址

注:以点开头的都是隐藏文件

实验二:共享自定义目录

要求:你的SMB服务器必须是work工作组的一个成员,共享/public目录,共享名必须为public,任何人都可以浏览,读取该目录下的文件,但是不能删除别人创建的文件,可删除自己创建的文件。

服务端:

[[email protected] samba]# vim /etc/samba/smb.conf

[public]

        path = /public

        browseable = yes

        writeable = yes

[[email protected] samba]# mkdir /public/

[[email protected] samba]# chmod o=rwxt /public

[[email protected] samba]# systemctl restart smb nmb

客户端测试:

[[email protected] ~]# smbclient -L //172.24.8.151

Enter root's password:

session setup failed: NT_STATUS_LOGON_FAILURE

[[email protected] ~]# smbclient //172.24.8.151/public -U xiaoming

[[email protected] ~]# mkdir /share/public/

分别使用两个已有的用户去挂载测试能否删除别人创建的文件 

[[email protected] ~]# mount //172.24.8.151/public /share/public/ -o username=xiaoming,password=redhat

 使用xiaoming挂载并创建xixi文件

[[email protected] share]# mount //172.24.8.151/public /share/public/ -o username=xiaohong,password=redhat

 在使用xiaohong挂载并删除文件,权限不够;最后切回xiaoming能够删除文件

实验三:

要求:你的SMB服务器必须是work工作组的一个成员,共享目录为/tech,共享名为tech,所有人都可以访问,但是只有用户manager和jishubu的人可以向该目录写入文件。jishubu的人员有tech1,密码为redhat。

服务端:

[[email protected] samba]# vim smb.conf

[tech]

        path = /tech

        browseable = yes

       write list = manager,@jishubu

[[email protected] samba]# systemctl restart smb nmb

[[email protected] samba]# useradd manager                                                     //添加一个manager用户

[[email protected] samba]# smbpasswd -a manager

[[email protected] samba]# groupadd jishubu                                                    //加一个jishubu组

[[email protected] samba]# useradd -g jishubu tech1

[[email protected] samba]# smbpasswd -a tech1

[[email protected] samba]# mkdir /tech

[[email protected] samba]# chown manager:jishubu /tech                                //修改/tech文件的所属用户和所属组

[[email protected] samba]# chmod u=rwx,g=rwx,o=r-x /tech                             //设置权限

客户端测试:

[[email protected] share]# mkdir  -p /share/tech/

[[email protected] share]# mount //172.24.8.151/tech /share/tech/ -o username=tech1,password=redhat     

//manager用户和jihshubu组的人可以创建和删除文件

[[email protected] share]# umount tech

[[email protected] share]# mount //172.24.8.151/tech /share/tech -o username=xiaoming,password=redhat

//xiaoming等其他用户只能查看文件

自动挂载:

[[email protected] ~]# vim /etc/fstab 

//172.24.8.151/tech        /share/tech       cifs        defaults,username=xiaoming,password=redhat      0  0   

cifs(Common Internet File system,通用互联网文件系统)                                     

实验四:多用户挂载

将实验三的共享永久挂载在客户端的目录,并使用用户 xiaoming 作为认证用户,可以通过用户manager和jishubu的人来临时获取写的权限

客户端:

[[email protected] ~]# yum install cifs-utils -y

[[email protected] ~]# vim /etc/fstab                                                   //自动挂载的相关文件

//172.24.8.128/tech     /share/tech     cifs    defaults,multiuser,username=xiaoming,password=redhat,sec=ntlmssp 0 0

multiuser:表示提供对客户端多个用户身份的区分支持

sec=ntlmssp:提供NT局域网管理安全支持

[[email protected] ~]# mount -a

[[email protected] ~]# cd /share/tech/

[[email protected] tech]# ll

total 0

-rw-r--r--. 1 1002 1002 0 Jul 21 14:05 file

[[email protected] tech]# touch file2

touch: cannot touch ‘file2’: Permission denied

[[email protected] ~]# useradd tech1

[[email protected] ~]# su - tech1

[[email protected] ~]$ cd /share/tech

[[email protected] tech]$ touch file

touch: cannot touch ‘file’: Permission denied

[[email protected] tech]$ cifscreds add 192.168.9.132          //添加需要指定的服务器

Password:

[[email protected] tech]$ ll

total 0

-rw-r--r--. 1 1002 1002 0 Jul 21 14:05 file

[[email protected] tech]$ touch file2                                      //可以创建和删除文件

[[email protected] tech]$ ll

total 0

-rw-r--r--. 1 1002 1002 0 Jul 21 14:05 file

-rw-r--r--. 1 1002 1002 0 Jul 21 14:11 file2