事情经过¶
因为平时部署项目喜欢打包成 Docker Image, 好处就不多说, 懂的自然懂. 整个交付流程就是本地开发-打包成镜像-发布到 Docker Register-服务器拉取镜像-新镜像替换旧版容器, 所以作为开发和运维的衔接点 Docker Register 非常重要, 而我选择的就是 Google Cloud 的 Google Container Register, 即 gcr.io.
GCR 有多种授权方式, 我在本地开发的时候喜欢使用 json_key 的方式来进行授权, 不要本地登录, 只需要生成专属的授权 json 文件, 每次 push 的时候同时鉴权就好了.
但是就是因为喜欢使用这种文件的方式, 给自己惹上了麻烦. 我通常直接使用了 Gradle 插件进行 build & push image, 所以直接将授权文件放在了项目根目录, 方便插件通过相对路径访问
docker {
...
registryCredentials {
url = 'https://gcr.io'
username = '_json_key'
password = file(project.rootDir.path + '/gcr_keyfile.json').text
}
...
}
因为正巧要做一个学校的课程设计, 小组使用 github 进行代码协作, 为了方便我直接将项目开源, 却偏偏忘记了将 json_key 加入 .gitignore, json_key 就非常顺利地被发布到了 github 上, 然而当时根本没在意
过了一个小时就收到了好几份 Google 的邮件, 被告知对应的 Google Cloud 项目被停用, 需要进行申诉, 我真是百思不得其解, 这个 Google Cloud project 我只是用作镜像存储, 这是触犯了哪门子的用户协议. 最后在细细阅读了 Google 的几份邮件了, 才意识到"糟了, json_key 被公开了"
匆匆忙忙去 Github 上将项目删除, 本地重新配置 git, 重新上传代码, 然后去和 Google 申诉.
体会¶
感觉 Google Cloud 还是挺厉害的, 能够在这么短的时间内用爬虫检测到用户的不当行为, 及时关停用户项目, 并通知用户, 极大地保证了用户的数据安全.
另外就是, 在管理授权文件的时候, 应该类似于将 ssh 密钥存在 .ssh 一样, 将所有的授权文件存放在固定位置, 然后配置全局变量, 然开发工具可以通过这个变量直接访问到授权文件, 彻底杜绝将私钥放在项目目录当中.