一、什么是權(quán)限
在linux系統(tǒng)中主要包含三種權(quán)限r(nóng)wx,rwx權(quán)限對(duì)于文件和目錄而言,分別代表了不同的含義
tips:這里暫不討論suid,sgid等復(fù)雜權(quán)限
1. rwx的含義——讀?寫?執(zhí)行?
-
對(duì)于文件來說:
r: 讀文件內(nèi)容的權(quán)限
w: 編輯文件內(nèi)容
x: 執(zhí)行文件的權(quán)限,例如shell腳本需要有x權(quán)限才可以被執(zhí)行
-
對(duì)于目錄來說:
r: 讀取目錄下文件列表權(quán)限
w: 新增、刪除目錄下文件,對(duì)已存在的文件或目錄改名、移動(dòng)
x: 進(jìn)入目錄的權(quán)限
# 如果某個(gè)文件的權(quán)限設(shè)置為rwx,那我可以隨意操作這個(gè)文件嗎?包括cat, vi, mv, rm?
# 答案:可以cat和vi, 能否mv和rm取決于父級(jí)目錄的w權(quán)限
# 如果某個(gè)目錄的權(quán)限設(shè)置為rwx, 那我可以隨意操作這個(gè)目錄下所有文件嗎?包括cat, vi, mv, rm?
# 答案:可以mv和rm, 能否cat和vi取決于子文件的rw權(quán)限
tips: 所以,即便我限制了當(dāng)前文件的權(quán)限,但如果父級(jí)目錄權(quán)限沒有控制好,這個(gè)文件也有可能不翼而飛,反之亦然。
2. ls -l命令下權(quán)限列表的含義

1) 第1個(gè)字符代表是目錄、文件還是軟鏈接
"-"代表文件,"d"代表目錄,"l"代表軟鏈接
# 擴(kuò)展:軟鏈接和硬鏈接有什么區(qū)別,兩者的rwx權(quán)限有何不同
2) 第2-4字符代表owner的權(quán)限
3) 第5-7字符代表group的權(quán)限
4) 第8-10字符代表others的權(quán)限
5) 第11字符代表是否有acl權(quán)限設(shè)置
"."代表沒有配置acl權(quán)限,"+"代表有配置有acl權(quán)限
如果在src目錄下你有一個(gè)private目錄,不想讓領(lǐng)導(dǎo)和其他開發(fā)者看,你要怎么設(shè)置權(quán)限?
chmod 700 ./private
tips: 常用命令chmod的744、777的含義

將每組3位二進(jìn)制數(shù)轉(zhuǎn)化為十進(jìn)制,就分別代表各自的權(quán)限
二、怎么改權(quán)限
- chmod 命令——修改owner, grouper, others權(quán)限
# 遞歸修改某個(gè)目錄下所有文件權(quán)限
# drwxrwx---. aa agroup src
chmod -R 774 ./src
# 修改某個(gè)目錄的權(quán)限
# drwxrwxr--. aa agroup private
chmod 700 ./private
# 修改某個(gè)文件權(quán)限
# -rwxr--r--. aa agroup README.md
chmod 764 ./README.md
# 給某個(gè)文件去除寫權(quán)限,增加執(zhí)行權(quán)限
# -rwxrw-r--. aa agroup README.md
chmod -w ./README.md
chmod +x ./README.md
# 細(xì)粒度權(quán)限配置,u代表owner, g代表group, o代表others
chmod u=rw,g=rx,o=r /README.md
- chown 命令——修改文件屬主和群屬主(需要root權(quán)限)
# 例如:將file文件屬主改為${name}, group改為${group}
chown ${name}:${group} ./file
- usermod命令——修改用戶信息,可以將某用戶加入群組,獲得該群組權(quán)限
# 例如:將${name}用戶加入到docker group
usermod -aG docker ${name}
- setfacl——細(xì)粒度修改文件權(quán)限(賦予某用戶特定權(quán)限)
# 對(duì)src目錄,單獨(dú)為aa用戶配置r-x權(quán)限
setfacl -m u:aa:r-x src/
# 對(duì)test及其下屬子目錄,單獨(dú)為myuser用戶配置r-x權(quán)限
setfacl -m d:u:myuser:r-x test/
# 刪除test目錄的acl配置
setfacl -b test/
# 查詢用戶細(xì)粒度配置
getfacl test/
顯示權(quán)限列表時(shí),-rwxr-xr-x**+ ** 中"+"代表該文件配置了acl權(quán)限
三、如何用權(quán)限
1. 權(quán)限管理的作用
-
系統(tǒng)保護(hù)
在你的系統(tǒng)中,關(guān)于系統(tǒng)服務(wù)的文件通常只有root才能讀寫,系統(tǒng)的重要命令只有root才能執(zhí)行。
# 例如:test-api 服務(wù)去年有l(wèi)og4j漏洞,假設(shè)不法分子侵入行內(nèi)網(wǎng)絡(luò)發(fā)現(xiàn)并利用這個(gè)漏洞植入了腳本 # 如果啟動(dòng)app的用戶是appuser,植入的腳本能夠獲得的權(quán)限也只有appuser的權(quán)限,無法對(duì)其他應(yīng)用和系統(tǒng)層造成影響, # 如果啟動(dòng)app的用戶是root,那整個(gè)應(yīng)用層+系統(tǒng)層都有可能被侵入,影響層面會(huì)變得非常大。
-
保證應(yīng)用規(guī)范合理
# 舉個(gè)testapp的例子,testapp應(yīng)用會(huì)把dsApp上傳的文件歸檔到testapp自己的目錄內(nèi),如果把這個(gè)目錄權(quán)限放得太大[ rwxrwxrwx ], 當(dāng)dsApp在sftp過來操作的時(shí)候不小心給你把歸檔目錄誤刪了,會(huì)導(dǎo)致很嚴(yán)重的問題,而且追溯和恢復(fù)都不簡單,最后的責(zé)任還很可能是自己,誰讓文件權(quán)限設(shè)置這么大呢?
-
團(tuán)隊(duì)開發(fā)軟件或數(shù)據(jù)共享
# 如果你有一個(gè)軟件開發(fā)團(tuán)隊(duì),在你的團(tuán)隊(duì)中有三個(gè)人aa, bb, cc,你希望每個(gè)人都可以使用某一些目錄下的文件, 而不是你團(tuán)隊(duì)的其他人則不予以開放呢? # 可以新建一個(gè)dev的群組,將aa, bb, cc賬號(hào)加入dev群組,那么我就可以將團(tuán)隊(duì)所需的文件和目錄權(quán)限訂為 [ rwxrwx--- ]來提供給dev的工作團(tuán)隊(duì)使用!
2. 權(quán)限的使用原則
-
謹(jǐn)慎使用root用戶進(jìn)行操作
1)防止誤操作造成無法挽回的后果
# 例如:當(dāng)開發(fā)人員本來想要執(zhí)行rm -rf ./ 時(shí),輸入成了rm -rf / , root用戶不會(huì)提示,直接執(zhí)行2)權(quán)限升級(jí)容易,權(quán)限降級(jí)難,用root用戶操作衍生出的所有文件的屬主都是root
# 例如我第一次啟動(dòng)一個(gè)應(yīng)用使用的是root賬戶,假設(shè)應(yīng)用會(huì)生成某些目錄,比如日志目錄,目錄的默認(rèn)權(quán)限775,后面學(xué)習(xí)了權(quán)限知識(shí)之后知道了不應(yīng)該用root起應(yīng)用,我決定直接創(chuàng)建一個(gè)新用戶去運(yùn)行應(yīng)用,會(huì)出現(xiàn)什么結(jié)果? # 新用戶啟動(dòng)該應(yīng)用會(huì)報(bào)錯(cuò),因?yàn)闊o法將日志寫入到日志目錄內(nèi)。
-
最小可用權(quán)限原則——權(quán)限層次劃分清晰,保證系統(tǒng)層、應(yīng)用層權(quán)限最小可用
1)應(yīng)用層:我們應(yīng)該為每個(gè)應(yīng)用單獨(dú)創(chuàng)建屬于自己應(yīng)用的用戶(有部分應(yīng)用在安裝時(shí)會(huì)自動(dòng)生成本應(yīng)用用戶,如nginx)
# 例如:創(chuàng)建test用戶啟動(dòng)test-app,創(chuàng)建mysql用戶啟動(dòng)mysql應(yīng)用,創(chuàng)建nginx用戶啟動(dòng)nginx服務(wù); # 創(chuàng)建dsapp-sftp用戶給ds-app端負(fù)責(zé)上傳文件
2)系統(tǒng)層:創(chuàng)建root權(quán)限用戶(approot),授予對(duì)linux系統(tǒng)熟悉的開發(fā)者使用, 如果需要多個(gè)root權(quán)限用戶,可以建立一個(gè)root權(quán)限組,將用戶加入root權(quán)限組。
# 正常情況下,以下常用的系統(tǒng)相關(guān)文件,需要root權(quán)限用戶才能進(jìn)行修改
/etc/profile # 環(huán)境文件
/etc/crontab # job文件
/etc/sudoers # root權(quán)限用戶文件
/etc/ssh/sshd_config # ssh配置文件
/etc/passwd # 用戶信息文件
# 以前公司有個(gè)同事,在某CSDN上看ssh相關(guān)文檔去學(xué)習(xí)私鑰登陸服務(wù)器,需要配置/etc/ssh/sshd_config,文件里有一項(xiàng)是PasswordAuthentication, 意思是ssh是否允許通過密碼登陸,他把這個(gè)配置改成了no,導(dǎo)致這臺(tái)服務(wù)器沒辦法ssh登陸
# 這個(gè)問題一方面說明,熟悉linux系統(tǒng)的開發(fā)者才能成為root權(quán)限用戶的使用者;另一方面也說明要帶著批判的眼光去看待開源博客!
四、練習(xí)
1) 假設(shè)aa, bb, cc同屬于devgroup這個(gè)群組,都不屬于root群組,如果有下面的兩個(gè)文件,請(qǐng)說明aa, bb, cc用戶對(duì)以下兩個(gè)文件的相關(guān)權(quán)限為何?
-rw-r--r-- 1 root root 238 Jun 18 17:22 config.conf
-rwxr-xr-- 1 bb devgroup 5238 Jun 19 10:25 text.txt
| config.conf | text.txt | |
|---|---|---|
| aa | r | rx |
| bb | r | rwx |
| cc | r | rx |
2) 假設(shè)有個(gè)賬號(hào)名稱為aa,他的home目錄在/home/aa/,cloris對(duì)此目錄具有[rwx]的權(quán)限。 若在此目錄下有個(gè)名為text.data的文件,該文件的權(quán)限如下:
-rwx------ 1 root root 4365 Sep 19 23:20 text.data
請(qǐng)問aa是否可以讀、修改、刪除此文件?
aa不能讀和修改這個(gè)文件,但可以刪除該文件。
3)案例:某服務(wù)器目錄/home/test 下,交換文件目錄名稱 EXCHANGE_DIR
該目錄有以下功能:test-app系統(tǒng)向該目錄上傳交換文件,ds-app系統(tǒng)拉取交換文件,如何設(shè)計(jì)目錄和文件權(quán)限?
分析:為了保證最小權(quán)限原則,我們可以創(chuàng)建testusr用戶由test-app系統(tǒng)使用,執(zhí)行交換文件上傳,創(chuàng)建dsappusr用戶由ds-app使用,執(zhí)行交換文件下載,因此,testusr用戶需要 EXCHANGE_DIR 目錄的rwx權(quán)限,dsappusr需要 EXCHANGE_DIR 目錄的rx權(quán)限
方案1)EXCHANGE_DIR目錄owner:group為testusr:testusr, 權(quán)限設(shè)置成775
方案2)創(chuàng)建exchangegroup群組,將testusr, dsappusr加入exchangegroup, EXCHANGE_DIR目錄owner:group設(shè)為testusr:exchangegroup, 權(quán)限設(shè)置成750
方案3)EXCHANGE_DIR目錄owner:group為testusr:testusr, 權(quán)限設(shè)置成770, 給予dsappusr用戶額外權(quán)限,即setfacl -m u:dsappusr:r-x EXCHANGE_DIR/,第三種方案更像是前期設(shè)計(jì)階段未設(shè)計(jì)完善而做出的補(bǔ)救措施
除了目錄的權(quán)限外,那生成的文件權(quán)限也可以按同樣的方案進(jìn)行設(shè)計(jì)
五、 更多l(xiāng)inux資料
網(wǎng)頁版《鳥叔的linux私房菜》:可以系統(tǒng)學(xué)習(xí)linux相關(guān)技能
http://cn.linux.vbird.org/linux_basic/linux_basic.php
備注:linux是開發(fā)者進(jìn)階的必要能力之一!
擴(kuò)展思考:
所以,從權(quán)限和安全問題上看,要考慮的問題非常多,那IT行業(yè)經(jīng)歷了這么久,有沒有一個(gè)很好的工具簡化權(quán)限和安全管理呢?
有沒有一個(gè)工具可以做到應(yīng)用間隔離?
虛擬化容器技術(shù), 容器技術(shù)極大的規(guī)范和簡化了安全和權(quán)限問題,容器的使用使得本來容易被忽略的安全和權(quán)限問題,得到了強(qiáng)制規(guī)劃和預(yù)防:
1)容器的設(shè)計(jì)鼓勵(lì)所有應(yīng)用容器間通過網(wǎng)絡(luò)進(jìn)行交互,盡量少通過文件交互,避免了文件權(quán)限耦合
2)容器應(yīng)用即使遇到安全問題被攻破,影響也不會(huì)溢出到容器外
這也是docker在如今的環(huán)境如此盛行的原因,當(dāng)然使用容器本身也會(huì)帶來很多技術(shù)性難題,這里不做討論。