開發(fā)者進(jìn)階——淺析linux文件權(quán)限設(shè)計(jì)

一、什么是權(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)限列表的含義

linux權(quán)限ls -l (1).jpg
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的含義

777.jpg

將每組3位二進(jìn)制數(shù)轉(zhuǎn)化為十進(jìn)制,就分別代表各自的權(quán)限

二、怎么改權(quán)限

  1. 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
  1. chown 命令——修改文件屬主和群屬主(需要root權(quán)限)
# 例如:將file文件屬主改為${name}, group改為${group}
chown ${name}:${group} ./file
  1. usermod命令——修改用戶信息,可以將某用戶加入群組,獲得該群組權(quán)限
# 例如:將${name}用戶加入到docker group
usermod -aG docker ${name}
  1. 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ù)性難題,這里不做討論。

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡書系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容