前言:
Windows 的系統透過 SMB (Session Message Block protocol, 也叫做 NetBIOS 或 LanManager protocol.) ,來進行檔案分享的傳輸協定,而 samba 是在 Linux 系統下使用 SMB (NetBIOS) 協定來進行檔案分享的傳輸方式.也因此藉由 samba 來讓 Windows 與 Linux 系統的檔案能夠使用同一種方式來進行分享. Windows 與 Linux 之間 SMB /NMB 協定關聯如下圖所:
那什麼是 SMB(NetBIOS)呢!!下面可以看到這個協定的演化過程.
NetBIOS
最早由 IBM 開發出來的 NetBIOS API(Network Basic Input/Output System Application Program Interface),這個 NetBIOS 由 18 個 API 組成,可以用來命令當時的電腦建立連線服務. 因為 NetBIOS 使用廣播(broadcasts)來傳送資料.也因此資料無法繞送(routed).所以只能用在小型網路中傳輸.NetBIOS 屬於 session layer protocol(第5層,交談層)
NetBEUI
接下來就有了NetBIOS的改良版,NetBEUI(NetBIOS Extened User Interface),不過他已經是一個完整的傳輸協定了.NetBEUI 屬於 data-link layer protocol (第2層,資料連結層).
SMB(NetBIOS)
Windows NT4.0 之前的網路芳鄰(檔案和印表機分享),名稱解析(wins)...皆是使用 NetBIOS over NetBEUI所實而做成.後來的 NetBIOS 也可以 over TCP/IP 如 Windows 2000 的網路芳鄰(檔案和印表機分享), Linux 的 samba server or NETBIOS over IPX(Internetwork Packet Exchange) 如 NT 下的 NWLINK
note:
1.使用廣播的方式傳遞資料,在遇到 Roter 時, Router 是會直接將此封包丟棄.原因是不能讓這種封包傳送到 InterNet 上,而產生無限封包.
2.NetBEUI 屬於 data-link layer protocol (第2層,資料連結層)
Samba 的官方網站為 http://www.samba.org
RHEL5 - Samba (二) 認識 samba 設定檔
首先檢查 samba 是否安裝,一般在光碟 /Server 目錄都可以找到 samba 的 rpm 檔案或是可以透過 yum 去下載.
[root@benjr ~]# rpm -aq | grep samba samba samba-common samba-client system-config-samba |
安裝 samba 在 RedHat 光碟片中的目錄 /Server 可以找到所需的程式
[root@benjr ~]# rpm -ivh samba-common.rpm [root@benjr ~]# rpm -ivh samba-client.rpm [root@benjr ~]# rpm -ivh samba.rpm [root@benjr ~]# rpm -ivh system-config-samba |
檢查 samba 服務是否在開機時一並啟動
[root@benjr ~]# chkconfig smb on [root@benjr ~]# chkconfig --list smb smb 0:off 1:on 2:on 3:on 4:on 5:on 6:off |
立即啟動 samba 服務
[root@benjr ~]# service smb start Starting SMB services: [ OK ] Starting NMB services: [ OK ] |
RHEL 5 提供了 #system-config-samba 工具可以讓我們很方便針對 samba 做設定,不過這一隻工具主要都還是去修改 samba 的設定檔 /etc/samba/smb.conf ,所以我們先來看看 samba 的設定檔.
[root@benjr ~]# cat /etc/samba/smb.conf #======================= Global Settings ===================================== [global] workgroup = mygroup server string = Samba Server Version %v netbios name = benjr [printers] |
設定檔主要可以分成兩個區塊
1.[global] 中主要設定整個 samba 系統的組態
其中的 [global] 的 security 決定身份驗證要由誰處理,samba 3.X 提供了五種安全等級可設定
2.[share] 中都是要分享的檔案目錄以及印表機
/etc/samba/ 目錄 相關的檔案
[root@benjr ~]# ll /etc/samba/ total 52 -rw-r--r-- 1 root root 20 Apr 3 2008 lmhosts -rw------- 1 root root 4096 Apr 12 06:59 passdb.tdb -rw------- 1 root root 8192 Apr 12 06:59 secrets.tdb -rw-r--r-- 1 root root 10043 Apr 14 03:37 smb.conf -rw-r--r-- 1 root root 97 Apr 3 2008 smbusers |
1."/etc/samba/lmhosts" 存放 NetBIOS name 與 IP 相對應關係
2."/etc/samba/passdb.tdb" 存放使用者登入 samba server 時所需的使用者帳號以及密碼
3."/etc/samba/secrets.tdb" 存放 samba 的密碼檔
4."/etc/samba/smb.conf" samba 的設定檔
5."/etc/samba/smbusers" UNIX name 與 samb name 相對應關係
最早的 samba 的使用者帳號密碼是存成成文字檔 /etc/samba/smbpassword ,對於較少使用者的 samba server 並不會有太大的問題,但是當使用者眾多時就會有以下的問題產生:
1.查詢是循序進行,所以效能將會是瓶頸.
2.每一台 samba server 必須自己維護 smbpasswd 檔,當有多台 samba server 帳號的同步就是問題了.
3.smbpasswd 檔的格式限制了每個使用者可以維護的屬性.
4.除了可以增加效能外還可以同步多台的 samba server 帳號密碼,
也因此在 RHEL5 帳號密碼皆是以資料庫的形式做儲存,這樣會較符合企業用戶的需求.除了預設的 tdbsam(.tdb) 的資料庫外 Samba 提供下面多種方式,甚至於跟 LDAP 目錄服務結合.
1.Plain Text: :
2.smbpasswd : Encrypted Password Database
3.tdbsam:
4.ldapsam:
5.MySQL:
6.XML:
RHEL5 - Samba (三) samba 相關的指令
RHEL 5 除了提供了 #system-config-samba 工具外 samba 還提供了很多工具來幫助我們除錯相關的指令如下:
nmblookup : 查詢 NetBIOS 所對應的 IP addresses
[root@benjr ~]# nmblookup benjr querying benjr on 192.8.1.255 192.8.1.85 benjr<00> |
smbstatus : 查詢 samba server 分享資源被使用的情況
[root@benjr ~]# smbstatus Samba version 3.0.28-0.el5.8 Service pid machine Connected at Locked files: |
testparm : 如果你是習慣使用文字編輯器去修改 /etc/samba/smb.conf 檔案時,Samba 提供了一之程式 testparm 來驗證檢查 /etc/samba/smb.conf 設定檔是否正確,有無拼錯字等問題.
[root@benjr ~]# testparm /etc/samba/smb.conf Load smb config files from /etc/samba/smb.conf Processing section "[homes]" Processing section "[printers]" Loaded services file OK. Press enter to see a dump of your service definitions .....................略............................ |
進階使用還可以指定其他 samba server 的設定檔
[root@benjr ~]# testparm /etc/samba/smb.conf 192.13.9.9 |
smbclient : 查詢 samba server 提供哪些分享目錄
[root@benjr ~]# smbclient -L benjr Password: Domain=[MYGROUP] OS=[Unix] Server=[Samba 3.0.28-0.el5.8] Sharename Type Comment Server Comment Workgroup Master |
"mount or smbmount" :mount smaba 所提供的 share 目錄
[root@unsvr root]# mount -t smbfs //benjr/share /mnt Password: [root@unsvr root]# smbmount //benjr/share /mnountpoint Password: |
RHEL5 - Samba (四) 防火牆(iptables)
[root@benjr ~]#system-config-securitylevel |
信任服務: 就是只有哪些服務可以透過防火牆(iptables)下的情況還繼續工作.
只要開啟我們想要開放的 port 即可,基本上要開的 port 也只有 SMB /NMB 而已其他你可以依據需求來開啟.預設是沒有選項可以勾選你可以透過其他連接阜做設定.要開啟的也只有NetBIOS (UDP ports 137 and 138, TCP ports 139) 和 TCP port 445 for SMB file sharing without NetBIOS.
如果你是透過遠端的 SSH 這邊還有一個可以在 Text mode 下執行的.
[root@benjr ~]#system-config-securitylevel-tui |
因為設定方式差不多,所以這裡就不多加以說明了.而設定檔會存放在 /etc/sysconfig/iptables
[root@benjr ~]# cat /etc/sysconfig/iptables # Firewall configuration written by system-config-securitylevel # Manual customization of this file is not recommended. *filter :INPUT ACCEPT [0:0] :FORWARD ACCEPT [0:0] :OUTPUT ACCEPT [0:0] :RH-Firewall-1-INPUT - [0:0] -A INPUT -j RH-Firewall-1-INPUT -A FORWARD -j RH-Firewall-1-INPUT -A RH-Firewall-1-INPUT -i lo -j ACCEPT -A RH-Firewall-1-INPUT -i ppp0 -j ACCEPT -A RH-Firewall-1-INPUT -i eth0 -j ACCEPT -A RH-Firewall-1-INPUT -p icmp --icmp-type any -j ACCEPT -A RH-Firewall-1-INPUT -p 50 -j ACCEPT -A RH-Firewall-1-INPUT -p 51 -j ACCEPT -A RH-Firewall-1-INPUT -p udp --dport 5353 -d 224.0.0.251 -j ACCEPT -A RH-Firewall-1-INPUT -p udp -m udp --dport 631 -j ACCEPT -A RH-Firewall-1-INPUT -m state --state ESTABLISHED,RELATED -j ACCEPT -A RH-Firewall-1-INPUT -m state --state NEW -m udp -p udp --dport 137 -j ACCEPT -A RH-Firewall-1-INPUT -m state --state NEW -m udp -p udp --dport 138 -j ACCEPT -A RH-Firewall-1-INPUT -m state --state NEW -m tcp -p tcp --dport 139 -j ACCEPT -A RH-Firewall-1-INPUT -m state --state NEW -m tcp -p tcp --dport 445 -j ACCEPT -A RH-Firewall-1-INPUT -j REJECT --reject-with icmp-host-prohibited COMMIT |
說明:
下面是有關於 samba 的要開啟的 port.
-A RH-Firewall-1-INPUT -m state --state NEW -m udp -p udp --dport 137 -j ACCEPT
-A RH-Firewall-1-INPUT -m state --state NEW -m udp -p udp --dport 138 -j ACCEPT
-A RH-Firewall-1-INPUT -m state --state NEW -m tcp -p tcp --dport 139 -j ACCEPT
-A RH-Firewall-1-INPUT -m state --state NEW -m tcp -p tcp --dport 445 -j ACCEPT
如果要開機時就啟動 iptables ,使用下面這個指令,就會在每次開機時啟動 iptables .
[root@benjr ~]#chkconfig iptables on |
當然我不希望現在再重開機所以直接用下面的指令將 iptables 打開.
[root@benjr ~]#service iptables start Starting httpd [OK] |
將目前的 iptables 設定儲存下來
[root@benjr ~]#/sbin/service iptables save #會將設定檔儲存在 /etc/sysconfig/iptables |
RHEL5 - Samba (五) 身分驗證的種類
目前 RHEL5 使用的 samba 版本為 3.X,而 samba 3.X 提供了五種不同的身分驗證模式
那我們就來看看這五種不同模式的 samba server 要怎麼樣來與現有的 Windows 網域結合
1.Share Level Security : 不使用密碼做身份驗證
security = share
2.User Level Security : 本身這台 samba server 做身份驗證,這也是設定檔的預設值
security = user
3.Server Security : 交由其他台 Windows NT/2000/2003 或 samba server 做身份驗證
encrypt passwords = Yes
security = server
password server = "NetBIOS_name_of_a_DC"
4.Domain Security Mode : 身份驗證交由 Windows AD (Domain 為 mixed mode)或者由 Windows NT 4 處理
workgroup = "name_of_NT_domain"
security = domain
5.ADS Security Mode : 身份驗證交由 Windows AD 處理(Domain 為 native mode)
realm = your.kerberos.REALM
security = ADS
ads server = your.kerberos.server
RHEL5 - Samba (六) Share 的身分驗證
第一種是 Share Level Security : 不使用密碼做身份驗證,任何使用者在存取目錄時並不會詢問密碼.先在 X-windows 下執行 #system-config-samba 選擇 "Authentication Mode" 為 Share.
透過 #system-config-samba 去設定驗證模式,主要都還是去修改 samba 的設定檔 /etc/samba/smb.conf ,我們先來看看使用 share 身份驗證時 samba 的設定檔是如何設定的.
[root@benjr ~]# vi /etc/samba/smb.conf [global] workgroup = MYGROUP netbios name = benjr security = share |
1.主要不使用密碼做身份驗證 security = share
2.netbios name 是自己加上的,也就是 Windows 的電腦名稱,如果沒有設定 netbios name 時 samba 預設是使用 hostname 為電腦名稱.
不過要注意的是 samb 只管網路連結過來的使用者是否有權限,當然使用者還是要有 Linux 檔案的權限才可以.這概念跟 Windows 網路芳鄰一樣.
首先選擇你要想分享的目錄這裡我開啟一個 /share 分享目錄,請自行建立(#mkdir /share).建立好目錄還要開檔案的權限(#chmod -R 777 /share),雖然使用者不需要輸入密碼,但是再做存取檔案時還是會受限於 Linux 的檔案權限的影響.在回到 #system-config-samba
新增 Add Share 剛剛建立好的目錄,目前 samba 並沒有任何的使用者存在所以在 Access 也只能選擇 "Allow access to everyone".在 Basic 中分享名稱 Share name 可以依你的需要做修改,預設是使用目錄名稱.不使用密碼做身份驗證,並不代表有寫入的權限這裡可依據是否勾選 "writable" 來決定使用者(Guest User) 可以寫入的權限.我們先來看看剛剛那些動作 samba 的設定檔 /etc/samba/smb.conf 做了哪些設定.
[root@benjr ~]# vi /etc/samba/smb.conf ============================ Share Definitions ============================== [tmp] comment = Temporary file space path = /tmp read only = no public = yes [share] path = share public = yes writable = yes |
[share] 就是分享的名稱 , path = /share 就是實際在 Linux 的目錄,writable 來決定使用者可以寫入的權限.
Linux client 端需要使用的程式
I.smbclient 查詢 samba server 提供哪些分享目錄
[root@benjr ~]# smbclient -L benjr Password: Domain=[MYGROUP] OS=[Unix] Server=[Samba 3.0.28-0.el5.8] Sharename Type Comment Server Comment Workgroup Master |
上面的 passwd 可以不用輸入,直接打 enter 鍵即可跳過
II."mount or smbmount" mount smaba 所提供的 share 目錄
[root@unsvr root]# mount -t smbfs //benjr/share /mnt Password: [root@unsvr root]# smbmount //benjr/share /mnountpoint Password: |
上面的 passwd 可以不用輸入,直接打 enter 鍵即可跳過,這樣就可以直接使用smaba 所提供的目錄.
Windows client 端需要使用的程式
可以用網路的芳鄰來尋找,或者在 開始/執行 中鍵入 IP 或者電腦名稱(netbios name),就可以看到 samba server 所分享的目錄,此時就可以來存取由 samba server 所提供的檔案了.
RHEL5 - Samba (七) 新增 samba User
當 samba server security 選 user 安全等級時是用本身這台 samba server 做身份驗證.因為需要身分所以第一步就是要先新增使用者.不像之前的版本是將資料儲存在 /etc/samba/smbpasswd,RHEL5 將預設的使用者資料庫放在 passdb.tdb .
[root@benjr ~]# cat /etc/samba/smb.conf # ----------------------- Standalone Server Options ------------------------ # # Security can be set to user, share(deprecated) or server(deprecated) # # Backend to store user information in. New installations should # use either tdbsam or ldapsam. smbpasswd is available for backwards # compatibility. tdbsam requires no further configuration. security = user |
不過當我們在建立使用者帳號密碼時這個使用者必須儲存在 Linux 本機上,這跟當地硬碟權限有關.新增兩位使用者 "Bob" 和 "John"
[root@benjr ~]# adduser bob [root@benjr ~]# adduser john [root@benjr ~]# passwd bob Changing password for user bob. New UNIX password: Retype new UNIX password: passwd: all authentication tokens updated successfully. [root@benjr ~]# passwd john Changing password for user john. New UNIX password: Retype new UNIX password: passwd: all authentication tokens updated successfully. |
此時你可以透過 system-config-samba 新增使用者,在開啟 #system-config-samba 後,選擇 Preferences / Samba Users 增加使用者 "Add User"
因為我們只能選擇已經存在的 Linux User 所以在 Unix Username:選擇剛剛新增的 bob 和 john.Windows Username 就設的跟 Unix Username 一樣即可.
或是透過 #pdbedit -au 來新增使用者.
[root@benjr ~]# pdbedit -au bob new password: retype new password: Unix username: bob NT username: Account Flags: [U ] User SID: S-1-5-21-1634407166-380897321-584037179-1001 Primary Group SID: S-1-5-21-1634407166-380897321-584037179-513 Full Name: Home Directory: \\benjr\bob HomeDir Drive: Logon Script: Profile Path: \\benjr\bob\profile Domain: BENJR Account desc: Workstations: Munged dial: Logon time: 0 Logoff time: never Kickoff time: never Password last set: Fri, 17 Apr 2009 03:38:39 CST Password can change: Fri, 17 Apr 2009 03:38:39 CST Password must change: never Last bad password : 0 Bad password count : 0 Logon hours : FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF [root@benjr ~]# pdbedit -au john new password: retype new password: Unix username: john NT username: Account Flags: [U ] User SID: S-1-5-21-1634407166-380897321-584037179-1002 Primary Group SID: S-1-5-21-1634407166-380897321-584037179-513 Full Name: Home Directory: \\benjr\john HomeDir Drive: Logon Script: Profile Path: \\benjr\john\profile Domain: BENJR Account desc: Workstations: Munged dial: Logon time: 0 Logoff time: never Kickoff time: never Password last set: Fri, 17 Apr 2009 03:38:51 CST Password can change: Fri, 17 Apr 2009 03:38:51 CST Password must change: never Last bad password : 0 Bad password count : 0 Logon hours : FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF |
#pdbedit 透過參數 -L 可以查詢所有儲存在 samba 的使用者.
[root@benjr ~]# pdbedit -L john:501: bob:500: |
note:
不是我愛嫌棄 RedHat 很多圖形介面的東西要做也不做好,像是我在使用 system-config-samba 新增使用者的時候,挖勒!!新增好就看不到了.再新增一次又被告知使用者已經存在(An account for this user already exists. Please try again).
恩!!!!這是怎麼一回事!!不過透過指令方式 #pdbedit -L 使用者真的已經加入,上網查了一下,果然是 system-config-samba 固定使用 /etc/samba/smbpasswd 當作他的使用者資料庫,但是我記得 RHEL5 不是已經將預設的使用者資料庫放在 passdb.tdb ,而且這一錯到 RHEL5.2 以前都沒修正,一直到 RHEL5.3 才修正.不過使用 RHEL5.2 之前版本也不用急著更新找到 system-config-samba-1.2.40 的版本就修正了,更新就可以使用了.
https://bugzilla.redhat.com/show_bug.cgi?id=236557
RHEL5 - Samba (八) 檔案權限
雖然剛剛有大概談了一下使用者需要哪一些權限才能讀取到,這邊在詳細說明 Linux 的檔案權限.
1.當 Bob 想對 Samba Server 提出讀取分享資料夾時,第一步就是需要透過身分驗證.除了 Share Level Security 不使用密碼做身份驗證其他都需要身分驗證,所以 Bob 必須為 Samba Server 所認識的使用者(有些身分驗證是透過其他 Windows 或 LDAP 來驗證,驗證機制一樣).
2.當 Bob 為系統上可驗證的使用者時,接下來 Samba Server 會根據這個使用者可以讀寫分享哪些目錄.
3.雖然 Samba 讓 Bob 可以讀寫分享特定目錄時,但是在 Linux 上還有一個叫做權限的問題我們現在就來看看 Linux 權限是如何設定的.
Linux 系統下的檔案有所謂的權限設定,系統會依據這些權限的設定來決定使用者是否能讀取,寫入或執行指令 .
#ls -l (ls "list directory contents",-l "use a long listing format")就可以看到檔案權限目前是如何設定的.
這邊和檔案權限有關的是[檔案屬性][擁有者][所有者群組]
以上 -rw-r--r-- [檔案屬性]的每一個位置都有他所代表的意思,每三個為一組,每一組皆為 rwx ,因為每一組皆代表不同人所有擁有的權限.
第一組 User 代表的權限是針對自己所擁有的權限,也又是剛剛看到的[擁有者].
第二組 Group代表同一群組的使用者所擁有的權限,也又是剛剛看到的[所有者群組].
第三組 Other 代表[其他的使用者]所擁有的權限.
而權限可以區分為 rwx ,而當我們在看 rwx 時檔案和目錄是具有不同的意義
I. 對檔案而言:
可讀(r):可以cat檔案內容
可寫(w):可以cp,move檔案的內容
可執行(x):可以執行檔案
II. 對目錄而言:
可讀(r):對目錄而言單獨有此權限是沒有用的,還要同時有x的權限.才能有 ls 讀取目錄的內容.
可寫(w): 對目錄而言單獨有此權限是沒有用的,還要同時有x的權限.才能有cp,move,touch目錄內的檔案.
note: 當目錄擁有 w 的權限而目錄下的檔案並沒有設定 w 的權限,此時檔案還是可以編輯及刪除.
可執行(x): 具有 cd (change directory)進入目錄的權限
note:當檔案的User,group為同一人時,權限是看 User 的.
目錄的預設權限:
[root@benjr ~]# mkdir /share [root@benjr ~]# ll -d /share drwxr-xr-x 2 root root 4096 Apr 20 08:31 /share |
不管是誰建立目錄的基本上所有的人都有 rx 可進入目錄的權限.但是你要讓 Bob 也要寫入 /share 目錄時必須具備.
1.other 必須開啟 w (寫) 的權限.
2.將 /share 的 user 改為 Bob.
3.建立群組(Group),並讓目錄使用者群組修改.並加上 w (寫) 的權限.
如果是在測試環境時就不需要考慮太多一率將權限改為 777.
Images 0 | ||
---|---|---|
No images to display in the gallery. |