SAMBA

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了SAMBA相关的知识,希望对你有一定的参考价值。

Samba是在Linux和UNIX系统上实现SMB协议的一个免费软件,基于C/S架构。SMB(Server Messages Block,信息服务块)是一种在局域网上共享文件和打印机的一种通信协议,它为局域网内的不同计算机之间提供文件及打印机等资源的共享服务。SMB协议是客户机/服务器型协议,客户机通过该协议可以访问服务器上的共享文件系统、打印机及其他资源。通过设置“NetBios over TCP/IP”使得Samba不但能与局域网络主机分享资源,还能与全世界的电脑分享资源。

一、SAMAB基本概念

1、SMB的基本功能

  • 共享文件和打印,实现在线编辑

  • 实现登录SMB用户的身份认证

  • 可以进行NetBIOS名称解析

  • 外围设备共享

2、SAMAB服务基于协议

(1)、NetBIOS协议

NETBIOS(Network Basic Input/Output System)协议是由IBM公司开发,主要用于数十台计算机的小型局域网。该协议是一种在局域网上的程序可以使用的应用程序编程接口(API),为程序提供了请求低级服务的统一的命令集,作用是为了给局域网提供网络以及其他特殊功能。系统可以利用WINS服务、广播及Lmhost文件等多种模式将NetBIOS名-——特指基于NETBIOS协议获得计算机名称——解析为相应IP地址,实现信息通讯,所以在局域网内部使用NetBIOS协议可以方便地实现消息通信及资源的共享。

NetBIOS特点

  • 占用系统资源少

  • 传输效率高

(2)CIFS协议

CIFS 是一个新提出的协议,它使程序可以访问远程Internet计算机上的文件并要求此计算机提供服务。CIFS 使用客户/服务器模式。客户程序请求远在服务器上的服务器程序为它提供服务。服务器获得请求并返回响应。CIFS是公共的或开放的SMB协议版本,并由Microsoft使用。SMB协议在局域网上用于服务器文件访问和打印的协议。像SMB协议一样,CIFS在高层运行,而不像TCP/IP协议那样运行在底层。CIFS可以看做是应用程序协议如文件传输协议和超文本传输协议的一个实现。

CIFS协议功能

  • 访问服务器本地文件并读写这些文件

  • 与其他用户一起共享一些文件

  • 在短线时自动回复与网络的连接

  • 使用统一码文件名

(3)smb协议

SMB(全称是Server Message Block)是一个协议名,它能被用于Web连接和客户端与服务器之间的信息沟通。SMB最初是IBM的贝瑞·费根鲍姆(Barry Feigenbaum)研制的,其目的是将DOS操作系统中的本地文件接口“中断13”改造为网络文件系统。

3、SAMBA服务文件介绍

(1)samba相关包介绍

samba提供smb服务
samba-client提供客户端工具
samba-common通用软件
cifs-utilssmb客户端工具
samba-winbind和AD相关的包

(2)主配置文件/etc/samba/smb.conf

sbm.conf继承了.ini(initialization)文件格式,用[]分成不同的部分。

配置文件分为类

  • [global]:服务器通过或全局设置的部分

  • [homes]:用户的家目录共享

  • [printers]:定义打印机资源和服务

  • [SHARENAME]:自定义共享目录配置

配置文件宏定义

%m客户端主机的NetBIOS名
%M客户端的FQDN
%H当前用户家目录路径
%U当前用户用户名
%g当前用户所属组
%hsamba服务器的主机名
%Lsamba服务器的NetBIOS
%I客户端主机的IP
%T当前日期和时间
%S可登录的用户名

配置文件选项

workgroup指定工作组名称
server string主机注释信息
netbios name指定NetBIOS名
interface指定服务监听的接口和IP
host allow指定允许指定主机访问,如多个主机可以网段,离散可以使用“,”、空格或tab分离;或使用主机名;默允许所有主机访问。示例192.168.4.
config file=/PAHT/TO/SOMEFIEL/%U用户独立的配置文件
log file=/var/log/samba/log.%m不同主机采用不同日志
max log size日志文件大小,单位为KB
log level设置日志级别
comment注释信息
path所共享的目录路径
public = {yes或no}能否被guest访问的共享,默认为no
guest ok = {yes或no}是否允许来宾账号访问
writable = {yes或no}是否可读写
read only = {yes或no}是否只读,如果与writeable设置冲突,放在后面的设置生效
write list指定多个用户是否可写,格式:@GROUP_NAME、+GROUP_NAME或使用“,”分隔,如设置writable = no 列表中的用户或组可读写,不在列表中的用户只读
vaild users特定用户才能访问此共享,如果设置为空,将允许所有用户;用户名之间使用空格分隔
browsable = {yes或no}是否允许所有用户列浏览此共享,默认为yes
create mask修改上传权限


注意:如果是某个用户对目录有权限,此用户必须有目录权限和共享权限的交集。

服务脚本: /etc/rc.d/init.d/nmb /etc/rc.d/init.d/smb

4、管理命令

(1)testparm:检查smb.conf文件是否正确

格式:

testparm [-s] {config filename} [hostname hostIP]

(2)smbclient 连接SMB/CIFS资源的命令

-I指定服务器的IP地址;
-L显示服务器端所分享出来的所有资源;
-n指定用户端所要使用的NetBIOS名称;
-N不用询问密码;
-p指定服务器端TCP连接端口编号;
-T备份服务器端分享的全部文件,并打包成tar格式的文件;
-U<用户名称>指定用户名称;
-w<工作群组>指定工作群组名称。

(3)mount.cifs依赖于 cifs-utils包;挂载工具

(4)smbpasswd 设置smb用户密码

-a向smbpasswd文件中添加用户;
-c指定samba的配置文件;
-x从smbpasswd文件中删除用户;
-d在smbpasswd文件中禁用指定的用户;
-e在smbpasswd文件中激活指定的用户;
-n将指定的用户的密码置空。

密码文件存在在/var/lib/samba/private/passdb.tdb

(5)pdbedit

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

(6)cifscreds 管理NTLM在内核密钥环中

add:把指定用户的用户名和密码加入内核密钥环

二、实现共享

(1)实现linux为客户端,windows为服务器端共享

在windows系统上创建一个共享目录

选中目录-->右击点属性-->共享

技术分享

点击图中的用户可以设置权限

在linux客户端查看

[[email protected] ~]# smbclient -L 192.168.4.1 -U joah%PASSWORD

技术分享

[[email protected] ~]# smbclient //192.168.4.1/linuxclient -U joah

技术分享

挂载此目录

[[email protected] ~]# mount //192.168.4.1/linuxclient -o username=joah,password=PASSWORD /mnt/samba/

(2)实现linux作服务器端,windows作客户端共享文件

创建smb账号

[[email protected] ~]# useradd -r smb1[[email protected] ~]# useradd -r smb2[[email protected] ~]# useradd -r smb2

设置smb账号密码

[[email protected] ~]# smbpasswd -a smb1[[email protected] ~]# smbpasswd -a smb2[[email protected] ~]# smbpasswd -a smb3

使用命令查看

[[email protected] ~]# pdbedit -L

smb1:496:
smb3:494:
smb2:495:

创建共享目录

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

[sharewin]
        comment = linux share
        path = /app/smbshare

技术分享

弹出对话框输入上述账户和密码即可登录

(3)linux中实现不同用户权限访问共享目录

创建共享目录

[[email protected] ~]# mkdir /app/share{1,2,3}[[email protected] ~]# chmod 777 /app/share{1,2,3}并设置目录权限

编辑配置文件

[[email protected] ~]# vim /etc/samba/smb.conf在全部设置下添加如下一行内容

    config file = /etc/samba/conf.d/%U

创建每个用户的配置文件

[[email protected] ~]# mkdir /etc/samba/conf.d#创建指定配置文件存放位置

[[email protected] conf.d]# vim smb1

[share]
comment = share1
path = /app/share1
writeable = yes

[[email protected] conf.d]# vim smb2

[share]
comment = share2
path = /app/share2

[[email protected] conf.d]# vim smb3

[share]
comment = share3
path = /app/share3

重启服务测试

[[email protected] conf.d]# service nmb restart ;service smb restart

在另一外linux主机上测试

[[email protected] ~]# smbclient -L //192.168.4.55 -U smb1%123456

[[email protected] ~]# smbclient //192.168.4.55/share -U smb1%magedu

挂载共享目录在本地

[[email protected] smb]# mount //192.168.4.55/share /mnt/smb/ -o username=smb1,password=123456

实现开机自动挂载

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

//192.168.4.55/share    /mnt/smb                cifs    username=smb1,password=magedu   0 0

如果我们这样挂载的话,密码直接暴露出来,显然不安装,我们可以将用户和密码写到一个配置文件中

[[email protected] smb]# vim /etc/samba/userpasswd

username=smb1
password=123456

[[email protected] ~]# chmod 600 /etc/samba/userpasswd#修改文件权限

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

//192.168.4.55/share    /mnt/smb                cifs    credentials=/etc/samba/userpasswd       0 0

[[email protected] ~]# mount -a#使挂载生效

[[email protected] ~]# df

Filesystem           1K-blocks    Used Available Use% Mounted on
/dev/sda2             50264772 1632864  46071908   4% /
tmpfs                   502056       0    502056   0% /dev/shm
/dev/sda3             50264772   89224  47615548   1% /app
/dev/sda1               487652   35604    426448   8% /boot
/dev/sr0               3878870 3878870         0 100% /media/cdrom
//192.168.4.55/share  50264772   53092  47651680   1% /mnt/smb  #挂载成功

(4)实现多用户挂载(CentOS 7中可以启用这种方法)

修改配置文件

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

[share]
        comment = sharedirectory
        path = /app/sharedir
        write list = smb1   #设置只有smb1用户具有写权限

创建共享目录并赋予权限

[[email protected] ~]# mkdir /app/sharedir[[email protected] ~]# chmod 777 /app/sharedir

在客户端创建与服务器端相同的账号

注意:客户端与服务器端必须有相同的用户。

[[email protected] ~]# useradd smb1

[[email protected] ~]# useradd smb2

[[email protected] ~]# useradd smb3

使用smb3用户挂载目录

[[email protected] ~]# vim /etc/samba/userpasswd

username=smb3
password=123456

修改/etc/fstab文件

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

//192.168.4.55/share    /mnt/smb                cifs    multiuser,credentials=/etc/samba/userpasswd     0 0
//192.168.4.55/share    /mnt/smb                cifs    credentials=/etc/samba/userpasswd,multiuser     0 0
credentials:用于指定包含挂载用户信息文件
multiuser:用于指定使用多用户挂载

[[email protected] ~]# mount -a#使挂载生效

测试是否可以切换到smb1有写权限

[[email protected]/mnt/smb]#su - smb1[[email protected]~]$cifscreds add 192.168.4.55

Password:

[[email protected]~]$ls /mnt/smb/

anaconda-ks.cfg  xx

至此就实现了多用户挂载smb文件。

本文出自 “Joah” 博客,请务必保留此出处http://merit.blog.51cto.com/10757694/1973784

以上是关于SAMBA的主要内容,如果未能解决你的问题,请参考以下文章

CVE-2017-7494复现 Samba远程代码执行

虚拟机装linux使用samba共享,本地看代码会卡。

Android - 在代码中挂载 Samba 共享

CentOS 7下安装samba

Samba CVE-2017-7494验证实验

如何使用 C# 从 Ubuntu/Samba 读取共享文件?