Автор Тема: Ограничаване на потребители  (Прочетена 1973 пъти)

Ekspert

  • Напреднали
  • *****
  • Публикации: 801
  • Distribution: Debian Wheeze
  • Window Manager: Gnome 3
    • Профил
Налага ми се да огранича ползването на определени програми за потребител(и), като идеята е въпросните програми да могат да се ползват не повече от 3 часа дневно, като времето за ползване да не е строго фиксирано от/до часа, а до изчерпване на лимита му, като при това се извежда съобщение за въпросната забрана. Нямам и най малка представа как да се направи това. Ще съм благодарен ако някой сведущ в програмирането ме осветли по въпроса, или дори да напише въпросния скрипт.
Благодаря ви предварително.
P.S. идеята е да се ограничат игрите в службата където работя, защото малуомниците не ползват компа за работа ами само за карти и шах. Дистрото е ubuntu 7.10 службата ми е ... в полицията  '<img'>
То от повечето ченгета не може и друго да се очаква ама все пак...
Активен

Извинението е като ЗАДНИКА. Всеки си го има.

zeridon

  • Killmode enabled
  • Administrator
  • Напреднали
  • *****
  • Публикации: 1398
  • Distribution: Debian/Ubuntu
  • Window Manager: console/Gnome
  • BOfH
    • Профил
    • WWW
Ограничаване на потребители
« Отговор #1 -: Feb 06, 2008, 09:50 »
/etc/security/time.conf изглежда обещаващо.

Друго което може да помогне е някакъв вид kiosk софтуер. А и с него ще спечелиш доста повече.
Активен

Внмимавай имам клещи за кабел
http://www.netsecad.com/
http://theregister.co.uk/odds/bofh/

Ekspert

  • Напреднали
  • *****
  • Публикации: 801
  • Distribution: Debian Wheeze
  • Window Manager: Gnome 3
    • Профил
Ограничаване на потребители
« Отговор #2 -: Feb 06, 2008, 11:03 »
Благодаря ти, ще го разгледам.
Активен

Извинението е като ЗАДНИКА. Всеки си го има.

p3tzata_

  • Напреднали
  • *****
  • Публикации: 210
  • Distribution: Fedora
  • Window Manager: KDE
    • Профил
Ограничаване на потребители
« Отговор #3 -: Feb 06, 2008, 14:35 »
Цитат (zeridon @ Фев. 06 2008,10:50)
/etc/security/time.conf изглежда обещаващо.

Здравейте, aко може да се включа към тази тема понеже ме заинтрегува

следния ред
Цитат

*;*;nina;!Al0000-2400


Не би ли трябвало да забрани всичко на юзер "nina" по всяко време.
Но не се получава
Активен

Никое ДОБРО не води до ДОБРО и никое ЗЛО не води до ЗЛО.

zeridon

  • Killmode enabled
  • Administrator
  • Напреднали
  • *****
  • Публикации: 1398
  • Distribution: Debian/Ubuntu
  • Window Manager: console/Gnome
  • BOfH
    • Профил
    • WWW
Ограничаване на потребители
« Отговор #4 -: Feb 06, 2008, 15:17 »
p3tzata_: тъй като този файл се чете от pam системата най вероятно при логването трябва да се проверява конкретният модул а именно time.so

Конфигурацията на самият модул идва от /etc/pam.d/

Ekspert: За кде: kiosktool, За гном: pessulus. Само да отбележа че песулуса изглежда все още недовършен.
Активен

Внмимавай имам клещи за кабел
http://www.netsecad.com/
http://theregister.co.uk/odds/bofh/

p3tzata_

  • Напреднали
  • *****
  • Публикации: 210
  • Distribution: Fedora
  • Window Manager: KDE
    • Профил
Ограничаване на потребители
« Отговор #5 -: Feb 06, 2008, 16:38 »
Цитат (zeridon @ Фев. 06 2008,16:17)
тъй като този файл се чете от pam системата най вероятно при логването трябва да се проверява конкретният модул а именно time.so

Конфигурацията на самият модул идва от /etc/pam.d/

Може ли да попитам как става това...
Използвам fedora---2.6.23.9-85.fc8
Активен

Никое ДОБРО не води до ДОБРО и никое ЗЛО не води до ЗЛО.

neter

  • Global Moderator
  • Напреднали
  • *****
  • Публикации: 3408
  • Distribution: Debian, SailfishOS, CentOS
  • Window Manager: LXDE, Lipstick
    • Профил
    • WWW
Ограничаване на потребители
« Отговор #6 -: Feb 06, 2008, 17:17 »
Тъй като ми стана интересно, пък и нещо хич не ми се занимава със сървъри днес, реших да драсна едно решение за целите на Ekspert да се поразсея. Ако на някой ще му свърши работа, да го ползва без да пита може ли '<img'>
За да работи, нужно е да имате инсталиран php на всяка локална машина и един (всъщност колкото си искате, но не е нужно да са повече от един) mysql сървър. Правите някаква база данни и връзвате към нея някакъв mysql потребител. После импортвате в нея ето това
Примерен код
CREATE TABLE IF NOT EXISTS `programs_sumtime` (
  `id` int(5) NOT NULL auto_increment,
  `user_id` varchar(255) collate utf8_unicode_ci default NULL,
  `program_id` varchar(255) collate utf8_unicode_ci default NULL,
  `kill_id` varchar(255) collate utf8_unicode_ci default NULL,
  `sum_time` int(5) NOT NULL default '0',
  `cur_status` enum('0','1') collate utf8_unicode_ci NOT NULL default '1',
  PRIMARY KEY  (`id`)
) ENGINE=MyISAM DEFAULT CHARSET=utf8 COLLATE=utf8_unicode_ci AUTO_INCREMENT=1;

След това на всяка машина добавяте в crontab следните два скрипта
Примерен код
#!/usr/bin/php
<?php

$host = "database_host";
$db_user = "database_user";
$db_password = "database_password";
$db_name = "database_name";

$user_id = "program_user"; // identifikator za vsqka otdelna mashina, koqto se vryzva kym mysql servera

$max_time = "180"; // v minuti
$message_text = "syob6tenie za izteklo vreme"; // za nadpis na kirilica, zapazete faila s kodirovkata, s koqto 6te se izpolzva

##### NE E NUJNO POVECHE REDAKTIRANE #####

$db = mysql_connect("$host", "$db_user", "$db_password");

if (mysql_select_db("$db_name",$db)) {
    mysql_query("UPDATE programs_sumtime SET sum_time = sum_time+1 WHERE user_id = '$user_id' AND cur_status = '1'");
    $sumtime = "SELECT kill_id FROM programs_sumtime WHERE user_id = '$user_id' AND sum_time > '$max_time' AND cur_status = '1'";
    $sumtime1 = mysql_query($sumtime);    
    while ($row = mysql_fetch_array($sumtime1, MYSQL_ASSOC)) {
   $row1 = $row["kill_id"];
   exec("/usr/bin/killall $row1");
   exec("/usr/bin/zenity --display=:0 --info --text='$message_text'");
    }
}
mysql_close($db);

?>

Сложете го да се изпълнява на всяка минута. Следващият е
Примерен код
#!/usr/bin/php
<?php

$host = "database_host";
$db_user = "database_user";
$db_password = "database_password";
$db_name = "database_name";

##### NE E NUJNO POVECHE REDAKTIRANE #####

$db = mysql_connect("$host", "$db_user", "$db_password");

if (mysql_select_db("$db_name",$db)) {
    mysql_query("TRUNCATE TABLE programs_sumtime");
}
mysql_close($db);

?>

Него го сложете да се изпълнява веднъж на денонощие (например в 4 през нощта). Първият скрипт обхожда базата, проверява за включени програми, на които им е изтекло времето и ако има такива, ги изключва. Вторият изчиства таблицата от записите през изтеклия ден, за да е чиста за новия ден.
Следва скриптът за включване на програмите
Примерен код
#!/usr/bin/php
<?php

$host = "database_host";
$db_user = "database_user";
$db_password = "database_password";
$db_name = "database_name";

$user_id = "program_user"; // identifikator za vsqka otdelna mashina, koqto se vryzva kym mysql servera
$program_id = "identifikator_na_programata"; // pylniqt pyt do programata
$kill_id = "programa"; // tuk vyvedete imeto na programata, koeto moje da byde izpolzvano ot killall za ubivane na vsi4ki procesi na programata pri timeout. Moje da byde vidqn s komanda "ps ax", kogato programata e vklyu4ena. Naprimer, ako rezultatyt ot "ps ax |grep kcalc" e bil "/usr/bin/kcalc -caption KCalc -icon kcalc -miniicon kcalc", to za kill_id vyvedete "kcalc"

$max_time = "180"; // v minuti
$message_text = "syob6tenie za izteklo vreme"; // za nadpis na kirilica, zapazete faila s kodirovkata, s koqto 6te se izpolzva

##### NE E NUJNO POVECHE REDAKTIRANE #####

$db = mysql_connect("$host", "$db_user", "$db_password");

if (mysql_select_db("$db_name",$db)) {
    $sumtime = "SELECT * FROM programs_sumtime WHERE user_id = '$user_id' AND program_id = '$program_id'";
    $sumtime1 = mysql_query($sumtime);
    $sumtime2 = mysql_fetch_array($sumtime1, MYSQL_ASSOC);
    if ($sumtime2 != "") {
   if ($sumtime2["sum_time"] < $max_time) {
       mysql_query("UPDATE programs_sumtime SET cur_status = '1' WHERE user_id = '$user_id' AND program_id = '$program_id'");
       exec("$program_id");
       mysql_query("UPDATE programs_sumtime SET cur_status = '0' WHERE user_id = '$user_id' AND program_id = '$program_id'");
   } else {
       exec("/usr/bin/zenity --display=:0 --info --text='$message_text'");
   }
    } else {
   mysql_query("INSERT INTO programs_sumtime(user_id, program_id, kill_id, sum_time, cur_status) VALUES ('$user_id', '$program_id', '$kill_id', '0', '1')");
   exec("$program_id");
   mysql_query("UPDATE programs_sumtime SET cur_status = '0' WHERE user_id = '$user_id' AND program_id = '$program_id'");
    }
}
mysql_close($db);

?>

За всяка отделна програма създавайте по един такъв скрипт. Заложете програмите да се стартират чрез него (чрез alias-и или в symlink-овете на десктопа и менютата). Това е.
Приемам критики, ако има такива, за функциалността и изпълнението на скриптовете. Ако някой има някакви затруднения с пускането и използването на скриптовете, да каже, за да помагам '<img'>

edit: За program_id в скрипта, който включва програмата, въведете точно пълния път до програмата, а не (както бях писал) каквото си искате. Забравих, че накрая оставих program_id да се използва в exec() за включване на въпросната програма. Бях забравил и да отбележа, че user_id е идентификатор за всяка отделна машина, която се връзва към mysql сървъра, за да пази отчетите си там. Върши работа, когато един mysql сървър се използва от повече от една машина. Когато всяка машина си ползва свой mysql сървър, този идентификатор не е задължителен, но трябва да присъства като променлива, пък макар и празна, освен ако не ви се редактира кода на скрипта.



Активен

"Да си добре приспособен към болно общество не е признак за добро здраве" - Джиду Кришнамурти

Ekspert

  • Напреднали
  • *****
  • Публикации: 801
  • Distribution: Debian Wheeze
  • Window Manager: Gnome 3
    • Профил
Ограничаване на потребители
« Отговор #7 -: Feb 06, 2008, 22:28 »
Цитат (zeridon @ Фев. 06 2008,15:17)
p3tzata_: тъй като този файл се чете от pam системата най вероятно при логването трябва да се проверява конкретният модул а именно time.so

Конфигурацията на самият модул идва от /etc/pam.d/

Ekspert: За кде: kiosktool, За гном: pessulus. Само да отбележа че песулуса изглежда все още недовършен.

Прегледах ги и двете но не стават за задачата която съм си поставил, трябва не да забраняват достъпа до определени приложения а да го ограничават по време. Относно pessulus наистина има още какво да се желае в тази програмка. neter е дал най-доброто предложение до момента, не мога да кажа дали е и единственото възможно тъй като не съм програмист. Не съм много наясно относно инсталирането на php4 или php5, т.е. само  този пакет ли да инсталирам или има още някакви зависмости (apache2-mpm-prefork, apache2-utils и другите дето си ги иска synaptic), на въпросния компютър няма интернет и ще се наложи всичко да нося на флашка. Същото се отнася и за mysql. Чудя се не може ли да се опрости целия процес, за сега съм се спрял на много незадоволително решение timeout, но програмата не става за тази задача, но временно ще я ползвам докато разбера как да се преборя с php и mysql или нещо друго.
Благодаря на всички за бързите отговори.
Поздрави.
Активен

Извинението е като ЗАДНИКА. Всеки си го има.

gat3way

  • Напреднали
  • *****
  • Публикации: 6050
  • Relentless troll
    • Профил
    • WWW
Ограничаване на потребители
« Отговор #8 -: Feb 06, 2008, 22:49 »
Добре де, кое гарантира, че няма да ги изпълни директно, защо точно този скрипт трябва да извика?
Активен

"Knowledge is power" - France is Bacon

neter

  • Global Moderator
  • Напреднали
  • *****
  • Публикации: 3408
  • Distribution: Debian, SailfishOS, CentOS
  • Window Manager: LXDE, Lipstick
    • Профил
    • WWW
Ограничаване на потребители
« Отговор #9 -: Feb 07, 2008, 00:50 »
Цитат (gat3way @ Фев. 06 2008,22:49)
Добре де, кое гарантира, че няма да ги изпълни директно, защо точно този скрипт трябва да извика?

Гарантира го това, че ще се използва от хора, които не са "на ти" с компютрите (полицаи). Скриптът не е универсален (писах го специално за случая на Exspert) или поне не в тази схема на приложение, в която го описах и може би не точно с тази структура. Но дори човек, който има някакъв опит с компютри и Линукс (не дълбок, но някакъв) може да бъде заблуден като скриптът не се постави за изпълнение като alias или в symlink-овете, а се постави на мястото на реалните изпълними файлове на програмата (в примера с kcalc от скрипта, преименуваме /usr/bin/kcalc на /usr/bin/ne6to_nerazbiraemo и слагаме наш скрипт с име /usr/bin/kcalc, след което в скрипта за изпълним файл на програмата използваме /usr/bin/ne6to_nerazbiraemo или, ако програмата поради някаква причина изисква да си е на оригиналното място с оригиналното име, то можем да сложим нашия скрипт в /bin със същото име като оригиналния файл и да махнем /usr/bin от пътищата на системата, с което си усложняваме работата, защото трябва да се направи схема за директно изпълнение и на другите приложения в /usr/bin, но не е невъзможна задача). С цел да объркаме потребителя, можем да преправим cron задачите в демони, като кръстим демоните така, че потребителят да не се усети, че това им е целта и да не тръгне да ги проверява какво правят всъщност. Ако на някой му потрябват като демони, ще му ги преправя. Но както казах, скриптът не е универсален, писал съм го така, както ми се вижда най-добре за дадения случай. Рядко пиша универсални скриптове, тъй като всяка система и цел изискват своите специфики и рядко универсалните решения вършат работа на 100%. Все едно да вземеш защитната стена от един сървър и да я сложиш на друг, без да преправиш нищо. Рядко върши работа, тъй като отделните машини са подложени на различни атаки и някои от правилата се оказват излишни, а се оказва че има нужда от още правила. Та... да не се отплесвам много, че пак взех да изписвам фермани '<img'>

Ekspert, съжалявам да прочета, че тези машини нямат нет, защото задачата ти се усложнява. Все пак е хубаво, че всички системи са еднакви. Препоръчвам ти да си качиш една виртуална машина с Ubuntu 7.10, да й инсталираш php и mysql и след това да вземеш всички използвани по време на инсталациите deb пакети от /var/cache/apt/archives и да си ги сложиш на флашката. След това, за да качиш php, слагаш файловете за php-то в една папка на машината и ги инсталираш с команда "dpkg -i *.deb", за да се качват наведнъж и да не пищят за зависимости. За да качиш mysql-а на машината, която ще ползваш за сървър, правиш същото упражнение, но с пакетите, които са нужни на mysql.
Успех, независимо кое решение ще предпочетеш. Знам каква мъка е да администрираш машини, които ще се ползват от хора (просто защото имат най-различни прищявки за излишни неща), затова реших да ти дам още едно решение на проблема, за да имаш по-богат избор '<img'>
Активен

"Да си добре приспособен към болно общество не е признак за добро здраве" - Джиду Кришнамурти

Ekspert

  • Напреднали
  • *****
  • Публикации: 801
  • Distribution: Debian Wheeze
  • Window Manager: Gnome 3
    • Профил
Ограничаване на потребители
« Отговор #10 -: Feb 07, 2008, 06:59 »
Всъщност машината е само една (стария ми компютър) понеже начлниците на ченгетата в Бургас са толкова калпави че не могат един читав компютър да ни дадат, но какво да очакваш от курбанджии ;-) дай им далаверка и ще са първи. Та затова има linux с police-то заради моите прищевки, иначе всички са на уиндос с изключение на няколко ченгета като мен, ама една ръка има много пръсти че да дам сравнение. Благодаря ти пак, започвам да се боря от утре че днес няма да имам време.
Активен

Извинението е като ЗАДНИКА. Всеки си го има.