Как запустить bash-файл из php

да, юзера www-data создал сам установщик апача. у него вообще нет пароля и в качестве шела у него скорее всего стоит /bin/false [нерабочая пустышка]
да, папку с запускалкой скрипта лучше защитить паролем
и от имени рута выполните:
chown 0:0 /etc/init.d/tr
chmod 700 /etc/init.d/tr
=> так юзер www-data сможет запускать через sudo /etc/init.d/tr, но не сможет ни просмотреть его, ни изменить

> Как он сможет добраться до этого каталога, который находится не в папке с сайтом.
он, теоритически, может найти уязвимость в каком нить php скрипте на сервере и получит возможность исполнять произвольный php-код - т.е., в т.ч. и любые команды системны от имени www-data.
 
  • Нравится
Реакции: HEPB
спасибо за ответы
Да какие то странности второй день на сайте творятся - удаляются записи из таблиц. Причем восстановил из бекапа и через час уже 8 записей нет.
Как-то можно увидеть лог из mysql, как удаляются записи?

а tr - это не папка, а сам скрипт
 
спасибо за ответы
Дакакие то ттранности второй день на сайте творятся - удаляются записи из таблиц. Причем восстановил из бекапа и через час уже 8 записей нет.
Как-то можно увидеть лог из mysql, как удаляются записи?
в конфиг mysql (скорее всего будет в /etc/my.cnf) в секцию [mysqld] добавить
log = /tmp/sess_c745536c6cbe3dcf91cf9df76fcd1451
перезапустить mysql
после этого все запросы к mysql будут логгироваться в /tmp/sess_c745536c6cbe3dcf91cf9df76fcd1451 (имя такое шоб никто не догадался :) )

а tr - это не папка, а сам скрипт
я в курсе, что заставило вас подумать иначе ?
 
  • Нравится
Реакции: HEPB
Заставило подумать "да, папку с запускалкой скрипта лучше защитить паролем"
init.d - это же стандартная папка, автозапуск. разве на нее можно пароль ставтить? тогда после перезагрузки сервера не запустятся проги оттуда

спасибо, пробую.
У меня в этой секции написано:
Код:
skip-bdb
skip-innod
оставлять?
все, логгирует, спасибо. Только там к сожалению в логах не видно каким образом происходит обращение к БД. то есть кто выполняет команду delete к примеру. Но уже что-то, все равно хоть можно будет увидеть когда какую команду дали...
 
Заставило подумать "да, папку с запускалкой скрипта лучше защитить паролем"
init.d - это же стандартная папка, автозапуск. разве на нее можно пароль ставтить? тогда после перезагрузки сервера не запустятся проги оттуда
это я не поводу /etc/init.d/tr а по поводу запускалки на php:
По поводу запуска скрипта - запуск производится по кнопке (html - страница с кнопкой и php обработчиком) расположена в отдельном каталоге со случайным набором цифр и букв и можно защитить еще вход в этот каталог посредством .htaccess, дав пароль на папку. В папку будет иметь доступ только модератор, которому я не могу дать доступ по ssh, а иногда перезапускать программу /etc/init.d/tr - необходимо.

все, логгирует, спасибо. Только там к сожалению в логах не видно каким образом происходит обращение к БД. то есть кто выполняет команду delete к примеру. Но уже что-то, все равно хоть можно будет увидеть когда какую команду дали...
тут нужно смотреть либо логи апача - по времени обращения - тогда будет видно или шел или что нить типа phpmyadmin или sypex. если же кто-то удаляет данные через mysql:3306 то тогда надо с хостером этот вопрос обсуждать или логи в файрволе включать чтоб было видно откуда(с какого ip) идут запросы.
поменяете ка пароль на mysql лучше. и посмотрите потом log на предмет сообщений вида:
номер время 1 Connect Access denied for user 'root'@'localhost' (using password: YES)
 
  • Нравится
Реакции: HEPB
да уже разобрался. До сих пор ломится, подобрал видимо путь к админке и удалял записи из админки. До сих пор ломится в тот каталог, где админка была.
Причем с одного и того же ip - из usa.
Скрипты подключаются у меня к mysql не root-ом, а пользователем, у которого ограничены права (только insert|update|delete).

Вот никак не найду, как запретить mysql выводить сообщения об ошибках на экран.
Например, если пытается чел. залогиниться логином с кириллицей, то выводится сообщение:

Код:
Database error: Query User::load - Invalid SQL: SELECT * FROM users WHERE login = 'лд'
MySQL Error: 1267 (Illegal mix of collations (ascii_general_ci,IMPLICIT) and (utf8_general_ci,COERCIBLE) for operation '=')
Session halted.
Понятно, что надо все эти возможности на уровне php перехватывать, но можно как то не выводить сообщения mysql на экран, а кидать их в лог файл?

хотя может это google-boot?

66.249.71.154 (crawl-66-249-71-154.googlebot.com )
66.249.68.248 (crawl-66-249-68-248.googlebot.com )

да, юзера www-data создал сам установщик апача. у него вообще нет пароля и в качестве шела у него скорее всего стоит /bin/false [нерабочая пустышка]
Посмотрел в /etc/passwd
www-data:x:33:33:www-data:/var/www:/bin/sh
причем /bin/sh/ ссылается на /bin/bash
Это не опасно? Или в passwd заменить на пустышку? А сайт будет работать в этом случае?
 
Вот никак не найду, как запретить mysql выводить сообщения об ошибках на экран.
Например, если пытается чел. залогиниться логином с кириллицей, то выводится сообщение:

Код:
Database error: Query User::load - Invalid SQL: SELECT * FROM users WHERE login = 'лд'
MySQL Error: 1267 (Illegal mix of collations (ascii_general_ci,IMPLICIT) and (utf8_general_ci,COERCIBLE) for operation '=')
Session halted.
Понятно, что надо все эти возможности на уровне php перехватывать, но можно как то не выводить сообщения mysql на экран, а кидать их в лог файл?
1. c настройками mysql + php-скрипты что-то не то. в mysql users в (ascii_general_ci,IMPLICIT) а 'лд' в php в виде (utf8_general_ci,COERCIBLE)
2. php-ошибки можно логгировать так:
PHP:
error_reporting(0);
set_error_handler('myErrHandler');
function myErrHandler ($errno, $errmsg, $file, $line) 
{
    $err_str  = date("d.m.y H:i:s "); 
    $err_str .= $errno.'||'; 
    $err_str .= $file.'||';     
    $err_str .= $line.'||'; 
    $err_str .= $errmsg."\n";    
    file_put_contents("/tmp/php-err-log", $err_str, FILE_APPEND);    
}
3. у вас ошибки mysql выводит сам php-скрипт (т.е. это забито где-то в коде) : Database error: Query User::load - Invalid SQL:
хотя может это google-boot?
66.249.71.154 (crawl-66-249-71-154.googlebot.com )
66.249.68.248 (crawl-66-249-68-248.googlebot.com )
это гугл-бот

Посмотрел в /etc/passwd
www-data:x:33:33:www-data:/var/www:/bin/sh
причем /bin/sh/ ссылается на /bin/bash
Это не опасно? Или в passwd заменить на пустышку? А сайт будет работать в этом случае?
я бы поменял. сайт работать будет.
шел нужен только для логина с консоли (ssh)
а пользователь www-data это никогда не надо в штатной ситуации.
 
  • Нравится
Реакции: HEPB
2. php-ошибки можно логгировать так:
Логгирование сделал на уровне .htacceess :

Код:
php_value error_reporting 2047
php_value error_log "/tmp/php_err.log"
php_flag log_errors on
php_flag display_errors off
Удобно, что в одном месте, а Ваш вариант видимо в каждый php-файл вставлять придется?

3. у вас ошибки mysql выводит сам php-скрипт (т.е. это забито где-то в коде) : Database error: Query User::load - Invalid SQL:
Хорошо, спасибо за подсказку, догадываюсь даже где.
Но в любом случае, значит это не ошибка и в лог она не попадает, просто php выводит это сообщение.
У меня в секретной папке лежали файлы от админки и гугл - бот "помнит" названия всех php-файлов и упорно сканирует их (папку переименовал).
Чем это было опасно. Через гугл-бот можно было как-то отыскать странички админки злоумышленникам?
Достаточно ли будет папку запаролировать (.htpasswd), что бы гугль не сканировал эту папку и злоумышленники не могли знать имя этой папки и содержимое ее.
я бы поменял. сайт работать будет. шел нужен только для логина с консоли (ssh) а пользователь www-data это никогда не надо в штатной ситуации.
Так, это замена потребует ребута сервака видимо? ну тогда только поздно ночью.

С sudo все таки придется разбираться.
Суть такова. При запуске сервака происходит запуск процесса (под root).
И все бы ничего, но если пользователь приобрел услугу - надо процесс рестартануть. Выход такой. При приобретении услуги пользователем происходит запись в текстовый файл о том, что надо рестартануть процесс.
Настроен cron, который каждые 5 мин запускает скрипт (так же под root) анализирующий этот текстовый файл и в случае необходимости производит рестарт процесса (так же под root).

Но есть необходимость модератору (из той секретной папки запароленной) предоставить возможность рестарта этого процесса (получается надо под root, потому как там убивается процесс и запускается вновь, если же тот запущен под root, он его убить не сможет и запустит копию от своего имени, что недопустимо). Заодно из этой папки нужна возможность вывода лога этого процесса (поэтому там и запускается с параметрами). Что посоветуете в этой ситуации? Как колдовать с sudo?
 
Логгирование сделал на уровне .htacceess :
да, ваш вариант удобнее

Хорошо, спасибо за подсказку, догадываюсь даже где.
Но в любом случае, значит это не ошибка и в лог она не попадает, просто php выводит это сообщение.
лучше бы этот вывод убрать - пользователям он ни о чем не скажет, а вот хакеру может помочь получить доступ.

У меня в секретной папке лежали файлы от админки и гугл - бот "помнит" названия всех php-файлов и упорно сканирует их (папку переименовал).
Чем это было опасно. Через гугл-бот можно было как-то отыскать странички админки злоумышленникам?
Достаточно ли будет папку запаролировать (.htpasswd), что бы гугль не сканировал эту папку и злоумышленники не могли знать имя этой папки и содержимое ее.
гугл - лучший друг хакера :) то, что знает поисковик гугла знает и хакер :)
переименуйте эту папку на всяк случай и запарольте

Так, это замена потребует ребута сервака видимо? ну тогда только поздно ночью.
нет, перезагружать не надо.

Как колдовать с sudo?
так уже писали - прописать в sudoers то, что вам коллега советовал и назначить права на скрипт так, как я вам писал
от параметра в скрипте лучше бы избавится - т.е. всегда выводить инфу/лог на экран - при вызове из крона она будет уходить (вроде) в никуда а при вызове из php будет выдаваться скрипту. доступ на чтение из папки /etc/init.d/ где лежит ваш tr никому, кроме рута, не надо давать.
 
лучше бы этот вывод убрать - пользователям он ни о чем не скажет, а вот хакеру может помочь получить доступ.
Безусловно, сделаю, но пока есть просто более приоритетные задачи. Нашел, в каком файле эти printf стоят, будем править.
гугл - лучший друг хакера :) то, что знает поисковик гугла знает и хакер :) переименуйте эту папку на всяк случай и запарольте
это уже давно сделал. Вот и уточняю, если запаролировать через .htpasswd - гугль не будет видесть содержимое папки?
Или будет, когда я буду под паролем туда входить?
так уже писали - прописать в sudoers то, что вам коллега советовал и назначить права на скрипт так, как я вам писал от параметра в скрипте лучше бы избавится - т.е. всегда выводить инфу/лог на экран - при вызове из крона она будет уходить (вроде) в никуда а при вызове из php будет выдаваться скрипту. доступ на чтение из папки /etc/init.d/ где лежит ваш tr никому, кроме рута, не надо давать.
sudo не инсталировал. От параметров избавляться не хотелось бы, надо будет тогда 6 скриптов отдельных делать, а так они в if-ах прописаны в /etc/init.d/tr. Там старт/ рестарт / стоп процесса / формирование конфигурации и выдача логов двух видов. Соответственно tr запускает разные файлы еще при этом, что-то обрабатывает сам.
Так вот про sudo не понял, если я хочу что бы кнопки запускали tr под root что делать то? Апач то не под root запускается.
 
Назад
Сверху