- Поисковые системы
- Практика оптимизации
- Трафик для сайтов
- Монетизация сайтов
- Сайтостроение
- Социальный Маркетинг
- Общение профессионалов
- Биржа и продажа
- Финансовые объявления
- Работа на постоянной основе
- Сайты - покупка, продажа
- Соцсети: страницы, группы, приложения
- Сайты без доменов
- Трафик, тизерная и баннерная реклама
- Продажа, оценка, регистрация доменов
- Ссылки - обмен, покупка, продажа
- Программы и скрипты
- Размещение статей
- Инфопродукты
- Прочие цифровые товары
- Работа и услуги для вебмастера
- Оптимизация, продвижение и аудит
- Ведение рекламных кампаний
- Услуги в области SMM
- Программирование
- Администрирование серверов и сайтов
- Прокси, ВПН, анонимайзеры, IP
- Платное обучение, вебинары
- Регистрация в каталогах
- Копирайтинг, переводы
- Дизайн
- Usability: консультации и аудит
- Изготовление сайтов
- Наполнение сайтов
- Прочие услуги
- Не про работу
Все что нужно знать о DDоS-атаках грамотному менеджеру
И как реагировать на "пожар", когда неизвестно, где хранятся "огнетушители
Антон Никонов
Авторизуйтесь или зарегистрируйтесь, чтобы оставить комментарий
Доброго времени.
Обнаружилась одна весьма неприятная проблема безопасности nginx, как частный случай, с ISPManager (конфиг).
Суть следующая: nginx свободно ходит по симлинкам (не имея контролирующих подобное поведение директив), опять же, в отличие от хардлинка, не надо иметь соответствующих прав, чтобы залинковать файл.
Из коробки, в ISPManager (может и в других панелях, поддерживающих его), создается отдельный локейшен под статику, через который nginx ходит прямо к файлам.
Достаточно иметь доступ к созданию файлов (линков, хоть даже через менеджер файлов манагера), чтобы через линк получить доступ с правами воркера nginx к любому файлу.
Пример:
Имеем аккаунт, виртуалхост и локейшен обрабатываемый стандартной регуляркой ~* ^.+\.(jpg|jpeg|gif|png|svg|js|css|mp3|ogg|mpe?g|avi|zip|gz|bz2?|rar)$
К примеру, владелец user1.
Делается линк в корне сайта, например something.css -> /$homedirs/user2/$site/config.php,
не доступный для чтения самим user1(mgrsecure), обращаемся по http к something.css, получаем конфиг в красивом виде.
Естественно, должен читаться с правами nginx. Учитывая, что для раздачи статики в хоумдиры nginx'у попадать надо, по пути нормальных прав не организуешь, а в рамках шареда, сущие единицы следят за правами своих файлов.
На вскидку подумал над тем как полечить, несколько костылей:
-С Freebsd шибко не знаком, но где-то натыкался на параметр монтирования nosymfollow, возможно оно.
-Временно отказаться от прямой раздачи статики, оставив в качестве только буферизующего прокси, не совсем решение, но вариант.
-Более-менее красивый вариант (на мой взгляд), проверять файл на линк.
Из доки следует, что -f должен быть true, только если файл регулярный, однако на практике не работает, из коробки -f не отличает файл от линка.
Ковырнул, стало понятно что файл проверяется через stat(), на сколько понимаю, будет проверен файл, на который указывает линк. Попробовал lstat() , теперь -f линки от файлов стал отличать, (не уверен, не вылезет ли каких проблем, но на вскидку - нет). /src/os/unix/ngx_files.h
А суть в следующем: проверять запрашиваемый файл, в каждом локейшене для статики, на предмет не линк ли он, и если линк, отдавать 403, примерно так:
if ( !-f $request_filename ) { return 403; } //Основное
Дополнительно:
if ( -d $request_filename ) { break; } //Если у кого-то есть диры с названиями, похожими на статический файл, и нужен оттуда индекс корня, выше проверки на линк.
if ( $realpath_root != $document_root ) { return 403; } // На случай, если есть статически заданные локейшены, обрабатываемые прямо nginx'ом (от промежуточных линков в пути).
Для новых виртуалхостов, можно добавить сабж в server.templ, чтобы манагер добавлял при создании.
//Если кто решит временно подшиться через проверку файла, существующий конфиг обработал новыми правилами так: (на точность тоже не претендует, ибо в попыхах, но у меня чисто отработал (локейшены манагеровские, обычные)).
да, есть такое. нужно запретить создавать симлинки. как вариант запускать несколько экземпляров nginx от разных юзеров. но это все очень непросто, а порой геморрой реализации может перекрыть весь профит от использования nginx.
да, есть такое. нужно запретить создавать симлинки.
Это как? 🍿
Более-менее красивый вариант (на мой взгляд), проверять файл на линк.
Баг насоздать не задумались? У апача есть опции на тему ходьбы по линкам. Тем более, нельзя ходить за пределы DocumentRoot.
Из коробки, в ISPManager (может и в других панелях, поддерживающих его), создается отдельный локейшен под статику, через который nginx ходит прямо к файлам.
Есть еще одно решение: убрать к ляду этот локейшен. Вряд-ли на массовом виртуальном хостинге у вас будут сайты, для которых польза от него будет заметна.
А если у вас пара проектов - зачем вообще ISPManager? :)
Это как? 🍿
методы есть разные, в том числе, как уже упомянули, соответствующей опцией монтирования, правкой исходников, ограничением доступа к серверу.
---------- Добавлено 07.01.2012 в 00:05 ---------- Предыдущее сообщение было 06.01.2012 в 23:43 ----------
вот еще есть на эту тему.
правкой исходников, ограничением доступа к серверу.
Несмешно.
вот еще есть на эту тему.
Там ответил автор "сейчас - никак" (тм)
Несмешно.
Там ответил автор "сейчас - никак" (тм)
верно. проверять каждый компонент пути на предмет симлинк или нет - дорогая процедура. опционально, могли бы сделать уже. видимо, не сильно просят такую фичу.
---------- Добавлено в 00:27 ---------- Предыдущее сообщение было в 00:26 ----------
Несмешно.
ну, любителям ставить бинарные пакеты, наверное, не смешно, а тем, кто привык все делать ручками - флаг в руки и барабан на шею :)
Ещё в 2007 году ответил.
а это не поможет?
http://www.lexa.ru/nginx-ru/msg14919.html
а это не поможет?
http://www.lexa.ru/nginx-ru/msg14919.html
возможно. но для большей гибкости нужно что-то типа open_basedir в PHP.
производительность упадет, если делать в лоб.
Обещают счастье через 3 недели http://trac.nginx.org/nginx/milestone/1.1.14
Обещают счастье через 3 недели http://trac.nginx.org/nginx/milestone/1.1.14
Это хорошо через 3 недели проверим