在 Linux 系統中,GPG(GNU Privacy Guard)和 firewalld 是保障資料安全的重要工具。GPG 提供了強大的加密和解密功能,而 firewalld 則負責管理系統的防火牆規則,兩者結合可以構建更安全的系統環境。本文將會逐步引導讀者瞭解如何使用 GPG 生成金鑰對、加密和解密檔案,並結合 firewalld 的設定說明,提升系統的安全性。同時,也會探討 nftables 的規則設定,以更精細地控制網路流量。透過實際操作範例和指令說明,讀者將能夠快速掌握 GPG 和 firewalld 的使用方法,並應用於日常的系統管理和資料保護工作中。

firewalld 指令實作與操作

瞭解 firewalld 的基本操作與設定

首先,我們來檢視 /etc/firewalld/ 目錄下的內容。在這個目錄中,你會看到一個名為 direct.xml 的檔案,這個檔案在預設情況下是不存在的。

[donnie@localhost ~]$ sudo ls -l /etc/firewalld
total 20
-rw-r--r--. 1 root root 532 Aug 26 13:17 direct.xml
. . .
. . .
[donnie@localhost ~]$

檢視 direct.xml 檔案的內容,可以看到新加入的規則:

<?xml version="1.0" encoding="utf-8"?>
<direct>
    <rule priority="0" table="mangle" ipv="ipv4" chain="PREROUTING">-m conntrack --ctstate INVALID -j DROP</rule>
    <rule priority="1" table="mangle" ipv="ipv4" chain="PREROUTING">-p tcp '!' --syn -m conntrack --ctstate NEW -j DROP</rule>
    <rule priority="0" table="mangle" ipv="ipv6" chain="PREROUTING">-m conntrack --ctstate INVALID -j DROP</rule>
    <rule priority="1" table="mangle" ipv="ipv6" chain="PREROUTING">-p tcp '!' --syn -m conntrack --ctstate NEW -j DROP</rule>
</direct>

內容解密:

  • direct.xml 檔案包含了自定義的防火牆規則。
  • <direct> 標籤內定義了多條規則,這些規則被應用於不同的表(table)和鏈(chain)中。
  • priority 屬性定義了規則的優先順序,數值越小,優先順序越高。
  • table 屬性指定了規則應用於哪個表,例如 mangle 表。
  • ipv 屬性指定了規則適用於哪個 IP 版本,例如 ipv4ipv6
  • chain 屬性指定了規則應用於哪個鏈,例如 PREROUTING 鏈。
  • 規則中使用了 conntrack 模組來匹配特定的連線狀態,例如 INVALID 狀態的包將被丟棄。

RHEL/AlmaLinux 8 和 9 中的 nftables 規則

在 RHEL 8/9 及其衍生版本中,預設使用 nftables 作為 firewalld 的後端。每次使用 firewall-cmd 命令建立規則時,相應的 nftables 規則就會被建立並插入到適當的位置。要檢視目前生效的規則集,可以使用 nft 命令:

[donnie@localhost ~]$ sudo nft list ruleset
. . .
. . .
table ip firewalld {
    chain nat_PREROUTING {
        type nat hook prerouting priority -90; policy accept;
        jump nat_PREROUTING_ZONES_SOURCE
        jump nat_PREROUTING_ZONES
    }
    chain nat_PREROUTING_ZONES_SOURCE {
    }
. . .
. . .
[donnie@localhost ~]$

內容解密:

  • nft list ruleset 命令用於列出目前生效的 nftables 規則集。
  • table ip firewalld 定義了一個名為 firewalld 的表,用於處理 IPv4 的防火牆規則。
  • chain nat_PREROUTING 定義了一個名為 nat_PREROUTING 的鏈,用於處理 NAT 相關的規則。
  • jump 指令用於跳轉到其他鏈繼續處理。

建立直接規則

即使 RHEL 8/9 使用 nftables 作為預設後端,你仍然可以建立直接規則。建立和驗證直接規則的方法與在 RHEL/CentOS 7 中相同。

練習實驗:firewalld 指令操作

透過完成以下實驗,你將獲得使用基本 firewalld 指令的實踐經驗:

  1. 登入你的 CentOS 7 或 AlmaLinux 虛擬機器,執行以下命令並觀察輸出結果:

    sudo firewall-cmd --get-zones
    sudo firewall-cmd --get-default-zone
    sudo firewall-cmd --get-active-zones
    
  2. 簡要檢視與 firewalld.zones 相關的手冊頁:

    man firewalld.zones
    man firewalld.zone
    
  3. 檢視所有可用區域的組態資訊:

    sudo firewall-cmd --list-all-zones
    
  4. 檢視預定義服務列表,並檢視有關 dropbox-lansync 服務的資訊:

    sudo firewall-cmd --get-services
    sudo firewall-cmd --info-service=dropbox-lansync
    
  5. 將預設區域設為 dmz,並為該區域新增 httphttps 服務:

    sudo firewall-cmd --set-default-zone=dmz
    sudo firewall-cmd --permanent --add-service={http,https}
    sudo firewall-cmd --info-zone=dmz
    sudo firewall-cmd --permanent --info-zone=dmz
    
  6. 過載防火牆組態,並再次檢視區域資訊和允許的服務列表:

    sudo firewall-cmd --reload
    sudo firewall-cmd --info-zone=dmz
    sudo firewall-cmd --list-services
    
  7. 開啟 TCP 連線埠 10000,並檢視結果:

    sudo firewall-cmd --permanent --add-port=10000/tcp
    sudo firewall-cmd --list-ports
    sudo firewall-cmd --reload
    sudo firewall-cmd --list-ports
    sudo firewall-cmd --info-zone=dmz
    
  8. 新增豐富語言規則以封鎖特定 IPv4 位址範圍:

    sudo firewall-cmd --permanent --add-rich-rule='rule family="ipv4" source address="200.192.0.0/24" reject'
    
  9. 使用直接規則封鎖無效封包:

    sudo firewall-cmd --direct --add-rule ipv4 mangle PREROUTING 0 -m conntrack --ctstate INVALID -j DROP
    sudo firewall-cmd --direct --add-rule ipv4 mangle PREROUTING 1 -p tcp ! --syn -m conntrack --ctstate NEW -j DROP
    

圖表說明:firewalld 處理流程

@startuml
skinparam backgroundColor #FEFEFE
skinparam componentStyle rectangle

title GPG 加密解密實務操作

package "安全架構" {
    package "網路安全" {
        component [防火牆] as firewall
        component [WAF] as waf
        component [DDoS 防護] as ddos
    }

    package "身份認證" {
        component [OAuth 2.0] as oauth
        component [JWT Token] as jwt
        component [MFA] as mfa
    }

    package "資料安全" {
        component [加密傳輸 TLS] as tls
        component [資料加密] as encrypt
        component [金鑰管理] as kms
    }

    package "監控審計" {
        component [日誌收集] as log
        component [威脅偵測] as threat
        component [合規審計] as audit
    }
}

firewall --> waf : 過濾流量
waf --> oauth : 驗證身份
oauth --> jwt : 簽發憑證
jwt --> tls : 加密傳輸
tls --> encrypt : 資料保護
log --> threat : 異常分析
threat --> audit : 報告生成

@enduml

圖表翻譯: 此圖展示了 firewalld 處理封包的基本流程。當封包進入系統後,firewalld 將根據設定的規則進行匹配。如果封包匹配到某條規則,則執行對應的動作;如果沒有匹配,則繼續匹配下一條規則,直到找到匹配的規則或處理完所有規則。

加密技術

在前一章中,我們探討了兩種可簡化使用iptables或nftables的輔助工具。現在,我們將深入瞭解各種加密技術,以保護資料的私密性。無論您是為政府機構工作還是普通公民,保護敏感資料免受未經授權的存取都是至關重要的。

加密技術的重要性

加密技術提供三個主要好處:

  1. 機密性:確保只有授權人員可以存取資料。
  2. 完整性:確保原始資料未被未經授權的人員修改。
  3. 可用性:確保敏感資料始終可用,且無法被未經授權的人員刪除。

加密型別

本章將探討兩種主要的加密型別:

  1. 靜態資料加密:使用檔案、分割區和目錄加密來保護靜態資料。
  2. 傳輸中資料加密:使用OpenSSL來保護傳輸中的資料。

GNU Privacy Guard (GPG)

GPG是一種免費的開源實作,根據Phil Zimmermann於1991年建立的Pretty Good Privacy。您可以使用GPG來加密或數位簽署檔案或訊息。

GPG的優點

  • 使用強大的、難以破解的加密演算法。
  • 使用公鑰/私鑰方案,無需安全地傳輸密碼給訊息或檔案接收者。
  • 可用於加密自己的檔案。
  • 可用於加密電子郵件訊息,提供真正的端對端加密。

GPG的缺點

  • 使用公鑰而非密碼對於直接與信任的人合作是有效的,但對於向一般大眾分發公鑰則依賴於難以建立的信任網路模型。
  • 需要收件人也設定GPG並知道如何使用它。

實際操作:建立您的GPG金鑰

  1. 在文字模式的AlmaLinux機器上,首先安裝pinentry套件:
    sudo dnf install pinentry
    
  2. 接下來,建立您的GPG金鑰對:
    gpg --full-generate-key
    
    這個命令首先在您的家目錄中建立一個填充的.gnupg目錄。

內容解密:

  • sudo dnf install pinentry:安裝pinentry套件,這是GPG所需的。
  • gpg --full-generate-key:生成GPG金鑰對的命令。這個過程會建立一個.gnupg目錄並生成公鑰和私鑰。

在本章中,我們將涵蓋以下主題:

  • 使用Linux Unified Key Setup (LUKS)加密分割區
  • 使用eCryptfs加密目錄
  • 使用VeraCrypt進行跨平台的加密容器分享
  • OpenSSL和公開金鑰基礎設施
  • 商業憑證授權單位
  • 建立金鑰、憑證請求和憑證

讓我們開始探索這些強大的加密技術,以保護您的資料。

GnuPG 金鑰生成與檔案加密實務操作

在資訊安全的領域中,GnuPG(GNU Privacy Guard)是一個用於加密和簽署資料的開源軟體。本文將介紹如何使用 GnuPG 生成金鑰對,並利用對稱加密技術保護個人檔案。

生成 GnuPG 金鑰對

首先,我們需要生成一對 GnuPG 金鑰,包括公鑰和私鑰。執行以下指令以啟動金鑰生成程式:

gpg --full-generate-key

接下來,系統會提示你選擇金鑰型別。對於大多數使用者,預設的 RSA 和 RSA 金鑰型別就足夠了。

金鑰型別選擇

Please select what kind of key you want:
(1) RSA and RSA (default)
(2) DSA and Elgamal
(3) DSA (sign only)
(4) RSA (sign only)
(14) Existing key from card
Your selection?

金鑰大小設定

為了確保加密的安全性,建議選擇至少 3072 位元的金鑰大小。

金鑰有效期限設定

你可以設定金鑰的有效期限,或者選擇金鑰永不過期。

Key is valid for? (0)

輸入 0 表示金鑰永不過期,或者按照提示輸入特定的有效期限。

提供個人資訊

接下來,需要提供你的姓名、電子郵件地址和註解(可選),以便生成使用者 ID。

Real name: Donald A. Tevault
Email address: donniet@something.net
Comment: No comment

確認無誤後,輸入 O 以完成使用者 ID 的設定。

建立私鑰密碼

為你的私鑰設定一個強壯的密碼,以保護你的私鑰不被未授權存取。

驗證金鑰生成結果

完成金鑰生成後,可以使用以下指令檢視生成的金鑰:

gpg --list-keys

輸出結果應該類別似如下:

pub   2048R/19CAEC5B 2017-10-26
uid                   Donald A. Tevault (No comment) <donniet@something.net>
sub   2048R/37582F29 2017-10-26

檢視 GnuPG 相關檔案

GnuPG 會在 ~/.gnupg 目錄下儲存金鑰相關的檔案。你可以透過以下指令檢視這些檔案:

ls -l ~/.gnupg/

輸出結果應該包括公鑰環、私鑰環、復原資料函式庫和信任資料函式庫等檔案。

對稱加密檔案

除了使用公私鑰對進行非對稱加密外,GnuPG 也支援對稱加密。使用對稱加密時,加密和解密使用相同的密碼。

加密檔案

要對稱加密一個檔案,可以使用以下指令:

gpg -c secret_squirrel_stuff.txt

這將產生一個名為 secret_squirrel_stuff.txt.gpg 的加密檔案。

安全刪除原始檔案

為了確保安全,需要安全地刪除原始的未加密檔案。可以使用 shred 指令:

shred -u -z secret_squirrel_stuff.txt

這將徹底刪除原始檔案,並用零覆寫其儲存空間,以防止資料還原。

使用GPG進行檔案加密與解密

GPG(GNU Privacy Guard)是一種用於加密和簽署資料的工具,廣泛應用於保護電子郵件、檔案和其他敏感資訊的安全。在本篇文章中,我們將探討如何使用GPG進行檔案加密和解密,並介紹相關的操作步驟和技術細節。

檔案加密基礎

首先,我們需要了解GPG的基本操作。假設我們有一個名為secret_squirrel_stuff.txt的檔案需要加密,可以使用以下命令:

gpg -c secret_squirrel_stuff.txt

這將生成一個名為secret_squirrel_stuff.txt.gpg的加密檔案。為了驗證加密是否成功,可以使用less命令檢視加密檔案的內容:

less secret_squirrel_stuff.txt.gpg

內容解密:

此命令會嘗試顯示加密檔案的內容。由於檔案已加密,因此會提示輸入私鑰密碼。輸入正確的密碼後,即可檢視檔案內容。

使用私鑰進行解密

當私鑰載入到鑰匙圈中後,無需再次輸入密碼即可檢視加密檔案。這是GPG的一個優勢。為了展示這一點,我們將加密檔案移動到一個分享目錄:

sudo mkdir /shared
sudo chown donnie: /shared
sudo chmod 755 /shared
mv secret_squirrel_stuff.txt.gpg /shared

在分享目錄中,其他使用者(如Maggie)將無法直接檢視加密檔案的內容:

su - maggie
cd /shared
less secret_squirrel_stuff.txt.gpg

內容解密:

當Maggie嘗試檢視檔案時,由於她沒有正確的私鑰,因此只能看到亂碼,無法讀取檔案內容。

解密檔案

當不再需要加密時,可以使用-d選項解密檔案:

gpg -o secret_squirrel_stuff.txt -d secret_squirrel_stuff.txt.gpg

內容解密:

此命令將解密secret_squirrel_stuff.txt.gpg並將內容輸出到secret_squirrel_stuff.txt。需要注意的是,在較新的Linux發行版中,需要使用-o選項指定輸出的檔名。

使用公鑰加密

GPG還支援使用公鑰進行加密。首先,需要為自己和對方(如Frank)建立金鑰對,並匯出公鑰:

cd .gnupg
gpg --export -a -o donnie_public-key.txt

然後,將公鑰交換並匯入對方的金鑰圈:

gpg --import frank_public-key.txt

接下來,可以使用對方的公鑰加密檔案,並簽署訊息以驗證身分:

gpg -s -e secret_stuff_for_frank.txt

內容解密:

此命令會提示輸入私鑰密碼,並要求確認對方的公鑰是否屬於指定使用者。完成這些步驟後,將生成一個加密的.gpg檔案。