Как позволить непривилегированному apache/PHP делать корневую задачу (CentOS)

Я решил подобную проблему путем переключения, под которым пользователем работала задача; пользователь по умолчанию не имел прав доступа к сети. Стоящий попытки, по крайней мере. Перепроверка и программные брандмауэры Вы используете, также; я знаю, что Windows Defender дал нам подобные головные боли.

2
задан 22 November 2012 в 00:06
2 ответа

Создайте сценарий, реализующий описанные вами команды, и запустите на нем setuid , чтобы он мог работать от имени пользователя root, когда кто-либо его вызовет. См. http://en.wikipedia.org/wiki/Setuid для получения дополнительной информации о setuid.

Из PHP вы можете просто вызвать system ('/ bin / setupNewUser'); как обычно, и сценарий будет запущен от имени пользователя root.


Альтернативное решение, ограничивающее возможности внедрения и работающее в системах с отключенным выполнением setuid для скриптов:

Создайте небольшую программу, у которой есть setuid. Пример приведен ниже:

#include <stdlib.h>
#include <iostream>
#include <string>

using namespace std;

int main(int argc, char* argv[])
{
    if (argc != 2)
    {
        cout << "Invalid arguments";
        return 1;
    }

    //make sure the argument passed to the script has only [a-z]
    for (char* i = argv[1]; *i != '\0'; i++)
    {
       //check if the current character falls outside an allowed range
       if (!(
           //Allowed ranges:
           // between a and z
           ('a' <= *i && *i <= 'z') 
           // between 0 and 9
           || ('0' <= *i && *i <= '9')
           // '_' or '-'
           || ('_' == *i)
           || ('-' == *i)
       ))
       {
           cout << "Illegal character in username: " << *i << endl;
           return 2;
       }
    }

    //append the username
    string command = string("/test/setupUser.sh ");
    command += string(argv[1]);

    //execute the command and return the result transparently
    // return system(command.c_str());
    // * OR *
    // call mkdir directly
}

Вызов программы setuid из php

system('/test/setupUser '.escapeshellarg($username));
1
ответ дан 3 December 2019 в 10:09

ПОЖАЛУЙСТА, не делайте этого!

По крайней мере, не так, как вы предлагаете - У Apache нет разумной причины делать НИЧЕГО от имени пользователя root.
] Уровень вопиющего того, что вы предлагаете, должен быть очевиден из-за того, что Apache откажется запускаться от имени root (кроме привязки материнского процесса к порту 80).

Также делать что-либо от имени root с вводом ненадежных пользователей - ужасно Идея и верный способ обнаружить все интересное, что хакер может ввести в поле, заставит вашу систему делать то, чего вы не ожидали.


Если вы действительно хотите сделать это:

  • Создайте каталоги пользователей вручную .
    Этот единственный ручной шаг с проверкой человеком спасет вашу систему. Разрешение любого ненадежного пользовательского ввода в пределах мили от корневой оболочки просто вызывает проблемы.
    • Владелец каталога должен быть пользователем.
    • Группа каталогов должна быть группой, под которой работает Apache.
    • Разрешения каталога, вероятно, должны быть либо 4770 ( rwsrwx --- )

Это позволит вам пользователь для чтения / записи / и т. д. содержимое каталога и бит SetUID в каталоге заставят пользователя стать владельцем всех файлов (чтобы он мог управлять ими при входе в систему с использованием SCP / SFTP).

3
ответ дан 3 December 2019 в 10:09

Теги

Похожие вопросы