保护通过 Unix 域套接字的进程通信



UNIX域套接字(不是IP域AF_INET中的流套接字)提供了一种基于文件系统所有权/权限的内置安全机制,即UDS客户端只有在UDS服务器由同一用户启动或与服务器属于同一用户组时才能连接到UDS服务器。

我是否会通过检查来自客户端的消息在开始时是否具有特定密码来添加额外的安全层?我想通过这种方式,如果相应的 linux 用户被黑客入侵,我可能会阻止客户端。是否有其他方法可以保护通过 UDS 进行的进程通信?

好的,这就是passwd(1)程序所做的!(自Unix时代以来就是这样做的) 它要求输入密码,因此如果用户有效地被黑客入侵了帐户并且不知道密码,他将无法更改密码,也无法访问该服务。 但是,如果用户能够通过获取pasword以外的其他方式绕过安全性,那么他就破坏了对系统的安全访问,那么为什么不成为root呢? 在这种情况下,他将能够更改密码以访问您的系统并在访问后恢复旧密码,甚至不知道(他只需要复制/etc/shadow文件中的加密密码,更改密码,访问您的系统,并从他制作的副本中恢复加密密码) 仅当原始用户在更改密码时尝试访问系统时, 他会检测到入侵,否则最后一切都会像更改之前一样进行。

无论如何,在这个级别上入侵Unix系统会给你更多的权力,他将能够在背面攻击你的系统,访问内部数据文件或数据库,作为root比作为原始用户更好。

你的想法很好,如果用户不介意每次使用套接字时都必须使用他们的密码,请考虑一下这方面的开销。 您至少会不时询问密码...并且用户在不知道密码的情况下被黑客入侵的可能性非常低。 与所有与安全相关的规范一样,一切都取决于保存在这些套接字后面的信息的值。

如果帐户被黑客入侵或计算机遭到入侵,则在应用程序级别上没有太多事情可做。

尽管如此,在一个正常工作的系统中,如果这是你的应用程序的要求,你通常应该区分不同的用户。在这种情况下,这是这样:

截至man unix(7)

路径名套接字所有权和权限

在 Linux 实现中,路径名套接字尊重权限 它们所在的目录。 创建新套接字失败,如果 进程对 在其中创建套接字的目录。

在 Linux 上,连接到流套接字对象需要写入 该套接字的权限;将数据报发送到数据报套接字 同样需要对该套接字的写入权限。POSIX没有 对权限对套接字的影响做出任何声明 文件,以及在某些系统(例如,较旧的 BSD)上,套接字权限 被忽略可移植程序不应依赖此功能 安全性

(...

辅助消息

辅助数据使用sendmsg(2)recvmsg(2)发送和接收。

(...

SCM_CREDENTIALS

发送或接收 UNIX 凭据。这可用于身份验证。 凭据作为结构辅助消息传递。这 结构在<sys/socket.h>中定义如下:

struct ucred {
pid_t pid;    /* Process ID of the sending process */
uid_t uid;    /* User ID of the sending process */
gid_t gid;    /* Group ID of the sending process */
};

但是,要小心概率!

版本

SCM_CREDENTIALS和抽象命名空间是在 Linux 中引入的 2.2 并且不应在可移植程序中使用。(一些 BSD 派生的系统也支持凭证传递,但实现 细节不同。

因此,最后,如果您需要在运行应用程序的系统的有效用户中区分应用的授权用户,您应该在应用中实现授权消息,返回一些大的随机令牌/cookie,以便在后续调用中包含和验证(如网络调用的授权 cookie)。在内部,您需要一些 ACL 支持。

最新更新