探索网络安全新技术
攀登黑客技术最高峰

SSH密钥管理:如何降低泄露的风险?

在保护Linux系统方面,SSH一直是系统管理员使用的最可靠的工具之一。但是,对于每个技术解决方案,都需要仔细管理潜在的陷阱以确保安全性。

在本文中,我们将讨论与 SSH 密钥相关的一些主要风险,不仅在 Linux 上,而且在任何使用 SSH 进行远程访问的系统上。这些风险是:

Stolen private keys 私钥被盗

Malicious keys 恶意密钥

Duplicate keys 重复键

Orphan keys 孤立键

Excessive keys 键过多

Unsecured private keys 不安全的私钥

SSH key options SSH 密钥选项

authorized_keys2 files authorized_keys2文件

Stolen Private Keys

SSH 私钥是远程访问的皇冠上的明珠,密钥被盗是一种严重的风险。入侵者可以使用被盗的密钥来冒充用户、访问敏感数据并完全控制系统。

它们还允许攻击者按下横向移动攻击并快速安静地移动到其他系统。

我们已经看到许多情况下,安全性较差的SSH密钥可能导致泄露,例如:

保留在具有全局可读权限的目录中。
发布在像Slack这样的聊天中。
通过电子邮件发送。
USB 驱动器丢失/放错位置。
管理员或开发人员系统遭到入侵。
系统自动化工具的泄漏使它们留在暴露的目录中。

被盗钥匙的最大问题是没有证据表明它们被盗了。复制数据是完全无声的。大多数组织可能看到的唯一迹象是一些不寻常的登录,如果他们正在注意的话。更糟糕的是,由于SSH密钥本身没有过期,除非经常轮换,否则它们可以工作相当长的时间。

抵消被盗密钥的最佳处理方式是不使用它们。SSH 密钥证书是一种卓越的解决方案,因为它们可以设置为具有较短的过期时间(例如几分钟)。被盗的证书只会变坏并且不起作用。

如果您使用的是 SSH 密钥(与大多数密钥一样),则必须使用定期轮换并确保安全处理它们等策略。如果您可以通过使用凭据保管库来阻止人员处理它们,那就更好了。

然而,在许多钥匙挂在很多年的组织中,这种程度的护理很难管理。您能做的最好的事情就是实施策略和措施,以确保密钥不允许存在超过特定期限或移动到SSH证书(和此处)。

Finding Private Keys

首先,我们建议只在您的系统上查找私钥,以查找不该在的地方徘徊的私钥。特别是,共享系统上用户主目录中的私钥是一个主要风险。

如果任何帐户遭到入侵,攻击者将立即搜索所有用户的私钥。

查找私钥可以像下面的脚本一样简单。密钥可能是加密的,但仍然值得询问用户是否需要他们的私钥在系统上,特别是如果该系统与多个用户共享。

Sandfly 用户可以启用策略扫描,该扫描将自动检查所有用户的私钥。

#!/bin/bash

# This script needs to be run as root to be able to read all user's .ssh directories
if [ "$(id -u)" != "0" ]; then
   echo "This script must be run as root" 1>&2
   exit 1
fi

# Get list of all home directories
home_dirs=$(awk -F':' '{ print $6 }' /etc/passwd)

for dir in $home_dirs; do
    # Check if the .ssh directory exists
    if [ -d $dir/.ssh ]; then
        # Find all files in the .ssh directory that contain the word "PRIVATE"
        private_files=$(grep -lR "PRIVATE" $dir/.ssh 2>/dev/null)

        # If private_files is not empty, report
        if [ ! -z "$private_files" ]; then
            echo "User with home directory $dir has files in their .ssh directory that are likely private keys:"
            echo "$private_files"
        fi
    fi
done

SSH密钥管理:如何降低泄露的风险?-威武网安

Malicious Keys

攻击者插入恶意 SSH 密钥以允许后门访问。通过将新密钥填充到用户的authorized_keys文件中,通过SSH登录到盒子既简单又有效。大多数用户永远不会知道新密钥已经出现。

此脚本将查找过去 24 小时内修改的任何authorized_keys文件,但需要将其设置为在所有系统上运行。其他队列管理工具(如 OSQuery)也可以设置为搜索最近修改的文件,如果您运行它,则应这样做。

Sandfly也有策略警报,也将针对此活动进行扫描。

#!/bin/bash

# This script needs to be run as root to be able to read all user's .ssh directories
if [ "$(id -u)" != "0" ]; then
   echo "This script must be run as root." 1>&2
   exit 1
fi

# Get list of all home directories
home_dirs=$(awk -F':' '{ print $6 }' /etc/passwd)

# Get the current time
now=$(date +%s)

for dir in $home_dirs; do
    # Check if the authorized_keys file exists
    if [ -f $dir/.ssh/authorized_keys ]; then
        # Get the last modification time of the file
        mtime=$(stat -c %Y $dir/.ssh/authorized_keys)

        # Calculate the difference in seconds between now and the file's mtime
        diff=$((now - mtime))

        # If the file was modified in the last 24 hours (86400 seconds), report
        if [ $diff -le 86400 ]; then
            echo "User with home directory $dir has modified their authorized_keys file in the last 24 hours."
        fi
    fi
done

SSH密钥管理:如何降低泄露的风险?-威武网安

无论您选择哪种方式,监视修改后的authorized_keys都会很快找到泄露的凭据,否则这些凭据不会被注意到。

Duplicate Keys

看看下面的这张图片。它有一个重复的SSH密钥,允许立即登录。你能多快发现它?

SSH密钥管理:如何降低泄露的风险?-威武网安

实际上在上图中,它有三个重复的键。人类很难通过快速查看来确定密钥是否具有重复项(更不用说跨许多系统和用户进行查看了)。

authorized_keys中存在的重复 SSH 密钥是指当密钥存在两次或更多次时发生的情况。这意味着,如果您删除密钥以禁止将来登录,则未注意到的重复项仍将允许密钥持有者登录到主机。

我们看到许多客户检测到Sandfly检测到重复的密钥。很容易发生以下一些错误:

用户粘贴已存在但不知道的键。

管理密钥文件的系统自动化工具出错并插入密钥一次或多次。

还原的备份具有存在重复密钥的旧authorized_keys文件。

恶意软件会插入后门密钥一次或多次,因为它们没有检查是否已丢弃密钥。

重复的密钥是一种独特的威胁,因为与更改密码不同,删除密钥可能不会阻止登录(如果它仍然存在)。由于难以发现这种情况,因此必须实现自动化。

默认情况下,Sandfly 会查找此活动,但此脚本将立即搜索重复的键:

#!/bin/bash

# This script needs to be run as root to be able to read all user's .ssh directories
if [ "$(id -u)" != "0" ]; then
   echo "This script must be run as root." 1>&2
   exit 1
fi

# Get list of all home directories
home_dirs=$(awk -F':' '{ print $6 }' /etc/passwd)

for dir in $home_dirs; do
    # Check if the authorized_keys file exists
    if [ -f $dir/.ssh/authorized_keys ]; then
        # Sort keys, count duplicates, and print any with count > 1
        echo "Processing $dir/.ssh/authorized_keys."
        sort "$dir/.ssh/authorized_keys" | uniq -c | while read count key
        do
            if [ "$count" -gt 1 ]; then
                echo "$key is duplicated $count times"
            fi
        done
    fi
done

SSH密钥管理:如何降低泄露的风险?-威武网安

Orphan Keys

孤立密钥是在删除相应用户或不再需要其访问权限后保留在系统上的密钥。如果这些密钥遭到入侵,它们会提供一个后门入口点。

可以通过设置适当的密钥取消预配过程和定期审核来清理任何孤立密钥来缓解此风险。

如果您已经使用SSH authorized_keys一段时间,那么您现在可能拥有孤立密钥。唯一的方法是手动查看您的authorized_keys文件并删除您知道不再需要的密钥。在大多数情况下,只需获取您知道应该允许以用户身份访问的密钥列表并清除较旧的authorized_keys文件并重新开始,效果会更好。

虽然查看authorized_keys文件上的时间戳可以显示上次添加密钥的时间,但它不会为您提供旧密钥的日期,因此您无法为它们首次出现的时间分配任何时间。

确定密钥存在多长时间的唯一方法是,如果您集中跟踪它们,并且可以将密钥第一次作为主机中的锚点值出现(如Sandfly SSH Hunter所做的那样)。仅文件时间戳无法帮助您在此处找到较旧的密钥。

这是一项繁琐的任务,也是访问管理authorized_keys的最大危险之一。

Excessive Keys

authorized_keys文件中密钥过多的用户是另一个潜在的攻击媒介。这会导致许多问题,主要是许多人可以使用相同的用户名登录,这使得审计变得更加困难。但它也会导致孤儿键(如上所述)。通常没有人会回去删除旧密钥,列表可能会增长。

什么是密钥数量过多?好吧,我们认为一个用户的一个密钥是限制。但实际上,这仅取决于您的组织。我们已经看到带有近百个密钥的用户名,允许人们以它们的身份登录(例如 git 或 root)。

我们认为这很可能导致妥协。我们建议尽可能缩短每个用户允许登录的密钥。

下面的脚本将在所有本地用户主目录中搜索authorized_keys具有 10 个或更多键作为起点的文件。

#!/bin/bash

# This script needs to be run as root to be able to read all user's .ssh directories
if [ "$(id -u)" != "0" ]; then
   echo "This script must be run as root." 1>&2
   exit 1
fi

# Get list of all home directories
home_dirs=$(awk -F':' '{ print $6 }' /etc/passwd)

for dir in $home_dirs; do
    # Check if the authorized_keys file exists
    if [ -f $dir/.ssh/authorized_keys ]; then
        # Count the number of keys (lines) in the file
        num_keys=$(wc -l < $dir/.ssh/authorized_keys)

        # If 10 or more keys, report
        if [ $num_keys -ge 10 ]; then
            echo "User with home directory $dir has $num_keys keys in their authorized_keys file."
        fi
    fi
done

Unsecured Private Keys

一个常见的错误是不加密私钥。如果私钥未加密,则在被盗时很容易被滥用。密钥应静态加密,存储介质(如文件系统)也应得到适当保护。

用于保护密钥的密码短语应为强密码。

您可能还希望增加用于检查密码短语的轮次,以减慢暴力尝试(ssh-keygen -a),以防密钥被盗。

重要的是要记住,密码短语是一种权宜之计。如果攻击者可以访问您的系统,那么您必须假设他们使用键盘记录器窃取了您的密码,或者他们可以离线发起暴力攻击。

但是,作为额外的安全措施,如果密钥以其他方式丢失(例如笔记本电脑被盗,USB驱动器丢失等),对其进行加密确实有帮助。

SSH Key Options

SSH 密钥选项的使用本身就是另一篇文章,但通常要警惕以下选项及其使用方式。OpenSSH 手册页中提供了完整的选项列表,但这些选项尤其需要密切关注:

代理转发 – 可以允许控制远程系统的人模拟用户登录,并且应正确配置以确保安全。

命令 – 可以允许某人在使用此密钥登录时以用户身份运行命令。

环境 – 可以允许为使用密钥登录的用户设置环境变量。如果远程服务器允许将它们传递到终端会话,这可能会导致安全问题。

端口转发 – 允许客户端系统绕过防火墙和网络控制转发端口。

user-rc – 可以允许系统在登录时运行 ~/.ssh/rc 以用户身份执行命令。

X11 转发 – 允许通过 SSH 转发 X11 协议,再次绕过防火墙和网络控制。

您可以在所有密钥上设置限制选项,以自动禁用上述大多数选项以及将来可用的其他潜在风险选项。

SSH authorized_keys2 Files

有一个 SSH authorized_keys2 文件的工作方式与authorized_keys类似,但已弃用。如果此文件存在,它可能仍允许在较旧的服务器上登录。它的存在几乎总是恶意隐藏访问。

如果您在用户的主目录中看到此文件,您应该提出一些尖锐的问题。如果用户不知道文件存在的原因,则应立即调查系统。

同样,在较新的系统上,它可能不起作用,但仍然值得调查它是否存在,因为有人把它放在那里认为它可能有效。

此脚本将在任何本地用户的目录下找到authorized_keys2文件:

#!/bin/bash

# This script needs to be run as root to be able to read all user's .ssh directories
if [ "$(id -u)" != "0" ]; then
   echo "This script must be run as root." 1>&2
   exit 1
fi

# Get list of all home directories
home_dirs=$(awk -F':' '{ print $6 }' /etc/passwd)

for dir in $home_dirs; do
    # Check if the authorized_keys2 file exists
    if [ -f $dir/.ssh/authorized_keys2 ]; then
        echo "An authorized_keys2 file was found at: $dir/.ssh/authorized_keys2."
    fi
done

结论

SSH是Telnet等传统协议在安全性方面的一大进步。但是,SSH密钥的管理是出了名的困难并且容易被盗。如果您的组织不监视SSH密钥使用情况,则很有可能在某个时候发生泄露。

威武网安强烈建议监控SSH密钥是否存在滥用,因为对于希望进入Linux系统且未被发现的入侵者来说,它是一个无声的跟踪者。请务必使用上面列出的技术来检查您的系统,来保证系统安全性。

打赏
版权声明:本文采用知识共享 署名4.0国际许可协议 [BY-NC-SA] 进行授权
文章名称:《SSH密钥管理:如何降低泄露的风险?》
文章链接:https://www.wevul.com/1707.html
本站所有内容均来自互联网,只限个人技术研究,禁止商业用途,请下载后24小时内删除。

文章推荐

如果文章对您有帮助 请不要吝啬 打赏一下小站

支付宝扫一扫打赏

微信扫一扫打赏

登录

找回密码

注册