没有静态 IP+只能密码登录 SSH 的服务器怎么做好安全防护? SSH 104 位随机密码还需要配置 fail2ban 吗?客户买了一套 08 年后就没人维护的系统,设备间通过公网 IP+ SSH 通信,只能用密码登录,没源码改不了。

2023-02-11 21:12:19 +08:00
 edis0n0
3733 次点击
所在节点    信息安全
32 条回复
heliushao88
2023-02-11 21:39:47 +08:00
将 PubkeyAuthentication yes 前边的#去掉。这样证书登录就开启了。 证书登录
edis0n0
2023-02-11 21:42:23 +08:00
大概测试了下每个设备都是 SSH 连上服务器后访问服务器上的 127.0.0.1:8000 和服务端通信,也就是说每个用户只要有访问 127.0.0.1 地址的权限就行,目前已经限制只有给这些设备分配的用户能通过密码登录,不知道还有什么可以做的
edis0n0
2023-02-11 21:43:16 +08:00
@heliushao88 #1 用证书登录客户端就连不上服务器了,客户端程序只支持密码登录,开发这程序的公司已经倒闭了要不到代码
edis0n0
2023-02-11 21:45:13 +08:00
感觉 SSH 在这里相当于 TLS 的角色,那时候可能 TLS 没普及他们懒得自己实现加密
yaott2020
2023-02-11 21:45:35 +08:00
觉得不安全就配 fail2ban ,说实话这种有些年代的软件可以换了,不仅不安全,出问题还没什么办法
jim9606
2023-02-11 21:53:14 +08:00
因为估计这个系统的 ssh 服务器 /客户端组件可能都无法更新,建议考虑 VPN 专网保护,要先接通 vpn 再用客户端 ssh 连接。
rekulas
2023-02-11 21:55:04 +08:00
感觉还可以把服务器端口转发到另一台网关,让他们将网关当服务器去通信,就算出现安全问题也不影响服务器本身
littlewing
2023-02-11 22:05:06 +08:00
6 楼通过 VPN 打通内网后在内网访问的方法好,然后在机器上配置一下防火墙
salmon5
2023-02-11 22:28:45 +08:00
22 端口修改成 5 位大端口即可,密码 20-30 位随机密码足够了
mikewang
2023-02-11 22:32:09 +08:00
可以试试端口敲门( Port knocking )。防火墙默认禁止访问 ssh 端口,当客户 IP 向特定端口“敲门”后,防火墙对该 IP 放行。

https://linux.die.net/man/1/knockd
https://github.com/jvinet/knock
Owenjia
2023-02-11 23:25:13 +08:00
登录后是怎么通过什么方式访问的呢?只在服务端做更改的话能想到的有:
1. 如果可以的话禁掉 shell 登录只开 tcpforwarding ,或者 sshd 里 match 用户然后强制指定一个运行在 bwarp 里的受限 shell ,根据客户端行为配置规则;
2. iptables 的 filter->output 可以默认 drop 然后用 owner 模块控制登录用户可访问的网络地址;访问时间固定的话可以用 time 模块做限制;一段时间内同时存在的 ssh 链接数目可以做限制; fail2ban 加定期人工审计日志。
另外可以在服务器端保持更新、减少不必要服务运行也可以起到一个减少攻击面的作用。
billytom
2023-02-11 23:58:15 +08:00
其实,把端口改成 5 位的高位随机口,然后密码用 1password 那种带大小写和符号的,28 位。然后禁掉 root 登陆,改用户登陆后 su 。。。基本上不存在暴力破解可能的
laqow
2023-02-12 00:22:44 +08:00
虚拟机或 docker 里面建用户,host 的服务端口映射到虚拟机 127.0.0.1:8000 里面
iseki
2023-02-12 04:14:08 +08:00
老旧系统建议 VPN 隔离
bao3
2023-02-12 07:02:51 +08:00
你需要先看一下 openssh 在 08 年后的安全更新,没有没涉及你现在的 ssh 应用。改端口没有任何意义,因为扫描端口也就 1 分钟的事,改再大也只是 1 分钟后赤裸相见。反而是 openssh 的安全更新,涉及到加密调整,可能容易被获取权限。

上面朋友提到 vpn ,这是个好主意,而且要用较新式的 vpn ,比如 ike v2 之类的。
ax2009live
2023-02-12 07:16:15 +08:00
指定 DDNS 的域名访问 SSH 不就可以了吗?可以减少 99.99%的风险;
比如家里的动态域名为 home1.domail.com home2.domain.com 如果有多个,可以自行增加;
服务器建立文件 ipupdate 并赋予执行权限,crontab -e 定期执行这个文件,比如十分钟执行这个文件
ipupdate

#!/bin/sh
home1_ip=`ping home1.domain.com -c 1 | sed '1{s/[^(]*(//;s/).*//;q}'`
home2_ip=`ping home2.domain.com -c 1 | sed '1{s/[^(]*(//;s/).*//;q}'`

new_ip=$home1_ip,$home2_ip
port1=22

cd `dirname $0`
if [ -e './home1_ip.txt' ]; then
home1old_ip=`tail ./home1_ip.txt -n 1`
home2old_ip=`tail ./home2_ip.txt -n 1`

if [ "$home1old_ip" != "$home1_ip" ]||[\
"$home2old_ip" != "$home2_ip" ] ; then

old_ip=$home1old_ip,$home2old_ip

`/sbin/iptables -D INPUT -p tcp -m multiport --dport $port1 -s $old_ip -j ACCEPT`

`/sbin/iptables -I INPUT -p tcp -m multiport --dport $port1 -s $new_ip -j ACCEPT`

echo $home1_ip > ./home1_ip.txt
echo $home2_ip > ./home2_ip.txt
fi
else

`/sbin/iptables -I INPUT -p tcp -m multiport --dport $port1 -s $new_ip -j ACCEPT`

echo $home1_ip > ./home1_ip.txt
echo $home2_ip > ./home2_ip.txt
fi

每十分钟检查动态域名是否有变化,如有变化,更新放行端口;
为了避免服务器重启不放行端口,启动的时候把 ipupdate 同一目录下的 txt 全部删掉,运行 ipupdate 会重新建立;
JingKeWu
2023-02-12 07:31:25 +08:00
ax2009live
2023-02-12 07:36:10 +08:00
uncat
2023-02-12 10:55:56 +08:00
无论是 VPN 还是 Knock, 都离不开客户端改造.

你的思路是对的, 服务端配置 fail2ban, 限定一天里面允许 failed 的次数是 5, 然后默认屏蔽超过这个次数的 IP 24 小时即可. 注意一下自己使用的软件防火墙是什么, 调整一下 fail2ban 配置使其兼容即可.
xuanbg
2023-02-12 10:59:50 +08:00
家宽也可以白名单,只不过要经常上服务器去改白名单

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/915244

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX