SSH(22端口)是Secure Shell Protocol的簡寫,由IETF網絡工做小組(Network Working Group)制定;在進行數據傳輸以前,SSH先對聯機數據包經過加密技術進行加密處理,加密後在進行數據傳輸。確保了傳遞的數據安全。linux
SSH是專爲遠程登陸會話和其餘網絡服務提供的安全性協議。利用SSH協議能夠有效的防止遠程管理過程當中的信息泄露問題,在當前的生產環境運維工做中,絕大多數企業普通採用SSH協議服務來代替傳統的不安全的遠程聯機服務軟件,如telnet(23端口,非加密的)等。面試
telnet(23端口)實現遠程控制管理,可是不對數據進行加密算法
在默認狀態下,SSH服務主要提供兩個服務功能:shell
(1)一個是提供相似telnet遠程聯機服務器的服務,即上面提到的SSH服務;vim
(2)另外一個是相似FTP服務的sftp-server,藉助SSH協議來傳輸數據的,提供更安全的SFTP服務(vsftp.proftp)windows
特別提醒:安全
SSH客戶端(ssh命令)還包含一個頗有用的遠程安全拷貝命令scp,也是經過ssh協議工做的。bash
方法1:telnet 10.0.0.41 22服務器
說明:正確標準的方式退出telnet鏈接,按ctrl+]鍵,切換到telnet命令行,輸入quit命令進行退出網絡
方法2: ss -lntup |grep 22
[root@m01 ~]# ss -lntup |grep 22 tcp LISTEN 0 128 :::22 :::* users:(("sshd",1188,4)) tcp LISTEN 0 128 *:22 *:* users:(("sshd",1188,3)) |
方法3:netstat -lntup
方法4:nmap -p 22 10.0.0.41
方法5: nc 10.0.0.41 22
(1)查看日誌
(2)檢查服務端口有沒有衝突,若是衝突則從新指定一個端口 例:rsync --daemon --port=874
[root@backup ~]# killall rsync rsync: no process killed [root@backup ~]# rsync --daemon --port=874 [root@backup ~]# netstat -lntup |grep rsync tcp 0 0 0.0.0.0:874 0.0.0.0:* LISTEN 1758/rsync tcp 0 0 :::874 :::* LISTEN 1758/rsync |
yum install -y telnet telnet-server
vim /etc/xinetd.d/telnet
修改 disable = no
[root@m01 ~]# vim /etc/xinetd.d/telnet # default: on # description: The telnet server serves telnet sessions; it uses \ # unencrypted username/password pairs for authentication. service telnet { flags = REUSE socket_type = stream wait = no user = root server = /usr/sbin/in.telnetd log_on_failure += USERID disable = no --------表示telnet願意被xinetd管理 } |
/etc/init.d/xinetd start
[root@m01 ~]# /etc/init.d/xinetd start Starting xinetd: [ OK ] [root@m01 ~]# netstat -lntup |grep 23 tcp 0 0 :::23 :::* LISTEN 1708/xinetd 這時候服務名不叫telnet了,叫xineted [root@m01 ~]# telnet 10.0.0.41 Trying 10.0.0.41... Connected to 10.0.0.61. Escape character is '^]'. CentOS release 6.9 (Final) Kernel 2.6.32-696.el6.x86_64 on an x86_64 backup login: wuhuang Password: |
利用wireshark軟件進行抓包
1. 實現確認ssh遠程協議進行數據的加密,telnet遠程協議未對數據進行加密處理
2. 實現觀察tcp三次握手過程和四次揮手過程
(1)telnet是不安全的遠程鏈接,鏈接內容是明文的; ssh是加密的遠程鏈接,鏈接內容是加密的。
(2)SSH服務默認支持root用戶登陸,telnet服務默認不支持root用戶登陸
tcpdump -i eth0 -nn -c 5 "port 53"
-i ------指定抓取哪個網卡上產生數據包流量
--nn ------抓取數據包中端口信息以數字方式顯示
-c -----表示抓取的數據包數量
"port 53" ----- 雙引號裏面表示搜索數據包的條件
-w -----將抓取數據保存到指定文件中
-r -----對保存的數據包文件進行讀取
[root@m01 ~]# tcpdump -i eth0 -nn -c 8 "port 22" tcpdump: verbose output suppressed, use -v or -vv for full protocol decode listening on eth0, link-type EN10MB (Ethernet), capture size 65535 bytes 10:32:52.885672 IP 10.0.0.61.22 > 10.0.0.1.51651: Flags [P.], seq 1975289928:1975290136, ack 3602557944, win 634, length 208 10:32:52.887370 IP 10.0.0.1.51651 > 10.0.0.61.22: Flags [P.], seq 1:65, ack 208, win 256, length 64 10:32:52.891085 IP 10.0.0.61.22 > 10.0.0.1.51651: Flags [P.], seq 208:496, ack 65, win 634, length 288 10:32:52.893261 IP 10.0.0.61.22 > 10.0.0.1.51651: Flags [P.], seq 496:656, ack 65, win 634, length 160 10:32:52.893484 IP 10.0.0.1.51651 > 10.0.0.61.22: Flags [.], ack 656, win 254, length 0 |
u SSH是安全的加密協議,用於遠程鏈接linux服務器。
u SSH默認端口是22,安全協議版本SSHv2,除了2以外還有SSHv1(有漏洞)。
u SSH服務端主要包含兩個服務功能SSH遠程鏈接和SFTP服務。
u Linux SSH客戶端包含ssh遠程鏈接命令,以及遠程拷貝scp命令等。
SSH服務由服務端軟件OpenSSH(openssl)和客戶端(常見的有SSH),SecureCRT,Putty,xshell組成,SSH服務默認使用22端口提供服務,它有兩個不兼容的SSH協議版本,分別是1.x和2.x
[root@m01 ~]# rpm -qf `which ssh` openssh-clients-5.3p1-122.el6.x86_64 [root@m01 ~]# rpm -ql openssh-clients /etc/ssh/ssh_config -----SSH客戶端配置文件 /usr/bin/.ssh.hmac /usr/bin/scp -----遠程複製命令 /usr/bin/sftp ----遠程文件傳輸服務- /usr/bin/slogin ----遠程登陸命令 /usr/bin/ssh ----實時遠程登陸管理主機命令 /usr/bin/ssh-add /usr/bin/ssh-agent /usr/bin/ssh-copy-id ----ssh服務分發公鑰命令 /usr/bin/ssh-keyscan |
實例: [root@m01 ~]# slogin 10.0.0.61 The authenticity of host '10.0.0.61 (10.0.0.61)' can't be established. RSA key fingerprint is 57:3f:64:68:95:4d:99:54:01:33:ab:47:a0:72:da:bf. Are you sure you want to continue connecting (yes/no)? yes Warning: Permanently added '10.0.0.61' (RSA) to the list of known hosts. root@10.0.0.61's password: Last login: Mon Jan 29 08:38:05 2018 from 10.0.0.1 [root@m01 ~]# |
openssh-clients總結(客戶端)
/etc/ssh/ssh_config --- ssh客戶端配置文件
/usr/bin/.ssh.hmac --- ssh服務的算法文件
/usr/bin/scp --- 基於ssh協議,實現遠程拷貝數據命令
/usr/bin/sftp --- 基於ssh協議,實現數據傳輸密命令
/usr/bin/slogin --- 遠程登陸主機鏈接命令
/usr/bin/ssh --- 遠程登陸主機鏈接命令
/usr/bin/ssh-add --- 此參數必須和ssh-agent命令結合使用,將祕鑰信息註冊到ssh-agent代理服務中
/usr/bin/ssh-agent --- 啓動ssh認證代理服務命令
/usr/bin/ssh-copy-id --- 遠程分發公鑰命令(ok)
/usr/bin/ssh-keyscan --- 顯示本地主機上默認的ssh公鑰信息(ok)
[root@m01 ~]# rpm -ql openssh-server /etc/pam.d/ssh-keycat /etc/pam.d/sshd /etc/rc.d/init.d/sshd -----ssh服務啓動腳本文件 /etc/ssh/sshd_config ----ssh服務配置文件 /etc/sysconfig/sshd /usr/libexec/openssh/sftp-server /usr/libexec/openssh/ssh-keycat /usr/sbin/.sshd.hmac /usr/sbin/sshd -----ssh服務進程啓動命令 |
[root@m01 ~]# ps -ef |grep sshd root 1188 1 0 08:36 ? 00:00:00 /usr/sbin/sshd root 1226 1188 0 08:38 ? 00:00:01 sshd: root@pts/0 root 2378 1228 0 18:26 pts/0 00:00:00 grep sshd [root@m01 ~]# /etc/init.d/sshd stop Stopping sshd: [ OK ] [root@m01 ~]# ps -ef |grep sshd root 1226 1 0 08:38 ? 00:00:01 sshd: root@pts/0 root 2396 1228 0 18:27 pts/0 00:00:00 grep sshd [root@m01 ~]# /usr/sbin/sshd [root@m01 ~]# ps -ef |grep sshd root 1226 1 0 08:38 ? 00:00:01 sshd: root@pts/0 root 2398 1 0 18:28 ? 00:00:00 /usr/sbin/sshd root 2400 1228 0 18:28 pts/0 00:00:00 grep sshd |
openssh-server總結(服務端):
/etc/rc.d/init.d/sshd --- ssh服務端啓動腳本命令
/etc/ssh/sshd_config --- ssh服務端配置文件
/usr/sbin/sshd --- 啓動ssh服務進程命令
擴展說明:sshd服務主要的兩個進程
/usr/sbin/sshd --- 此進程對客戶端第一次鏈接ssh服務端有影響
sshd: root@pts/0 --- 一旦ssh鏈接成功,是否能夠始終保持鏈接有次進程決定
代理服務中
/usr/bin/ssh-agent --- 啓動ssh認證代理服務命令
/usr/bin/ssh-copy-id --- 遠程分發公鑰命令
/usr/bin/ssh-keyscan --- 顯示本地主機上默認的ssh公鑰信息
u OpenSSH同時支持SSH1.x和2.x。用SSH 2.x的客戶端程序不能鏈接到SSH 1.x的服務程序上。
u SSH服務端是一個守護進程(daemon),它在後臺運行並響應來自客戶端的鏈接請求。SSH服務端的進程名爲sshd,負責實時監聽遠程SSH客戶端的遠程鏈接請求,並進行處理,通常包括公共密鑰認證,密鑰交換,對稱密鑰加密和非安全鏈接等。這個SSH服務就是咱們前面基礎系統優化中保留開機自啓動的服務之一。
u ssh客戶端包含ssh以及像scp(遠程拷貝),slogin(遠程登陸),sftp(安全FTP文件傳輸)等應用程序。
u ssh的工做機制大體是本地的ssh客戶端先發送一個鏈接請求到遠程的ssh服務端,服務端檢查鏈接的客戶端發送的數據包和IP地址,若是確認合法,就會發送密鑰發回給服務端,自此鏈接創建。
(1)利用了公鑰和私鑰實現數據加密和解密(公鑰:鎖頭 私鑰:鑰匙)
(2)利用公鑰和私鑰實現了認證機制,公鑰能夠在網絡中傳輸,私鑰在本地主機保存
ssh_host_dsa_key
ssh_host_dsa_key.pub
ssh_host_rsa_key
ssh_host_rsa_key.pub
[root@m01 ~]# ssh-keyscan 172.16.1.61 # 172.16.1.61 SSH-2.0-OpenSSH_5.3 172.16.1.61 ssh-rsa AAAAB3NzaC1yc2EAAAABIwAAAQEA9a1gvu8SLfmLdbARr3jhPAl5pofirPmgulYLl2af6xp2W0wevd3+cxmtFUDCLWFWx2u6iifNSvZ1NgQ/cyZn0A3BMfVLReb6kIttPIsJ1N8YMB7mB3kfpu8zo1a94g6imzrMhk/rcerWoRJ7fHumKAheIQ8d3K9kn6iLNbAIpHWY83ndE2ArsDOBEZaYtlQIwCs1k54kA/luxSkjZkuQzWvd+CDIbIyP+Ha/DPVrKl+LH15CZ7iBhSj4eoPxDEQLUPuaQ4IrCM3U+ts8PYw6+8DYCHUoeYxuw4OamstkS669bb197Pzfh8TJewpzHrxBPCxDrhwU+Q/11BA8Q0TCFQ==
|
[root@m01 ~]# ssh-keyscan -t dsa 172.16.1.61 根據IP查看對應主機的公鑰 # 172.16.1.61 SSH-2.0-OpenSSH_5.3 172.16.1.61 ssh-dss AAAAB3NzaC1kc3MAAACBAKSV66UzxqEzt8TKEFcyQtYPMC3y7YeZh7YVsy+E4KaMQAEVzOwcp2b6IXFyMDGNrystP9jfV7cXKC+2S7LkayJnOr8l3NgmzY3eXQs3EqkhgsN7qqv+/NCrDJ3oNChYGCCnq5OdRbHGfXijPYfF41i4xDJaSx8oTLx1rvpxYievAAAAFQCl9Ri/GrPTxMQ0KMefCV2kW0oIdwAAAIA7dvGR8RWPeoTG/xqU5p5ARWZFYMXEf/B7dvYTXg/ULN640LDh20iGVjxK5L4TwIuaJHt5c5LbOZpNuO2+zeMDjaEcwQpEUAQEev/xToPR8DTnVK6rGX65S4+0LwEd+J9A5+khOdKVfTHE+g+pE2Xq9o902SHQ91KXQT2kBJl4yQAAAIBc0DmG6tQCnKrxyiTR4GWCNzhq3P/9nzkendAyPce91uEVyvNa5LtI1xP0db/Ez2ldCpnpC6LWWvUNXqSKu4X8Mol24ATTgEilGFQ8FjpcG8WyzjQarazr5a5cwf/bDagvkD6sUiba/+kolUeD2s2tq9CkVaJEOkrSJaNVFJap4Q== 說明:-t ----指定加密類型(默認爲rsa) |
[root@m01 ~]# ls /etc/ssh moduli sshd_config ssh_host_dsa_key ssh_host_key ssh_host_rsa_key ssh_config sshd_config.bak ssh_host_dsa_key.pub ssh_host_key.pub ssh_host_rsa_key.pub 說明: 1.ssh_host_key就是私鑰(裏面都是亂碼) 2.後面帶.pub的文件就是公鑰(如:ssh_hosts_pub) |
v1版本鑰匙和鎖頭默認不會變化,數據傳輸不安全
v2版本鑰匙和鎖頭會常常變化,數據傳輸更安全
u 在SSH 1.x的聯機過程當中,當Server接受Client端的Private Key後,就再也不針對該次聯機的Key pair進行檢驗。此時如有惡意***針對該聯機的Key pair對插入惡意的程序代碼時,因爲服務端你不會再檢驗聯機的正確性,所以可能會接收該程序代碼,從而形成系統被黑掉的問題。
u 爲了改正這個缺點,SSH version 2 多加了一個確認聯機正確性的Diffie-Hellman機制,在每次數據傳輸中,Server都會以該機制檢查數據的來源是否正確,這樣,能夠避免聯機過程當中被插入惡意程序代碼的問題。也就是說,SSH version 2 是比較安全的。
u 因爲SSH1協議自己存在較大安全問題,所以,建議你們儘可能都用SSH2的聯機模式。而聯機版本的設置則須要在SSH主機端與客戶端均設置好才行。
基於口令的安全驗證的方式就是你們如今一直在用的,只要知道服務器的SSH鏈接帳號和口令(固然也要知道對應服務器的IP及開放的SSH端口,默認爲22),就能夠經過ssh客戶端登陸到這臺遠程主機。此時,聯機過程當中全部傳輸的數據都是加密的。
[root@m01 ~]# ssh -p22 root@10.0.0.7 root@10.0.0.7's password: Last login: Mon Jan 29 08:38:11 2018 from 10.0.0.1 |
u 基於密鑰的安全驗證方式是指,須要依靠密鑰,也就是必須事先創建一對密鑰對,而後把公用密鑰(Public key)放在須要訪問的目標服務器上,另外,還須要把私有密鑰(Private key)放到SSH的客戶端或對應的客戶端服務器上。
私鑰不能在網絡中傳輸-----私鑰能夠解密公鑰
公鑰能夠在網絡中傳輸-----公鑰不能解密私鑰
u 此時,若是要想鏈接到這個帶有公用密鑰的SSH服務器,客戶端SSH軟件或客戶端服務器就會向SSH服務器發出請求,請求用聯機的用戶密鑰進行安全驗證。SSH服務器收到請求以後,會先在該SSH服務器上鍊接的用戶的家目錄下尋找事先放上去的對應用戶的公用密鑰,而後把它和鏈接的SSH客戶端發送過來的公用密鑰進行比較。若是兩個密鑰一致,SSH服務器就用公用密鑰加密「質詢」並把它發送給SSH客戶端。
u SSH客戶端收到「質詢」以後就能夠用本身的私鑰解密,再把它發送給SSH服務器。使用這種方式,須要知道聯機用戶的密鑰文件。與第一種基於口令驗證的方式相比,第二種方式不須要在網絡上傳送口令密碼,因此安全性更高了,這時咱們也要注意保護咱們的密鑰文件,特別是私鑰文件,一旦被***獲取,危險就很大了。
u 基於密鑰的安全認證也有windows客戶端和linux客戶端的區別。在這裏咱們主要介紹的是linux客戶端和linux服務端之間的密鑰認證。
總結:
①. 在管理端建立出祕鑰對(建立兩個信物)
②. 管理端將公鑰(鎖頭)傳輸給被管理端,鎖頭傳輸給被管理端要基於密碼方式認證
③. 管理端向被管理端發出創建鏈接請求
④. 被管理端發出公鑰質詢
⑤. 管理端利用私鑰解密公鑰,進行公鑰質詢響應
⑥. 被管理端接收到質詢響應,確認基於祕鑰認證成功
ssh-keygen -t rsa
[root@m01 ~]# ssh-keygen -t rsa Generating public/private rsa key pair. Enter file in which to save the key (/root/.ssh/id_rsa): ---確認私鑰保存路徑(默認路徑) Created directory '/root/.ssh'. Enter passphrase (empty for no passphrase): ---確認私鑰文件是否設置密碼(設置爲空) Enter same passphrase again: ---確認私鑰文件是否設置密碼(設置爲空) Your identification has been saved in /root/.ssh/id_rsa. ---私鑰保存位置 Your public key has been saved in /root/.ssh/id_rsa.pub. ---公鑰保存位置 The key fingerprint is: 37:a5:23:85:89:5f:62:93:40:d6:9c:3d:04:d0:07:a8 root@m01 The key's randomart image is: +--[ RSA 2048]----+ | .=*o*. | | ..o=++ | | .. B.o.. | | E o = o | | S = | | o o | | | | | | | +-----------------+ 命令說明: 1)建立密鑰對時,要你輸入的密碼,爲進行密鑰對驗證時輸入的密碼(和linux角色登陸的密碼徹底沒有關係); 2)若是咱們要進行的是SSH免密碼鏈接,那麼這裏密碼爲空跳過便可。 3)若是在這裏你輸入了密碼,那麼進行SSH密鑰對匹配鏈接的時候,就須要輸入這個密碼了。(此密碼爲獨立密碼) 4)用戶家目錄下的.ssh隱藏目錄下會生成:id_rsa id_rsa.pub 兩個文件。id_rsa是用戶的私鑰;id_rsa.pub則是公鑰 |
建立完後,會在當前用戶的宿主目錄.ssh/下生成一個公鑰與私鑰
[root@m01 ~]# ls .ssh/ id_rsa id_rsa.pub |
ssh-copy-id -i /root/.ssh/id_rsa.pub root@172.16.1.31
[root@m01 ~]# ssh-copy-id -i /root/.ssh/id_rsa.pub root@172.16.1.31 The authenticity of host '172.16.1.31 (172.16.1.31)' can't be established. RSA key fingerprint is 57:3f:64:68:95:4d:99:54:01:33:ab:47:a0:72:da:bf. Are you sure you want to continue connecting (yes/no)? yes Warning: Permanently added '172.16.1.31' (RSA) to the list of known hosts. root@172.16.1.31's password: 輸入密碼 Now try logging into the machine, with "ssh 'root@172.16.1.31'", and check in:
.ssh/authorized_keys
to make sure we haven't added extra keys that you weren't expecting. 命令說明: -i ---指定要進行分發的公鑰文件 root表示客戶端以什麼樣的身份登陸到服務端 若是ssh端口不是默認的22端口,須要在公鑰文件後面加參數:-p 3600 |
[root@m01 ~]# ssh 172.16.1.31 能夠直接免密登陸 Last login: Mon Jan 29 08:37:44 2018 from 10.0.0.1 [root@nfs01 ~]# exit |
[root@m01 ~]# eval `ssh-agent -s` Agent pid 2602 說明: eval這個命令,至關於執行倆次bash |
[root@m01 ~]# ssh-add Identity added: /root/.ssh/id_rsa (/root/.ssh/id_rsa) |
[root@m01 ~]# ssh -A 172.16.1.31 Last login: Wed Jan 31 17:51:07 2018 from 172.16.1.61 [root@nfs01 ~]# |
注意:
1.註冊憑證不是私鑰信息
2.被管理主機接受到後,會產生憑證信息/tmp/ssh-xxx/agent.12334
修改SSH服務的運行參數,是經過修改配置文件/etc/ssh/sshd.config文件來實現的。
通常來講SSH服務使用默認的配置已經可以很好的工做了,若是對安全要求不高,僅僅提供SSH服務的狀況,能夠不須要修改任何配置。
[root@m01 ~]# vim /etc/ssh/sshd_config # $OpenBSD: sshd_config,v 1.80 2008/07/02 02:24:18 djm Exp $
13 #Port 22 --- 表示修改默認端口號信息,ssh鏈接默認端口22 15 #ListenAddress 0.0.0.0 --- 指定監聽本地主機網卡地址信息 42 #PermitRootLogin yes --- 是否容許root用戶遠程登陸,默認容許,建議禁止root遠程登陸 65 #PermitEmptyPasswords no --- 是否容許空密碼 81 GSSAPIAuthentication yes --- 默認此參數配置信息爲yes,老是要對鏈接進行如下GSSAPI認證 122 UseDNS yes --- 默認此參數配置信息爲yes,要對訪問過來主機信息作dns反向解析(建議設爲no——服務端) |
說明:
1)#號表明註釋,#號後面有空格的表示對數據內容的描述信息,#號後面沒空格的表示參數信息,註釋的 參數信息是默認的參數配置
2)一旦修改了Port,那麼ssh登陸時就須要-p指定端口號,否則會登陸失敗,ssh默認登陸22端口
3)一旦修改了ListenAddress,監聽地址,那麼再也不地址範圍內的全部客戶端將沒法遠程鏈接服務器。
4) GSSAPIAuthentication yes 和 UseDNS yes 設爲no能夠提升鏈接速度
5)修改配置文件後,須要重啓sshd服務才能生效
SSH***網友案例:http://phenixikki.blog.51cto.com/7572938/1546669
1、用密鑰登陸,不用密碼登錄。
2、牤牛陣法:解決SSH安全問題
a.防火牆封閉SSH,指定源IP限制(局域網、信任公網)
b.開啓SSH只監聽本地內網IP(ListenAddress 172.16.1.61)。
3、儘可能不給服務器外網IP
4、最小化(軟件安裝-受權)
5、給系統的重要文件或命令作一個指紋
6. 給他鎖上 chattr +i +a
ss -lntup |grep 22 netstat -lntup |grep 22 lsof -i:22 grep "\b22/\b" /etc/services 有點耍賴,不建議使用 nmap -p 22 10.0.0.41 nc 10.0.0.41 22 |
ss -lntup |grep sshd netstat -lntup |grep sshd |
netstat -lnptu |awk -F "[ :]+" '$4~/^22/{print $4}' netstat -lnptu |awk -F "[ :]+" '!/:::/&& /sshd/{print $5}' netstat -lnptu |awk -F "[ :]+" '/sshd/&& $5!="*"{print $5}' netstat -lnptu |awk -F "[ :]+" '/sshd/{if ($5!="*")print $5}' |