SSH协议
概述
ssh协议, 安全壳协议, 可以安全远程登录Linux主机, 专为远程登录会话和其他网络服务提供安全性的协议. openssh是ssh协议的开源免费实现
-
ssh协议客户端和服务端
- ssh协议包括客户端和服务端
- 客户端需要安装
openssh-clients
, 才能使用ssh
命令登陆到其他主机, 客户端配置文件为/etc/ssh/sshd_config
; - 服务端需要安装
openssh-server
, Linux安装后会默认安装该软件, 并且开启sshd
服务, 服务端配置文件为/etc/ssh/ssh_config
-
加密算法
- 对称加密算法: 加密和解密的密钥是同一个
- 非对称加密算法: 公钥用于加密, 私钥用于解密, 常用算法RSA
远程登陆示例
通过ssh web02
命令切换到另一台服务器到底做了什么操作呢?
首先查看/etc/ssh
目录, 如下
sshd_config
ssh_host_dsa_key.pub
ssh_host_key.pub
ssh_host_rsa_key.pub
ssh_config
ssh_host_dsa_key
ssh_host_key
ssh_host_rsa_key
openssh默认加密算法是使用RSA非对称加密算法, 安装sshd服务后, 会在etc/ssh
目录下生成ssh_host_rsa_key.pub
公钥和ssh_host_rsa_key
私钥, 公钥用于加密, 私钥用于解密
当执行ssh web02
命令, 到底发生了什么?
使用web01和web02两台机器测试下
- web01对应ip为192.168.5.131(充当客户端)
- web02对应ip为192.168.5.132(充当服务端)
[root@web01 .ssh]# ssh web02
The authenticity of host 'web02 (192.168.5.132)' can't be established.
RSA key fingerprint is 46:f0:2a:ce:81:72:ad:84:8f:69:e0:c5:7b:e0:bd:79.
Are you sure you want to continue connecting (yes/no)?
如果选择yes, 则会把web02的公钥(ssh_host_rsa_key.pub
)追加到web01的/root/.ssh/known_host
文件下, 然后输入密码, 就可以登录到web02上, known_host会追加上如下内容
web02,192.168.5.132 ssh-rsa AAAAB3NzaC1yc2EAAAABIwAAAQEAtTM1HQVXDDeMABX1rtgx3AwKAIcfX/eGN4eFj3XjARyVcEqTXdjc+4/Gqdv9QTHdFsIeFrVHeyjuPLuoLAZZ1cBUmoUVp7dYdkUnX0of1CTOTO2+g1K2T4nCshh7uzL2euHAWmQ9VcXwrBeKAiO7rOuW3fiQ5kUAtLVTTow8Ewus3U7Tqim0dkc+1Fc6FXowsSTqxMEsJDJ52pZV6wjoZHkoQVETolf160CJgWelDmMiJ6sDrYSaxnD7XK7Wx4IjUkTp9OJ2jBWlOfRkdRgyIT1CBol24/JqlVI6EAxTCKemap+piCKtD7QPIPmTG5PhlHAg6pQYgTWzqJypSuA9ww==
当输入yes时, web01会保存web02的公钥, 然后使用保存的web02公钥去加密对称加密密钥, 然后web02使用非对称加密密钥解密对称加密密钥, 获取出用于对称加密的密钥, 然后web01就可以通过对称加密的密钥去加密信息, web02使用该密钥解密传输信息, 包括用户名和密码, 从而进行验证登陆, 包括后续操作, 都是使用对称加密的密钥进行操作
为什么要不使用对称加密?
- 对称加密算法首先是客户端和服务端都要知道该密钥, 如果明文传输被截获, 将会非常危险, 所以需要使用非对称加密算法去加密该密钥
为什么不都使用非对称加密算法,
- 非对称加密非常耗费资源
使用密钥对远程登录
如何不用输入密码, 直接使用ssh web02
登录呢? 可以通过密钥对的方式实现
- 首先使用
ssh-keygen
生成认证公钥和私钥
[root@web01 .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:
aa:50:bf:f1:29:bc:3e:82:f6:a8:50:27:72:e0:7d:9c root@web01
The key's randomart image is:
+--[ RSA 2048]----+
| |
| |
|. |
|... . . |
|..+.oE S |
| + +.. . |
|. .. .+ |
|. oo..++ . |
|.o..oo++o |
+-----------------+
查看/root/.ssh/
目录, 会生成出公钥id_rsa.pub
和私钥id_rsa
-rw-------. 1 root root 1675 1月 21 06:48 id_rsa
-rw-r--r--. 1 root root 392 1月 21 06:48 id_rsa.pub
-rw-r--r--. 1 root root 401 1月 21 06:05 known_hosts
- 执行命令
ssh-copy-id uar@web02
将web01 root生成的id_rsa.pub
公钥内容追加到web02:/home/uar/.ssh/authorized_keys
文件中, 查看该文件
ssh-rsa AAAAB3NzaC1yc2EAAAABIwAAAQEAwbY6ICbevXjm1m5yQCVn6z5DPHx9+Wq2CJOk0lxHC5iRdn9YpNE9D27MLyK5Cf9FHv2hLxvYKwmB+9qrZvhw0I6+QeLyYtPG98LvsbKYY9JbFC72NlE4UMYiDGVj5/PMtHosViSCfAiTf3OH07Rg91o4+qFVrs8UKgOwtNUwQMCHkAdLJz6UibPvvv3oPKjVbo0qeUOfsmZ2TOIcbJdWBlighet3yP8gjylhKfgdPVcHo4dY7WoVAZ+3qGZjmXvp4oIoEpMAPNr8ksu7yxeYyjmREzxpSdACmFDC6h5U8DtjksZaC1uICGQdPtu48pQvoDY6uT3XkkDdco/KYBza+Q== root@web01
当执行
ssh uar@web02
时, web02会用web02:/home/uar/.ssh/authorized_keys
文件中保存的web01的公钥去加密一个随机数, 传递给web01, 然后web01使用私钥解密, 再传递给web02, web02比对相同, 就确定客户端可靠, 就可以建立连接不使用ssh-copy-id如何实现?
首先将id_rsa.pub
复制到web02:/root目录中
[root@web01 .ssh]# ls
authorized_keys id_rsa id_rsa.pub known_hosts
[root@web01 .ssh]# scp id_rsa.pub web02:/root/id_rsa_web01
root@web02's password:
id_rsa.pub 100% 392 0.4KB/s 00:00
使用密码登陆到web02上
[root@web01 .ssh]# ssh web02
root@web02's password:
Last login: Sun Jan 21 06:46:45 2018 from web01
将id_rsa_web01 文件追加 /home/uar/.ssh/authorized_keys
[root@web02 ~]# ls
1.php anaconda-ks.cfg id_rsa_web01 install.log install.log.syslog
[root@web02 ~]# mkdir /home/uar/.ssh
mkdir: 无法创建目录"/home/uar/.ssh": 文件已存在
[root@web02 ~]# cat id_rsa_web01 >> /home/uar/.ssh/authorized_keys
[root@web02 ~]# exit
logout
Connection to web02 closed.
就可以直接使用该命令切换到uar@web02
[root@web01 .ssh]# ssh uar@web02
Last login: Sun Jan 21 07:13:30 2018 from web01
将id_rsa_web01追加到其他用户家目录下.ssh/authorized_keys文件中, 就可以在web01上直接通过ssh命令登陆到web02上, 无需输入密码.
windows环境中使用xshell, 也可以生成密钥对 然后将公钥传到主机上, 就可以直接使用私钥进行登录, 如下
打开xshell, 菜单 > 工具 > 新建密钥生成向导, 一路下一步, 然后将公钥保存到文件, 将公钥传到主机上, 使用cat id_rsa_2048.pub.window >> ./.ssh/authorized_keys
将公钥追加到authorized_keys文件中, xshell新建连接, 用户登录验证, 选择Public key
, 用户密钥, 选择刚才生成的密私钥, 保存后, 就可以不使用密码进行登录