跳轉至內容

OpenSSH/伺服器

100% developed
來自 Wikibooks,開放世界中的開放書籍

OpenSSH 伺服器,sshd(8),監聽來自客戶端的連線,併為每個新的傳入連線啟動一個或兩個新程序來處理金鑰交換、加密、身份驗證、程式執行和資料交換。在多路複用情況下,一些程序會被重用。它可以獨立執行並等待在後臺,也可以在前景執行,或者可以按需由任何網際網路服務守護程式載入。

從 8.2 版開始,ps(1) 中顯示的監聽程序標題還顯示了等待身份驗證的連線數。

$ ps -p $(pgrep -u root sshd) -o pid,user,args 
  PID USER     COMMAND
44476 root     sshd: /usr/sbin/sshd [listener] 0 of 10-100 startups (sshd)

請注意,這是等待身份驗證的連線數,而不是已經驗證的連線數。每個連線都有自己的獨立處理程式程序,由已驗證的帳戶擁有。

sshd(8) 是安全 shell 守護程式,它監聽傳入的連線。IANA 指定的 ssh(1) 的標準埠是 22 [1]。如果 sshd(8) 不監聽特權埠,則無需由 root 啟動。但是,很少有(如果有的話)情況下應該考慮使用非標準埠。 sshd(8) 可以繫結到多個地址或僅繫結到某些地址。 sshd(8) 的多個例項(每個例項都有不同的配置)可以在同一臺機器上執行,這在多宿主機器上可能很有用。啟動 sshd(8) 必須提供絕對路徑,例如 /usr/sbin/sshd

配置資料首先從 shell 傳遞的引數和選項、使用者特定檔案以及最後從系統範圍的配置檔案中解析。

sshd(8) - 允許您登入的 SSH 守護程式。
sftp-server(8) - SFTP 伺服器子系統,在需要時由 sshd(8) 自動啟動。
ssh-keysign(8) - 基於主機的身份驗證的輔助程式。
sshd_config(5) - 伺服器配置檔案。

可以使 sshd(8) 守護程式解析配置檔案、測試其有效性,然後報告有效的配置設定。這是透過執行擴充套件測試模式 (-T) 來完成的。擴充套件測試將打印出實際的伺服器設定。它還可以透過使用 Match 指令與連線規範 (-C) 引數結合使用來報告對設定的修改。-C 的選項是 userhostaddr。其中,hostaddr 分別指的是執行 sshd(8) 的主機和連線來自的地址。

以下將打印出如果使用者 'fred' 從地址 192.168.100.5 嘗試登入到主機 server.example.org,將應用的配置。

$ /usr/sbin/sshd -TC user=fred,host=server.example.org,addr=192.168.100.5

輸出很長,因此可能需要透過管道將其傳遞到 sort(1) 和類似 less(1) 的分頁器。有關更多選項,請參見 除錯伺服器配置 部分。

預設情況下,所有組都允許登入。但是,如果指定了 AllowGroupsAllowUsers,則不允許列出的所有使用者或組登入。允許/拒絕指令按以下順序處理

  1. DenyUsers,
  2. AllowUsers,
  3. DenyGroups,最後是
  4. AllowGroups.

匹配到的第一個模式將生效,因此,如果存在 AllowUsers,它將完全覆蓋 AllowGroups,無論它們在配置檔案中的順序如何。因此,為了獲得最大的靈活性,建議使用 AllowGroups。相反,DenyUsersDenyGroups 不會相互干擾,可以一起使用。列出組名或組名模式,用空格隔開。如果指定了,則只允許或拒絕屬於與列表中的組或模式匹配的組的使用者的登入。僅組名或使用者名稱有效;數字組 ID 或使用者 ID 不會被識別。

inetd / xinetd 下的 sshd

[編輯 | 編輯原始碼]

網際網路服務守護程式是一個伺服器,用於按需啟動其他伺服器。 xinetd(8)inetd(8) 是兩種變體,可以利用它們來指定額外的引數和約束,包括以特定使用者和組的身份執行啟動的服務。透過使一個守護程式處於活動狀態,並根據需要呼叫其他守護程式,可以減少對系統的需求。以這種方式啟動 sshd(8) 意味著 inetd(8) 等待傳入的請求,啟動 sshd(8),然後當 SSH 會話結束時,關閉 sshd(8).

              Packet
 Internet --> Filter --> tcpwrappers --> (x)inetd --> sshd
             (firewall)  (aka tcpd)

兩者都可以用於額外的日誌記錄,例如成功或不成功的登入、訪問限制,甚至包括一天中的時間、CPU 優先順序和連線數。還有更多可能性。有關配置選項的完整概述,請參見 xinetd.conf(5)inetd.conf(5) 的手冊頁。

inetd(8) 支援 tcpd,並且可以使用 tcpd' 的 tcpwrappers 來進一步控制訪問或日誌記錄。 sshd(8) 本身也支援 tcpwrappers,直到 6.6 版。請參見手冊頁,瞭解有關如何使用配置檔案 hosts.allowhosts.deny 的資訊。從 6.7 版開始,OpenSSH 本身不再支援 tcpwrappers,因為當前的包過濾程式使它變得多餘。

使用 inetd(8) 或 xinetd(8) 的兩個主要缺點是,連線開始時可能會略微延遲,並且必須配置 sshd(8) 以允許從服務守護程式啟動。延遲隻影響初始連線,因此不會妨礙實際操作。網際網路服務守護程式不應用於無狀態服務,例如 HTTP 和 HTTPS,在這些服務中,每次操作本質上都是一個新的連線。再次,有關更多詳細資訊,請參見 xinetd.conf(5)inetd.conf(5) 的手冊頁。

來自 xinetd.conf(5) 的示例

service ssh
{
	socket_type     = stream
	protocol        = tcp
	wait            = no
	user            = root
	server          = /usr/sbin/sshd
	server_args     = -i
	per_source      = UNLIMITED
	log_on_failure  = USERID HOST
	# log_on_success  = PID HOST DURATION TRAFFIC EXIT
	# instances       = 10
	# nice            = 10
	# bind            = 192.168.0.100
	# only_from       = 192.168.0.0
	# access_times    = 08:00-15:25
	# no_access       = 192.168.54.0
	# no_access       += 192.168.33.0
	# banner          = /etc/banner.inetd.connection.txt
	# banner_success  = /etc/banner.inetd.welcome.txt
	# banner_fail     = /etc/banner.inetd.takeahike.txt
}

來自 inetd.conf(5) 的示例

ssh    stream  tcp     nowait  root /usr/sbin/sshd -i
ssh    stream  tcp6    nowait  root /usr/sbin/sshd -i

inetd(8) 相比,xinetd(8) 在功能方面有幾個優勢,但使用它們的地方很少見。

SFTP 伺服器子系統

[編輯 | 編輯原始碼]

SFTP 子系統首次出現在 OpenBSD 2.8 / OpenSSH 2.3[2] 中。它由 sshd(8) 根據需要使用 Subsystem 配置指令呼叫,而不是獨立執行。子系統有兩種形式。一種是常規的 sftp-server(8)。另一種是在程序中的 SFTP 伺服器,在與 ChrootDirectory 指令一起使用時不需要任何支援檔案。Subsystem 配置指令可以用於傳遞選項

-d 為使用者指定一個備用起始目錄,預設為使用者的 home 目錄。(6.2 版首次出現)

Subsystem sftp internal-sftp -d /var/www

-e 將日誌資訊傳送到 stderr 而不是 syslog(3)

Subsystem sftp internal-sftp -e

-f 指定從 sftp-server(8) 記錄訊息時使用的 syslog(3) 設施程式碼。可能的值有:DAEMON、USER、AUTH、LOCAL0、LOCAL1、LOCAL2、LOCAL3、LOCAL4、LOCAL5、LOCAL6、LOCAL7。

Subsystem    sftp    /usr/libexec/sftp-server -f LOCAL0

-l 指定 sftp-server(8) 記錄哪些訊息。預設值為 AUTH。其他可能的值為:QUIET、FATAL、ERROR、INFO、VERBOSE、DEBUG、DEBUG1、DEBUG2 和 DEBUG3。INFO 和 VERBOSE 記錄 sftp-server 代表客戶端執行的事務。DEBUG 和 DEBUG1 等效,而 DEBUG2 和 DEBUG3 分別指定更高級別的除錯輸出。DEBUG 到 DEBUG3 的日誌級別將違反使用者隱私,不應在正常操作中使用。預設日誌級別為 ERROR。實際路徑將根據發行版或作業系統而有所不同。

Subsystem    sftp    /usr/libexec/sftp-server -l VERBOSE

-p-P 分別指定白名單和黑名單協議請求。逗號分隔列表將分別允許或禁止,如果同時使用,則黑名單將首先應用。-Q 提供伺服器支援的協議功能列表。所有三個功能從版本 6.5 開始可用。實際路徑將根據發行版或作業系統而有所不同。

在版本 6.5 中,requests 是唯一可查詢的協議功能。

$ /usr/libexec/sftp-server -Q requests

-R 將 SFTP 子系統置於只讀模式。嘗試更改檔案系統,包括以寫入方式開啟檔案,將失敗。

-u 覆蓋使用者的預設 umask 並顯式設定用於建立檔案和目錄的 umask(2)。有關日誌級別或日誌設施的更多資訊,請參閱 syslog.conf(5) 手冊頁。sshd(8) 必須能夠訪問 /dev/log 以使記錄工作。因此,將 sftp-server(8) 子系統與主 SSH 伺服器的 ChrootDirectory 選項結合使用需要 syslogd(8) 在 chroot 目錄中建立一個日誌節點。

Subsystem sftp internal-sftp -u 0002

這為 OpenSSH 5.4 及更高版本中的 SFTP 子系統設定了 umask。

環境變數

[編輯 | 編輯原始碼]

ssh(1)sshd(8) 在登入時會自動設定一些環境變數。如果檔案存在,並且允許使用者更改環境,則使用者可以在 ~/.ssh/environment 檔案中顯式定義其他變數。也可以在 authorized_keys 檔案中按金鑰設定變數,同樣只有在允許使用者更改環境的情況下才可行。

~/.ssh/environment 中,使用格式 NAME=value 設定變數。在 ~/.ssh/authorized_keys/etc/ssh/authorized_keys 中,格式為 environment="NAME=value" 有關更多資訊,請參閱 sshd_config(5) 中的 PermitUserEnvironmentAcceptEnv 配置指令以及 ssh_config(5) 中的 SendEnv 指令。

以下變數可以由 ssh(1) 設定,具體取決於情況。

DISPLAY 如果隧道了 X11,則設定此變數,以便 DISPLAY 變數指示 X11 伺服器的位置。當它由 ssh(1) 自動設定時,它指向 hostname:n 形式的值,其中 hostname 指示 shell 執行的主機,而 n 是一個大於或等於 1 的整數。 ssh(1) 使用此特殊值透過安全通道轉發 X11 連線。使用者通常不應顯式設定 DISPLAY,因為這會使 X11 連線不安全,並且需要使用者手動複製任何必要的授權 cookie。

HOME 使用者主目錄的路徑。

LOGNAME USER 的同義詞。這是為了與使用此變數的系統相容而設定的。

MAIL 使用者郵箱的路徑。

PATH 編譯 ssh(1) 時指定的預設 PATH。

SSH_ASKPASS 如果 DISPLAYSSH_ASKPASS 都已設定,並且 SSH 會話沒有關聯的終端或偽終端,則由 SSH_ASKPASS 指定的程式將執行並開啟一個 X11 視窗以在需要時讀取密碼。這在從 xsession 或相關指令碼呼叫 ssh(1) 時特別有用。在某些機器上,可能需要從 /dev/null 重定向輸入以使其工作。

SSH_AUTH_SOCK 客戶端機器上的路徑,用於告訴 ssh(1) 用於與 SSH 金鑰代理通訊的 UNIX 域套接字。

SSH_CLIENT 標識連線的客戶端端。它包含三個空格分隔的值:客戶端 IP 地址、客戶端埠號和伺服器埠號。

SSH_CONNECTION 標識連線的客戶端和伺服器端。該變數包含四個空格分隔的值:客戶端 IP 地址、客戶端埠號、伺服器 IP 地址和伺服器埠號。

SSH_ORIGINAL_COMMAND 如果使用了 ForceCommand 指令,或者在金鑰中使用了 Command="...",則此變數包含原始命令,包括原始選項。它可用於提取原始引數。

SSH_TTY 此變數設定為與當前 shell 或命令關聯的 TTY 的名稱(裝置的路徑)。如果當前會話沒有 TTY,則不會設定此變數。

SSH_USER_AUTH 如果在 sshd_config(5) 中設定了 ExposeAuthInfo,則此變數將包含一個臨時檔案的名稱,該檔案包含用於此特定會話的身份驗證方法。

TZ 如果在啟動守護程序時設定了此變數,則它將設定為指示當前時區。SSH 守護程序將此值傳遞給新連線。

USER 設定為登入使用者的名稱。


參考文獻

[編輯 | 編輯原始碼]
  1. "服務名稱和傳輸協議埠號登錄檔". IETF. 2012.
  2. "OpenSSH 2.3.0p1 發行說明". OpenSSH.com.

 

華夏公益教科書