SO_PEERCRED vs SCM_CREDENTIALS - 为什么会有这两个?

Vi.*_*Vi. 9 linux credentials unix-socket

SO_PEERCRED是获取连接的AF_UNIX流套接字的pid/uid/gid的简单方法,SCM_CREDENTIALS或多或少相同,但更复杂(各种辅助消息).指向两种方式的示例链接.

  1. 为什么有两种方法可以获得或多或少相同的信息?
  2. 为什么更简单的SO_PEERCRED没有在unix(7)联机帮助页中列出?
  3. 哪个在现实应用中使用更多?

我该怎么用?

use*_*136 7

  1. 如果我理解正确,两者之间会有细微差别.SO_PEERCRED检索对等进程的凭证,而不需要来自对等进程的任何交互.相反,SCM_CREDENTIALS是一种发送/接收对等进程凭证的机制,然后由内核检查.当进程以UID 0运行时,这种细微差别可能很重要.SCM_CREDENTIALS允许以UID 0运行的进程声明自己的特权较低(例如,UID 50),而这是不可能的SO_PEERCRED.

  2. 往上看.我想SCM_CREDENTIALS鼓励使用,SO_PEERCRED只支持兼容性.

  3. dbus守护进程似乎使用SO_PEERCREDgetpeereid().我认为最好复制他们的代码以便获取凭据.

http://cgit.freedesktop.org/dbus/dbus/tree/dbus/dbus-sysdeps-unix.c?id=edaa6fe253782dda959d78396b43e9fd71ea77e3

  • 还有一个微妙的区别。SO_PEERCRED 为您提供在另一端*创建*套接字的进程的凭据。创建套接字的进程稍后可以删除权限、setuid、setgid 等,并且您的 SO_PEERCRED 结果将保持不变。 (4认同)
  • 为了进一步澄清@jtchitty 的评论 - *created* 意味着调用 *connect*(而不是 *socket*)的时间对等体。 (2认同)

小智 5

SO_PEERCRED返回套接字对等方的凭据。SCM_CREDENTIALS允许您传递您有权限的任何凭据。这是特别有价值的,因为内核将转换 ids,因此一个 pid 命名空间中的任务可以发送 pid 到另一个命名空间中的进程,并确保收到的 pid 将引用它想要的同一进程。

如果您想要同行的凭据,请使用SO_PEERCRED. SCM_CREDENTIAL是调用者指定的凭据(它必须具有特权),不一定是对等方的凭据。