我有一个侦听特定端口的服务器程序。 我有一个要求,即尝试连接到我的服务器的客户端程序必须由root用户启动。 如何在服务器程序中确保这一点?
答案 0 :(得分:1)
我如何确保[关于 客户端程序]在服务器程序中?
你做不到。如果您的安全模型要求服务器知道客户端是否为root,则表示您没有安全性。
让我们考虑一种可能性:您的网络协议包含如下通知:
My-Uid-Is: 0
您的客户端,您编写的完全安全的版本,可能会像这样实现此通知:
fprintf(socketFd, "My-Uid-Is: %d\n", getuid()); // send server my identity
但是,我的客户,即我在您不知情或未经您同意的情况下撰写的内容,将实施以下通知:
fprintf(socketFd, "My-Uid-Is: 0\n"); // lie to server about my identity
流行测验:您的服务器如何知道它是与您的真实客户或我说谎的客户交谈?答:不可以。事实上,如果你概括这个概念,你就会意识到服务器不能依赖任何客户端的有效性(无论是真实性,格式,范围检查等)说。
在这种特定情况下,使用客户端源端口号与任何其他选择一样不可靠。是的,许多操作系统需要root权限才能绑定到低编号的源端口。但我的电脑可能没有运行你最喜欢的操作系统。我可能正在连接我自己的PC,运行我自己的操作系统,但没有这个功能。记住:你不能相信客户所说的任何事情。
有一些涉及公钥加密的技术可用于保证您正在与之交谈的程序可以访问特定的机密。假设秘密得到充分保护,可以用来保证特定的人,计算机或帐户生成请求。我会让别人讨论PKI以及它如何适用于你的情况。
答案 1 :(得分:0)
在连接之前,客户端应绑定到1024以下的端口。此端口范围保留给root。