Linux伺服器 Linux伺服器

(CentOS 7) 網站伺服器建置與管理 - 舊版

網站伺服器建置與管理 > 課程內容 > 第 8 堂課 - 網路芳鄰伺服器 (SMB Server)

第 8 堂課 - 網路芳鄰伺服器 (SMB Server)

上次更新日期 2017/11/21
上節課程講到如果需要 Unix 對 Unix 進行檔案系統傳輸,此時可以透過 LDAP 搭配 NFS 來進行。那如果需要的是 Windows 對 Windows 呢? 當然使用微軟的網芳 (CIFS) 這個玩意兒。那如果需要的是 Windows client 對 Linux Server 呢?那可能就得要 SMB 服務了! 其實 SMB 就是 Linux 版本的網路芳鄰就是了!可以讓 windows 直接掛載喔!
  • 8.1: 檔案伺服器之網路芳鄰 (windows 網路磁碟機)
  • 8.2: Samba 檔案伺服器基礎設定
  • 8.3: 共享資源之設定
  • 8.4: 其他議題:同一掛載點不同權限與防火牆
  • 8.5: 課後練習

8.1: 檔案伺服器之網路芳鄰 (windows 網路磁碟機)

大家應該經常聽到『檔案伺服器』,這個玩意兒可以提供用戶端取得檔案來源。那麼有哪些檔案伺服器呢?前一堂課我們聽過了 NFS 了!那接下來還有哪些呢? 其實經常使用到的檔案伺服器有這些喔:

  • 常見的檔案伺服器分類:
  1. 非同步的檔案伺服器 (在 Server/client 各保留一份)
    • FTP
    • HTTP
  2. 同步的檔案伺服器 (只保留在 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 』即可
例題 8.1.A:透過上述的方式,完成底下的設定:
  • 建立一個名為 D:\myshare 目錄
  • 在這個目錄上面設定所有人都唯讀的權限,且分享的名稱為 forshare
  • 承上,也請查閱一下,能否『針對特定用戶』給予權限?
  • 在自己的檔案總管上面輸入『 \\127.0.0.1 』查看是否正確的看到一個新的目錄?
  • 告知旁邊的同學,請他連線到自己的 IP,是否能夠看到自己分享的目錄?
  • 當你登入同學的網芳之後,請寫下該目錄的『網址』為何?
  • 嘗試查詢 windows 防火牆:
    • 先開啟『網路和共用中心』,查看目前的網路使用的是『工作場所』『家用網路』
    • 同一畫面左側點選『變更進階共用設定』,單純查看不同共用的差別
    • 打開 windows 防火牆,點選左側『進階設定』,再點選左側『輸入規則』,之後查看『輸入規則』的框框, 往下找到『檔案及印表機共用』的項目,然後拖拉下方的 bar 另其顯示右邊『連機連接埠』的位置,請查看到 TCP port 139 與 445 的項目, 並請查閱到『遠端位址』的可用範圍是『任何』還是『本機子網路』?
    • 針對 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 提供的服務就有:

  1. smb:
    • 就是 Samba 的主要服務,管理分享的目錄、傳輸檔案與身份驗證等等重要功能 (只要這個即可)
    • 因為涉及檔案傳輸,需要 TCP 封包,主要埠口為 port 139, 445
  2. 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]
   參數項目 = 設定內容
   ....

[分享資源名稱]
   參數項目 = 設定內容
   ....
例題 8.2.A:完成底下題目:
  • 安裝並檢查 samba 相關的軟體與軟體所含的檔名資料
  • 檢查 /etc/samba/smb.conf 以及 /etc/samba/smb.conf.sample 的差異
  • 在 smb.conf 底下,預設的中括號 [] 有哪幾個?
  • 基礎伺服器設定 [global]

針對 [global] 的設定項目中,需要修改的就是原本範例檔中的資料,大致有這些設定:

  • workgroup = 工作群組名稱
  • netbios name = 現在預設為主機名稱喔! (可不設定,預設使用 hostname 的輸出)
  • server string = 主機的簡易說明 (可不設定)
  • display charset = 自己伺服器上面的顯示編碼
  • unix charset = 在 Linux 伺服器上面所使用的編碼
  • dos charset = 就是 Windows 用戶端的編碼
  • security = user 透過 samba 伺服器本身的帳號密碼資料庫

雖然說 display charset, dos charset, unix charset 可以指定中文編碼的格式,不過由於目前新版的 Samba 對於編碼的解析已經大有進步, 同時,目前我們的 server/client 大多同時使用 utf8 了,因此上述關於語系的設定可以忽略不理,或者是全部通通設定為 utf8 即可。

例題 8.2.B:請設定你的 samba server 有如下的參數:
  • 工作群組為 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 的內容!

例題 8.2.C:完成底下的練習:
  • 確定設定無誤之後,啟動 smb 服務,且該服務下次開機也會自動啟動
  • 查詢系統新增的埠口有哪些?
  • 使用 smbclient -L //IP 然後直接按下 [enter] 以匿名登入,看看是否啟動了 Samba ?若順利取得 samba 的資訊,應該會看到如下資訊:
    Enter DIC\root's password:
    Anonymous login successful
    OS=[Windows 6.1] Server=[Samba 4.6.2]
    
            Sharename       Type      Comment
            ---------       ----      -------
            print$          Disk      Printer Drivers
            IPC$            IPC       IPC Service (4050cxxx, VBird Tsai)
    Anonymous login successful
    OS=[Windows 6.1] Server=[Samba 4.6.2]
    
            Server               Comment
            ---------            -------
    
            Workgroup            Master
            ---------            -------
    
  • 放行系統上的用戶使用權

在 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 用戶)
例題 8.2.D:建立 alex 讓它可以使用 samba
  • 以正常方法建立 alex 這個用戶,此用戶無須給予 Linux 密碼
  • 讓 alex 可以使用 Samba,且登入 Samba 的密碼為 heyalex
  • 使用 pdbedit -L 確認 alex 在 Samba 的使用列表當中
  • 使用 smbclient -L //IP -U alex 之後輸入 alex 的密碼,看看能否得到類似如下的畫面:
    Enter DIC\alex's password:
    Domain=[STATION200] OS=[Windows 6.1] Server=[Samba 4.6.2]
    
            Sharename       Type      Comment
            ---------       ----      -------
            print$          Disk      Printer Drivers
            IPC$            IPC       IPC Service (4050cxxx, VBird Tsai)
            alex            Disk      Home Directories
    Domain=[STATION200] OS=[Windows 6.1] Server=[Samba 4.6.2]
    
            Server               Comment
            ---------            -------
    
            Workgroup            Master
            ---------            -------
    
  • 用戶家目錄的掛載與卸載 (含 SELinux 問題處理)

要在 Linux 底下使用 Samba 檔案系統也頗簡單!只要使用 cifs 檔案系統掛載即可!當然,掛載時還得要輸入帳號與密碼才行喔!

例題 8.2.E:完成底下練習:
  • 確認剛剛使用 alex 查詢到的網路磁碟機網址為何?
  • 使用『 mount -t cifs -o username=alex,passowrd=xxxx 裝置網址 /mnt 』嘗試將 alex 的家目錄掛載到 /mnt 當中
  • 使用 df 確認是否已經掛載
  • 使用 ll /mnt 是否可以查詢到資料?若出現權限不符,嘗試使用 setenforce 0 ,再確認一次,若確實可以查詢到檔案, 重新 setenforc 1,然後自行處理 SELinux 的相關問題。或者查閱 /etc/samba/smb.conf.example 查閱解決方案。
  • 分別使用 touch /home/alex/from_local 以及 touch /mnt/from_samba ,最終 ll /home/alex ,得到什麼權限?為什麼?

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 檔案系統的權限有關的!

例題 8.3.A:嘗試建立一個專題組員共用的系統
  • 預計建立的三個帳號分別是 std1, std2, std3,預計共同加入的專題組名為 graduation ,而預計共享的目錄在 /srv/myproject。 請先設計好帳號、群組與目錄之權限等資訊。並請注意,針對 /srv/myproject 目錄,非群組外的其他人不具備任何權限。
  • 在 SELinux 的情境下,Samba 分享的目錄需要具備特別的類型,請依據 /etc/samba/smb.conf.example 的說明, 解決 SELinux 的類型問題。
  • 透過 samba 分享該目錄,且目錄的預計網址會是:『 //your_server_name/graduation/ 』,在 graduation 群組內的用戶具有完整權限, 且加入 graduation 即可使用本目錄資源。
  • 讓 std1, std2, std3 均可使用 Samba,且其 Samba 密碼為 heystd1, heystd2, heystd3 。
  • 嘗試使用 std3 掛載本目錄,並且將本資源掛載於 /media/data 下,並且測試寫入與讀出等動作。

雖然上述設定之後,未來若有其他用戶要加入該專題,只要 (1)建立新的用戶, (2)將該用戶加入 graduation 群組中, (3)讓該用戶可以使用 Samba, 那麼該用戶就能夠使用 //your_server_name/graduation/ 的資源了。不過,如果有個名為 teacher1 的用戶想要進入該目錄資源『查閱』而已, 僅是查閱而不能寫入喔 (就是僅有 rx 而已),那該如何處理呢?

例題 8.3.B:讓 teacher1 這位老師僅能進入該目錄查閱,不可直接寫入 (意思是,依舊可以下載的意思,只是變成唯讀)
  • 建立名為 teaacher1 的帳號,但該帳號不可加入 graduation 群組
  • 讓 teacher1 可以使用 Samba,且密碼為 heyteacher。
  • 在 smb.conf 當中,讓 teacher1 可以使用 graduation 資源!
  • 利用 teacher1 的身份掛載 //your_server_name/graduation 到 /media/teacher ,請確認能否進入該目錄查閱資料? 若不行,該如何處理 (注意,需要用到 ACL 喔!)
  • 在公開檔案 (/etc/fstab) 保障密碼不外流的方式

如果你需要一開機就將上述的資源掛載起來的話,那麼就得要寫入 /etc/fstab 當中!並且將帳號與密碼也都要寫入在第四欄位, 例如這樣的寫法:

[root@localhost ~]# vim /etc/fstab
//127.0.0.1/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
例題 8.3.C:完成底下的練習:
  • 安裝 cifs-utils,並觀察該軟體提供什麼檔案
  • man mount.cifs 之後,搜尋 credential 這個關鍵字,查出檔案的格式
  • 利用 std3 掛載 //IP/graduation 到 /media/data 去,且將帳密寫在 /root/mountstd3.txt 這個檔案中, 不要讓帳密出現在 /etc/fstab 當中。

8.4: 其他議題:同一掛載點不同權限與防火牆

  • 觀察來自 client 的連線狀態 (Server 端功能)

有時候在 Samba server 還是得要知道用戶端的使用情況比較好!最簡單的查詢方式,就是透過 smbstatus 去查看一下即可! 我們就能夠了解到有哪些用戶端連線進來系統了!

[root@localhost ~]# smbstatus

Samba version 4.6.2
PID     Username     Group        Machine                                   Protocol Version  Encryption
--------------------------------------------------------------------------------------------------------
18472   std3         std3         127.0.0.1 (ipv4:127.0.0.1:45996)          NT1               -         

Service      pid     Machine       Connected at                     Encryption   Signing
---------------------------------------------------------------------------------------------
IPC$         18472   127.0.0.1     一 11月 20 22時10分12秒 2017 CST -            -
graduation   18472   127.0.0.1     一 11月 20 22時10分12秒 2017 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
//127.0.0.1/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 的帳號資訊來設定的。 那如果此時 std1 登入系統之後,想要使用他自己的權限該如何是好?他可以這麼做:

[std1@localhost ~]$ cd /media/data
[std1@localhost data]$ ll
ls: reading directory .: 拒絕不符權限的操作

[std1@localhost data]$ cd
[std1@localhost ~]$ cifscreds add 127.0.0.1
Password:  # 這裡輸入 std1 的 samba 密碼喔!

[std1@localhost ~]$ ll /media/data
[std1@localhost ~]$ touch /media/data/std1

# 回到 root 的身份,來到 server 查看一下狀態!
[root@localhost ~]# smbstatus

Samba version 4.6.2
PID     Username     Group        Machine                                   Protocol Version  Encryption
--------------------------------------------------------------------------------------------------------
18978   std2         std2         127.0.0.1 (ipv4:127.0.0.1:46002)          NT1               -         
18978   std1         std1         127.0.0.1 (ipv4:127.0.0.1:46002)          NT1               -         
18978   std3         std3         127.0.0.1 (ipv4:127.0.0.1:46002)          NT1               -         

Service      pid     Machine       Connected at                     Encryption   Signing
---------------------------------------------------------------------------------------------
graduation   18978   127.0.0.1     一 11月 20 22時32分23秒 2017 CST -            -
graduation   18978   127.0.0.1     一 11月 20 22時19分49秒 2017 CST -            -
IPC$         18978   127.0.0.1     一 11月 20 22時19分49秒 2017 CST -            -
graduation   18978   127.0.0.1     一 11月 20 22時23分20秒 2017 CST -            -

No locked files

你就可以發現確實能夠以自己的帳號來登入該目錄工作了!而且在 server 端也看到同一個 PID 會有不同的帳號來使用,此時不同的帳號身份就能夠用不同的權限來操作該目錄! 達成多人共用的情況囉!

例題 8.4.A:完成上述的功能!並且嘗試以 std1, std2, teacher 登入系統,嘗試查閱一下 /media/data 以及 cifscreds 之後的查詢結果! 並自行探討權限操作的情況!(ll, touch, cat, rm 等等指令的操作)
  • 讓 /media/data 這個掛載點加入 multiuser 以及 sec=ntlmssp 的參數,並讓此參數生效。同時使用『 mount | grep data 』確認該參數已經正確設定。
  • 用 root 的身份去操作 /media/data 這個目錄 (cd /media/data; ll; touch root; ll; rm root; ll)
  • 用 std3 的身份去操作 /media/data 這個目錄 (cd /media/data; ll; touch root; ll; rm root; ll)
  • 用 std1 的身份去操作 /media/data 這個目錄 (cd /media/data; ll; touch root; ll; rm root; ll) 若失敗,請使用 cifscreds add 127.0.0.1 嘗試處理權限的問題!
  • 用 teacher1 的身份去操作 /media/data 這個目錄 (cd /media/data; ll; touch root; ll; rm root; ll) 若失敗,請使用 cifscreds add 127.0.0.1 嘗試處理權限的問題!
  • 防火牆議題
  • 最簡單的方式為透過 iptables 控制 port 139 與 port 445 是否放行即可。
  • 另外, smb.conf 裡面也提供了『 hosts allow 』這個設定項目來給予處理。亦即你可以針對內網開放 iptables, 但可以透過 hosts allow 來指定某個 IP 或某段 IP 的設定喔!
例題 8.4.B:完成下列練習 (未變更 iptables 的情況下)
  • 使用 //192.168.254.xxx/yy 來連線,能否成功?討論一下原因!
  • 更改設定檔,讓你的 Samba 只能讓你的內部區網還有 127.0.0.0/8 這三個網段可以使用
  • 使用 //192.168.254.xxx/yy 來連線,能否成功?討論一下原因!

8.5: 課後練習

  1. (60%)實作題:啟動 Server 作業硬碟 - unit08
    1. 網路參數的設定,請依據底下的方式來設定好你的網路環境:
      1. 因為我們的系統是 clone 來的,因此裡面的網路卡連線會跑掉。所以,請先刪除所有的連線界面後, 再依據底下的要求逐次建立好你的網路環境:
      2. 建立 eth0 為外部的連線網卡 (相同的連線界面名稱),使用 ethernet 類型,且:
        • IPv4 的 IP位址: 172.18.255.*/24 ,其中 * 為老師規定的 IP 尾數
        • gateway 為 172.18.255.254
        • DNS 為 172.16.200.254 以及 168.95.1.1
      3. 使用 teamd 的機制建立內部區域網路的備援功能:
        • team 的界面使用 team0 卡號,且連線名稱請命名為 team0
        • team 使用 activebackup 備援功能,不要使用 loadbalance
        • team 的實體網卡 (team slave) 請使用 eth1 及 eth2 ,且其連線名稱名稱亦請命名為 eth1, eth2
        • 內部網路參數為: 172.19.*.254/24,不需要 gateway
      4. 主機名稱指定為: server*.example.dic
      5. 最終你的主機名稱與 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
        
    2. 基本的伺服器作業系統設定行為:
      1. 使用崑山的 FTP 網站作為你的 YUM server 來源,並且清除一次 yum 清單快取
      2. 安裝相關的軟體,至少須安裝 vim-enhanced, bash-completion, net-tools, mailx, wget, links, bind-utils
      3. 全系統自動升級,且每天凌晨 3 點也會自動升級一次。(請寫入 /etc/crontab 為主)
      4. 將 SELinux 修改成為 Enforcing 模式,且未來每次開機都自動為 Enforcing 才行
    3. 實際設定好本機防火牆
      1. 請關閉 firewalld 服務,並且自行安裝、啟動 iptables 服務
      2. 將預設的規則轉存到 /root/firewall.sh 這個檔案內
      3. 首先將全部的規則刪除 (應該有三條指令)
      4. 設定好預設政策,讓 INPUT 成為 DROP 而 OUTPUT 與 FORWARD 成為 ACCEPT
      5. 針對 INPUT 前三條規則為 (1)回應封包 (2)放行 lo 界面 (3)放行 icmp 封包
      6. 放行你自己的內部區域網路那個網域的連線要求
      7. 讓 ssh 只對外部的區網放行,不會對 Internet 放行
      8. 讓 http 針對整個 Internet 放行
      9. 最後讓確定的規則轉存到 /etc/sysconfig/iptables 這個設定檔
      10. 重新啟動 iptables 服務,然後觀察規則是否正確
    4. 實際設定好 Server 的路由功能
      1. 讓核心支援 IP 轉遞的功能
      2. 修改 /root/firewall.sh ,增加刪除 nat 表格的規則與自訂鏈
      3. 增加讓來自內部網路的封包,並預計由 eth0 對外網卡出去的封包,全部偽裝成為 eth0 的 public IP
      4. 在 /etc/sysconfig/iptables-config 當中增加 nf_nat_ftp 及 nf_conntrack_ftp 模組功能
      5. 此功能在開機後依舊能夠順利啟動
    5. 基本的網芳分享設定
      1. 僅有自己的 (1) lo 亦即是 localhost 內部網路、 (2)外部網域、(3)內部網域可以使用自己這部伺服器的 Samba 服務;
      2. 這部 Samba 的工作群組為 LINUX,而主機名稱使用 stationXX
      3. 讓 alex, dora, vitor 能夠使用網芳取得自己的家目錄,且能夠從遠端掛載使用! 這三個帳號的密碼都是 mylinux
    6. 專題共享之 Samba 設定
      1. alex, dora, vitor 為三個專題組員,他們預計加入群組名稱為 vhost 群組的次要群組支援
      2. 這三個人想要共享 /srv/myvhost 目錄,這三個帳號可以具有完整權限,但非專題組員則沒有任何權限
      3. 這三個人想要使用 Samba 分享資源,分享的目錄就這個 /srv/myvhost,但分享的資源名稱想設定為 vhostdir, 且這個目錄是可以被瀏覽的,但需要有帳密才能登入!
      4. 另建立一個名為 admin1 的帳號,這個帳號可以唯讀使用 /srv/myvhost,且可以完整使用 /srv/myvhost/toadmin 目錄。
      5. admin1 也可以使用 vhostdir 這個 Samba 資源,且登入密碼為 myadmin。
  2. (30%)實作題:啟動 client 作業硬碟
    1. 網路參數的設定,請依據底下的方式來設定好:
      1. 因為我們的系統是 clone 來的,因此裡面的網路卡連線會跑掉。所以,請先刪除所有的連線界面後, 再依據底下的要求逐次建立好你的網路環境:
      2. 建立 eth0 的連線網卡 (相同的連線界面名稱),使用 ethernet 類型,且:
        • IPv4 的 IP位址: 172.19.*.1/24 ,其中 * 為老師規定的 IP 尾數
        • gateway 為 172.19.*.254
        • DNS 為 172.16.200.254 以及 168.95.1.1
      3. 主機名稱指定為: client.lan*.example.dic
      4. 最終你的主機名稱與 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
        
    2. 實際設定好本機防火牆
      1. 預設請使用 firewalld 防火牆服務,不要使用 iptables 服務!
      2. 預計放行的服務主要有 ssh 與 http 兩個服務,其他還可能有預設會啟用的 dhcp 用戶端服務。
      3. 查詢 rich rule (man firewalld.richlanguage),確認來自本機同一個 LAN 網段的封包,通通給予放行。
      4. 上述放行的防火牆服務,在下次重新開機後,依舊會存在才行
    3. Samba 的掛載與使用
      1. 讓來自你 server 的 vhostdir 掛載到本機的 /srv/myvhost 目錄下
      2. 預設使用 alex 的帳密掛載上述資源,但帳密請寫入 /root/alex.txt 當中,同時,開機就可以掛載此目錄。
      3. 系統上面有個名為 dora 的帳號 (自己建置,且此帳號的 UID 需要與 Samba Server 相同才行!) 另外,當 dora 要使用此目錄時,可以透過 cifscreds 更改自己的認證來登入此系統。
  3. (10%)簡易問答題: 從具有 GUI 及中文的用戶端 Linux ,使用『 ssh root@172.19.*.254 』登入你的 Server ,之後建立 /root/ans.txt 的檔案,並將底下各題目的答案寫入你 server 當中!
    1. 早期辦公室達成檔案分享為使用 NetBIOS,這個機制無法跨過路由。(1)後來在這個基礎上面開發出哪個協定,所以它可以跨路由!且(2)使用的 port 又是幾號?
    2. 在 Linux 上面達成 SMB (server message block) 這個協定的軟體為 Samba,Samba 最早的目的是加入微軟開發的哪個協定中以進行檔案分享的?
    3. 承上,所以 (1)Samba 啟動的服務有那兩個?而(2)各服務啟用的 port 又各別是哪種格式 (tcp/udp) 且埠口號碼分別是?
    4. 有個主機名稱為 serverhost,這個主機分享的目錄為 /srv/mydata/ ,而 samba 設定的資源項目為 [checkdata],請問,在 windows 上面看到的分享網址會是怎麼寫?
    5. 若要掛載來自 server 的裝置,且要加上多人共用該掛載的目錄時,該加上那兩個特別的掛載選項?
  4. 上傳成績
    1. 請將 Server/Client 的硬碟通通啟動,並且確認兩者間的連線沒有問題;
    2. 在 Server 硬碟上面登入,然後用 root 的身份執行 vbird_server_check_unit ,並依據提示資料填寫你的學號與 IP 尾數
    3. 該程式會偵測你的系統,並且通知你哪個部份可能有問題,你需要持續觀察或者重新處理的部份會交代妥當。
    4. 若一切沒問題,螢幕就會出現如下的字樣,然後你就能夠使用 links 去檢查你的檔案是否有順利的上傳了!
    5. Please use links http://172.18.255.250/upload/unit08 to check your filename