常用的远程联机方式:

  • 文字接口明码:telnet, rsh 等为主,目前非常少用;
  • 文字接口密码: ssh 为主,已经取代上述的 telnet, rsh 等明码方式;
  • 图形接口: Xdmcp, VNC, RDP 等较为常见

SSH(Secure SHell protocol):安全Shell程序协议,基于TCP的应用层协议

原理

非对称加密

主要是透过两把不一样的公钥与私钥 (Public and Private Key) 来进行加密与解密的过程

  • 公钥 (public key):提供给远程主机进行数据加密的行为,也就是说,大家都能取得你的公钥来将数据加密的意思;
  • 私钥 (private key):远程主机使用你的公钥加密的数据,在本地端就能够使用私钥来进行解密。由于私钥是这么的重要, 因此私钥是不能够外流的!只能保护在自己的主机上

每部主机都有自己的密钥(公钥和私钥),且公钥用来加密而私钥用来解密, 其中私钥不可外流。但因为网络联机是双向的,所以,每个人应该都要有对方的公钥。

加密技术众多,存在不同的优缺点,有的指令周期快,但不安全,有的安全但加密解密速度慢。 SSH采用RSA/DSA/DiffieHellman等机制

SSH基本原理

SSH联机过程

经过上图中的第5步,服务器获取了客户端的公钥,客户端拿到了服务器的公钥,因此服务器和客户端的密钥系统(公钥+私钥)不同,因此被称为非对称密钥系统。建立了连接后,数据交互只用公私钥加解密即可:

  • 服务器到客户端:服务器传送数据时,拿用户的公钥加密后送出。客户端接收后,用自己的私钥解密;
  • 客户端到服务器:客户端传送数据时,拿服务器的公钥加密后送出。服务器接收后,用服务器的私钥解密。

SSH服务

服务端提供的公钥与自己的私钥都放置于 /etc/ssh/ssh_host*,对于不同具体加密协议有不同的密钥对

root@LFG1000847446:~# ll /etc/ssh/ssh_host*
-rw------- 1 root root  672 Aug  5  2015 /etc/ssh/ssh_host_dsa_key
-rw-r--r-- 1 root root  601 Aug  5  2015 /etc/ssh/ssh_host_dsa_key.pub
-rw------- 1 root root  227 Aug  5  2015 /etc/ssh/ssh_host_ecdsa_key
-rw-r--r-- 1 root root  173 Aug  5  2015 /etc/ssh/ssh_host_ecdsa_key.pub
-rw------- 1 root root  399 Aug  5  2015 /etc/ssh/ssh_host_ed25519_key
-rw-r--r-- 1 root root   93 Aug  5  2015 /etc/ssh/ssh_host_ed25519_key.pub
-rw------- 1 root root 1675 Aug  5  2015 /etc/ssh/ssh_host_rsa_key
-rw-r--r-- 1 root root  393 Aug  5  2015 /etc/ssh/ssh_host_rsa_key.pub

启动服务和服务端口

root@LFG1000847446:~# /etc/init.d/sshd restart
root@LFG1000847446:~# netstat -tlnp | grep ssh
tcp        0      0 0.0.0.0:22              0.0.0.0:*               LISTEN      44781/sshd
tcp6       0      0 :::22                   :::*                    LISTEN      44781/sshd

SSH服务不光包含ssh protocol的内容,还提供了安全的ssh ftp server服务

当服务器的ssh公钥发生变化,则会出现公钥不匹配的问题,需要手工删除.ssh/known_hosts的对应行(该例是第1行)

[root@www ~]# ssh root@localhost
@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
@    WARNING: REMOTE HOST IDENTIFICATION HAS CHANGED!     @ <==就告诉你可能有问题
@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
IT IS POSSIBLE THAT SOMEONE IS DOING SOMETHING NASTY!
Someone could be eavesdropping on you right now (man-in-the-middle attack)!
It is also possible that the RSA host key has just been changed.
The fingerprint for the RSA key sent by the remote host is
a7:2e:58:51:9f:1b:02:64:56:ea:cb:9c:92:5e:79:f9.
Please contact your system administrator.
Add correct host key in /root/.ssh/known_hosts to get rid of this message.
Offending key in /root/.ssh/known_hosts:1 <==冒号后面接的数字就是有问题数据行号
RSA host key for localhost has changed and you have requested strict checking.
Host key verification failed.

免密码远程登录

既然ssh的数据交互是通过公私钥加解密,因此理论上只要获取对方的公钥后就可以进行数据交换,因此ssh支持免密码远程登录。

默认情况下,客户端的公私钥数据是在连接建立过程中(第4步)随机运算出来的,如果客户端先创建出固定的公私钥数据,然后公钥数据放置到服务器上,服务器就可以根据客户端的公钥数据认为客户端远程登录是合法的,也就不用提供密码。

xic@xic-desktop:~$ ssh-keygen
Generating public/private rsa key pair.
Enter file in which to save the key (/home/xic/.ssh/id_rsa): 
Created directory '/home/xic/.ssh'.
Enter passphrase (empty for no passphrase): 
Enter same passphrase again: 
Your identification has been saved in /home/xic/.ssh/id_rsa.
Your public key has been saved in /home/xic/.ssh/id_rsa.pub.
The key fingerprint is:
SHA256:A9rA5VmAfWQIyhzhV6OikBD1iw6hR049fEdEL4inrE4 xic@xic-desktop
The key's randomart image is:
+---[RSA 2048]----+
|oo+..+=*B        |
|.= B.*oB..       |
|+ O @ B.o .      |
|o* = X o .       |
|+ + = . S        |
| + .     .       |
|  E              |
| o               |
|  .              |
+----[SHA256]-----+

生成的公私钥数据存放在~/.ssh/中,将~/.ssh/id_rsa.pub的内容存放到服务端的~/.ssh/authorized_keys中,执行ssh-add更新ssh agent中的key,即可免密码登录。

xic@xic-desktop:~$ ssh-add
Identity added: /home/xic/.ssh/id_rsa (/home/xic/.ssh/id_rsa)

此时可能会出现

product94:/opt/tools/netconftool_1.4.4 # ssh-add
Could not open a connection to your authentication agent.

此时需要启动ssh-agent

product94:/opt/tools/netconftool_1.4.4 # eval `ssh-agent -s`
Agent pid 36549
product94:/opt/tools/netconftool_1.4.4 # ssh-add
Identity added: /root/.ssh/id_rsa (/root/.ssh/id_rsa)

参考:Could not open a connection to your authentication agent

应用

sftp

安全加密的FTP协议,相当于通过ssh协议登录,然后执行FTP操作:

cd/ls/mkdir/rmdir/pwd/chgrp/chown/rm/lcd/lls/lmkdir/put/get

scp

安全的网络复制工具,shell脚本中经常使用。如果第一次登录且不想交互式输入密码,需要使用另外一个工具:passssh

xic@xic-desktop:~$ sshpass -p "huawei123" scp -r -o StrictHostKeyChecking=no root@100.120.252.146:~/test.txt ~/

git

git支持的两种同步方式:http和ssh,ssh免密码参考isource的配置。

FAQ

配置了public key,却连接不上git仓库,尤其是在动了ssh相关库之后

可能需要重启ssh-agent,参考Could not open a connection to your authentication agent

参考文档