LINUX.ORG.RU

Как при коннекте по 127.0.0.1 проверить юзера на том конце сокета?

 


0

1

Сабж. Вот у меня есть на сервере сокет (из модуля socket):

s = socket.socket( socket.AF_INET, socket.SOCK_STREAM )
s.setsockopt( socket.SOL_SOCKET, socket.SO_REUSEADDR, 1 )
s.bind(('127.0.0.1',port))
s.listen(5)

conn, addr = s.accept()
Вот у меня поднялся коннект. Возможно ли узнать, от какого пользователя запущен процесс на том конце, если с этого конца сидит не root? Я могу при помощи lsof проверить не сидит ли на том конце тот же пользователь что и на этом, и если с этой стороны root могу удостоверится что с той стороны тот кто нужен.
if os.popen( 'lsof -a -u %i -i :%i | grep ":%i->"'%( uid, port, conn.getpeername()[1] ) ).readline() : ... # это правильный чувак
else: ... # отвали!
Но во первых решение через lsof выглядит криво, во вторых как быть если не от рута идет работа? И насколько такие проверки вообще надежны (сейчас скорее речь идет о защите от дурака а не от злоумышленника, но все же...)?

★★★★★

точно сказал Вяся Пупки! использовать сетевые сокеты — нужно только по сети! :-)

а для внутреннего общения — есть масса другие вещей..

кроме AF_UNIX — есть например и dBus ...

(хотя один фиг — dBus работает через AF_UNIX :D))

user_id_68054 ★★★★★
()
Ответ на: комментарий от user_id_68054

Спасибо за ценное замечание. Но - как для AF_UNIX узнать пользователя на том конце сокета? Потому что lsof опять таки его не видит, не хватает прав?

AIv ★★★★★
() автор топика
Ответ на: комментарий от AIv

Да, lsof не может залезть в чужой /proc/PID/...
Но совет, видимо, был к тому, что на unix-сокет можно выставить права и поменять группу.

ABW ★★★★★
()
Ответ на: комментарий от ABW

У меня есть демон, в котором отмечаются некоторые фенечки - юзер отметку поставил и только этот же юзер может эту отметку снять. Это можно реализовать через один сокет?

В идеале - права на снятие отметки имеет только тот же процесс, который отметку поставил;-)

AIv ★★★★★
() автор топика
Последнее исправление: AIv (всего исправлений: 1)
Ответ на: комментарий от AIv

не пойму смысла использовать транспортный уровень для определения прав пользователя. чем вам не угодил тот же XML-RPC?

AGUtilities ★★★
()
Ответ на: комментарий от AGUtilities

Во первых я в сетевых вопросах полный нуб. Во вторых, тут чем проще будет, тем лучше.

AIv ★★★★★
() автор топика
Ответ на: комментарий от AIv

поверь мне, лучше не нужно лепить аутентификацию на транспортном уровне.

AGUtilities ★★★
()
Ответ на: комментарий от AIv

С ходу ничего простого/общесистемного в голову не приходит.
Если задача допускает доверие, в том смысле что если пользователь имеет право писать в сокет, то имеет право ставить отметку, то можно просто в запросе на установку заставить его указывать свой ID и в запросе на снятие верить указавшему этот ID на слово.

ABW ★★★★★
()
Ответ на: комментарий от ABW

Да, я примерно тоже так в итоге подумал... на самом деле там две задачи - снятие отметки (можно даже не ID а какое нить случайное число использовать), и остановка демона.

Вот с остановкой демона жутко не хотелось связываться pid-файлом...

AIv ★★★★★
() автор топика
Ответ на: комментарий от nanoolinux

Ни на одной из наших машин эта фиговина похоже не развернута, так что не вариант - лишняя зависимость как мин.

AIv ★★★★★
() автор топика
Ответ на: комментарий от tailgunner

А можно подробнее, что мне с этим делать? Ну то есть флаг то я поставлю, а дальше... ;-(

AIv ★★★★★
() автор топика
Ответ на: комментарий от AIv

А можно подробнее, что мне с этим делать?

Как уже сказано постом выше:

#if defined(SO_PEERCRED)
  socklen_t l;
  struct ucred cred;
  /* initialize client information (in case getsockopt() breaks) */
  cred.pid=(pid_t)0;
  cred.uid=(uid_t)-1;
  cred.gid=(gid_t)-1;
  /* look up process information from peer */
  l=(socklen_t)sizeof(struct ucred);
  if (getsockopt(sock,SOL_SOCKET,SO_PEERCRED,&cred,&l) < 0)
    return -1; /* errno already set */
  /* return the data */
  if (uid!=NULL) *uid=cred.uid;
  if (gid!=NULL) *gid=cred.gid;
  if (pid!=NULL) *pid=cred.pid;
  return 0;

Втупую переведи это на Python через socket и struct.

tailgunner ★★★★★
()
Последнее исправление: tailgunner (всего исправлений: 1)
Ответ на: комментарий от tailgunner

Втупую переведи это на Python через socket и struct.

Не работает;-(

Во первых у меня ни в 2.6.6 ни в 2.7.2 нету SO_PEERCRED, но оно вроде 16. Во вторых

s.getsockopt( SOL_SOCKET, 16, 12 )
возвращает '\x01\x00\x00\x00' хоть ты убейся;-(

AIv ★★★★★
() автор топика
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.