diff --git a/content/Network-ssh.md b/content/Network-ssh.md new file mode 100644 index 0000000..69c3fe7 --- /dev/null +++ b/content/Network-ssh.md @@ -0,0 +1,195 @@ ++++ +title = "网络艺术:SSH使用指南" +date = 2025-05-02 + +[taxonomies] +tags = ["Network"] ++++ + +前言 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在用随机密码不断尝试登录自己的服务器!这太危险了! + +于是,李华查阅了资料,发现有一篇博客[乱七八糟:服务器初始化与安全设置](https://blog.dich.bid/about-server-set/),于是他将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](https://github.com/electerm/electerm)! + +![electerm](/images/electerm.png) + +通过在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.** + + + + + + + + + + diff --git a/static/images/electerm.png b/static/images/electerm.png new file mode 100644 index 0000000..7d92dfb Binary files /dev/null and b/static/images/electerm.png differ