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