![]() | 1 3dwelcome 2021-03-29 11:25:01 +08:00 作为类库,写死在程序里。但是程序是编译后的二进制代码,除非黑客挂着内核来调试,否则也看不到数据库密码明文。 |
![]() | 2 ysicing 2021-03-29 11:30:25 +08:00 ![]() 配置文件明文,好维护。 都搞到配置文件了,说明都被日穿了。 |
![]() | 3 3dwelcome 2021-03-29 11:32:03 +08:00 或者直接把数据库也封装成 linux vm 黑盒,对外提供数据访问 API,用的时候就一个开一个 kvm 。 kvm 里写一些保护措施,比如和本地地址绑定后,接口才能正常运行。黑客一旦复制 kvm,没有 root 密码,也解不开进不去。数据就很安全。 |
![]() | 4 misaka19000 2021-03-29 11:33:53 +08:00 ![]() 配置文件+网络环境隔离 |
5 T0m008 2021-03-29 11:34:33 +08:00 配置文件明文就够了 |
6 xiaoding 2021-03-29 11:36:20 +08:00 测试环境有专门的测试库,密钥可以写在配置文件里,里面也不能保存敏感真实数据。 生产环境一般用密钥管理系统,通过发布脚本在发布过程中自动化获取密钥,同时限制好网络的访问等。 这样基本上确保密钥或者数据库连接凭证只存在于机器内存中,同时因为网络限制只有特定应用服务器可以连接特定的库和表,最大限度的保障了安全。 |
![]() | 7 3dwelcome 2021-03-29 11:38:17 +08:00 @ysicing "都搞到配置文件了,说明都被日穿了。", 能多防几层总是好的,以前 CSDN 数据库被拖库,就都是明文才那么惨。 如果数据是加密的,黑客还要摸索程序,搞清解密算法。相对要安全一点点吧。 |
8 leafre 2021-03-29 11:40:38 +08:00 via iPhone 能入侵服务器,都白搭,做好密码不可逆才是关键 |
![]() | 9 wakzz 2021-03-29 11:50:07 +08:00 数据库地址和账号密码的密文从配置中心读取,本地配置文件存放机密的密钥。 这样关键参数密文和密钥分开来放,另外数据库访问也做了 ip 白名单机制,这样除非是权限很高的内鬼,基本不担心数据库安全问题。 |
![]() | 10 SingeeKing PRO ![]() 密码明文在配置文件,但是配置文件是自己写的私有格式 |
![]() | 11 CEBBCAT 2021-03-29 12:18:31 +08:00 via Android 写死到源码的一个配置结构,有什么问题吗? 服务器和数据库都是一家云服务商的 |
13 luckyc 2021-03-29 12:53:37 +08:00 连接字符串里面的密码也可以加密啊. |
![]() | 14 wangyanrui &nbp;2021-03-29 12:54:08 +08:00 via iPhone 大部分都是配置文件明文 话说配置文件都被人拿到了,还玩个鸡毛? |
![]() | 15 wangyanrui 2021-03-29 12:55:28 +08:00 via iPhone 防内部人员的话就系统环境变量呀,dll 呀什么的 但是总归是有人要知道吧,这个防的没太大必要 |
![]() | 16 masterclock 2021-03-29 13:10:44 +08:00 configmap 和 vault 都用 |
17 CodeCodeStudy 2021-03-29 13:17:33 +08:00 MySQL 是用户名加主机名来区分用户的,主机名设置只允许连接的内网 IP 地址即可 |
![]() | 18 nutting 2021-03-29 13:23:45 +08:00 via Android 当然是服务器才能直连,然后其他的操作要通过 web 审计平台上操作 |
![]() | 19 wanguorui123 2021-03-29 13:32:46 +08:00 哈希+盐、加密+盐,但是都不能防止入侵服务器 |
![]() | 20 markgor 2021-03-29 13:51:14 +08:00 1 、配置文件 不属于程序里吗? 2 、正常情况下,能查看到 1 、2 、3 里的,说明已经被 getshell 了吧?都被 GETSHELL 了剩下的顶多时间问题,再不是我也不解密,我顺着你的程序写个脱裤的? 3 、“能多防几层总是好的,以前 CSDN 数据库被拖库,就都是明文才那么惨。” ---不敢苟同,“能多防几层总是好的”,但也要用对地方..否则只是浪费时间....“以前 CSDN 数据库被拖库,就都是明文才那么惨。” CSDN 不是因为数据库密码泄露被脱裤,明文保存 是指数据库保存的密码是明文的...和配置文件没多大关系吧? |
21 40EaE5uJO3Xt1VVa 2021-03-29 13:52:56 +08:00 我的是配置文件加密,数据库只放在内网,只允许执行 IP 段访问,数据库内关键字段也是加密的 |
22 securityCoding 2021-03-29 13:57:29 +08:00 via Android 配置中心,这都被撸了的话那就莫得办法了 |
![]() | 23 iyaozhen 2021-03-29 13:58:01 +08:00 楼主意思是内部信息安全。可以用配置中心,配置都是加密的,启动时获取配置。线上线下隔离,即使想去连线上的配置中心代码里面打印也连不上 |
![]() | 24 szuwl 2021-03-29 14:02:03 +08:00 配置中心 |
![]() | 25 Kinnice 2021-03-29 14:31:12 +08:00 CI/CD 的时候自动随机密码。 |
![]() | 27 dzdh 2021-03-29 14:45:14 +08:00 env + 个人独立环境 |
28 annielong 2021-03-29 14:49:43 +08:00 一般用到 3 就足够安全了,实际上大多小项目直接用 2 |
![]() | 29 unclemcz 2021-03-29 14:56:16 +08:00 正常情况是存配置文件,加不加密的无所谓了,然后开启数据库访问地址白名单。 |
30 bthulu 2021-03-29 15:02:55 +08:00 ![]() 我司都是密钥库里随机抽一个再加点随机数当密钥, 谁也不知道密钥到底是哪个. 上线的时候, 先启动在线密钥爆破线程, 在一个更大点的密钥库里用随机数进行爆破, 大概半个到一个小时后, 就会爆破到正确密钥, 服务就启动起来了. |
![]() | 31 SlipStupig 2021-03-29 15:03:22 +08:00 保证账号安全,谈单个点事没有意义的,安全是遵循木桶理论。你觉得你的这些措施很安全,假如你服务器被人偷走,你这些措施都没用了 |
![]() | 32 janxin 2021-03-29 15:38:16 +08:00 这种叫做 Secret Management,具体的放狗搜一下 |
![]() | 34 murmur 2021-03-29 15:47:45 +08:00 有防火墙控制,数据库只能由特殊 IP 访问,而且没有公网权限 然后就是定期的备份了 |
![]() | 35 unco020511 2021-03-29 16:24:56 +08:00 用内网配置中心 |
![]() | 36 opengps 2021-03-29 16:37:07 +08:00 via Android 明文链接有网络要求,仅限于内网链接 密文解密是那些公开了数据库公网访问场景下的必然要求 不过说到底,安全问题是个综合结果,不代表锁大门了就安全,窗户,通风口,下水道等等很多地方都得同步做到安全,整个系统才算安全 |
![]() | 37 cco 2021-03-29 16:40:25 +08:00 用 2 足以,搞加密什么的都是皇帝的新衣。 某些人喜欢用公网 IP 的除外。局域网都长得一模一样,泄漏了又如何,某运营商的第三层跳板机里面还装得盗版 navicat 、CRT 呢。 |
![]() | 38 Varobjs 2021-03-29 16:46:22 +08:00 ![]() 防内部,那就加层 VPN,有账户密码也连不上 |
40 yrj 2021-03-29 17:12:55 +08:00 via iPad ![]() 弄个假的配置文件,连上的是蜜罐。 真的放环境变量。 逃:) |
![]() | 41 Drinker 2021-03-29 17:16:28 +08:00 一般写在配置文件里面,做好服务器的防护。 不嫌麻烦的话配置文件里面的密码加密一下,连接数据库的时候解密使用解密后的密码连接。 |
![]() | 42 huobazi 2021-03-29 17:16:32 +08:00 上配置中心 |
![]() | 43 tiedan 2021-03-29 17:23:49 +08:00 配置中心下发 |
![]() | 45 ren2881971 2021-03-29 17:28:34 +08:00 @bthulu 你们这个狠啊。。。 |
46 CRVV 2021-03-29 17:43:03 +08:00 重点不是把密码写在哪里,即使是写在代码里面,只要代码不泄漏就是安全的。 当然有代码权限的人通常很多,所以不泄漏代码通常会困难一些。 如果你的代码的价值比数据的价值更高,那你直接写在代码里就好了,没必要折腾别的。 重点是要怎么保证密码不被别人拿到。 比如用加密的配置文件,那么重点是你要把密钥放在哪里,如果密钥和配置文件在一起,加密就是没用的。 如果你有一个安全的地方存密钥,当然也可以直接用这个安全的地方存配置文件,那么加密就是没必要的。 AWS GCP 都有 secret manager 来做这件事情。 当然如果你真的想要保证安全,只是上一个现成的服务当然解决不了问题。比如很多人喜欢在程序启动的时候把配置记在日志里,比如很多开发人员都有登录到服务器上的权限,这些地方都能拿到密码。 |
![]() | 47 tabris17 2021-03-29 17:45:46 +08:00 写环境变量里 |
![]() | 48 lovelive1024 2021-03-29 18:00:42 +08:00 放到 github 上面(狗头) |
50 oyasumi 2021-03-29 19:20:17 +08:00 via Android ![]() 数据库和服务器加 ip 限制 |
52 cway 2021-03-29 19:51:30 +08:00 不允许远程登陆就行了 |
![]() | 53 xuanbg 2021-03-29 19:56:05 +08:00 1 、配置中心。只需要运维人员掌握权限即可。 2 、打包脚本替换配置文件,打包服务器只允许运维访问。别人要打包发布通过 Jenkins 运行脚本。 3 、各种骚操作,但难度比上面两个办法要大。 |
![]() | 54 abcbuzhiming 2021-03-29 23:30:20 +08:00 @3dwelcome 你真实想多了,你服务器都被日穿了,黑客压根不需要调试你的程序,拿到你的程序后,程序本地跑起拦截你的网络连接请求做中间人攻击,就能截到你的账号密码。 最安全的方式永远是不要让黑客接触到你的程序,一旦接触到你的程序了,什么都是白塔。为什么服务器程序在正常情况下默认比客户端程序安全的多,就是因为正常情况下认为黑客是接触不到服务器程序本体的。一旦这道防火墙被打破,靠什么加密程序,都是骗自己的 |
![]() | 55 abcbuzhiming 2021-03-29 23:32:34 +08:00 @bthulu 这倒是一个新奇的思路,可以保证秘钥只在内存里存在,而且很难拿到,问题是,你司启动一个服务要半个到一个小时? |
![]() | 56 freelancher 2021-03-30 00:05:27 +08:00 一堆菜鸡在瞎猜。请个 DBA 。每个账户都可以限定 IP 和权限的。非机器 IP 无法操作。机器都黑进去了。有毛用。 |
![]() | 57 IvanLi127 2021-03-30 00:35:24 +08:00 via Android 一般来说,服务器被入侵了配置文件才可能泄露。可是你家被偷了,你在意这个?人家 hook 你程序搞事情就行了,毕竟正常拿到数据库权限在其他地方也访问不到,权限都限着呢 |
![]() | 58 3dwelcome 2021-03-30 00:48:04 +08:00 @abcbuzhiming "你真实想多了,你服务器都被日穿了,黑客压根不需要调试你的程序,拿到你的程序后,程序本地跑起拦截你的网络连接请求做中间人攻击,就能截到你的账号密码。" 上面提到了,程序是和机器绑定在一起的,换了 IP 或换了硬件配置,程序就自动失效了,接口返回的都是错乱数据。 而且程序本体是封装在 Linux KVM 里面运行的,正常黑客没有 root 密码,系统进都进不去,更别说调试了。 |
![]() | 59 henryhu 2021-03-30 00:48:05 +08:00 防自己人,代码还是程序员写的,是不是得先防程序有后门,防不胜防啊 |
60 jones2000 2021-03-30 00:57:48 +08:00 上线给部署文档如何配置账户, 保存的时候 base64 一下就可以了。明文不行,出了问题运维要跟你扯皮的。由运维组自己去配置账户,开发不用管了。账号泄露也是运维的问题, 跟开发就没什么关系了。 |
![]() | 61 offswitch 2021-03-30 02:35:27 +08:00 配置文件明文就可以了,限制数据库连接 ip,其余毫无意义。 |
![]() | 62 singerll 2021-03-30 07:11:23 +08:00 via Android sql 注入拖库根本不需要账号密码。。 |
![]() | 63 code2019 2021-03-30 07:45:28 +08:00 via iPhone k8s configmap 或者 Apollo 了解下 |
64 chenshun00 2021-03-30 08:59:08 +08:00 给一个坐标,运行获取密码 |
![]() | 65 leeyom 2021-03-30 09:14:46 +08:00 via iPhone 放到配置中心,比如阿波罗 |
![]() | 66 wangyzj 2021-03-30 09:25:08 +08:00 .env 或者配置中心下发 |
![]() | 67 staugur 2021-03-30 09:26:13 +08:00 最简单的不用数据库。。。 |
68 hq136234303 2021-03-30 09:51:49 +08:00 @3dwelcome 没用的你数据加密的方法还是在代码里面的所以没鸡儿用 |
![]() | 69 q149072205 2021-03-30 10:06:48 +08:00 肯定放在配置文件 里啊,如果真有高手能看到你的配置文件,肯定早就攻破系统了。 |
70 tairan2006 2021-03-30 11:01:34 +08:00 用 2 就行,用 3 的一般是企业合规需求 |
71 zlowly 2021-03-30 13:08:35 +08:00 看到这里这么多评论里有这样的好笑的论点:水桶无论有多高,它盛水的高度取决于其中最低的那块木板,所以咱负责的这块木板做成啥样也没用。 |
![]() | 73 hoyixi 2021-03-30 21:09:01 +08:00 真流程规范的公司,开发人员是无法操作正式数据库环境和正式数据的,那是专门的 DBA 的权限。 开发人员只能用开发环境和测试环境的数据库及“假”数据。 |
74 QAQ73 2021-03-31 10:25:58 +08:00 配置文件直接放到服务器中,代码只放测试环境的 |
75 s0nnse 2021-03-31 11:54:17 +08:00 放在配置文件中就可以了,如果要关注服务器的安全问题,更多的需要关注代码逻辑、基线配置的问题。过于看重配置文件的问题,反而是捡芝麻,丢西瓜。 |