在現代網路環境中,密碼安全和高效的使用者管理至關重要。本文首先介紹如何利用 Have I Been Pwned? API 檢測密碼是否已經洩露,並提供一個 Shell 指令碼簡化檢查流程,提升密碼安全性。接著,文章討論了集中式使用者和電腦管理的重要性,並比較了 Microsoft Active Directory、Samba 和 FreeIPA 等解決方案,分析它們的特性、優缺點和適用場景,協助系統管理員選擇合適的工具。最後,文章探討 Linux 防火牆的設定,以 iptables 為例,講解其基本概念、規則表和鏈的組成,並提供設定規則的實際範例和程式碼解析,同時也簡要介紹了 nftables 的優勢和未來發展趨勢,幫助讀者建立更安全的網路環境。

檢測密碼是否被洩露的技術

在網路安全日益重要的今天,如何檢測密碼是否已被洩露成為了一項關鍵任務。Have I Been Pwned? 提供了一個強大的API來幫助我們檢查密碼是否出現在已知的洩露資料函式庫中。本文將介紹如何利用這個API來檢測密碼的安全性。

使用 Have I Been Pwned? API 檢查密碼

首先,我們可以直接存取 Have I Been Pwned? 的網站來檢查密碼。但直接輸入密碼可能會引發隱私問題。因此,更安全的方法是使用其API並只傳送密碼雜湊值的一部分。

使用 curl 命令查詢密碼雜湊

我們可以使用 curl 命令來查詢包含特定雜湊字首的密碼數量。例如,查詢字首為 21BD1 的密碼雜湊:

curl https://api.pwnedpasswords.com/range/21BD1

這將傳回一列包含該字首的密碼雜湊字尾及其出現次數。

建立 Shell 指令碼自動檢查密碼

為了更方便地使用這個API,我們可以建立一個 shell 指令碼 pwnedpasswords.sh

#!/bin/bash
candidate_password=$1
echo "Candidate password: $candidate_password"
full_hash=$(echo -n $candidate_password | sha1sum | awk '{print substr($1, 0, 32)}')
prefix=$(echo $full_hash | awk '{print substr($1, 0, 5)}')
suffix=$(echo $full_hash | awk '{print substr($1, 6, 26)}')
if curl https://api.pwnedpasswords.com/range/$prefix | grep -i $suffix;
then echo "Candidate password is compromised";
else echo "Candidate password is OK for use";
fi

指令碼解密:

  1. candidate_password=$1:該行程式碼將第一個命令列引數指定給變數 candidate_password,即要檢查的密碼。
  2. full_hash=$(echo -n $candidate_password | sha1sum | awk '{print substr($1, 0, 32)}'):計算輸入密碼的 SHA1 雜湊值。
    • echo -n $candidate_password:輸出密碼內容但不加換行符。
    • sha1sum:計算 SHA1 雜湊。
    • awk '{print substr($1, 0, 32)}':擷取雜湊值的前32個字元。
  3. prefix=$(echo $full_hash | awk '{print substr($1, 0, 5)}')suffix=$(echo $full_hash | awk '{print substr($1, 6, 26)}'):將雜湊值分為字首(5個字元)和字尾(26個字元)。
  4. if curl https://api.pwnedpasswords.com/range/$prefix | grep -i $suffix;:查詢API以檢查密碼雜湊的字首,並使用 grep 搜尋完整的雜湊字尾。
    • curl https://api.pwnedpasswords.com/range/$prefix:向 Have I Been Pwned? API 傳送請求,查詢包含該字首的密碼雜湊。
    • grep -i $suffix:在傳回結果中搜尋指定的雜湊字尾(不區分大小寫)。

使用指令碼檢查密碼

首先,給指令碼新增可執行許可權:

chmod u+x pwnedpasswords.sh

然後,可以使用以下命令檢查特定密碼:

./pwnedpasswords.sh TurkeyLips

如果傳回「Candidate password is compromised」,則表示該密碼已被洩露。

管理使用者與電腦的集中式解決方案

在大型企業網路中,集中管理使用者和電腦是至關重要的。雖然有多種方法可以實作這一點,但由於篇幅限制,我們將僅提供高層次的概述。

Microsoft Active Directory

儘管我個人並不特別偏愛Windows或Microsoft,但不得不承認Active Directory是一個非常出色的產品,極大地簡化了大型企業網路的管理。Active Directory允許將Unix/Linux電腦及其使用者新增到其域中。

過去,我曾獲得Windows Server 2003的MCSE認證。雖然我的大多數客戶只使用Linux電腦,但偶爾仍需要使用我的MCSE技能。有一次,一位前客戶要求我設定一個根據Linux的Nagios伺服器,作為Windows Server 2008域的一部分,以便其使用者能夠透過Active Directory進行身份驗證。經過一段時間的努力,我終於成功完成了這項任務,客戶對此非常滿意。

對於大多數Linux管理員來說,除非像我一樣需要身兼多職,否則不太可能需要學習如何使用Active Directory。您只需告訴Windows Server管理員您的需求,讓他們處理即可。

Samba on Linux

Samba是一個Unix/Linux守護程式,可以實作三個主要功能:

  1. 分享目錄:允許從Unix/Linux伺服器向Windows工作站分享目錄。這些目錄在Windows檔案資源管理器中顯示,就像從其他Windows機器分享一樣。
  2. 網路列印伺服器:可以設定為網路列印伺服器。
  3. Windows域控制器:可以設定為Windows域控制器。

您可以安裝Samba版本3在Linux伺服器上,並將其設定為舊式Windows NT域控制器。這是一個相當複雜的過程,需要一些時間。一旦完成,您就可以將Linux和Windows機器加入域,並使用正常的Windows使用者管理實用程式來管理使用者和群組。

Samba 版本4 與 Active Directory 的模擬

Samba版本4的推出使得在Linux伺服器上模擬Active Directory成為可能。然而,設定過程非常複雜,並不是一件令人愉快的事。因此,也許我們應該繼續尋找更好的解決方案。

FreeIPA/Identity Management on RHEL-type distros

幾年前,Red Hat公司推出了FreeIPA,作為Fedora的一套軟體包。之所以選擇Fedora,是因為他們希望在將其應用於實際生產網路之前,在Fedora上進行徹底的測試。現在,它已經可以在RHEL 7到RHEL 9及其所有衍生版本上使用,包括CentOS和AlmaLinux。

FreeIPA代表以下三個主要功能:

  • 身份(Identity)
  • 策略(Policy)
  • 稽核(Audit)

它在一定程度上可以看作是對Microsoft Active Directory的回應,但仍未完全成熟。它實作了一些很酷的功能,但仍然是一個正在進行中的工作。其中最酷的部分是其安裝和設定非常簡單。只需從正常儲存函式庫安裝軟體包,開啟適當的防火牆埠,然後執行設定指令碼即可。然後,您就可以開始透過FreeIPA的網頁介面新增使用者和電腦到新的域中。

圖示:新增使用者到FreeIPA域

@startuml
skinparam backgroundColor #FEFEFE
skinparam sequenceArrowThickness 2

title 密碼洩露檢查與集中式使用者管理

actor "客戶端" as client
participant "API Gateway" as gateway
participant "認證服務" as auth
participant "業務服務" as service
database "資料庫" as db
queue "訊息佇列" as mq

client -> gateway : HTTP 請求
gateway -> auth : 驗證 Token
auth --> gateway : 認證結果

alt 認證成功
    gateway -> service : 轉發請求
    service -> db : 查詢/更新資料
    db --> service : 回傳結果
    service -> mq : 發送事件
    service --> gateway : 回應資料
    gateway --> client : HTTP 200 OK
else 認證失敗
    gateway --> client : HTTP 401 Unauthorized
end

@enduml

圖表翻譯: 此圖示展示了設定FreeIPA的基本步驟,從安裝到新增使用者和電腦。

雖然您可以將Windows機器新增到FreeIPA域中,但不建議這樣做。不過,從RHEL/CentOS 7.1開始,您可以使用FreeIPA與Active Directory域建立跨域信任。

問題與解答

  1. 您將在哪個檔案中組態複雜密碼標準?

    • 答案:/etc/security/pwquality.conf
  2. 在RHEL 7型別的機器上使用useradd實用程式時,/etc/login.defs檔案中的UMASK設定應該是什麼?

    • 答案:077
  3. 在Ubuntu 20.04機器上使用adduser實用程式時,如何組態/etc/adduser.conf檔案,以便新使用者的主目錄能夠防止其他使用者存取?

    • 答案:將DIR_MODE=的值更改為DIR_MODE=750
  4. 美國國家標準與技術研究所最近對其推薦的密碼策略進行了什麼更改?

    • 答案:他們放棄了舊有的關於密碼複雜度和密碼到期的哲學觀。
  5. 以下哪三個實用程式可以用於設定使用者帳戶到期資料?

    • 答案:A、C、D(useraddusermodchage
  6. 為什麼您可能想要鎖定前員工的使用者帳戶,而不是刪除它?

    • 答案:D(刪除使用者帳戶以及使用者的檔案和郵件池可能會讓您陷入法律困境。)
  7. 您剛剛為Samson建立了一個使用者帳戶,現在您希望強制他在第一次登入時更改密碼。以下哪兩個命令可以做到這一點?

    • 答案:A、D(sudo chage -d 0 samsonsudo passwd -e samson
  8. 以下哪一個是adduser實用程式相對於傳統的useradd實用程式的優勢?

    • 答案:C(adduser有一個選項,允許您在建立使用者帳戶時加密使用者的主目錄。)
  9. 在最新的Linux發行版中,用於實施強密碼的PAM模組名稱是什麼?

    • 答案:D(pwquality

程式碼範例

# 設定使用者主目錄許可權
DIR_MODE=750

# 檢查密碼品質
sudo apt-get install libpam-pwquality

內容解密:

上述程式碼範例展示瞭如何透過設定DIR_MODE來控制新建立使用者主目錄的許可權,以及如何安裝libpam-pwquality來增強密碼的安全性。第一段程式碼確保新使用者的主目錄對其他使用者不可存取,而第二段程式碼則透過安裝相應的PAM模組來強制實施強密碼策略。

Linux 防火牆深度解析

在企業網路環境中,安全防護的最佳實踐是採用多層次防禦策略(Security-in-depth)。這意味著在網路的不同層級佈署多種防火牆裝置和軟體,以最大程度地阻擋入侵者到達內部網路的最終目標。

Linux 防火牆概述

Linux 防火牆的核心是 netfilter,它被編譯到 Linux 核心中,負責實際的封包過濾工作。由於 netfilter 無法直接與使用者互動,因此需要輔助程式來介面。歷史上曾經有三種主要的輔助程式:

  1. ipchains:最早的版本,適用於 Linux 核心 2.4 版之前,目前已被淘汰。
  2. iptables:在 Linux 核心 2.6 版中引入,至今仍被廣泛使用,但正逐漸被 nftables 取代。
  3. nftables:最新的防火牆管理工具,具有多項優於 iptables 的特點。

這些輔助程式提供了命令列介面,讓使用者可以與 netfilter 互動,設定防火牆規則。

iptables 詳解

iptables 是目前仍被廣泛使用的防火牆管理工具,具有以下優點:

  • 長期以來一直是 Linux 管理員熟悉的工具。
  • 易於在 shell 指令碼中使用,以建立自定義的防火牆組態。
  • 功能靈活,可用於設定簡單的埠過濾、路由器或虛擬私人網路。
  • 仍然預裝在某些 Linux 發行版中。

然而,iptables 也存在一些缺點:

  • IPv4 和 IPv6 需要各自獨立的 iptables 實作,這使得在同時執行兩種協定的環境中,需要組態兩個防火牆並執行兩個 daemon。
  • 需要額外的元件(如 ebtables 和 arptables)來處理 MAC 橋接和 ARP 封包過濾,這些元件具有獨特的語法。

iptables 使用範例

以下是一個簡單的 iptables 規則範例,用於允許來自特定 IP 位址的 SSH 連線:

iptables -A INPUT -p tcp --dport 22 -s 192.168.1.100 -j ACCEPT

內容解密:

此規則的作用是將一條允許來自 192.168.1.100 的 SSH 連線(埠 22)的規則新增到 INPUT 鏈中。其中:

  • -A INPUT 表示將規則新增到 INPUT 鏈。
  • -p tcp 指定協定為 TCP。
  • --dport 22 指定目標埠為 22(SSH)。
  • -s 192.168.1.100 指定來源 IP 位址為 192.168.1.100
  • -j ACCEPT 表示接受符合此規則的封包。

nftables 簡介

nftables 是 iptables 的後繼者,具有多項改進,包括:

  • 統一的語法,支援 IPv4、IPv6、ARP 和橋接封包過濾。
  • 更高的效能和更靈活的規則設定。

由於 nftables 的優勢,許多 Linux 發行版正在逐漸轉向使用 nftables。

未來趨勢

隨著網路安全威脅的不斷演變,Linux 防火牆技術也在不斷發展。未來,我們可以預期看到更多先進的防火牆功能和更強大的安全管理工具,以應對日益增長的安全挑戰。

iptables 防火牆規則設定

在 Linux 系統中,iptables 是一種常見的防火牆管理工具,用於設定網路封包的過濾規則。直到最近,多數 Linux 發行版都預設使用 iptables 作為防火牆管理器。不過,某些發行版如 Red Hat Enterprise Linux 7 及其衍生版本,已轉而使用 firewalld 作為 iptables 的前端介面。同樣地,Ubuntu 也提供了 Uncomplicated Firewall(ufw)作為 iptables 的易用前端。

iptables 基礎知識

iptables 由五個規則表組成,每個表都有其特定的功能:

  1. Filter 表:用於基本的主機保護,是最常用的表。
  2. NAT 表:用於實作私有網路與公網之間的地址轉換。
  3. Mangle 表:用於修改透過防火牆的網路封包。
  4. Raw 表:用於處理不需要連線追蹤的封包。
  5. Security 表:僅在安裝了 SELinux 的系統上使用,用於處理與 SELinux 相關的安全策略。

目前,我們主要關注 Filter 表,它包含 INPUTFORWARDOUTPUT 三個鏈。

檢視目前的 iptables 組態

首先,我們使用 sudo iptables -L 命令來檢視目前的 iptables 組態:

donnie@ubuntu:~$ sudo iptables -L
Chain INPUT (policy ACCEPT)
target     prot opt source               destination         
Chain FORWARD (policy ACCEPT)
target     prot opt source               destination         
Chain OUTPUT (policy ACCEPT)
target     prot opt source               destination         
donnie@ubuntu:~$

同樣地,使用 sudo ip6tables -L 命令來檢視 IPv6 的 iptables 組態:

donnie@ubuntu:~$ sudo ip6tables -L
Chain INPUT (policy ACCEPT)
target     prot opt source               destination         
Chain FORWARD (policy ACCEPT)
target     prot opt source               destination         
Chain OUTPUT (policy ACCEPT)
target     prot opt source               destination         
donnie@ubuntu:~$

設定 iptables 規則

允許已建立連線的封包透過

首先,我們新增一條規則,允許從本機發起連線的伺服器傳回的封包透過:

sudo iptables -A INPUT -m conntrack --ctstate ESTABLISHED,RELATED -j ACCEPT

這條規則使用了 conntrack 模組來追蹤連線狀態,允許與本機已建立連線相關的封包透過。

開啟 SSH 連線埠

接下來,我們開啟 SSH 連線埠(預設為 22),以允許其他機器透過 SSH 連線到本機:

sudo iptables -A INPUT -p tcp --dport ssh -j ACCEPT

這條規則指定了 TCP 協定,並允許目標連線埠為 SSH 的封包透過。

開啟 DNS 連線埠

如果本機需要作為 DNS 伺服器,我們需要開啟 DNS 連線埠(53)以允許 TCP 和 UDP 協定的封包透過:

sudo iptables -A INPUT -p tcp --dport 53 -j ACCEPT
sudo iptables -A INPUT -p udp --dport 53 -j ACCEPT

檢視更新後的規則集

新增上述規則後,我們的 INPUT 鏈規則集如下:

donnie@ubuntu:~$ sudo iptables -L
Chain INPUT (policy ACCEPT)
target     prot opt source               destination         
ACCEPT     all  --  anywhere             anywhere             ctstate RELATED,ESTABLISHED
ACCEPT     tcp  --  anywhere             anywhere             tcp dpt:ssh
ACCEPT     tcp  --  anywhere             anywhere             tcp dpt:domain
ACCEPT     udp  --  anywhere             anywhere             udp dpt:domain
Chain FORWARD (policy ACCEPT)
target     prot opt source               destination         
Chain OUTPUT (policy ACCEPT)
target     prot opt source               destination         
donnie@ubuntu:~$

程式碼解析

iptables 命令解析

sudo iptables -A INPUT -m conntrack --ctstate ESTABLISHED,RELATED -j ACCEPT

內容解密:

  • -A INPUT:將規則新增到 INPUT 鏈的末尾。
  • -m conntrack:載入 conntrack 模組,用於追蹤連線狀態。
  • --ctstate ESTABLISHED,RELATED:指定允許已建立和相關的連線狀態的封包透過。
  • -j ACCEPT:跳轉到 ACCEPT 目標,即允許符合條件的封包透過。
sudo iptables -A INPUT -p tcp --dport ssh -j ACCEPT

內容解密:

  • -p tcp:指定 TCP 協定。
  • --dport ssh:指定目標連線埠為 SSH(22)。
  • -j ACCEPT:允許符合條件的封包透過。
sudo iptables -A INPUT -p tcp --dport 53 -j ACCEPT
sudo iptables -A INPUT -p udp --dport 53 -j ACCEPT

內容解密:

  • 這兩條命令分別開啟 TCP 和 UDP 的 DNS 連線埠(53),以允許 DNS 請求和回應透過防火牆。