Linux中搭建Samba服务并实现共享目录的配置及其不同策略授权访问操作实践教程

一、Samba简介

samba是一个能让Linux系统应用Microsoft网络通讯协议的软件,而SMB是Server Message Block的缩写(即:服务器消息块),SMB主要是作为Microsoft的网络通讯协议,后来samba将SMB通信协议应用到了Linux系统上,就形成了现在的samba软件。后面微软将SMB改名为CIFS(Common Internet File System 通用Internet文件系统)且加入了很多新功能,因此samba拥有了更强大的功能。

samba最大功能是【用于Linux与windows系统直接的文件共享和打印共享 】;samba既可以实现windows与Linux的文件共享,也可实现Linux与Linux直接的资源共享,但由于NSF(网络文件系统)已经能够很好实现Linux与Linux直接的数据共享,因此samba更多的是用在Linux与Windows之间的数据共享上。

SMB是基于客户端/服务器型的协议(C/S),因此一台samba服务器既可以充当文件共享服务器,也可以充当一个samba的客户端(即:一台部署好了samba服务的设备,既可以通过SMB协议共享资源,同时也可以访问网络上其他设备共享的资源)。

注意:samba在windows下使用的是NetBIOS协议,如果你要使用Linux下共享出来的文件,请确认你的windows系统下是否安装了NetBIOS协议。

二、samba服务的安装部署

这里以国产OpenEuler系统为例进行演示说明(其他Linux的发行版也是一样的操作)。

2.1、安装samba服务

samba服务安装完成后,会生成配置文件目录【/etc/samba】(包含【lmhosts、smb.conf、smb.conf】三个文件,其中【smb.conf】是samba的核心配置文件)【/usr/lib/systemd/system/smb.service】是samba文件共享的核心服务;【/usr/lib/systemd/system/nmb.service】是samba类似域名解析的服务(可将共享的工作组名称与IP对应,若该服务没有启动,则只能通过ip访问)。

bash 复制代码
#安装samba服务

#1-检查是否安装了samba服务(如有相关samba内容显示则表示已经安装)
rpm -qa | grep samba

#1.1-若检查没有安装samba服务,则需要按照如下方法安装
yum -y install samba samba-client samba-common


#2-启动smb与nmb服务并设置开机自启
systemctl start smb.service
systemctl start nmb.service
systemctl enable smb.service
systemctl enable nmb.service


#3-查看samba服务的相关进程(主要是:一个smbd主进程及其两个子进程,还有一个nmbd进程)
ps -ef

2.2、配置samba共享目录和权限

|--------|-------------------------|--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------|
| 序号 | samba配置常用参数 | 说明 |
| 1 | global | 表示以下的内容为全局配置,必须要有。 |
| 2 | workgroup | 设置 samba 服务器所在的工作组名称,确保与局域网内其他计算机的工作组相同,以便更好地集成到网络环境中。 |
| 3 | netbios name | 设置 samba 服务器的 NetBIOS 名称,用于在网络中标识该服务器,例如在 Windows 网络邻居中显示的名称。 |
| 4 | server string | 服务器描述信息,用于在客户端显示有关服务器的简短描述,可随意指定。 |
| 5 | log file | 定义samba用户的日志文件,%m代表客户端主机名,samba服务器会在指定的目录中为每个登陆主机建立不同的日志文件。 |
| 6 | security | 定义数据共享的方式,此选项有多个可选值,常用的有user、share、server和domain,user表示需要密码验证后才能共享数据,share表示可以直接共享数据,无需输入密码。在samba4中share和server两个选项已经被禁用,若要实现无密码登录,需要添加"security=user"和"map to guest =Bad User"两个选项来实现。 |
| 7 | passdb backend = tdbsam | 指定用户账户数据库的后端类型为 tdbsam,这是一种基于 TDB(Trivial Database)文件的后端,用于存储用户账户信息。 |
| 8 | map to guest =Bad User | 将无效用户映射为访客用户,当用户尝试使用不存在的账户登录时,samba 将其视为访客用户进行处理,可根据需要调整访客用户的权限。 |
| 9 | max log size = 1024 | 设置日志文件的最大尺寸为 1024KB,当日志文件达到此大小时,samba 会自动截断或创建新的日志文件,避免日志文件无限增长占用过多磁盘空间。设置为0时表示不做限制,默认单位是KB。 |
| 10 | os level = 33 | 设置 samba 服务器在 Windows 网络中的 OS 级别,该值影响服务器在浏览主服务器选举中的优先级,较高的值表示在浏览主服务器选举中有更大的机会成为主浏览器,但一般不建议随意修改此值除非有特定需求。 os level的值从0到255,winNT的OS level为33,win95/98的OS level是1,samba server的os level值至少要大于33以上。 |
| 11 | datashare | 设置在windows中显示出来的共享目录的名称。 |
| 12 | path | 指定共享的目录,必须有。 |
| 13 | writeable | 设置是否可写,yes为可写,no为不可写。 |
| 14 | browseable | 设置是否可以在windows工作组下看到共享文件夹,如果需要隐藏共享文件夹,选择no即可。 |
| 15 | guest ok | 设置匿名用户是否可以登陆,若security设置为user,此选项默认值为no,设置为yes可以无密码登录。 |
| 16 | comment | 对共享目录的说明,可自定义说明信息。 |
| 17 | valid users | 用来定义可以访问该Samba服务器的用户。 |
| 18 | create mask | 定义客户端用户创建文件的默认权限;664表示对创建用户可读可写,对创建用户组可读可写,对其它用户仅有只读权限。 |
| 19 | directory mask | 定义客户端用户创建目录的默认权限;775表示对创建用户与创建组可读可写可执行,对其它用户可读可执行。 |
[samba核心配置文件的常用参数详解]

2.2.1、配置samba共享目录可匿名登录后拥有任意操作权限

bash 复制代码
#共享【/data/datashare】目录,且设置共享目录名称为【datashare】且可以匿名登录操作该目录下的任何文件

#1-编辑samba的核心配置文件【/etc/samba/smb.conf】
cd /etc/samba
cp -p smb.conf smb.conf.old
vi smb.conf

#2-【smb.conf】文件的完整内容如下:
[global]
        workgroup = WORKGROUP
        netbios name = coffeemilk
        server string = OpenEuler Server samba server
        security = user
        log file = /var/log/samba/%m.log
        passdb backend = tdbsam
        map to guest = Bad User
        max log size = 10240
        os level = 33
        [datashare]
                path = /data/datashare
                writeable = yes
                browseable = yes
                guest ok =yes


#3-创建共享【/data/datashare】目录,且设置这个共享目录的属主属组为nobody
mkdir -p /data/datashare
chown -R nobody:nobody /data/datashare/

#4-重启smb与nmb服务
systemctl restart smb.service
systemctl restart nmb.service

#5-获取samba所在服务器的ip地址
ip a

#6-在windows的任意目录输入【\\samba所在服务器IP】后按下Enter键即可访问(注意:若访问不了,是由于samba所在服务器的防火墙开启中,没有放开samba服务的445与139端口)


#7-检查samba所在服务器的防火墙若是开启状态则放开samba服务的445与139端口
netstat -antlp
systemctl status firewalld

firewall-cmd --list-port
firewall-cmd --zone=public --add-port=445/tcp --permanent
firewall-cmd --zone=public --add-port=139/tcp --permanent
firewall-cmd --reload
firewall-cmd --list-port

2.2.2、配置samba共享目录必须授权登录且设置权限

bash 复制代码
#配置samba共享目录必须授权登录

#1-编辑samba的核心配置文件【/etc/samba/smb.conf】
cd /etc/samba
cp -p smb.conf smb.conf.1
vi smb.conf

#2-【smb.conf】文件的完整内容如下:
[global]
        workgroup = WORKGROUP
        netbios name = coffeemilk
        server string = OpenEuler Server samba server
        security = user
        log file = /var/log/samba/%m.log
        passdb backend = tdbsam
        map to guest = Bad User
        max log size = 10240
        os level = 33
        [datashare1]
                path = /data/datashare1
                comment = 项目资料共享目录1
                valid users = ck1
                writeable = yes
                browseable = yes
                guest ok = no

        [datashare2]
                path = /data/datashare2
                comment = 项目资料共享目录2
                valid users = ck2
                create mask = 664
                directory mask = 775
                writeable = yes
                browseable = yes
                guest ok = no


#3-创建samba用户(samba用户只是读取linux上的用户名称,但不读取Linux上用户的密码)
#先创建linux的系统用户,但这些用户只是服务用户,不让登录且指定这些用户的工作目录
useradd -d /data/datashare1 -s /sbin/nologin ck1
useradd -d /data/datashare2 -s /sbin/nologin ck2
smbpasswd -a ck1
smbpasswd -a ck2


#4-重启smb与nmb服务
systemctl restart smb.service
systemctl restart nmb.service

#5-获取samba所在服务器的ip地址
ip a

#6-在windows的任意目录输入【\\samba所在服务器IP】后按下Enter键即可访问(注意:若访问不了,是由于samba所在服务器的防火墙开启中,没有放开samba服务的445与139端口)


#7-检查samba所在服务器的防火墙若是开启状态则放开samba服务的445与139端口
netstat -antlp
systemctl status firewalld

firewall-cmd --list-port
firewall-cmd --zone=public --add-port=445/tcp --permanent
firewall-cmd --zone=public --add-port=139/tcp --permanent
firewall-cmd --reload
firewall-cmd --list-port

注意:若要在windows上使用SMB,则需要开启windows上的服务,开启方法如下:

《1》打开windows的控制面板-->【程序】-->【启用或关闭Windows功能】如下图所示:

《2》勾选【SMB 1.0/CIFS 文件共享支持】【SMB直通】后点击【确定】,如下图所示:

注意:当我们使用账号密码登录SMB协议共享目录时提示"\\192.168.1.10\datashare2无法访问。你可能没有权限使用网络资源。请与这台服务器的管理员联系以查明你是否有访问权限
不允许一个用户使用一个以上用户名与服务器或共享资源的多重连接。中断与此服务器或共享资源的所有连接,然后再试一次。"错误,需要打开windows的命令行窗口执行【net use】查看,然后执行【net use * /del】删除所有缓存后重试即可,详细操作如下所示

Window10系统下通过SMB协议连接和断开资源服务器https://blog.csdn.net/xiaochenXIHUA/article/details/124940179

三、samba的特殊场景共享目录授权

在实际的工作场景中,可能会出现多个用户对同一个共享目录的访问,加入要求每个不同的用户登录到这个共享目录之后,他只能去读取已存在的其他用户文件,同时,不能删除其他用户创建的文件,只能创建、修改、删除自己创建的文件,那这个场景下该如何配置samba服务器呢?如下是一个示例(假设共享了一个/data/test目录,此目录只允许ck1和ck2用户访问,并可以自己创建文件,但无法删除或修改其他用户创建的文件,要完成这个功能,需要配合linux下的文件权限管理机制才能实现)。

bash 复制代码
#配置samba共享目录必须授权登录(多个用户对同一个共享目录的访问,加入要求每个不同的用户登录到这个共享目录之后,他只能去读取已存在的其他用户文件,同时,不能删除其他用户创建的文件,只能创建、修改、删除自己创建的文件)

#1-编辑samba的核心配置文件【/etc/samba/smb.conf】
cd /etc/samba
cp -p smb.conf smb.conf.2
vi smb.conf

#2-【smb.conf】文件的完整内容如下:
[global]
        workgroup = WORKGROUP
        netbios name = coffeemilk
        server string = OpenEuler Server samba server
        security = user
        log file = /var/log/samba/%m.log
        passdb backend = tdbsam
        map to guest = Bad User
        max log size = 10240
        os level = 33
        [test1]
            path = /data/test
            comment = This is test
            valid users = ck1,ck2
            writeable = yes
            browseable = yes
            guest ok = no

        [datashare1]
                path = /data/datashare1
                comment = 项目资料共享目录1
                valid users = ck1
                writeable = yes
                browseable = yes
                guest ok = no

        [datashare2]
                path = /data/datashare2
                comment = 项目资料共享目录2
                valid users = ck2
                create mask = 664
                directory mask = 775
                writeable = yes
                browseable = yes
                guest ok = no


#3-创建samba用户(samba用户只是读取linux上的用户名称,但不读取Linux上用户的密码)
#先创建linux的系统用户,但这些用户只是服务用户,不让登录且指定这些用户的工作目录(若前面已经创建了就不用再创建)
useradd -d /data/datashare1 -s /sbin/nologin ck1
useradd -d /data/datashare2 -s /sbin/nologin ck2
smbpasswd -a ck1
smbpasswd -a ck2

#4-创建多人访问的目录且设置只有testck用户对该目录拥有所有权
mkdir -p /data/test
useradd testck
chown -R testck:testck /data/test

#5-目前想要除了testck这个管理员之外的人员登录(如:ck1,ck2)但是要保证这些人员可以对共享的目录/data/test目录可以创建文件或目录,因此需要给这个目录的组授权给这些人员
usermod -G testck ck1
id ck1
usermod -G testck ck2
id ck2
chmod 775 /data/test

#6-实现创建目录之外的用户(如:ck1,ck2)只能去读取已存在的其他用户文件,而不能删除其他用户创建的文件
chmod +t /data/test

#7-重启smb与nmb服务
systemctl restart smb.service
systemctl restart nmb.service

#8-获取samba所在服务器的ip地址
ip a

#9-在windows的任意目录输入【\\samba所在服务器IP】后按下Enter键即可访问(注意:若访问不了,是由于samba所在服务器的防火墙开启中,没有放开samba服务的445与139端口)
net use * /del

#10-检查samba所在服务器的防火墙若是开启状态则放开samba服务的445与139端口
netstat -antlp
systemctl status firewalld

firewall-cmd --list-port
firewall-cmd --zone=public --add-port=445/tcp --permanent
firewall-cmd --zone=public --add-port=139/tcp --permanent
firewall-cmd --reload
firewall-cmd --list-port

《1》输入【\\192.168.1.10】可以访问到samba共享的所有目录,如下图所示:

《2》使用ck1用户及其密码登录到共享的test1目录后,测试【删除任意文件会提示"你需要权限才能进行此操作"】【测试创建目录和文件是正常创建的】【测试自己创建的文件进行修改或删除是可以正常操作的】如下图所示:

《3》使用ck2用户及其密码登录到共享的test1目录后,测试【删除任意文件会提示"你需要权限才能进行此操作"】【测试创建目录和文件是正常创建的】【测试自己创建的文件进行修改或删除是可以正常操作的】如下图所示:

注意:若是已经执行了【net use * /del /y】后还是可以访问刚才需要用户密码登录的共享目录,是因为【一旦共享上的所有打开文件都关闭,空闲连接应该在15分钟内由服务器自动关闭(如果服务器是Windows)。 否则,关闭所有SMB连接的一种强制方法是进入服务程序并重新启动工作站服务(Workstation)。这将清除SMB连接中的缓存凭据。】可以使用如下的任意一种方法:

到这里经过我们测试满足我们要求的"对同一个共享目录的访问,加入要求每个不同的用户登录到这个共享目录之后,他只能去读取已存在的其他用户文件,同时,不能删除其他用户创建的文件,只能创建、修改、删除自己创建的文件"效果。

相关推荐
通信小小昕28 分钟前
Ubuntu 26.04 中文输入法安装
linux·运维·ubuntu
张小姐的猫2 小时前
【Linux】网络编程 —— HTTP协议(上)
linux·运维·服务器·网络·http·单例模式·策略模式
栩栩云生2 小时前
AI 写代码犯的错,早被写进了错题集
linux·安全·ai编程
imc.113 小时前
linux基础IO
linux·运维·服务器
BelongPanda5 小时前
Linux Nginx 纯手动 Let‘s Encrypt 泛域名证书配置教程
linux·nginx
酷可达拉斯5 小时前
Linux操作系统-shell编程(0)
linux·运维·服务器·python·云计算
2301_777998346 小时前
Linux中断机制:操作系统如何高效运行
linux·运维·服务器
yunwei376 小时前
eBPF 教程:检查 exec 后真正安装的可执行镜像
linux·开源
笑锝没心没肺6 小时前
yum update 报错:GPG key retrieval failed: [Errno 14] HTTPS Error 404 - Not Found
linux·运维·服务器
AAA@峥7 小时前
CentOS Stream8 基于 Packstack 搭建 OpenStack 云平台全流程实战
linux·centos·openstack