第九章 端口轉(zhuǎn)發(fā)與X轉(zhuǎn)發(fā)
使用SSH對其它應(yīng)用程序在別的TCP端口上建立的TCP/IP傳輸進(jìn)行加密和解密,這一過
程稱為端口轉(zhuǎn)發(fā),其絕大多數(shù)操作都是透明的,功能非常強(qiáng)大。TELNET,SMTP,NNTP,IMAP
和一些基于TCP的不安全協(xié)議都可變得安全,只要將其連接通過SSH轉(zhuǎn)發(fā)即可。端口轉(zhuǎn)發(fā)
有時(shí)又叫做隧道傳輸。
例子:一個(gè)運(yùn)行IMAP的服務(wù)器S,在家里的主機(jī)H上運(yùn)行一個(gè)email程序,現(xiàn)在想用ssh
保護(hù)IMAP連接。
$ ssh -L2001:localhost:143 S
-L 表明是本地轉(zhuǎn)發(fā),,上面這命令可完成登錄到S的功能,現(xiàn)在的這個(gè)SSH會(huì)話同時(shí)將H
的2001端口轉(zhuǎn)發(fā)到S的143端口,在退出會(huì)話之前一直有效。并告知email程序使用被轉(zhuǎn)
發(fā)的端口,通常郵件程序連接服務(wù)器的143端口,即套接字 (S,143),F(xiàn)在要令其連接
本地主機(jī)H自已的2001端口,也就是套接字(localhost,2001)。創(chuàng)建本地轉(zhuǎn)發(fā)時(shí)可以不用-L
選項(xiàng),而在客戶端配置文件中用LocalForward關(guān)鍵字。
LocalForward 2001 localhost:143 ssh1 openssh
LocalForward "2001:localhost:143" ssh2
-g 選項(xiàng)和GatewayPorts yes/no關(guān)鍵字可以配置除本地主機(jī)外的機(jī)器是否能使用本地的端口
轉(zhuǎn)發(fā)功能。出于安全問題,該禁止這個(gè)功能。
遠(yuǎn)程轉(zhuǎn)發(fā)端口與本地轉(zhuǎn)發(fā)幾乎完全相同,只是方向相反。此時(shí)服務(wù)器在本地,轉(zhuǎn)發(fā)連接由遠(yuǎn)
程主機(jī)發(fā)起。假設(shè)你已登錄進(jìn)服務(wù)器S。則
$ ssh -R2001:localhost:143 H
-R代表遠(yuǎn)程轉(zhuǎn)發(fā)。命令執(zhí)行后,一條從遠(yuǎn)程主機(jī)H的2001端口到服務(wù)器S的143端口的安
全隧道就建立起來了。H上的任何程序都可以通過連接(localhost,2001)來使用此安全隧道。
而在客戶端配置文件中用RemoteForward關(guān)鍵字.
RemoteForward 2001 S:143 ssh openssh
RemoteForward "2001:S:143" ssh2
$ ssh -o ClearAllForwardings=yes server.example.com 阻止第二條命令建立隧道
本地轉(zhuǎn)發(fā)與遠(yuǎn)程轉(zhuǎn)發(fā)
在本地轉(zhuǎn)發(fā)中,應(yīng)用程序客戶端與監(jiān)聽端同SSH客戶端在一起,應(yīng)用程序服務(wù)器與連接端
同SSH服務(wù)器在一起。
在遠(yuǎn)程轉(zhuǎn)發(fā)中,應(yīng)用程序客戶端與監(jiān)聽端同SSH服務(wù)器在一起,應(yīng)用程序服務(wù)器與連接端
同SSH客戶端在一起。
無遠(yuǎn)程登錄的端口轉(zhuǎn)發(fā),連接時(shí)帶-f參數(shù)。一次性轉(zhuǎn)發(fā)用-fo,ssh1與openssh不支持這個(gè)功
能,但可用以下語句實(shí)現(xiàn):
$ ssh -f -L2001:localhost:143 server sleep 10
終止
如果一個(gè)SSH會(huì)話現(xiàn)在還在活動(dòng)當(dāng)中,終止會(huì)出錯(cuò)。在SSH2中,如果退出有活動(dòng)轉(zhuǎn)發(fā)連
接的會(huì)話,該會(huì)話會(huì)依然打開,但會(huì)轉(zhuǎn)到后臺運(yùn)行。直到轉(zhuǎn)發(fā)連接終止。ssh1 and openssh
與此相反,如果要斷開還在活動(dòng)的會(huì)話,會(huì)出現(xiàn)警告,仍然在前臺運(yùn)行。
TIME_WAIT問題。在某些情況下,TCP連接斷連時(shí),其一端的套接字在很短一段時(shí)間內(nèi)變
得不可用,所以在斷連過程結(jié)束前不能把該端口用于TCP轉(zhuǎn)發(fā)。
第十章 推薦配置
服務(wù)器范圍配置
1、禁用其它訪問方式。
關(guān)掉r-命令,方法如下:刪除/etc/hosts.equiv文件,或改為只讀空文件。禁用rshd,rlogind and
rexecd,通過修改inetd.conf文件。
2、/etc/sshd_config配置
HostKey /etc/ssh_host_key
PidFile /etc/sshd.pid
RandomSeed /etc/ssh_random_seed
StrictModes yes 要求用戶保護(hù)其與SSH有關(guān)的文件及目錄
Umask 0077 保證所有SSHD1創(chuàng)建是文件和目錄都只能由其所有者(SSHD 運(yùn)行的
UID)讀取
port 22
ListenAddress 0.0.0.0
IdleTimeout 15m 15分鐘空閑超時(shí)
KeepAlive yes 客戶機(jī)死機(jī)時(shí)連接將會(huì)終止,而不會(huì)長期掛起。
LoginGraceTime 30 登錄時(shí)成功認(rèn)證的時(shí)限為30秒。
ServerKeyBits 768 服務(wù)器密鑰長度
KeyRegenerationInterval 3600 服務(wù)器密鑰一小時(shí)重新生成一次
PasswordAuthentication no 禁用密碼認(rèn)證
RhostsAuthentication no 禁用可信主機(jī)認(rèn)證
RhostsRSAAuthentication no 禁用增強(qiáng)可信主機(jī)認(rèn)證
RSAAuthentication yes 啟用公鑰認(rèn)證
IgnoreRhosts yes 完全禁止SSHD使用.rhosts文件
IgnoreRootRhosts yes
UseLogin no 禁用UseLogin,防止萬一使用了其它登錄程序
AllowHosts xxx 根據(jù)需要設(shè)置
SilentDeny yes 任何被DenyHosts拒絕的連接都不會(huì)向用戶返回消息,不必告訴攻擊
者發(fā)生了什么,可以增加了排錯(cuò)的難度。
PermitRootLogin nopwd 允許超級用戶通過SSH連接,但不能用密碼認(rèn)證
FascistLogging no 禁用FascistLogging日志方式,因?yàn)樗鼤?huì)在日志中記錄用戶特定信息,對
攻擊者有用。
QuietMode no 禁用QuietMode日志方式,使用日志更詳細(xì),敏感度更低
AllowTcpForwarding yes 允許tcp端口轉(zhuǎn)發(fā)和X轉(zhuǎn)發(fā),保護(hù)其它的tcp連接
X11Forwarding yes
3、/etc/ssh2/sshd2_config配置
HostKeyFile /etc/ssh2/hostkey
PublicHostKeyFile /etc/ssh2/hostkey.pub
RandmoSeedFile /etc/ssh2/random_seed
UserConfigDirectory
IdentityFile
AuthorizstionFile
StrictModes yes
port 22
listenAddress 0.0.0.0
KeepAlive yes
RequireReverseMapping no
LoginGraceTime 30
由于sshd2沒有設(shè)置服務(wù)器密鑰的位數(shù)的關(guān)鍵字,用戶得在啟動(dòng)時(shí)使用 -b 選項(xiàng) $ sshd2 -b
1024 ....
AllowedAuthentications publickey
RequiredAuthentications publickey
IgnoreRhosts yes
UserKnownHosts no 禁用該項(xiàng)可防止用戶給未知主機(jī)提供信任權(quán)限。
PermitRootLogin nopwd
Ciphers any 不能選none
QuietMode no
VerboseMode yes
Ssh1Compatibility no 禁用SSH-1兼容模式
#Ssh1Path /usr/local/ssh1/sshd1 出于實(shí)用原因,也可以啟用此模式,之前要指明ssh1服
務(wù)器可執(zhí)行文件位置
4、每賬號配置
對于SSH1 AND OPENSSH,~/.ssh/authorized_keys中的每一個(gè)密鑰都必須用適當(dāng)?shù)倪x項(xiàng)進(jìn)
行限制,from選項(xiàng)限制只能從特定的主機(jī)訪問特定的密鑰。例如,假設(shè)文件中包含你家那
臺pc(myhome.isp.net)的公鑰,而其它機(jī)器根本不可能用那個(gè)密鑰來認(rèn)證,我們就可以明確
限定這一關(guān)系:from = "myhome.isp.net" ...key...。還要對適當(dāng)?shù)拿荑設(shè)置空閑超時(shí)時(shí)間:from
= "myhome.isp.net" ,idle-timeout=5m ...key...。
最后,考慮每一個(gè)密鑰是否需要對到達(dá)的連接使用端口轉(zhuǎn)發(fā),代理轉(zhuǎn)發(fā)以及分配tty等,如
果不需要,就可以分別用no-port-forwarding,no-agent-forwarding and no-pty禁用這些特性。
5、密鑰管理
至少創(chuàng)建1024位長的用戶密鑰,并用好的口令對密鑰進(jìn)行保護(hù)。
6、客戶端配置
離開正在運(yùn)行的ssh客戶端時(shí),一定要用密碼保護(hù)。
在客戶端配置文件中啟用某些安全功能,并將其設(shè)置為最強(qiáng)
Host *
FallBackToRsh no 禁止使用不安全的r-命令(ssh2)沒有這個(gè)問題。
UseRsh no
GatewayPorts no 禁止遠(yuǎn)程客戶端連接本地的轉(zhuǎn)發(fā)端口
StrictHostKeyChecking ask 在主機(jī)密鑰發(fā)生變化時(shí)提醒你。請求你的處理意見。
配置“/etc/ssh/ssh_config”文件
“/etc/ssh/ssh_config”文件是OpenSSH系統(tǒng)范圍的配置文件,允許你通過設(shè)置不同的選項(xiàng)
來改變客戶端程序的運(yùn)行方式。這個(gè)文件的每一行包含“關(guān)鍵詞-值”的匹配,其中“關(guān)鍵
詞”是忽略大小寫的。下面列出來的是最重要的關(guān)鍵詞,用man命令查看幫助頁(ssh (1))
可以得到詳細(xì)的列表!
編輯“ssh_config”文件(vi /etc/ssh/ssh_config),添加或改變下面的參數(shù):
# Site-wide defaults for various options
Host *
ForwardAgent no
ForwardX11 no
RhostsAuthentication no
RhostsRSAAuthentication no
RSAAuthentication yes
PasswordAuthentication yes
FallBackToRsh no
UseRsh no
BatchMode no
CheckHostIP yes
StrictHostKeyChecking no
IdentityFile ~/.ssh/identity
Port 22
Cipher blowfish
EscapeChar ~
下面逐行說明上面的選項(xiàng)設(shè)置:
Host *
選項(xiàng)“Host”只對能夠匹配后面字串的計(jì)算機(jī)有效!*”表示所有的計(jì)算機(jī)!
ForwardAgent no
“ForwardAgent”設(shè)置連接是否經(jīng)過驗(yàn)證代理(如果存在)轉(zhuǎn)發(fā)給遠(yuǎn)程計(jì)算機(jī)!
ForwardX11 no
“ForwardX11”設(shè)置X11連接是否被自動(dòng)重定向到安全的通道和顯示集(DISPLAY set)!
RhostsAuthentication no
“RhostsAuthentication”設(shè)置是否使用基于rhosts的安全驗(yàn)證!
RhostsRSAAuthentication no
“RhostsRSAAuthentication”設(shè)置是否使用用RSA算法的基于rhosts的安全驗(yàn)證!
RSAAuthentication yes
“RSAAuthentication”設(shè)置是否使用RSA算法進(jìn)行安全驗(yàn)證。
PasswordAuthentication yes
“PasswordAuthentication”設(shè)置是否使用口令驗(yàn)證。
FallBackToRsh no
“FallBackToRsh”設(shè)置如果用ssh連接出現(xiàn)錯(cuò)誤是否自動(dòng)使用rsh!
UseRsh no
“UseRsh”設(shè)置是否在這臺計(jì)算機(jī)上使用“rlogin/rsh”!
BatchMode no
“BatchMode”如果設(shè)為“yes”,passphrase/password(交互式輸入口令)的提示將被禁止。
當(dāng)不能交互式輸入口令的時(shí)候,這個(gè)選項(xiàng)對腳本文件和批處理任務(wù)十分有用!
CheckHostIP yes
“CheckHostIP”設(shè)置ssh是否查看連接到服務(wù)器的主機(jī)的IP地址以防止DNS欺騙。建議設(shè)
置為“yes”。
StrictHostKeyChecking no
“StrictHostKeyChecking”如果設(shè)置成“yes”,ssh就不會(huì)自動(dòng)把計(jì)算機(jī)的密匙加入
“$HOME/.ssh/known_hosts”文件,并且一旦計(jì)算機(jī)的密匙發(fā)生了變化,就拒絕連接!
IdentityFile ~/.ssh/identity
“IdentityFile”設(shè)置從哪個(gè)文件讀取用戶的RSA安全驗(yàn)證標(biāo)識!
Port 22
“Port”設(shè)置連接到遠(yuǎn)程主機(jī)的端口!
Cipher blowfish
“Cipher”設(shè)置加密用的密碼。
EscapeChar ~
“EscapeChar”設(shè)置escape字符。
配置“/etc/ssh/sshd_config”文件
“/etc/ssh/sshd_config”是OpenSSH的配置文件,允許設(shè)置選項(xiàng)改變這個(gè)daemon的運(yùn)行。
這個(gè)文件的每一行包含“關(guān)鍵詞-值”的匹配,其中“關(guān)鍵詞”是忽略大小寫的。下面列出
來的是最重要的關(guān)鍵詞,用man命令查看幫助頁(sshd (8))可以得到詳細(xì)的列表!
編輯“sshd_config”文件(vi /etc/ssh/sshd_config),加入或改變下面的參數(shù):
# This is ssh server systemwide configuration file.
Port 22
ListenAddress 192.168.1.1
HostKey /etc/ssh/ssh_host_key
ServerKeyBits 1024
LoginGraceTime 600
KeyRegenerationInterval 3600
PermitRootLogin no
IgnoreRhosts yes
IgnoreUserKnownHosts yes
StrictModes yes
X11Forwarding no
PrintMotd yes
SyslogFacility AUTH
LogLevel INFO
RhostsAuthentication no
RhostsRSAAuthentication no
RSAAuthentication yes
PasswordAuthentication yes
PermitEmptyPasswords no
AllowUsers admin
下面逐行說明上面的選項(xiàng)設(shè)置:
Port 22
“Port”設(shè)置sshd監(jiān)聽的端口號!
ListenAddress 192.168.1.1
“ListenAddress”設(shè)置sshd服務(wù)器綁定的IP地址!
HostKey /etc/ssh/ssh_host_key
“HostKey”設(shè)置包含計(jì)算機(jī)私人密匙的文件!
ServerKeyBits 1024
“ServerKeyBits”定義服務(wù)器密匙的位數(shù)!
LoginGraceTime 600
“LoginGraceTime”設(shè)置如果用戶不能成功登錄,在切斷連接之前服務(wù)器需要等待的時(shí)間(以
秒為單位)!
KeyRegenerationInterval 3600
“KeyRegenerationInterval”設(shè)置在多少秒之后自動(dòng)重新生成服務(wù)器的密匙(如果使用密匙)。
重新生成密匙是為了防止用盜用的密匙解密被截獲的信息!
PermitRootLogin no
“PermitRootLogin”設(shè)置root能不能用ssh登錄。這個(gè)選項(xiàng)一定不要設(shè)成“yes”!
IgnoreRhosts yes
“IgnoreRhosts”設(shè)置驗(yàn)證的時(shí)候是否使用“rhosts”和“shosts”文件!
IgnoreUserKnownHosts yes
“IgnoreUserKnownHosts”設(shè)置ssh daemon是否在進(jìn)行RhostsRSAAuthentication安全驗(yàn)證
的時(shí)候忽略用戶的“$HOME/.ssh/known_hosts”
StrictModes yes
“StrictModes”設(shè)置ssh在接收登錄請求之前是否檢查用戶家目錄和rhosts文件的權(quán)限和所
有權(quán)。這通常是必要的,因?yàn)樾率纸?jīng)常會(huì)把自己的目錄和文件設(shè)成任何人都有寫權(quán)限。
X11Forwarding no
“X11Forwarding”設(shè)置是否允許X11轉(zhuǎn)發(fā)!
PrintMotd yes
“PrintMotd”設(shè)置sshd是否在用戶登錄的時(shí)候顯示“/etc/motd”中的信息。
SyslogFacility AUTH
“SyslogFacility”設(shè)置在記錄來自sshd的消息的時(shí)候,是否給出“facility code”。
LogLevel INFO
“LogLevel”設(shè)置記錄sshd日志消息的層次。INFO是一個(gè)好的選擇。查看sshd的man幫
助頁,已獲取更多的信息!
RhostsAuthentication no
“RhostsAuthentication”設(shè)置只用rhosts或“/etc/hosts.equiv”進(jìn)行安全驗(yàn)證是否已經(jīng)足夠了!
RhostsRSAAuthentication no
“RhostsRSA”設(shè)置是否允許用rhosts或“/etc/hosts.equiv”加上RSA進(jìn)行安全驗(yàn)證!
RSAAuthentication yes
“RSAAuthentication”設(shè)置是否允許只有RSA安全驗(yàn)證!
PasswordAuthentication yes
“PasswordAuthentication”設(shè)置是否允許口令驗(yàn)證!
PermitEmptyPasswords no
“PermitEmptyPasswords”設(shè)置是否允許用口令為空的帳號登錄!
AllowUsers admin
“AllowUsers”的后面可以跟著任意的數(shù)量的用戶名的匹配串(patterns)或user@host這樣
的匹配串,這些字符串用空格隔開。主機(jī)名可以是DNS名或IP地址。(e129)