先来抛出三个理由, 若不想看的可以直接跳到操作步骤。(不需 2 分钟就能操作完)
在日常的工作中,我们频繁地与 git
、rsync
和 ssh
等工具打交道,传统的密码身份验证方式可能会变得麻烦且容易受到攻击。可能会有以下问题:
即使使用 SSH 密钥,仍然需要注意私钥的保护。不要贪方便不给 SSH 私钥加密~~(很多人都是这样吧?)
有时候甚至有人贪方便将明文私钥用 QQ 还是什么的来传输到另外的电脑,这其实是很危险的行为。这可是明文的私钥~~
单纯使用加密的私钥其实并不能真正解决输入密码的问题,它只是将你所有的密码扭成用同一个密码而已。而且我们也不可能每一次 git pull
代码都输入一次私钥的密码吧。所以为了解决频繁输入密码的繁琐性以及密码泄露的风险,我们此处引入 SSH-Agent。
它能够 暂存储解密的私钥,使得用户只需在会话开始时输入一次密码,之后的连接将自动使用已解密的私钥。从而大幅减少密码输入次数,避免了密码被窥视或截获的可能性。同时也对于需要频繁与多个远程服务器交互的用户,SSH-Agent 可以显著提高工作效率。
BOSS语录: agent 本质是把 key 加载到内存了,内存泄漏 key 的可能性是有,但是需要非常复杂的方式和漏洞,也要一定的权限,而且现在 os 都有内存地址随机化来抵抗了
假设你本地已经有现成的 SSH 密钥对了。(使用 GitHub 的大家应该都是有的,没有的话可以使用 ssh-keygen
生成,或者看文末的 SSH 相关的文章)
下面这个就是对本地私钥进行加密的命令(<id_rsa_path>
是你本地的 ssh 私钥的路径,一般为 ~/.ssh/id_rsa
)
ssh-keygen -p -f <id_rsa_path>
好了,这就完成加密了。下一步就是启动 ssh-agent。
这就是简易的 启动 ssh-agent
并将你电脑上的默认的密钥对加载到 agent 里面的 Shell 代码:
if [ -z "$SSH_AUTH_SOCK" ] ; then
eval `ssh-agent`
ssh-add # <id_rsa_path>,不加就是用默认值
fi
但这种方式是有很多问题的,你重新开一个 Shell 的会话 agent 就要重新开了,并且你前面的会话结束的时候要是没有关 agent ,那么该 agent 会一直存活在你电脑的进程里面。
⚠️⚠️⚠️ 注意:该方案仅仅适合于个人电脑 ⚠️⚠️⚠️
要解决上述问题,我们建议将 SSH-Agent 的启动设置添加到你的 shell 配置文件中,以便每次开启终端会话时都能自动启动 SSH-Agent 并加载你的私钥。这将提供更大的便利性和安全性。
下面是示例代码,请将它添加到添加到你的 ~/.bashrc
或 ~/.bash_profile
文件中( zsh 则是 ~/.zshrc
或 ~/.zprofile
,我个人是推荐放 rc 文件里面的,毕竟很多情况下是触发不了 login shell 的机制的):
请加到这个文件里面 ~/.config/fish/config.fish
set SSH_ENV_FILE "$HOME/.ssh/agent-environment"
set SSH_TIMEOUT 86400 # 24 hours in seconds
function ssh_start_agent
ssh-agent -c -t "$SSH_TIMEOUT" > "$SSH_ENV_FILE"
chmod 600 "$SSH_ENV_FILE"
source "$SSH_ENV_FILE"
ssh-add # [<id_rsa_path>] Change to your path
end
if test -f "$SSH_ENV_FILE"
source "$SSH_ENV_FILE"
if not ps -p "$SSH_AGENT_PID" > /dev/null
ssh_start_agent
end
else
ssh_start_agent
end
SSH_ENV_FILE="$HOME/.ssh/agent-environment"
SSH_TIMEOUT=86400 # 24 hours in seconds
ssh_start_agent(){
ssh-agent -t $SSH_TIMEOUT | sed 's/^echo/#echo/' > "${SSH_ENV_FILE}"
echo "Initialising new SSH agent succeeded"
chmod 600 "${SSH_ENV_FILE}"
. "${SSH_ENV_FILE}"
ssh-add # [<id_rsa_path>] Change to your path
}
if [ -f "${SSH_ENV_FILE}" ]; then
. "${SSH_ENV_FILE}"
if ! ps -p "$SSH_AGENT_PID" > /dev/null; then
start_ssh_agent
fi
else
ssh_start_agent
fi
(这就是 stackoverflow 里面的高分例子,稍微微调了一下有效时间,电脑一直不关机的话,一天需要打一次密码。虽然会在 ssh forward 情况下存在问题,但个人电脑用是绰绰有余了)
这段代码将在每次开启 shell 会话时检查 SSH-Agent 是否已运行。如果没有运行,它将自动启动并加载你的私钥。通过这种方式,你将始终享受到 SSH-Agent 带来的便利和安全性。(:span[真看不懂可以找找 ChatGPT, 其实关键就在于用文件存起来了 SSH-Agent 的 SSH_AUTH_SOCK
等信息,让其他的 shell 的会话也可以读的到]{.spoiler})
好了,其实操作就上面那么多
当然,使用 ssh-agent 其实也不是说就真的特别安全然后没有后顾之忧了, 其实使用 ssh-agent 还是会有很多问题的。以下就是使用 ssh-agent 的一些注意事项:
ssh-agent
: 如果在受信任程度较低的计算机上运行 ssh-agent
,恶意用户可能通过 ssh-agent
访问你的私密数据,从而危及你的安全。(日常不使用电脑的时候也要进行锁屏,共用的电脑也不要运行)ssh-agent
可以允许代理连接转发,这在某些情况下非常方便。然而,只应该将代理连接转发到你信任的计算机上,以防止你的私密数据被不可信的主机获取。ssh-agent
以避免无授权的访问。这可以通过使用 ssh-agent -k
命令来实现。使用 ssh-agent
时,请遵循以上注意事项以确保你的私密数据和系统安全。
其实管理 ssh 密钥的方案不单单是 ssh-agent , 还可以试一下用 1password 的 cli , 虽然说我没怎么用过。
这篇文章,怎么说呢,其实也就只是我本人的一些安全记录而已,很有可能是在班门弄斧。这一个后面应该会写成一个系列吧,CyberSecurity 系列,尽量就是将我生活当中的一些网络安全的知识给用上。
注意:本文所述内容仅代表个人观点和经验分享,并非绝对准确的安全建议。如需更详细和专业的安全建议,请咨询安全专家或相关文献资料。