Linux机器上安全存储Telegram API密钥并用于ORCA脚本的方案咨询
我编写了一个部署在大学工作组共享PC上的批量运行量子化学计算软件ORCA的脚本,由于计算耗时较长,希望添加可选功能,让用户能通过Telegram接收计算进度和结果更新。我的实现思路如下:
- 用户用gpg加密自己的Telegram API令牌,设置个人密码短语:
echo "TELEGRAM_TOKEN" | gpg --symmetric --armor --output tgt_USER_NAME.asc
- 所有用户的加密文件存储在公共目录:
~/.asc/usrid1.asc ~/.asc/usrid2.asc ...
- 用户调用脚本时通过
-f参数指定自己的用户ID,开启Telegram通知:
./run_orca -f usrid
- 脚本会提示用户输入密码短语,解密令牌后调用Python脚本发送通知,核心bash脚本代码:
#!/bin/bash # defaults folder="inpsfolder" extension="inp" follow="" while getopts "i:x:f:" opt; do case $opt in (i) folder="$OPTARG";;; (x) extension="$OPTARG";;; (f) follow="$OPTARG" ;; # 用户输入自己的ID(比如jdoe) esac done token_path="~/.asc/${follow}" token="$(gpg --decrypt ${token_path})" if [ $follow!="" ] then python /path/to/script.py -t "$token" # 运行Telegram通知代码 fi
请问这个方案是否安全?是否只有知道自己密码短语的用户才能查看自己的Telegram API令牌?方案整体是否可行?
安全性分析
你的核心安全逻辑是成立的:用户用专属密码短语加密Telegram令牌,只有掌握密码的人才能解密自己的.asc文件,其他用户即使拿到加密文件也无法获取明文令牌。但需要注意几个细节来规避风险:
加密文件目录权限:必须严格设置
~/.asc目录的权限,确保所有用户仅能读取加密文件,无法修改或删除。建议执行以下命令:chmod 755 ~/.asc chmod 644 ~/.asc/*.asc这样可以防止恶意用户替换他人的加密文件,避免用户解密出错误的令牌。
令牌传递的安全隐患:当前脚本通过命令行参数
-t "$token"把明文令牌传给Python脚本,这会导致令牌出现在进程列表中(其他用户用ps aux就能看到)。解决方法是改用标准输入传递令牌:if [ -n "$follow" ]; then echo "$token" | python /path/to/script.py fi同时修改Python脚本从标准输入读取令牌,避免明文暴露在进程命令行中。
内存中的令牌风险:解密后的令牌会暂存在bash变量
token中,脚本运行期间令牌存在于内存中。如果共享PC的管理员不可信,可能通过读取进程内存获取令牌,但大学工作组场景下管理员一般可信,该风险可接受。
可行性分析
方案整体是可行的,核心流程能够实现Telegram通知功能,但需要补充以下细节完善逻辑:
错误处理:添加必要的错误判断,避免脚本在异常情况下继续执行:
# 检查加密文件是否存在 token_path=~/.asc/${follow} if [ ! -f "$token_path" ]; then echo "用户ID不存在,请检查输入" exit 1 fi # 解密并检查结果 token=$(gpg --decrypt "$token_path" 2>/dev/null) if [ $? -ne 0 ]; then echo "解密失败,请检查密码是否正确" exit 1 fi用户ID唯一性:确保
usrid使用大学统一的用户名(或其他唯一标识),避免不同用户ID冲突。进度监控逻辑:当前脚本仅实现了令牌解密和调用Python脚本的逻辑,还需要补充ORCA计算进度的监控逻辑——比如定时扫描ORCA的日志文件,当计算进入特定阶段(如SCF收敛、任务完成)时触发Python脚本发送通知。
内容的提问来源于stack exchange,提问作者J.Doe

