网络艺术:SSH使用指南
前言 SSH(Secure Shell 的缩写)是一种网络协议,用于加密两台计算机之间的通信,并且支持各种身份验证机制。
历史
1995年,芬兰赫尔辛基工业大学的研究员 Tatu Ylönen 设计了 SSH 协议的第一个版本(现称为 SSH 1)
,同时写出了第一个实现(称为 SSH1)。
当时,他所在的大学网络一直发生密码嗅探攻击,他不得不为服务器设计一个更安全的登录方式。写完以后,他就把这个工具公开了,允许其他人免费使用。
SSH 可以替换 rlogin、TELNET、FTP 和 rsh 这些不安全的协议,所以大受欢迎,用户快速增长,1995年底已经发展到五十个国家的20,000个用户。SSH 1 协议也变成 IETF 的标准文档。
1995年12月,由于客服需求越来越大,TatuYlönen就成立了一家公司SCS,专门销售和开发SSH
。这个软件的后续版本,逐渐从免费软件变成了专有的商业软件。
SSH 1 协议存在一些安全漏洞,所以1996年又提出了 SSH 2 协议(或者称为 SSH 2.0)
。这个协议与1.0版不兼容,在1997年进行了标准化,1998年推出了软件实现 SSH2。但是,官方的 SSH2 软件是一个专有软件,不能免费使用,而且 SSH1的有些功能也没有提供。
1999年,OpenBSD 的开发人员决定写一个SSH 2 协议的开源实现
,这就是 OpenSSH 项目。该项目最初是基于 SSH 1.2.12 版本,那是当时 SSH1 最后一个开源版本。但是,OpenSSH 很快就完全摆脱了原始的官方代码,在许多开发者的参与下,按照自己的路线发展。OpenSSH 随 OpenBSD 2.6 版本一起提供,以后又移植到其他操作系统,成为最流行的 SSH 实现。目前,Linux 的所有发行版几乎都自带 OpenSSH。
开始
李华是一个大学生,现在他买了一台服务器,公网IPv4为114.514.114.514,李华打算连到上面看看:
ssh -p 22 root@114.514.114.514
随后命令行弹出了密码输入,李华输入了初始密码114514,成功登录了进去;现在每次登录只要输入一行命令就可以,大功告成!
安全
一段时间后,李华的linux知识提高了不少,他发现有不少IP在用随机密码不断尝试登录自己的服务器!这太危险了!
于是,李华查阅了资料,发现有一篇博客乱七八糟:服务器初始化与安全设置,于是他将openssh-server的端口改成了2333,并开启了fail2ban,这下应该安全了!
### 更换SSH端口
使用root账户或已经有sudo权限的用户登录到系统。
打开SSH配置文件`sshd_config`,可以使用文本编辑器如nano或vi。以下是使用nano编辑器的示例:
sudo vim /etc/ssh/sshd_config
在配置文件中找到以下行:
Port 22
这是SSH默认的端口号,你可以将其更改为你想要的任何未被占用的端口号。例如,将端口更改为2333:
Port 2333
保存并关闭文本编辑器。重新启动SSH服务,以应用更改:
sudo service ssh restart
或者,如果你的系统使用systemd,可以使用以下命令:
sudo systemctl restart ssh
### 安装 Fail2ban
sudo apt-get install fail2ban
#### Debian 12 及以上的版本需要手动安装 rsyslog
sudo apt-get install rsyslog
####启动 Fail2ban 服务
sudo systemctl start fail2ban
#### 开机自启动
sudo systemctl enable fail2ban
#### 查看 Fail2ban 服务状态
sudo systemctl status fail2ban
但是服务器依然在被爆破,李华又又研究了以下教程,决定将自己的服务器由密码登录改为密钥登录,这下没有牛马来爆破了!
#### 执行以下命令生成.pub后缀的公钥和无后缀的密钥:
ssh-keygen
注意不同密钥对名称不能相同;同时可以为这两个文件用密码加密;
#### 随后将.pub后缀的公钥中的内容写入服务器的~/.ssh/authorized_keys中;
#### 使用以下命令编译服务器的SSH配置:
vim /etc/ssh/sshd_config
将其中的该行改为PasswordAuthentication no,保存退出;随后使用
sudo systemctl restart sshd
重启SSH即可禁用密码登录;
#### 将PermitRootLogin一栏改为PermitRootLogin prohibit-password**,即可实现仅root用户密钥登录;
#### 使用以下命令查看输出,
sudo cat /etc/ssh/sshd_config | grep -E 'PasswordAuthentication|PubkeyAuthentication'
如有PasswordAuthentication no → 禁用密码登录以及PubkeyAuthentication yes → 允许密钥登录则成功。
> 注意authorized_keys**的权限为600,如果不是则需要改正:chmod 600 ~/.ssh/authorized_keys
管理
现在服务器安全了,但随着服务器数量的增加,李华很快发现一个新问题,如何管理这些个SSH连接呢?手动输入太慢了,每次都要复制粘贴也很麻烦,但是又不得不用,总不能回退到密码时代吧?况且数量多了,密码也记不住。
于是李华运用软件工程学的思想,想着,这种大众的需求应该有人解决过了吧?果然,李华很快在GitHub上找到了一个开源跨平台的SSH管理软件,electerm!
通过在electerm的书签中写入服务器的地址,登录用户和密钥,只要打开electerm并点击书签就可以连接了,太方便了!
返璞
随着技术阅历的增长,李华看electerm越来越不顺眼:用它管理SSH固然方便,但同时这就得在各个系统上安装一个Electron架构的软件,而且用electerm的shell并不好用,并且备份electerm的配置不能给其他软件使用。终于,在一次界面崩溃之后李华忍无可忍,决定更换新的方案!
通过研究,李华发现原来openssh有自带的管理方法,且非常便捷好用。
首先,李华在用户目录下创建了一个.ssh
文件夹,linux中在/home/username/.ssh
这里,windows下在C:\Users\username\.ssh
这里。
随后,李华安装了openssh在系统上,linux中一般已经存在,windows上在设置-系统-可选功能-添加功能
中选中OpenSSH Client和openssh-server开启即可.
随后,李华在.ssh文件夹下创建了一个文件,名为config
,并在其中写入以下内容:
Host US
HostName 114.514.114.514
User root
IdentityFile ~/.ssh/US
IdentitiesOnly yes
随后李华在对应的位置~/.ssh/US
创建了一个文件,李华将服务器的私钥放了进去,里面是以-----BEGIN OPENSSH PRIVATE KEY-----
开头-----END OPENSSH PRIVATE KEY-----
结尾的私钥。
现在,要登录114.514.114.514
这台服务器,只需要使用ssh US
命令就可以连上服务器了,不用再手动输入了!
归真
在进一步了解SSH之后,李华很快又发现了新的问题,服务器的私钥放在本地是不安全的!尤其是Windows这种安装源松散,鱼龙混杂的系统上。究竟有没有更好的方法呢?在对keepassxc进行研究后,李华终于得出了一个几乎完美的方案!
- 开启keepassxc的SSH代理集成
- 本地.ssh文件夹只保留公钥
- 私钥保存在keepassxc的一个组中
这样一来,当你执行ssh xxx
时,ssh 不是去读私钥文件,而是通过SSH_AUTH_SOCK
环境变量找到 KeePassXC 的 agent。KeePassXC 会提示你解锁数据库/确认使用密钥。私钥不会离开 KeePassXC,只是 KeePassXC 用私钥做一次签名
,把结果返回给 ssh。这样,硬盘上不需要保存私钥文件
,安全性更高,且只需要备份.ssh文件夹和keepassxc的kbdx文件
即可.
那么该怎么做呢?
首先,将.ssh文件夹中的config进行修改,把私钥文件改为公钥文件,同时创建对应的~/.ssh/US.pub
公钥文件,里面是以ssh-ed25519或者ssh-rsa开头的公钥.
Host US
HostName 114.514.114.514
User root
IdentityFile ~/.ssh/US.pub
IdentitiesOnly yes
随后在keepassxc的设置-ssh代理中开启启用SSH代理集成
.(openssh)
接下来在keepassxc中左侧栏新建一个文件夹
,名为SSH,里面新建条目
,标题为US(和config中一致),然后在右侧高级
中新建
附件,文件名为US(和config中保持一致),文件内容为US的私钥.随后在左侧SSH代理中选中在打开或解锁数据库的时候,向代理添加密钥
和数据库锁定或关闭时,从SSH代理中删除密钥
这两个选项,并将下面的私钥
选择附件
,即为我们刚刚在高级中新建的US,可以看到对应的公钥也出现了,上一步没有公钥的可以在这里添加.按确定
后关闭keepassxc并重新开启,这时候就可以使用ssh US
命令登录了!
注意每次登录前先开启keepassxc并解锁!
Done.