:從基礎(chǔ)命令到安全配置實(shí)戰(zhàn))
1. Linux 用戶管理與 sudo 提權(quán)全景速覽這次我們來看 Linux 運(yùn)維里最繞不開的一塊基礎(chǔ)能力用戶管理和 sudo 提權(quán)。很多剛接觸服務(wù)器的朋友第一步不是裝軟件而是要學(xué)會(huì)怎么建用戶、怎么給人授權(quán)、怎么讓普通用戶安全地執(zhí)行管理員命令。這兩個(gè)能力如果掌握得不扎實(shí)后面做腳本、做自動(dòng)化、做多用戶服務(wù)器管理都會(huì)時(shí)不時(shí)卡一下。用戶管理的核心不是useradd和passwd這兩個(gè)命令本身而是理解 Linux 系統(tǒng)如何區(qū)分用戶身份、如何管理用戶組、如何通過權(quán)限模型控制文件和進(jìn)程的訪問。而 sudo 提權(quán)核心也不只是“往 sudoers 里加一行”而是搞清楚提權(quán)策略、命令白名單、環(huán)境變量繼承、日志審計(jì)這些細(xì)節(jié)。本文會(huì)從以下角度展開Linux 用戶管理相關(guān)命令和配置文件。用戶、用戶組的增刪改查。sudo 提權(quán)的作用機(jī)制。sudoers 配置文件的實(shí)際寫法。從建用戶到授權(quán)的完整實(shí)戰(zhàn)案例。常見提權(quán)問題和排查思路。運(yùn)維場(chǎng)景下的安全建議。適合的讀者剛接觸 Linux 服務(wù)器的新人、準(zhǔn)備 Linux 面試的求職者、需要管理多用戶服務(wù)器的運(yùn)維人員。這篇文章不涉及發(fā)行版之間的深層差異以通用 Linux 命令和行為為主。2. 適用場(chǎng)景與使用邊界Linux 用戶管理適合的場(chǎng)景集中在多用戶服務(wù)器、開發(fā)測(cè)試環(huán)境、生產(chǎn)環(huán)境權(quán)限隔離這幾類。多人共用一臺(tái)服務(wù)器需要給每個(gè)同事獨(dú)立賬號(hào)。需要限制不同人員能執(zhí)行的命令范圍。需要審計(jì)誰在什么時(shí)候使用了管理員權(quán)限。需要給自動(dòng)化腳本創(chuàng)建專用運(yùn)行賬號(hào)。需要臨時(shí)授權(quán)某個(gè)用戶執(zhí)行特定管理命令。sudo 提權(quán)適合的場(chǎng)景則更明確普通用戶臨時(shí)獲得 root 權(quán)限執(zhí)行管理命令但不需要把 root 密碼告訴所有人。這是生產(chǎn)環(huán)境最常見的提權(quán)方案比直接切換到 root 更安全、更可控、更可追蹤。使用邊界同樣要講清楚。不要把 sudo 授權(quán)范圍放得太寬比如sudo ALL(ALL:ALL) ALL等同于給用戶完整 root 權(quán)限這適合測(cè)試環(huán)境不適合生產(chǎn)環(huán)境。不建議直接修改/etc/sudoers文件而不做語法校驗(yàn)。不要在配置里寫死所有命令白名單后就不做審計(jì)。用戶管理操作盡量用低權(quán)限賬號(hào)配合 sudo 完成不要日常使用 root 登錄操作。如果涉及敏感數(shù)據(jù)和關(guān)鍵服務(wù)建議結(jié)合日志審計(jì)和堡壘機(jī)方案一起做。3. 環(huán)境準(zhǔn)備與前置條件用戶管理和 sudo 提權(quán)不需要額外安裝重型依賴系統(tǒng)自帶工具就夠用。但為了操作安全建議先確認(rèn)以下內(nèi)容。3.1 確認(rèn)當(dāng)前用戶身份id輸出會(huì)包含當(dāng)前用戶名、UID、GID 和所屬組。這一步很重要因?yàn)楹罄m(xù)創(chuàng)建用戶、修改權(quán)限時(shí)要確認(rèn)自己有足夠權(quán)限。3.2 確認(rèn)系統(tǒng)發(fā)行版和版本cat /etc/os-release用戶管理相關(guān)命令在主流發(fā)行版上行為基本一致但個(gè)別發(fā)行版可能有細(xì)微差異。例如Debian 系默認(rèn)用戶創(chuàng)建時(shí)會(huì)自動(dòng)創(chuàng)建 home 目錄和用戶組需要單獨(dú)確認(rèn)。3.3 確認(rèn) sudo 是否已安裝sudo --version如果提示沒有 sudo需要先用 root 身份安裝。Debian/Ubuntu 系執(zhí)行apt update apt install -y sudoCentOS/RHEL 系執(zhí)行yum install -y sudo3.4 準(zhǔn)備一個(gè)測(cè)試環(huán)境建議在虛擬機(jī)或臨時(shí)云服務(wù)器上進(jìn)行操作測(cè)試不要直接在重要生產(chǎn)環(huán)境練習(xí)??梢詼?zhǔn)備一臺(tái) 2 核 4G 的虛擬機(jī)磁盤 20G 以上即可對(duì)硬件沒有特別要求。4. Linux 用戶管理核心命令4.1 創(chuàng)建用戶創(chuàng)建用戶的命令是useradd但不同發(fā)行版初始行為不一樣。更推薦的做法是結(jié)合參數(shù)明確指定配置。# 創(chuàng)建用戶同時(shí)創(chuàng)建 home 目錄、指定 shell useradd -m -s /bin/bash zhangsan參數(shù)說明-m自動(dòng)創(chuàng)建 home 目錄。-s指定登錄 shell。-d指定 home 目錄路徑默認(rèn)是/home/用戶名。-G指定附加組可以同時(shí)加多個(gè)組用逗號(hào)分隔。-u指定 UID。-c添加備注信息。創(chuàng)建后立即設(shè)置密碼passwd zhangsan執(zhí)行后會(huì)提示輸入兩次密碼。如果密碼太短或太簡(jiǎn)單系統(tǒng)會(huì)給出警告但依然可以設(shè)置成功運(yùn)維場(chǎng)景建議使用足夠強(qiáng)度的密碼。4.2 查看用戶信息# 查看用戶 ID 信息 id zhangsan # 查看用戶 passwd 文件條目 grep zhangsan /etc/passwd # 查看用戶組文件條目 grep zhangsan /etc/group/etc/passwd每一行的格式是用戶名:x:UID:GID:備注:home目錄:登錄shell密碼字段顯示為x真正的密碼哈希存儲(chǔ)在/etc/shadow普通用戶無法讀取。這一點(diǎn)在面試中經(jīng)常被問到。4.3 修改用戶信息修改用戶使用usermod命令。# 將 zhangsan 添加進(jìn) docker 組 usermod -aG docker zhangsan # 修改用戶的 shell usermod -s /bin/zsh zhangsan # 鎖定用戶禁止登錄 usermod -L zhangsan # 解鎖用戶 usermod -U zhangsan注意-aG和-G的區(qū)別-aG是追加組不會(huì)移除用戶已有的附加組-G會(huì)覆蓋附加組列表。實(shí)際操作中追加組時(shí)盡量用-aG避免誤刪用戶權(quán)限。4.4 刪除用戶# 刪除用戶同時(shí)刪除 home 目錄和郵件池 userdel -r zhangsan如果不加-rhome 目錄會(huì)殘留需要手動(dòng)清理。刪除用戶前建議確認(rèn)該用戶沒有正在運(yùn)行的進(jìn)程ps -u zhangsan如有進(jìn)程先處理進(jìn)程或使用pkill -u zhangsan終止。強(qiáng)制刪除用戶命令是userdel -rf但仍不建議在系統(tǒng)關(guān)鍵用戶上操作。4.5 用戶組管理用戶組的作用是批量分配權(quán)限。相關(guān)命令# 創(chuàng)建組 groupadd devops # 修改組名 groupmod -n devteam devops # 刪除組 groupdel devteam查看用戶所屬組groups zhangsan常用操作場(chǎng)景是需要讓一批人擁有同一組文件訪問權(quán)限時(shí)把用戶追加到同一用戶組再設(shè)置目錄的用戶組權(quán)限。# 把用戶加入組之后需要重新登錄才生效 usermod -aG devteam zhangsan4.6 切換用戶# 切換到 zhangsan 用戶 su - zhangsan # 以 zhangsan 身份執(zhí)行單條命令 su - zhangsan -c whoamisu -會(huì)重新加載目標(biāo)用戶的環(huán)境變量而su zhangsan不會(huì)。區(qū)分這兩者也是面試中常見考點(diǎn)。5. sudo 提權(quán)機(jī)制詳解sudo 的工作機(jī)制可以概括為一個(gè)普通用戶被授權(quán)后可以以 root 或其他用戶身份執(zhí)行命令同時(shí)系統(tǒng)會(huì)記錄日志。這種機(jī)制比su切到 root 更安全因?yàn)椴恍枰蚕?root 密碼并且可以精確控制能執(zhí)行什么命令不能執(zhí)行什么命令。5.1 sudo 與 su 的區(qū)別對(duì)比項(xiàng)susudo密碼要求目標(biāo)用戶密碼通常為 root 密碼當(dāng)前用戶密碼權(quán)限控制切換到目標(biāo)用戶后擁有其全部權(quán)限可精細(xì)控制命令白名單命令審計(jì)默認(rèn)無審計(jì)日志記錄到 /var/log/auth.log 或 journal適用場(chǎng)景臨時(shí)切換身份需要審計(jì)的管理操作從安全角度出發(fā)生產(chǎn)環(huán)境推薦優(yōu)先使用 sudo避免多人知道 root 密碼。5.2 sudo 執(zhí)行流程當(dāng)用戶輸入sudo command時(shí)系統(tǒng)執(zhí)行以下流程檢查用戶是否存在于/etc/sudoers或/etc/sudoers.d/的配置中。驗(yàn)證用戶密碼。檢查命令是否在允許執(zhí)行的命令列表內(nèi)。檢查命令參數(shù)是否匹配。通過后以指定用戶身份執(zhí)行命令。將執(zhí)行記錄寫入日志。配置在/etc/sudoers文件中的規(guī)則會(huì)在驗(yàn)證階段生效。所以修改 sudoers 后如果語法錯(cuò)誤登錄用戶可能無法再使用 sudo這也是為什么強(qiáng)烈建議使用visudo代替直接編輯。6. sudoers 配置文件精講sudoers 文件位于/etc/sudoers同時(shí)支持/etc/sudoers.d/目錄下的獨(dú)立配置文件。這為分模塊管理提供了便利。6.1 使用 visudo 編輯直接編輯/etc/sudoers可能在校驗(yàn)前就引入錯(cuò)誤導(dǎo)致普通用戶無法提權(quán)。正確方式是使用visudosudo visudo該命令會(huì)在保存前做語法檢查。如果語法錯(cuò)誤會(huì)提示是否強(qiáng)制保存。visudo還可以編輯/etc/sudoers.d/下的文件sudo visudo -f /etc/sudoers.d/zhangsan建議將自定義授權(quán)規(guī)則放在/etc/sudoers.d/下避免與默認(rèn)配置混淆也方便管理和備份。6.2 sudoers 基本語法格式sudoers 規(guī)則的基本格式為授權(quán)對(duì)象 主機(jī)名 (以誰的身份運(yùn)行) 命令列表例如zhangsan ALL(ALL:ALL) ALL含義是用戶 zhangsan 可以在所有主機(jī)上以所有用戶身份執(zhí)行所有命令。這等同于給用戶完整 root 權(quán)限。實(shí)際場(chǎng)景很少直接這么配。更常見的做法是限制命令范圍zhangsan ALL(ALL:ALL) /usr/bin/systemctl restart nginx, /usr/bin/systemctl status nginx這樣 zhangsan 只能重啟和查看 nginx 服務(wù)不能隨意執(zhí)行其他管理員命令。6.3 命令別名配置當(dāng)需要授權(quán)多個(gè)命令時(shí)可通過 Cmnd_Alias 定義命令別名Cmnd_Alias SERVICE_MANAGE /usr/bin/systemctl restart nginx, /usr/bin/systemctl reload nginx, /usr/bin/systemctl status nginx zhangsan ALL(ALL:ALL) SERVICE_MANAGE這種寫法的好處是一處定義、多處復(fù)用適合規(guī)則較多的場(chǎng)景。6.4 免密碼執(zhí)行某些自動(dòng)化場(chǎng)景不希望每次執(zhí)行 sudo 都輸密碼可使用NOPASSWDzhangsan ALL(ALL:ALL) NOPASSWD: /usr/bin/systemctl restart nginx該配置只在指定命令上跳過密碼驗(yàn)證不建議對(duì)所有命令設(shè)置NOPASSWD: ALL否則存在嚴(yán)重安全風(fēng)險(xiǎn)。6.5 用戶組授權(quán)sudoers 同樣支持用戶組授權(quán)%devops ALL(ALL:ALL) /usr/bin/systemctl restart nginx%devops表示 devops 組內(nèi)的所有用戶都繼承該權(quán)限。這樣管理用戶組比逐個(gè)添加用戶更高效。6.6 限制 root 登錄與 sudo 使用在安全要求較高的環(huán)境中通常希望減少直接 root 登錄的使用同時(shí)保留 sudo 能力??刹扇∫韵麓胧┬薷?etc/ssh/sshd_config中PermitRootLogin為no。給運(yùn)維人員創(chuàng)建普通用戶并授予 sudo 權(quán)限。使用密鑰登錄替代密碼登錄。修改后需要重啟 sshd 服務(wù)sudo systemctl restart sshd需要注意的是修改前要確保自己有其他登錄通道否則可能把自己鎖在服務(wù)器外面。7. 實(shí)戰(zhàn)場(chǎng)景從創(chuàng)建用戶到授予 sudo 權(quán)限下面用一個(gè)完整案例演示從零開始管理用戶和授權(quán)。7.1 場(chǎng)景需求假設(shè)服務(wù)器上有兩個(gè)運(yùn)維人員需要管理 nginx 服務(wù)但不能直接 root 登錄也不能執(zhí)行其他管理命令?,F(xiàn)在需要完成以下操作創(chuàng)建兩個(gè)普通用戶。設(shè)置強(qiáng)密碼。讓兩個(gè)用戶都能執(zhí)行 nginx 服務(wù)的 status、reload、restart 命令。記錄操作日志。7.2 創(chuàng)建用戶先創(chuàng)建一個(gè)運(yùn)維組sudo groupadd ops再創(chuàng)建用戶并加入組sudo useradd -m -s /bin/bash alice sudo useradd -m -s /bin/bash bob sudo usermod -aG ops alice sudo usermod -aG ops bob設(shè)置密碼sudo passwd alice sudo passwd bob7.3 配置 sudoers新建文件/etc/sudoers.d/ops-nginxsudo visudo -f /etc/sudoers.d/ops-nginx寫入Cmnd_Alias NGINX_MANAGE /usr/bin/systemctl status nginx, /usr/bin/systemctl reload nginx, /usr/bin/systemctl restart nginx %ops ALL(ALL:ALL) NGINX_MANAGE保存并退出。visudo會(huì)自動(dòng)檢查語法出現(xiàn)錯(cuò)誤時(shí)會(huì)提示。7.4 驗(yàn)證權(quán)限切換為 alice 用戶su - alice執(zhí)行授權(quán)范圍內(nèi)命令sudo systemctl status nginx應(yīng)該能夠直接查看 nginx 狀態(tài)。再嘗試一個(gè)未被授權(quán)的命令sudo systemctl stop nginx系統(tǒng)應(yīng)該提示 alice 無權(quán)執(zhí)行該命令。這說明命令白名單已經(jīng)生效。7.5 驗(yàn)證日志審計(jì)在另一終端查看日志sudo journalctl -u sudo --since today或者查看系統(tǒng)日志sudo grep alice /var/log/auth.log | tail -20日志中會(huì)記錄用戶、執(zhí)行時(shí)間、執(zhí)行的命令和終端信息。這一步對(duì)于事后審計(jì)非常關(guān)鍵。8. 權(quán)限提升的常見問題與排查問題現(xiàn)象可能原因排查方式解決方案sudo 提示用戶不在 sudoers 中用戶未加入 sudo 組或未配置 sudoers用 root 登錄執(zhí)行id 用戶名查看組將用戶加入對(duì)應(yīng)組或編寫 sudoers 規(guī)則sudo 輸入正確密碼仍失敗用戶未配置密碼或密碼過期以 root 執(zhí)行passwd -S 用戶名重置密碼sudo 執(zhí)行命令提示命令不存在命令路徑不在 sudoers 白名單內(nèi)用which 命令查看實(shí)際路徑更新 sudoers 規(guī)則為完整路徑visudo 保存時(shí)報(bào)語法錯(cuò)誤配置格式錯(cuò)誤查看錯(cuò)誤提示行號(hào)根據(jù)提示內(nèi)容修正后重新保存用戶加入組后 sudo 權(quán)限不生效當(dāng)前會(huì)話環(huán)境未重新加載執(zhí)行id確認(rèn)當(dāng)前會(huì)話組重新登錄或使用su - 用戶名sudo 命令受 secure_path 影響環(huán)境變量路徑不同執(zhí)行sudo env查看 PATH在 sudoers 中設(shè)置secure_path或使用絕對(duì)路徑批量創(chuàng)建用戶時(shí)密碼一致腳本中密碼處理不當(dāng)檢查腳本邏輯使用循環(huán)加隨機(jī)密碼并記錄到安全位置排查 sudo 問題的一般步驟是先確認(rèn)用戶身份和組關(guān)系。檢查 sudoers 配置是否包含該用戶規(guī)則。確認(rèn)命令是否為絕對(duì)路徑。查看/var/log/auth.log或journalctl日志。確認(rèn) NOPASSWD 配置是否生效。檢查是否存在多個(gè) sudoers 文件造成的配置覆蓋。9. 最佳實(shí)踐與安全建議用戶管理和 sudo 提權(quán)雖然基礎(chǔ)但安全影響很大。這里給出工程化建議。9.1 最小權(quán)限原則授權(quán)時(shí)只給完成任務(wù)所需的最少權(quán)限。例如只需要重啟 nginx 服務(wù)就只授權(quán) systemctl restart nginx不要順手授權(quán)systemctl stop或rm。白名單命令越短事故范圍越小。9.2 用戶生命周期管理員工離職或賬號(hào)不再使用要及時(shí)鎖定或刪除賬號(hào)sudo usermod -L 用戶名 # 或刪除用戶及 home 目錄 sudo userdel -r 用戶名鎖定與刪除的選擇取決于業(yè)務(wù)需求。如果只是臨時(shí)停用鎖定期更合適如果確定不再使用推薦刪除。9.3 使用 sudoers.d 分模塊管理將不同用途的授權(quán)規(guī)則拆分為不同文件放在/etc/sudoers.d/下。例如/etc/sudoers.d/nginx-manage/etc/sudoers.d/docker-manage/etc/sudoers.d/deploy-users這樣便于按業(yè)務(wù)模塊審計(jì)和維護(hù)也降低了直接修改/etc/sudoers的風(fēng)險(xiǎn)。9.4 密碼策略與登錄限制生產(chǎn)環(huán)境建議開啟密碼復(fù)雜度校驗(yàn)并配置 SSH 密鑰登錄。修改密碼策略時(shí)可關(guān)注以下幾個(gè)配置# /etc/login.defs PASS_MAX_DAYS 90 PASS_MIN_DAYS 10 PASS_WARN_AGE 7同時(shí)可在sshd_config中啟用密鑰登錄并考慮禁止 root 密碼登錄。修改前務(wù)必確保自己有其他登錄通道。9.5 日志與審計(jì)sudo 日志是安全審計(jì)的基礎(chǔ)數(shù)據(jù)。建議定期檢查/var/log/auth.log或 journal 日志。對(duì)高危命令如rm、reboot、userdel單獨(dú)關(guān)注。有條件的團(tuán)隊(duì)可接入集中日志平臺(tái)。9.6 自動(dòng)化腳本中的用戶管理批量創(chuàng)建用戶的腳本建議使用循環(huán)加隨機(jī)密碼而不是所有用戶共用同一個(gè)密碼。#!/bin/bash USER_LISTalice bob carol for user in $USER_LIST; do if id $user /dev/null; then echo [skip] user $user already exists else useradd -m -s /bin/bash $user random_pass$(openssl rand -base64 12) echo $user:$random_pass | chpasswd echo $user - $random_pass /tmp/user_info.txt fi done隨機(jī)密碼寫入文件后需要設(shè)置嚴(yán)格權(quán)限才能保留參考副本。生產(chǎn)環(huán)境更推薦通過堡壘機(jī)或自動(dòng)化運(yùn)維平臺(tái)創(chuàng)建和管理用戶。9.7 避免權(quán)限繼承帶來的風(fēng)險(xiǎn)sudo 執(zhí)行時(shí)會(huì)繼承當(dāng)前用戶的部分環(huán)境變量。需要考慮在 sudoers 中設(shè)置secure_path來限制命令查找路徑Defaults secure_path/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin這樣可以降低惡意篡改 PATH 導(dǎo)致的提權(quán)風(fēng)險(xiǎn)。9.8 測(cè)試環(huán)境的 sudo 授權(quán)策略測(cè)試環(huán)境可以適當(dāng)放寬權(quán)限但不建議使用NOPASSWD: ALL。比較穩(wěn)妥的做法是保留密碼驗(yàn)證同時(shí)給一個(gè)較長(zhǎng)的 sudo 免密緩存時(shí)間。10. 總結(jié)與下一步Linux 用戶管理和 sudo 提權(quán)是運(yùn)維工作里最基礎(chǔ)但同樣最關(guān)鍵的環(huán)節(jié)?;A(chǔ)之處在于命令簡(jiǎn)單、流程固定關(guān)鍵之處在于一旦配置不當(dāng)普通用戶就可能繞過權(quán)限限制或者管理員無法審計(jì)有人執(zhí)行了什么命令。這套知識(shí)的核心是三個(gè)文件加三個(gè)命令/etc/passwd用戶基本信息。/etc/group用戶組信息。/etc/sudoers和/etc/sudoers.d/提權(quán)規(guī)則。useradd、usermod、userdel用戶管理的三個(gè)主要操作命令。visudo安全的 sudoers 編輯入口。下一步建議你完成以下驗(yàn)證在虛擬機(jī)中創(chuàng)建一個(gè)普通用戶。用該用戶執(zhí)行一條 sudo 命令。在 sudoers.d 中寫一條命令白名單。嘗試執(zhí)行白名單之外的命令確認(rèn)被拒絕。查看日志確認(rèn)記錄存在。這套流程跑通之后你對(duì)多用戶服務(wù)器權(quán)限管理的基本框架就有了。后面可以繼續(xù)深入學(xué)習(xí) ACL 權(quán)限控制、PAM 認(rèn)證、SELinux/AppArmor 策略以及不同發(fā)行版的配置差異。建議把 sudoers 的語法規(guī)則復(fù)制一份做筆記后續(xù)配置時(shí)直接參考。