- Поисковые системы
- Практика оптимизации
- Трафик для сайтов
- Монетизация сайтов
- Сайтостроение
- Социальный Маркетинг
- Общение профессионалов
- Биржа и продажа
- Финансовые объявления
- Работа на постоянной основе
- Сайты - покупка, продажа
- Соцсети: страницы, группы, приложения
- Сайты без доменов
- Трафик, тизерная и баннерная реклама
- Продажа, оценка, регистрация доменов
- Ссылки - обмен, покупка, продажа
- Программы и скрипты
- Размещение статей
- Инфопродукты
- Прочие цифровые товары
- Работа и услуги для вебмастера
- Оптимизация, продвижение и аудит
- Ведение рекламных кампаний
- Услуги в области SMM
- Программирование
- Администрирование серверов и сайтов
- Прокси, ВПН, анонимайзеры, IP
- Платное обучение, вебинары
- Регистрация в каталогах
- Копирайтинг, переводы
- Дизайн
- Usability: консультации и аудит
- Изготовление сайтов
- Наполнение сайтов
- Прочие услуги
- Не про работу
Все что нужно знать о DDоS-атаках грамотному менеджеру
И как реагировать на "пожар", когда неизвестно, где хранятся "огнетушители
Антон Никонов
Авторизуйтесь или зарегистрируйтесь, чтобы оставить комментарий
Предлагаю вашему вниманию своё решение защиты админки WP (или любой другой CMS -- не важно) для серверов, работающих на NGINX. Совсем нетривиальное, как мне кажется.
"Чё, изобретаешь велосипед?" -- спросите вы. :crazy:
Да, потому как все виденные мною решения (в том числе из этой темы), лично мне, совсем не понравились. Куки юзать? Не подходит хотя бы по одной простой причине -- я вообще не хочу, чтобы кто-то мог узнать/зайти по адресу wp-admin -- просто не хочу, чтобы кто-то знал, что мой сайт вообще работает на WP. И сайт сделан так, что только очень опытный юзер сможет распознать именно WP (да-да, вы нигде не увидите в сорсах wp-content или чего-то подобного). ;)
В общем, были поставлены вот такие задачи:
1. Отсечь ботов.
2. Снизить нагрузку на сервер -- отдавать 404 средствами NGINX, а не CMS, не пропуская к PHP.
3. Скрыть использование/админку WP и для обычных юзеров, а не только ботов.
4. Не модифицировать исходник WP (не переименовывать wp-login.php и прочее).
5. Возможность без проблем юзать свой сайт с динамического IP. Тупо "allow $myip" тут совсем не подходит.
6. Удобство.
7. Никаких плагинов WP -- смерть им всем, ибо жутко кривые часто и тормозят всю систему.
Ломал я свою голову над этим ТЗ целый вечер и ночь. :crazy: Ломал долго, потому как в серверных делах и в NGINX в частности я далеко не спец.:idea:
Что же получилось в итоге. Итак, мой "велосипед", который проверен на NGINX 1.4.4 + php5-fpm (php 5.5):
1. Создаём php файл в корне сайта и называем его как вашей душе угодно. Содержимое:
Думаю, тут всё понятно, но поясню для людей не в теме (пояснение по строчкам):
1. Выясняем IP обратившегося.
2. Дефолтный ответ, который вы увидете в браузере, если IP нормальный. Опционально.
3. Простая проверка IP на "нормальность" -- защита от "случайных случаев". :) Пропустит только похожее на IPv4. Если будет что-то не так -- пропишется IP локалхоста (127.0.0.0), а в браузере вы увидите ответ "2 х 404" (можете заменить на что угодно).
4. Открываем файл, который будет иметь название === IP. Если файла нет, то он будет создан. Замечание: не забудьте создать папку и выставить правильные права у "ips-allowed".
5. Закрываем файл, ничего в него не записывая, ибо нам не зачем.;)
6. Эхаем в браузер наш ответ. Опционально.
7. Отдаём 404-ый ответ любому обратившемуся к этому php файлу. Опционально. Гарантирует неиндексацию ботами и непонимание случайным юзерам. :D:
Обращение будете делать к ваш_сай/ваш_файл.php
На этом с php всё.
2. Редактируем конфиг сервера NGINX:
3. Всё. :popcorn:
При каждом запросе к админке (или другому пути в location -- как пожелаете) идёт проверка наличия файла с именем равным вашему IP ($remote_addr -- переменная NGINX). Эта проверка -- единственное, что нагружает NGINX, но без неё никак. И, ИМХО, нагрузка тут будет не шибко большая -- любой нормальный сервер (VPS даже) выдержит 1000 запросов в минуту и не поперхнётся. Проверено на 5-баксовом Digitalocean. В дополнение ко всему не забывайте использовать limit_req.
С удовольствием выслушаю любую критику и/или предложения, вопросы.:popcorn:
Ещё раз повторяю: я в этих серверных делах не профи, но попробовал -- пашет хорошо (на первый взгляд).
п.с.: ах, да, забыл сказать, что же делать с накапливающимися файлами -- очистка папки по cron вам в помощь. ;)
а не проще просто allow/deny?
http://wiki.nginx.org/HttpAccessModule
а не проще просто allow/deny?
http://wiki.nginx.org/HttpAccessModule
Что именно?
У меня в NGINX в if (...) allow/deny выдавало ошибку конфига (нельзя там это использовать, видимо). return -- нет.
siv1987, вы вообще понимаете, зачем вся эта "пляска"?
Решение с одним IP -- никому не нужная ерунда. И даже с подсетями.
Весь кайф кода, что я привёл -- именно отвязка от IP. С любого IP можно зайти в админку просто посетив страницу одну до этого.
Прочитайте ещё раз.
Вот у меня динамический IP на ADSL (там, где живу, лучшего нет) и покупать статику я совсем не хочу по определённым причинам (+деньги, +не надо, +...).
Да плюс ко всему мне надо иметь возможность зайти с IP какого-нибудь оператора сотовой связи.
Или я отдыхаю в Эмиратах. Или у меня куча постеров/админов/модеров.
Для всех них писать и постоянно редактировать allow директиву? Смеётесь? :)
---------- Добавлено 17.02.2014 в 20:00 ----------
НЕБОЛЬШАЯ ПОПРАВКА!
Немного ошибся при описании $root_path в примере (написал как было бы в php :) ):
Вместо:
$root_path = путь_к_корню_вашего_сайта
...
Надо:
set $root_path путь_к_корню_вашего_сайта;
...
т.е. в любом случае дополнительные манипуляции с обращением к скрытой странице?
тогда особо смысла и разницы с такой конструкцией нет (или другой вариант -получение спецкуки)
auth_basic "login and pass!!!";
auth_basic_user_file /etc/httpd/conf.d/.htpasswd;
location ~* ^/(wp-admin|administrator|wp-login\.php|admin\.php) {
proxy_pass http://$server_addr:81;
proxy_redirect http://$server_addr:81/ /;
proxy_set_header Host $host;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_set_header X-Forwarded-Proto $scheme;
proxy_set_header X-Real-IP $remote_addr;
}
}
нагрузки нгиксу от выдачи окна авторизации (и как следствие 401 ошибки) 0 целых 0 десятых
---------- Добавлено 17.02.2014 в 21:55 ----------
кстати поделитесь секретом, как без модификации движка вы перекроили стандартные пути и папки ☝ ???
---------- Добавлено 17.02.2014 в 22:00 ----------
пока что выглядит именно как
в чем "крутость" кода????
тогда особо смысла и разницы с такой конструкцией нет (или другой вариант -получение спецкуки)
Разницу с моим подходом смотри:
1. Нужно делать htpasswd.
2. Нужен лишний логин/пароль.
3. ЛЮБОЙ зайдёт в wp-admin и ему предоставят инфо, что "ДА, ЭТО WORDPRESS -- ДАЙ СВОЙ ЛОГИН/ПАРОЛЬ". Прямо-таки афиша с надписью: "(тр/x)а(х/к)ни меня!". :D
Это только на первый взгляд. ;)
---------- Добавлено 17.02.2014 в 22:10 ----------
нагрузки нгиксу от выдачи окна авторизации (и как следствие 401 ошибки) 0 целых 0 десятых
Нагрузка от проверки наличия файла только для локации определёной также стремиться к нулю. И она меньше, чем авторизация с последующей проверкой. ;)
---------- Добавлено 17.02.2014 в 22:13 ----------
кстати поделитесь секретом, как без модификации движка вы перекроили стандартные пути и папки ???
Зачем их перекраивать? ;) Чуток редиректов простейших и отказ от убогих плагинов. Относительные урлы.
Для относительного примера погуглите тему "WP Roots Theme". Идея оттуда взята.
---------- Добавлено 17.02.2014 в 22:13 ----------
пока что выглядит именно как
Пока что не услышал в ответ ничего такого (с аргументами верными), чтобы это было именно так. ;)
Пока что выглядит именно как "я не понял чо это, но автор -- сами_знаете_кто". :)
Ничего, я не девочка и не малолетка -- всё понимаю. ;)
1. ТС пока что твой вордпресс легко определим, даже не смотря на "невидимые" wp-admin и wp-login.php
Хочешь скажу как :) ?
2.
это каким же образом незнаючи логин и пароль ;)
3. локейшн в http и получаем
🙅
server наше все...
4.
тут можно поспорить, что больше нагрузит систему в целом - выдача запроса на авторизацию (уже загружено в оперативке и ждет выполнения) или создание новых файлов на жестком и обращение к ним, ибо брутфорсы не с одно ip идут ;) - вспомнить хотя бы августовский брут, когда хостеры банили по 10-30к ip
1. ТС пока что твой вордпресс легко определим, даже не смотря на "невидимые" wp-admin и wp-login.php
Хочешь скажу как ?
Почитай выше внимательно, почему мой WP не так легко определим. ;)
Дело совсем не только в wp-admin/login.
это каким же образом незнаючи логин и пароль
Я нигде не сказал, о том, что он пройдёт дальше авторизации. ;) Факт наличия этой самой авторизации даст понять, что перед нами WP.
server наше все...
Тьфу, естественно, что локейшены в блоках server надо прописывать. Прописную истину забыл в примере указать. Не отредактируешь уже первое сообщение...
тут можно поспорить, что больше нагрузит систему в целом - выдача запроса на авторизацию (уже загружено в оперативке и ждет выполнения) или создание новых файлов на жестком и обращение к ним, ибо брутфорсы не с одно ip идут - вспомнить хотя бы августовский брут, когда хостеры банили по 10-30к ip
Опять читаем через строчки и невнимательно? :)
Я, вот, старался, описывал, а вы даже прочитать внимательно один раз не можете. Обидно даже.
Таки ответьте мне, когда в моём примере (и сколько раз) создаются файлы с IP, и имеют ли к ним доступ и возможность создания сами боты? ;)
1к в минуту мой вариант отобьёт АБСОЛЮТНО легко и непринуждённо даже на VPS-ке за 5 баксов. И даже банить никого не надо. ;) Имитировал такую нагрузку на самом дешевом дроплете Digitalocean -- сайт вполне был отзывчив и работоспособен. 1к в минуту -- цифра немаленькая, не? :)
потерто про жесткий
принципиального отличия от варианта с получением спецкуки нет...
Повторю: хочешь скажу как?
принципиального отличия от варианта с получением спецкуки нет...
Да, конечно. Опять не читаем.
Повторю: хочешь скажу как?
Давай-давай, конечно! К чему лишние вопросы?