1. 程式人生 > >Samba:打造企業級授權檔案共享伺服器

Samba:打造企業級授權檔案共享伺服器

寫在前面的話

 

先來說說故事背景:公司內部檔案伺服器的解決方案其實很多,對於中小型網際網路公司,大多的在這一塊的選型還是 FTP,或者 VSFTP,但是個人實在是對那個東西喜歡不起來,於是就選擇了配置相對於簡單一些的 Samba,燃鵝,在使用過程中卻被各種需求搞得心力交瘁。於是便決定寫這麼個東西,一個能夠滿足大部分公司的需求的東西。

文章標題企業級,一是源於本身是企業使用,所以企業級沒毛病。二是會夾雜複雜的授權,所以還是沒毛病。

總之就是咱先把牛逼吹了,實不實現的了再說,

 

 

需求說明

 

假如存在一個 XXX 網際網路公司,它的簡單組織架構如下圖:

 

現在它對於檔案伺服器的需求如下圖:

 

說明:

1. 賬號分為三類:管理員 / 普通 / 只讀,注意,我們建立使用者不能有下劃線,中橫線,否則 Windows 中有 BUG

 

2. 部門目錄許可權如下:

見許可權:代表可以見到別人的目錄,但是不能開啟。

讀許可權:能夠進去目錄檢視檔案,但是不能修改。

寫自己:自己上傳的檔案可以修改刪除。

寫別人:別人上傳的檔案都能修改刪除。

 

3. 公共目錄許可權:

所有使用者對於公共檔案中所有檔案都可見且能夠讀取。

使用者能夠除了只讀賬戶對自己部門的目錄都能夠寫檔案。

各個部門管理員賬戶能夠對自己部門所有檔案進行任何操作。

最後就是 zcadmin 使用者其實就是老闆,想幹啥幹啥,當然 zc 也有很高的許可權,可以到處寫。

 

 

第一階段:基礎部門目錄許可權分配

 

理了下目錄關係和使用者關係,我們可以先著手把使用者和目錄設計好:

注意,我這裡使用的是 CentOS 7.5,總的來說 CentOS 系列使用方法應該都差不多,區別可能就是啟動命令。

1. 安裝 Samba:

yum -y install samba samba-client samba-swat

 

2. 建立目錄:

mkdir /company
cd /company/
mkdir 總裁辦檔案 研發部檔案 人事行政部檔案 財務部檔案 公共檔案
cd 公共檔案/
mkdir 財務部共享 研發部共享 人事行政部共享 總裁辦共享

檢視目錄結構:

tree -N /company/

結構如圖:

 

3. 新增使用者

# 新增組
groupadd zcgroup
groupadd devgroup
groupadd hrgroup
groupadd fdgroup

# 新增使用者
useradd -g zcgroup -s /sbin/nologin zc
useradd -g zcgroup -s /sbin/nologin zcread
useradd -g zcgroup -s /sbin/nologin zcadmin

useradd -g devgroup -s /sbin/nologin dev
useradd -g devgroup -s /sbin/nologin devread
useradd -g devgroup -s /sbin/nologin devadmin

useradd -g hrgroup -s /sbin/nologin hr
useradd -g hrgroup -s /sbin/nologin hrread
useradd -g hrgroup -s /sbin/nologin hradmin

useradd -g fdgroup -s /sbin/nologin fd
useradd -g fdgroup -s /sbin/nologin fdread
useradd -g fdgroup -s /sbin/nologin fdadmin

 

4. 修改目錄許可權:

cd /company/

# 修改目錄許可權
chmod -R 1775 總裁辦檔案 研發部檔案 人事行政部檔案 財務部檔案 公共檔案

# 修改所有者所屬組
chown -R devadmin.devgroup 研發部檔案
chown -R hradmin.hrgroup 人事行政部檔案
chown -R fdadmin.fdgroup 財務部檔案
chown -R zcadmin.zcgroup 總裁辦檔案

 

5. 修改主配置檔案:/etc/samba/smb.conf

##############################################################################
# 全域性配置
##############################################################################
[global]
        workgroup = WORKGROUP
        server string = Samba Server Version %v
        netbios name = Samba
        log file = /var/log/samba/samba_log.%m
        max log size = 50
        security = user
        passdb backend = tdbsam
        include = /etc/samba/user/%U.smb.conf

注意:紅色部分配置說明我們每個使用者登入以後其實是單獨的配置檔案,配置檔案為 /etc/samba/user/使用者名稱.smb.conf

 

6. 新增使用者單獨配置檔案:

mkdir /etc/samba/user
cd /etc/samba/user

我們這裡以研發部為例,普通使用者 dev 的配置檔案:dev.smb.conf

[研發部檔案]
    comment = dev config
    path = /company/研發部檔案/
    public = no
    admin users = devadmin
    valid users = @devgroup
    writable = yes
    create mask = 1777
    directory mask = 1777
    force create mode = 1777
    force directory mode = 1777

 

管理員使用者 devadmin 的配置檔案:devread.smb.conf

[研發部檔案]
    comment = dev admin config
    path = /company/研發部檔案/
    public = no
    admin users = devadmin
    valid users = @devgroup
    writable = yes
    create mask = 1777
    directory mask = 1777
    force create mode = 1777
    force directory mode = 1777

 

只讀使用者 devread 的配置檔案:devadmin.smb.conf

[研發部檔案]
    comment = dev read config
    path = /company/研發部檔案/
    public = no
    admin users = devadmin
    valid users = @devgroup
    writable = no

簡單做個說明:

a. 掩碼設為 1777,目的是讓所有有權使用者都可隨意進出所屬部門下面全部目錄(最後一個 7 是為 zc 這種使用者準備的)。

b. 建立目錄的人具有該目錄以及該目錄下檔案的絕對控制權。這意味著假設 dev 使用者建立一個 dev 目錄,devadmin 去 dev 目錄下新建一個 test 檔案,由於 dev 使用者具有 dev 目錄的絕對控制權,所有他是能夠修改刪除該檔案的。但是如果這個檔案不在 dev 下面 dev 使用者就至於檢視許可權。

這種情形是不可避免的,在 Samba 中我們應該注重資料夾的使用。最好是基礎資料夾由 admin 賬戶建立。

c. 配置在 admin users 中的管理員賬戶擁有最高許可權,該共享下任何檔案都能修改刪除。

d. writable = no,直接只讀,不需要再分配其它許可權。

e. 最後說說為啥要即使同樣的配置也分為單獨的檔案,目的是為了分開管理,這樣我們想調整哪個使用者改哪個檔案即可。

最終配置如圖:

 

7. 將系統使用者新增到 Samba 中:

smbpasswd -a dev
smbpasswd -a devadmin
smbpasswd -a devread
smbpasswd -a hr smbpasswd -a hradmin smbpasswd -a hrread
smbpasswd -a fd smbpasswd -a fdadmin smbpasswd -a fdread
smbpasswd -a zc smbpasswd -a zcadmin smbpasswd -a zcread

檢視使用者:

pdbedit -L

如果想刪除某個使用者,則只需:

pdbedit -x 使用者名稱

 

8. 至此,我們完成了第一個階段,就是每個目錄擁有了三個角色,普通 / 管理員 / 只讀。

 

 

第二階段:總裁辦使用者其它許可權

 

我們根據許可權表知道,總裁辦出來只讀賬戶,其它賬戶是具備其他目錄的讀寫許可權的。

這意味著,zcadmin 得具備其它目錄 admin 的許可權,而 zc 使用者得具備其它目錄的普通許可權。

1. 將使用者加入各個目錄的組:

usermod -a -G devgroup zc
usermod -a -G devgroup zcadmin
usermod -a -G hrgroup zc
usermod -a -G hrgroup zcadmin
usermod -a -G fdgroup zc
usermod -a -G fdgroup zcadmin

 

2. 修改 zc.smb.conf 和 zcadmin.smb.conf

[總裁辦檔案]
    comment = zc config
    path = /company/總裁辦檔案/
    public = no
    admin users = zcadmin
    valid users = @zcgroup
    writable = yes
    create mask = 1777
    directory mask = 1777
    force create mode = 1777
    force directory mode = 1777

[研發部檔案]
    comment = zc config
    path = /company/研發部檔案/
    public = no
    admin users = devadmin,zcadmin
    valid users = @devgroup
    writable = yes
    create mask = 1777
    directory mask = 1777
    force create mode = 1777
    force directory mode = 1777

[人事行政部檔案]
    comment = hr config
    path = /company/人事行政部檔案/
    public = no
    admin users = hradmin,zcadmin
    valid users = @hrgroup
    writable = yes
    create mask = 1777
    directory mask = 1777
    force create mode = 1777
    force directory mode = 1777

[財務部檔案]
    comment = fd config
    path = /company/財務部檔案/
    public = no
    admin users = fdadmin,zcadmin
    valid users = @fdgroup
    writable = yes
    create mask = 1777
    directory mask = 1777
    force create mode = 1777
    force directory mode = 1777

到這一步的時候我做了如下測試:

a. devadmin 使用者登入,在 研發部檔案 中建立 admin 目錄和 admin 檔案。

b. 切換到 dev 使用者,嘗試刪除 admin 目錄和 admin 檔案,均提示許可權不足,進入 admin 目錄建立 dev 檔案,在外層建立 dev 目錄和 dev 檔案。

c. 切換 zc 使用者, 嘗試刪除 研發部檔案 中任意檔案,均提示無許可權,去 admin 目錄建立 zc 檔案,在外層建立 zc 目錄和 zc 檔案。

d. 切換 devadmin 和 zcadmin 進去 研發部檔案 中刪除任意檔案均可。

此時就實現了普通使用者只能刪除自己的檔案,管理員可以管理所有。

 

 

第三階段:公共檔案 

 

這其實是最麻煩的需求,其實通常對於這種目錄我們最好的出路方式就是除了管理員,各自能夠刪除修改各自的就行。

但是總有例外,有時需求來了擋都擋不住,所以這裡給出最複雜的設計。

1. 修改目錄許可權:

cd /company/公共檔案

chown -R devadmin.devgroup 研發部共享
chown -R hradmin.hrgroup 人事行政部共享
chown -R fdadmin.fdgroup 財務部共享
chown -R zcadmin.zcgroup 總裁辦共享

值得注意的是,此時 公共檔案 這個目錄的使用者和組依然是 root,我們不會去修改它。

 

2. 修改主配置檔案,新增公共配置:smb.conf

##############################################################################
# 全域性配置
##############################################################################
[global]
        workgroup = WORKGROUP
        server string = Samba Server Version %v
        netbios name = Samba
        log file = /var/log/samba/samba_log.%m
        max log size = 500
        security = user
        passdb backend = tdbsam
        include = /etc/samba/common.cmb.conf
        include = /etc/samba/user/%U.smb.conf

在我們匯入單個使用者配置之前,我先匯入這個公共配置,該配置意味著所有使用者都具有。如果後面的使用者不要或者許可權不對,我們都可以在單獨的使用者配置的檔案裡面複寫它。

值得注意的是,匯入順序很重要,這意味著誰複寫誰。

 

3. 增加 common 配置:/etc/samba/common.cmb.conf

[公共檔案]
    comment = common config
    path = /company/公共檔案/
    public = no
admin users = zcadmin valid users = @zcgroup,@devgroup,@hrgroup,@fdgroup writable = yes create mask = 1777 directory mask = 1777 force create mode = 1777 force directory mode = 1777

我們預設給寫許可權,所以使用者都可以在自己部門的目錄下修改刪除自己的檔案。

當然,zcadmin 這個是全部的管理員,所以我們這裡直接就給他指定了。

 

4. 只讀使用者複寫許可權,如:devread.smb.conf

[研發部檔案]
    comment = dev read config
    path = /company/研發部檔案/
    public = no
    admin users = devadmin
    valid users = @devgroup
    writable = no

[公共檔案]
    comment = common config
    path = /company/公共檔案/
    public = no
    valid users = @zcgroup,@devgroup,@hrgroup,@fdgroup
    writable = no

直接複寫為只讀許可權!

 

5. 普通使用者的許可權本身就和預設的許可權一致,所以我們不需要再度去修改。

 

6. 管理員使用者相比比較複雜,如果授權整個目錄就會導致所有目錄都能管理。

所以我這裡給出的方法是除了共享檔案作為管理員賬戶的一個專案外,另外裡面對於的部門也作為單獨專案授權。

但是為了不顯示兩個這樣的目錄,我們將單獨授權的目錄隱藏。

當然這裡需要排除 zcadmin,因為前面已經指定了,他就是全部的管理員,我們修改另外三個管理員配置。

這裡以 devadmin 為例:devadmin.smb.conf

[研發部檔案]
    comment = dev admin config
    path = /company/研發部檔案/
    public = no
    admin users = devadmin
    valid users = @devgroup
    writable = yes
    create mask = 1777
    directory mask = 1777
    force create mode = 1777
    force directory mode = 1777

[公共檔案-研發部共享]
    comment = common config
    path = /company/公共檔案/研發部共享/
    public = no
    admin users = zcadmin,devadmin
    valid users = @zcgroup,@devgroup,@hrgroup,@fdgroup
    writable = yes
    create mask = 1777
    directory mask = 1777
    force create mode = 1777
    force directory mode = 1777
browseable = no

 

最終達到的效果:

a. 部門普通使用者開啟公共檔案,能夠訪問所有資料夾。能夠在自己部門的目錄修改刪除自己的檔案。

b. 部門管理員能夠在公共檔案自己的部門目錄下任意刪改。對於其它部門目錄只讀。

c. zc 使用者能夠在公共檔案下所有目錄增刪改自己的檔案。

d. 只讀賬戶在公共檔案下全域性只讀。

 

7. 至此,所有需求全部完成。

 

 

小結

 

這篇文章寫了我差不多兩天,其中各種測試,windows 測試還非常麻煩。但是總的來說能夠滿足大部分需求。

當然,Samba 目前來說有個很大的問題,我依然沒有找到一款能夠像連線 FTP 一樣的客戶端來連線 Samba,如果知道的朋友可以分享一下。

關於其它 Samba 的一些知識如果不知道可以去簡單瞭解一些,本文還是針對直接有需要的朋友。

最後,如果你覺得還可以,給個推薦也是可以