Files
My-Blog/content/Network-ssh.md
2025-11-21 18:49:55 +08:00

196 lines
8.8 KiB
Markdown
Raw Permalink Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
+++
title = "网络艺术:SSH使用指南"
date = 2025-05-02
[taxonomies]
tags = ["Network"]
+++
前言 SSHSecure Shell 的缩写)是一种网络协议,用于加密两台计算机之间的通信,并且支持各种身份验证机制。
<!-- more -->
## 历史
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,李华打算连到上面看看:
```bash
ssh -p 22 root@114.514.114.514
```
随后命令行弹出了密码输入李华输入了初始密码114514,成功登录了进去;现在每次登录只要输入一行命令就可以,大功告成!
## 安全
一段时间后李华的linux知识提高了不少他发现有不少IP在用随机密码不断尝试登录自己的服务器这太危险了
于是,李华查阅了资料,发现有一篇博客[乱七八糟:服务器初始化与安全设置](https://blog.dich.bid/about-server-set/)于是他将openssh-server的端口改成了2333,并开启了fail2ban这下应该安全了
```bash
### 更换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
```
但是服务器依然在被爆破,李华又又研究了以下教程,决定将自己的服务器由密码登录改为密钥登录,这下没有牛马来爆破了!
```bash
#### 执行以下命令生成.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``,并在其中写入以下内容:
```bash
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开头的公钥.
```bash
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.**