如果想安全传输数据,最好就是加密,ecure Shell(SSH),可以登录远程服务器。
SSH的原理
SSH加解密是通过公钥和私钥进行的,一般公钥用来加密,私钥用来解密。
整个过程:
服务器收到用户的登录请求,把自己的公钥发给用户,用户用公钥加密用户名和密码,然后发给服务器,服务器用自己的私钥进行解密,如果和设置的密码相同则登录成功 ,这个过程也有一定的风险,如果有坏人假装自己是服务器,弄个假的公钥发给用户。但是用户不知道,还是用假的公钥加密用户名和密码,最终假服务器就得到用户名和密码。
所以,为了应对风险,SSH协议使用2种方式:
基于口令方式验证
基于密钥方式验证
口令登录
当用户尝试登录服务器时,服务器会用MD5算法把公钥变成128位的指纹,把这个指纹显示给用户,一般这个指纹会放到服务器控制台上。
用户需要人工比对,如果正确,再继续输入密码。第一次服务器会保存此次成功连接的主机信息,其实用户电脑上也会保存服务器信息。下次登录直接让用户输入密码,不再比对指纹信息。
公钥登录
因为口令登录每次都要输入密码,所以有公钥登录,不用每次输入密码。公钥登录,就是用户把自己的公钥放到服务器上,在用户登录时,服务器会向用户发一段随机字符串,用户用自己的私钥加密后,再发送给服务器。接着,服务器用公钥解密,如果成功,就证明这个用户是可信的,后面再登录就不用输入密码。
上面都是引用别人对SSH的介绍,下面是自己整理的实验
---------------------------------------------------------------------------------------------------------------------------
之前通过远程登入都是使用Telnet,Telnet是明文传输的,不安全。使用了ssh是对其做了加密,而且可以验证身份。远程登入一台主机就可以使用ssh hostname就可以登入远程主机了
[kiosk@foundation0 ~]$ ssh server0
[student@server0 ~]$
要远程登入主机必须得保证可以解析主机名
[kiosk@foundation0 ~]$ host server0
server0.example.com has address 172.25.0.11
ssh登入远程主机还可以使用指定用户名进行登入,如果不指定默认是当前用户。
[kiosk@foundation0 ~]$ ssh student@server0 --以student用户登入到远程主机
Last login: Mon Apr 9 14:03:37 2018 from 172.25.0.250
[student@server0 ~]$
在远程登入到另外一台主机上可以使用w来查看哪些用户登入到本机。
[kiosk@foundation0 ~]$ ssh student@server0
Last failed login: Mon Apr 9 14:11:32 CST 2018 from server0.example.com on ssh:notty
There were 2 failed login attempts since the last successful login.
Last login: Mon Apr 9 14:09:34 2018 from 172.25.0.250
[student@server0 ~]$ w -f
14:16:57 up 14 min, 2 users, load average: 0.30, 0.12, 0.13
USER TTY FROM LOGIN@ IDLE JCPU PCPU WHAT
student pts/0 172.25.0.250 14:16 1.00s 0.16s 0.03s w -f
SSH HOST KEYS(两台主机之间的数据被加密了,同时认证对端的身份)
ssh是通过秘钥实现加密的,采用的是非对称加密算法。
两个key,一个叫做public key,一个叫做private key,这些key在/etc/ssh下面
[student@server0 ~]$ cd /etc/ssh --这个是ssh的配置文件
[student@server0 ssh]$ ll
total 268
-rw-------. 1 root root 242153 Mar 20 2014 moduli
-rw-r--r--. 1 root root 2123 Mar 20 2014 ssh_config
-rw-r--r--. 1 root root 4439 Jul 11 2014 sshd_config
-rw-r-----. 1 root ssh_keys 227 Jul 11 2014 ssh_host_ecdsa_key
-rw-r--r--. 1 root root 162 Jul 11 2014 ssh_host_ecdsa_key.pub
-rw-r-----. 1 root ssh_keys 1675 Jul 11 2014 ssh_host_rsa_key
-rw-r--r--. 1 root root 382 Jul 11 2014 ssh_host_rsa_key.pub
红色的都是key,带了pub是公钥,没有pub的是私钥。这里有两种算法,一种是RSA算法,一种是DSA算法。这里一般采用的是RSA算法。
当使用foundation0----------------------------------->server0是如何实现?
在server0上面两个key,这两个key一个是公钥,一个是私钥,其实也就是一对秘钥。
- 当foundation0去连接server0的时候,当执行ssh server0的时候
(ssh server0 --------------------------------------->)
- 这个时候在student下面将公钥传过来
(public key <----------------------------------------)
(3)将公钥传过来,传到哪了呢?传到了某一个用户的家目录
如果当前用户是root就传到root家目录下面的.ssh下面,会有一个文件叫know_hosts,这个文件其实就是server0的公钥。
下面可以验证
[kiosk@foundation0 ~]$ pwd
/home/kiosk
[kiosk@foundation0 ~]$ cd .ssh/
[kiosk@foundation0 .ssh]$ ls
authorized_keys config id_rsa id_rsa.pub known_hosts
[kiosk@foundation0 .ssh]$ rm -rf known_hosts --将这个文件删除掉
[kiosk@foundation0 .ssh]$ ssh root@server0 --重新ssh
Warning: Permanently added 'server0,172.25.0.11' (ECDSA) to the list of known hosts.
Last login: Mon Apr 9 14:35:14 2018 from 172.25.0.250
[root@server0 ~]# exit
logout
Connection to server0 closed.
[kiosk@foundation0 .ssh]$ ls --在foundation0上面的.ssh目录下面可以看到又产生了这个know_host文件
authorized_keys config id_rsa id_rsa.pub known_hosts
[kiosk@foundation0 .ssh]$ cat known_hosts
server0,172.25.0.11 ecdsa-sha2-nistp256 AAAAE2VjZHNhLXNoYTItbmlzdHAyNTYAAAAIbmlzdHAyNTYAAABBBHX+o9KAnlfw2dE7CsmM4hqfv1udM79a5NWC2BuWlmfKSwfYLptPQMJF8bnqaz0EjDlxCxRu/aito+GphPLzp/k=
这个know_host文件是用来加密的。也就是foundation0得到了server0这个后,它就可以使用私钥来加密,传到server0之后就用公钥解密。
认证对端的身份:
这里有一种情况,如果有一台主机冒充server0,这个时候foundation0登入过去就可以知道是不是server0,现在将server0的公钥将其删除,如下:
[root@server0 ssh]# ls -l
total 268
-rw-------. 1 root root 242153 Mar 20 2014 moduli
-rw-r--r--. 1 root root 2123 Mar 20 2014 ssh_config
-rw-r--r--. 1 root root 4439 Jul 11 2014 sshd_config
-rw-r-----. 1 root ssh_keys 227 Jul 11 2014 ssh_host_ecdsa_key
-rw-r--r--. 1 root root 162 Jul 11 2014 ssh_host_ecdsa_key.pub
-rw-r-----. 1 root ssh_keys 1675 Jul 11 2014 ssh_host_rsa_key
-rw-r--r--. 1 root root 382 Jul 11 2014 ssh_host_rsa_key.pub
[root@server0 ssh]# ls
moduli sshd_config ssh_host_ecdsa_key.pub ssh_host_rsa_key.pub.bak
ssh_config ssh_host_ecdsa_key ssh_host_rsa_key.bak
[root@server0 ssh]# rm -rf ssh_host_* --将server0上面的钥匙全部删除,只留下sshd的配置文件
[root@server0 ssh]# ls
moduli ssh_config sshd_config
[root@server0 ssh]# systemctl restart sshd
[root@server0 ssh]# ls /etc/ssh
moduli sshd_config ssh_host_ecdsa_key.pub ssh_host_rsa_key.pub
ssh_config ssh_host_ecdsa_key ssh_host_rsa_key
[root@server0 ssh]# exit --这个时候退出,再去连接server0,。
logout
Connection to server0 closed.
[kiosk@foundation0 .ssh]$ ssh root@server0
@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
@ 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 a host key has just been changed.
The fingerprint for the ECDSA key sent by the remote host is
c1:d9:82:72:0f:ba:6f:d6:fd:de:1a:ef:92:70:89:3c.
Please contact your system administrator.
Add correct host key in /home/kiosk/.ssh/known_hosts to get rid of this message.
--公钥已经改变了
Offending ECDSA key in /home/kiosk/.ssh/known_hosts:1
--产生了新的公钥,产生的公钥放在/home/kiosk/.ssh下面
Password authentication is disabled to avoid man-in-the-middle attacks.
Keyboard-interactive authentication is disabled to avoid man-in-the-middle attacks.
Last login: Mon Apr 9 16:05:16 2018 from 172.25.0.250
可以看还是可以登入到冒充server0的主机,但是有告警提示,提示公钥已经改变了,但是之后又产生了一个新的公钥。
登入远程主机产生了上面的提示就要小心了,就要注意登入的server0是否是真要登入的server0呢?因为秘钥已经改变了。
(OpenSSH的人都知ssh会把你每个你访问过计算机的公钥(public key)都记录在~/.ssh/known_hosts。当下次访问相同计算机时,OpenSSH会核对公钥。如果公钥不同,OpenSSH会发出警告)
认证:在进行远程管理的时候,有两种方法,一种是基于用户名和密码的,平时在管理的时候需要输入用户名和密码。另外一种是不需要输入用户名和密码。这种是基于秘钥的认证,所以就不需要输入用户名和密码。
基于用户名密码验证:
[kiosk@foundation0 .ssh]$ ssh student@desktop0
Warning: Permanently added 'desktop0,172.25.0.10' (ECDSA) to the list of known hosts.
student@desktop0's password: --这个地方要输入密码
Last login: Mon Apr 9 15:10:35 2018 from 172.25.0.250
基于秘钥的认证:
很简单只需要两条命令,现在要在desktop0上面不需要输入密码远程登入到server0上面。
Desktop0--------------------------------------->Server0
因为我这个环境已经搭建好了,所以我先将Desktop0,Server0,root家目录下面的.ssh目录下面的文件全部删除。
[root@desktop0 ~]# cd .ssh/
[root@desktop0 .ssh]# ls
authorized_keys
[root@desktop0 .ssh]# rm -rf authorized_keys ---在desktop下面将删除
[root@server0 ~]# cd .ssh/ --server0下面也删除了
[root@server0 .ssh]# ls
这个时候再去从desktop0上面去登入server0
[root@desktop0 .ssh]# ssh root@server0
root@server0's password: --这个时候需要密码验证了
现在是desktop0去远程管理server0,秘钥就在desktop0上面产生。
1.产生秘钥
[root@desktop0 .ssh]# ssh-keygen
Generating public/private rsa key pair.
Enter file in which to save the key (/root/.ssh/id_rsa):
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:
c9:ff:47:2a:67:93:5f:d0:c9:9d:9f:28:7f:d5:78:b0 [email protected]
The key's randomart image is:
+--[ RSA 2048]----+
| |
| |
| |
| . . o.+|
| S .B+|
| . E.*|
| .. = o+|
| ..O .o |
| +.=o |
+-----------------+
全部都按回车键,这个时候就在家目录下面.ssh下面产生了一个公钥和一个私钥。上面全部都是按回车键,其实可以私钥可以受密码保护的,但是按下回车键就不受密码保护了,也就是说任何用户都可以使用这个私钥了。
[root@desktop0 .ssh]# ls
id_rsa id_rsa.pub known_hosts
2.将公钥传至服务器,这里的服务器是server0
[root@desktop0 .ssh]# ssh-copy-id -i ~/.ssh/id_rsa.pub root@server0
/usr/bin/ssh-copy-id: INFO: attempting to log in with the new key(s), to filter out any that are already installed
/usr/bin/ssh-copy-id: INFO: 1 key(s) remain to be installed -- if you are prompted now it is to install the new keys
root@server0's password:
Number of key(s) added: 1
Now try logging into the machine, with: "ssh 'root@server0'"
and check to make sure that only the key(s) you wanted were added.
[root@server0 ~]# ls .ssh/ --登入到server0会发现家目录下面的.shh/下面多了一个文件,和之前删除的文件名是一样的,这个就是在desktop0上面将公钥传过去了。
authorized_keys
3.尝试远程登入
[root@desktop0 .ssh]# ssh root@server0
Last login: Mon Apr 9 17:01:18 2018 from desktop0.example.com
[root@server0 ~]#
可以看到登入成功了,不需要输入密码,所以这个方式是基于秘钥的认证。