什么是 ssh
ssh,又叫 Secure Shell,我的理解主要就是远程登录一台类 Unix(Linux、BSD、MacOS)机器,并通过命令行进行控制。
这个词有的时候会在一些电子产品的破解中,伴随着 root 这个词出现,比如小米路由器、玩客云等。因为这些电子产品运行着 Linux 系统,只要在同一个局域网下,理论上就可以进行“远程控制”,但是厂商显然不大希望消费者进去瞎操作,所以远程登录命令行的功能会关闭或者做一些隐藏,那就需要想办法把这个功能再开起来,通常也伴随着各类权限的处理。
当然这个部分就不在这篇文档的范畴之内了。
对于正常的远程服务器,ssh 服务肯定是开启的,主流 Linux 分发版本也都自带了这个功能,所以基本上不用考虑安装的问题。
ssh 客户端使用
基础连接
通常你的手上有一台 Windows、Linux 或 Mac 电脑,当你想要连接、控制一台远程计算机,首先你需要知道:
- 远程登录的用户名是什么?用户密码是什么?
- 远程计算机的地址是什么?可以是域名、局域网 IP 或者公网 IP
- ssh 服务开启的端口是什么?
每个系统都有自己的 ssh 客户端,用于连接 ssh 服务器(也就是你需要控制的远程计算机),例如 Windows 上的 PuTTY,Mac 命令行、Linux 命令行,搜索 Android 和苹果的应用市场,也会发现移动端的 ssh 客户端工具。
这里仅针对命令行说明:
ssh 用户名@地址 -p 端口
# 然后你需要输入密码并回车,这里密码不会出现在命令行中
# ...此处是各类远程操作
# 退出远程控制
exit
快捷登录
如果你觉得输入这么多信息太麻烦了,那么可以为某个远程计算机设置“别名”,从而可以快捷登录。这一条主要针对 Mac、Linux 客户端的命令行。
vi ~/.ssh/known_hosts
在文件中为远程计算机设置
Host 别名
Hostname 远程计算机的地址(IP 或域名)
User 远程计算机的用户
Port 端口
如果有多个远程计算机,当然也可以设置多条,这样下次使用 ssh 时,就可以直接
ssh 别名
# 然后输入密码
免密码登录
这个需要配合远程计算机来实现,基本思路是:
- 生成本地机器的密钥
- 将公钥部分,添加到远程计算机的“授信名单”中
# 生成密钥
ssh-keygen
# 把公钥复制出来,添加到远程计算机的授信名单中
cat ~/.ssh/id_dsa.pub | ssh 用户名@远程地址 -p 端口 'cat >> ~/.ssh/authorized_keys'
与远程计算机互传文件
这里主要介绍命令行控制。可以通过 scp
指令来完成
scp 源文件 目标地址
# 这里的源文件和目标地址都可以本地或远程的,例如
scp 远程计算机别名:文件路径 本地路径 # 将远程计算机中的文件复制到本地
scp 本地文件路径 远程计算机别名:路径 # 将本地文件复制到远程计算机路径中
# 如果没有设置远程计算机的别名,那么
scp -P 端口 用户名:地址:文件路径 本地路径
scp -P 端口 本地文件路径 用户名:地址:路径
# 复制文件夹,需要使用 -r 选项,例如
scp -r 本地文件夹 远程计算机别名:路径
远程计算机安全保护
如果远程计算机只能在内网中连接,可能还相对安全,但是如果远程计算机处于公网环境中,就很可能被攻击,一旦被不怀好意者成功控制,后果不堪设想,因此,我们需要针对 ssh 做一些安全防护。
使用复杂密码
修改远程计算机用户的密码
passwd 用户名
使用 sshd 自带的服务
主要有两点:
- 修改 ssh 端口,不适用默认的 22 端口,减少暴力破解的概率
- 仅允许“授信名单”中的客户端进行连接
vi /etc/ssh/sshd_config
修改或添加配置
Port 端口名 # 例如 22960
PubkeyAuthentication yes # 允许通过公钥进行认证
PasswordAuthentication no # 不允许使用用户密码登录
保存配置后,要记得重启
sudo systemctl restart sshd
封禁暴力登录行为
安装服务 fail2ban
sudo apt install fail2ban
默认情况下无需额外配置,当然也可以通过 /etc/fail2ban/jail.local
进行配置
[sshd]
# 设置封禁时间,单位秒
bantime = 300
# 设置最大重试次数
maxretry=3