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

大家 web 开发时,是怎么样保障正式数据库的账号安全的?

  •  1
     
  •   godall · 2021-03-29 11:19:28 +08:00 · 8118 次点击
    这是一个创建于 1095 天前的主题,其中的信息可能已经有所发展或是发生改变。
    大家开发程序时,程序连接数据库一般怎么保存账号和密码的?

    1. 写死在程序里(应该除了大学实习外没人这么干了)
    2. 写在配置文件里——明文(很多人都这么用)
    3. 写在配置文件里——加密(很多人都这么用)
    4. 其他


    我感觉 2,3 也都不是很安全啊,大家有什么办法?
    75 条回复    2021-03-31 11:54:17 +08:00
    3dwelcome
        1
    3dwelcome  
       2021-03-29 11:25:01 +08:00
    作为类库,写死在程序里。但是程序是编译后的二进制代码,除非黑客挂着内核来调试,否则也看不到数据库密码明文。
    ysicing
        2
    ysicing  
       2021-03-29 11:30:25 +08:00   ❤️ 11
    配置文件明文,好维护。
    都搞到配置文件了,说明都被日穿了。
    3dwelcome
        3
    3dwelcome  
       2021-03-29 11:32:03 +08:00
    或者直接把数据库也封装成 linux vm 黑盒,对外提供数据访问 API,用的时候就一个开一个 kvm 。
    kvm 里写一些保护措施,比如和本地地址绑定后,接口才能正常运行。黑客一旦复制 kvm,没有 root 密码,也解不开进不去。数据就很安全。
    misaka19000
        4
    misaka19000  
       2021-03-29 11:33:53 +08:00   ❤️ 2
    配置文件+网络环境隔离
    T0m008
        5
    T0m008  
       2021-03-29 11:34:33 +08:00
    配置文件明文就够了
    xiaoding
        6
    xiaoding  
       2021-03-29 11:36:20 +08:00
    测试环境有专门的测试库,密钥可以写在配置文件里,里面也不能保存敏感真实数据。
    生产环境一般用密钥管理系统,通过发布脚本在发布过程中自动化获取密钥,同时限制好网络的访问等。
    这样基本上确保密钥或者数据库连接凭证只存在于机器内存中,同时因为网络限制只有特定应用服务器可以连接特定的库和表,最大限度的保障了安全。
    3dwelcome
        7
    3dwelcome  
       2021-03-29 11:38:17 +08:00
    @ysicing "都搞到配置文件了,说明都被日穿了。", 能多防几层总是好的,以前 CSDN 数据库被拖库,就都是明文才那么惨。
    如果数据是加密的,黑客还要摸索程序,搞清解密算法。相对要安全一点点吧。
    leafre
        8
    leafre  
       2021-03-29 11:40:38 +08:00 via iPhone
    能入侵服务器,都白搭,做好密码不可逆才是关键
    wakzz
        9
    wakzz  
       2021-03-29 11:50:07 +08:00
    数据库地址和账号密码的密文从配置中心读取,本地配置文件存放机密的密钥。
    这样关键参数密文和密钥分开来放,另外数据库访问也做了 ip 白名单机制,这样除非是权限很高的内鬼,基本不担心数据库安全问题。
    SingeeKing
        10
    SingeeKing  
       2021-03-29 12:05:21 +08:00   ❤️ 1
    密码明文在配置文件,但是配置文件是自己写的私有格式
    CEBBCAT
        11
    CEBBCAT  
       2021-03-29 12:18:31 +08:00 via Android
    写死到源码的一个配置结构,有什么问题吗?😂

    服务器和数据库都是一家云服务商的
    godall
        12
    godall  
    OP
       2021-03-29 12:52:58 +08:00
    @ysicing 不是为了防外人,主要是防内部开发人员啊。
    l4ever
        13
    l4ever  
       2021-03-29 12:53:37 +08:00
    连接字符串里面的密码也可以加密啊.
    wangyanrui
        14
    wangyanrui  
       2021-03-29 12:54:08 +08:00 via iPhone
    大部分都是配置文件明文

    话说配置文件都被人拿到了,还玩个鸡毛?
    wangyanrui
        15
    wangyanrui  
       2021-03-29 12:55:28 +08:00 via iPhone
    防内部人员的话就系统环境变量呀,dll 呀什么的

    但是总归是有人要知道吧,这个防的没太大必要
    masterclock
        16
    masterclock  
       2021-03-29 13:10:44 +08:00
    configmap 和 vault 都用
    CodeCodeStudy
        17
    CodeCodeStudy  
       2021-03-29 13:17:33 +08:00
    MySQL 是用户名加主机名来区分用户的,主机名设置只允许连接的内网 IP 地址即可
    nutting
        18
    nutting  
       2021-03-29 13:23:45 +08:00 via Android
    当然是服务器才能直连,然后其他的操作要通过 web 审计平台上操作
    wanguorui123
        19
    wanguorui123  
       2021-03-29 13:32:46 +08:00
    哈希+盐、加密+盐,但是都不能防止入侵服务器
    markgor
        20
    markgor  
       2021-03-29 13:51:14 +08:00
    1 、配置文件 不属于程序里吗?
    2 、正常情况下,能查看到 1 、2 、3 里的,说明已经被 getshell 了吧?都被 GETSHELL 了剩下的顶多时间问题,再不是我也不解密,我顺着你的程序写个脱裤的?
    3 、“能多防几层总是好的,以前 CSDN 数据库被拖库,就都是明文才那么惨。” ---不敢苟同,“能多防几层总是好的”,但也要用对地方..否则只是浪费时间....“以前 CSDN 数据库被拖库,就都是明文才那么惨。” CSDN 不是因为数据库密码泄露被脱裤,明文保存 是指数据库保存的密码是明文的...和配置文件没多大关系吧?
    yanzhiling2001
        21
    yanzhiling2001  
       2021-03-29 13:52:56 +08:00
    我的是配置文件加密,数据库只放在内网,只允许执行 IP 段访问,数据库内关键字段也是加密的
    securityCoding
        22
    securityCoding  
       2021-03-29 13:57:29 +08:00 via Android
    配置中心,这都被撸了的话那就莫得办法了😂
    iyaozhen
        23
    iyaozhen  
       2021-03-29 13:58:01 +08:00
    楼主意思是内部信息安全。可以用配置中心,配置都是加密的,启动时获取配置。线上线下隔离,即使想去连线上的配置中心代码里面打印也连不上
    szuwl
        24
    szuwl  
       2021-03-29 14:02:03 +08:00
    配置中心
    Kinnice
        25
    Kinnice  
       2021-03-29 14:31:12 +08:00
    CI/CD 的时候自动随机密码。
    chenqh
        26
    chenqh  
       2021-03-29 14:37:26 +08:00
    @iyaozhen 这种应该是大公司的那种级别的做法了吧
    dzdh
        27
    dzdh  
       2021-03-29 14:45:14 +08:00
    env + 个人独立环境
    annielong
        28
    annielong  
       2021-03-29 14:49:43 +08:00
    一般用到 3 就足够安全了,实际上大多小项目直接用 2
    unclemcz
        29
    unclemcz  
       2021-03-29 14:56:16 +08:00
    正常情况是存配置文件,加不加密的无所谓了,然后开启数据库访问地址白名单。
    bthulu
        30
    bthulu  
       2021-03-29 15:02:55 +08:00   ❤️ 2
    我司都是密钥库里随机抽一个再加点随机数当密钥, 谁也不知道密钥到底是哪个.
    上线的时候, 先启动在线密钥爆破线程, 在一个更大点的密钥库里用随机数进行爆破, 大概半个到一个小时后, 就会爆破到正确密钥, 服务就启动起来了.
    SlipStupig
        31
    SlipStupig  
       2021-03-29 15:03:22 +08:00
    保证账号安全,谈单个点事没有意义的,安全是遵循木桶理论。你觉得你的这些措施很安全,假如你服务器被人偷走,你这些措施都没用了
    janxin
        32
    janxin  
       2021-03-29 15:38:16 +08:00
    这种叫做 Secret Management,具体的放狗搜一下
    iyaozhen
        33
    iyaozhen  
       2021-03-29 15:42:04 +08:00
    @chenqh 嗯 还有更细致的。专门有部门搞这个,属于基建
    murmur
        34
    murmur  
       2021-03-29 15:47:45 +08:00
    有防火墙控制,数据库只能由特殊 IP 访问,而且没有公网权限

    然后就是定期的备份了
    unco020511
        35
    unco020511  
       2021-03-29 16:24:56 +08:00
    用内网配置中心
    opengps
        36
    opengps  
       2021-03-29 16:37:07 +08:00 via Android
    明文链接有网络要求,仅限于内网链接
    密文解密是那些公开了数据库公网访问场景下的必然要求

    不过说到底,安全问题是个综合结果,不代表锁大门了就安全,窗户,通风口,下水道等等很多地方都得同步做到安全,整个系统才算安全
    cco
        37
    cco  
       2021-03-29 16:40:25 +08:00
    用 2 足以,搞加密什么的都是皇帝的新衣。
    某些人喜欢用公网 IP 的除外。局域网都长得一模一样,泄漏了又如何,某运营商的第三层跳板机里面还装得盗版 navicat 、CRT 呢。
    Varobjs
        38
    Varobjs  
       2021-03-29 16:46:22 +08:00   ❤️ 1
    防内部,那就加层 VPN,有账户密码也连不上
    dengshen
        39
    dengshen  
       2021-03-29 16:50:05 +08:00 via iPhone
    @bthulu 太秀了吧!发版前也需要爆破密码吗?
    yrj
        40
    yrj  
       2021-03-29 17:12:55 +08:00 via iPad   ❤️ 3
    弄个假的配置文件,连上的是蜜罐。
    真的放环境变量。
    逃:)
    Drinker
        41
    Drinker  
       2021-03-29 17:16:28 +08:00
    一般写在配置文件里面,做好服务器的防护。
    不嫌麻烦的话配置文件里面的密码加密一下,连接数据库的时候解密使用解密后的密码连接。
    huobazi
        42
    huobazi  
       2021-03-29 17:16:32 +08:00
    上配置中心
    tiedan
        43
    tiedan  
       2021-03-29 17:23:49 +08:00
    配置中心下发
    sanyuedev
        44
    sanyuedev  
       2021-03-29 17:26:33 +08:00
    @ysicing 没错 ,通过程序漏洞拿到 shell 直接就日穿
    ren2881971
        45
    ren2881971  
       2021-03-29 17:28:34 +08:00
    @bthulu 你们这个狠啊。。。
    CRVV
        46
    CRVV  
       2021-03-29 17:43:03 +08:00
    重点不是把密码写在哪里,即使是写在代码里面,只要代码不泄漏就是安全的。
    当然有代码权限的人通常很多,所以不泄漏代码通常会困难一些。
    如果你的代码的价值比数据的价值更高,那你直接写在代码里就好了,没必要折腾别的。

    重点是要怎么保证密码不被别人拿到。
    比如用加密的配置文件,那么重点是你要把密钥放在哪里,如果密钥和配置文件在一起,加密就是没用的。
    如果你有一个安全的地方存密钥,当然也可以直接用这个安全的地方存配置文件,那么加密就是没必要的。

    AWS GCP 都有 secret manager 来做这件事情。
    当然如果你真的想要保证安全,只是上一个现成的服务当然解决不了问题。比如很多人喜欢在程序启动的时候把配置记在日志里,比如很多开发人员都有登录到服务器上的权限,这些地方都能拿到密码。
    tabris17
        47
    tabris17  
       2021-03-29 17:45:46 +08:00
    写环境变量里
    ily433664
        48
    ily433664  
       2021-03-29 18:00:42 +08:00
    放到 github 上面(狗头)
    feitxue
        49
    feitxue  
       2021-03-29 18:45:16 +08:00
    @bthulu #30 大佬这是一本正经说笑还是确有此事
    oyasumi
        50
    oyasumi  
       2021-03-29 19:20:17 +08:00 via Android   ❤️ 1
    数据库和服务器加 ip 限制
    zgzhang
        51
    zgzhang  
       2021-03-29 19:38:56 +08:00
    @godall 使用过的比较好的方式是配置中心,DBA 给一个 key 就好了,需要开发一个插件,也不复杂
    cway
        52
    cway  
       2021-03-29 19:51:30 +08:00
    不允许远程登陆就行了
    xuanbg
        53
    xuanbg  
       2021-03-29 19:56:05 +08:00
    1 、配置中心。只需要运维人员掌握权限即可。
    2 、打包脚本替换配置文件,打包服务器只允许运维访问。别人要打包发布通过 Jenkins 运行脚本。
    3 、各种骚操作,但难度比上面两个办法要大。
    abcbuzhiming
        54
    abcbuzhiming  
       2021-03-29 23:30:20 +08:00
    @3dwelcome 你真实想多了,你服务器都被日穿了,黑客压根不需要调试你的程序,拿到你的程序后,程序本地跑起拦截你的网络连接请求做中间人攻击,就能截到你的账号密码。

    最安全的方式永远是不要让黑客接触到你的程序,一旦接触到你的程序了,什么都是白塔。为什么服务器程序在正常情况下默认比客户端程序安全的多,就是因为正常情况下认为黑客是接触不到服务器程序本体的。一旦这道防火墙被打破,靠什么加密程序,都是骗自己的
    abcbuzhiming
        55
    abcbuzhiming  
       2021-03-29 23:32:34 +08:00
    @bthulu 这倒是一个新奇的思路,可以保证秘钥只在内存里存在,而且很难拿到,问题是,你司启动一个服务要半个到一个小时?
    freelancher
        56
    freelancher  
       2021-03-30 00:05:27 +08:00
    一堆菜鸡在瞎猜。请个 DBA 。每个账户都可以限定 IP 和权限的。非机器 IP 无法操作。机器都黑进去了。有毛用。
    IvanLi127
        57
    IvanLi127  
       2021-03-30 00:35:24 +08:00 via Android
    一般来说,服务器被入侵了配置文件才可能泄露。可是你家被偷了,你在意这个?人家 hook 你程序搞事情就行了,毕竟正常拿到数据库权限在其他地方也访问不到,权限都限着呢
    3dwelcome
        58
    3dwelcome  
       2021-03-30 00:48:04 +08:00
    @abcbuzhiming "你真实想多了,你服务器都被日穿了,黑客压根不需要调试你的程序,拿到你的程序后,程序本地跑起拦截你的网络连接请求做中间人攻击,就能截到你的账号密码。"

    上面提到了,程序是和机器绑定在一起的,换了 IP 或换了硬件配置,程序就自动失效了,接口返回的都是错乱数据。
    而且程序本体是封装在 Linux KVM 里面运行的,正常黑客没有 root 密码,系统进都进不去,更别说调试了。
    henryhu
        59
    henryhu  
       2021-03-30 00:48:05 +08:00
    防自己人,代码还是程序员写的,是不是得先防程序有后门,防不胜防啊
    jones2000
        60
    jones2000  
       2021-03-30 00:57:48 +08:00
    上线给部署文档如何配置账户, 保存的时候 base64 一下就可以了。明文不行,出了问题运维要跟你扯皮的。由运维组自己去配置账户,开发不用管了。账号泄露也是运维的问题, 跟开发就没什么关系了。
    offswitch
        61
    offswitch  
       2021-03-30 02:35:27 +08:00
    配置文件明文就可以了,限制数据库连接 ip,其余毫无意义。
    singerll
        62
    singerll  
       2021-03-30 07:11:23 +08:00 via Android
    sql 注入拖库根本不需要账号密码。。
    code2019
        63
    code2019  
       2021-03-30 07:45:28 +08:00 via iPhone
    k8s configmap 或者 Apollo 了解下
    chenshun00
        64
    chenshun00  
       2021-03-30 08:59:08 +08:00
    给一个坐标,运行获取密码
    leeyom
        65
    leeyom  
       2021-03-30 09:14:46 +08:00 via iPhone
    放到配置中心,比如阿波罗
    wangyzj
        66
    wangyzj  
       2021-03-30 09:25:08 +08:00
    .env
    或者配置中心下发
    staugur
        67
    staugur  
       2021-03-30 09:26:13 +08:00
    最简单的不用数据库。。。
    hq136234303
        68
    hq136234303  
       2021-03-30 09:51:49 +08:00
    @3dwelcome 没用的你数据加密的方法还是在代码里面的所以没鸡儿用
    q149072205
        69
    q149072205  
       2021-03-30 10:06:48 +08:00
    肯定放在配置文件 里啊,如果真有高手能看到你的配置文件,肯定早就攻破系统了。
    tairan2006
        70
    tairan2006  
       2021-03-30 11:01:34 +08:00
    用 2 就行,用 3 的一般是企业合规需求
    zlowly
        71
    zlowly  
       2021-03-30 13:08:35 +08:00
    看到这里这么多评论里有这样的好笑的论点:水桶无论有多高,它盛水的高度取决于其中最低的那块木板,所以咱负责的这块木板做成啥样也没用。
    totoro52
        72
    totoro52  
       2021-03-30 16:20:50 +08:00
    @3dwelcome java: 还可以这样?
    hoyixi
        73
    hoyixi  
       2021-03-30 21:09:01 +08:00
    真流程规范的公司,开发人员是无法操作正式数据库环境和正式数据的,那是专门的 DBA 的权限。
    开发人员只能用开发环境和测试环境的数据库及“假”数据。
    QAQ73
        74
    QAQ73  
       2021-03-31 10:25:58 +08:00
    配置文件直接放到服务器中,代码只放测试环境的
    s0nnse
        75
    s0nnse  
       2021-03-31 11:54:17 +08:00
    放在配置文件中就可以了,如果要关注服务器的安全问题,更多的需要关注代码逻辑、基线配置的问题。过于看重配置文件的问题,反而是捡芝麻,丢西瓜。
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   我们的愿景   ·   实用小工具   ·   5452 人在线   最高记录 6543   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 30ms · UTC 01:34 · PVG 09:34 · LAX 18:34 · JFK 21:34
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.