为什么我应该在注销时杀死 ssh-agent?

为什么我应该在注销时杀死 ssh-agent?

我已经在我的 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

如果您不手动将其杀死,代理将驻留在您的系统中。

除了一般原则上不整洁之外,这还有两个潜在的问题:

  1. 正如 Kusanalanda 指出的那样,这意味着ssh-agent每次登录时您都会生成另一个进程,这在进程表上会变得有点草率,即使它们的足迹可能可以忽略不计。

  2. 更严重的是,每个过程都会有你的解锁他们内存中的私钥。如果攻击者要访问您的系统并利用内核内存管理或代码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,向他们发送密钥和密码的副本。

相关内容