限與sudo配置)
1. 先搞清楚用戶管理到底在管什么很多初學(xué)者拿到一臺Linux服務(wù)器第一個想法就是趕緊跑幾條命令把用戶建出來但真正遇到生產(chǎn)環(huán)境的問題時往往一臉懵。歸根結(jié)底是因為沒搞明白用戶管理本質(zhì)上在管什么——它管的不只是“誰能登錄”還包括“登錄之后能干什么”“每個進程到底以誰的身份在跑”“文件歸屬誰”這三個層次。Linux里的用戶不是給人看的它是內(nèi)核做權(quán)限判斷的基本單位。你敲下的每一條命令最終都會對應(yīng)到一個UID用戶ID和一組GID組ID。內(nèi)核看到的是數(shù)字不是用戶名。所以用戶管理的核心就是維護“用戶名 ? UID/GID ? 文件權(quán)限 ? 進程身份”這條鏈路。任何一環(huán)對不上輕則權(quán)限報錯重則服務(wù)起不來、文件讀不了。這篇文章適合剛?cè)腴TLinux但已經(jīng)會基本操作的同學(xué)也適合那些在服務(wù)器上建過用戶、但只會useradd加passwd、遇到權(quán)限問題就抓瞎的運維新手。我會把用戶管理的全部常用命令串成一個清晰的知識體系并且把我在真實服務(wù)器上踩過的坑一并寫出來。1.1 用戶與進程、文件的權(quán)限關(guān)系先打一個生活化的比方。Linux系統(tǒng)像一棟辦公樓用戶是進出大樓的人UID就是工牌編號文件是辦公室里的文件柜。每個文件柜上都貼著“誰可以看、誰可以改、誰碰都不能碰”的標(biāo)簽這就是文件的屬主、屬組和其他人權(quán)限。當(dāng)你登錄系統(tǒng)執(zhí)行某個程序這個程序就自動變成你的“代理人”它拿著你的工牌去訪問文件。這就是為什么你在某個目錄下創(chuàng)建的文件默認(rèn)屬主就是你自己別人刪不掉。進程權(quán)限的粒度就卡在這個“工牌身份”上完全由用戶和用戶組決定。這也解釋了一個常見現(xiàn)象為什么用某個服務(wù)賬號比如運行Web服務(wù)的用戶跑的程序只能寫它自己的目錄寫不了別的應(yīng)用目錄。這不是程序?qū)懙糜袉栴}而是你給它的身份范圍就這么大。理解這一點后你就知道用戶管理的真正意義——它不是簡單的“加人減人”而是為系統(tǒng)里的每一個進程和每一份數(shù)據(jù)劃定邊界。1.2 用戶信息存在哪三個關(guān)鍵文件看用戶管理一定要先知道數(shù)據(jù)存在哪。Linux把用戶信息分散在三個文件里所有命令最終都在操作它們文件作用主要內(nèi)容/etc/passwd用戶賬戶基礎(chǔ)信息用戶名、UID、GID、家目錄、登錄Shell/etc/shadow密碼與有效期信息加密密碼、密碼修改時間、過期策略/etc/group用戶組信息組名、GID、組成員列表很多人第一次看到/etc/passwd里有一串x以為是密碼其實那只是占位符真正的密碼哈希在/etc/shadow里只有root能讀。這個設(shè)計是有講究的/etc/passwd需要被很多命令讀取比如ls要顯示文件屬主名如果密碼也放在這里普通用戶就能拿到哈希去做暴力破解。拆開之后影子文件權(quán)限收緊安全系數(shù)大幅提升。/etc/group里有個容易忽略的字段——組的成員列表。注意這里只記錄“把某個組作為附加組”的用戶而用戶在/etc/passwd里那個GID對應(yīng)的組叫“主組”也叫初始組不會重復(fù)出現(xiàn)在/etc/group的成員列表里。這個區(qū)別在管理用戶權(quán)限時非常重要后面講usermod的時候會具體展開。2. 日常使用頻率最高的用戶增刪改查命令用戶管理的命令并沒有想象中那么多核心就四個useradd、usermod、userdel、passwd。但每一條命令的參數(shù)都很豐富而且在不同發(fā)行版上默認(rèn)行為還不一樣必須逐個講透。2.1 創(chuàng)建用戶useradd 的參數(shù)取舍先看一個最常見的創(chuàng)建命令useradd -m -s /bin/bash -G wheel testuser參數(shù)說明如下-m創(chuàng)建家目錄。不寫這個參數(shù)時很多發(fā)行版不會自動建家目錄后面登錄可能連home都沒有。-s指定登錄Shell。給普通業(yè)務(wù)用戶一般用/bin/bash給服務(wù)賬號用/sbin/nologin禁止交互登錄。-G指定附加組。注意是小寫的G把用戶加進附加組大寫的-g是設(shè)置主組兩者別搞混。創(chuàng)建一個用戶最少要帶-m -s否則你會踩到“用戶創(chuàng)建成功但登錄后沒有家目錄”的坑。那默認(rèn)參數(shù)呢不同發(fā)行版差異很大。比如在某些發(fā)行版上useradd默認(rèn)就帶-m在另一些上則不帶。判斷當(dāng)前系統(tǒng)默認(rèn)值的方法是看/etc/default/useradd這個文件還有/etc/login.defs里的配置項。如果你管著幾十臺混合發(fā)行版的服務(wù)器建議統(tǒng)一寫成完整參數(shù)別依賴默認(rèn)行為。還有一點UID的分配。系統(tǒng)會自動取當(dāng)前最大UID加1生產(chǎn)環(huán)境里如果想控制UID范圍比如普通用戶從1000開始同樣是在/etc/login.defs里配置。2.2 修改用戶usermod 的實用場景usermod是用戶管理的“瑞士軍刀”。幾個高頻用法# 修改用戶的主組 usermod -g devgroup testuser # 把用戶加入附加組保留原有附加組 usermod -aG docker testuser # 修改家目錄路徑 usermod -d /data/home/testuser -m testuser # 鎖定/解鎖賬號 usermod -L testuser usermod -U testuser這里最需要強調(diào)的是-aG里的那個-a。我看到太多新手直接usermod -G docker testuser結(jié)果這個用戶之前所在的所有附加組全部被清空只剩docker。因為-G默認(rèn)是“覆蓋式”設(shè)置不加-a就是重置。生產(chǎn)環(huán)境上一旦把用戶的附加組覆蓋掉他可能立刻失去sudo權(quán)限、失去訪問某些共享目錄的資格問題相當(dāng)隱蔽。-d和-m一起用時是把家目錄從舊路徑搬到新路徑。搬完記得檢查目錄權(quán)限歸屬如果是root搬的家目錄屬主可能變成root需要再chown回去。-L和-U是鎖定和解鎖密碼。注意鎖定的是密碼認(rèn)證如果用戶配了SSH公鑰登錄他依然可以免密登錄這點在高安全環(huán)境里要格外小心。2.3 刪除用戶你真的會刪嗎刪除用戶我用得比較少但每次用都特別謹(jǐn)慎。命令是userdel testuser如果不帶任何參數(shù)這個用戶的家目錄和郵件池mail spool會殘留下來。想要一并清干凈用userdel -r testuser-r會連家目錄和郵件目錄一起刪。但這個“干凈”同時也是風(fēng)險——如果這個用戶的家目錄下有其他服務(wù)正在用的數(shù)據(jù)比如網(wǎng)站上傳目錄userdel -r會把整棵目錄樹全部刪掉而且不會進回收站。所以我自己的習(xí)慣是先檢查用戶是否還有在跑的進程、是否有文件歸他所有確認(rèn)沒問題再刪。檢查命令很簡單ps -u testuser find / -user testuser 2/dev/null把查出來的文件先chown給其他用戶或直接歸檔備份再執(zhí)行userdel。生產(chǎn)環(huán)境上刪用戶從來不是一條命令的事前面幾步檢查往往比刪除本身更花時間。2.4 密碼與認(rèn)證passwd 和 chage密碼是用戶認(rèn)證的第一道門檻命令不多但規(guī)則很重要# 修改自己密碼 passwd # 修改指定用戶密碼root才有權(quán)限 passwd testuser # 刪除密碼變成無密碼登錄一般不推薦 passwd -d testuser這里要留意chage這個命令中文經(jīng)常叫“密碼過期管理”。如果你希望某個賬號三個月強制改一次密碼用它最方便chage -M 90 testuser chage -W 7 testuser-M設(shè)置最長有效期90天-W設(shè)置到期前7天開始警告。如果想查看用戶的密碼過期信息chage -l testuser輸出里能看到最近修改日期、密碼過期時間、賬號過期時間等。這條命令在安全審計場景下很有價值——能快速找出哪些賬號快過期了、哪些賬號密碼已經(jīng)失效但還沒被禁用。順便提醒一句passwd -S testuser可以看密碼狀態(tài)是否鎖定、是否設(shè)置時間排查“用戶登錄不上”的時候非常有用。3. 用戶組管理和批量權(quán)限分配用戶組是權(quán)限的“打包機制”。如果把用戶比作人組就是部門文件系統(tǒng)通過組來批量授權(quán)省去一個用戶一個用戶地設(shè)置權(quán)限的麻煩。這一節(jié)講組管理命令和批量場景。3.1 用戶組的創(chuàng)建、修改、刪除組命令和用戶命令幾乎是鏡像關(guān)系# 創(chuàng)建組 groupadd devteam # 指定GID創(chuàng)建組 groupadd -g 1500 devteam # 修改組名 groupmod -n devteam2 devteam # 刪除組 groupdel devteam刪除組時有個坑如果某個用戶的主組primary group正好是這個組groupdel會直接報錯提示這個組不能刪除因為它是某個用戶的主組。你需要先把這個用戶的主組改掉才能刪除組。說白了Linux不允許一個用戶的“身份標(biāo)識”懸空。groupmod -n改名時要注意是否有腳本或配置文件里寫死了舊組名。組改名后文件系統(tǒng)里那些以GID記錄的屬組關(guān)系會保留文件存的是GID不是組名但所有引用組名的配置就需要同步改否則就會出現(xiàn)“文件顯示屬組是舊名字但/etc/group里已經(jīng)沒有這個組”的尷尬狀態(tài)。3.2 把用戶塞進組gpasswd 和 usermod往組里加人最常用的兩條路# 把一個用戶加入組 gpasswd -a testuser devteam # 把用戶從組移除 gpasswd -d testuser devteam # 或者用 usermod 追加方式上一節(jié)已經(jīng)講過 usermod -aG devteam testuser為什么有兩套命令因為場景不同。如果你要一次性把多個用戶加入某個組、或設(shè)置組管理員gpasswd更合適如果只是在某個用戶身上追加權(quán)限usermod -aG更直觀。gpasswd還有一個特殊用途設(shè)置組密碼。組密碼允許用戶不必成為組成員也能通過newgrp命令臨時切換身份。在生產(chǎn)環(huán)境里我其實不太推薦用組密碼因為它等于在用戶和組“是否屬于”的判斷上開了一個口子審計時容易出漏洞。如果確實需要臨時權(quán)限用sudo規(guī)則更可控。3.3 批量創(chuàng)建用戶的思路與腳本要點服務(wù)器數(shù)量多了以后手工一條條useradd顯然不現(xiàn)實。批量創(chuàng)建用戶的標(biāo)準(zhǔn)做法是準(zhǔn)備一個格式化的用戶列表用循環(huán)腳本跑#!/bin/bash while IFS: read -r username fullname group do if ! id $username /dev/null; then useradd -m -s /bin/bash -G $group -c $fullname $username echo 用戶 $username 創(chuàng)建成功 else echo 用戶 $username 已存在跳過 fi done users.txtusers.txt每行格式寫成用戶名:中文姓名:附加組一目了然。腳本里加一個id判斷防止重復(fù)創(chuàng)建報錯。密碼部分我一般不寫在創(chuàng)建腳本里而是創(chuàng)建后單獨跑一遍chpasswd批量導(dǎo)入初始密碼再強制用戶首次登錄改密碼echo testuser:Temp123 | chpasswd chage -d 0 testuserchage -d 0的意思是強制用戶在第一次登錄時修改密碼。批量場景下這就避免了自己拿著明文密碼分發(fā)時的安全隱患。4. 查看用戶與登錄狀態(tài)從賬號信息里發(fā)現(xiàn)異常查詢命令是運維排查的起點。很多問題不是“用戶建不出來”而是“用戶感覺不對勁”——時區(qū)不對、環(huán)境變量不對、目錄權(quán)限不對。這時候你需要快速看清楚賬號的一切。4.1 id、who、w、last 等命令怎么看先看一條最基礎(chǔ)但最實用的id testuser輸出示例uid1001(testuser) gid1001(testuser) groups1001(testuser),10(wheel)這里能看到UID、主GID和附加組列表。查詢時建議重點看groups那一列判斷用戶的權(quán)限邊界。比如groups里沒有wheel那他就沒有切root的資格如果你的系統(tǒng)里sudo規(guī)則是基于組成員判斷的這里就是第一排查點。再看登錄相關(guān)的命令# 當(dāng)前登錄了哪些用戶 who # 更詳細的登錄信息包含負載、終端、登錄時間 w # 歷史登錄記錄 last # 最近幾次登錄失敗的記錄 lastblast是排查“這臺機器還有誰會登錄”的好工具它讀取/var/log/wtmplastb讀取/var/log/btmp記錄認(rèn)證失敗的嘗試這在高風(fēng)險場景里很重要——如果某個IP頻繁出現(xiàn)認(rèn)證失敗記錄說明可能有人在爆破你的賬號。4.2 從賬戶信息判斷賬號安全性我每次安全巡檢都會做三件事一是把UID為0的賬號全部列出來因為UID為0意味著超級用戶權(quán)限理論上只能有root一個awk -F: $3 0 {print $1} /etc/passwd二是查空密碼賬號awk -F: ($2 || $2 !) {print $1} /etc/shadow三是查“有登錄Shell但不是root”的賬號到底有多少。很多服務(wù)賬號用的是/sbin/nologin如果發(fā)現(xiàn)某個服務(wù)賬號配了/bin/bash就要警惕是不是有人為了調(diào)試方便改的在正式環(huán)境里這是安全漏洞。這些檢查不需要額外裝工具幾條awk就能跑適合記成腳本固化下來。5. 身份切換與提權(quán)su 與 sudo 的正確姿勢用戶管理繞不開“提權(quán)”。日常操作里絕大多數(shù)管理員用root登錄后直接操作這在單機環(huán)境問題不大但一旦涉及到多人協(xié)作、操作審計、最小權(quán)限原則就必須把su和sudo用明白。5.1 su 的用法和踩過的坑# 切換到testuser但不加載其環(huán)境變量 su testuser # 切換到testuser并加載完整環(huán)境變量 su - testuser # 切到root su -最大區(qū)別就在那個橫杠-。su testuser只切換用戶身份保留當(dāng)前Shell的工作目錄和環(huán)境變量su - testuser模擬該用戶完整登錄會執(zhí)行目標(biāo)用戶家目錄下的.bash_profile、.bashrc把PATH等環(huán)境變量全部切過去。很多新手用su切到某個用戶后發(fā)現(xiàn)命令找不到比如java、docker第一個懷疑是安裝出了問題其實只是沒加載環(huán)境變量而已。所以我的建議是凡是用su切換身份一律習(xí)慣性加-除非你明確知道自己在干什么。su還有一個安全隱患要切換到root你得知道root的密碼這就等于把root密碼分發(fā)給所有有需要的人。人一多密碼擴散面就大泄露風(fēng)險成倍上升。所以生產(chǎn)環(huán)境里我?guī)缀醪挥胹u切root改用sudo。5.2 sudo 規(guī)則配置/etc/sudoers 實戰(zhàn)sudo的精髓是“不需要知道root密碼也能以root身份執(zhí)行指定命令并且留下日志”。配置文件在/etc/sudoers強烈建議不要直接改文件用visudo命令編輯它會幫你做語法檢查避免寫錯導(dǎo)致sudo完全不可用。簡單配置示例# 讓wheel組成員能執(zhí)行所有命令 %wheel ALL(ALL) ALL # 允許testuser無密碼重啟服務(wù) testuser ALL(root) NOPASSWD: /usr/bin/systemctl restart nginx # 允許模板運維用戶只能執(zhí)行系統(tǒng)管理命令 %ops ALL(root) /usr/sbin/useradd, /usr/sbin/usermod, /usr/sbin/userdel注意三個核心概念主機列表、以誰身份、命令列表。ALL(ALL) ALL從左到右意思是“任何主機上、以任何用戶身份、執(zhí)行任何命令”。命令列表里寫具體命令時盡量寫全路徑否則可能出現(xiàn)同名其他命令被利用的繞過場景。在實際操作中我還喜歡啟用sudo的日志和默認(rèn)拒絕策略Defaults logfile/var/log/sudo.log Defaults !visiblepw Defaults requirettyrequiretty要求sudo必須在真實終端下執(zhí)行能在一定程度上防止某些腳本在非交互環(huán)境下濫用sudo。不過要小心如果你用自動化工具遠程執(zhí)行sudo這條配置會直接導(dǎo)致執(zhí)行失敗需要根據(jù)自己場景取舍。5.3 為什么我更推薦 sudo 而不是 su兩段式總結(jié)一下。su的缺點是“一次獲得全部權(quán)限、要共享root密碼、行為難審計”。sudo則是“按命令授權(quán)、不需要共享密碼、每條命令都有日志”。尤其在多人共管的服務(wù)器上發(fā)生誤操作時sudo日志能精確告訴你誰在什么時間執(zhí)行了哪條命令而su根本查不到。當(dāng)然sudo不是完美的配置復(fù)雜規(guī)則多了容易出錯。我見過有人把NOPASSWD配給ALL等于免密root還不如用su呢。所以sudo規(guī)則也要定期review尤其是那些“只加不減”的授權(quán)時間久了都是隱患。6. 文件歸屬調(diào)整chown 與 chgrp 的實戰(zhàn)細節(jié)用戶管理的一大部分工作最終會落到“讓某個用戶能訪問某個目錄/文件”上。除了權(quán)限位chmod還要管文件歸誰所有這就是chown和chgrp。6.1 遞歸修改、引用式修改與安全區(qū)間# 修改屬主 chown testuser /data/app # 同時修改屬主和屬組 chown testuser:devteam /data/app # 遞歸處理注意大小寫R chown -R testuser:devteam /data/app # 只改屬組 chgrp devteam /data/app使用chown -R要格外小心它是一把重劍。如果目錄樹里包含了軟鏈接-R默認(rèn)會跟隨軟鏈接進入目標(biāo)目錄這在某些場景下會意外改動不該動的位置。Linux還支持-h參數(shù)用來修改軟鏈接本身而不是它指向的目標(biāo)。另一個容易忽視的點如果只改屬主不指定屬組chown會把屬組也改成該用戶的主組。比如chown testuser /data/app最終屬主和屬組都變成了testuser。這符合多數(shù)預(yù)期但如果你只想改屬主、保留原屬組就要用chown testuser: /data/app這種帶冒號不帶組名的寫法。6.2 用戶家目錄與文件歸屬的聯(lián)動創(chuàng)建用戶后家目錄權(quán)限如果是錯的后患無窮。正常家目錄應(yīng)該是屬主為對應(yīng)用戶、權(quán)限為700或750。如果一臺服務(wù)器之前由其他人操作可能存在家目錄屬主錯亂的情況排查方法ls -ld /home/*看到家目錄的屬主是root或者其他用戶就執(zhí)行chown -R testuser:testuser /home/testuser chmod 700 /home/testuser注意家目錄權(quán)限不建議設(shè)成777因為普通用戶會在家目錄里放自己的SSH私鑰、腳本等敏感文件權(quán)限太開放等于門戶大開。我自己一般給750這樣同組的運維伙伴可以進入家目錄協(xié)助排查但普通其他用戶進不來。6.3 實際業(yè)務(wù)中“共享目錄”的權(quán)限設(shè)計多人協(xié)作項目通常需要一個共享目錄讓一組人能讀能寫。推薦做法是建一個公共組把目錄屬組改成這個組再給目錄設(shè)置setgid位groupadd shared usermod -aG shared testuser mkdir /data/shared chown root:shared /data/shared chmod 2770 /data/shared重點在于chmod 2770里的2也就是setgid位。它保證在這個目錄下新建的文件其屬組自動繼承目錄的屬組shared而不是創(chuàng)建者自己的主組。這樣整個小組的成員都能互相讀寫不需要反復(fù)chgrp。這是Linux共享目錄的標(biāo)準(zhǔn)做法很多新手沒設(shè)setgid結(jié)果A創(chuàng)建的文件B看不了問題就出在這。7. 場景實操從零搭建一個多用戶服務(wù)器理論講了這么多不如來一個完整場景把上面的命令串起來。假設(shè)我要在一臺新服務(wù)器上做一次多用戶環(huán)境初始化目標(biāo)是給三個同事分別建賬號其中兩個屬于開發(fā)組一個屬于運維組運維組的人可以用sudo管理服務(wù)但不能改用戶密碼開發(fā)組的人只能進入項目目錄禁止Shell之外的高危操作。7.1 場景需求與前置規(guī)劃先把規(guī)劃寫出來用戶dev_a、dev_b、ops_c組devteam開發(fā)組、opsteam運維組項目目錄/srv/myapp訪問權(quán)限devteam對目錄有讀寫權(quán)限對項目日志有讀權(quán)限sudo規(guī)則opsteam只允許執(zhí)行systemctl管理服務(wù)不允許執(zhí)行用戶管理類命令在動手之前還要檢查系統(tǒng)是否已有同名用戶避免命令報錯。這一步用id dev_a確認(rèn)即可。7.2 具體操作步驟記錄第一步建組和用戶groupadd devteam groupadd opsteam useradd -m -s /bin/bash -G devteam -c Dev A dev_a useradd -m -s /bin/bash -G devteam -c Dev B dev_b useradd -m -s /bin/bash -G opsteam -c Ops C ops_c設(shè)置初始密碼并強制首次登錄修改echo dev_a:Init123 | chpasswd chage -d 0 dev_a # dev_b、ops_c 同理注意chage -d 0這個參數(shù)很容易被遺漏。沒有它初始密碼就會一直有效安全要求高的話是不允許的。第二步創(chuàng)建項目目錄并設(shè)置權(quán)限mkdir -p /srv/myapp/logs chown root:devteam /srv/myapp chmod 2770 /srv/myapp chown root:devteam /srv/myapp/logs chmod 2775 /srv/myapp/logs開發(fā)組對logs目錄有讀權(quán)限同時可以新建日志文件logs設(shè)2775組內(nèi)可寫但比項目根目錄稍寬松方便運維讀取日志。第三步配置sudo規(guī)則visudo -f /etc/sudoers.d/opsteam寫入%opsteam ALL(root) /usr/bin/systemctl這里只允許執(zhí)行systemctl不能執(zhí)行systemctl后面的自定義參數(shù)因為是從白名單命令樹判斷的所以systemctl restart nginx被允許但systemctl本身不是安全風(fēng)險。注意別加NOPASSWD這樣每次執(zhí)行sudo還是會要求輸入密碼審計日志里也能留下記錄。7.3 權(quán)限驗證與結(jié)果檢查配置完后必須做一次驗證。切到dev_a用戶試試能否在項目目錄里建文件su - dev_a cd /srv/myapp touch test.txt ls -l test.txt如果test.txt屬組是devteam說明setgid生效。然后切到ops_c執(zhí)行sudo systemctl restart nginx系統(tǒng)提示輸入密碼后正常執(zhí)行。再試著執(zhí)行sudo useradd baduser應(yīng)該被拒絕。這一步驗證sudo規(guī)則確實生效而不是僅停留在配置文件層面。整個流程走下來就是一次小型的“用戶權(quán)限初始化”完整閉環(huán)。把這套步驟固化成腳本或文檔換一臺新服務(wù)器也能快速復(fù)制。8. 常見問題與排錯速查表最后整理一份排錯速查表。這些都是我在實際環(huán)境里遇過、或者在各類服務(wù)器問答里高頻出現(xiàn)的問題配上排查思路比背命令參數(shù)更管用。8.1 用戶創(chuàng)建和使用中的高頻故障現(xiàn)象可能原因排查命令與解法useradd報錯“用戶已存在”用戶確實已創(chuàng)建或被刪除但殘留影子條目id 用戶名查是否存在檢查/etc/passwd和/etc/shadow登錄后沒有家目錄創(chuàng)建時漏了-m或家目錄被誤刪cd ~失敗重新創(chuàng)建家目錄并chown切到用戶后命令找不到su沒加-環(huán)境變量未加載用su -切換檢查用戶.bash_profile密碼正確但登錄被拒賬號被鎖定、密碼過期、SSH禁止密碼登錄passwd -S 用戶名、chage -l 用戶名用戶無法用sudo不在sudo配置的組里或配置被覆蓋groups 用戶名、visudo -c檢查語法新建文件屬組不對目錄沒設(shè)setgid或用戶主組不對檢查目錄權(quán)限位是否含2調(diào)整后重新chown8.2 涉及UID/GID不一致的坑有次我在一臺服務(wù)器上把某個業(yè)務(wù)的部署目錄從A用戶改成B用戶結(jié)果忘了處理緩存目錄里已經(jīng)存在的幾百個文件業(yè)務(wù)啟動后一直報緩存寫入失敗。這就是典型的“目錄權(quán)限改了但存量文件歸屬沒跟著改”。生產(chǎn)環(huán)境調(diào)整用戶歸屬時一定要執(zhí)行一遍完整的文件掃描再改find /srv/myapp -user olduser -exec chown newuser:newgroup {} \;8.3 實戰(zhàn)中的幾條核心經(jīng)驗第一用戶管理命令本身不難難的是變更前想清楚影響范圍變更后做驗證。每次加用戶、調(diào)權(quán)限、刪賬號都要對應(yīng)著思考“這個操作會不會影響正在跑的進程”“會不會影響服務(wù)讀取配置文件的權(quán)限”。第二能用組授權(quán)就不要單用戶授權(quán)。組是權(quán)限的單位管理一個組的成本遠低于逐個用戶去排查“誰的權(quán)限沒給夠”。哪怕現(xiàn)在只有一個用戶我也建議先建組把用戶塞進去。等規(guī)模大了再回補組的成本很高。第三sudo規(guī)則和人一樣會“長胖”。定期清理不再使用的授權(quán)是必要的。我自己的習(xí)慣是每個季度拉一遍/etc/sudoers和/etc/group里過期賬號見到超過三個月沒登錄的賬號就鎖掉不確定要不要刪的先鎖定避免誤傷。第四所有變更命令都建議在變更窗口執(zhí)行并提前寫好回滾方案。比如批量usermod之前先導(dǎo)出當(dāng)前的用戶和組信息萬一覆蓋了某個附加組還能快速恢復(fù)。備份命令簡單cp /etc/passwd /root/backup/passwd.$(date %F) cp /etc/shadow /root/backup/shadow.$(date %F) cp /etc/group /root/backup/group.$(date %F)這三個文件備份下來用戶管理基本就能“悔棋”不需要依賴任何額外的工具。如果你之前只是零散地用過useradd和passwd希望這篇內(nèi)容能幫你把整套用戶管理命令串成一條線。從配置文件開始到命令實操再到批量場景和安全排查每一步都在解決真實運維里的具體問題。下次再接到“幫新同事開個賬號”這種需求時你就有了一套標(biāo)準(zhǔn)操作流程而不是臨時翻命令。