在我们的 Debian 服务器上,我希望确保任何 SSH 连接都会在 8 小时后超时并断开连接。这是我们的安全顾问推荐的。
我执行了以下步骤:
# Log in as root then:
sudo vi /etc/ssh/sshd_config
# Use / to search for and change:
ClientAliveInterval=3600
ClientAliveCountMax=8
# Second parameter is number of hours before connection times out and drops.
# Then test config:
sudo sshd -t
# Restart
sudo systemctl restart sshd
然而,测试失败了。当我临时设置ClientAliveInterval=120
并ClientAliveCountMax=2
重新启动 sshd 守护进程时,我预计连接会在 4 分钟不活动后断开。然而,事实并非如此。
有任何想法吗?
OpenSSH
sshd_config
自 OpenSSH 9.2(Debian 12)以来正确的配置关键字
OpenSSH 9.2(2023 年 2 月 2 日)引入了针对非活动会话的新功能。
对于本题中的八个小时,例如,
在哪里:
*=8h
所有通道。如果您希望任何通道上的活动重置超时,请使用特殊关键字global=8h
。UnusedConnectionTimeout
为一分钟,以便在最后一个通道关闭后立即终止连接。对于 OpenSSH < 9.2,必须通过其他方式来完成。
使用的配置关键字用于无响应的会话
并不
ClientAliveInterval
监视不活动的情况而是监视客户端是否仍然有响应。以下文档
ClientAliveCountMax
可能有助于理解这一点:📜历史记录:在OpenSSH 8.2(2020 年 2 月 14 日)之前
ClientAliveCountMax
, 与 的工作方式不同0
,其副作用是它可能被用于终止空闲连接。来自变更日志:⚠️然而,这种误导性的指令已在整个互联网上重复:
其中,只有 Gite
ClientAliveCountMax=0
可以在 2020 年之前工作,但这算吗?毕竟,这篇文章很可能是在 2021 年写的……这让我想知道是否有人阅读过文档,或者他们正忙着复制粘贴其他人的博客文章。🤦♂️深入讨论替代方案
脚本——小心谨慎,正确检测不活动
Hayden James 给出了一个使用脚本自动化进程的示例。但是,使用该脚本很危险,因为它可能会终止正在使用的 SSH 会话。该脚本获取“空闲时间”,其中
ps -eo pid,etimes,comm
不etimes
显示进程的空闲时间,而是显示进程运行的总时间。来自ps(1):Satish Kumar建议使用
who
来列出活跃用户,并使用 的第五列w -h
来检测不活跃用户。但是,这个脚本也有一些缺陷:2.00s
、7:51m
或5days
。[[ "$idle" -gt "1800" ]];
无法正确解析。screen
、tmux
)和其他旨在存在于活动 SSH 会话之外的进程。对不活动状态的检测应该更加精确,对要终止的进程的选择也应该更加精确。
这种方法可能有效:
who
。stat
获取 TTY 设备的最后访问时间(参见Celada 的解答)。 可以直接转换为以秒为单位的年龄:pgrep
查找sshd
TTY 的进程,或者pkill
终止它们。全部放在一起(更完整的内容
find-inactive-ssh-sessions.sh
请参见 oh2fih/ Misc-Scripts):Shell 中的内置功能
正如Vivek Gite所提到的,shell 具有在一段时间不活动后自动注销用户的功能。如果不需要强制注销,这些功能可能会有用,因为用户可以更改这些设置。
TMOUT
bash
、zsh
&的环境变量ksh
。autologout
设置tcsh
&csh
。如果您通过例如配置这些
/etc/profile.d/
,它们将影响所有会话。但是,您也可以使用中的功能sshd_config
来配置它们:SetEnv
&ForceCommand
。例如,这个推荐从何而来?
该建议可能基于NIST 800-171 修订版 2:
您应该决定哪一个对您更重要:防止某人未经许可使用连接还是管理连接的可靠性。是否可以通过其他方式防止未经授权的使用?例如,是否可以将 SSH 连接仅限于公司计算机,是否可以强制锁定不活动的公司计算机?