限模型與數(shù)字符號模式實(shí)戰(zhàn))
1. 權(quán)限模型入門先搞懂 Linux 為什么需要 chmod很多新手第一次在教程里看到chmod 755 file.txt這行命令時腦子里全是問號755 是什么為什么要敲這串?dāng)?shù)字file.txt 到底被怎么了我當(dāng)年剛開始碰 Linux 時也繞了好一陣子后來發(fā)現(xiàn)只要理解了權(quán)限模型整條命令就是一目了然的事情。Linux 是一個多用戶操作系統(tǒng)服務(wù)器上可能同時跑著幾十個甚至上百個進(jìn)程和賬戶。為了保證誰也不干擾誰、不越權(quán)動別人的文件系統(tǒng)給每個文件都設(shè)置了一套訪問控制規(guī)則這就是“權(quán)限”。chmod這個命令全稱是change mode作用是修改文件或目錄的訪問模式也就是權(quán)限配置。755則是你要設(shè)置的具體權(quán)限值而file.txt是操作對象。合在一起就是“把 file.txt 這個文件的權(quán)限設(shè)置為 755”。這套權(quán)限機(jī)制最核心的設(shè)計思想只有一句話對不同類型的用戶給不同的操作能力。所謂“不同類型用戶”Linux 把它分成了三類文件所有者owner、文件所屬的用戶組group、其他所有人others。所謂“操作能力”也分成三種讀rread、寫wwrite、執(zhí)行xexecute。三種用戶各自擁有三種權(quán)限組合起來就是一個 3×3 的權(quán)限矩陣。打個生活化的比方你租了一套房子你就是 owner可以有鑰匙自由進(jìn)出你的家人是 group也可以進(jìn)但可能不能改裝修外面的訪客是 others只能在你允許的情況下進(jìn)門參觀?!斑M(jìn)出”就是執(zhí)行權(quán)限“改裝修”就是寫權(quán)限“看房間”就是讀權(quán)限。理解了這套模型你再看chmod 755就不會覺得神秘了。2. 從 755 到 rwx數(shù)字和符號是怎么對應(yīng)上的2.1 755 拆開看三位數(shù)字分別代表誰755 這個寫法其實(shí)是“八進(jìn)制權(quán)限表示法”。它由三位數(shù)字組成第一位 7、第二位 5、第三位 5。這三個數(shù)字分別對應(yīng)前面說的三類用戶第一位 7文件所有者owner的權(quán)限第二位 5文件所屬組group的權(quán)限第三位 5其他用戶others的權(quán)限那 7 和 5 又是怎么來的這里用到了二進(jìn)制編碼。讀權(quán)限記作 4寫權(quán)限記作 2執(zhí)行權(quán)限記作 1。把需要的權(quán)限數(shù)值相加就得到一個 0~7 之間的數(shù)字?jǐn)?shù)值二進(jìn)制對應(yīng)權(quán)限含義0000---無任何權(quán)限1001--x僅可執(zhí)行2010-w-僅可寫3011-wx可寫、可執(zhí)行4100r--僅可讀5101r-x可讀、可執(zhí)行6110rw-可讀、可寫7111rwx可讀、可寫、可執(zhí)行所以 755 就是owner7 4 2 1 rwx讀、寫、執(zhí)行全開group5 4 1 r-x可讀、可執(zhí)行不能寫others5 4 1 r-x可讀、可執(zhí)行不能寫如果用ls -l查看文件詳情你會看到權(quán)限列長這樣-rwxr-xr-x 1 user group 1234 Jan 1 12:00 file.txt開頭第一個字符-表示這是普通文件。后面的九位字符rwxr-xr-x分成三組rwxowner、r-xgroup、r-xothers。跟 755 是完全等價的兩種寫法一個用數(shù)字一個用符號。2.2 為什么執(zhí)行權(quán)限對腳本和程序如此重要很多初學(xué)者會忽略執(zhí)行權(quán)限的意義覺得只要文件能讀能寫就行了。但在 Linux 里如果你想讓一個腳本直接通過./script.sh運(yùn)行或者讓一個二進(jìn)制程序被系統(tǒng)執(zhí)行文件必須帶有 x 權(quán)限。否則就算文件內(nèi)容完全正確系統(tǒng)也會甩給你一句Permission denied。我實(shí)測過一個場景把一段 Python 腳本拷到服務(wù)器上寫好了python3 test.py能跑但直接./test.py就報權(quán)限錯誤。原因很簡單——文件沒有執(zhí)行權(quán)限。加一句chmod x test.py或者chmod 755 test.py就好了。對于可執(zhí)行文件來說755 是相當(dāng)常見的配置。owner 擁有完整控制權(quán)可以修改、替換、刪除group 和其他用戶可以運(yùn)行查看但不能亂改保證了程序的完整性。2.3 目錄的 755 和文件的 755 含義并不一樣同一個 755用在文件上和用在目錄上效果差別很大。對于普通文件r 表示可以讀取內(nèi)容w 表示可以修改內(nèi)容x 表示可以當(dāng)作程序執(zhí)行。但對于目錄r可以列出目錄里有哪些文件ls 能看到名字w可以在目錄里創(chuàng)建、刪除、重命名文件x可以進(jìn)入這個目錄cd 進(jìn)去或者訪問目錄內(nèi)文件的具體屬性關(guān)鍵點(diǎn)在于如果目錄沒有 x 權(quán)限即使有 r 權(quán)限你也無法真正進(jìn)入目錄查看文件詳情。x 是目錄的“通行證”。755 對目錄來說意味著 owner 可以完全控制目錄內(nèi)的增刪改group 和其他用戶可以進(jìn)入目錄、查看文件列表但不能在目錄里創(chuàng)建或刪除文件。這個配置非常常用比如網(wǎng)站根目錄、代碼倉庫目錄基本都是 755。3. chmod 的各種寫法數(shù)字之外還有字母模式3.1 符號模式ux、g-w、or 這些怎么讀數(shù)字模式簡單直接但有時候你只想調(diào)整某一類用戶的某一項(xiàng)權(quán)限用數(shù)字反而要心算一遍。這時候可以用字母模式。它的格式是chmod [誰][操作][什么權(quán)限] 文件名“誰”用 uuser/owner、ggroup、oothers、aall代表全部三類表示“操作”用 添加、-移除、設(shè)置成確切值表示“什么權(quán)限”用 r、w、x 表示。舉個例子chmod ux file.txt # 給 owner 添加執(zhí)行權(quán)限 chmod g-w file.txt # 移除 group 的寫權(quán)限 chmod or file.txt # 把 others 的權(quán)限設(shè)為只讀 chmod ax script.sh # 所有用戶都加上執(zhí)行權(quán)限 chmod urwx,grx,orx # 等價于 chmod 755最后一行這種寫法其實(shí)就是 755 的符號版本。日常維護(hù)中我經(jīng)常用chmod ux這種加執(zhí)行權(quán)限的寫法因?yàn)樗桓男枰牡奈徊粫拥狡渌麢?quán)限設(shè)置。3.2 什么時候用數(shù)字什么時候用字母我的習(xí)慣是寫腳本、部署項(xiàng)目、給目錄設(shè)統(tǒng)一權(quán)限時用數(shù)字模式因?yàn)榭梢砸粭l命令把整個權(quán)限矩陣定死不給意外留空間臨時調(diào)試、給某個腳本加執(zhí)行權(quán)限時用字母模式因?yàn)槭挚?、不容易錯。舉個例子你剛創(chuàng)建了一個 shell 腳本想讓它能運(yùn)行直接chmod x deploy.sh注意這里我沒寫 u/g/o直接用了x。當(dāng)你省略“誰”時chmod 默認(rèn)是a即所有用戶都加上執(zhí)行權(quán)限。對個人開發(fā)的腳本問題不大但對服務(wù)器上的敏感腳本最好明確寫成ux避免向所有人開放執(zhí)行。3.3 chmod 777 為什么被反復(fù)警告網(wǎng)上到處能看到chmod 777這種寫法意思是 owner、group、others 全都擁有 rwx 全部權(quán)限。為什么大家都在喊著不要隨便用因?yàn)?777 等于你把文件的所有控制權(quán)交給了系統(tǒng)里每一個用戶。只要任何賬戶被攻破你的文件都可以被任意讀寫執(zhí)行。我見過不少新手為圖省事把網(wǎng)站目錄直接 777結(jié)果被掃描工具掃到可寫權(quán)限后塞了木馬。如果你只是想讓自己方便地操作文件正確的思路是把 owner 設(shè)為當(dāng)前用戶目錄給 755文件給 644 就足夠了。644 的含義是 owner 可讀可寫group 和 others 只讀這是普通文件的默認(rèn)常用權(quán)限。4. 實(shí)操場景拆解chmod 755 在各種場景下怎么用4.1 創(chuàng)建腳本后第一時間賦權(quán)假設(shè)我在/home/user/bin下寫了一個備份腳本backup.sh內(nèi)容是可執(zhí)行的 shell 代碼。創(chuàng)建完成后用ls -l看到權(quán)限是-rw-r--r--也就是 644。此時直接運(yùn)行./backup.sh系統(tǒng)會報Permission denied。原因就是文件沒有 x 權(quán)限。修復(fù)chmod 755 /home/user/bin/backup.sh賦權(quán)之后再次運(yùn)行就正常了。這套流程在寫自動化腳本時每天都會重復(fù)一定要養(yǎng)成“創(chuàng)建腳本后立刻賦權(quán)”的習(xí)慣。4.2 部署 Web 項(xiàng)目時的權(quán)限分配原則部署 Nginx 或者 Apache 站點(diǎn)時涉及 web 根目錄、靜態(tài)資源、上傳目錄和日志文件。推薦的做法是chmod 755 /var/www/html chmod 644 /var/www/html/index.html chmod 755 /var/www/html/assets這樣 web 服務(wù)器用戶比如 www-data可以讀取頁面、進(jìn)入目錄但沒法修改文件只有 owner也就是你自己才有權(quán)限更新文件。如果某個目錄需要接收用戶上傳比如圖片上傳目錄那就需要讓 web 進(jìn)程寫進(jìn)去再單獨(dú)給目錄加上寫入權(quán)限而不是對整個站點(diǎn)開 777。4.3 修改系統(tǒng)配置文件時的臨時提權(quán)很多系統(tǒng)配置文件默認(rèn)是 644root 擁有寫權(quán)限普通用戶只讀。你自己日常操作時如果需要臨時改一下配置通常配合 sudo 使用sudo chmod 644 /etc/nginx/nginx.conf注意一個反向操作有些文件出于安全考慮會被故意去掉寫權(quán)限即使 root 也改不了。這時候你會發(fā)現(xiàn)sudo vim /etc/xxx都報只讀。不要急先看權(quán)限位確認(rèn)是否需要加寫權(quán)限改完再恢復(fù)。例如某些 SSH 相關(guān)文件就建議保持嚴(yán)格的權(quán)限亂改反而有安全風(fēng)險。4.4 一條命令批量賦權(quán)find 與 chmod 的組合實(shí)際項(xiàng)目中經(jīng)常要批量處理。比如給某個項(xiàng)目下所有目錄設(shè)為 755、所有文件設(shè)為 644一條命令搞定find /path/to/project -type d -exec chmod 755 {} \; find /path/to/project -type f -exec chmod 644 {} \;用-type d匹配目錄、-type f匹配文件比直接無腦chmod -R 755 /path更精細(xì)。后者不管文件還是目錄都設(shè)成 755會讓普通文件也帶上了執(zhí)行權(quán)限不優(yōu)雅也沒必要。如果只是臨時給一批腳本統(tǒng)一加上執(zhí)行權(quán)限也可以用chmod x /path/*.sh這種通配符寫法在交互式 Shell 里用起來非常順手。5. 權(quán)限相關(guān)的常見坑與排查實(shí)錄5.1 查看權(quán)限ls -l 的輸出怎么讀排查權(quán)限問題第一件事就是看當(dāng)前權(quán)限。ls -l是基本功ls -l file.txt輸出里權(quán)限位的格式是-rwxr-xr-x。第一個字符代表文件類型-普通文件、d目錄、l軟鏈接。后面九個字符就是上文說的三類用戶權(quán)限。如果某些位是-就代表對應(yīng)權(quán)限缺失。還有一個小細(xì)節(jié)權(quán)限位的順序永遠(yuǎn)是 r w x不會亂。比如你不可能看到-wr-這種排列??吹?r-x就知道少了寫權(quán)限。5.2 為什么我已經(jīng) chmod 755 了還是無法訪問有幾次我已經(jīng)正確設(shè)置了權(quán)限但訪問還是失敗。排查后發(fā)現(xiàn)是父目錄的權(quán)限不夠。Linux 在解析路徑時需要你有路徑上每一個目錄的 x 權(quán)限才能“穿過”它到達(dá)目標(biāo)文件。舉例說明你有一個文件/home/alice/data/file.txt就算 file.txt 是 755只要/home/alice是 700其他用戶根本進(jìn)不了 alice 的家目錄也就訪問不到 data 里的文件。這種情況下你需要在路徑的每一個目錄層都確保合理的權(quán)限。所以排查權(quán)限問題時不要只看目標(biāo)文件本身要從根路徑一層層查下來namei -l /home/alice/data/file.txt這條命令會打印路徑上每一級的權(quán)限情況一眼看出哪一層堵住了。5.3 /tmp 目錄的特殊權(quán)限粘滯位/tmp目錄通常是 1777你看到這個數(shù)字可能會奇怪前面怎么多了個 1這個 1 是粘滯位sticky bit它的作用是在 /tmp 這種公共目錄下任何人都能創(chuàng)建文件但只有文件的 owner 或 root 才能刪除自己的文件。如果沒有這個粘滯位所有用戶都擁有對 /tmp 的寫權(quán)限意味著任何用戶都能刪除別人的臨時文件這顯然不行。你執(zhí)行l(wèi)s -ld /tmp會看到權(quán)限位是drwxrwxrwt末尾的 t 就是粘滯位標(biāo)志。這個機(jī)制和 755 是兩回事但經(jīng)常一起出現(xiàn)在權(quán)限配置的學(xué)習(xí)路徑里。5.4 umask 與默認(rèn)權(quán)限為什么新文件不是 755你有沒有疑惑過新建的文件為什么默認(rèn)是 644新目錄默認(rèn)是 755這個默認(rèn)值不是拍腦袋定的而是由 umask 控制的。umask 是一個掩碼表示你在創(chuàng)建文件時要“扣掉”哪些權(quán)限。默認(rèn)情況下文件的基準(zhǔn)權(quán)限是 666rw-rw-rw-目錄是 777rwxrwxrwx。umask 通常是 022意思是去掉 group 和 others 的寫權(quán)限666 去掉 022 644777 去掉 022 755想臨時修改默認(rèn)權(quán)限比如希望新文件默認(rèn)是 600owner 可讀寫其他人都沒有權(quán)限可以umask 077之后創(chuàng)建的文件默認(rèn)就是 600。想永久生效把umask 077寫進(jìn)~/.bashrc或/etc/profile。但從安全角度想umask 設(shè)成 022 是國內(nèi)服務(wù)器最常見的配置適合大多數(shù)場景。5.5 特殊用途setuid 和 setgid 一般別亂動有些可執(zhí)行文件權(quán)限位會出現(xiàn)s比如/usr/bin/passwd顯示為-rwsr-xr-x。這個 s 是 setuid 位意思是程序運(yùn)行時臨時以文件 owner 的身份執(zhí)行而不管是誰啟動的。系統(tǒng)用它來實(shí)現(xiàn)普通用戶修改自己密碼這種需要 root 權(quán)限的操作。出于安全考慮普通用戶請不要隨便給程序加 setuid。如果你看到某個陌生文件的權(quán)限位是-rwsr-xr-x反而要警惕這可能是被利用來提權(quán)的后門程序。排查時可以用find / -perm -4000 -type f列出系統(tǒng)里所有帶 setuid 位的文件檢查是否正常。6. 權(quán)限管理習(xí)慣幾個我在實(shí)際項(xiàng)目中堅(jiān)持的原則這么多年用下來我總結(jié)了幾條非常實(shí)用的權(quán)限管理習(xí)慣。第一權(quán)限最小化。能不給寫權(quán)限就不給能不給執(zhí)行權(quán)限就不給。比如日志目錄只需要寫入不需要執(zhí)行靜態(tài)資源目錄只需要讀取不需要寫入。第二區(qū)分文件和目錄。目錄用 755 保持通行文件用 644 保持只讀可寫腳本再單獨(dú)加 x。第三定期審計。一個月做一次系統(tǒng)性權(quán)限檢查重點(diǎn)排查是否有 777 的配置、是否有異常 setuid、web 目錄是否被改動過。有一次我接手一臺老服務(wù)器發(fā)現(xiàn)登錄用戶的主目錄全是 777里面的配置文件和腳本也是各種寬松權(quán)限。這時候如果慢慢一個個改容易遺漏。我的做法是先用find把權(quán)限異常的項(xiàng)都撈出來再逐項(xiàng)修復(fù)。具體命令可以這樣寫find /home -type f -perm -002 -exec ls -l {} \;-perm -002表示匹配“others 擁有寫權(quán)限”的文件列出它們?nèi)缓蟀礃I(yè)務(wù)重要性挨個處理。對于 web 項(xiàng)目我通常會用 git 管理代碼然后通過部署腳本控制權(quán)限而不是直接在生產(chǎn)環(huán)境手動 chmod。這樣即使某次操作失誤也能從 commit 記錄里追蹤哪里出了問題。如果文件被誤改權(quán)限導(dǎo)致服務(wù)異常先查看是否有人執(zhí)行過 chmod、有沒有備份權(quán)限的機(jī)制。保存當(dāng)前目錄權(quán)限快照的一個重要技巧是getfacl -R /path/to/dir perms.txt需要恢復(fù)時執(zhí)行setfacl --restoreperms.txt如果你啟用了 ACL訪問控制列表這套方法比單純記住 chmod 數(shù)字更完整。權(quán)限問題從來不只是 “chmod 755 怎么打” 這一層而是一整套關(guān)于“誰能動什么”的治理思路。學(xué)命令只是第一步真正形成穩(wěn)定的權(quán)限管理習(xí)慣才能讓服務(wù)器和項(xiàng)目少踩坑。