作者:fbysss
msn:jameslastchina@hotmail.com 
blog:blog.csdn.net/fbysss
聲明:本文由fbysss原創(chuàng),轉(zhuǎn)載請注明出處
關(guān)鍵字:Linux
權(quán)限管理
背景
   
之前的開發(fā)服務(wù)器,所有人都是用root賬號登錄,一開始,用起來確是很爽很自由,也沒發(fā)現(xiàn)什么問題。但逐漸的,幾次莫名的文件丟失、數(shù)據(jù)庫無法正常啟動
的問題,使得權(quán)限管理問題成為亟待解決的任務(wù)。實(shí)際上,僅僅是一個簡單的reboot、shutdown或者是rm命令,破壞性是非常大的。而且,誤操作
的人也不好定位。root只能掌握在少數(shù)人手中。
一、團(tuán)隊(duì)構(gòu)建環(huán)境,文件讀寫共享
    項(xiàng)目代碼位于/svn/prj下,通過svn
up更新代碼,調(diào)用ant來編譯、部署。那么,prj這個目錄,對于每個人都是需要可讀寫的。
我們知道,用什么用戶登錄,新創(chuàng)建的文件宿主,就是
當(dāng)前用戶。而默認(rèn)的文件權(quán)限是644(-rw-r--r--),張三從代碼倉庫中update的文件,或者編譯后生成的class文件,李四是沒法刪除
的。執(zhí)行ant clear必然不成功,每次都用chmod去修改相應(yīng)文件,總不是個事,那怎么辦呢?
   
目標(biāo)很明確:我們希望,開發(fā)團(tuán)隊(duì)中,每一個開發(fā)人員之間的權(quán)限是平等的,誰新建的文件都可以被其他人讀寫。
    分解出
來是兩個事情:
1.目錄/svn/prj應(yīng)該屬于開發(fā)團(tuán)隊(duì),即一個用戶組。這很簡單,建立一個組,比如叫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是有區(qū)別的。-G是大家自然理解的,把一個用戶加到一個組或者多個組(逗號分隔)里面去。-g呢,則是
設(shè)置用戶的gid。也就是用戶登陸后初始group(initial group)。
     使用id
zhangsan命令,可以看到,uid=zhangsantest,gid=dev,groups=zhangsan,dev?;蛘呤褂胓roups
zhangsan,結(jié)果是zhangsan dev
     要注意,創(chuàng)建一個用戶,默認(rèn)會創(chuàng)建一個同名的組,如果不加-g參數(shù),gid就是那個
組的id,新建文件,組屬也是用戶同名組。所以在這里,-g和-G都是缺一不可的。    
2.更改文件創(chuàng)建的默認(rèn)權(quán)限為664(-rw-rw-
r--)。
   
這里涉及到一個知識,就是umask,umask主要用來控制默認(rèn)創(chuàng)建文件或目錄的權(quán)限??梢允褂胾mask命令直接修改。在我們的linux環(huán)境中,默
認(rèn)的umask是022。
umask:設(shè)置哪位為1,則哪位就沒有權(quán)限。放開哪位,哪位有權(quán)限。但文件例外,最高到666(默認(rèn)沒有執(zhí)行權(quán)限)。
目錄則可以到777
比如設(shè)置umask為022,則目錄最高可以到755,umask為002,則最高目錄可以到775
   
解決思路:每個用戶登錄都會執(zhí)行一些初始化腳本,可以在腳本中修改用戶的umask。
腳本片段如下:   
USERGROUP=`/usr/bin/id
-Gn $USER`
echo $USERGROUP | grep -q dev
if [ $? -eq 0 ]; then 
   
umask 0002
fi
意思很簡單,這里不贅述。要注意的是,Linux中,應(yīng)該放在/etc/bashrc里面,而不是/etc
/profile中。
登錄shell配置文件執(zhí)行順序
         
/etc/profile-->/etc/profile.d/*.sh-->~/.bash_profile-->~/.bashrc-->/etc/bashrc
我
們應(yīng)該把這個設(shè)置放在最后執(zhí)行的文件/etc/bashrc的末尾位置,以防止設(shè)置被覆蓋(實(shí)際上,linux的/etc/bashrc文件開頭就有一段
類似的umask設(shè)置)。
   
要說明一點(diǎn):控制用戶對某個目錄的默認(rèn)讀寫權(quán)限,是沒有直接支持的。在實(shí)際中,暫時也沒必要,如果真有特殊需要,可以通過crontab設(shè)置監(jiān)控進(jìn)程定時
進(jìn)行修改,也很簡單,在此不做說明。
二、普通用戶的特權(quán)身份
   
OK,在第一部分中,我們解決了多人文件共享讀寫,該運(yùn)行服務(wù)器了。不就是tomcat嗎,startup一下。事情沒想象那么簡單,Tomcat運(yùn)行過
程中,會寫日志文件,一開始,簡單的把logs目錄組屬劃分給dev,但后來陸續(xù)又遇到一系列不同的權(quán)限問題。于是反思一下:與其一點(diǎn)點(diǎn)修改運(yùn)行
Tomcat涉及的那么多文件權(quán)限,不如把自己身份臨時換一下?這就是我們要說的sudo。
   
sudo命令就是sudoer用來執(zhí)行root操作的。sudoer配置,通過visudo來編輯。
visudo實(shí)際上就是vi
/etc/sudoers的包裝版。但用這個命令的最大好處是,它有語法檢查。
%dev ALL =NOPASSWORD: /usr/local/tomcat/bin/startup.sh
%dev ALL
=NOPASSWORD: /usr/local/tomcat/bin/shutdown.sh
百分號表示組,如果是多個組,
用%dev,%dev2
ALL為所有主機(jī)。如果要指定主機(jī),可換成某個ip地址。
NOPASSWORD表示不需要sudoer輸入密碼。
最
后為授權(quán)執(zhí)行的命令全路徑。
sudoer的配置還有很多,比如可以設(shè)置別名等,請讀者自行學(xué)習(xí)。
執(zhí)行:組員只需要在原有命令前面加上
sudo 即可。
如此一來,Tomcat停啟問題也解決了。
補(bǔ)充:sudo命令通配符的設(shè)置,如果某個目錄下的所有命令
都可以給sudoers開放,可以使用xxxx/*.sh,但這樣一來,使用者必須使用絕對路徑執(zhí)行。而在當(dāng)前路徑也不能使用./xxx.sh。是何原
因,待研究。
三、sftp用戶的umask設(shè)置
似乎萬事大吉了。但有一天,發(fā)現(xiàn)還是有一些文件沒有權(quán)
限覆蓋,為什么呢?后來發(fā)現(xiàn)這部分文件,都是使用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 即可。
當(dāng)然,umask
0002這行可以跟上面的策略一致
變成
USERGROUP=`/usr/bin/id -Gn $USER`
echo
$USERGROUP | grep -q developers
if [ $? -eq 0 ]; then 
    umask
0002
fi
四、NFS文件設(shè)置問題
A、B
兩臺服務(wù)器,A為NFS服務(wù)器,B為掛載服務(wù)器。開發(fā)中,發(fā)現(xiàn)這個目錄老是出現(xiàn)權(quán)限問題。但查看組屬又沒什么問題。甚是奇怪。
具
體事例:
一個NFS的源路徑,比如是hostA:/share,該目錄在hostA上的屬于用戶組dev,hostB
mount了這個目錄,看到該目錄用戶組是一個組號,比如105,其實(shí)就是hostA上的dev用戶組號。但這個組號,在hostB上并不存在
(hostB上也有一個dev組),如何讓hostB上的用戶也能讀寫該目錄?最后,終于發(fā)現(xiàn)癥結(jié)所在:兩邊的組號不一致,而文件的擁有者和組屬,本質(zhì)是
認(rèn)id不認(rèn)name的。修改了哪邊,都會讓另一邊無法寫,產(chǎn)生了沖突。
解決辦法:把兩邊的組號修改為一致。
1.
首先,保證hostB上沒有105號的組,如果有,則需要協(xié)調(diào)一個兩邊都不產(chǎn)生沖突的組號,可能需要修改兩邊的組號。
2.組號確定之后,假設(shè)
105就行,在hostB上執(zhí)行:groupmod –g 105 dev。變化可以通過/etc/group查看
3.重新設(shè)置改組涉及到的文件
的組屬。
4.屬于該組的用戶需要重新登錄,這樣才會生效。
五、root用戶的行為限制
權(quán)限問題中,還有root的濫用。如果使用root來編譯部署,root產(chǎn)生的文件,dev用戶又無權(quán)訪問了。也就是說,既然已經(jīng)劃分好了小組構(gòu)建
目錄,每個用戶都應(yīng)該是dev組成員才對。root用戶應(yīng)該只在授權(quán)或普通用戶無法解決的時候,再切換使用。