Если я правильно понял вопрос, выяснилось, что вы также контролируете программное обеспечение, которое в конечном итоге будет читать файл, который вы пытаетесь создать. Это точно? Если это так, измените программу, чтобы получить ее среду из другого места. Где еще? Предпочтительно новый каталог, чтобы вы могли сделать его доступным для записи на своем веб-сервере, не затрагивая ничего другого. Я бы, вероятно, использовал /etc/myprogram
(потому что /etc
является стандартным местом для файлов конфигурации) или /var/local/myprogram
(потому что /var
является стандартным местом для постоянных файлов данных). Но не существующий каталог, который является , и должен оставаться доступным для записи только root.
Чтобы избежать нарушения безопасности, Perl не позволяет обойти защиту файловой системы (разрешения). И это хорошая вещь. Если бы это было разрешено, это означало бы, что любой, кто найдет эксплоит в вашем коде Perl, может затем изменить любой файл на вашем компьютере, потенциально заменив его самым вредоносным кодом, когда-либо написанным.
Таким образом, только так, что ваш Perl может создать файл в /
, если он работает как корень или использует su
/suid
запустить другую программу в качестве корня. И вы действительно, действительно, действительно не хотите, чтобы CGI-скрипты или веб-приложения выполнялись под управлением root, потому что, если вы не делаете абсолютно абсолютно в своем коде, и нет никаких ошибок в использовании в perl
или apache или ядре, запуская свой веб-код под именем root, вы потенциально можете получить доступ root к любому случайному сценаристу в Интернете.
Если у вас действительно нет абсолютно иного выбора, кроме как иметь доступ к веб-коду, напишите произвольные файлы на /
, тогда наименее плохим, наименее безопасным способом сделать это было бы создание очень крошечной вспомогательной программы который принимает имя файла и содержимое файла в качестве входных данных, проверяет, что именованный файл еще не существует (чтобы злоумышленник не мог использовать его для перезаписи, скажем, вашего ядра), а затем создает именованный файл с предоставленным содержание.Помимо, может быть, немного дополнительной проверки здравомыслия/безопасности, он должен сделать абсолютно ничего, кроме, потому что чем сложнее эта вспомогательная программа, тем более вероятно, что она будет содержать эксплуатационные недостатки. Затем используйте код suid
, чтобы запустить вспомогательную программу, с suid
, настроенной так, чтобы пользователь сети (и только веб-пользователь) запускал вспомогательную программу (и только только), без пароля.
Но не делайте этого, если вы действительно, действительно, абсолютно не имеете другого выбора. Это не способ , это наименее плохой способ. Это означает, что это еще плохая идея.
Спасибо, приятель! Отличный ответ! Я решил создать установщик для моего программного обеспечения (скрипт perl), который будет запускаться под ROOT с терминала, и он будет создавать эти файлы ТОЛЬКО на стороне сервера (а не как CGI) и ТОЛЬКО ONCE при установке. Файл, который будет создан, будет развернут (как вам настоятельно рекомендуется) в/etc или в/var/local/mysoftware. – Arsenii
Звучит неплохо. Запуск установщика из командной строки вместо CGI/web - это лучший способ защитить его. –