如何安全向命令行工具传递凭证,避免泄露至ps输出?
避免Cloudflare API密钥在
ps输出中泄露的临时方法 问题背景
执行以下curl命令调用Cloudflare API时:
curl -s 'https://api.cloudflare.com/client/v4/zones/{zone_identifier}/logpush/jobs' \ -H "X-Auth-Email: carl@example.com" \ -H "X-Auth-Key: abc123"
密钥abc123会在Shell历史记录、终端输出、ps命令输出三处泄露。即使改用$(pass show cloudflare-api-key)替换硬编码密钥,密钥仍会出现在ps输出中,存在被本地进程窃取的风险。
实用解决方案
以下几种临时方法可避免密钥出现在ps输出中:
1. 环境变量传递(推荐)
通过环境变量传递密钥,子进程会继承环境变量但ps不会显示进程的环境变量内容:
# 方式1:临时设置环境变量,仅当前shell会话有效 CF_API_KEY=$(pass show cloudflare-api-key) curl -s 'https://api.cloudflare.com/client/v4/zones/{zone_identifier}/logpush/jobs' \ -H "X-Auth-Email: carl@example.com" \ -H "X-Auth-Key: $CF_API_KEY"
若不想污染当前shell环境,可使用子shell一次性执行:
# 方式2:子shell执行,环境变量仅在该命令生命周期内有效 CF_API_KEY=$(pass show cloudflare-api-key) curl -s 'https://api.cloudflare.com/client/v4/zones/{zone_identifier}/logpush/jobs' \ -H "X-Auth-Email: carl@example.com" \ -H "X-Auth-Key: $CF_API_KEY"
2. 进程替换传递
利用进程替换读取密钥,避免密钥出现在命令参数中:
curl -s 'https://api.cloudflare.com/client/v4/zones/{zone_identifier}/logpush/jobs' \ -H "X-Auth-Email: carl@example.com" \ -H "X-Auth-Key: $(< <(pass show cloudflare-api-key))"
3. 临时curl配置文件
创建仅自己可读的临时配置文件,用完立即删除:
# 生成临时配置文件 cat > /tmp/cf_api_config.tmp << EOF X-Auth-Email: carl@example.com X-Auth-Key: $(pass show cloudflare-api-key) EOF # 限制文件权限,避免其他用户读取 chmod 600 /tmp/cf_api_config.tmp # 调用API curl -s 'https://api.cloudflare.com/client/v4/zones/{zone_identifier}/logpush/jobs' --config /tmp/cf_api_config.tmp # 清理临时文件 rm /tmp/cf_api_config.tmp
内容的提问来源于stack exchange,提问作者Carl Patenaude Poulin
相关产品推荐
相关产品推荐

