V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
turan12
V2EX  ›  程序员

客户提供的 API 接口在本地,但业务系统在阿里云,如何建立一个安全的通讯机制?

  •  1
     
  •   turan12 · 2020-08-24 13:04:33 +08:00 · 4066 次点击
    这是一个创建于 1556 天前的主题,其中的信息可能已经有所发展或是发生改变。

    网络架构类似这样:

    客户生产服务器( LAN,本地 API 接口在这里)-- 代理服务器( LAN/WAN )-- 阿里云 ECS (线上业务系统)

    因为客户那边条件限制,没条件拉专线,代理服务器暂时只能通过一条 1Gbps 的电信宽带连接公网,当然动态 IP 动态域名这些都不是问题,难点的是如何在本地服务器和阿里云服务器之间建立一个安全的通讯机制。

    客户提供的 API 接口是通过 http 传输的 json 格式数据,能想到最简单的方法是用 nginx 做 proxy,但似乎安全性上还是有问题。求助 v 站的大神提个思路,感谢!

    37 条回复    2020-08-25 10:54:07 +08:00
    ddefewfewf
        1
    ddefewfewf  
       2020-08-24 13:26:47 +08:00
    内容加密
    namaketa
        2
    namaketa  
       2020-08-24 13:28:52 +08:00   ❤️ 1
    你说的安全是指

    1. 链路可靠,不被 isp 劫持和窃听 :加一层 https,不放心去 api 侧把 payload 再用 tls 加密一次。

    2. 暴露在公网的 api 防止未授权访问:根据时间戳和自签发的私钥生成 token,可以参考 jwt
    opengps
        3
    opengps  
       2020-08-24 13:31:24 +08:00
    https+白名单 ip(动态维护 ip 变更有点麻烦)
    daniellu
        4
    daniellu  
       2020-08-24 13:35:21 +08:00
    可以考虑阿里的 VPN 服务,即内网 API 接口通过 VPN 连接到 ECS 所在的业务系统,对于 ECS 业务系统和 API 来说,就是内部网络访问,简单方便。
    不过 VPN 服务要花钱~
    zxyroy
        5
    zxyroy  
       2020-08-24 13:38:31 +08:00
    其实可以反其道而行,能不能在客户那里部署一个 feeder,定时访问服务器上的 api,提供数据,这样就可以 https,也可以加密,还能避免动态 ip 更新不及时
    dyllen
        6
    dyllen  
       2020-08-24 13:45:13 +08:00
    https+数据签名不够吗?各种支付的对接都是这样的,应该足够了吧。
    tomczhen
        7
    tomczhen  
       2020-08-24 13:53:12 +08:00 via Android
    建立可信信道,通过 VPN 接入即可,不需要对应用改造。
    turan12
        8
    turan12  
    OP
       2020-08-24 14:08:08 +08:00
    @namaketa #2
    @opengps #3
    这个是我正在考虑的方案之一
    turan12
        9
    turan12  
    OP
       2020-08-24 14:09:00 +08:00
    @zxyroy #5 系统涉及到一些支付状态之类的实时性较强的数据,如果是这样子轮询的话可能会有延迟。
    turan12
        10
    turan12  
    OP
       2020-08-24 14:13:18 +08:00
    @daniellu #4 这个是个新的思路,正在研究
    shuigui
        11
    shuigui  
       2020-08-24 14:41:18 +08:00
    简单说就是需要一个安全网关,可以找一下这个 [IPSecVPN 详解(深入浅出简单易懂)]
    实际上自己搭建也不麻烦,strongswan 开源的
    unco020511
        12
    unco020511  
       2020-08-24 17:08:17 +08:00
    https 足够
    wizardoz
        13
    wizardoz  
       2020-08-24 17:15:29 +08:00
    自己在云服务器上跑一个 OpenVPN,本地主机作为客户端连入 VPN 。解决了内网穿透和加密两个问题。
    turan12
        14
    turan12  
    OP
       2020-08-24 17:24:51 +08:00
    根据楼上各位大神意见,我总结了两种方案,一种是 https+token,另一种是 vpn 。我先搭环境分别测试一下,过两天来更新这个帖子。
    x66
        15
    x66  
       2020-08-24 17:31:24 +08:00
    https+IP 白名单就够了吧,服务器域名一般很少变化
    x66
        16
    x66  
       2020-08-24 17:31:39 +08:00
    @x66 服务器 IP 一般很少变化
    Foralrec
        17
    Foralrec  
       2020-08-24 17:49:51 +08:00
    通常是拨 VPN,正向还是反向都是这种方案居多
    专线成本比较高,打通关系也比较俊男
    Foralrec
        18
    Foralrec  
       2020-08-24 17:51:19 +08:00
    sed 's/俊男 /困难 /'
    Osk
        19
    Osk  
       2020-08-24 18:39:38 +08:00 via Android
    用 autossh 建立 tcp tunnel 试试,效果类似 vpn,但更简单。
    用证书登陆,安全性也足够,需要注意的是: 不支持 tcp,端口要固定,autossh 参数需要适当调整 (超时)。

    以前没有 frp 等工具时我就是在家里网关上用 autossh 作内网穿透的,挺稳的。
    Osk
        20
    Osk  
       2020-08-24 18:40:50 +08:00 via Android
    @Osk 不支持 tcp --> 不支持 udp
    yingfengi
        21
    yingfengi  
       2020-08-24 18:42:11 +08:00 via Android
    sslvpn
    GM
        22
    GM  
       2020-08-24 18:45:00 +08:00   ❤️ 1
    如果请求数量不大的话,可以考虑反向 MQ 方式。

    你的软件往某个队列发送请求包,客户方系统安装个软件监听该队列,收到了就转发到客户 API 上,得到了结果后也发到队列里返回去。
    goofool
        23
    goofool  
       2020-08-24 18:53:55 +08:00
    花钱买阿里云的 SDWAN 服务
    GM
        24
    GM  
       2020-08-24 18:56:54 +08:00
    @turan12

    对了,可以考虑一下这个,我觉得这个可以 100% 满足你要求:

    Consul Connect
    qile1
        25
    qile1  
       2020-08-24 18:58:50 +08:00 via Android
    通用 vpn 不太稳定,尤其是 openvpn,好多地方都有干扰,gre 有时候就无法建立,所以提前测试大数据量长时间多时间段测试后可能可以去用一段时间,华为那个 vpn 不知道是啥私有协议
    miao1007
        26
    miao1007  
       2020-08-24 21:19:40 +08:00 via iPhone
    使用 consul 的 sidecar
    swulling
        27
    swulling  
       2020-08-24 21:34:05 +08:00 via iPad
    VPN 算标准答案吧
    felixcode
        28
    felixcode  
       2020-08-24 21:47:10 +08:00 via Android
    服务器上的防火墙和阿里云的访问控制都可以用起来,白名单。
    ZRS
        29
    ZRS  
       2020-08-24 22:03:56 +08:00
    TLS / VPN
    turan12
        30
    turan12  
    OP
       2020-08-25 02:44:06 +08:00 via iPhone
    @Osk #19 这个貌似不错哦,感觉跟轻量。
    turan12
        31
    turan12  
    OP
       2020-08-25 02:45:49 +08:00 via iPhone
    @GM #22 这种场景下用消息队列总感觉会偶尔丢数据。
    turan12
        32
    turan12  
    OP
       2020-08-25 02:49:56 +08:00 via iPhone
    @GM #24 以前没关注过,明天研究一下先。
    bilibilifi
        33
    bilibilifi  
       2020-08-25 04:58:18 +08:00 via iPhone
    最安全的还是 https 证书的双向绑定吧,还可以顺便保证前向安全性。唯一比较麻烦的是客户端设置
    yc8332
        34
    yc8332  
       2020-08-25 08:02:37 +08:00
    frps 啊

    这么简单
    lxfxf
        35
    lxfxf  
       2020-08-25 08:15:55 +08:00
    ssl -l
    Foxkeh
        36
    Foxkeh  
       2020-08-25 08:52:26 +08:00
    跟我们公司一样的场景. 最初我们的对策是双向 https,后来又加了 token 校验.
    dier
        37
    dier  
       2020-08-25 10:54:07 +08:00
    如果是从阿里云上请求本地的 API,阿里云一般有固定 IP 吧,直接在 API 这边设置白名单,只允许云服务器 IP 请求呀,再套层 SSL
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   实用小工具   ·   5492 人在线   最高记录 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 28ms · UTC 07:46 · PVG 15:46 · LAX 23:46 · JFK 02:46
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.