2009年3月27日 星期五

以samba建立小型檔案共享環境

samba是與其他非unix作業系統共享資源最直接的方式,配置他的方式也非常簡單。本文主要目的是為了建置小型工作站的檔案共享環境所寫的筆記,內容包含如何安裝、配置及管理samba伺服器,掛載linux或windows所分享的filesystem。

需求:

每個使用者可以存取自己的家目錄,其他使用者連瀏覽的權限也沒有。
一個可以匿名讀寫的目錄。
一個唯讀的目錄。

一、安裝所需的套件:

aptitude install samba swat smbfs smbclient xinetd -y
其中xinetd是為了使用swat而安裝的,如果你沒有圖形化配置samba的需求,可以省去swat跟xinetd這兩個套件。安裝完成會有以下訊息:
--------- IMPORTANT INFORMATION FOR XINETD USERS ----------
The following line will be added to your /etc/inetd.conf file:

swat\t\tstream\ttcp\tnowait.400\troot\t/usr/sbin/tcpd\t/usr/sbin/swat

If you are indeed using xinetd, you will have to convert the
above into /etc/xinetd.conf format, and add it manually. See
/usr/share/doc/xinetd/README.Debian for more information.
Suggested entry (automatically converted using itox):

service swatttstreamttcptnowait.400troott
{
type            = RPC
rpc_version     = usr/sbin/tcpdt/usr/sbin/swat
Line 1: socket type missing
-----------------------------------------------------------
我們先記錄下來,等一下再來處理他。
規劃上:
/home/username   每個使用者需透過認證存取家目錄。
/opt/share_only    匿名使用者也可以瀏覽,屬性唯讀。
/opt/upload_free   匿名使用者可以有讀取權限。

二、samba配置:

samba主要設定檔是在/etc/samba/smb.conf。大致上可以看到兩個主要的區塊: [global]區塊 跟整個samba設定環境有關。 [global]以外區塊 跟個別資料夾分享的詳細設定有關。
重要的[global]如下:
workgroup = windowsrshit
#宣告這台samba的工作群組
server string = Debian server
#別人從網芳看到的註解名稱,可寫可不寫。
security = user
#security參數非常重要,如果設定成share,則是最寬鬆的設定權限,可以允許匿名使用者進入;如果是要供本機使用者密碼認證登入,請改成user。
netbios name = homedebian
#Windows上的主機名稱其實就是netbios name,因此這個名稱可以供windows使用者搜尋到你的機器;不寫也沒關係,你的主機名稱就是你的netbios name。
unix charset = utf-8
#unix類的主機以utf-8編碼來顯示samba分享內容。
dos charset=cp950
#windows的機器可以以big5來顯示內容。
hosts allow = 192.168.1.0/255.255.255.0
我設定samba只允許內部網路分享。假設每台linux工作站都要有一個public ip,那麼可以每張網路卡都各捆綁一個private ip來達成此目的。
lanman auth = yes
client lanman auth = yes
#server端跟client端都使用lanman認證。
重要的資料分享區塊如下:
[homes]
comment = Home Directories
#只是註解
browseable = no
#此參數是讓非%S(登入的使用者)在網路上看不到這個資料夾
read only = no
#當然要可以寫入啦
create mask = 0600
directory mask = 0700
#使用者新增檔案,其權限為600;新增目錄其權限為700;無suid/sgid/stick bit設定。
inherit acls = yes
#ACL規則會繼承。如果有設定extend acl的話才有影響,其規則會凌駕上面的mask設定;若沒有acl規則則可以不理會他。
valid users = %S
#允許登入的名單。%S表示目前正在登入的使用者
以上,是完成了在linux主機上所有使用者存取家目錄的設定。我們來建立兩個共享資料夾,一個可以允取匿名存取,一個只允許唯讀。
[share_only]
comment = a share only folder for our lab
public = yes
path = /export/share_only
browseable = yes
#其中的public = yes可以寫成guest ok = yes

[upload_free]
comment = an upload permitted folder for our lab
public = yes
path = /export/upload_free
browseable = yes
writable = yes
write list = @research, @student
#只允許research跟student群組的寫入,其他人仍保持唯讀。
儲存後,請記得samba的權限還是脫離不了filesystem的權限,允許上傳的目錄需要開放其他使用者也能讀寫:
chmod 777 /export/upload_free
建立samba使用者: samba預設的使用者跟系統的使用者是分開的,然而新增samba的使用者必須依賴於/etc/passws裡面有的使用者名稱才行。
smbpasswd -a maxsolar
-a表示新增使用者。往後若欲修改密碼,只要使用smbpasswd maxsolar就可以了。這裡需注意samba密碼跟系統密碼由於安全性因素,並不同步,請注意。如果你有密碼同步的需求,請參考Debian下實現samba密碼與系統密碼同步。 請務必利用testparm來檢查我們寫在/etc/samba/smb.conf的語法是否有錯,並且確定samba服務是不是同時有跑起來:
invoke-rc.d samba restart
你現在可以從windows上存取linux的samba服務。

三、從linux存取samba服務:
圖形介面上,應該已經可以存取windows或是linux所分享的資料了。那麼文字介面如何存取呢?
A.查詢分享中的資料夾:

有時候我們真的很懶,把主機名稱跟ip對應表寫好後,就完全把ip給忘記了;我們又很懶不願意去查ip,該怎麼辦呢?我們可以使用nmblookup:

nmblookup HOSTNAME
你就可以輕易的取得一個ip位置。接下來要查看他分享了哪些資料夾出來,你應該這麼作:
smbclient -L IP_address
會被提示要求輸入你目前使用者的密碼,或是你可以用-U來指定一個使用者
smbclient -U mary -L IP_address
顯示的結果會根據你所輸入的帳號密碼而有不同的結果。
Anonymous login successful
Domain=[WORKGROUP] OS=[Unix] Server=[Samba 3.2.5]

Sharename       Type      Comment
---------         ----         -------
print$          Disk      Printer Drivers
share_only      Disk      a share only folder for our lab
upload_free     Disk      an upload permitted folder for our lab
IPC$            IPC       IPC Service (homedebian server)
Anonymous login successful
Domain=[WORKGROUP] OS=[Unix] Server=[Samba 3.2.5]

Server          Comment
---------            -------
HOMEDEBIAN      homedebian server

Workgroup       Master
---------            -------
WORKGROUP       MOTD945
以此為例,我並沒有輸入我maxsolar的密碼,此時我被當成是guest,因此我也看不見自己所分享出來的[homes]家目錄。但是guest身份可以看到兩個分享的資料夾。你也可以發現此時的MOTD945是wins server。

B.取得一個shell:
smbclient //HOSTNAME/share_only
#以目前身份取得smb的shell
smbclient //IP_address/upload_free -U username
在此shell下的命令跟ftp差不多,可以利用"?"或是help來查詢。

C.掛載網芳或是samba filesystem:
1.手動掛載:
mount -t cifs //HOSTNAME/分享位置 /掛載位置
#這是最基本的語法
mount.cifs -o username=maxsolar,password=mypasswd //HOSTNAME/分享位置 /掛載位置
#這是包含帳號密碼的寫法。這樣明目張膽的把密碼寫在上面實在是很不妥@@,建議寫在fstab裡。
2.開機自動掛載: 在/etc/fatab裡,你可以這樣寫:
//HOSTNAME/分享位置 /掛載位置 cifs defaults 0 0
要搭配帳號密碼的使用,你可以這樣寫:
//HOSTNAME/分享位置 /掛載位置 cifs credential=/密碼設定檔絕對路徑,uid=maxsolar 0 0
密碼檔規格如下:
username=使用者帳號
password=登入密碼
workgroup=所屬群組
掛載後,client端的maxsolar有讀寫權限。

四、以SWAT管理samba daemon: 安裝好swat預設還是不能用,實在不是很便民。我們知道swat服務需要依靠xinetd來啟動,筆者查詢了ubuntu論壇的討論串,把解決的過程分享給大家! swat會在舊版的inetd上面跑,但是現在實在沒人在使用他了!我們應該要把他改寫成xinetd的格式(如同本文最上面的警告訊息): 新增/etc/xinetd.d/swat:

# description: Samba_SWAT
service swat
{
disable = no
socket_type = stream
protocol = tcp
#should use a more limited user here
user = root
wait = no
server = /usr/sbin/swat
}
當然你需要重新啟動xinetd!
invoke-rc.d xinetd restart
你現在可以在瀏覽器上輸入:http://localhost:901 會被提示輸入root的帳號密碼,登入後進去就可以看到非常多可以用的選項了。

後記: swat是英文版的,很多人會望之卻步;他的可用設定多如牛毛,但是我還是建議安裝他。因為他每個設定值都有一個help的連結,他會很詳細的告訴你該參數設定的意義跟效果,我認為學習的效果很好,因此建議大家可以安裝來玩。

沒有留言: