在 Linux 系統中,分享目錄的管理和檔案系統的維護是系統管理員的重要工作。隨著時間推移,分享目錄容易累積大量檔案,其中可能包含許多重複或無用的檔案,佔用寶貴的磁碟空間。為了保持系統的整潔和高效執行,管理員需要一些工具和策略來有效地管理這些檔案。本文將介紹如何使用 fdupes 工具查詢和處理重複檔案,以及如何設定磁碟配額來限制使用者可用的磁碟空間,並探討系統修補、帳號管理等導向,以提升系統整體的安全性與效能。此外,文章也將提供一些實用的指令和指令碼範例,讓管理員可以更輕鬆地執行這些任務。
處理分享目錄的雜亂檔案
分享目錄容易積累重複或無用的檔案,使用 fdupes 工具可以協助找出並處理這些重複檔案。
使用 fdupes 處理重複檔案
安裝
fdupes:$ git clone https://github.com/tobiasschulz/fdupes.git $ cd fdupes $ make fdupes $ sudo make install內容解密:
從 GitHub 取得
fdupes原始碼並編譯安裝,獲得更多功能選項。搜尋重複檔案:
$ fdupes -rS /opt/shared內容解密:
使用
-r和-S引數遞迴搜尋指定目錄下的重複檔案,並顯示檔案大小。
透過上述步驟,可以有效地管理和清理分享目錄中的重複檔案,保持系統的整潔和高效執行。
管理檔案系統與磁碟配額
在維護系統健康與管理分享目錄的過程中,系統管理員經常需要處理檔案系統的混亂(file sprawl)問題。檔案系統混亂是指使用者在沒有合理管理的情況下佔用大量磁碟空間。為瞭解決這個問題,管理員可以使用 fdupes 工具來找出重複的檔案,以及使用磁碟配額(quota)來限制使用者可以使用的磁碟空間。
使用 fdupes 工具找出重複檔案
fdupes 是一個用來掃描指定目錄及其子目錄中重複檔案的工具。它可以幫助管理員找出並處理重複的檔案,從而釋放磁碟空間。
fdupes 的基本用法
$ fdupes -mr /opt/shared
上述命令中,-m 選項告訴 fdupes 列印出找到的重複檔案的報告,而 -r 選項則使 fdupes 遞迴地掃描指定目錄及其所有子目錄。
fdupes 的輸出結果
執行上述命令後,fdupes 將輸出類別似如下的結果:
8 duplicate files (in 2 sets), occupying 214 bytes.
這表示在 /opt/shared 目錄下找到了 8 個重複的檔案,這些檔案被分成 2 組,並且總共佔用了 214 位元組的磁碟空間。
使用 fdupes 取代重複檔案為硬連結
$ fdupes -rL /opt/shared
上述命令中,-L 選項告訴 fdupes 將重複的檔案替換為硬連結(hard link)。這樣,除了第一個找到的檔案外,其他重複的檔案都將被替換為指向第一個檔案的硬連結,從而節省磁碟空間。
fdupes 的輸出結果(含硬連結)
執行上述命令後,fdupes 將輸出類別似如下的結果:
[+] /opt/shared/docs/hr/list.txt
[h] /opt/shared/x/got.txt
[h] /opt/shared/a/b/none.doc
這表示 /opt/shared/docs/hr/list.txt 是原始檔案,而 /opt/shared/x/got.txt 和 /opt/shared/a/b/none.doc 是重複的檔案,已被替換為指向 /opt/shared/docs/hr/list.txt 的硬連結。
#### 內容解密:
$ fdupes -mr /opt/shared:使用fdupes命令掃描/opt/shared目錄下的重複檔案。其中-m表示輸出重複檔案報告,而-r表示遞迴掃描。$ fdupes -rL /opt/shared:將/opt/shared目錄下的重複檔案替換為硬連結。其中-r表示遞迴掃描,而-L表示替換重複檔案為硬連結。[+]和[h]:分別表示原始檔案和硬連結。
使用磁碟配額管理使用者磁碟使用量
除了使用 fdupes 工具外,系統管理員還可以使用磁碟配額(quota)來限制使用者可以使用的磁碟空間。磁碟配額是一種有效的管理手段,可以防止個別使用者佔用過多的磁碟空間。
設定磁碟配額的步驟
安裝 quota 套件
$ sudo yum install quota $ sudo apt install quota掛載支援 quota 的檔案系統
需要確保
/home目錄是掛載在支援 quota 的檔案系統上,例如 XFS。/dev/sdc1 /home xfs defaults,usrquota,grpquota 0 0建立 quota 設定檔
$ sudo touch /home/quota.group /home/quota.user啟用 quota
$ sudo quotaon /home設定使用者配額
[root@server1 home1]# sudo xfs_quota -x -c 'limit -u bsoft=50m bhard=80m isoft=60 ihard=80 djones' /home上述命令為使用者
djones設定了磁碟配額。其中:bsoft=50m和bhard=80m分別表示軟性限制和硬性限制為 50 MB 和 80 MB。isoft=60和ihard=80分別表示軟性限制和硬性限制為 60 和 80 個 inode。
超出配額限制時的行為
當使用者超出配額限制時,系統將會截斷超出限制的檔案。例如:
[djones@server1 ~]$ head -c 51MB /dev/urandom > fillit.txt
[djones@server1 ~]$ head -c 51MB /dev/urandom > fillit1.txt
head: error writing 'standard output': Disk quota exceeded
#### 內容解密:
$ sudo xfs_quota -x -c 'limit -u bsoft=50m bhard=80m isoft=60 ihard=80 djones' /home:為使用者djones設定磁碟配額。其中-x表示專家模式,而-c後面跟著的是具體的限制命令。bsoft=50m和bhard=80m:分別表示軟性限制和硬性限制為 50 MB 和 80 MB。isoft=60和ihard=80:分別表示軟性限制和硬性限制為 60 和 80 個 inode。- 當超出配額限制時,系統將會截斷超出限制的檔案,並顯示 “Disk quota exceeded” 的錯誤訊息。
為系統健康把脈:修補程式的重要性
在 Linux 系統管理中,修補(Patching)是一項至關重要的任務。修補並非只是暫時性地用膠帶把系統「黏」起來,而是透過更新系統工具、守護程式和應用程式來修復開發者提供的問題解決方案。軟體修補程式能夠解決特定的問題,例如為 SSH 守護程式打上修補程式,以修復可能導致系統遭受攻擊和被破壞的新漏洞。
修補的目的與影響
修補的目的不僅僅侷限於安全問題。很多時候,修補程式還能夠解決穩定性問題、修復記憶體洩漏或修復損壞的功能。值得注意的是,在 Linux 系統上進行修補通常不需要重新啟動系統,但如果更新了服務,則需要重新啟動該服務,除非修補程式的安裝過程已經自動處理了這一步驟。如果修補程式的安裝過程中重新啟動了服務,螢幕上會出現相應的通知訊息。為了保險起見,在進行重大修補後,建議重新啟動系統,以確保系統及其服務得到重新啟動。所謂的重大修補事件,通常涉及多項修復和核心更新。
自動化與手動修補
一些系統管理員會透過設定 cron 任務來自動檢查和安裝修補程式,從而實作自動化修補。然而,這種做法需要有一個或多個測試系統來手動更新,以檢查需要更新的內容、系統對更新的反應以及重新啟動後的系統回應。這樣做可以避免因不良修補程式而導致的意外問題。
修補 Red Hat Enterprise Linux 系統
在 Red Hat Enterprise Linux 系統上,可以使用 yum 或 dnf 來進行修補。以 yum 為例,執行以下指令:
$ sudo yum update
內容解密:
sudo yum update:這條指令用於更新系統上的套件。sudo表示以超級使用者許可權執行指令,而yum update則會檢查可用的更新並安裝它們。yum:這是 Red Hat Enterprise Linux 系統上用於管理套件的工具。在版本 8 及以上,dnf成為首選指令,但yum仍然可用。- 輸出內容:指令輸出顯示了需要更新的套件清單,包括核心更新和 OpenSSH 伺服器的更新。這裡列出了將要安裝、升級和移除的套件,以及總下載大小等資訊。
- 確認更新:在執行更新之前,
yum會詢問是否確認安裝更新。預設情況下,按下 Enter 鍵不會安裝更新,需要明確輸入y來確認。
修補 Debian-Based Linux 系統
在 Debian-based Linux 系統(如 Ubuntu)上,修補過程與 Red Hat Enterprise Linux 系統類別似,但使用的指令不同。這裡使用 apt 指令:
$ sudo apt update
$ sudo apt upgrade
內容解密:
sudo apt update:這條指令用於更新本地套件索引,使其與遠端倉函式庫同步。sudo apt upgrade:這條指令用於升級系統上的套件到最新版本。apt與yum/dnf的不同:在apt中,確認更新的提示預設為Y(大寫),表示按下 Enter 鍵即確認安裝更新。unattended-upgrades:這是一個可安裝的套件,能夠實作 Debian-based 系統的自動更新。
維護系統健康與安全
在管理Linux系統時,定期更新和升級是至關重要的。為了避免直接在生產系統上進行更新,建議先在測試系統上進行,以確保更新不會對系統造成不良影響。如果採用自動更新,則需要制定一個合理的更新排程,以控制更新的時間和範圍。
自動更新排程
以下是一個範例排程:
- 測試系統:每週二手動更新
- 開發系統:每隔一個星期四手動更新
- 生產系統:每月最後一個星期日進行更新
這個排程允許你在將更新應用到生產系統之前,先在測試系統上進行驗證。如果擁有自動化或企業管理工具,可以暫停cron任務以更好地控制自動更新。
使用自動化工具
建議使用像Ansible這樣的自動化工具來簡化更新和組態管理的工作。自動化系統不僅可以幫助應用日常更新,還能在緊急情況下快速應用零日漏洞或其他緊急補丁。
系統安全
雖然定期更新是安全計劃的一部分,但還有一些與更新無關的基本安全設定需要考慮。不同的系統型別(如DMZ系統、資料函式庫系統、網頁伺服器等)需要不同的安全措施。
根據系統型別實施安全措施
例如,網頁伺服器需要實作憑證來保護網頁通訊,而檔案伺服器則需要專注於保護分享目錄和使用者帳戶。表8-1列出了不同型別Linux系統的安全。
表8-1:Linux服務安全
| 用途/工作負載 | 範例 | 安全措施 |
|---|---|---|
| 所有伺服器 | 各種服務 | SSH、/etc/hosts.allow和/etc/hosts.deny限制、防火牆、SELinux |
| 網頁伺服器 | Apache、NGINX等 | TLS、憑證、HTTPS |
| 資料函式庫伺服器 | MySQL、PostgreSQL等 | 透過SSH隧道連線、限制連線到localhost |
| 檔案伺服器 | Samba分享、NFS分享、SSH | Samba的Active Directory整合、雙因素認證 |
| 應用伺服器 | Tomcat、WebSphere等 | HTTPS、TLS、憑證 |
| 郵件伺服器 | SMTP、IMAP、POP-3協定 | 使用安全的協定和郵件服務 |
從表8-1可以看出,除了特定於某種服務的安全措施外,還有一些基本的安全功能應該在所有系統上實施,除非有特定的供應商相關原因不允許這樣做。
維護使用者和群組帳戶
使用者帳戶維護不僅包括新增和刪除帳戶,還包括制定帳戶命名慣例、建立策略以設定帳戶停用和刪除的時間限制等。這些活動可以防止使用者帳戶擴散。
設定命名慣例
一種簡單的方法是建立一個使用者帳戶命名慣例。例如,可以使用名字的首字母和姓氏的前七個字元作為使用者名稱。如果遇到重複的名字,可以加入中間字母或使用其他變通方法,如表8-2、8-3和8-4所示。
表8-2:標準帳戶命名慣例
| 名字 | 姓氏 | 使用者名稱 |
|---|---|---|
| José | Alvarez | jalvarez |
| Paula | Anderson | panderso |
| Vivek | Kundra | vkundra |
| Sylvia | Goldstein | sgoldste |
表8-3:重複名字例外
| 名字 | 姓氏 | 使用者名稱 |
|---|---|---|
| José | Alvarez | jalvarez |
| José | Alvarez | jqalvare |
| Paula | Anderson | panderso |
| Paula | Anderson | pmanders |
表8-4:沒有中間名使用者的帳戶名稱變通方法
| 名字 | 姓氏 | 使用者名稱 |
|---|---|---|
| Paula | Anderson | panderso |
| Paula | Anderson | pzanders |
| Paula | Anderson | pyanders |
| Paula | Anderson | pxanders |
制定和使用一致的命名慣例有助於保持帳戶管理的有序性,並減少未來可能出現的管理問題。
管理使用者與群組帳號的最佳實踐
在企業環境中,建立一套完善的使用者帳號命名規則(naming convention)至關重要。這不僅能避免帳號重複,還能有效防止帳號擴散(account sprawl)所帶來的資安問題。
建立使用者帳號命名規則
雖然您可以自行開發命名規則,但參考其他企業的實踐經驗是有價值的。常見的做法包括使用數字字尾來區分同名使用者。例如,若有兩位名為 Vivek Kundra 的使用者,第一位建立的帳號為 vkundra,第二位則為 vkundra2。
為何需要命名規則?
- 避免帳號重複:統一的命名規則可以防止管理員在不知情的情況下建立重複帳號。
- 減少資安風險:當一個使用者擁有多個帳號時,可能會造成許可權混亂和資源管理困難。
- 簡化帳號管理:統一的規則有助於新進管理員快速理解現有帳號結構。
例如,若沒有統一的命名規則,可能會出現同一使用者在不同時間被建立為 sgoldste 和 sylviag 的情況。這不僅造成帳號管理的混亂,也可能導致資安漏洞。
制定帳號保留政策(Account Retention Policy)
為何需要帳號保留政策?
- 提升資安防護:定期清理閒置帳號可以降低被惡意利用的風險。
- 符合合規要求:某些高安全性環境要求定期更改密碼、停用閒置帳號,甚至刪除長期未使用的帳號。
高安全性環境可能會採取以下措施:
- 每 45 天強制更改密碼
- 90 天內未登入的帳號將被停用
- 六個月內未使用的帳號將被刪除
雖然並非所有環境都需要如此嚴格的政策,但制定適當的保留政策並向使用者宣導是良好的管理實踐。
執行帳號保留政策
- 系統層級設定:透過設定系統預設值來自動停用閒置帳號。
- 書面政策:制定明確的使用者帳號管理政策,並向使用者宣導。
設定閒置帳號停用時間
檢查系統預設的閒置天數(INACTIVE 變數):
$ sudo useradd -D | grep INACTIVE
INACTIVE=-1
這表示目前未設定預設值。建議根據企業資安政策設定,例如設定為 15 天:
$ sudo useradd -D -f 15
$ sudo useradd -D | grep INACTIVE
INACTIVE=15
檢查與管理帳號狀態
使用 passwd 指令檢查使用者帳號狀態:
$ sudo passwd -S ndavis
ndavis PS 2022-02-13 0 99999 7 15 (Password set, SHA512 crypt.)
$ sudo passwd -S asmith
asmith LK 2022-02-12 0 99999 7 15 (Password locked.)
若發現帳號被鎖定,可以使用以下指令解鎖:
$ sudo passwd -u asmith
passwd: Success
使用 chage 命令加強帳號保護
chage 命令可以設定密碼變更週期、帳號有效期等引數,進一步提升帳號安全性。
常見設定引數:
- Inactive days:密碼過期後允許登入的天數。
- Minimum days between password changes:密碼變更的最短間隔。
- Maximum days between password changes:密碼變更的最長間隔。
範例設定:
$ sudo chage -m 1 -M 90 --inactive 15 asmith
$ sudo chage --list asmith
Last password change : Feb 13, 2022
Password expires : May 14, 2022
Password inactive : May 29, 2022
Account expires : never
Minimum number of days between password change : 1
Maximum number of days between password change : 90
Number of days of warning before password expires : 7
#### 內容解密:
此範例使用 chage 命令設定使用者 asmith 的密碼管理規則:
-m 1:最短密碼變更間隔為1天。-M 90:最長密碼變更間隔為90天。--inactive 15:密碼過期後15天內未變更密碼則停用帳號。
自動化批次處理
若需對多位使用者套用相同規則,可撰寫指令碼自動化處理:
#!/bin/bash
egrep ^[^:]+:[^\!*] /etc/shadow | cut -d: -f1 | grep -v root > user-list.txt
for user in `more user-list.txt`
do
chage -m 1 -M 90 -I 15 $user
done
#### 內容解密:
此指令碼首先從 /etc/shadow 檔案中擷取有效的非 root 使用者清單,並將其儲存於 user-list.txt 中。接著,透過迴圈逐一對這些使用者套用 chage 命令,設定密碼變更規則。
管理群組帳號
對於不再使用的群組帳號,應定期清理以避免帳號擴散。可以使用 groupmems 命令檢查特定群組的成員:
$ sudo groupmems -g operations -l
ajones bhaas
$ sudo groupmems -g hr -l
asmith
#### 內容解密:
groupmems 命令用於列出特定群組的成員。例如,以上指令分別列出了 operations 和 hr 群組的成員,有助於管理員判斷哪些群組已無成員,進而進行清理。