當用戶(或程式)需要訪問系統時,需要進行認證,確認身份是受信任。
![]() |
警告 |
---|---|
PAM 的配置錯誤可能會鎖住你的系統。你必須有一個準備好的救援 CD,或者設立一個替代的 boot 分割槽。為了恢復系統,你需要使用它們啟動系統並糾正錯誤。 |
![]() |
警告 |
---|---|
本章是基於 2013 年發佈的 Debian 7.0 ( |
一般的 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:35, I:393 | 364 |
mkpasswd
|
具備 crypt(3) 庫所有特性的前端 |
openssl
|
V:794, I:993 | 1465 |
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:807, I:999 | 1032 | 插入式驗證模組(基礎服務) |
libpam-ldap
|
I:12 | 249 | 允許 LDAP 介面的插入式驗證模組 |
libpam-cracklib
|
I:16 | 115 | 啟用 cracklib 支援的插入式驗證模組 |
libpam-systemd
|
V:474, I:853 | 573 |
用於 logind 註冊使用者會話的插入式驗證模組(PAM)
|
libpam-doc
|
I:1 | 1044 | 插入式驗證模組(html 和 文字文件) |
libc6
|
V:935, I:999 | 12771 | GNU C 庫:同樣提供“名稱服務切換”服務的共享庫 |
glibc-doc
|
I:11 | 3161 | GNU C 庫:幫助頁面 |
glibc-doc-reference
|
I:5 | 12740 | GNU C 庫:參考手冊,有 info、pdf 和 html 格式(non-free) |
libnss-mdns
|
I:526 | 150 | 用於解析組播 DNS 名稱的 NSS 模組 |
libnss-ldap
|
I:11 | 265 | NSS 模組,用於使用 LDAP 作為一個名稱服務的 |
libnss-ldapd
|
I:14 | 153 |
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
軟體包被安裝用來管理使用者登入,透過在
systemd
控制組層,為 logind
註冊使用者會話來實現。參見
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
軟體包你能夠強制使用嚴格的密碼規則,例如,通過在
“/etc/pam.d/common-password
” 中新增下列行。
對於 squeeze
發行版:
password required pam_cracklib.so retry=3 minlen=9 difok=3 password [success=1 default=ignore] pam_unix.so use_authtok nullok md5 password requisite pam_deny.so password required pam_permit.so
![]() |
注意 |
---|---|
參見 第 9.3.15 节 “Alt-SysRq 鍵” 來限制核心的安全警告金鑰(SAK)功能。 |
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)。
Security-Enhanced Linux (SELinux) 是一個收緊許可權模組的框架,它比普通的類 Unix 安全模組 mandatory access control (MAC) 策略更嚴格。 root 許可權在某些條件下被限制。
對系統安全而言,儘可能的禁用服務程式,是一個好的主意。網路服務是危險的。有不使用的服務,不管是直接由後臺守護程序(daemon)啟用,還是通過super-server 程式啟用,都被認為是安全風險。
許多程式,比如說 sshd(8), 使用基於 PAM 的訪問控制。也還有許多方式來限制訪問一些服務端的程式。
配置檔案: "/etc/default/<program_name>
"
後臺守護程序(daemon)的服務單元配置
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.2.6 节 “systemd 下的系統管理”, 第 4.5.1 节 “PAM 和 NSS 訪問的配置檔案”, 和 第 5.10 节 “Netfilter 網路過濾框架”.
![]() |
提示 |
---|---|
如果你遠端訪問最新的 Debian 系統有問題,看下在" |
![]() |
注意 |
---|---|
這裡的資訊也許不夠完全滿足你的安全需求,但這也是一個好的開始. |
許多流行的傳輸層服務,互動資訊使用純文字的密碼認證。這是非常差的方式,通過公共的網際網路傳輸純文字密碼,密碼能夠被截獲到。你能夠執行這些服務,使用 "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.9 节 “伺服器遠端訪問和工具 (SSH)”.
即使你執行 Secure Shell (SSH) 和 Point-to-point tunneling protocol (PPTP) 這樣的安全服務,在網際網路上,仍然有機會使用野蠻暴力猜測密碼攻擊進入。 使用防火牆策略 (參見 第 5.10 节 “Netfilter 網路過濾框架”),並和下面的安全工具一起,可以提升安全形勢。
表 4.8. 提供額外安全方式的工具列表
軟件包 | 流行度 | 大小 | 說明 |
---|---|---|---|
knockd
|
V:0, I:3 | 102 | 小的 port-knock 後臺守護程序(daemon) knockd(1) 和客戶端 konck(1) |
fail2ban
|
V:112, I:123 | 2092 | 禁用造成多個認證錯誤的 IP |
libpam-shield
|
V:0, I:0 | 115 | 把嘗試猜測密碼的遠端攻擊者關在外面 |
為阻止人們使用 root 許可權訪問你的機器,你需要做下面的操作。
阻止對硬碟的物理訪問
鎖住 BIOS 來阻止從可移動介質啟動
為 GRUB 互動式會話設定密碼
鎖住 GRUB 選單,禁止編輯
如果可以物理訪問硬碟,則可以使用下面的步驟,相對簡單的重置密碼。
將硬碟拿到一個可以設定 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.8 节 “資料加密提示”)加密 root 分割槽(或
"/etc
" 分割槽) 。這樣的話,你總是需要密碼來啟動系統。