SSH
SSH(Secure Shell)是一种加密的网络传输协议,可以在不安全的网络中为网络服务提供安全的传输环境。其最常见的用途是远程登陆系统。
历史
最初 Linux 的远程登陆以及文件传输依赖于 rlogin、rsh 等协议,他们采用明文传输使用一个简单的密码来确认,这就非常容易遭到监听、嗅探和中间人攻击。而 1995 年还是大学生的塔图发现自己学校存在嗅探密码的网络工具,于是编写了第一版的 SSH 来保护信息传输。最初它是以免费软件的形式发布并逐渐流行起来,而后塔图创立了 SSH 通信安全公司来继续开发和销售 SSH。
OpenSSH
1999 年,开源界希望使用自由版本的 SSH,于是重新使用较久的但是采用开源许可的最后一个版本为蓝图开发了 OSSH,不久之后 OpenBSD 的开发者又在 OSSH 版本的基础上进行了大量的修改形成了 OpenSSH,这也是目前最流行的 SSH 实现。
OpenSSH 是一个标准 C/S 架构软件,其中包含 sshd 守护进程即服务器端,它提供了一下用户空间工具:
- ssh:是一个远程登录程序(SSH 客户端)
- sshd:是一个 OpenSSH SSH 守护进程
scp
:是一个安全的远程文件复制程序- sftp:是一个安全的文件传输程序
ssh-agent
:是用于缓存私钥的身份验证代理ssh-add
:为 ssh-agent 添加私钥身份- ssh-keygen:生成、管理并转换 ssh 验证密钥
ssh-copy-id
:是一个在远程 SSH 服务器的authorized_keys
文件中添加本地公钥的脚本ssh-keyscan
:收集 SSH 公共主机密钥
一个完整的部署流程
SSH 是标准的 C/S 程序,需要部署 SSH 服务器和 SSH 客户端来进行通信。
安装并启动 SSH 服务器
配置密钥登陆
SSH 默认采用密码登陆,这种方式有很多缺点,简单的密码并不安全,复杂的密码难以记忆且每次都需要输入。而密钥登陆是比密码登陆更好的解决方案。要实现密钥登陆通常有以下步骤:
- 使用
ssh-keygen
来生成密钥, 注意这里说的密钥是客户端密钥跟服务器的密钥不是一个 - 使用
ssh-copy-id
来将公钥部署到服务器上,当然手动部署也可以 - 之后通常可以
PasswordAuthentication no
来禁止密码登录
生成客户端密钥
大部分开发版都内置了 SSH 客户端,如果服务器允许密码登陆此时持有密码就可以直接登陆服务器了:
而大部分时候我们都应该使用密钥登陆,而第一步就是生成客户端密钥:
当然你可以备份密钥,而不是必须在每台新的机器上都创建一次密钥。
部署密钥
生成密钥之后,公钥必须上传到服务器才能实现密钥登陆。OpenSSH 中规定的用户公钥必须保存在服务器的 ~/.ssh/authorized_keys
文件中。
OpenSSH 实际上提供了一条命令来完成这个操作 ssh-copy-id -i pub_key_file username@ip
这样的形式来直接部署公钥到 ip 所指向的服务器的 username 用户中。注意 windows 中默认的 OpenSSH 并没有提供这个工具,所以通常需要手动处理。
而有时候我们想要对同一个 ssh 服务器使用多个密钥来实现登陆还可以部署多密钥
更改 SSH 服务器配置
# 只允许某个用户登陆,如果用户多可以设置 AllowGroups 来设置用户组
AllowUsers ygd
# 禁止root用户登陆
PermitRootLogin no
# 禁止密码登陆,只能使用密钥登陆
PasswordAuthentication no
# 设置心跳来避免超时断连,这个主要根据自己的需求来
ClientAliveInterval 60
ClientAliveCountMax 3
之后执行sudo systemctl restart ssh
重启服务器即可。
注意上面禁止了密钥登陆,所以必须在部署密钥之后才能够更改服务器配置。
客户端设置
编辑~/.ssh/config
并添加:
之后就可以实现直接使用ssh centos
来登陆服务器192.168.1.84
了,由于配置了密钥甚至也不用输入密码。