我的java天地

          Linux團隊開發權限管理紀實

          本文來自CSDN博客,轉載請標明出處:http://blog.csdn.net/fbysss/archive/2010/07/26/5767148.aspx

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

          一、團隊構建環境,文件讀寫共享
          ??? 項目代碼位于/svn/prj下,通過svn up更新代碼,調用ant來編譯、部署。那么,prj這個目錄,對于每個人都是需要可讀寫的。
          我們知道,用什么用戶登錄,新創建的文件宿主,就是當前用戶。而默認的文件權限是644(-rw-r--r--),張三從代碼倉庫中update的文件,或者編譯后生成的class文件,李四是沒法刪除的。執行ant clear必然不成功,每次都用chmod去修改相應文件,總不是個事,那怎么辦呢?
          ??? 目標很明確:我們希望,開發團隊中,每一個開發人員之間的權限是平等的,誰新建的文件都可以被其他人讀寫。
          ??? 分解出來是兩個事情:
          1.目錄/svn/prj應該屬于開發團隊,即一個用戶組。這很簡單,建立一個組,比如叫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?;蛘呤褂胓roups zhangsan,結果是zhangsan dev
          ???? 要注意,創建一個用戶,默認會創建一個同名的組,如果不加-g參數,gid就是那個組的id,新建文件,組屬也是用戶同名組。所以在這里,-g和-G都是缺一不可的。???
          2.更改文件創建的默認權限為664(-rw-rw-r--)。

          ??? 這里涉及到一個知識,就是umask,umask主要用來控制默認創建文件或目錄的權限??梢允褂胾mask命令直接修改。在我們的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中。
          登錄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,%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用戶應該只在授權或普通用戶無法解決的時候,再切換使用。


          ?

          posted on 2010-08-20 09:33 tobyxiong 閱讀(628) 評論(0)  編輯  收藏 所屬分類: linix

          <2010年8月>
          25262728293031
          1234567
          891011121314
          15161718192021
          22232425262728
          2930311234

          導航

          統計

          常用鏈接

          留言簿(3)

          隨筆分類(144)

          隨筆檔案(157)

          相冊

          最新隨筆

          搜索

          積分與排名

          最新評論

          閱讀排行榜

          評論排行榜

          主站蜘蛛池模板: 昂仁县| 浠水县| 崇阳县| 渝中区| 婺源县| 五峰| 泰顺县| 木兰县| 齐河县| 永安市| 河池市| 申扎县| 信宜市| 盐亭县| 定陶县| 彭水| 金阳县| 牡丹江市| 隆德县| 光山县| 双江| 治县。| 清水县| 昆山市| 类乌齐县| 兖州市| 黎平县| 江达县| 呼和浩特市| 彭阳县| 宜兴市| 宁波市| 沐川县| 马尔康县| 平昌县| 武山县| 金堂县| 深圳市| 桐庐县| 阿巴嘎旗| 宁强县|