Linux за българи: Форуми

Linux секция за начинаещи => Настройка на програми => Темата е започната от: Hmmm в May 18, 2012, 15:26



Титла: Как да изпълним скрипт, за който текущият потребител няма права?
Публикувано от: Hmmm в May 18, 2012, 15:26
Ситуация:
  - Линукс сървър с Апачи
  - Сайт на виртуален хост, изпълняващ се под определен линкус потребител, без "админ" права
  - Скрипт, достъпен единствено до "админ" потребител

Скрипта изпълнява системни операции и никой друг потребител освен определен "админ" потребител не трябва да има права до него. Необходимо е обаче, когато се случи определено събитие на сайта, да се стартира скрипта. Както по-горе трябва да е станало ясно, потребителя на сайта няма достъп до скрипта.

Начин, по който е имплементирано в момента:
  - Инсталирана база данни, достъпна до потребителя на сайта и до "админ"
  - При събитието на сайта се добавя запис в определена таблица (опашка)
  - През 1 мин се изпълнява "админ" скирпта под неговите си права, проверява за необработени записи в базата, ако има прави валидация и обработва.

Неприятното е, че трябва да се чака до 1мин преди да се стартира операцията. Искам да избегна това чакане, ако може и изобщо да изпълнявам скрипта всяка минута, и да се изпълни на момента, в който е необходимо - при събитието в сайта, след добавянето на записа в базата.


Титла: Re: Как да изпълним скрипт, за който текущият потребител няма права?
Публикувано от: b2l в May 18, 2012, 15:29
Скрипта изпълнява системни операции и никой друг потребител освен определен "админ" потребител не трябва да има права до него.

Какви?


Титла: Re: Как да изпълним скрипт, за който текущият потребител няма права?
Публикувано от: Kedr в May 18, 2012, 15:43
man sudoers.


Титла: Re: Как да изпълним скрипт, за който текущият потребител няма права?
Публикувано от: edmon в May 18, 2012, 23:32
може да си напишеш демон, който  като промениш стойност в някой файл който демона чете постоянно да стартира скрипта....:)))


Титла: Re: Как да изпълним скрипт, за който текущият потребител няма права?
Публикувано от: v_badev в May 19, 2012, 10:08
Малка вариация на темата е да направиш демон, който да чака команди от сокет файл ($2). Така ще избегнеш четенето от диска в цикъл.
Все пак решението със sudo, което Kedr предложи ми се струва по-правилно.


Титла: Re: Как да изпълним скрипт, за който текущият потребител няма права?
Публикувано от: edmon в May 19, 2012, 16:56
И наистина какъв е  най-добрия вариант, някаква лелка да задава спиране и пускане на някакви предварително зададени правила за айпитейбълс през уеб интерфейс????


Титла: Re: Как да изпълним скрипт, за който текущият потребител няма права?
Публикувано от: dejuren в May 20, 2012, 17:27
IMHO wеб-лице, което представлява един бутон/няколко бутона, извикващи изпълнението на скрипт със sudo, с права за изпълнение единствено на скрипта (sudo на веб-сървър потребителя, вероятно apache). След като ще си играем с iptables се налага добра защита на страницата с бутоните от неоторизира достъп.
http://httpd.apache.org/docs/2.0/howto/auth.html

Не претендирам варианта да е най-добрия, но ще е прост и ефективен.


Титла: Re: Как да изпълним скрипт, за който текущият потребител няма права?
Публикувано от: Kedr в May 20, 2012, 18:29
ssh -X или ssh -Y <адрес> <потребител> <програмата на сървър> ще ти даде графичен интерфейс к админските бутони и пълен контрол на достъп.


Титла: Re: Как да изпълним скрипт, за който текущият потребител няма права?
Публикувано от: Hmmm в Jun 26, 2012, 12:52
Реших да пробвам варианта със sudoers, защото ми изглежда "най-естествен", обаче не мога да го докарам до желания резултат.

Първото, което не ми е ясно е какви пърмишъни трябва да има файлът команда - ако собственикът му е root и има 700, то добавянето на потребител web в sudoers ще позволи ли неговото изпълнение от web?

Например добавям следното в sudoers
web ALL = (root) NOPASSWD:/tmp/command.sh

При моите тестове /tmp/command.sh не може да се изпълни от web, ако е с права 700.
Ако му дам права 755 се изпълнява, но това означава, че всеки може да я изпълни и прочете, нещо което не искам.

Сега се сещам, че сигурно в command.sh мога да направя проверка и ако потребителя не е root, да не я изпълнявам. Или като се размислих... вероятно мога да имам още един файл с права 700, в който стои реалния код и който да извиквам от command.sh. По този начин, вторият файл няма да бъде достъпен по никакъв начин за друг освен root и щом command.sh се извиква през root тя ще се изпълни коректно, иначе не.


Титла: Re: Как да изпълним скрипт, за който текущият потребител няма права?
Публикувано от: Hmmm в Jun 26, 2012, 15:24
Тествах последната идея с двата файла, изглежда че работи точно, както се иска.


Титла: Re: Как да изпълним скрипт, за който текущият потребител няма права?
Публикувано от: SmashThePain в Jun 26, 2012, 16:00
Вече ти написаха за sudoers.

Ако искаш друга алтернатива. Правиш скрипта с права 700. Правиш едно байнари с права 4755 и си готов:
Код:
#include <stdio.h>
#include <stdlib.h>
#include <sys/types.h>
#include <unistd.h>

int main()
{
   setuid(0);
   system("/path/script.sh");

   return 0;
}

http://www.tuxation.com/setuid-on-shell-scripts.html

BTW: Ти с каква дистрибуция си, че може да изпълняваш шел скриптове с ефективното ид на супер потребител?


Титла: Re: Как да изпълним скрипт, за който текущият потребител няма права?
Публикувано от: Hmmm в Jun 26, 2012, 20:04
Това и направих - файлът, който добавих в sudoers е с права 755 и той извиква същинския скрипт, който върши работата - с права 700.
Варианта, който използвам за първия скрипт, този с 755 правата е:
Код:
#!/bin/bash
/path/to/worker.sh

Нямам идея, какво трябва да значи "шел скриптове с ефективното ид на супер потребител" и не съм задавал никога 4755 за права, а само 755. Убунту сървър е дистрибуцията.


Титла: Re: Как да изпълним скрипт, за който текущият потребител няма права?
Публикувано от: sudo в Jun 26, 2012, 20:48
Преди 8 години съм го писал това: http://www.linux-bg.org/cgi-bin/y/index.pl?page=article&id=advices&key=362203531 но предполагам че все още е валидно.


Титла: Re: Как да изпълним скрипт, за който текущият потребител няма права?
Публикувано от: SmashThePain в Jun 26, 2012, 23:46
@Hmmm в *NIX може да изпълняваш програми с id-то на собственика на файла. Тоест виртуално се представяш за него. Това става посредством ефективното id.

Може да даваш сетваш suid посредством chmod. 
Код:
man chmod


Първата октета от правата е именно за това нещо:
Код:
1 - Sticky bit 
2 - Set group ID
4 - Set user ID

Ta ако разгледаш правата на /usr/bin/passwd ще видиш че е сетнато Set user ID. Точно поради тази причина, можеш да променяш паролата на потребителя ти без да се налага да си root.

За шел скриптовете обаче дали ще работят със suid зависи и от дистрибуцията. Точно заради това те питах с каква дистрибуция си.