第 8 堂課 - 網路芳鄰伺服器 (SMB Server)
上次更新日期 2022/11/17
上節課程講到如果需要 Unix 對 Unix 進行檔案系統傳輸,此時可以透過 LDAP 搭配 NFS 來進行。那如果需要的是 Windows 對 Windows 呢? 當然使用微軟的網芳 (CIFS) 這個玩意兒。那如果需要的是 Windows client 對 Linux Server 呢?那可能就得要 SMB 服務了! 其實 SMB 就是 Linux 版本的網路芳鄰就是了!可以讓 windows 直接掛載喔!
學習目標
- 了解 NetBIOS, NetBIOS over TCP/IP, Samab, SMB, CIFS 等專有名詞的意思
- 大致的 smb.conf 設定檔內容理解
- smb 服務的啟動與觀察
- smbclient 指令的應用
- 實際掛載 cifs 檔案系統時,使用的 multiuser, sec=ntlmssp, credentials= 等參數的應用
- SELinux 問題解決
- 8.1: 檔案伺服器之網路芳鄰 (windows 網路磁碟機)
- 8.2: Samba 檔案伺服器基礎設定
- 8.3: 共享資源之設定
- 8.4: 其他議題:同一掛載點不同權限與防火牆
- 8.5: 課後練習
8.1: 檔案伺服器之網路芳鄰 (windows 網路磁碟機)
大家應該經常聽到『檔案伺服器』,這個玩意兒可以提供用戶端取得檔案來源。那麼有哪些檔案伺服器呢?前一堂課我們聽過了 NFS 了!那接下來還有哪些呢? 其實經常使用到的檔案伺服器有這些喔:
- 常見的檔案伺服器分類:
- 非同步的檔案伺服器 (在 Server/client 各保留一份)
- FTP
- HTTP
- 同步的檔案伺服器 (只保留在 Server 端,但用戶端看起來就跟本機的檔案系統沒兩樣)
- NFS (Linux <--> Linux)
- CIFS (Common Internet Filesystem)(Windows <--> Windows)
- SMB (Server Message Block):事實上就是 CIFS 囉!透過逆向工程解析出來的一個通訊協定
一般來說,由企業主動提供給其他消費者的,大多使用 FTP 或 HTTP 之類的類型來提供。如果是一般企業內部員工共用的環境,那當然就得要使用同步的檔案伺服器, 這樣檔案才不會有新舊版本造成的困擾。同時檔案集中在 Server 上面,對於企業內部的資安維護來說,也會比較有保障。 同時,我們只要管理好這部 file server 的話,基本上,你的文件資料就有一定程度的保障囉!
- 什麼是網芳與 NetBIOS ?
早期的企業辦公室內部就有檔案分享的問題存在,那時還沒有很方便的隨身硬碟 (USB) 或快閃硬碟,資料的複製常常需要經過軟碟來傳輸, 軟碟傳輸的速度慢,而且軟碟的資料保證很糟糕 (軟碟真的很容易損壞)。因此,許多的 IT 公司都發展了企業辦公室檔案共享的機制。 其中一個使用很廣泛的,就是 Windows 採用的 NetBIOS 這個辦公室內不能跨網域的檔案分享通訊協定。
基本上,NetBIOS 的檔案分享機制是這樣的:
- 區域網路 (LAN) 裡面透過 NetBIOS 的名稱解析功能,任何一部加入 NetBIOS 網域的主機,可以取得每一部網路主機的 NetBIOS 名稱 (就是 windows 上設定的名稱),當然,自己的名稱也會被他人取得。
- 每一個具有 NetBIOS 主機名稱的網路主機,就可以直接透過 NetBIOS 進行檔案的傳輸
- 但是 NetBIOS 不能跨路由器 (不可在不同的網段間溝通)
- 早期的 windows (windows 98 以前) 不需要設定 IP 位址也能夠進行網芳溝通,就是透過這個機制!
也就是說,你的 windows 電腦只要啟動了 NetBIOS 協定,並且設定好一個不會與其他人重複的主機名稱,那麼區網內的其他電腦, 就可以透過你的 NetBIOS 分享的目錄,直接掛載使用你的 windows 磁碟機內的資料了。所以, windows 電腦的主機名稱是真的有意義的!
後來微軟將自己開發修改過的 NetBIOS 協定稱為網路檔案分享系統 (Common Internet Filesystem, CIFS)。
- NetBIOS over TCP/IP
因為 NetBIOS 不能跨路由,因此只能在區網內運作。但是後來 Internet 流行了起來,漸漸的每一部主機都會有 IP 位址。 所以後來就有在 Internet 上面開發出支援 NetBIOS 功能的協定,讓 NetBIOS 可以在網際網路上面應用!那就是所謂的『 NetBIOS over TCP/IP 』這個玩意兒。
說穿了, NetBIOS over TCP/IP 就是透過 IP 位址來傳送 NetBIOS 分享的功能,因為使用的是 TCP/IP 的傳送機制,因此就可以跨過路由傳輸! 讓網路芳鄰 (Windows 網路磁碟機) 的功能更有可看性。
windows 的 CIFS 使用了兩個埠口在進行資料的傳輸,一個是沿用 NetBIOS 的功能,埠口開在 139 ,另一個則是使用 port 445 在傳輸。 目前慣用的傳輸方式為 port 445。
- SMB 以及 Samba 的開發
故事的起源是這樣的,有個博士班學生名為 Andrew Tridgell,這位先生為了自己的學業,因此手邊有幾部不同硬體與作業系統的機器。 但是 Andrew 在資料傳輸時遇到了些困難,因為他沒有辦法在所有機器間共享檔系統。因為比較麻煩的是他手邊的微軟的作業系統, 所以為了解決這個問題,他使用逆向工程去分析出 CIFS 協定的傳輸方式,並自己開發出一個相容於 CIFS 的程式碼, 這個程式碼符合 SMB (Server Message Block) 協定的要求,也可以相容於 CIFS 這個傳輸協定,因此他就可以在不同的機器與作業系統之間進行檔案分享了。
因為 SMB 是有意義的一個通訊協定,所以 Andrew 不能直接使用 SMB 去註冊~但是為了讓自己開發的程式具有 SMB 的特徵, 於是他翻字典找到了 SaMBa 這個舞蹈單字,並對 Samba 進行了註冊。
於是,Samba 是註冊商標、是軟體名稱,但是通訊協定為 SMB,而 CIFS 就是相容於 SMB 的一個通訊協定之一。所以主架構是 SMB, CIFS 與 SAMBA 都相容於 SMB 之意。
- Windows 的網芳 (共享) 功能設定:
一般來說,在 windows 的系統內,可以透過底下的方式來直接分享網芳。不過預設的情況下,只有在同一個網域內的不同電腦才可以通行防火牆, 所以不同的網域基本上也不能加入 windows 的網芳共享檔案的 (除非你知道如何處理 windows 的防火牆)。至於基本設定程序是這樣的:
- 打開檔案總管,移動到你想要分享的目錄上
- 按下右鍵,選擇『共用對象』,選擇『特定人員』
- 選擇『Everyone』指定唯讀
- 最終按下『共用』後,螢幕就會出現你的資料夾共用名稱
如果你共享的目錄名稱為 movies 的話,那麼網路上預設共享的名稱也會是 movies。如果你需要讓這兩個名字不一樣, 那就得要修改資料夾名稱與共用共享名稱 (dir_name 與 share_name)。
- 資料夾共用名稱通常為『 \\netbios_name\share_name 』
- 一般來說,預設 dir_name 會相等於 share_name
- 若需要設定不同的 share_name ,就得要修改囉!也就是說,目錄名稱與共用名稱可以不同!
因為 CIFS 已經支援 Internet 囉,所以取得 server 的可用目錄共享名稱 (share_name) 的方式:
- 檔案總管輸入『 \\IP 』即可
- 檔案總管輸入『 \\對方IP 』即可
- 建立一個名為 D:\myshare 目錄
- 開啟共用功能的設定方式:
- 滑鼠在上述的目錄上面,按下右鍵後,選擇『內容』
- 在出現的視窗中,點選『共用』,然後按下『共用』的按鈕
- 在出現的新視窗為『網路存取』視窗中,點選下拉式選單的『Everyone』,按下『新增』
- 最後按下『共用』項目,如果有要求輸入防火牆的項目,請按『是』即可。
- 在自己的檔案總管上面輸入『 \\127.0.0.1 』查看是否正確的看到一個新的目錄?
- 變更分享路徑的名稱方式:
- 滑鼠在上述的目錄上面,按下右鍵後,選擇『內容』
- 在出現的視窗中,點選『共用』,然後按下『進階共用』的按鈕
- 在『共用名稱』的框框內,按下『新增』填寫新的『共用名稱』後,按下『確定』。
- 持續按下共用名稱框框內的下拉式選單,點選剛剛的目錄名稱後,按下『移除』按鈕。
- 按下『確定』即可。
- 在自己的檔案總管上面輸入『 \\127.0.0.1 』查看是否正確的看到一個新的目錄?
- 查詢對方網路磁碟機的『網址』名稱:
- 告知旁邊的同學,請他連線到自己的 IP,是否能夠看到自己分享的目錄?
- 當你登入同學的網芳之後,請寫下該目錄的『網址』為何?
- 嘗試查詢 windows 防火牆:
- 由『設定』、『網路和網際網路』,該畫面最下方的『網路和共用中心』,查看目前的網路使用的是『私人網路、公用網路、工作場所』等
- 同一畫面左側點選『變更進階共用設定』,單純查看不同共用的差別
- 打開 windows 防火牆,點選左側『進階設定』,再點選左側『輸入規則』,之後查看『輸入規則』的框框, 往下找到『檔案及印表機共用(SMB-in)』的項目,然後拖拉下方的 bar 另其顯示右邊『通訊協定及連接埠』的位置,請查看到 TCP port 139 與 445 的項目, 並請查閱到『領域』頁面的『遠端 IP 位址』的可用範圍是『任何』還是『本機子網路』?
- 針對 TCP port 445 ,並且針對『私人』的規則,連點兩下,選擇『領域』頁框,查看『遠端 IP 位址』的設定, 嘗試加入一個 172.31.255.0/24 的網域看看。
- 同樣的方式,將私人連線的『輸出規則』 port 445 一樣加上 172.31.255.0/24 的輸出。
8.2: Samba 檔案伺服器基礎設定
- Samba 提供的服務:
如前所述,Samba 是一個 SMB 協定,且目的是相容於 CIFS 這一個 SMB 協定,而 CIFS 預設會去找 NetBIOS 名稱以及提供檔案分享兩種機制。 所以, Samba 提供的服務就有:
- smb:
- 就是 Samba 的主要服務,管理分享的目錄、傳輸檔案與身份驗證等等重要功能 (只要這個即可)
- 因為涉及檔案傳輸,需要 TCP 封包,主要埠口為 port 139, 445
- nmb:
- 相容於 NetBIOS,會去搜尋區網內的各個 NetBIOS name 來進行網路主機名稱的列表等。
- 透過 UDP 封包的 port 137, 138 來進行 NetBIOS name 的網路主機名稱搜尋~
- 如果只是要作為檔案傳輸分享,無須進行網路自動搜尋時,不用啟動這個服務。
- Samba 所需軟體設定檔位置:
完成 Samba 設定所需要的軟體有底下這些:
- samba:主要的 smb, nmb 等服務以及文件檔與開機設定檔等
- samba-client:提供 Samba 用戶端掛載相關的功能,包括查詢 server 分享的資料等指令
- samba-common:提供 server/client 都會使用到的資料,包括設定檔與語法檢驗指令等
至於主要設定檔的檔名是『 /etc/samba/smb.conf 』這一個,而這個設定檔的基本語法是這樣的:
[root@localhost ~]# vim /etc/samba/smb.conf
[global]
參數項目 = 設定內容
....
[分享資源名稱]
參數項目 = 設定內容
....
- 安裝並檢查 samba 相關的軟體與軟體所含的檔名資料
- 檢查 /etc/samba/smb.conf 以及 /etc/samba/smb.conf.sample 的差異
- 在 smb.conf 底下,預設的中括號 [] 有哪幾個?
- 基礎伺服器設定 [global]
針對 [global] 的設定項目中,需要修改的就是原本範例檔中的資料,大致有這些設定:
- workgroup = 工作群組名稱
- netbios name = 現在預設為主機名稱喔! (可不設定,預設使用 hostname 的輸出)
- server string = 主機的簡易說明 (可不設定)
- unix charset = 在 Linux 伺服器上面所使用的編碼
- dos charset = 就是 Windows 用戶端的編碼
- security = user 透過 samba 伺服器本身的帳號密碼資料庫
雖然說 dos charset, unix charset 可以指定中文編碼的格式,不過由於目前新版的 Samba 對於編碼的解析已經大有進步, 同時,目前我們的 server/client 大多同時使用 utf8 了,因此上述關於語系的設定可以忽略不理,或者是全部通通設定為 utf8 即可。
- 工作群組為 dic,主機名稱為 stationXX,主機說明為你的學號
- 所有編碼格式均不須設定
- 使用 testparm 測試設定檔語法是否有問題。若有問題請依據問題解決。
若使用 testparm 之後,發現到系統會顯示『rlimit_max: increasing rlimit_max (1024) to minimum Windows limit (16384)』的問題時, 那可能是 Samba 系統擔心使用者能夠開啟的檔案太小之故。若真的發生這個情況,那你可以使用如下的指令去檢查一般用戶能夠同時開啟的檔案數量:
[root@localhost ~]# ulimit -a [root@localhost ~]# ulimit -n
該項目其實就是 『open files』 那個限制值。Samba 希望我們能夠調整成 16384,那如何調整?其實調整 /etc/secirity/limits.conf 內容即可! 設定的方式如下 (若沒有發生錯誤,就略過這個動作即可):
[root@localhost ~]# vim /etc/security/limits.conf
* soft nofile 16384
* hard nofile 16384
由於 limits.conf 得要重新登入才會生效,因此請你登出 root 之後再登入,重複使用 testparm 就可以發現該錯誤不見了。 此外,如果你有興趣了解所有的 samba 設定值,則改用 testparm -v 來查閱即可。
- 針對一般用戶 [homes] 的設定
照一般正常的思考邏輯,每個人的家目錄均不同啊~因此 dmtsai 會有 dmtsai 的家目錄,而 niki 也有自己的家目錄。 若以 8.1.A 的想法,那麼每個人的家目錄網址應該不同!例如 dmtsai 應該是 \\your_server_name\dmtsai\ 而 niki 則是 \\your_server_name\niki\ 才對!所以,我們的家目錄若針對每個人給予設定,那管理員就崩潰了!
因此除了 [global] 這個全域設定項目的特別特性之外,那個 [homes] 也是特別的設定項目!因為 homes 可以讓任何人取代! 因此,如果是 dmtsai 登入,那麼中括號其實會變成 [dmtsai],則分享的網址會主動變成『 \\your_server_name\dmtsai 』 這樣一來,設定就簡單多了!
如果你剛剛已經使用過 testparm,則針對 [homes] 會看到這個項目:
[homes] comment = Home Directories browseable = No inherit acls = Yes read only = No valid users = %S %D%w%S
很簡單的看出:
- comment :該目錄用途的簡易說明
- browseable :是否允許被瀏覽查詢到該目錄的存在 (只能看到目錄,不是允許登入的意思)
- inherit acls :是否放行已經設定權限的 ACL 資訊
- read only :是否為唯讀
- valid users :能使用此項目的用戶。
那個 valid users 比較特別~怎麼會是 %S 呢?如果你使用 man smb.conf 去查詢就知道!那就代表 [這裡的名字] 的意思~如前所述, [homes] 是特別的名稱,他可以被登入者的帳號所取代,而 %S 則是代表 [] 裡面的名稱之意!所以,當有 dmtsai 這個家目錄存在, 就代表 dmtsai 是允許登入的用戶之意!更多的 %XXX 請參考 man smb.conf 的內容!
- 確定設定無誤之後,啟動 smb 服務,且該服務下次開機也會自動啟動
- 查詢系統新增的埠口有哪些?
- 使用 smbclient -L //IP 然後直接按下 [enter] 以匿名登入,看看是否啟動了 Samba ?若順利取得 samba 的資訊,應該會看到如下資訊:
Enter DIC\root's password: Anonymous login successful Sharename Type Comment --------- ---- ------- print$ Disk Printer Drivers IPC$ IPC IPC Service (Samba 4.11.2) SMB1 disabled -- no workgroup available
新版的 Samba 以及 windows 10 以後的系統,預設都會將 SMB version1 關閉,僅使用 version2 與 version3 而已。若需要查詢詳細的版本資訊, 可以用底下的方式檢查即可:
# testparm -v | grep protocol
Load smb config files from /etc/samba/smb.conf
Loaded services file OK.
Weak crypto is allowed
Server role: ROLE_STANDALONE
Press enter to see a dump of your service definitions
client ipc max protocol = default
client ipc min protocol = default
client max protocol = default
client min protocol = SMB2_02
server max protocol = SMB3
server min protocol = SMB2_02
- 放行系統上的用戶使用權
在 8.1.A 的例題中,我們可以針對某個特定的用戶來放行,而『該用戶一定得要存在於系統中』!否則 Windows 無法進行身份的權限給予 (UID/GID...)。 同理, Samba 也是一樣的!你需要注意:
- 由於牽涉到系統的檔案與權限,因此 Samba 的用戶必須是系統的實體用戶
- 但是 Linux 實體用戶與 Samba 的用戶『密碼資料庫並不相同』,因此 Samba 必須要額外製作使用密碼
要設定可以使用 Samba 的用戶也很簡單,我們以已經存在 Linux 的這個 student 帳號來說,要將它加入 samba 的使用權限,直接使用 pdbedit 處理即可。
# pdbedit -a -u username (建立 Samba 用戶) # pdbedit -L (列出 Samba 用戶) # pdbedit -x -u username (刪除 Samba 用戶)
- 以正常方法建立 alex 這個用戶,此用戶無須給予 Linux 密碼
- 讓 alex 可以使用 Samba,且登入 Samba 的密碼為 heyalex
- 使用 pdbedit -L 確認 alex 在 Samba 的使用列表當中
- 使用 smbclient -L //IP -U alex 之後輸入 alex 的密碼,看看能否得到類似如下的畫面:
Enter DIC\alex's password: Sharename Type Comment --------- ---- ------- print$ Disk Printer Drivers IPC$ IPC IPC Service (Samba 4.11.2) alex Disk Home Directories SMB1 disabled -- no workgroup available
- 用戶家目錄的掛載與卸載 (含 SELinux 問題處理)
要在 Linux 底下使用 Samba 檔案系統也頗簡單!只要使用 cifs 檔案系統掛載即可!當然,掛載時還得要輸入帳號與密碼才行喔!
- 軟體:系統可能並沒有安裝 samba-client,所以不見得具有 smbclient 軟體。請安裝該軟體即可。
- 搜尋:確認剛剛使用 alex 查詢到的網路磁碟機網址為何?
- 軟體:掛載 SMB 檔案系統,需要有 CIFS 的支援,請找尋 cifs 軟體,並安裝相關的軟體!
- 掛載:使用『 mount -t cifs -o username=alex,passowrd=xxxx 裝置網址 /mnt 』嘗試將 alex 的家目錄掛載到 /mnt 當中
- 確認:使用 df 確認是否已經掛載
- 解決問題:
- (client) 使用 ll /mnt 是否可以查詢到資料?
- (server) 若 client 出現權限不符,嘗試使用 setenforce 0
- (client) 再回到 client 確認一次,看看能不能查詢到檔案
- (server) 重新在 server 上 setenforc 1,然後自行處理 SELinux 的相關問題。或者查閱 /etc/samba/smb.conf.example 查閱解決方案。
- (ps: 這一小題非常重要!注意流程!)
- 確認掛載權限:
- (client) touch /mnt/from_samba ,查看一下權限
- (server) ll ~alex/from_samba ,查看一下權限 (user/group/permission)
- 問答:預設權限會不會太離譜(一般檔案是幾分?)
- 完成上述步驟後,請卸載 /mnt 的掛載
8.3: 共享資源之設定
除了家目錄之外,samba 還經常用來作為『分享共同的資源』之用!舉例來說,有三個用戶,這三個用戶想共用 /srv/project 時, 那除了本身 /srv/project 需要設定好權限之外,我們讓這三個用戶可以透過 samba 分別從不同的主機連線進來,然後開始大家共用此目錄! 唯一要注意的大概就是檔案不能同時被多個人開啟這樣而已。
Samba 要分享資源時,大部分會這樣做:
[myshare] 資源名稱 comment = Just share my directory 一些簡易說明 path = /srv/share 實際放行的目錄 public = no 要不要開放訪客進入 (當然不要) browseable = yes 要不要能夠被瀏覽到名稱 (不是查看內容) writable = yes 能否寫入 (smb 控制的) create mode = 0664 建立檔案的預設權限 directory mode = 0775 建立目錄的預設權限 write list = teacher, @teacher 哪個帳號或群組的用戶可以寫入 valid users = user1, @group1 不是寫入權限,而是能用此資源的人(是否唯讀要看設定)
上面設定值當中的 write list 與 valid users 選擇其中一個來設定即可。個人建議使用 valid users 即可喔。 當然,最終能不能寫入還是與 Linux 檔案系統的權限有關的!
- 目標前提:
- 預計建立的三個帳號分別是 std1, std2, std3
- 預計共同加入的專題組名為 graduation
- 預計共享的目錄在 /srv/myproject。
- 請先設計好帳號、群組與目錄之權限等資訊。並請注意,針對 /srv/myproject 目錄,非群組外的其他人不具備任何權限。
- SELinux 的問題解決: 在 SELinux 的情境下,Samba 分享的目錄需要具備特別的類型,請依據 /etc/samba/smb.conf.example 的說明, 解決 SELinux 的類型問題。
- 處理 Samba 設定檔的內容:
- 透過 samba 分享該目錄,且目錄的預計網址會是:『 //your_server_name/graduation/ 』
- 在 graduation 群組內的用戶具有完整權限,亦即加入 graduation 即可使用本目錄資源。
- Samba 帳號:讓 std1, std2, std3 均可使用 Samba,且其 Samba 密碼為 heystd1, heystd2, heystd3 。
- 請前往用戶端,嘗試使用 std3 掛載本目錄,並且將本資源掛載於 /media/data 下,並且測試寫入與讀出等動作。
如果覺得密碼這樣輸入很麻煩,也能透過 standard input 的方式來處理。查詢 pdbedit 的結果,得到 -t 這個參數, 只是,仍然需要輸入兩行!所以,你可以這樣做:
# pdbedit -x -u std3 # echo -e "heystd3\nheystd3" | pdbedit -t -a -u std3
雖然上述設定之後,未來若有其他用戶要加入該專題,只要 (1)建立新的用戶, (2)將該用戶加入 graduation 群組中, (3)讓該用戶可以使用 Samba, 那麼該用戶就能夠使用 //your_server_name/graduation/ 的資源了。不過,如果有個名為 teacher1 的用戶想要進入該目錄資源『查閱』而已, 僅是查閱而不能寫入喔 (就是僅有 rx 而已),那該如何處理呢?
- 在 Server 端:
- 建立名為 teaacher1 的帳號,但該帳號不可加入 graduation 群組
- 讓 teacher1 可以使用 Samba,且密碼為 heyteacher。
- 在 smb.conf 當中,讓 teacher1 可以使用 graduation 資源!
- 在 client 端與 server 端切換:
- (client) 利用 teacher1 的身份掛載 //your_server_name/graduation 到 /media/teacher ,請確認能否進入該目錄查閱資料?
- (server) 若不行,該如何處理 (注意,需要用到 ACL 喔!)
所以,想要有什麼好的設定,大多還是跟 Linux 傳統的設定有關!基礎學習還是相當重要的喔!
- 在公開檔案 (/etc/fstab) 保障密碼不外流的方式
如果你需要一開機就將上述的資源掛載起來的話,那麼就得要寫入 /etc/fstab 當中!並且將帳號與密碼也都要寫入在第四欄位, 例如這樣的寫法:
[root@localhost ~]# vim /etc/fstab //server/graduation /media/data cifs defaults,username=std3,password=heystd3,_netdev 0 0 [root@localhost ~]# umount /media/data [root@localhost ~]# mount -a
不過如此一來 std3 的帳號與密碼都被看光光了!實在很蠢~你可以使用另一種機制~透過 cifs-utils 這個軟體提供的功能, 在上述的特殊字體部份,使用『 credentials=/root/mountme 』之類的方式來提供另一個檔案儲存帳號與密碼, 然後再以底下的格式來寫入 /root/mountme ,就能夠處理妥當了!
username=std3 password=heystd3
- 安裝 cifs-utils,並觀察該軟體提供什麼檔案
- man mount.cifs 之後,搜尋 credential 這個關鍵字,查出檔案的格式
- 利用 std3 掛載 //IP/graduation 到 /media/data 去,且將帳密寫在 /root/mountstd3.txt 這個檔案中, 不要讓帳密出現在 /etc/fstab 當中。
- 卸載 /media/data 後,使用 mount -a 測試掛載!
8.4: 其他議題:同一掛載點不同權限與防火牆
- 觀察來自 client 的連線狀態 (Server 端功能)
有時候在 Samba server 還是得要知道用戶端的使用情況比較好!最簡單的查詢方式,就是透過 smbstatus 去查看一下即可! 我們就能夠了解到有哪些用戶端連線進來系統了!
[root@localhost ~]# smbstatus
Samba version 4.11.2
PID Username Group Machine Protocol Ver
----------------------------------------------------------------------------------------
1807 std3 std3 10.255.200.1 (ipv4:10.255.200.1:50420) SMB3_11
Service pid Machine Connected at Encryption Signing
-----------------------------------------------------------------------------------------
graduation 1807 10.255.200.1 一 11月 30 21時36分35秒 2020 CST - -
IPC$ 1807 10.255.200.1 一 11月 30 21時36分35秒 2020 CST - -
No locked files
- 同一掛載點但是不同帳密登入的方式 (用戶端功能)
想一想,如果你已經用了 root 的身份,然後以 std3 的帳密資訊掛載了 //IP/graduation 到 /media/data 當中, 然後同時 std1 已經登入這部系統,他也想要掛載 graduation 到該目錄下!你要 std1 與 std3 分別使用自己的權限到 /media/data 目錄去工作, 而不需要重複掛載,此時該如何是好?
最簡單的想法,就是在用戶端掛載時,特別加上兩個參數,分別是底下這兩個:
- multiuser :可以對應使用者給予個別的權限,同時還需要搭配 cifscreds 來處理權限問題才行。
- sec=ntlmssp :安全模式,提供 multiuser 的參數可以變更權限的密碼測試方式。
因此,請修改 /etc/fstab 成為類似如下的模樣:
[root@localhost ~]# vim /etc/fstab //server/graduation /media/data cifs defaults,credentials=/root/mountstd3.txt,_netdev, multiuser,sec=ntlmssp 0 0 [root@localhost ~]# umount /media/data/ [root@localhost ~]# mount -a
此時 root 登入系統後,進入到 /media/data 時,就會取得 std3 的權限!因為 /root/mountstd3.txt 裡面就是用 std3 的帳號資訊來設定的。 那如果此時 student 登入系統之後,想要使用 std1 的身份時,他該如何是好?他可以這麼做:
[student@localhost ~]$ cd /media/data [student1@localhost data]$ ll ls: reading directory .: 拒絕不符權限的操作 [student@localhost data]$ cd [student@localhost ~]$ cifscreds add -u std1 server Password: # 這裡輸入 std1 的 samba 密碼喔! [student@localhost ~]$ ll /media/data [student@localhost ~]$ touch /media/data/std1 # 回到 root 的身份,來到 server 查看一下狀態! [root@localhost ~]# smbstatus Samba version 4.11.2 PID Username Group Machine Protocol Ver ---------------------------------------------------------------------------------------- 1817 std1 std1 10.255.200.1 (ipv4:10.255.200.1:50422) SMB3_11 1817 std3 std3 10.255.200.1 (ipv4:10.255.200.1:50422) SMB3_11 Service pid Machine Connected at Encryption Signing ---------------------------------------------------------------------------------------- IPC$ 1817 10.255.200.1 一 11月 30 21時47分47秒 2020 CST - - graduation 1817 10.255.200.1 一 11月 30 21時40分01秒 2020 CST - - IPC$ 1817 10.255.200.1 一 11月 30 21時40分01秒 2020 CST - - graduation 1817 10.255.200.1 一 11月 30 21時47分47秒 2020 CST - - No locked files
你就可以發現確實能夠以自己的帳號來登入該目錄工作了!而且在 server 端也看到同一個 PID 會有不同的帳號來使用,此時不同的帳號身份就能夠用不同的權限來操作該目錄! 達成多人共用的情況囉!
- 讓 /media/data 這個掛載點加入 multiuser 以及 sec=ntlmssp 的參數,並讓此參數生效。同時使用『 mount | grep data 』確認該參數已經正確設定。
- 用 root 的身份去操作 /media/data 這個目錄 (cd /media/data; ll; touch root; ll; rm root; ll)
- 若曾經使用過 cifscreds 時,請使用『 cifscreds clearall 』清除所有的暫時使用權
- 用 student 的身份去操作 /media/data 這個目錄 (cd /media/data; ll; touch root; ll; rm root; ll)
- 用 student 身份,去取得 teacher1 的身份,然後操作 /media/data 這個目錄 (cd /media/data; ll; touch root; ll; rm root; ll)
- 防火牆議題
- 最簡單的方式為透過 iptables 控制 port 139 與 port 445 是否放行即可。
- 另外, smb.conf 裡面也提供了『 hosts allow 』這個設定項目來給予處理。亦即你可以針對內網開放 iptables, 但可以透過 hosts allow 來指定某個 IP 或某段 IP 的設定喔!
- (client)詢問你身邊的同學,他的 Server IP 是多少?然後,使用 smbclient -L //IP -u std1 之類的方式,測試是否能夠找到使用的環境?
- (SERVER)讓外部這個 192.168.254.xxx 的區網也能穿透防火牆來進行連線!
- (client)再次嘗試 smbclient -L ... 那段指令,若成功,請將 std1 的家目錄掛載到 /media/std1 目錄下
- (client)掛載成功後,進去 /media/std1 裡面操作一下檔案系統
- (client)卸載檔案系統。
- (SERVER)更改設定檔,讓你的 Samba 只能讓你的內部區網還有 127.0.0.0/8 這兩個網段可以使用(外部區網停權)
- (client)再次嘗試 smbclient -L ... 那段指令,應該要不成功才對喔!
8.5: 課後練習
- (60%)實作題:啟動 Server 作業硬碟 - unit08
- 網路參數的設定,請依據底下的方式來設定好你的網路環境:
- 建立 ens3 為外部的連線網卡 (相同的連線界面名稱),使用 ethernet 類型,且:
- IPv4 的 IP位址: 172.18.255.*/24 ,其中 * 為老師規定的 IP 尾數
- gateway 為 172.18.255.254
- DNS 為 172.16.200.254 以及 168.95.1.1
- 使用 teamd 的機制建立內部區域網路的備援功能:
- team 的界面使用 team0 卡號,且連線名稱請命名為 team0
- team 使用 activebackup 備援功能,不要使用 loadbalance
- team 的實體網卡 (team slave) 請使用 ens7 及 ens8 ,且其連線名稱名稱亦請命名為 ens7, ens8
- team0 網路參數為: 172.19.*.254/24,不需要 gateway
- 主機名稱指定為: server*.example.dic
- 最終你的主機名稱與 IP 的對應為:
server*.example.dic 172.18.255.* 別名為 server* server254.example.dic 172.18.255.254 別名為 server254 server.lan*.example.dic 172.19.*.254 別名為 server client.lan*.example.dic 172.19.*.1 別名為 client
- 建立 ens3 為外部的連線網卡 (相同的連線界面名稱),使用 ethernet 類型,且:
- 基本的伺服器作業系統設定行為:
- 依據底下的說明,選擇距離我們最近的成大網站來作為 yum server 的來源:
成大 ccns 網站: https://mirror.ccns.ncku.edu.tw/howto/#rocky-linux
請記得修改過設定檔,應該要將清單清除 (yum clean all) 較佳。 - 安裝相關的軟體,至少須安裝 vim-enhanced, bash-completion, net-tools, bind-utils, kernel
- 全系統自動升級,且每天凌晨 3 點也會自動升級一次。(請寫入 /etc/crontab 為主)
- 將 SELinux 修改成為 Enforcing 模式,且未來每次開機都自動為 Enforcing 才行
- 依據底下的說明,選擇距離我們最近的成大網站來作為 yum server 的來源:
- 實際設定好本機防火牆
- 請關閉 firewalld 服務,並且自行安裝、啟動 iptables 服務
- 將預設的規則轉存到 /root/firewall.sh 這個檔案內
- 修改上述 firewall.sh 腳本,讓內容有點像底下這樣:
- 首先將全部的規則刪除 (應該有三條指令)
- 設定好預設政策,讓 INPUT 成為 DROP 而 OUTPUT 與 FORWARD 成為 ACCEPT
- 針對 INPUT 前三條規則為 (1)回應封包 (2)放行 lo 界面 (3)放行 icmp 封包
- 放行你自己的內部區域網路那個網域的連線要求 (針對 LAN 的信任設定)
- 讓 ssh 只對外部的區網放行,不會對 Internet 放行 (對 ssh 連線做限制較佳)
- 讓 http 針對整個 Internet 放行 (一般公開的服務設計)
- 最後讓確定的規則轉存到 /etc/sysconfig/iptables 這個設定檔
- 重新啟動 iptables 服務,然後觀察規則是否正確
- 實際設定好 Server 的路由功能
- 讓核心支援 IP 轉遞的功能,並且每次重新開機都可以自動生效
- 修改 /root/firewall.sh ,在該檔案加入清除 nat 表格的規則與自訂鏈的設定
- 增加規則:讓來自內部網路的封包,在路由判斷後,並預計由 ens3 對外網卡出去的封包,全部偽裝成為 ens3 的 IP 位址 (一般在數據機上面的就是 public IP)
- 在 /etc/sysconfig/iptables-config 當中增加 nf_nat_ftp 及 nf_conntrack_ftp 模組功能
- 上述功能在開機後依舊能夠順利啟動
- 基本的網芳分享設定
- 只開放本伺服器的 (1) lo 亦即是 localhost 內部迴圈網路、 (2)連接到 LAN 的內部網域、(3)所有同學伺服器可以互連的那個外部區域網路, 只有這三個 LAN 可以這部伺服器的 Samba 服務; (hint: 除了 iptables 防火牆,還要記得 Samba 自己的防火牆設定也需要!)
- 這部 Samba 的工作群組為 LINUX,而主機名稱使用 stationXX
- 讓 alex, dora, vitor 能夠使用網芳取得自己的家目錄,且能夠從遠端掛載使用! 這三個帳號的 Linux 密碼是 iamlinux,Samba 密碼都是 mylinux
- 專題共享之 Samba 設定
- alex, dora, vitor 為三個專題組員,他們預計加入群組名稱為 vhost 群組的次要群組支援
- 這三個人想要共享 /srv/myvhost 目錄,這三個帳號可以具有完整權限,但非專題組員則沒有任何權限
- 這三個人想要使用 Samba 分享資源,分享的目錄就這個 /srv/myvhost,但分享的資源名稱想設定為 vhostdir, 且這個目錄是可以被瀏覽的,但需要有帳密才能登入!
- 另建立一個名為 admin1 的帳號,這個帳號可以唯讀使用 /srv/myvhost,且可以完整使用 /srv/myvhost/toadmin 目錄。
- admin1 也可以使用 vhostdir 這個 Samba 資源,且登入密碼為 myadmin。
- 網路參數的設定,請依據底下的方式來設定好你的網路環境:
- (30%)實作題:啟動 client 作業硬碟
- 網路參數的設定,請依據底下的方式來設定好:
- 建立 ens3 的連線網卡 (相同的連線界面名稱),使用 ethernet 類型,且:
- IPv4 的 IP位址: 172.19.*.1/24 ,其中 * 為老師規定的 IP 尾數
- gateway 為 172.19.*.254
- DNS 為 172.16.200.254 以及 168.95.1.1
- 主機名稱指定為: client.lan*.example.dic
- 最終你的主機名稱與 IP 的對應為:
server*.example.dic 172.18.255.* 別名為 server* server254.example.dic 172.18.255.254 別名為 server254 server.lan*.example.dic 172.19.*.254 別名為 server client.lan*.example.dic 172.19.*.1 別名為 client
- 建立 ens3 的連線網卡 (相同的連線界面名稱),使用 ethernet 類型,且:
- 實際設定好本機防火牆
- 預設請使用 firewalld 防火牆服務,不要使用 iptables 服務!
- 請將預設的領域 (zone) 改為 work 領域,且 ens3 為其管理之界面網卡
- 預計放行的服務主要有 ssh 與 http 兩個服務,其他還可能有預設會啟用的 dhcp 用戶端服務。
- 查詢 rich rule (man firewalld.richlanguage),確認來自本機同一個 LAN 網段的封包,通通給予放行。
- 上述放行的防火牆服務,在下次重新開機後,依舊會存在才行
- Samba 的掛載與使用:
本題目標是:讓來自你 server 的 vhostdir 掛載到本機的 /srv/myvhost 目錄下 - 在掛載的權限上,預設使用 alex 的帳密掛載上述資源,但帳密請寫入 /root/alex.txt 當中,同時,開機就可以掛載此目錄。
- 系統上面有個名為 dora 的帳號 (若帳號不存在,請自己建置) 另外,當 dora 要使用此目錄時,可以透過 cifscreds 更改自己的認證來登入此系統。
- 網路參數的設定,請依據底下的方式來設定好:
- 早期辦公室達成檔案分享為使用 NetBIOS,這個機制無法跨過路由。(1)後來在這個基礎上面開發出哪個協定,所以它可以跨路由!且(2)使用的 port 又是幾號?
- 在 Linux 上面達成 SMB (server message block) 這個協定的軟體為 Samba,Samba 最早的目的是加入微軟開發的哪個協定中以進行檔案分享的?
- 承上,所以 (1)Samba 啟動的服務有那兩個?而(2)各服務啟用的 port 又各別是哪種格式 (tcp/udp) 且埠口號碼分別是?
- 有個主機名稱為 serverhost,這個主機分享的目錄為 /srv/mydata/ ,而 samba 設定的資源項目為 [checkdata],請問,在 windows 上面看到的分享網址會是怎麼寫?
- 若要掛載來自 server 的裝置,且要加上多人共用該掛載的目錄時,該加上那兩個特別的掛載選項?
- 請將 Server/Client 的硬碟通通啟動,並且確認兩者間的連線沒有問題;
- 在 Server 硬碟上面登入,然後用 root 的身份執行 vbird_server_check_unit ,並依據提示資料填寫你的學號與 IP 尾數
- 該程式會偵測你的系統,並且通知你哪個部份可能有問題,你需要持續觀察或者重新處理的部份會交代妥當。
- 若一切沒問題,螢幕就會出現如下的字樣,然後你就能夠使用 links 去檢查你的檔案是否有順利的上傳了!
- Please use links http://172.18.255.250/upload/unit08 to check your filename
- 2022/11/17:將整體資料在 RockyLinux 9 上實作,變化不大!對題目的解釋稍微更新。