Samba是在Linux和UNIX系統上實現SMB協議的一個免費軟件,由服務器及客戶端程序構成。
以下通過兩個基礎實驗來學習samba,實驗平臺爲Centos 6.2,環境爲:
Samba服務器
主機名:luffy IP地址:192.168.56.53
客戶端測試機
主機名:zoro IP地址:192.168.56.54
實驗一
假設公司有一臺samba服務器,提供了一個共享名爲/share的共享目錄,現在要求只允許192.168.56.0網段的用戶可以使用自己的samba帳戶登錄此目錄,並可讀寫,但不允許動別人的資料。
一、準備工作
1.創建用戶user1、user2,並在根目錄下創建共享文件夾share及其共享文件,其中share的文件夾屬性爲777。
創建結果如下:
[root@luffy ~]# cat /etc/passwd
……省略部分內容……
user1:x:502:502::/home/user1:/bin/bash
user2:x:503:503::/home/user2:/bin/bash
[root@ luffy ~]# ls -l /share
total 8
-rw-r--r--. 1 root root 4 May 24 06:41 a
-rw-r--r--. 1 root root 4 May 24 06:41 b
[root@ luffy ~]# ls -ld /share
drwxrwxrwx. 2 root root 4096 May 24 06:41 /share
2.安裝samba軟件
[root@luffy ~]# yum install samba*
Samba*涉及到的組件是samba,samba-common,samba-client
其中samba必需安裝,後面兩個在裝系統時其實已默認安裝(因此其他linux客戶端可以直接使用smbclient命令訪問samba的共享文件夾)。
3.添加samba用戶
Samba中添加的用戶,必須是samba服務器所在系統中預先創建的,但該用戶登錄samba時使用的密碼,需由samba創建並保存。
使用到的命令是smbpasswd,參數-a表示添加用戶,-x表示刪除用戶,-d表示禁用用戶。
下面將user1和user2加入到samba中,
[root@ luffy ~]# smbpasswd -a user1
New SMB password:
Retype new SMB password:
Added user user1.
[root@ luffy ~]# smbpasswd -a user2
New SMB password:
Retype new SMB password:
Added user user2.
二、配置共享
在服務器SELinux開啓(Enforcing狀態)的情況下,進行以下實驗。
1.在samba主配文件/etc/samba/smb.conf末尾添加以下內容:
[share] comment = sharefile #描述信息 path = /share #指定共享文件夾的路徑 hosts allow = 192.168.56. #允許訪問該目錄的網段 browseable=yes #可瀏覽 writable = yes #可寫
注,hosts allow字段如果不寫,則表示所有可訪問該服務器的客戶端都可訪問該共享目錄。在本實驗和許多實際環境中,都是內網共享,只有同網段的內網用戶纔可訪問,“hosts allow=本網段”其實不需要寫。
另外,主配文件第100行附近,
security = user #smb passwd file = /etc/samba/smbpasswd passdb backend = tdbsam
表示,當前(默認)使用的是user認證方式,即客戶端需要有samba中記錄的用戶及其密碼才能登錄,如果是security = share,則表示採用匿名登錄方式。
配置修改完成後,重啓samba服務,
[root@luffy ~]# service smb restart
客戶端訪問時,報錯:
[root@zoro ~]# smbclient //192.168.56.53/share -U user1
Enter user1's password:
Domain=[MYGROUP] OS=[Unix] Server=[Samba 3.6.9-151.el6]
smb: \> ls
NT_STATUS_ACCESS_DENIED listing \*
40317 blocks of size 262144. 31467 blocks available
smb: \> quit
沒有訪問權限,是由於請求被selinux攔截了。
(注:如果是出現NT_STATUS_BAD_NETWORK_NAME的報錯,大概是因爲主配文件中定義共享文件塊時,中括號裏的名字出錯,訪問路徑//192.168.56.53/share中的share不是指根目錄中的share文件夾,而是主配文件中自定義的[share]中括包內的share。)
2.服務器端對samba共享目錄修改安全上下文,使用chcon命令
[root@luffy ~]# ls -ldZ /share
drwxr-xr-x. root root system_u:object_r:default_t:s0 /share
[root@luffy ~]# chcon -t samba_share_t /share
[root@luffy ~]# ls -ldZ /share
drwxr-xr-x. root root system_u:object_r:samba_share_t:s0 /share
客戶端再訪問,就正常了
[root@zoro ~]# smbclient //192.168.56.53/share -U user1
Enter user1's password:
Domain=[MYGROUP] OS=[Unix] Server=[Samba 3.6.9-151.el6]
smb: \> ls
. D 0 Fri May 24 06:41:33 2013
.. DR 0 Fri May 24 06:18:56 2013
a 4 Fri May 24 06:41:26 2013
b 4 Fri May 24 06:41:33 2013
40317 blocks of size 262144. 31466 blocks available
smb: \>
smb: \> rm a
smb: \> ls
. D 0 Fri May 24 06:45:54 2013
.. DR 0 Fri May 24 06:18:56 2013
b 4 Fri May 24 06:41:33 2013
40317 blocks of size 262144. 31466 blocks available
smb: \>quit
從以上操作還可以看到,此時user1可以刪除其root創建的文件a(因爲文件夾share的權限被設成了777)。即user1可以動其他人的文件,這不符合要求。
3.服務器端對共享目錄設置特殊權限
[root@luffy ~]# chmod o+t /share
這裏的t,指sticky bit,可以理解爲防刪除位. 一個文件是否可以被某用戶刪除,主要取決於該文件所屬的組是否對該用戶具有寫權限。如果沒有寫權限,則這個目錄下的所有文件都不能被刪除,同時也不能添加新的文件。如果希望用戶能夠添加文件,但同時不能刪除文件,則可以對文件使用sticky bit位。設置該位後, 就算用戶對目錄具有寫權限, 也不能刪除該文件。(這話理解起來有點費勁~)
此時客戶端登錄便不可以刪除其他用戶的文件了,但刪除自己的文件沒問題。
[root@zoro ~]# smbclient //192.168.56.53/share -U user1
Enter user1's password:
Domain=[MYGROUP] OS=[Unix] Server=[Samba 3.6.9-151.el6]
smb: \> ls
. D 0 Fri May 24 06:45:54 2013
.. DR 0 Fri May 24 06:18:56 2013
b 4 Fri May 24 06:41:33 2013
40317 blocks of size 262144. 31465 blocks available
smb: \> rm b
NT_STATUS_ACCESS_DENIED deleting remote file \b
smb: \> rmdir user1
smb: \>quit
三、將共享文件加載到客戶端本地進行操作
客戶端使用smbclient遠程訪問共享目錄時,操作指令是有限的(通過help命令可以查看),touch命令就不可用。爲做進一步驗證,要將共享目錄加載到本地,再進行相關操作。
通過mount cifs方式進行加載。
1.先使用user1掛載、操作:
[root@zoro ~]# mount -t cifs 192.168.56.53:/share /mnt/ -o username=user1
Password:
[root@zoro ~]# cd /mnt
[root@zoro mnt]# ls
b
[root@zoro mnt]# mkdir user1
[root@zoro mnt]# vim user1/1
user111 (注,這個是輸入的內容)
[root@zoro mnt]# ll
total 4
-rw-r--r-- 1 root root 4 May 24 06:41 b
drwxr-xr-x 2 502 502 0 May 24 07:02 user1
[root@zoro mnt]# ll user1/
total 4
-rw-r--r-- 1 502 502 8 May 24 07:02 1
[root@zoro mnt]# cd
[root@zoro ~]# umount -t cifs 192.168.56.53:/share /mnt/
umount: /mnt: not mounted
2.再用user2掛載、操作:
[root@zoro ~]# mount -t cifs 192.168.56.53:/share /mnt/ -o username=user2%redhat
(注,這行命令,直接把user2的samba密碼redhat也寫出來了)
[root@zoro ~]# cd /mnt
[root@zoro mnt]# ls
b user1
[root@zoro mnt]# ls user1/
1
[root@zoro mnt]# cat user1/1
user111
[root@zoro mnt]# rm -rf user1/
rm: cannot remove `user1/1': Permission denied
[root@zoro mnt]# rm -rf b
rm: cannot remove `b': Permission denied
[root@zoro mnt]#
[root@zoro mnt]# touch 2
[root@zoro mnt]# cd
[root@zoro ~]# umount -t cifs 192.168.56.53:/share /mnt/
umount: /mnt: not mounted
可以看到,user2是沒有權限刪除或更改其他用戶的文件的,但可以創建屬於自己的文件。
實驗二
公司的IT部門有it1、it2兩個成員,他們可以登錄到自己部門的共享目錄進行讀寫操作,上傳的文件的權限爲640,且只允許他們之間讀取文件,但不可以修改對方的文件。
一、準備工作
1.創建用戶it1、it2和用戶組it,並將it1和it2加入到用戶組it。
2.創建共享目錄/it,將其權限屬性置爲777,並使用chcon -t samba_share_t /it命令修改其安全上下文(本實驗仍然在SELinux開啓的情況下進行測試)。
3.將用戶it1、it2加入到samba服務器
[root@luffy ~]# smbpasswd -a it1
New SMB password:
Retype new SMB password:
Added user it1.
[root@luffy ~]# smbpasswd -a it2
New SMB password:
Retype new SMB password:
Added user it2.
二、配置共享
1. 在主配文件/etc/samba/smb.conf末尾添加以下內容:
[it] comment = it dept. path = /it browseable=yes writable = yes valid users = @it #指定允許訪問的用戶組爲it,注意@符號 create mask = 640 #指定新創建的文件的權限爲640 directory mask = 750 #指定新創建的文件夾的權限爲750 group = it #指定新創建的文件(夾)的用戶組爲it,這裏沒有@
配置修改完成後,重啓samba服務,
[root@luffy ~]# service smb restart
2.客戶端訪問
[root@zoro ~]# smbclient //192.168.56.53/it -U user1
Enter user1's password:
Domain=[MYGROUP] OS=[Unix] Server=[Samba 3.6.9-151.el6]
tree connect failed: NT_STATUS_ACCESS_DENIED
[root@zoro ~]# smbclient //192.168.56.53/it -U it1
Enter it1's password:
Domain=[MYGROUP] OS=[Unix] Server=[Samba 3.6.9-151.el6]
smb: \> quit
[root@zoro ~]# smbclient //192.168.56.53/it -U it2
Enter it2's password:
Domain=[MYGROUP] OS=[Unix] Server=[Samba 3.6.9-151.el6]
smb: \> ls
. D 0 Mon May 27 05:40:45 2013
.. DR 0 Mon May 27 05:40:45 2013
40317 blocks of size 262144. 31463 blocks available
smb: \> quit
從以上連接可以看出,只有屬於it用戶組的用戶纔有訪問/it的權限。
三、將共享文件加載到客戶端本地進行操作
1.使用it1登錄、掛載,創建文件(夾)
[root@zoro ~]# mount -t cifs 192.168.56.53:/it /mnt/ -o username=it1%redhat
[root@zoro ~]# cd /mnt
[root@zoro mnt]# mkdir it01
[root@zoro mnt]# vim it01/a
this is file a (注,這個是輸入的內容)
[root@zoro mnt]# ls -ld it01/
drwxr-x--- 2 504 506 0 May 27 06:35 it01/
[root@zoro mnt]# ls -ll it01/
total 4
-rw-r----- 1 504 506 15 May 27 06:35 a
[root@zoro mnt]# cd
[root@zoro ~]# umount -t cifs 192.168.56.53:/it /mnt/
umount: /mnt: not mounted
注:由於在配置文件中,對/it的共享設置,指定了create mask = 640和directory mask = 750,所以創建的文件和文件夾,都是用戶組成員有讀(執行)權限,其他人沒有任何讀寫權限。
另外,由於/it的共享設置裏有group = it這一行,it1無論是創建文件或文件夾,其所屬用戶組都是it1(504)所在的用戶組it(506)。這裏因爲是遠程掛載的,使用ll命令只能看到用戶id。
下面使用it2訪問時,由於it2也在it組裏,所以it2對文件夾it01的r-x權限,對文件a有r--權限。
2.使用it2登錄、掛載,進行驗證
[root@zoro ~]# mount -t cifs 192.168.56.53:/it /mnt/ -o username=it2%redhat
[root@zoro ~]# cd /mnt
[root@zoro mnt]# ls
it01
[root@zoro mnt]# ls it01/
a
[root@zoro mnt]# cat it01/a
this is file a
[root@zoro mnt]# rm -rf it01
rm: cannot remove `it01/a': Permission denied
[root@zoro mnt]# rm -rf it01/a
rm: cannot remove `it01/a': Permission denied
[root@zoro mnt]# touch it01/b
touch: cannot touch `it01/b': Permission denied
以上可以看出,it2可以讀it1的文件(夾),但卻沒有權限刪除和修改(使用vim編輯it01/a時,會被提示不能修改)。
在上述配置文件中,如果對/it的共享設置,指定了create mask = 640和directory mask = 750,卻沒有添加group = it,那麼it1創建的文件和文件夾,其用戶組都是it1,此時it2屬於其他人,是沒有讀寫權限的。