Вот у меня поднялся коннект. Возможно ли узнать, от какого пользователя запущен процесс на том конце, если с этого конца сидит не root? Я могу при помощи lsof проверить не сидит ли на том конце тот же пользователь что и на этом, и если с этой стороны root могу удостоверится что с той стороны тот кто нужен.
if os.popen( 'lsof -a -u %i -i :%i | grep ":%i->"'%( uid, port, conn.getpeername()[1] ) ).readline() : ... # это правильный чувак
else: ... # отвали!
Но во первых решение через lsof выглядит криво, во вторых как быть если не от рута идет работа? И насколько такие проверки вообще надежны (сейчас скорее речь идет о защите от дурака а не от злоумышленника, но все же...)?
У меня есть демон, в котором отмечаются некоторые фенечки - юзер отметку поставил и только этот же юзер может эту отметку снять. Это можно реализовать через один сокет?
В идеале - права на снятие отметки имеет только тот же процесс, который отметку поставил;-)
AIv★★★★★ ()автор топика
Последнее исправление: AIv
(всего
исправлений: 1)
С ходу ничего простого/общесистемного в голову не приходит.
Если задача допускает доверие, в том смысле что если пользователь
имеет право писать в сокет, то имеет право ставить отметку, то можно
просто в запросе на установку заставить его указывать свой ID и
в запросе на снятие верить указавшему этот ID на слово.
Да, я примерно тоже так в итоге подумал... на самом деле там две задачи - снятие отметки (можно даже не ID а какое нить случайное число использовать), и остановка демона.
Вот с остановкой демона жутко не хотелось связываться pid-файлом...
#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.