隨著 Linux 系統在企業和雲端環境中廣泛應用,系統安全的重要性日益凸顯。本文將探討如何利用 CIS 關鍵控制措施來強化 Linux 主機的安全性,並介紹如何使用原生 Linux 命令和專業工具 osquery 進行硬體和軟體資產清查,以及如何利用 osquery 查詢系統資訊和蒐集程式的 SHA256 雜湊值,以提升系統安全性和符合相關安全標準。同時,文章也將探討不同產業的特定安全標準和法規要求,並提供實用的指令碼範例和 osquery 指令,協助系統管理員有效地管理 Linux 系統安全。
Linux 安全標準與實務範例:產業特定安全標準與 CIS 關鍵控制措施解析
隨著雲端運算和本地佈署的 Linux 環境日益普及,不同產業對於安全性的需求也有所不同。許多產業都有特定的安全指引和法規要求,本文將探討這些產業特定安全標準,並介紹如何利用 Center for Internet Security(CIS)提出的關鍵控制措施來加強 Linux 主機的安全性。
產業特定安全標準簡介
不同的產業有各自的安全標準和法規要求,這些標準通常針對特定產業的特點制定。例如,金融業、醫療保健業等都有各自的嚴格法規。雖然這些標準各不相同,但大多數都關注於保護敏感資料和系統安全。
CIS 關鍵控制措施
CIS 提出的關鍵控制措施是一套廣泛被採用的安全最佳實踐,適用於不同產業和組織規模。這些控制措施並非用於滿足特定的法規遵從需求,而是專注於抵禦現實世界中的攻擊,提供了一套務實的安全框架。
CIS 關鍵控制措施的版本與實施群組
CIS 關鍵控制措施(第 8 版,發布於 2021 年)分為三個實施群組:
- 實施群組 1(IG1):基礎控制措施,適用於小型組織和商業現貨(COTS)硬體及軟體。
- 實施群組 2(IG2):擴充套件的技術指引,適用於中型企業和有資訊安全負責人的組織。
- 實施群組 3(IG3):針對大型企業,包含更全面性的安全團隊和流程。
每個實施群組都是前一組的超集,因此 IG3 包含了 IG1 和 IG2 的所有控制措施。詳細的控制措施和實施群組分類別可參考 CIS 官方網站提供的免費下載檔案。
將 CIS 關鍵控制措施應用於 Linux 主機安全
要將 CIS 關鍵控制措施應用於 Linux 主機安全,首先需要了解如何進行硬體和軟體資產清查。以下是利用原生 Linux 命令實作關鍵控制措施 1 和 2 的範例:
硬體資產清查(關鍵控制措施 1)
Linux 系統提供了豐富的資訊儲存在 /proc 目錄下,這些檔案反映了系統的執行狀態。例如,要檢視 CPU 資訊,可以使用以下命令:
$ cat /proc/cpuinfo
processor : 0
這個命令顯示了第一顆 CPU 的資訊。/proc 目錄下的檔案是虛擬檔案,不佔用實際磁碟空間,但提供了系統硬體和執行狀態的重要資訊。
軟體資產清查(關鍵控制措施 2)
對於軟體資產清查,可以使用 dpkg 或 rpm 等套件管理工具來列出已安裝的軟體包。例如,在根據 Debian 的系統上,可以使用:
$ dpkg --list
這個命令會列出系統上所有已安裝的軟體包。
程式碼解密:
上述命令能夠幫助管理員建立一個基本的資產清單。
cat /proc/cpuinfo命令用於檢視 CPU 的詳細資訊,包括處理器型別、核心數等,這對於瞭解系統硬體組態至關重要。dpkg --list命令則列出了系統中所有已安裝的軟體包,有助於管理員掌握系統的軟體資產狀況。
透過實施 CIS 關鍵控制措施,組織可以有效地提升 Linux 主機的安全性,無論是在本地佈署還是雲端環境中。這些控制措施提供了一個務實且靈活的安全框架,有助於抵禦常見的攻擊和威脅。
Linux 系統安全標準與實務範例:硬體與軟體清單管理
在維護Linux系統的安全與穩定運作時,硬體與軟體清單的管理是至關重要的第一步。無論是對於企業級的伺服器管理還是個人電腦的維護,瞭解系統的硬體組態和已安裝的軟體列表都是基礎且關鍵的工作。本文將介紹如何利用Linux內建的命令和工具來收集硬體和軟體資訊,並提供實用的指令碼範例。
硬體清單管理
硬體清單的管理涉及收集系統的CPU、記憶體、磁碟等關鍵硬體資訊。Linux提供了多種方法來取得這些資訊。
使用 /proc 檔案系統
/proc 檔案系統提供了豐富的系統資訊,包括CPU、記憶體等。
$ cat /proc/cpuinfo
輸出範例:
vendor_id : GenuineIntel
cpu family : 6
model : 158
model name : Intel(R) Xeon(R) CPU E3-1505M v6 @ 3.00GHz
...
flags : fpu vme de pse tsc msr pae mce cx8 apic sep mtrr pge mca cmov pat pse36 clflush mmx fxsr sse sse2 ss syscall nx pdpe1gb rdtscp lm constant_tsc arch_perfmon nopl xtopology tsc_reliable nonstop_tsc cpuid pni pclmulqdq ssse3 fma cx16 pcid sse4_1 sse4_2 x2apic movbe popcnt tsc_deadline_timer aes xsave avx f16c rdrand hypervisor lahf_lm abm 3dnowprefetch cpuid_fault invpcid_single pti ssbd ibrs ibpb stibp fsgsbase tsc_adjust bmi1 avx2 smep bmi2 invpcid rdseed adx smap clflushopt xsaveopt xsavec xgetbv1 xsaves arat md_clear flush_l1d arch_capabilities
bugs : cpu_meltdown spectre_v1 spectre_v2 spec_store_bypass l1tf mds swapgs itlb_multihit srbds
bogomips : 6000.00
...
使用 lshw 命令
lshw 是一個用於顯示硬體組態的工具,可以提供詳細的硬體資訊。
$ sudo lshw
硬體清單收集指令碼
下面是一個簡單的指令碼,用於收集基本的硬體和作業系統資訊。
#!/bin/bash
echo -n "Basic Inventory for Hostname: "
uname -n
echo =====================================
dmidecode | sed -n '/System Information/,+2p' | sed 's/\x09//'
dmesg | grep Hypervisor
dmidecode | grep "Serial Number" | grep -v "Not Specified" | grep -v None
echo =====================================
echo "OS Information:"
uname -o -r
if [ -f /etc/redhat-release ]; then
echo -n " "
cat /etc/redhat-release
fi
if [ -f /etc/issue ]; then
cat /etc/issue
fi
echo =====================================
echo "IP information: "
ip ad | grep inet | grep -v "127.0.0.1" | grep -v "::1/128" | tr -s " " | cut -d " " -f 3
echo =====================================
echo "CPU Information: "
cat /proc/cpuinfo | grep "model name\|MH\|vendor_id" | sort -r | uniq
echo -n "Socket Count: "
cat /proc/cpuinfo | grep processor | wc -l
echo -n "Core Count (Total): "
cat /proc/cpuinfo | grep cores | cut -d ":" -f 2 | awk '{sum+=$1} END {print sum}'
echo =====================================
echo "Memory Information: "
grep MemTotal /proc/meminfo | awk '{print $2,$3}'
echo =====================================
echo "Disk Information: "
fdisk -l | grep Disk | grep dev
內容解密:
uname -n:輸出主機名稱。dmidecode:用於提取硬體資訊,如系統製造商、產品名稱和序號。dmesg | grep Hypervisor:檢查系統是否執行在虛擬機器環境下。uname -o -r:顯示作業系統型別和版本。ip ad:顯示網路介面的IP位址資訊。/proc/cpuinfo:提供CPU的詳細資訊,包括型號、頻率和核心數。/proc/meminfo:顯示記憶體總量。fdisk -l:列出磁碟分割槽資訊。
軟體清單管理
軟體清單的管理主要涉及收集系統中已安裝的軟體套件列表。在根據Debian的Linux發行版(如Ubuntu)中,可以使用 apt 或 dpkg 命令來實作。
使用 apt 命令
$ sudo apt list --installed | wc -l
這個命令會列出所有已安裝的軟體套件,並統計總數。
內容解密:
apt list --installed:列出所有已安裝的軟體套件。wc -l:統計列表中的行數,即已安裝的軟體套件總數。
Linux 系統安全管理與資產清查實務
在維護 Linux 系統的安全與合規性時,資產清查是一項至關重要的任務。本文將探討如何使用原生命令和專業工具(如 OSQuery)來進行系統資產清查,並確保符合相關安全標準。
使用原生命令進行資產清查
在 Linux 系統中,可以使用 dpkg 和 rpm 命令來列出已安裝的軟體包。
Debian/Ubuntu 系統
在 Debian 或 Ubuntu 系統上,可以使用 dpkg 命令來列出已安裝的軟體包:
dpkg -l
輸出範例:
Name Version
===============================================================
acpi-support 0.136.1
acpid 1.0.10-5ubuntu2.1
adduser 3.112ubuntu1
...
若要查詢特定軟體包所包含的檔案,可以使用:
dpkg -L openssh-client
輸出範例:
/.
/etc
/etc/ssh
/etc/ssh/ssh_config
/usr/bin/scp
/usr/bin/sftp
/usr/bin/ssh
...
紅帽系列系統
在紅帽系列的 Linux 發行版(如 Fedora、CentOS)上,可以使用 rpm 命令來列出已安裝的軟體包:
rpm -qa
輸出範例:
libsepol-devel-2.0.41-3.fc13.i686
wpa_supplicant-0.6.8-9.fc13.i686
system-config-keyboard-1.3.1-1.fc12.i686
...
若要查詢特定軟體包的詳細資訊,可以使用:
rpm -qi python
輸出範例:
Name : python
Version : 2.6.4
Vendor: Fedora Project
Release : 27.fc13
Build Date: Fri 04 Jun 2010 02:22:55 PM EDT
...
使用 OSQuery 進行資產清查
OSQuery 是一個開源工具,提供了一個類別似資料函式庫的介面來查詢系統資訊。它支援多種作業系統,包括 Linux、macOS 和 Windows。
安裝 OSQuery
在 Ubuntu 系統上安裝 OSQuery 的步驟如下:
新增 OSQuery 的軟體源:
echo "deb [arch=amd64] https://pkg.osquery.io/deb deb main" | sudo tee /etc/apt/sources.list.d/osquery.list匯入軟體源的簽名金鑰:
sudo apt-key adv --keyserver keyserver.ubuntu.com --recv-keys 1484120AC4E9F8A1A577AEEE97A80C63C9D8B80B更新軟體包列表並安裝 OSQuery:
sudo apt update sudo apt-get install osquery
使用 OSQuery 的互動式 Shell
安裝完成後,可以使用 osqueryi 命令啟動互動式 Shell:
osqueryi
在 OSQuery 的互動式 Shell 中,可以使用 .help 命令檢視可用指令:
osquery> .help
查詢系統資訊
可以使用 .tables 命令檢視可用的資料表:
osquery> .tables
查詢作業系統版本資訊:
osquery> select * from os_version;
輸出範例:
+
---
-
---
-+
---
-
---
-
---
-
---
-
---
-
---
-
---
+
---
-
---
+
---
-
---
+
---
-
---
+
---
---
+
---
-
---
---
+
---
-
---
-
---
-
---
+
---
-
---
---
+
---
-
---
-+
| name | version | major | minor | patch | build | platform | platform_like | codename | arch |
+
---
-
---
-+
---
-
---
-
---
-
---
-
---
-
---
-
---
+
---
-
---
+
---
-
---
+
---
-
---
+
---
---
+
---
-
---
---
+
---
-
---
-
---
-
---
+
---
-
---
---
+
---
-
---
-+
| Ubuntu | 20.04.1 LTS (Focal Fossa) | 20 | 4 | 0 | | ubuntu | debian | focal | x86_64 |
+
---
-
---
-+
---
-
---
-
---
-
---
-
---
-
---
-
---
+
---
-
---
+
---
-
---
+
---
-
---
+
---
---
+
---
-
---
---
+
---
-
---
-
---
-
---
+
---
-
---
---
+
---
-
---
-+
查詢網路介面的 IP 位址和子網路遮罩(排除迴路介面):
osquery> select interface, address, mask from interface_addresses where interface NOT LIKE '%lo%';
輸出範例:
+
---
-
---
-
---
+
---
-
---
-
---
-
---
-
---
-
---
-
---
-
---
+
---
-
---
-
---
-
---
--+
| interface | address | mask |
+
---
-
---
-
---
+
---
-
---
-
---
-
---
-
---
-
---
-
---
-
---
+
---
-
---
-
---
-
---
--+
| ens33 | 192.168.122.170 | 255.255.255.0 |
| ens33 | fe80::1ed6:5b7f:5106:1509%ens33 | ffff:ffff:ffff::|
+
---
-
---
-
---
+
---
-
---
-
---
-
---
-
---
-
---
-
---
-
---
+
---
-
---
-
---
-
---
--+
Linux 安全標準實務範例
在前述章節中,我們探討瞭如何利用 osquery 這個工具來查詢系統資訊。現在,讓我們進一步深入瞭解如何運用 osquery 來強化 Linux 系統的安全性。
利用 osquery 查詢系統資訊
osquery 是一個強大的工具,可以用來查詢系統的各種資訊,包括 ARP 快取、已安裝的套件、執行中的程式等。以下是一些範例:
查詢 ARP 快取
要檢索本地 ARP 快取,可以使用以下指令:
osquery> select * from arp_cache;
輸出結果如下:
+
---
-
---
-
---
-
---
--+
---
-
---
-
---
-
---
-
---
+
---
-
---
-
---
+
---
-
---
-
---
+
| address | mac | interface | permanent |
+
---
-
---
-
---
-
---
--+
---
-
---
-
---
-
---
-
---
+
---
-
---
-
---
+
---
-
---
-
---
+
| 192.168.122.201 | 3c:52:82:15:52:1b | ens33 | 0 |
| 192.168.122.1 | 00:0c:29:3b:73:cb | ens33 | 0 |
| 192.168.122.241 | 40:b0:34:72:48:e4 | ens33 | 0 |
+
---
-
---
-
---
-
---
--+
---
-
---
-
---
-
---
-
---
+
---
-
---
-
---
+
---
-
---
-
---
+
列出已安裝的套件
要列出已安裝的套件,可以使用以下指令:
osquery> select * from deb_packages limit 2;
輸出結果如下:
+
---
-
---
-
---
-
---
--+
---
-
---
-
---
-
---
-
---
-
---
---
+
---
-
---
-+
---
---
+
---
-
---
+
---
-
---
-
---
-
---
-
---
+
---
-
---
-
---
-
---
-
---
---
+
---
-
---
-
---
-
---
-
---
-
---
-
---
-
---
-
---
-
---
-
---
-
---
+
---
-
---
--+
---
-
---
+
| name | version | source | size | arch | revision | status | maintainer | section | priority |
+
---
-
---
-
---
-
---
--+
---
-
---
-
---
-
---
-
---
-
---
---
+
---
-
---
-+
---
---
+
---
-
---
+
---
-
---
-
---
-
---
-
---
+
---
-
---
-
---
-
---
-
---
---
+
---
-
---
-
---
-
---
-
---
-
---
-
---
-
---
-
---
-
---
-
---
-
---
+
---
-
---
--+
---
-
---
+
| accountsservice | 0.6.55-0ubuntu12~20.04.4 | | 452 | amd64 | 0ubuntu12~20.04.4 | install ok installed | Ubuntu Developers <ubuntu-devel-discuss@lists.ubuntu.com> | admin | optional |
| acl | 2.2.53-6 | | 192 | amd64 | 6 | install ok installed | Ubuntu Developers <ubuntu-devel-discuss@lists.ubuntu.com> | utils | optional |
+
---
-
---
-
---
-
---
--+
---
-
---
-
---
-
---
-
---
-
---
---
+
---
-
---
-+
---
---
+
---
-
---
+
---
-
---
-
---
-
---
-
---
+
---
-
---
-
---
-
---
-
---
---
+
---
-
---
-
---
-
---
-
---
-
---
-
---
-
---
-
---
-
---
-
---
-
---
+
---
-
---
--+
---
-
---
+
查詢執行中的程式
要查詢執行中的程式,可以使用以下指令:
osquery> SELECT pid, name FROM processes order by start_time desc limit 10;
輸出結果如下:
+
---
-
---
+
---
-
---
-
---
-
---
-
---
-
---
-
---
-+
| pid | name |
+
---
-
---
+
---
-
---
-
---
-
---
-
---
-
---
-
---
-+
| 34790 | osqueryi |
| 34688 | sshd |
| 34689 | bash |
| 34609 | sshd |
| 34596 | systemd-resolve |
| 34565 | dhclient |
| 34561 | kworker/0:3-cgroup_destroy |
| 34562 | kworker/1:3-events |
| 34493 | kworker/0:0-events |
| 34494 | kworker/1:2-events |
+
---
-
---
+
---
-
---
-
---
-
---
-
---
-
---
-
---
-+
利用 osquery 蒐集程式的 SHA256 雜湊值
我們可以利用 osquery 蒐集執行中程式的 SHA256 雜湊值,以偵測惡意軟體。以下是一個範例:
osquery> SELECT DISTINCT h.sha256, p.name, u.username
...> FROM processes AS p
...> INNER JOIN hash AS h ON h.path = p.path
...> INNER JOIN users AS u ON u.uid = p.uid
...> ORDER BY start_time DESC
...> LIMIT 5;
輸出結果如下:
+
---
-
---
-
---
-
---
-
---
-
---
-
---
-
---
-
---
-
---
-
---
-
---
-
---
-
---
-
---
---
+
---
-
---
-
---
-
---
--+
---
-
---
---
+
| sha256 | name | username |
+
---
-
---
-
---
-
---
-
---
-
---
-
---
-
---
-
---
-
---
-
---
-
---
-
---
-
---
-
---
---
+
---
-
---
-
---
-
---
--+
---
-
---
---
+
| 45fc2c2148bdea9cf7f2313b09a5cc27eead3460430ef55d1f5d0df6c1d96ed4 | osqueryi | robv |
| 04a484f27a4b485b28451923605d9b528453d6c098a5a5112bec859fb5f2eea9 | bash | robv |
| 45368907a48a0a3b5fff77a815565195a885da7d2aab8c4341c4ee869af4c449 | gvfsd-metadata | robv |
| d3f9c91c6bbe4c7a3fdc914a7e5ac29f1cbfcc3f279b71e84badd25b313fea45 | update-notifier | robv |
| 83776c9c3d30cfc385be5d92b32f4beca2f6955e140d72d857139d2f7495af1e | gnome-terminal- | robv |
+
---
-
---
-
---
-
---
-
---
-
---
-
---
-
---
-
---
-
---
-
---
-
---
-
---
-
---
-
---
---
+
---
-
---
-
---
-
---
--+
---
-
---
---
+
程式碼解說:
此查詢結合了 processes、hash 和 users 三個表格,以取得執行中程式的 SHA256 雜湊值、程式名稱和使用者名稱。
SELECT DISTINCT h.sha256, p.name, u.username:選取唯一的 SHA256 雜湊值、程式名稱和使用者名稱。FROM processes AS p:從processes表格中選取資料,並將其別名設為p。INNER JOIN hash AS h ON h.path = p.path:將hash表格與processes表格結合,條件是hash表格中的path欄位與processes表格中的path欄位相符。INNER JOIN users AS u ON u.uid = p.uid:將users表格與processes表格結合,條件是users表格中的uid欄位與processes表格中的uid欄位相符。ORDER BY start_time DESC:按照程式的啟動時間進行降序排序。LIMIT 5:限制輸出結果為前 5 筆資料。
CIS Benchmark 的應用
CIS(Center for Internet Security)發布了一系列的安全基準(Benchmark),這些基準描述了各種基礎設施元件的安全組態。CIS Benchmark 的特點是具有很強的指導性,每一項建議都描述了問題、解決方案和稽核方法。
CIS Benchmark 的優點
- 由行業專家編寫和維護,代表了業界的最佳實踐。
- 不受廠商影響,具有很強的中立性。
- 詳細描述了安全組態的每一項建議,具有很強的可操作性。
如何應用 CIS Benchmark
- 下載相關的 CIS Benchmark 檔案。
- 根據檔案中的建議,對系統進行安全組態。
- 使用檔案中的稽核方法,檢查系統的安全狀態。