大家 web 开发时,是怎么样保障正式数据库的账号安全的? - V2EX
V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
请不要在回答技术问题时复制粘贴 AI 生成的内容
godall
V2EX    程序员

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

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

    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  
    PRO
       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 不是为了防外人,主要是防内部开发人员啊。
    luckyc
        13
    luckyc  
       2021-03-29 12:53:37 +08:00
    连接字符串里面的密码也可以加密啊.
    wangyanrui
        14
    wangyanrui  
      &nbp;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 不是因为数据库密码泄露被脱裤,明文保存 是指数据库保存的密码是明文的...和配置文件没多大关系吧?
    40EaE5uJO3Xt1VVa
        21
    40EaE5uJO3Xt1VVa  
       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
    写环境变量里
    lovelive1024
        48
    lovelive1024  
       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
    看到这里这么多评论里有这样的好笑的论点:水桶无论有多高,它盛水的高度取决于其中最低的那块木板,所以咱负责的这块木板做成啥样也没用。
    MIUIOS
        72
    MIUIOS  
       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     Solana     2912 人在线   最高记录 6679       Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 29ms UTC 14:04 PVG 22:04 LAX 07:04 JFK 10:04
    Do have faith in what you're doing.
    ubao snddm index pchome yahoo rakuten mypaper meadowduck bidyahoo youbao zxmzxm asda bnvcg cvbfg dfscv mmhjk xxddc yybgb zznbn ccubao uaitu acv GXCV ET GDG YH FG BCVB FJFH CBRE CBC GDG ET54 WRWR RWER WREW WRWER RWER SDG EW SF DSFSF fbbs ubao fhd dfg ewr dg df ewwr ewwr et ruyut utut dfg fgd gdfgt etg dfgt dfgd ert4 gd fgg wr 235 wer3 we vsdf sdf gdf ert xcv sdf rwer hfd dfg cvb rwf afb dfh jgh bmn lgh rty gfds cxv xcv xcs vdas fdf fgd cv sdf tert sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf shasha9178 shasha9178 shasha9178 shasha9178 shasha9178 liflif2 liflif2 liflif2 liflif2 liflif2 liblib3 liblib3 liblib3 liblib3 liblib3 zhazha444 zhazha444 zhazha444 zhazha444 zhazha444 dende5 dende denden denden2 denden21 fenfen9 fenf619 fen619 fenfe9 fe619 sdf sdf sdf sdf sdf zhazh90 zhazh0 zhaa50 zha90 zh590 zho zhoz zhozh zhozho zhozho2 lislis lls95 lili95 lils5 liss9 sdf0ty987 sdft876 sdft9876 sdf09876 sd0t9876 sdf0ty98 sdf0976 sdf0ty986 sdf0ty96 sdf0t76 sdf0876 df0ty98 sf0t876 sd0ty76 sdy76 sdf76 sdf0t76 sdf0ty9 sdf0ty98 sdf0ty987 sdf0ty98 sdf6676 sdf876 sd876 sd876 sdf6 sdf6 sdf9876 sdf0t sdf06 sdf0ty9776 sdf0ty9776 sdf0ty76 sdf8876 sdf0t sd6 sdf06 s688876 sd688 sdf86