V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
edis0n0
V2EX  ›  信息安全

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

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

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

    上面朋友提到 vpn ,这是个好主意,而且要用较新式的 vpn ,比如 ike v2 之类的。
    ax2009live
        16
    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
        17
    JingKeWu  
       2023-02-12 07:31:25 +08:00
    ax2009live
        18
    ax2009live  
       2023-02-12 07:36:10 +08:00
    uncat
        19
    uncat  
       2023-02-12 10:55:56 +08:00
    无论是 VPN 还是 Knock, 都离不开客户端改造.

    你的思路是对的, 服务端配置 fail2ban, 限定一天里面允许 failed 的次数是 5, 然后默认屏蔽超过这个次数的 IP 24 小时即可. 注意一下自己使用的软件防火墙是什么, 调整一下 fail2ban 配置使其兼容即可.
    xuanbg
        20
    xuanbg  
       2023-02-12 10:59:50 +08:00
    家宽也可以白名单,只不过要经常上服务器去改白名单
    leonshaw
        21
    leonshaw  
       2023-02-12 11:16:35 +08:00
    强密码本身不用担心暴破。密码登录主要问题在服务器能看到明文密码,所以客户端一定要有 host key 校验。fail2ban 可以有,能减少服务器压力,或者让攻击者知难而退。
    wfhtqp
        22
    wfhtqp  
       2023-02-12 11:33:31 +08:00
    headsacle
    zed1018
        23
    zed1018  
       2023-02-12 15:20:17 +08:00
    如果我没有理解错,假设你的客户端只是需要类似 NTL 去搭一个到服务器上的 8000 port ,你还可以把客户端用的那个 user 设置 nologin ,这样即使别人暴力到了也多一层保护
    adoal
        24
    adoal  
       2023-02-12 15:54:36 +08:00
    既要又要还要是不可能的。脱保了而且连源码都没有的系统,又不打算重新开发,那只能通过堆屎山的运维手段来缓解了。

    首先要在服务器端更新系统组件,这是必须做的。多年不更新,鬼知道哪个 CVE 会暴雷。当然如果服务器端操作系统比较老,比如 CentOS 6 这样的,就算更新到最新也很老了。可以自己编译安装较新版的 OpenSSH ,不过不要替换系统自带的,可以安装在另外路径,系统自带的停掉,用新的来服务。不过这样做了还是要自己日常关注 OpenSSH 的安全通告,必要时手动升级。

    另外,你的意思是客户端程序里调用 ssh 登录,登录成功后做了端口转发,而且是程序内部代码实现的,不是调用外部 ssh 命令,现在没办法改了?(如果是调用外部程序,就可以用加套的方式替换)

    客户端程序的行为没法改,不等于运行客户端的环境没没法动。#19 说的“无论是 VPN 还是 Knock, 都离不开客户端改造”大概意思时连运行客户端环境都没法动的情况。如果不是他说的这样,其实是可以认真考虑用 VPN 的。当然如果要运行客户端的是各个非 IT 的业务员工的家里,那部署 VPN 会造成心智负担。要么做好培训和支持,要么另行开发易操作的部署程序,都会比较折腾,但并不是完全不可行的。
    adoal
        25
    adoal  
       2023-02-12 15:56:52 +08:00
    fail2ban 、改受限 shell ,也算是短平快的辅助手段了。但一般来说这些只是辅助手段。根本的还是认证安全 /网络链路安全。
    adoal
        26
    adoal  
       2023-02-12 16:01:10 +08:00
    深刻教训:定制开发的信息化项目一定要要求交付源代码了才能通过验收。不要信搅基陈之类的网红信息咨询顾问的鼓吹。不是每个信息化开发商都是皮袍索芙特这样的长命巨头,也不是每个业主都有条件出丰裕的资金每个项目都找长命巨头来做。
    yinmin
        27
    yinmin  
       2023-02-12 16:46:56 +08:00
    如果服务器没法动,就只有改造网络了。

    第一种方式是架 vpn 专网,服务器放专网里,然后客户端先 vpn 拨入再访问服务器。如果你熟悉 docker 的话,架设 vpn 最简单的方式是用 hwdsl2/ipsec-vpn-server 镜像(下载量超千万),windows 客户端使用 Windows 内置的 IKEv2 协议(不推荐 l2tp 协议),客户端无需安装第三方软件,只需要将 vpn 证书导入系统,然后配置即可。使用者是无法导出证书,也就是说,只有你安装的机器可以用 vpn ,使用者无法自己克隆一个出来,克隆硬盘也不行。

    第二种方式是使用 stunnel 做双向证书认证,stunnel 稳定性很好,这个配置有点专业,你可以自己研究一下。

    推荐一款设备做 vpn 服务器,软路由神器 nano pi r2s 或者 r4s ,安装 armbian linux 操作系统,安装 Docker ,安装 hwdsl2/ipsec-vpn-server 镜像,如果企业用,不推荐 openwrt ,直接上 armbian ,妥妥的 500Mbps+。
    parametrix
        28
    parametrix  
       2023-02-12 22:09:53 +08:00
    密码有什么问题?你这 104 位随机密码比 ed25519 私钥位数还长,不用 fail2ban 除了 DDOS 风险我看不出来能出啥问题。
    parametrix
        29
    parametrix  
       2023-02-12 22:11:54 +08:00
    另外,SSH 加密套件的安全性完全不输给 TLS ,用 SSH 做安全通讯没什么问题。
    julyclyde
        30
    julyclyde  
       2023-02-13 08:57:20 +08:00
    都用家用宽带了,还能有啥严肃业务啊……
    julyclyde
        31
    julyclyde  
       2023-02-13 08:58:22 +08:00
    @adoal 业主下一年就会对运维项目单独招标,然后开发方的竞争对手会“零知识”中标,然后发现啥工作都做不下去
    coolloves
        32
    coolloves  
       2023-03-29 20:40:42 +08:00
    怎么感觉 nginx 反代就可以解决吧?
    对方通过 ssh 隧道来接你内部 127:8000 的服务,回收 ssh,nginx 把服务暴漏出去,做个简单验证,给不同的用户不同的密码.这样风险小很多吧.
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   我们的愿景   ·   实用小工具   ·   1008 人在线   最高记录 6543   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 30ms · UTC 22:44 · PVG 06:44 · LAX 15:44 · JFK 18:44
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.