Linux團隊開發許可權管理紀實

來源:互聯網
上載者:User

作者:fbysss
msn:jameslastchina@hotmail.com 
blog:blog.csdn.net/fbysss
聲明:本文由fbysss原創,轉載請註明出處
關鍵字:Linux 許可權管理

背景

    之前的程式開發伺服器,所有人都是用root帳號登入,一開始,用起來確是很爽很自由,也沒發現什麼問題。但逐漸的,幾次莫名的檔案丟失、資料庫無法正常啟動的問題,使得許可權管理問題成為亟待解決的任務。實際上,僅僅是一個簡單的reboot、shutdown或者是rm命令,破壞性是非常大的。而且,誤操作的人也不好定位。root只能掌握在少數人手中。

一、團隊構建環境,檔案讀寫共用
    項目代碼位於/svn/prj下,通過svn up更新代碼,調用ant來編譯、部署。那麼,prj這個目錄,對於每個人都是需要可讀寫的。
我們知道,用什麼使用者登入,新建立的檔案宿主,就是目前使用者。而預設的檔案許可權是644(-rw-r--r--),張三從代碼倉庫中update的檔案,或者編譯後產生的class檔案,李四是沒法刪除的。執行ant clear必然不成功,每次都用chmod去修改相應檔案,總不是個事,那怎麼辦呢?
    目標很明確:我們希望,Team Dev中,每一個開發人員之間的許可權是平等的,誰建立的檔案都可以被其他人讀寫。
    分解出來是兩個事情:
1.目錄/svn/prj應該屬於Team Dev,即一個使用者組。這很簡單,建立一個組,比如叫dev,使用chown即可
     #gruopadd dev
     #useradd zhangshan

     #useradd lisi
     #useradd zhangsan -G dev -g dev

     #useradd lisi -G dev -g dev
     #chown -R :dev /svn/prj
     這裡要特別說明一下,-g和-G是有區別的。-G是大家自然理解的,把一個使用者加到一個組或者多個組(逗號分隔)裡面去。-g呢,則是

設定使用者的gid。也就是使用者登陸後初始group(initial group)。
     使用id zhangsan命令,可以看到,uid=zhangsantest,gid=dev,groups=zhangsan,dev。或者使用groups zhangsan,結果是zhangsan dev
     要注意,建立一個使用者,預設會建立一個同名的組,如果不加-g參數,gid就是那個組的id,建立檔案,組屬也是使用者同名組。所以在這裡,-g和-G都是缺一不可的。    
2.變更檔建立的預設許可權為664(-rw-rw-r--)。

    這裡涉及到一個知識,就是umask,umask主要用來控制預設建立檔案或目錄的許可權。可以使用umask命令直接修改。在我們的linux環境中,預設的umask是022。
umask:設定哪位為1,則哪位就沒有許可權。放開哪位,哪位有許可權。但檔案例外,最高到666(預設沒有執行許可權)。目錄則可以到777
比如設定umask為022,則目錄最高可以到755,umask為002,則最高目錄可以到775
    解決思路:每個使用者登入都會執行一些初始化指令碼,可以在指令碼中修改使用者的umask。
指令碼片段如下:  
USERGROUP=`/usr/bin/id -Gn $USER`
echo $USERGROUP | grep -q dev
if [ $? -eq 0 ]; then
    umask 0002
fi
意思很簡單,這裡不贅述。要注意的是,Linux中,應該放在/etc/bashrc裡面,而不是/etc/profile中。

順便說一下,如果有幾個組都需要修改umask,可以使用grep正則或關係,比如

echo $USERGROUP | grep -q -e'dev' -e'qa'

其中的q參數,不過是代表quiet,不輸出而已。
用-E大寫的參數更強,相當於egrep。

比如上面的語句可以寫成 echo $USERGROUP | grep -q -E 'dev|qa'

登入shell設定檔執行順序
          /etc/profile-->/etc/profile.d/*.sh-->~/.bash_profile-->~/.bashrc-->/etc/bashrc
我們應該把這個設定放在最後執行的檔案/etc/bashrc的末尾位置,以防止設定被覆蓋(實際上,linux的/etc/bashrc檔案開頭就有一段類似的umask設定)。
    要說明一點:控制使用者對某個目錄的預設讀寫權限,是沒有直接支援的。在實際中,暫時也沒必要,如果真有特殊需要,可以通過crontab設定監控進程定時進行修改,也很簡單,在此不做說明。

二、普通使用者的特權身份
    OK,在第一部分中,我們解決了多人檔案分享權限設定讀寫,該運行伺服器了。不就是tomcat嗎,startup一下。事情沒想象那麼簡單,Tomcat運行過程中,會寫記錄檔,一開始,簡單的把logs目錄組屬劃分給dev,但後來陸續又遇到一系列不同的許可權問題。於是反思一下:與其一點點修改運行Tomcat涉及的那麼多檔案許可權,不如把自己身份臨時換一下?這就是我們要說的sudo。
    sudo命令就是sudoer用來執行root操作的。sudoer配置,通過visudo來編輯。
visudo實際上就是vi /etc/sudoers的封裝版。但用這個命令的最大好處是,它有語法檢查。

%dev ALL =NOPASSWORD: /usr/local/tomcat/bin/startup.sh
%dev ALL =NOPASSWORD: /usr/local/tomcat/bin/shutdown.sh

%dev ALL=NOPASSWORD: /usr/bin/rm /usr/local/tomcat/work/*  (注意這裡的rm必須是全路徑)

百分比符號表示組,如果是多個組,用%dev,%dev2
ALL為所有主機。如果要指定主機,可換成某個ip地址。
NOPASSWORD表示不需要sudoer輸入密碼。
最後為授權執行的命令全路徑。
sudoer的配置還有很多,比如可以設定別名等,請讀者自行學習。
執行:組員只需要在原有命令前面加上sudo 即可。

如此一來,Tomcat停啟問題也解決了。
補充:sudo命令萬用字元的設定,如果某個目錄下的所有命令都可以給sudoers開放,可以使用xxxx/*.sh,但這樣一來,使用者必須使用絕對路徑執行。而在當前路徑也不能使用./xxx.sh。是何原因,待研究。
三、sftp使用者的umask設定
似乎萬事大吉了。但有一天,發現還是有一些檔案沒有許可權覆蓋,為什麼呢?後來發現這部分檔案,都是使用winscp上傳的。
解決辦法:
vi /etc/ssh/sshd_config檔案,找到SubSystem sftp /usr/libexec/openssh/sftp-server這一行,修改為
SubSystem sftp /usr/libexec/openssh/sftp-server.sh
然後vi /usr/libexec/openssh/sftp-server.sh
添加
umask 0002
/usr/libexec/openssh/sftp-server
chmod 755  /usr/libexec/openssh/sftp-server.sh 即可。
當然,umask 0002這行可以跟上面的策略一致
變成
USERGROUP=`/usr/bin/id -Gn $USER`
echo $USERGROUP | grep -q developers
if [ $? -eq 0 ]; then
    umask 0002
fi

四、NFS檔案設定問題
A、B 兩台伺服器,A為NFS伺服器,B為掛載伺服器。開發中,發現這個目錄老是出現許可權問題。但查看組屬又沒什麼問題。甚是奇怪。
具體案例:
一個NFS的源路徑,比如是hostA:/share,該目錄在hostA上的屬於使用者組dev,hostB mount了這個目錄,看到該目錄使用者組是一個組號,比如105,其實就是hostA上的dev使用者組號。但這個組號,在hostB上並不存在(hostB上也有一個dev組),如何讓hostB上的使用者也能讀寫該目錄?最後,終於發現癥結所在:兩邊的組號不一致,而檔案的擁有者和組屬,本質是認id不認name的。修改了哪邊,都會讓另一邊無法寫,產生了衝突。
解決辦法:把兩邊的組號修改為一致。
1.首先,保證hostB上沒有105號的組,如果有,則需要協調一個兩邊都不產生衝突的組號,可能需要修改兩邊的組號。
2.組號確定之後,假設105就行,在hostB上執行:groupmod –g 105 dev。變化可以通過/etc/group查看
3.重新設定改組涉及到的檔案的組屬。
4.屬於該組的使用者需要重新登入,這樣才會生效。

五、root使用者的行為限制

許可權問題中,還有root的濫用。如果使用root來編譯部署,root產生的檔案,dev使用者又無權訪問了。也就是說,既然已經劃分好了小組構建目錄,每個使用者都應該是dev群組成員才對。root使用者應該只在授權或普通使用者無法解決的時候,再切換使用。

 

 

相關文章

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.