當使用者(或程式)需要存取系統時,需要進行認證,確認身份是受信任。
警告 | |
---|---|
PAM 的調配錯誤可能會鎖住你的系統。你必須有一個準備好的救援 CD,或者設立一個替代的 boot 分割槽。為了恢復系統,你需要使用它們啟動系統並糾正錯誤。 |
一般的 Unix 認證由 PAM (Pluggable
Authentication Modules,即可插入的驗證模組) 下的 pam_unix
(8)
模組提供。它的 3 個重要檔案如下,其內的條目使用 “:
” 分隔。
表格 4.1. pam_unix
(8) 使用的 3 個重要組態檔案
檔案 | 許可權 | 使用者 | 組 | 說明 |
---|---|---|---|---|
/etc/passwd |
-rw-r--r-- |
root |
root |
(明文的)使用者帳號資訊 |
/etc/shadow |
-rw-r----- |
root |
shadow |
安全加密的使用者帳號資訊 |
/etc/group |
-rw-r--r-- |
root |
root |
組資訊 |
“/etc/passwd
” 包含下列內容。
... user1:x:1000:1000:User1 Name,,,:/home/user1:/bin/bash user2:x:1001:1001:User2 Name,,,:/home/user2:/bin/bash ...
如 passwd
(5) 中所述,這個檔案中被 “:
” 分隔的每項含義如下。
登入名
密碼形式說明
數字形式的使用者 ID
數字形式的組 ID
使用者名稱或註釋欄位
使用者家目錄
可選的使用者指令直譯器
“/etc/passwd
” 的第二項曾經被用來儲存加密後的密碼。在引入了
“/etc/shadow
” 後,該項被用來說明密碼形式。
“/etc/shadow
” 包含下列內容。
... user1:$1$Xop0FYH9$IfxyQwBe9b8tiyIkt2P4F/:13262:0:99999:7::: user2:$1$vXGZLVbS$ElyErNf/agUDsm1DehJMS/:13261:0:99999:7::: ...
如 shadow
(5) 中所述,這個檔案中被 “:
” 分隔的每項含義如下。
登入名
加密後的密碼(開頭的 “$1$
” 表示使用 MD5 加密。“*” 表示無法登入。)
最後一次修改密碼的時間,其表示從 1970 年 1 月 1 日起的天數
允許使用者再次修改密碼的天數間隔
使用者必須修改密碼的天數間隔
密碼失效前的天數,在此期間使用者會被警告
密碼失效後的天數,在次期間密碼依舊會被接受
帳號失效的時間,其表示從 1970 年 1 月 1 日起的天數
…
“/etc/group
” 包含下列內容。
group1:x:20:user1,user2
如 group
(5) 中所述,這個檔案中被 “:
” 分隔的每項含義如下。
組名稱
加密後的密碼(不會被真正使用)
數字形式的組 ID
使用 “,” 分隔的使用者名稱列表
注意 | |
---|---|
“ |
注意 | |
---|---|
如果" |
注意 | |
---|---|
|
下面是一些管理帳號資訊的重要指令。
表格 4.3. 管理帳號資訊的指令
指令 | 功能 |
---|---|
getent passwd user_name |
瀏覽 “user_name ” 的帳號資訊 |
getent shadow user_name |
瀏覽使用者 "user_name " 隱藏的帳號資訊 |
getent group group_name |
瀏覽 “group_name ” 的組資訊 |
passwd |
管理帳號密碼 |
passwd -e |
為啟用的帳號設定一次性的密碼 |
chage |
管理密碼有效期資訊 |
其中的一些功能只能被 root 使用。密碼和資料的加密參見 crypt
(3)。
注意 | |
---|---|
在設定了 PAM 和 NSS 的系統上(例如 Debian salsa 機器),本地的
“ |
在系統安裝時建立一個帳號或使用 passwd
(1) 指令時,你應該選擇一個好密碼,它應該由 6 到 8 個字元組成,其中包含下列根據
passwd
(1) 設定的每個組合中的一個或多個字元。
小寫字母
數字 0 到 9
標點符號
警告 | |
---|---|
密碼中不要使用可以猜到的詞。帳號名、身份證號碼、電話號碼、地址、生日、家庭成員或寵物的名字、字典單詞、簡單的字元序列(例如 “12345” 或 “qwerty”)等都是糟糕的選擇。 |
下面是一些用於 生成加鹽的加密密碼 的獨立工具。
表格 4.4. 生成密碼的工具
軟體包 | 流行度 | 大小 | 指令 | 功能 |
---|---|---|---|---|
whois
|
V:25, I:251 | 387 | mkpasswd |
具備 crypt (3) 庫所有特性的前端 |
openssl
|
V:841, I:995 | 2111 | openssl passwd |
計算密碼雜湊 (OpenSSL). passwd (1ssl) |
現代的類 Unix 系統(例如 Debian 系統)提供 PAM (Pluggable Authentication Modules,插入式驗證模組) 和 NSS(Name Service Switch,名稱服務切換) 機制給本地系統管理員,使他們能夠調配自己的系統。它們的功能可以概括為以下幾點。
PAM 給應用軟體提供了一個靈活的認證機制,因此涉及到了密碼資料的交換。
NSS 提供了一個靈活的名稱服務機制,它經常被 C 標準庫使用,使例如
ls
(1) 和 id
(1) 這樣的程式獲得使用者和組名稱。
PAM 和 NSS 系統必須保持調配一致。
PAM 和 NSS 系統中重要的軟體包如下。
表格 4.5. PAM 和 NSS 系統中重要的軟體包
軟體包 | 流行度 | 大小 | 說明 |
---|---|---|---|
libpam-modules
|
V:889, I:999 | 984 | 插入式驗證模組(基礎服務) |
libpam-ldap
|
V:0, I:6 | 249 | 允許 LDAP 介面的插入式驗證模組 |
libpam-cracklib
|
V:0, I:8 | 117 | 啟用 cracklib 支援的插入式驗證模組 |
libpam-systemd
|
V:571, I:936 | 627 | 用於 logind 註冊使用者會話的插入式驗證模組(PAM) |
libpam-doc
|
I:0 | 152 | 插入式驗證模組(html 和 文字文件) |
libc6
|
V:917, I:999 | 12988 | GNU C 庫:同樣提供“名稱服務切換”服務的共享庫 |
glibc-doc
|
I:8 | 3503 | GNU C 庫:幫助頁面 |
glibc-doc-reference
|
I:4 | 13841 | GNU C 庫:參考手冊,有 info、pdf 和 html 格式(non-free) |
libnss-mdns
|
I:510 | 141 | 用於解析組播 DNS 名稱的 NSS 模組 |
libnss-ldap
|
I:5 | 265 | NSS 模組,用於使用 LDAP 作為一個名稱服務的 |
libnss-ldapd
|
I:15 | 129 | NSS 模組,用於使用 LDAP 作為一個名稱服務的(libnss-ldap 的新 fork) |
libpam-doc
中 “The Linux-PAM System Administrators' Guide”
是瞭解 PAM 調配的必要文件。
glibc-doc-reference
中的 “System Databases and Name Service
Switch” 是瞭解 NSS 調配的重要文件。
注意 | |
---|---|
你可以使用 “ |
注意 | |
---|---|
PAM 是為每個程式初始化環境變數為系統預設值的最基礎方法。 |
在 systemd 下,
libpam-systemd
軟體包被安裝用來管理使用者登入,透過為 logind 在 systemd
控制組層級中註冊使用者會話來實現。參見
systemd-logind
(8)、logind.conf
(5)和
pam_systemd
(8)。
下面是一些 PAM 和 NSS 存取的重要組態檔案。
表格 4.6. PAM 和 NSS 存取的組態檔案
組態檔案 | 功能 |
---|---|
/etc/pam.d/program_name |
為 “program_name ” 程式設定 PAM 調配;參加
pam (7) 和 pam.d (5) |
/etc/nsswitch.conf |
為每個服務條目設定 NSS 調配。參見 nsswitch.conf (5) |
/etc/nologin |
通過 pam_nologin (8) 模組限制使用者登入 |
/etc/securetty |
通過 pam_securetty (8) 模組限制 root 存取 tty |
/etc/security/access.conf |
通過 pam_access (8) 模組設定存取限制 |
/etc/security/group.conf |
通過 pam_group (8) 模組設定基於組的限制 |
/etc/security/pam_env.conf |
通過 pam_env (8) 模組設定環境變數 |
/etc/environment |
通過帶有 “readenv=1 ” 參數的 pam_env (8)
模組設定額外的環境變數 |
/etc/default/locale |
通過帶有 “readenv=1 envfile=/etc/default/locale ” 參數的
pam_env (8) 模組設定語言環境值(在 Debian 系統中) |
/etc/security/limits.conf |
通過 pam_linits (8) 模組設定資源限制(ulimit、core 等等) |
/etc/security/time.conf |
通過 pam_time (8) 模組設定時間限制 |
/etc/systemd/logind.conf |
設定systemd 的登入管理器配置 (參見 logind.conf (5)
和 systemd-logind.service (8)) |
密碼選擇的限制是通過 PAM 模組 pam_unix
(8) 和
pam_cracklib
(8) 來實現的。它們可以通過各自的參數進行調配。
提示 | |
---|---|
PAM 模組在檔名中使用字尾 “ |
現代的集中式系統管理可以使用集中式的輕量目錄存取協議(LDAP)伺服器進行部署,從而通過網路管理許多類 Unix 和 非類 Unix 系統。輕量目錄存取協議的開源實現是 OpenLDAP 軟體。
LDAP 伺服器使用帶有 PAM 和 NSS 的libpam-ldap
和
libnss-ldap
軟體包為 Debian 系統提供帳號資訊。需要一些動作來啟用
LDAP(我沒有使用過這個設定,並且下面的資訊純粹是第二手的資訊。請在這種前提下閱讀下列內容。)。
你通過執行一個程式,例如獨立的 LDAP 背景程式 slapd
(8),來建立集中式的 LDAP 伺服器。
你在 “/etc/pam.d/
” 目錄中的 PAM 組態檔案裡,使用
“pam_ldap.so
” 替代預設值 “pam_unix.so
”。
Debian 使用 “/etc/pam_ldap.conf
” 作為
libpam-ldap
的組態檔案,“/etc/pam_ldap.secret
” 作為儲存 root 密碼的檔案。
你在 “/etc/nsswitch.conf
” 檔案中改變 NSS 調配,使用
“ldap
” 替代預設值(“compat
” 或
“file
”)。
Debian 使用 “/etc/libnss-ldap.conf
” 作為
libnss-ldap
的組態檔案。
為了密碼的安全,你必須讓 libpam-ldap
使用 SLL(或
TLS)連線。
為了確保 LDAP 網路開銷資料的完整性,你必須讓 libpam-ldap
使用 SLL(或 TLS)連線。
為了減少 LDAP 網路流量,你應該在本地執行 nscd
(8) 來快取任何 LDAP 搜尋結果。
參見由 libpam-doc
軟體包提供的 pam_ldap.conf
(5)
中的文件和 “/usr/share/doc/libpam-doc/html/
”,以及
glibc-doc
軟體包提供的 “info libc 'Name Service
Switch'
”。
類似地,你可以使用其它方法來設定另一種集中式的系統。
同 Windows 系統整合使用者和組。
通過 winbind
和 libpam_winbind
軟體包訪問
Windows domain 服務.
參見 winbindd
(8) 和 Integrating MS Windows Networks
with Samba。
同古老的類 Unix 系統整合使用者和組。
通過 nis
軟體包存取 NIS
(之前叫 YP) 或 NIS+。
這是在舊的 “info su
” 底部 Richard M. Stallman 所說的一句名言。別擔心:Debian
系統中當前的 su
指令使用了 PAM,這樣當在
“/etc/pam.d/su
” 中啟用了帶有 “pam_wheel.so
”
的行後,就能夠限制非 wheel 組的使用者 su
到 root
組的能力。
安裝 libpam-cracklib
軟體包你能夠強制使用嚴格的密碼規則。
在一個典型的 GNOME 系統,將會安裝
libpam-gnome-keyring
,"/etc/pam.d/common-password
"
看起來像:
# here are the per-package modules (the "Primary" block) password requisite pam_cracklib.so retry=3 minlen=8 difok=3 password [success=1 default=ignore] pam_unix.so obscure use_authtok try_first_pass yescrypt # here's the fallback if no module succeeds password requisite pam_deny.so # prime the stack with a positive return value if there isn't one already; # this avoids us returning an error just because nothing sets a success code # since the modules above will each just jump around password required pam_permit.so # and here are more per-package modules (the "Additional" block) password optional pam_gnome_keyring.so # end of pam-auth-update config
注意 | |
---|---|
這裡的資訊也許不夠完全滿足你的安全需求,但這也是一個好的開始. |
許多流行的傳輸層服務,互動資訊使用純文字的密碼認證。這是非常差的方式,通過公共的網際網路傳輸純文字密碼,密碼能夠被截獲到。你能夠執行這些服務,使用 "Transport Layer Security" (TLS) 或它的前身, "Secure Sockets Layer" (SSL) ,通過加密來使包括密碼在內的整個通訊更加安全。
表格 4.7. 安全和不安全的服務埠列表
不安全的服務名 | 埠 | 安全的服務名 | 埠 |
---|---|---|---|
www (http) | 80 | https | 443 |
smtp (郵件) | 25 | ssmtp (smtps) | 465 |
ftp-data | 20 | ftps-data | 989 |
ftp | 21 | ftps | 990 |
telnet | 23 | telnets | 992 |
imap2 | 143 | imaps | 993 |
pop3 | 110 | pop3s | 995 |
ldap | 389 | ldaps | 636 |
加密消耗 CPU 時間。作為對 CPU 有益的替代方案,你可以保持使用純文字通訊,僅僅使用安全認證協議加密密碼,比如說:POP 使用"Authenticated Post Office Protocol" (APOP),SMTP 和 IMAP 使用 "Challenge-Response Authentication Mechanism MD5" (CRAM-MD5)。(你的郵件客戶端通過網際網路上你的郵件伺服器傳送郵件時,最近流行使用新的遞交埠 587 來代替傳統的 SMTP 埠 25,這樣可以避免在使用 CRAM-MD5 認證自己時,網路提供商阻塞 25 埠。)
安全 Shell (SSH)
程式使用安全認證來提供不安全網路上兩個不可信任主機之間的安全加密通訊。它由 OpenSSH
客戶端, ssh
(1), 和 OpenSSH
後臺背景程式(daemon), sshd
(8)組成.SSH 使用埠轉發特性,可以給 POP 和 X
之類的不安全的協議通訊建立隧道,使其可以在網際網路上安全傳輸。
客戶端可以使用如下方式來認證自己:基於主機的認證、公鑰認證、質疑應答認證、密碼認證。使用公鑰認證,可以實現遠端免密碼登入。參見 節 6.3, “伺服器遠端存取和工具 (SSH)”.
即使你執行 Secure Shell (SSH) 和 Point-to-point tunneling protocol (PPTP) 這樣的安全服務,在網際網路上,仍然有機會使用野蠻暴力猜測密碼攻擊進入。 使用防火牆策略 (參見 節 5.7, “Netfilter 網路過濾框架”),並和下面的安全工具一起,可以提升安全形勢。
表格 4.8. 提供額外安全方式的工具列表
軟體包 | 流行度 | 大小 | 說明 |
---|---|---|---|
knockd
|
V:0, I:2 | 110 | 小的 port-knock 後臺守護程序(daemon) knockd (1) 和客戶端
knock (1) |
fail2ban
|
V:98, I:111 | 2126 | 禁用造成多個認證錯誤的 IP |
libpam-shield
|
V:0, I:0 | 115 | 把嘗試猜測密碼的遠端攻擊者關在外面 |
為阻止人們使用 root 許可權存取你的機器,你需要做下面的操作。
阻止對硬碟的物理存取
鎖住 UEFI/ BIOS 來阻止從可移動介質啟動
為 GRUB 互動式會話設定密碼
鎖住 GRUB 選單,禁止編輯
如果可以物理存取硬碟,則可以使用下面的步驟,相對簡單的重置密碼。
將硬碟拿到一個可以設定 UEFI/BIOS 從 CD 啟動的電腦。
使用緊急介質啟動系統(Debian 啟動磁碟, Knoppix CD, GRUB CD, …)。
用讀寫存取掛載根分割槽。
編輯根分割槽的"/etc/passwd
"檔案,使 root
帳號條目的第二段為空。
對於 grub-rescue-pc
,即使用緊急介質啟動的電腦,如果有編輯 GRUB 選單條目 (參見 節 3.1.2, “第二階段:引載加載程序”) 的許可權,在啟動時,使用下面的步驟更加簡單。
使用核心參數啟動系統來修改一些事情,比如說,"root=/dev/hda6 rw init=/bin/sh
".
編輯 "/etc/passwd
" 檔案,使 root
帳號條目的第二段為空。
重啟系統。
系統的 root shell 現在可以無密碼存取了。
注意 | |
---|---|
一旦某人擁有 root shell 存取許可權,他能夠存取任何內容,並可以重設系統上的任何密碼。此外,他可以使用
|
為避免這些相關問題,僅有的理論上的軟體解決方案是使用 dm-crypt 和
initramfs (參見 節 9.9, “資料加密提示”)加密 root 分割槽(或
"/etc
" 分割槽) 。這樣的話,你總是需要密碼來啟動系統。
在密碼基於認證和檔案許可權之外,系統也有其它的訪問控制。
注意 | |
---|---|
參見 節 9.4.16, “Alt-SysRq 鍵” 來限制核心的安全警告金鑰(SAK)功能。 |
訪問控制列表 ACL 是在 節 1.2.3, “檔案系統權限” 裡面解釋的普通許可權的一個超集。
在現代桌面環境中,你會遇到 ACL 行為。比如,當一個已經格式化的 USB 儲存裝置自動掛載到
"/media/penguin/USBSTICK
",一個普通使用者
penguin
能夠執行:
$ cd /media/penguin $ ls -la total 16 drwxr-x---+ 1 root root 16 Jan 17 22:55 . drwxr-xr-x 1 root root 28 Sep 17 19:03 .. drwxr-xr-x 1 penguin penguin 18 Jan 6 07:05 USBSTICK
在第 11 列的 "+
" 表示 ACL 在使用。如果沒有 ACL,一個普通使用者
penguin
應該不能夠像這樣列出目錄內容,因為 penguin
不在
root
組。你能夠按如下方式檢視 ACL:
$ getfacl . # file: . # owner: root # group: root user::rwx user:penguin:r-x group::--- mask::r-x other::---
這裡:
"user::rwx
"、"group::---
" 和
"other::---
" 相應的為普通所有者、組和其它人的許可權。
ACL "user:penguin:r-x
" 執行普通使用者 penguin
有 "r-x
" 許可權。這個能夠讓 "ls -la
" 列出目錄內容。
ACL "mask::r-x
" 設定上層繫結許可權。
更多資訊參見 "POSIX Access Control
Lists on Linux"、acl
(5)、
getfacl
(1) 和 setfacl
。
sudo
(8) 程式是為了使一個系統管理員可以給使用者受限的 root 許可權並記錄 root
活動而設計的。sudo
只需要一個普通使用者的密碼。安裝 sudo
軟體包並通過設定 “/etc/sudoers
” 中的選項來使用它。參見
“/usr/share/doc/sudo/examples/sudoers
” 和 節 1.1.12, “sudo 調配” 中的調配示例。
我將 sudo
用於單使用者系統(參見 節 1.1.12, “sudo 調配”)是為了防止自己可能做出的愚蠢行為。就我個人而言,我認為使用
sudo
會比使用 root 帳號作業系統來得好。例如,下列指令將
“some_file
” 的擁有者改變為
“my_name
”。
$ sudo chown my_name some_file
當然如果你知道 root 密碼(比如自行安裝 Debian 的使用者所做的),任何使用者賬號都可以使用 “su
-c
” 讓任何指令以 root 執行。
PolicyKit 是在類 Unix 作業系統中控制整個系統許可權的一個作業系統元件。
新的 GUI 圖形介面程式,在設計的時候,不是作為特權程序來執行。它們通過 PolicyKit 來和特權程序通訊,執行管理操作。
在 Debian 系統中,PolicyKit 限制了屬於 sudo
組的使用者帳號的這種操作。
參見 polkit
(8)。
對系統安全而言,儘可能的禁用服務程式,是一個好的主意。網路服務是危險的。有不使用的服務,不管是直接由後臺背景程式(daemon)啟用,還是通過super-server 程式啟用,都被認為是安全風險。
許多程式,比如說 sshd
(8), 使用基於 PAM 的存取控制。也還有許多方式來限制存取一些服務端的程式。
組態檔案: "/etc/default/program_name
"
後臺守護程序(daemon)的 Systemd 服務單元配置
super-server 使用
"/etc/inetd.conf
"
TCP wrapper 使用
"/etc/hosts.deny
" 和 "/etc/hosts.allow
"
, tcpd
(8)
Sun RPC" 使用 /etc/rpc.conf
"
atd
(8) 使用 "/etc/at.allow
" 和
"/etc/at.deny
"
crontab
(1) 使用 "/etc/cron.allow
" 和
"/etc/cron.deny
"
參見 節 3.5, “系統管理”、節 4.5.1, “PAM 和 NSS 存取的組態檔案” 和 節 5.7, “Netfilter 網路過濾框架”。
提示 | |
---|---|
如果你遠端存取最新的 Debian
系統有問題,看下在" |
Linux 核心已經發展和支援在傳統的 UNIX 實現裡面沒有的安全特徵。
Linux 支援 擴充套件屬性,擴充套件了傳統的 UNIX 屬性
(參見 xattr
(7))。
Linux 把傳統的超級使用者相關的特權分開到不同的單元,被稱為
capabilities
(7),它能夠獨立的啟用和停用。從 2.2 版本核心開始,Capabilities
是一個執行緒獨立的屬性。
Linux Security Module (LSM) 安全模組框架 提供了一個多方面的安全檢查機制,和新的核心擴充套件關聯。例如:
這些擴充套件緊縮的權力模型比普通的類 Unix 安全模型策略更加嚴格,甚至 root 的權力也被限制。建議你閱讀 kernel.org 上的 Linux 安全模組(LSM)框架文件。
Linux 的 namespaces
封裝了一個全域性系統資源到一個抽象的概念,全域性系統資源在 namespace 內對程序可見,並且 namespace 有它們自己的全域性資源隔離例項。
對其它程序全域性資源的可見性的改變是,同一個 namespace 的成員可見,但是對非同一個 namespace 的其它程序不可見。從核心 5.6
版本起,有 8 種 namespaces (參見 namespaces
(7),
unshare
(1), nsenter
(1))。
在 Debian 11 Bullseye (2021) 中, Debian 使用 unified cgroup hierarchy(統一 cgroup 層級架構) (亦稱為 cgroups-v2)。
namespaces 同 cgroups 一起來隔離它們的程序,允許資源控制的使用示例是:
沙盒環境。參見 節 7.7, “沙盒”。
Linux 容器,比如 Docker、 LXC。參見 節 9.11, “虛擬化系統”。
這些功能不能夠透過 節 4.1, “一般的 Unix 認證” 實現。這些高階話題大部分超出了本介紹文件的範圍。