2015-07-18 4 views
-2

У меня ошибка с perl, пытаясь СОЗДАТЬ файл .envfile в корневом каталоге / (только для UNIX). Разрешение отрицается, что понимается. Но есть ли способ написать этот файл? Мне нужно сделать это без каких-либо модулей, просто со встроенными функциями. Я ожидаю использовать chmod, но ... честно говоря, не знаю, как реализовать его в одном потоке БЕЗОПАСНО.Как создать файл в корневом каталоге с perl?

Мне нужен этот файл, чтобы написать в нем мои собственные ENV для моего программного обеспечения (так как это большой проект со многими дистрибутивами и должен работать со многими собственными ENV).

Попытка просто:

my $filename = '.envfile'; 

open FH, '>', $filename or die $!; 

print FH "some data\n"; 

close(FH); 

Apache говорит: Permission denied at /var/www/cgi-bin/env.cgi line 41.

Любая помощь приветствуется! Спасибо!

ответ

2

Если я правильно понял вопрос, выяснилось, что вы также контролируете программное обеспечение, которое в конечном итоге будет читать файл, который вы пытаетесь создать. Это точно? Если это так, измените программу, чтобы получить ее среду из другого места. Где еще? Предпочтительно новый каталог, чтобы вы могли сделать его доступным для записи на своем веб-сервере, не затрагивая ничего другого. Я бы, вероятно, использовал /etc/myprogram (потому что /etc является стандартным местом для файлов конфигурации) или /var/local/myprogram (потому что /var является стандартным местом для постоянных файлов данных). Но не существующий каталог, который является , и должен оставаться доступным для записи только root.

Чтобы избежать нарушения безопасности, Perl не позволяет обойти защиту файловой системы (разрешения). И это хорошая вещь. Если бы это было разрешено, это означало бы, что любой, кто найдет эксплоит в вашем коде Perl, может затем изменить любой файл на вашем компьютере, потенциально заменив его самым вредоносным кодом, когда-либо написанным.

Таким образом, только так, что ваш Perl может создать файл в /, если он работает как корень или использует su/suid запустить другую программу в качестве корня. И вы действительно, действительно, действительно не хотите, чтобы CGI-скрипты или веб-приложения выполнялись под управлением root, потому что, если вы не делаете абсолютно абсолютно в своем коде, и нет никаких ошибок в использовании в perl или apache или ядре, запуская свой веб-код под именем root, вы потенциально можете получить доступ root к любому случайному сценаристу в Интернете.

Если у вас действительно нет абсолютно иного выбора, кроме как иметь доступ к веб-коду, напишите произвольные файлы на /, тогда наименее плохим, наименее безопасным способом сделать это было бы создание очень крошечной вспомогательной программы который принимает имя файла и содержимое файла в качестве входных данных, проверяет, что именованный файл еще не существует (чтобы злоумышленник не мог использовать его для перезаписи, скажем, вашего ядра), а затем создает именованный файл с предоставленным содержание.Помимо, может быть, немного дополнительной проверки здравомыслия/безопасности, он должен сделать абсолютно ничего, кроме, потому что чем сложнее эта вспомогательная программа, тем более вероятно, что она будет содержать эксплуатационные недостатки. Затем используйте код suid, чтобы запустить вспомогательную программу, с suid, настроенной так, чтобы пользователь сети (и только веб-пользователь) запускал вспомогательную программу (и только только), без пароля.

Но не делайте этого, если вы действительно, действительно, абсолютно не имеете другого выбора. Это не способ , это наименее плохой способ. Это означает, что это еще плохая идея.

+1

Спасибо, приятель! Отличный ответ! Я решил создать установщик для моего программного обеспечения (скрипт perl), который будет запускаться под ROOT с терминала, и он будет создавать эти файлы ТОЛЬКО на стороне сервера (а не как CGI) и ТОЛЬКО ONCE при установке. Файл, который будет создан, будет развернут (как вам настоятельно рекомендуется) в/etc или в/var/local/mysoftware. – Arsenii

+1

Звучит неплохо. Запуск установщика из командной строки вместо CGI/web - это лучший способ защитить его. –

2

Создайте файл «вручную» и установить его владельца к владельцу процесса апача, например .:

sudo touch /.envfile 
sudo chown www-data:www-data /.envfile 
sudo chmod u+rw /.envfile
+0

Спасибо, но .. hm ... Это не то, что я ищу ... Я знаю, как создать файл вручную ..)) Мне нужно создать его, используя ТОЛЬКО PERL. – Arsenii

+4

Вы не будете пропускать эти привилегии. Если бы это было возможно, это был бы ОГРОМНЫЙ недостаток безопасности. Еще одна вещь, которая приходит мне на ум - создать простую программу «обертка», которая записывает из stdin в /.envfile, дает ему suid root привилегии и запускает ее из вашего perl-скрипта. – nsilent22

+0

Yepp! Хорошо, когда мы устанавливаем, скажем, Perl, эта программа AUTOMATICALLY создает ENV в системе, так как мы запускаем сценарий установки из $ sudo. Вопрос в том, можно ли запустить run с $ sudo param FROM WITHIN скрипта? – Arsenii

1

Вы выполнение программы Perl как пользователь без достаточных привилегий. Запустите программу Perl, используя пользователя с достаточными привилегиями (например, с использованием sudo или su).

Смежные вопросы