我已经在我的 macOS 笔记本电脑和 24x7 运行的服务器上设置了 ssh-agent。为什么我需要在每次注销时杀死 ssh-agent?
我对 ssh-agent 的了解来源:https://kb.iu.edu/d/aeww
eval `ssh-agent` # Start ssh-agent
echo $SSH_AGENT_PID # 20552 (Check ssh-agent is running)
ssh-add # Add id_rsa key to ssh-agent
kill $SSH_AGENT_PID # Kill ssh-agent on logout
为什么需要最后一步?
ssh-agent
杀死进程的方法
我发现找到所有正在运行的 shh-agent 进程的最简单方法
ps ax | grep ssh-agent # outputs details of processes
或者
pgrep ssh-agent # outputs list of PIDs only
我发现终止所有正在运行的 ssh-agent 进程的最简单方法
pkill ssh-agent
答案1
如果您不手动将其杀死,代理将驻留在您的系统中。
除了一般原则上不整洁之外,这还有两个潜在的问题:
正如 Kusanalanda 指出的那样,这意味着
ssh-agent
每次登录时您都会生成另一个进程,这在进程表上会变得有点草率,即使它们的足迹可能可以忽略不计。更严重的是,每个过程都会有你的解锁他们内存中的私钥。如果攻击者要访问您的系统并利用内核内存管理或代码
ssh-agent
本身中的(假设的,我目前不知道存在任何)错误来可能提取您的私钥。
当然,最后一种可能性很低,但终止该进程并完全消除风险同样容易。
安全总比后悔好。
答案2
你不有到。但您可能至少要确保代理的内存中没有未锁定的密钥,并且不会留下过多的代理。
为此,您可以:
- 告诉代理仅将密钥保留在内存中有限的时间(
ssh-agent -t 1800
从 30 分钟超时开始,或ssh-add -t 1800
在添加密钥时使用) - 让代理在您注销时删除所有密钥(
ssh-add -D
从注销脚本中);和 - 登录时,检查代理是否已在运行,并使用该代理而不是启动新代理。下面是一种方法。
# .bashrc
start_ssh_agent() {
if [ -e ~/.agent ]; then
. ~/.agent
fi
ssh-add -l > /dev/null 2>&1
if [ "$?" = "2" ] ; then
# agent not running, start it
ssh-agent -t 3600 |grep -v ^echo > ~/.agent
. ~/.agent
echo "Started SSH agent with PID $SSH_AGENT_PID"
fi
}
start_ssh_agent
当然,还有其他方法。特别是,您可以使用代理套接字的固定路径。参见例如如何让 ssh-agent 在所有终端上工作?
另一方面,如果有人可以从您的 SSH 代理获取密钥,即读取您进程的程序内存,他们也可能可以做其他事情。例如更改设置以禁用超时,或安装修改后的程序ssh-add
,向他们发送密钥和密码的副本。