kub*_*ubi 203 git security passwords bash github
我有一个小的Bash脚本,用于访问twitter并在某些情况下弹出Growl通知.什么是处理脚本存储密码的最佳方法?
我想将这个脚本提交给git repo并在GitHub上提供它,但我想知道在执行此操作时保持登录/密码私有的最佳方法是什么.目前,密码存储在脚本本身中.我无法在推送之前将其删除,因为所有旧提交都将包含密码.没有密码的开发不是一种选择.我想我应该将密码存储在外部配置文件中,但我想我会检查是否有一种既定的方法来处理这个问题,然后再尝试把它放在一起.
Gre*_*ill 237
执行此操作的典型方法是从配置文件中读取密码信息.如果调用了配置文件foobar.config
,那么您将提交一个名为foobar.config.example
存储库的文件,其中包含示例数据.要运行程序,您将创建一个foobar.config
使用真实密码数据调用的本地(未跟踪)文件.
要从先前的提交中筛选出现有密码,请参阅删除敏感数据的GitHub帮助页面.
scl*_*cls 24
方法可以是使用环境变量设置密码(或API密钥).因此,此密码不受版本控制.
使用Bash,您可以使用设置环境变量
export your_env_variable='your_password'
Run Code Online (Sandbox Code Playgroud)
这种方法可以与Travis等持续集成服务一起使用,存储在GitHub存储库中的代码(无密码)可以由Travis执行(密码使用环境变量设置).
使用Bash,您可以使用以下方法获取环境变量的值:
echo "$your_env_variable"
Run Code Online (Sandbox Code Playgroud)
使用Python,您可以使用以下方法获取环境变量的值:
import os
print(os.environ['your_env_variable'])
Run Code Online (Sandbox Code Playgroud)
PS:请注意它可能有点风险(但这是一种非常常见的做法)https://www.bleepingcomputer.com/news/security/javascript-packages-caught-stealing-environment-variables/
PS2:dev.to
这篇题为"如何安全存储API密钥"的文章可能很有趣.
Iva*_*van 13
根据您的确切问题是什么,处理存储库中的密码将采用不同的方式。
一些回复中涵盖了避免这样做的方法 - .gitignore、config.example 等
即被允许知道密码的人。chmod
和用户群体浮现在脑海中;还有一些问题,比如如果您在外部托管存储库或服务器,是否应该允许 Github 或 AWS 员工查看内容?
如果要将包含敏感信息(如密码)的配置文件存储在公共位置,则需要对其进行加密。这些文件可以在从存储库中恢复时被解密,甚至可以直接从它们的加密形式中使用。
下面显示了使用加密配置数据的示例 javascript 解决方案。
const fs = require('fs');
const NodeRSA = require('node-rsa');
let privatekey = new NodeRSA();
privatekey.importKey(fs.readFileSync('private.key', 'utf8'));
const config = privatekey.decrypt(fs.readFileSync('config.RSA', 'utf8'), 'json');
console.log('decrypted: ', config);
Run Code Online (Sandbox Code Playgroud)
因此,您只需编写几行 Javascript 即可恢复加密的配置文件。
请注意,将文件config.RSA
放入 git 存储库会有效地使其成为二进制文件,因此它会失去 Git 之类的许多优点,例如挑选更改的能力。
解决方案可能是加密密钥值对或可能只是值。您可以加密所有值,例如,如果您有一个单独的敏感信息文件,或者如果您将所有值都放在一个文件中,则只加密敏感值。(见下文)
我上面的例子对任何想要用它进行测试的人来说都是无用的,或者作为一个例子,因为它假设存在一些 RSA 密钥和加密的配置文件config.RSA
。
所以这里添加了一些额外的代码行来创建 RSA 密钥和一个配置文件。
const fs = require('fs');
const NodeRSA = require('node-rsa');
/////////////////////////////
// Generate some keys for testing
/////////////////////////////
const examplekey = new NodeRSA({b: 2048});
fs.writeFileSync('private.key', examplekey.exportKey('pkcs8-private'));
fs.writeFileSync('public.key', examplekey.exportKey('pkcs8-public'));
/////////////////////////////
// Do this on the Machine creating the config file
/////////////////////////////
const configToStore = {Goodbye: 'Cruel world'};
let publickey = new NodeRSA();
publickey.importKey(fs.readFileSync('public.key', 'utf8'));
fs.writeFileSync('config.RSA', publickey.encrypt(configToStore, 'base64'), 'utf8');
/////////////////////////////
// Do this on the Machine consuming the config file
/////////////////////////////
let privatekey = new NodeRSA();
privatekey.importKey(fs.readFileSync('private.key', 'utf8'));
const config = privatekey.decrypt(fs.readFileSync('config.RSA', 'utf8'), 'json');
console.log('decrypted: ', config);
Run Code Online (Sandbox Code Playgroud)
fs.writeFileSync('config.RSA', JSON.stringify(config,null,2), 'utf8');
Run Code Online (Sandbox Code Playgroud)
您可以使用类似的方法解密带有加密值的配置文件。
const savedconfig = JSON.parse(fs.readFileSync('config.RSA', 'utf8'));
let config = {...savedconfig};
Object.keys(savedconfig).forEach(key => {
config[key] = privatekey.decrypt(savedconfig[key], 'utf8');
});
Run Code Online (Sandbox Code Playgroud)
将每个配置项放在单独的一行(例如Hello
和Goodbye
以上),Git 将更好地识别文件中发生的事情,并将对信息项的更改存储为差异而不是完整的文件。Git 也将能够更好地管理合并和樱桃选择等。
然而,您越想对敏感信息的更改进行版本控制,您就越倾向于使用安全存储库解决方案 (2) 而远离加密信息 (3) 解决方案。
归档时间: |
|
查看次数: |
66693 次 |
最近记录: |