SSH 的架構(gòu)是服務(wù)器/客戶端模式,兩端運(yùn)行的軟件是不一樣的。OpenSSH 的客戶端軟件是 ssh,服務(wù)器軟件是 sshd。本章介紹 sshd 的各種知識。
如果沒有安裝 sshd,可以用下面的命令安裝。
# Debian
$ sudo aptitude install openssh-server
# Red Hat
$ sudo yum install openssh-server
一般來說,sshd 安裝后會跟著系統(tǒng)一起啟動。如果當(dāng)前 sshd 沒有啟動,可以用下面的命令啟動。
$ sshd
上面的命令運(yùn)行后,如果提示“sshd re-exec requires execution with an absolute path”,就需要使用絕對路徑來啟動。這是為了防止有人出于各種目的,放置同名軟件在$PATH
變量指向的目錄中,代替真正的 sshd。
# Centos、Ubuntu、OS X $ /usr/sbin/sshd
上面的命令運(yùn)行以后,sshd 自動進(jìn)入后臺,所以命令后面不需要加上&
。
除了直接運(yùn)行可執(zhí)行文件,也可以通過 Systemd 啟動 sshd。
# 啟動
$ sudo systemctl start sshd.service
# 停止
$ sudo systemctl stop sshd.service
# 重啟
$ sudo systemctl restart sshd.service
下面的命令讓 sshd 在計(jì)算機(jī)下次啟動時自動運(yùn)行。
$ sudo systemctl enable sshd.service
sshd 的配置文件在/etc/ssh
目錄,主配置文件是sshd_config
,此外還有一些安裝時生成的密鑰。
/etc/ssh/sshd_config
:配置文件
/etc/ssh/ssh_host_ecdsa_key
:ECDSA 私鑰。
/etc/ssh/ssh_host_ecdsa_key.pub
:ECDSA 公鑰。
/etc/ssh/ssh_host_key
:用于 SSH 1 協(xié)議版本的 RSA 私鑰。
/etc/ssh/ssh_host_key.pub
:用于 SSH 1 協(xié)議版本的 RSA 公鑰。
/etc/ssh/ssh_host_rsa_key
:用于 SSH 2 協(xié)議版本的 RSA 私鑰。
/etc/ssh/ssh_host_rsa_key.pub
:用于 SSH 2 協(xié)議版本的 RSA 公鑰。
/etc/pam.d/sshd
:PAM 配置文件。
注意,如果重裝 sshd,上面這些密鑰都會重新生成,導(dǎo)致客戶端重新連接 ssh 服務(wù)器時,會跳出警告,拒絕連接。為了避免這種情況,可以在重裝 sshd 時,先備份/etc/ssh
目錄,重裝后再恢復(fù)這個目錄。
配置文件sshd_config
的格式是,每個命令占據(jù)一行。每行都是配置項(xiàng)和對應(yīng)的值,配置項(xiàng)的大小寫不敏感,與值之間使用空格分隔。
Port 2034
上面的配置命令指定,配置項(xiàng)Port
的值是2034
。Port
寫成port
也可。
配置文件還有另一種格式,就是配置項(xiàng)與值之間有一個等號,等號前后的空格可選。
Port = 2034
配置文件里面,#
開頭的行表示注釋。
# 這是一行注釋
注意,注釋只能放在一行的開頭,不能放在一行的結(jié)尾。
Port 2034 # 此處不允許注釋
上面的寫法是錯誤的。
另外,空行等同于注釋。
sshd 啟動時會自動讀取默認(rèn)的配置文件。如果希望使用其他的配置文件,可以用 sshd 命令的-f
參數(shù)指定。
$ sshd -f /usr/local/ssh/my_config
上面的命令指定 sshd 使用另一個配置文件my_config
。
修改配置文件以后,可以用 sshd 命令的-t
(test)檢查有沒有語法錯誤。
$ sshd -t
配置文件修改以后,并不會自動生效,必須重新啟動 sshd。
$ sudo systemctl restart sshd.service
sshd 有自己的一對或多對密鑰。它使用密鑰向客戶端證明自己的身份。所有密鑰都是公鑰和私鑰成對出現(xiàn),公鑰的文件名一般是私鑰文件名加上后綴.pub
。
DSA 格式的密鑰文件默認(rèn)為/etc/ssh/ssh_host_dsa_key
(公鑰為ssh_host_dsa_key.pub
),RSA 格式的密鑰為/etc/ssh/ssh_host_rsa_key
(公鑰為ssh_host_rsa_key.pub
)。如果需要支持 SSH 1 協(xié)議,則必須有密鑰/etc/ssh/ssh_host_key
。
如果密鑰不是默認(rèn)文件,那么可以通過配置文件sshd_config
的HostKey
配置項(xiàng)指定。默認(rèn)密鑰的HostKey
設(shè)置如下。
# HostKey for protocol version 1 # HostKey /etc/ssh/ssh_host_key # HostKeys for protocol version 2 # HostKey /etc/ssh/ssh_host_rsa_key # HostKey /etc/ssh/ssh_host_dsa_ke
上面命令前面的#
表示這些行都是注釋,因?yàn)檫@是默認(rèn)值,有沒有這幾行都一樣。
如果要修改密鑰,就要去掉行首的#
,指定其他密鑰。
HostKey /usr/local/ssh/my_dsa_key
HostKey /usr/local/ssh/my_rsa_key
HostKey /usr/local/ssh/my_old_ssh1_key
以下是/etc/ssh/sshd_config
文件里面的配置項(xiàng)。
AcceptEnv
AcceptEnv
指定允許接受客戶端通過SendEnv
命令發(fā)來的哪些環(huán)境變量,即允許客戶端設(shè)置服務(wù)器的環(huán)境變量清單,變量名之間使用空格分隔(AcceptEnv PATH TERM
)。
AllowGroups
AllowGroups
指定允許登錄的用戶組(AllowGroups groupName
,多個組之間用空格分隔。如果不使用該項(xiàng),則允許所有用戶組登錄。
AllowUsers
AllowUsers
指定允許登錄的用戶,用戶名之間使用空格分隔(AllowUsers user1 user2
),也可以使用多行AllowUsers
命令指定,用戶名支持使用通配符。如果不使用該項(xiàng),則允許所有用戶登錄。該項(xiàng)也可以使用用戶名@域名
的格式(比如AllowUsers jones@example.com
)。
AllowTcpForwarding
AllowTcpForwarding
指定是否允許端口轉(zhuǎn)發(fā),默認(rèn)值為yes
(AllowTcpForwarding yes
),local
表示只允許本地端口轉(zhuǎn)發(fā),remote
表示只允許遠(yuǎn)程端口轉(zhuǎn)發(fā)。
AuthorizedKeysFile
AuthorizedKeysFile
指定儲存用戶公鑰的目錄,默認(rèn)是用戶主目錄的ssh/authorized_keys
目錄(AuthorizedKeysFile .ssh/authorized_keys
)。
Banner
Banner
指定用戶登錄后,sshd 向其展示的信息文件(Banner /usr/local/etc/warning.txt
),默認(rèn)不展示任何內(nèi)容。
ChallengeResponseAuthentication
ChallengeResponseAuthentication
指定是否使用“鍵盤交互”身份驗(yàn)證方案,默認(rèn)值為yes
(ChallengeResponseAuthentication yes
)。
從理論上講,“鍵盤交互”身份驗(yàn)證方案可以向用戶詢問多重問題,但是實(shí)踐中,通常僅詢問用戶密碼。如果要完全禁用基于密碼的身份驗(yàn)證,請將PasswordAuthentication
和ChallengeResponseAuthentication
都設(shè)置為no
。
Ciphers
Ciphers
指定 sshd 可以接受的加密算法(Ciphers 3des-cbc
),多個算法之間使用逗號分隔。
ClientAliveCountMax
ClientAliveCountMax
指定建立連接后,客戶端失去響應(yīng)時,服務(wù)器嘗試連接的次數(shù)(ClientAliveCountMax 8
)。
ClientAliveInterval
ClientAliveInterval
指定允許客戶端發(fā)呆的時間,單位為秒(ClientAliveInterval 180
)。如果這段時間里面,客戶端沒有發(fā)送任何信號,SSH 連接將關(guān)閉。
Compression
Compression
指定客戶端與服務(wù)器之間的數(shù)據(jù)傳輸是否壓縮。默認(rèn)值為yes
(Compression yes
)
DenyGroups
DenyGroups
指定不允許登錄的用戶組(DenyGroups groupName
)。
DenyUsers
DenyUsers
指定不允許登錄的用戶(DenyUsers user1
),用戶名之間使用空格分隔,也可以使用多行DenyUsers
命令指定。
FascistLogging
SSH 1 版本專用,指定日志輸出全部 Debug 信息(FascistLogging yes
)。
HostKey
HostKey
指定 sshd 服務(wù)器的密鑰,詳見前文。
KeyRegenerationInterval
KeyRegenerationInterval
指定 SSH 1 版本的密鑰重新生成時間間隔,單位為秒,默認(rèn)是3600秒(KeyRegenerationInterval 3600
)。
ListenAddress
ListenAddress
指定 sshd 監(jiān)聽的本機(jī) IP 地址,即 sshd 啟用的 IP 地址,默認(rèn)是 0.0.0.0(ListenAddress 0.0.0.0
)表示在本機(jī)所有網(wǎng)絡(luò)接口啟用??梢愿某芍辉谀硞€網(wǎng)絡(luò)接口啟用(比如ListenAddress 192.168.10.23
),也可以指定某個域名啟用(比如ListenAddress server.example.com
)。
如果要監(jiān)聽多個指定的 IP 地址,可以使用多行ListenAddress
命令。
ListenAddress 172.16.1.1
ListenAddress 192.168.0.1
LoginGraceTime
LoginGraceTime
指定允許客戶端登錄時發(fā)呆的最長時間,比如用戶遲遲不輸入密碼,連接就會自動斷開,單位為秒(LoginGraceTime 60
)。如果設(shè)為0
,就表示沒有限制。
LogLevel
LogLevel
指定日志的詳細(xì)程度,可能的值依次為QUIET
、FATAL
、ERROR
、INFO
、VERBOSE
、DEBUG
、DEBUG1
、DEBUG2
、DEBUG3
,默認(rèn)為INFO
(LogLevel INFO
)。
MACs
MACs
指定sshd 可以接受的數(shù)據(jù)校驗(yàn)算法(MACs hmac-sha1
),多個算法之間使用逗號分隔。
MaxAuthTries
MaxAuthTries
指定允許 SSH 登錄的最大嘗試次數(shù)(MaxAuthTries 3
),如果密碼輸入錯誤達(dá)到指定次數(shù),SSH 連接將關(guān)閉。
MaxStartups
MaxStartups
指定允許同時并發(fā)的 SSH 連接數(shù)量(MaxStartups)。如果設(shè)為0
,就表示沒有限制。
這個屬性也可以設(shè)為A:B:C
的形式,比如MaxStartups 10:50:20
,表示如果達(dá)到10個并發(fā)連接,后面的連接將有50%的概率被拒絕;如果達(dá)到20個并發(fā)連接,則后面的連接將100%被拒絕。
PasswordAuthentication
PasswordAuthentication
指定是否允許密碼登錄,默認(rèn)值為yes
(PasswordAuthentication yes
),建議改成no
(禁止密碼登錄,只允許密鑰登錄)。
PermitEmptyPasswords
PermitEmptyPasswords
指定是否允許空密碼登錄,即用戶的密碼是否可以為空,默認(rèn)為yes
(PermitEmptyPasswords yes
),建議改成no
(禁止無密碼登錄)。
PermitRootLogin
PermitRootLogin
指定是否允許根用戶登錄,默認(rèn)為yes
(PermitRootLogin yes
),建議改成no
(禁止根用戶登錄)。
還有一種寫法是寫成prohibit-password
,表示 root 用戶不能用密碼登錄,但是可以用密鑰登錄。
PermitRootLogin prohibit-password
PermitUserEnvironment
PermitUserEnvironment
指定是否允許 sshd 加載客戶端的~/.ssh/environment
文件和~/.ssh/authorized_keys
文件里面的environment= options
環(huán)境變量設(shè)置。默認(rèn)值為no
(PermitUserEnvironment no
)。
Port
Port
指定 sshd 監(jiān)聽的端口,即客戶端連接的端口,默認(rèn)是22(Port 22
)。出于安全考慮,可以改掉這個端口(比如Port 8822
)。
配置文件可以使用多個Port
命令,同時監(jiān)聽多個端口。
Port 22
Port 80
Port 443
Port 8080
上面的示例表示同時監(jiān)聽4個端口。
PrintMotd
PrintMotd
指定用戶登錄后,是否向其展示系統(tǒng)的 motd(Message of the day)的信息文件/etc/motd
。該文件用于通知所有用戶一些重要事項(xiàng),比如系統(tǒng)維護(hù)時間、安全問題等等。默認(rèn)值為yes
(PrintMotd yes
),由于 Shell 一般會展示這個信息文件,所以這里可以改為no
。
PrintLastLog
PrintLastLog
指定是否打印上一次用戶登錄時間,默認(rèn)值為yes
(PrintLastLog yes
)。
Protocol
Protocol
指定 sshd 使用的協(xié)議。Protocol 1
表示使用 SSH 1 協(xié)議,建議改成Protocol 2
(使用 SSH 2 協(xié)議)。Protocol 2,1
表示同時支持兩個版本的協(xié)議。
PubKeyAuthentication
PubKeyAuthentication
指定是否允許公鑰登錄,默認(rèn)值為yes
(PubKeyAuthentication yes
)。
QuietMode
SSH 1 版本專用,指定日志只輸出致命的錯誤信息(QuietMode yes
)。
RSAAuthentication
RSAAuthentication
指定允許 RSA 認(rèn)證,默認(rèn)值為yes
(RSAAuthentication yes
)。
ServerKeyBits
ServerKeyBits
指定 SSH 1 版本的密鑰重新生成時的位數(shù),默認(rèn)是768(ServerKeyBits 768
)。
StrictModes
StrictModes
指定 sshd 是否檢查用戶的一些重要文件和目錄的權(quán)限。默認(rèn)為yes
(StrictModes yes
),即對于用戶的 SSH 配置文件、密鑰文件和所在目錄,SSH 要求擁有者必須是根用戶或用戶本人,用戶組和其他人的寫權(quán)限必須關(guān)閉。
SyslogFacility
SyslogFacility
指定 Syslog 如何處理 sshd 的日志,默認(rèn)是 Auth(SyslogFacility AUTH
)。
TCPKeepAlive
TCPKeepAlive
指定打開 sshd 跟客戶端 TCP 連接的 keepalive 參數(shù)(TCPKeepAlive yes
)。
UseDNS
UseDNS
指定用戶 SSH 登錄一個域名時,服務(wù)器是否使用 DNS,確認(rèn)該域名對應(yīng)的 IP 地址包含本機(jī)(UseDNS yes
)。打開該選項(xiàng)意義不大,而且如果 DNS 更新不及時,還有可能誤判,建議關(guān)閉。
UseLogin
UseLogin
指定用戶認(rèn)證內(nèi)部是否使用/usr/bin/login
替代 SSH 工具,默認(rèn)為no
(UseLogin no
)。
UserPrivilegeSeparation
UserPrivilegeSeparation
指定用戶認(rèn)證通過以后,使用另一個子線程處理用戶權(quán)限相關(guān)的操作,這樣有利于提高安全性。默認(rèn)值為yes
(UsePrivilegeSeparation yes
)。
VerboseMode
SSH 2 版本專用,指定日志輸出詳細(xì)的 Debug 信息(VerboseMode yes
)。
X11Forwarding
X11Forwarding
指定是否打開 X window 的轉(zhuǎn)發(fā),默認(rèn)值為 no(X11Forwarding no
)。
修改配置文件以后,可以使用下面的命令驗(yàn)證,配置文件是否有語法錯誤。
$ sshd -t
新的配置文件生效,必須重啟 sshd。
$ sudo systemctl restart sshd
sshd 命令有一些配置項(xiàng)。這些配置項(xiàng)在調(diào)用時指定,可以覆蓋配置文件的設(shè)置。
(1)-d
-d
參數(shù)用于顯示 debug 信息。
$ sshd -d
(2)-D
-D
參數(shù)指定 sshd 不作為后臺守護(hù)進(jìn)程運(yùn)行。
$ sshd -D
(3)-e
-e
參數(shù)將 sshd 寫入系統(tǒng)日志 syslog 的內(nèi)容導(dǎo)向標(biāo)準(zhǔn)錯誤(standard error)。
(4)-f
-f
參數(shù)指定配置文件的位置。
(5)-h
-h
參數(shù)用于指定密鑰。
$ sshd -h /usr/local/ssh/my_rsa_key
(6)-o
-o
參數(shù)指定配置文件的一個配置項(xiàng)和對應(yīng)的值。
$ sshd -o "Port 2034"
配置項(xiàng)和對應(yīng)值之間,可以使用等號。
$ sshd -o "Port = 2034"
如果省略等號前后的空格,也可以不使用引號。
$ sshd -o Port=2034
-o
參數(shù)可以多個一起使用,用來指定多個配置關(guān)鍵字。
(7)-p
-p
參數(shù)指定 sshd 的服務(wù)端口。
$ sshd -p 2034
上面命令指定 sshd 在2034
端口啟動。
-p
參數(shù)可以指定多個端口。
$ sshd -p 2222 -p 3333
(8)-t
-t
參數(shù)檢查配置文件的語法是否正確。