如何建立一个足够安全的SSH连接?

1 概述

使用SSH连接服务器是一件很平常的事,但是,连接是否足够安全是一个令人担忧的问题。本文从如下几个方面介绍了如何建立一个足够安全的SSH连接:

  • 端口
  • 协议
  • 用户
  • 密码
  • 密钥对
  • ssh-agent

2 端口

第一步就是修改默认端口22,修改/etc/ssh/sshd_config中的Port即可,比如这里修改为1234端口:

Port 1234

在这里插入图片描述

Debian系的系统中直接修改端口就可以了,在RedHat中还需要使用semanage去开启端口:

yum install policycoreutils-python #没有安装的话需要先安装
semanage port -a -t ssh_port_t -p tcp 1234 # 添加端口
semanage port -l | grep ssh # 验证是否添加成功

3 SSH协议

SSH2协议要比SSH1安全,因此建议使用,同样修改配置文件:

Protocol 2 # 如果没有就末尾添加

这样客户端连接的时候就不能使用Protocol 1协议连接:

ssh -1 username@ip

会提示

SSH protocol v.1 is no longer supported

4 超时断开

修改为60s未操作自动断开:

ClientAliveInterval 60 
# 以秒为单位,超过60s未操作自动断开

ClientAliveCountMax 0 
# 如果客户端没有响应则判断一次超时,该参数设置允许超时的次数

5 限制用户

5.1 禁用root用户登录

PermitRootLogin no

当然禁用之前需要先创建好登录的用户,这里假设创建一个叫aa的用户:

useradd aa
passwd aa
vim /etc/sudoers

复制一行root的权限并修改用户名:

在这里插入图片描述

然后输入:wq!强制保存退出。

5.2 指定用户登录

AllowUsers testuser

这样只能通过该用户连接到该服务器,另外,如果出现拒绝登录的问题:

kex_exchange_identification: read: Connection reset by peer

则需要去开启对应允许的ip登录,修改/etc/hosts.allow,添加:

sshd: ALL

5.3 禁用特定用户登录

DenyUser testuser

禁止通过testuser登录。

类似的配置还有AllowGroupsDenyGroups

6 密码

禁用(空)密码登录:

PermitEmptyPasswords no
PasswordAuthentication no

7 日志

LogLevel VERBOSE

默认为INFO,修改为VERBOSE可以得到更加详细的信息。

8 密钥对

8.1 生成密钥对

上面已经设置了不能使用密码登录,那么,换句话说需要使用密钥登录,生成密钥并不难:

ssh-keygen -t rsa 

只需要指定算法即可,默认为3072位,可选4096位。

但是,相比起传统的RSA,在OpenSSH 6.5中引入了另一种叫Ed25519的更加安全的算法,使用椭圆曲线进行加密。Ed25519相比起RSA的优点有:

  • 体积更小:相比起RSA 3072544个字符,Ed25519只有68个字符
  • 更快:生成速度比RSA快,同时签名速度也比RSA
  • 更安全:签名过程不依赖随机数生成器,不依赖哈希函数的防碰撞特性,没有时间通道攻击的问题

生成方式很简单:

ssh-keygen -a 1024 -t ed25519 -f ~/.ssh/ed25519

参数说明如下:

  • -a:指定KDFKey Derivation Function)的轮数
  • -t:指定算法,可选dsaecdsaecdsa-sked25519ed25519-skrsa
  • -f:指定位置

生成之后复制公钥即可:

ssh-copy-id -i ~/.ssh/ed25519.pub user@ip

8.2 私钥密码

比如按上述方式生成密钥对时,会提示输入私钥密码:

在这里插入图片描述

这里的密码会在使用私钥连接的时候提示:

在这里插入图片描述

8.3 配合ssh-add

默认情况下每次使用私钥登录的时候都需要输入私钥的密码,如果不想每次输出,可以使用ssh-add

ssh-add ~/.ssh/test # ~/.ssh/test替换成对应的私钥路径

这样只需要输入一次私钥密码,下一次连接的时候就不需要输入私钥密码连接了。

8.4 使用不同密钥对

假设您有多台服务器:server1server2server3,则可以为不同服务器使用不同的密钥对,而不是使用同一个密钥对:

ssh-keygen -a 1024 -t ed25519 -f ~/.ssh/server1
ssh-keygen -a 1024 -t ed25519 -f ~/.ssh/server2
ssh-keygen -a 1024 -t ed25519 -f ~/.ssh/server3

接着复制公钥到对应的服务器上:

ssh-copy-id user@server1 -i ~/.ssh/server1.pub
ssh-copy-id user@server2 -i ~/.ssh/server2.pub
ssh-copy-id user@server3 -i ~/.ssh/server3.pub

9 ssh-agent

9.1 这是什么?

ssh-agent是一个程序,可以帮助管理私钥。代理能提供如下用途:

  • 自动选择密钥:使用不同密钥连接到不同主机时,需要手动指定密钥(比如上面的使用不同密钥对的例子中,连接到不同服务器时需要加上-i参数),ssh-agent可以自动选择,不需要手动指定
  • 自动输入私钥密码:如果私钥设置了密钥(比如上面的私钥密码例子),但是又需要频繁地使用私钥进行认证时,ssh-agent可以帮助自动输入私钥的密码

9.2 使用

首先启动:

eval `ssh-agent` # 注意是反引号

接着添加私钥:

# 以上面“使用不同的密钥对”为例
ssh-add ~/.ssh/server1
ssh-add ~/.ssh/server1
ssh-add ~/.ssh/server1

这样连接的时候就不需要手动指定-i参数了。

如果私钥指定了密码,会在ssh-add时进行提示输入:

在这里插入图片描述

这样下次使用带密钥的私钥连接时就不需要输入密码了。

10 2FA

Two-Factor Authentication,缩写2FA,意为双重认证双因子认证等等,顾名思义就是进行两步认证的操作,可选的应用有:

  • Google Authenticator
  • Authy
  • Yubico
  • Duo

比如Google Authenticator,安装之后,连接服务器需要进行输入验证码的操作。

具体的话就不演示了,因为笔者需要经常连接,因此这个选项对笔者来说不太实际,想要实现的话具体可以参考这里

11 其他选项

11.1 设置最大错误次数

MaxAuthTries 6

默认为最多允许3次密码错误(需要除2),修改为2则表示如果密码输入错误一次即自动断开。

11.2 主动断开会话

LoginGraceTime 120

LoginGraceTime指定的时间内如果没有连接成功,则自动断开会话,默认单位为秒,可以指定以分钟为单位,比如:

LoginGraceTime 2m

12 最后

修改完配置文件/etc/ssh/ssd_config后,对sshd服务进行重启:

systemctl restart sshd

13 参考

371 声望
643 粉丝
0 条评论
推荐阅读
解决宏碁非凡S3 安装Win11时无法找到驱动器问题
1 问题描述机型:宏碁非凡S3 2022款CPU:i5 1240P安装系统:Win11 专业版问题描述:安装系统时,在选择驱动器界面无法找到驱动器,如下图所示2 解决流程查了一下网上的解决办法,进入BIOS把VMD Controller关闭掉...

xcghvgshjdfghsd阅读 951

工具篇:iTerm与Zsh
iTerm2支持许多的主题配色,可以自己定义,也可以参考网上现成的主题配色。我个人比较喜欢draculatheme配色。支持item,vim,phpstorm , 下方存在主题官网路径,按照教程安装即可。

super白4阅读 4.7k

深入剖析容器网络和 iptables
Docker 能为我们提供很强大和灵活的网络能力,很大程度上要归功于与 iptables 的结合。在使用时,你可能没有太关注到 iptables 的作用,这是因为 Docker 已经帮我们自动完成了相关的配置。

张晋涛3阅读 1.3k

封面图
麒麟操作系统 (kylinos) 从入门到精通 - 常用软件安装 - 第三篇 常用软件安装(windows下的习惯)
本篇内容大部分从应用商店进行安装,部分通过官网下载,少部分通过命令行安装。1.原生应用1.1钉钉1.2飞书1.3 蓝信1.4 腾讯文档1.5 金山文档1.6 搜狗输入法(拼音)1.7 五笔输入法1.8 libreoffice官方也带了WPS,...

码上世界3阅读 7.5k评论 17

封面图
openSSH升级公钥失效Permission denied (publickey)解决方案
背景centos系统升级openSSH后,服务器上无法再拉取代码,报错如下:原因服务器重新安装SSH后公钥改变,需要重新安装ssh-keygen -t rsa -C "邮箱地址"生成公钥,删除gitlab原有公钥,但是git pull依然报错如下:依...

兰俊秋雨1阅读 1.3k

Metasploit实现木马生成、捆绑及免杀
在一次渗透测试的过程中,避免不了使用到社会工程学的方式来诱骗对方运行我们的木马或者点击我们准备好的恶意链接。木马的捆绑在社会工程学中是我们经常使用的手段,而为了躲避杀毒软件的查杀,我们又不得不对木...

白风之下1阅读 9k

麒麟操作系统 (kylinos) 从入门到精通 - 办公环境 - 第十三篇 字体安装与windows字体的利用
正常情况下,系统下的wps或libreoffice用到的字体都已默认安装。但有时候一些ttf字体或者microsoft office下一些字体需要安装。我们可以在安装好office、acrobat之后,将C:\windows\Fonts文件夹中的字体(我是win...

码上世界2阅读 3.9k

封面图
371 声望
643 粉丝
宣传栏