太多/太多的公共 SSH 密钥

Bud*_*sey 1 ssh scalability ssh-keys

我的任务是尝试/探索的一项新任务是设置一个服务器,该服务器基本上可以让 200 到 300 人通过 ssh 连接到单个用户来运行任务。他们可能只需要一天做一次或一天几次。问题是他们每个人都可以根据需要连接任意数量的设备。在外部机会,他们每个人都有 3 或 4 个设备来拥有公共 ssh 密钥,我们可能会在 autorized_keys 文件中获得多达 1000 个密钥。考虑到它实际上只是一个文本文件,1000 个键可能会影响性能。

有没有办法将密钥提取到数据库或其他东西而不是authorized_keys文件中?

出于好奇,这对于 1000 个用户来说可能不是什么大问题,但它让我想知道像 github 这样的人如何在他们的 git@github.com 用户上处理 500,000 个用户。我知道我个人有 3 个不同的密钥与我的帐户相关联,而且我知道许多其他人有多个。我不习惯这样规模的东西,所以我真的很奇怪。LDAP 管理这个的性能好吗?甚至某种 ssh 网关?

小智 5

如果您有超过 1,000,000 个条目,您才真正需要一个数据库。每个密钥都非常小(甚至不是千字节)。只要文件小于,比如说,20 兆字节,读取文件是微不足道的(我们在这里谈论毫秒)。你更大的问题是负载平衡。如果您有数百个并发用户,那么您很快就会遇到资源问题。

您的用例(1000 个密钥)将产生大约 400 KB 的 ssh 密钥文件。没什么大不了的。我的蹩脚脚本花了 30 毫秒才能读取该文件。将它加倍或三倍进行解析,这仍然不是什么大问题。

在读取文本文件成为问题之前,您需要让另一台服务器来处理负载。

在服务器方面,大是相对的。500,000 对于解析文本文件来说并不是什么大问题。例如,我的 id_rsa.pub 文件是 400 字节。一点都不大。让我们将其乘以 500,000。我们得到 190 兆字节。这是比较大的,但不是太大。我编写了一个简单的 NodeJS 脚本来读取 174 兆字节大的文件,并且耗时不到 2 秒。这是在常规(非服务器级)硬盘驱动器(7200 RPM)上,甚至不在突袭中。

SSH 不必每次都读入整个文件,并且该文件可能会被缓存到内存中。在任何一种情况下,对于像 SSH 访问这样的一次性过程来说,几秒钟的加载时间都不是什么大问题。

github 背后的美妙之处在于用户实际上并没有 SSH 访问权限。用户只能推送代码,不能直接连接服务器。这当然是一个安全问题,但也绝对是一个性能问题。

我很确定像 github 这样的地方有一些服务器来处理负载。