Автор Тема: Как да изпълним скрипт, за който текущият потребител няма права?  (Прочетена 2631 пъти)

Hmmm

  • Напреднали
  • *****
  • Публикации: 18
    • Профил
Ситуация:
  - Линукс сървър с Апачи
  - Сайт на виртуален хост, изпълняващ се под определен линкус потребител, без "админ" права
  - Скрипт, достъпен единствено до "админ" потребител

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

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

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

b2l

  • Напреднали
  • *****
  • Публикации: 4786
  • Distribution: MCC Interim
  • Window Manager: - // - // -
  • ...sometimes I feel like screaming... || RTFM!
    • Профил
    • WWW
Скрипта изпълнява системни операции и никой друг потребител освен определен "админ" потребител не трябва да има права до него.

Какви?
Активен

"Човекът е въже, опънато между звяра и свръхчовека, въже над пропаст. Човекът е нещо, което трябва да бъде превъзмогнато." - Фр. Ницше

Kedr

  • Напреднали
  • *****
  • Публикации: 41
    • Профил
Активен

edmon

  • Гост
може да си напишеш демон, който  като промениш стойност в някой файл който демона чете постоянно да стартира скрипта....:)))
Активен

v_badev

  • Напреднали
  • *****
  • Публикации: 1355
    • Профил
Малка вариация на темата е да направиш демон, който да чака команди от сокет файл. Така ще избегнеш четенето от диска в цикъл.
Все пак решението със sudo, което Kedr предложи ми се струва по-правилно.
Активен

edmon

  • Гост
И наистина какъв е  най-добрия вариант, някаква лелка да задава спиране и пускане на някакви предварително зададени правила за айпитейбълс през уеб интерфейс????
Активен

dejuren

  • Напреднали
  • *****
  • Публикации: 1025
  • Distribution: Ubuntu, RedHat
  • Window Manager: lxde KDE4
    • Профил
IMHO wеб-лице, което представлява един бутон/няколко бутона, извикващи изпълнението на скрипт със sudo, с права за изпълнение единствено на скрипта (sudo на веб-сървър потребителя, вероятно apache). След като ще си играем с iptables се налага добра защита на страницата с бутоните от неоторизира достъп.
http://httpd.apache.org/docs/2.0/howto/auth.html

Не претендирам варианта да е най-добрия, но ще е прост и ефективен.
« Последна редакция: May 20, 2012, 17:31 от dejuren »
Активен

http://webchat.freenode.net/?channels=ubuntu-bg
The quieter you become, the more you are able to hear.
Две седмици цъкане с мишката спестяват два часа четене на документацията.

Kedr

  • Напреднали
  • *****
  • Публикации: 41
    • Профил
ssh -X или ssh -Y <адрес> <потребител> <програмата на сървър> ще ти даде графичен интерфейс к админските бутони и пълен контрол на достъп.
Активен

Hmmm

  • Напреднали
  • *****
  • Публикации: 18
    • Профил
Реших да пробвам варианта със 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 тя ще се изпълни коректно, иначе не.
Активен

Hmmm

  • Напреднали
  • *****
  • Публикации: 18
    • Профил
Тествах последната идея с двата файла, изглежда че работи точно, както се иска.
« Последна редакция: Jun 26, 2012, 15:30 от Hmmm »
Активен

SmashThePain

  • Напреднали
  • *****
  • Публикации: 21
    • Профил
Вече ти написаха за 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: Ти с каква дистрибуция си, че може да изпълняваш шел скриптове с ефективното ид на супер потребител?
Активен

Hmmm

  • Напреднали
  • *****
  • Публикации: 18
    • Профил
Това и направих - файлът, който добавих в sudoers е с права 755 и той извиква същинския скрипт, който върши работата - с права 700.
Варианта, който използвам за първия скрипт, този с 755 правата е:
Код:
#!/bin/bash
/path/to/worker.sh

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

sudo

  • Напреднали
  • *****
  • Публикации: 73
    • Профил
Преди 8 години съм го писал това: http://www.linux-bg.org/cgi-bin/y/index.pl?page=article&id=advices&key=362203531 но предполагам че все още е валидно.
Активен

SmashThePain

  • Напреднали
  • *****
  • Публикации: 21
    • Профил
@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 зависи и от дистрибуцията. Точно заради това те питах с каква дистрибуция си.
Активен