samba 服務 簡介
1987年,微軟公司和英特爾公司共同制定了SMB(Server Messages Block,服務器消息塊)協議,旨在解決局域網內的文件或打印機等資源的共享問題,這也使得在多個主機之間共享文件變得越來越簡單。到了1991年,當時還在讀大學的Tridgwell為了解決Linux系統與Windows系統之間的文件共享問題,基於SMB協議開發出了SMBServer服務程序。這是一款開源的文件共享軟件,經過簡單配置就能夠實現Linux系統與Windows系統之間的文件共享工作。當時,Tridgwell想把這款軟件的名字SMBServer注冊成為商標,但卻被商標局以SMB是沒有意義的字符而拒絕了申請。后來Tridgwell不斷翻看詞典,突然看到一個拉丁舞蹈的名字—Samba,而且這個熱情洋溢的舞蹈名字中又恰好包含了“SMB”,於是Samba服務程序的名字由此誕生(見圖12-1)。Samba服務程序現在已經成為在Linux系統與Windows系統之間共享文件的最佳選擇。

smb(samba):用於linux和windows之間的文件共享,可以實現匿名用戶和本地用戶之間的文件共享
工作原理:
- smb進程 控制發布共享目錄與權限 tcp 139 445
- nmb進程 主要用於名稱解析 udp 137 138
軟件包及配置文件了解
- 軟件包
[root@centos7-1 ~]# rpm -aq |grep samba //6系統上查看 samba-winbind-clients-3.6.9-164.el6.x86_64 客戶端工具 samba-3.6.9-164.el6.x86_64 服務端 samba-client-3.6.9-164.el6.x86_64 客戶端工具 samba4-libs-4.0.0-58.el6.rc4.x86_64 庫文件 samba-common-3.6.9-164.el6.x86_64 工具包 samba-winbind-3.6.9-164.el6.x86_64 客戶端工具
- 配置文件
[root@courtoap ~]# rpm -ql samba |grep etc // 6系統 /etc/logrotate.d/samba 日志輪轉文件 /etc/pam.d/samba 驗證機制 /etc/rc.d/init.d/nmb 啟動腳本 /etc/rc.d/init.d/smb /etc/samba/smbusers 用戶別名文件 [root@centos7-1 ~]# rpm -ql samba |grep etc // 7系統 /etc/openldap/schema /etc/openldap/schema/samba.schema /etc/pam.d/samba
- 二進制命令
/usr/sbin/nmbd /usr/sbin/smbd[root@centos7-1 ~]# rpm -ql samba-common /etc/samba 主目錄 /etc/samba/smb.conf 主配置文件 /usr/bin/pdbedit 查看smb數據庫用戶 /usr/bin/smbpasswd 設置用戶密碼 /usr/bin/testparm 檢測語法
- 了解主配置文件
cat /etc/samba/smb.conf |grep -v ^#|grep -v '^;'|grep [a-z][root@centos7-1 ~]# cat /etc/samba/smb.conf |grep -v ^#|grep -v '^;'|grep [a-z] [global] workgroup = SAMBA security = user passdb backend = tdbsam printing = cups printcap name = cups load printers = yes cups options = raw [homes] comment = Home Directories valid users = %S, %D%w%S browseable = No read only = No inherit acls = Yes [printers] comment = All Printers path = /var/tmp printable = Yes create mask = 0600 browseable = No [print$] comment = Printer Drivers path = /var/lib/samba/drivers write list = @printadmin root force group = @printadmin create mask = 0664 directory mask = 0775
Samba服務程序中的參數以及作用
| [global] | #全局參數。 | |
| workgroup = MYGROUP | #工作組名稱 | |
| server string = Samba Server Version %v | #服務器介紹信息,參數%v為顯示SMB版本號 | |
| log file = /var/log/samba/log.%m | #定義日志文件的存放位置與名稱,參數%m為來訪的主機名 | |
| max log size = 50 | #定義日志文件的最大容量為50KB | |
| security = user | #安全驗證的方式,總共有4種 | |
| #share:來訪主機無需驗證口令;比較方便,但安全性很差 | ||
| #user:需驗證來訪主機提供的口令后才可以訪問;提升了安全性 | ||
| #server:使用獨立的遠程主機驗證來訪主機提供的口令(集中管理賬戶) | ||
| #domain:使用域控制器進行身份驗證 | ||
| passdb backend = tdbsam | #定義用戶后台的類型,共有3種 | |
| #smbpasswd:使用smbpasswd命令為系統用戶設置Samba服務程序的密碼 | ||
| #tdbsam:創建數據庫文件並使用pdbedit命令建立Samba服務程序的用戶 | ||
| #ldapsam:基於LDAP服務進行賬戶驗證 | ||
| load printers = yes | #設置在Samba服務啟動時是否共享打印機設備 | |
| cups options = raw | #打印機的選項 | |
| [homes] | #共享參數 | |
| comment = Home Directories | #描述信息 | |
| browseable = no | #指定共享信息是否在“網上鄰居”中可見 | |
| writable = yes | #定義是否可以執行寫入操作,與“read only”相反 | |
| [printers] | #打印機共享參數 | |
| comment = All Printers | ||
| path = /var/spool/samba | #共享文件的實際路徑(重要)。 | |
| browseable = no | ||
| guest ok = no 等於 public = no | #是否所有人可見,等同於"public"參數。 | |
| writable = no 等於 read only = yes | ||
| printable = yes | ||
搭建SMB服務
測試默認情況下的共享文件,也就是安裝完軟件直接啟動。不做任何配置文件的修改
服務端:192.168.122.205
[root@centos7-1 ~]# yum install samba [root@centos7-1 ~]# systemctl start smb # 6的啟動命令 service smb restart service nmb restart
客戶端測試查看服務端共享了哪些文件
客戶端:192.168.122.206
[root@centos7-2 ~]# smbclient -L 192.168.122.205 Enter root's password: //此處不輸密碼,直接回車 Anonymous login successful Domain=[SAMBA] OS=[Windows 6.1] Server=[Samba 4.7.1] Sharename Type Comment --------- ---- ------- print$ Disk Printer Drivers IPC$ IPC IPC Service (Samba 4.7.1) Anonymous login successful Domain=[SAMBA] OS=[Windows 6.1] Server=[Samba 4.7.1] Server Comment --------- ------- CENTOS7-1 Samba 4.7.1 Workgroup Master --------- ------- SAMBA CENTOS7-1
服務端:192.168.122.205
創建一個本地用戶 [root@centos7-1 ~]# useradd smb1 將用戶添加到數據庫並且設置密碼 (server端設置) [root@centos7-1 ~]# smbpasswd -a smb1 New SMB password: Retype new SMB password: Added user smb1.
查看smb數據庫的用戶(查看是否成功添加)
[root@centos7-1 ~]# pdbedit -L smb1
smb1:1001:
客戶端:192.168.122.206
查看共享的目錄 [root@centos7-2 ~]# smbclient -L 192.168.122.205 -U smb1 Enter smb1's password: Domain=[SAMBA] OS=[Windows 6.1] Server=[Samba 4.7.1] Sharename Type Comment --------- ---- ------- print$ Disk Printer Drivers IPC$ IPC IPC Service (Samba 4.7.1) smb1 Disk Home Directories Domain=[SAMBA] OS=[Windows 6.1] Server=[Samba 4.7.1] Server Comment --------- ------- CENTOS7-1 Samba 4.7.1 Workgroup Master --------- ------- SAMBA CENTOS7-1 通過smb1用戶登錄 [root@centos7-2 ~]# smbclient //192.168.122.205/smb1 -U smb1 Enter smb1's password: Domain=[SAMBA] OS=[Windows 6.1] Server=[Samba 4.7.1] smb: \> ls . D 0 Thu Nov 15 10:30:04 2018 .. D 0 Thu Nov 15 10:30:04 2018 .mozilla DH 0 Mon Oct 29 12:26:18 2018 .bash_logout H 18 Wed Aug 3 00:00:07 2016 .bash_profile H 193 Wed Aug 3 00:00:07 2016 .bashrc H 231 Wed Aug 3 00:00:07 2016 9447424 blocks of size 1024. 5601668 blocks availabl
實例一
共享本地目錄/samba/share, 並且只允許harry用戶可寫,sysadmin組的成員只讀
服務端:
第1步:創建共享目錄
[root@centos7-1 ~]# mkdir /samba/share -p [root@centos7-1 ~]# echo hello world > /samba/share/t.txt [root@centos7-1 ~]# ls /samba/share/
第2步:創建用戶和組方便后面測試
[root@centos7-1 ~]# useradd harry [root@centos7-1 ~]# groupadd sysadmin [root@centos7-1 ~]# useradd -G sysadmin u1 [root@centos7-1 ~]# useradd -G sysadmin u2
第3步:將創建的用戶添加到smb服務的數據庫並設置密碼
[root@centos7-1 ~]# smbpasswd -a harry New SMB password: Retype new SMB password: Added user harry. [root@centos7-1 ~]# smbpasswd -a u1 New SMB password: Retype new SMB password: Added user u1. [root@centos7-1 ~]# smbpasswd -a u2 New SMB password: Retype new SMB password: Added user u2. [root@centos7-1 ~]# pdbedit -L smb1:1001: u1:1004: harry:1003: u2:1005:
第4步:編輯配置文件進行相應的配置並重啟服務
[root@centos7-1 ~]# vim /etc/samba/smb.conf [share] comment = samba share // 描述 path = /samba/share // 共享的目錄 browseable = yes // 不隱藏標簽 valid users = harry,@sysadmin // 可讀用戶 write list = harry // 可寫用戶 [root@centos7-1 ~]# systemctl restart smb
客戶端測試:
查看共享目錄,可以查看到共享的share目錄
[root@centos7-2 ~]# smbclient -L 192.168.122.205 Enter root's password: Anonymous login successful Domain=[SAMBA] OS=[Windows 6.1] Server=[Samba 4.7.1] Sharename Type Comment --------- ---- ------- homes Disk Home Directories print$ Disk Printer Drivers share Disk samba share IPC$ IPC IPC Service (Samba 4.7.1) Anonymous login successful Domain=[SAMBA] OS=[Windows 6.1] Server=[Samba 4.7.1] Server Comment --------- ------- CENTOS7-1 Samba 4.7.1 Workgroup Master --------- ------- SAMBA CENTOS7-1
測試harry用戶可讀可寫
[root@centos7-2 ~]# smbclient //192.168.122.205/share -U harry Enter harry's password: Domain=[SAMBA] OS=[Windows 6.1] Server=[Samba 4.7.1] smb: \> ls . D 0 Thu Nov 15 11:21:44 2018 .. D 0 Thu Nov 15 11:21:20 2018 t.txt N 12 Thu Nov 15 11:21:44 2018 9447424 blocks of size 1024. 5608576 blocks available smb: \> mkdir 1 NT_STATUS_ACCESS_DENIED making remote directory \1 smb: \>
測試發現harry用戶能夠成功訪問,但是創建文件卻失敗了(原因分析:服務本身已經給定了harry用戶寫的權限,那么就應該是目錄沒有寫的權限)
解決辦法:
服務端給予harry用戶讀寫執行的權限
[root@centos7-1 ~]# setfacl -m u:harry:rwx /samba/share/
客戶端再次測試:
smb: \> mkdir 1 smb: \> ls . D 0 Thu Nov 15 11:32:35 2018 .. D 0 Thu Nov 15 11:21:20 2018 t.txt N 12 Thu Nov 15 11:21:44 2018 1 D 0 Thu Nov 15 11:32:35 2018 9447424 blocks of size 1024. 5609416 blocks available smb: \> get t.txt getting file \t.txt of size 12 as t.txt (0.1 KiloBytes/sec) (average 0.1 KiloBytes/sec) smb: \> 發現harr用戶可以創建文件,和下載文件
測試u1用戶
[root@centos7-2 ~]# smbclient //192.168.122.205/share -U u1 Enter u1's password: Domain=[SAMBA] OS=[Windows 6.1] Server=[Samba 4.7.1] smb: \> ls . D 0 Thu Nov 15 11:32:35 2018 .. D 0 Thu Nov 15 11:21:20 2018 t.txt N 12 Thu Nov 15 11:21:44 2018 1 D 0 Thu Nov 15 11:32:35 2018 9447424 blocks of size 1024. 5609216 blocks available smb: \> mkdir aaa NT_STATUS_MEDIA_WRITE_PROTECTED making remote directory \aaa
測試發現u1用戶能夠成功訪問並且能夠查看,但是創建文件卻失敗了。(原因:配置文件中我們只是允許了harry用戶能夠進行寫,而sysadmin組里面的成員並沒有給寫的權限。所以並不能創建文件)
注意:如果不加可用用戶選項,那么表示當前samba數據庫里面的用戶都可以訪問
實例二
基於用戶名密碼和acl的綜合訪問:
需求:
公司:uplooking
1、財務部門 /samba/upl_cw cw01財務總監有可讀可寫權限,財務部門員工可讀,boss01對其有管理權限。
2、市場部門 /samba/upl_sc 市場部門員工可讀可寫,公司員工可以查詢資料,boss02對其有管理權限。
3、HR部門 /samba/upl_rs rs01HR總監可讀寫,HR部門員工可以對財務部查詢,vip用戶可以查詢
4、休息區 /samba/upl_pub 自己管理自己的文件
思路:
1、選擇哪個服務做文件共享(samba)
2、需要一台Linux服務器(rhel/centos)
3、根據部門創建不同的工作目錄來保存不同部門的文件
4、將目錄發布出去
5、測試驗證
服務器:
第1步:在服務器上創建相應的工作目錄
[root@centos7-1 ~]# mkdir /samba/upl_{cw,sc,rs,pub} -p
第2步:創建相應的用戶和組
[root@centos7-1 ~]# groupadd uplooking [root@centos7-1 ~]# groupadd cw [root@centos7-1 ~]# groupadd rs [root@centos7-1 ~]# groupadd sc [root@centos7-1 ~]# useradd cw01 -g cw -G uplooking [root@centos7-1 ~]# useradd cw02 -g cw -G uplooking [root@centos7-1 ~]# useradd rs01 -g rs -G uplooking [root@centos7-1 ~]# useradd rs02 -g rs -G uplooking [root@centos7-1 ~]# useradd sc01 -g sc -G uplooking [root@centos7-1 ~]# useradd sc02 -g sc -G uplooking [root@centos7-1 ~]# useradd boss01 -g uplooking -G cw [root@centos7-1 ~]# useradd boss02 -g uplooking -G sc [root@centos7-1 ~]# useradd vip
第3步:編輯配置文件進行相應的配置並重啟服務
[root@centos7-1 ~]# vim /etc/samba/smb.conf [cw_share] comment= cw01財務總監有可讀可寫權限,財務部門員工可讀,boss01對其有管理權限 path = /samba/upl_cw valid users = @cw,boss01,@rs write list = cw01,boss01 [sc_share] comment= 市場部門員工可讀可寫,公司員工可以查詢資料,boss02對其有管理權限 path = /samba/upl_sc valid users = @uplooking read only = yes write list = @sc,boss02 [hr_share] comment = rs01HR總監可讀寫,HR部門員工可以對財務部查詢,vip用戶可以讀寫 path = /samba/upl_rs valid users = @rs,vip write list = rs01,vip [pub] comment = 自己管理自己的文件 path = /samba/upl_pub public = yes writable = yes hosts allow = 192.168.122.0/24 [root@centos7-1 ~]# systemctl restart smb
第4步:將用戶加入到samba數據庫里
[root@centos7-1 ~]# smbpasswd -a cw01 New SMB password: Retype new SMB password: Added user cw01. [root@centos7-1 ~]# smbpasswd -a cw02 New SMB password: Retype new SMB password: Added user cw02. [root@centos7-1 ~]# smbpasswd -a rs01 New SMB password: Retype new SMB password: Added user rs01. [root@centos7-1 ~]# smbpasswd -a rs02 New SMB password: Retype new SMB password: Added user rs02. [root@centos7-1 ~]# smbpasswd -a sc01 New SMB password: Retype new SMB password: Added user sc01. [root@centos7-1 ~]# smbpasswd -a sc02 New SMB password: Retype new SMB password: Added user sc02. [root@centos7-1 ~]# smbpasswd -a boss01 New SMB password: Retype new SMB password: Added user boss01. [root@centos7-1 ~]# smbpasswd -a boss02 New SMB password: Retype new SMB password: Added user boss02. [root@centos7-1 ~]# smbpasswd -a vip New SMB password: Retype new SMB password: Added user vip. [root@centos7-1 ~]# pdbedit -L smb1:1001: u1:1004: cw01:1006: harry:1003: u2:1005: cw02:1007: rs01:1008: rs02:1009: sc01:1010: sc02:1011: boss01:1012: boss02:1013: vip:1014:
第5步:相應的acl授權
[root@centos7-1 ~]# setfacl -m u:cw01:rwx /samba/upl_cw/ [root@centos7-1 ~]# setfacl -m u:boss01:rwx /samba/upl_cw/ [root@centos7-1 ~]# setfacl -m g:cw:rx /samba/upl_cw/ [root@centos7-1 ~]# setfacl -m g:sc:rwx /samba/upl_sc/ [root@centos7-1 ~]# setfacl -m g:uplooking:rx /samba/upl_sc/ [root@centos7-1 ~]# setfacl -m u:boss02:rwx /samba/upl_sc/ [root@centos7-1 ~]# setfacl -m u:rs01:rwx /samba/upl_rs/ [root@centos7-1 ~]# setfacl -m g:rs:rx /samba/upl_rs/ [root@centos7-1 ~]# setfacl -m u:vip:rwx /samba/upl_rs/ [root@centos7-1 ~]# setfacl -m g:uplooking:rwx /samba/upl_pub/
客戶端測試驗證:
查看共享目錄
[root@centos7-2 ~]# smbclient -L 192.168.122.205 Enter root's password: Anonymous login successful Domain=[SAMBA] OS=[Windows 6.1] Server=[Samba 4.7.1] Sharename Type Comment --------- ---- ------- homes Disk Home Directories print$ Disk Printer Drivers share Disk samba share cw_share Disk cw01財務總監有可讀可寫權限,財務部門員工可讀,boss01對其有管理權限 sc_share Disk 市場部門員工可讀可寫,公司員工可以查詢資料,boss02對其有管理權限 hr_share Disk rs01HR總監可讀寫,HR部門員工可以對財務部查詢,vip用戶可以讀寫 pub Disk 自己管理自己的文件 IPC$ IPC IPC Service (Samba 4.7.1) Anonymous login successful Domain=[SAMBA] OS=[Windows 6.1] Server=[Samba 4.7.1] Server Comment --------- ------- CENTOS7-1 Samba 4.7.1 Workgroup Master --------- ------- SAMBA CENTOS7-1 詳細測試此處就省略了。。。
samba總結
- SAMBA 可以讓 Linux 與 Windows 直接進行文件系統的使用;
- SAMBA 主要架構在 NetBIOS 上發展的,且以 NetBIOS over TCP/IP 克服NetBIOS 無法跨路由的問題;
- Samba 使用的 daemon 主要有管理分享權限的 smbd 以及 NetBIOS 解析的nmbd
- Samba 使用的模式主要有單機的 workgroup 方式,以及網域控管的 PDC 模式;
- Samba 的主配置文件之檔名為 smb.conf
- smb.conf 內,主要區分為 [global] 服務器整體設定與 [share] 分享的資源兩大部分
- Samba 使用者賬號控管主要的設定值為 security = {share,user,domain}等
- Samba 客戶端可使用 smbclient 以及 mount.cifs 進行網絡的掛載
- 新版的 Samba 默認使用數據庫記錄帳戶信息,新增賬號用 pdbedit ,修改密碼則用 smbpasswd
- Samba 主要支持 CUPS 的打印機服務器
- 在權限控管方面,最容易出錯的為 SELinux 的規則與類型 (SELinux type)
- 默認情況下,服務端會將系統中的所有本地用戶的家目錄共享出去;並且不允許匿名用戶訪問
- 本地用戶都可以通過用戶名和smab數據庫的密碼去訪問當前用戶的家目錄
- samba數據庫里面的用戶必須是當前操作系統中存在的用戶
配置文件:一般放在/etc/samba/smb.conf里面,可以通過rpm -qc packagename查詢;編輯完配置文件可以通過testparm來進行samba的確認。
常用命令
將本地用戶加入到smb數據庫里
# smbpasswd -a stu1 // 將用戶添加到數據庫並且設置密碼
查看smb數據庫的用戶
# pdbedit -L //查看smb數據庫的用戶
查看共享目錄:客戶端通過smbclient命令查看服務器共享出什么目錄
smbclient -L NetBiosName -U username
linux客戶端訪問
# smbclient //192.168.122.205/homes -U smb1 // 通過smb1用戶訪問homes
清空windows緩存
cmd——>net use * /del
訪問權限控制
控制讀寫訪問
writable = yes/no // 可寫總開關 read only = yes/no // 可讀總開關 write list = tom,@admin // 可讀 多個用戶用逗號隔開 加個@符號對組的控制 read list = tom,@admin // 可寫
對象的訪問控制
valid users = tom,@admin // 指定可用用戶 invalid users = tom,@admin // 指定不可用用戶 注意:兩個參數不要同時存在
網絡訪問控制
hosts allow = 150.203.6.0/255.255.255.0 EXCEPT 150.203.6.66 // 允許哪個網絡里的訪問,表示150.203.6.0這個網段除了150.203.6.66這個用戶不能訪問,別的都能訪問 hosts allow = 150.203.15.0/255.255.255.0 hosts allow = *.uplooking.com hosts deny = 192.168.1.3 vm01.example.com // 拒絕哪個網絡的訪問 如果deny和allow沖突,allow優先
