使用包装器二进制文件
对于此特定用例(请参阅下面的重要说明),一种可能性是创建一个support-ssh
专门用于这些传出SSH连接的用户(例如),然后安装一个小型包装器execs /usr/bin/ssh
。
- 不要复制+ chmod
ssh
二进制文件本身,因为您将不记得每次应用安全更新时都要重新复制它。
- 并且不要使用
root
特权更高的用户,因为我相信显而易见的原因。
这是功能上等效的替代方法,用于通过以下折衷sudo
来将特权提升到support-ssh
帐户的特权:
- 比
sudo
,它更小,更精简,因此出现配置错误的风险比您预期的要小。
- 正确编码是您的责任-仅当您非常小心并且(理想情况下)具有安全性至关重要的编码经验时,才可以这样做。
- 可以对其进行定制,使其比
sudo
(例如,但编写的代码越多,就需要对安全性进行审核的代码越多)就越具体。
包装程序二进制文件应设置HOME
为support-ssh
用户的主目录,以便ssh
可以选择适当的ssh_config
私钥。但是,不应允许调用用户阅读~support-ssh/.ssh/
其内容。
包装程序可以很简单:
#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
int main(int argc, char **argv)
{
setenv("HOME", "/home/support-ssh", 1);
/* allow only a single, non-option argument */
if (argc!=2 || *argv[1]=='-') {
fprintf(stderr, "Usage: %s <hostname>", argv[0]);
exit(EXIT_FAILURE);
}
execv("/usr/bin/ssh", argv);
return EXIT_FAILURE;
}
您可能希望限制更多,并检查参数argv[1]
是否在一组允许的主机名中。或更严格的限制,并允许(一部分)选项参数。你可能想完全取代环境变量(但保留重要的,如TERM
,LC_*
等); 请注意,LD_LIBRARY_PATH
并且LD_PRELOAD
特别危险。
scp
如果需要,可以提供类似的包装程序。
适用说明
该答案解决了该问题的具体情况,即合同规定用户必须遵守程序,并且有违反该程序的制裁措施(例如解雇)。它假定您要防止员工随便复制私钥,而不是阻止坚定的攻击者获得未经授权的访问。
我认为,安全既可以通过技术防御也可以通过非技术防御来实现,并且这里或通过使用这种方法实现的平衡sudo
适合当前的情况。