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

时间:2012-04-05 22:50:13

标签: linux credentials unix-socket

SO_PEERCRED是获取连接的AF_UNIX流套接字的pid / uid / gid的简单方法,SCM_CREDENTIALS或多或少相同,但更复杂(各种辅助消息)。 Links to example showing both ways

  1. 为什么有两种方法可以获得或多或少相同的信息?
  2. 为什么更舒适的SO_PEERCRED未在unix(7)联机帮助页中列出?
  3. 现实生活中哪些用途更多?
  4. 我应该使用什么?

2 个答案:

答案 0 :(得分:7)

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

  2. 见上文。我想鼓励使用SO_PEERCRED并且仅支持SCM_CREDENTIALS兼容性。

  3. dbus守护程序似乎使用SO_PEERCREDSO_PEERCRED。我认为最好复制他们的代码以便获取凭证。

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

答案 1 :(得分:2)

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

如果您需要对等人的凭据,请使用SO_PEERCREDSCM_CREDENTIAL是调用者指定的凭证(它必须拥有特权),不一定是对等人。