寫在前面的話
先來說說故事背景:公司內部文件服務器的解決方案其實很多,對於中小型互聯網公司,大多的在這一塊的選型還是 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 的一些知識如果不知道可以去簡單了解一些,本文還是針對直接有需要的朋友。
最后,如果你覺得還可以,給個推薦也是可以的。