前景

最近在学习linux中,学到了ssh的部分内容,于是便准备在阿里云中去实际操作一把

环境

  • 阿里云学生服务器
  • ubuntu(client)->centos(server)

ssh介绍

—-维基百科
  Secure Shell(安全外壳协议,简称SSH)是一种加密的网络传输协议,可在不安全的网络中为网络服务提供安全的传输环境[1]。SSH通过在网络中创建安全隧道来实现SSH客户端与服务器之间的连接[2]。虽然任何网络服务都可以通过SSH实现安全传输,SSH最常见的用途是远程登录系统,人们通常利用SSH来传输命令行界面和远程执行命令
  我们可以看到,ssh是一个网络传输协议,用来加密数据传输的,由于是传输层的协议,所以是基于TCP的安全连接,大致有两个阶段,一个是会话阶段,一个是验证用户阶段

会话阶段

初次学习,着重于使用方法,理解基本的理论。由于是基于TCP会话的,所以必定有一个建立会话的过程,在建立会话的时候,双方使用的是对称密钥算法,(对称密钥,加密密钥和解密密钥能相互推到出来),是基于会话然后随机生成的,一方用于加密信息的密钥等同于另一方用于解密信息的密钥,而任何第三方由于不持有该密钥,会话密钥的传递的时候,会用各自的公钥和私钥进行会话密钥的加密。(此处省略会话密钥交互的详细过程)

验证用户阶段

验证用户阶段可以说是所有Linux系统都会用到的一个东西,ssh的验证是非对称密钥,有好几种算法,默认的是RSA,学过一些密码学的基础知识的,应该明白RSA是基于大素数分解的,安全性蛮高的,通过指纹锁定服务器,防止他人冒充服务器(中间人攻击),以及各种加密

基本流程
  1. 客户端发送自己的密钥ID给服务器端
  2. 服务器在自己的authorized_keys文件中检查是否有此ID的公钥
  3. 如果有,则服务器生成一个随机数,用该公钥加密之
  4. 服务器将加密后的随机数发给客户端
  5. 客户端用私钥解密该随机数,然后在本地为随机数做MD5哈希
  6. 客户端将该MD5哈希发给服务器端
  7. 服务器端为一开始自己生成的随机数也做一个MD5哈希,然后用通讯通道“公共的密钥”将该哈希加密,再跟客户端发来的内容进行对比。如果双方内容一致,则通过验证,开放访问权限给客户端

实际操作

用最简单的密码验证

客户端:

ssh root@ip地址

输入你的服务器账号和密码就能验证通过了。这种验证的弊端就是,太简单了。在执行了这个步骤之后,会生成一种指纹信息,标识着服务器的各种信息,代表了服务器的唯一性,用的是ecdsa加上各种信息或者算法,生成的唯一标识,在client客户端上~/.ssh/目录中生成konwn_hosts文件,这个信息,是服务器用密钥生成的,如果在服务器中误删了密钥,那么客户端指纹会失效,需要重新生成

root@dream-Lenovo-Y430P:~/.ssh# cat known_hosts 
|1|+9/Eie9DShbIxH2qiTEoOPZrBr4=|2h7R37rZqTi31ks88o1e1ZN5lBg= ecdsa-sha2-nistp256 AAAAE2VjZHNhLXNoYTItbmlzdHAyNTYAAAAIbmlzdHAyNTYAAABBBIZxW1J03RwpVShWgUirLzT3YfI。。。。

服务器:/etc/ssh目录下,pub为公钥,没有后缀的为私钥

[root@izwz9gxqscz1wuxvr9ntffz ssh]# ls
moduli            ssh_host_dsa_key.pub    ssh_host_ed25519_key.pub
ssh_config        ssh_host_ecdsa_key      ssh_host_rsa_key
sshd_config       ssh_host_ecdsa_key.pub  ssh_host_rsa_key.pub
ssh_host_dsa_key  ssh_host_ed25519_key

免密登录

免密登录,在客户端上生成密钥对,将自己的公钥发送给服务器,自己保留私钥和公钥
客户端:
第一步:生成密钥,并选择密钥生成的路径,(我放在/root/.ssh下了)和passphrase(验证短语)

ssh-keygen

查看生成的公钥和私钥文件:

root@dream-Lenovo-Y430P:~/.ssh# ls
id_rsa  id_rsa.pub  known_hosts

第二步:向服务器发送自己的公钥文件(这是最好用最方便的方法)

ssh-copy-id -i 公钥文件 root@服务器ip

验证:
客户端的公钥

root@dream-Lenovo-Y430P:~/.ssh# cat id_rsa.pub 
ssh-rsa AAAAB3NzaC1yc2EAAAADAQABAAABAQDm5B77DEbpseLBgAVzbipWjj3gNkujx9UN27AxmqMUQPT9K1ef49HLwJ+NLckXoKd03DDiV7p90SzMCzWhKtwrG1ooTIT0dadHrN+mbaSyeaIxg2kf50hn78zkBw8eGl6BY6IN0dl6KiH/QKg4OsVu2ZLQXQBQoaTzDp3FWqK+Ak93piN9jfNIK5aYnci1rSS744+Nozqy。。。

服务器端接受到的认证钥匙

[root@izwz9gxqscz1wuxvr9ntffz .ssh]# cat authorized_keys 
ssh-rsa AAAAB3NzaC1yc2EAAAADAQABAAABAQDm5B77DEbpseLBgAVzbipWjj3gNkujx9UN27AxmqMUQPT9K1ef49HLwJ+NLckXoKd03DDiV7p90SzMCzWhKtwrG1ooTIT0dadHrN+mbaSyeaIxg2kf50hn78zkBw8eGl6BY6IN0dl6KiH/QKg4OsVu2ZLQXQBQoaTzDp3FWqK+Ak93piN9jfNIK5aYnci1rSS744+Nozqy。。。

不难看出,两个文件内容是一样的

第三步:将自己的私钥加入ssh-agent,ssh代理,它会帮你自动输入密码短语passphrase,不然以后每次都要输入密码短语,这是一个坑!不然每次输密码,不是很懵逼吗- -

# 加入代理,输入你的密码短语
ssh-add ~/.ssh/id_rsa
# 查看ssh代理的内容
ssh-add -l
root@dream-Lenovo-Y430P:~/.ssh# ssh-add -l
2048 SHA256:3yXL6vFulXKpwOWmvIP9Oxr+QFM2fuKUwbVet9PuXs4 /root/.ssh/id_rsa (RSA)

提供一个详细操作链(https://www.linuxidc.com/Linux/2017-02/140642.htm)

最后结果:
这里写图片描述

总结

这次主要简单的学习了ssh的基本原理,会话阶段和认证阶段,实际操作了一下,免密登录的过程,免密登录主要适合多个服务器登录,不需要一个一个地记密码什么的,挺方便的,安全性也得到了提高。自己对这个密钥交换的过程还是蛮懵逼的,只是了解了一些,达到了会使用的基本水平。

Logo

更多推荐