00m.Ru
16Фев/140

Защищаем Joomla от брутфорса при помощи bruteblock’a

Заметил на сервере в логах Jooml'ы неудачные авторизации в файле error.php, Joomla сама рапортует о неудачных попытках в этот файл в моем случае конфигурация сервера была FreeBSD 10 + Nginx+PHP-FPM+MySQL+chroot. Файл error.php лежал по пути /usr/local/www/example.org/log/error.php, на сервере так же установлен bruteblock который служил стражем против брутфорса sshd демона о его настройке говорить не буду статей на просторах инета достаточно, предположим что у Вас он установлен и настроен...

Bruteblock работает с syslog'ом и берет все неудачные попытки авторизации из него же, встал вопрос о перенаправлении вывода из файла error.php в syslog и попалась мне утилитка входящая в состав UNIX систем под названием logger с ее помощью мы перенаправим файл error.php в syslog для этого добавим строчку в cron запускаем "crontab -e" и прописываем:

* * * * * /usr/bin/logger -f /usr/local/www/example.org/log/error.php -t joomla -p auth.info && /bin/cat /dev/null > /usr/local/www/example.org/log/error.php

после этого наш файл error.php будет каждую минуту скидываться в syslog с тегом joomla приоритетом auth.info и обнулятся что бы в следующий раз не импортировать уже существующие записи, теперь в логе /var/log/auth.log должны появляться записи:

Feb 16 18:12:42 example joomla: 2014-02-16 14:11:44 INFO 1.2.3.4 Joomla FAILURE: Username and password do not match or you do not have an account yet. ("admin")
Feb 16 18:12:42 example joomla: 2014-02-16 14:12:26 INFO 1.2.3.4 Joomla FAILURE: Username and password do not match or you do not have an account yet. ("aaaa")
Feb 16 18:12:42 example joomla: 2014-02-16 14:12:29 INFO 1.2.3.4 Joomla FAILURE: Username and password do not match or you do not have an account yet. ("aaaa")
Feb 16 18:12:42 example joomla: 2014-02-16 14:12:32 INFO 1.2.3.4 Joomla FAILURE: Username and password do not match or you do not have an account yet. ("aaaa")
Feb 16 18:12:42 example joomla: 2014-02-16 14:12:34 INFO 1.2.3.4 Joomla FAILURE: Empty password not allowed ("aaaaa")
Feb 16 18:12:42 example joomla: 2014-02-16 14:12:37 INFO 1.2.3.4 Joomla FAILURE: Username and password do not match or you do not have an account yet. ("aaaaaa")
Feb 16 18:12:42 example joomla: 2014-02-16 14:12:40 INFO 1.2.3.4 Joomla FAILURE: Username and password do not match or you do not have an account yet. ("aaaa")

OK, идем дальше

теперь создаем конфиг для bruteblock'а  /usr/local/etc/bruteblock/joomla.conf с содержимым:

regexp = joomla.*INFO.(\d{1,3}\.\d{1,3}\.\d{1,3}\.\d{1,3}).Joomla FAILURE.*
max_count = 4
within_time = 600
reset_ip = 3600
ipfw2_table_no = 1

и добавим в файл /etc/syslog.conf обработчик

auth.info;authpriv.info | exec /usr/local/sbin/bruteblock -f /usr/local/etc/bruteblock/joomla.conf

перезапускаем syslog

# /etc/rc.d/syslogd restart
Stopping syslogd.
Waiting for PIDS: 3855.
Starting syslogd.

и наслаждаемся результатом... теперь если кто то попытается ввести неверный логин и пароль 4 раза в течение 10 минут, то он будет полностью отрезан от сервера на один час... посмотреть заблокированные IP адреса можно командой:

# ipfw table 1 list
1.2.3.4/32 1392563442
4.3.2.1/32 1392563562
1.2.4.3/32 1392564766

очистить список заблокированных:

# ipfw table 1 flush

По аналогии можно реализовать и на других CMS системах

2Фев/140

Справочник по Vim

ОБЩИЕ КОМАНДЫ:

:help — получение справки
:help xxx — справка по конкретной команде или понятию
Ctrl+g — информация о файле и положении курсора
ga — информация о символе под курсором
Ctrl+n — автодополнение ранее введённых слов
:!<команда> — выполнение внешних команд (например,
:! firefox % — просмотр редактируемой страницы в firefox)

УПРАВЛЕНИЕ КУРСОРОМ И ПРОКРУТКОЙ:

h — курсор влево
j — курсор вниз
k — курсор вверх
l — курсор вправо
[№ строки] Shift+g — переход к заданной строке (без номера — переход в конец файла)
gg — переход в начало файла
Ctrl+e — сдвиг окна на одну строку вверх (курсор остается на месте)
Ctrl+y — сдвиг окна на одну строку вниз (курсор остается на месте)
Ctrl+f — вниз на одну страницу
Ctrl+b — вверх на одну страницу
{ или } — начало текущего или следующего параграфа

ОТКРЫТИЕ, ЗАКРЫТИЕ И СОХРАНЕНИЕ ФАЙЛА И ЕГО ЧАСТЕЙ:

:w file — сохранение файла с именем file
:sav file — сохранить как
:e file — открытие файла
:e / — открывает «файл менеджер»
:q — выйти из файла
:q! — выйти без сохранения изменений
:wq — сохранить изменения и выйти
:#,# w file — сохранение части файла между двумя строками в file
:r file — вставка файла в позиции курсора
:next f1.txt f2.txt — открыть несколько файлов одновременно
:next — перейти к следующему открытому файлу
:prev — перейти к предыдущему открытому файлу

«ФАЙЛОВЫЙ МЕНЕДЖЕР»:

:e {каталог} — открывает дерево каталогов в текущем окне
:E — открывает дерево каталогов в новом окне с горизонтальным разделением
:Ve — открывает дерево каталогов в новом окне с вертикальным разделением

УДАЛЕНИЕ И ЗАМЕНА СИМВОЛОВ:

x — удалить символ под курсором
X — удалить символ перед курсором
r — замена символа под курсором
R — замена более чем одного символа
~ — смена регистра выделенного блока либо символа под курсором
u — устновить нижний регистр для выделенного фрагмента
U — устновить верхний регистр для выделенного фрагмента

СДВИГ И СЛИЯНИЕ СТРОК:

> — сдвинуть выделенный фрагмент вправо
< — сдвинуть выделенный фрагмент влево >> — сдвинуть строку вправо
<< — сдвинуть строку влево
J — слияние текущей строки со следующей

КОМАНДЫ ВСТАВКИ:

i — вставить текст перед символом под курсором
I — вставить текст в начале строки
а — вставить текст после символа под курсором
A — вставить текст в конец строки
o — пустая строка ниже курсора и переход в режим вставки
O — пустая строка выше курсора и переход в режим вставки
Ctrl+q — вставляет символ, код которого следует за нажатием комбинации.

КОМАНДЫ УДАЛЕНИЯ:

[n] d объект ИЛИ d [n] объект
[n]dd — удалить n строк
n — число повторений команды (по умолчанию n=1)
D — удалить до конца строки

КОМАНДА ЗАМЕНЫ:

[n] объект c ИЛИ c [n] объект
[n]cc — изменить n строк
n — число повторений команды (по умолчанию n=1)

КРАТКИЙ СПИСОК ОБЪЕКТОВ (МОГУТ БЫТЬ ИСПОЛЬЗОВАНЫ ДЛЯ ПЕРЕМЕЩЕНИЯ КУРСОРА):

w — от курсора до конца слова, включая завершающий пробел
e — от курсора до конца слова, не включая завершающий пробел
b — от курсора до начала слова
$ — от курсора до конца строки
^ — от курсора до начала строки

КОМАНДЫ ОТМЕНЫ И ПОВТОРА:

u — отмена изменения
V — отмена изменений во всей строке
Ctrl+R — отмена отмены
. — повторить команду

КОПИРОВАНИЕ И ВСТАВКА ТЕКСТА:

v — визуальный режим, выделение текста посимвольно
V — визуальный режим, выделение текста построчно
Ctrl+V — визуальный режим, выделение прямоугольного блока
ggVG — выделить всё
gv — вернуться к ранее выделенной области
y — скопировать выделение
[n]yy — скопировать n строк (по умолчанию n=1)
p — вставка последнего удалённого или скопированного текста под курсором
P — вставка последнего удалённого или скопированного текста над курсором
[p - вставка скопированного текста перед курсором
]p — вставка скопированного текста после курсора

РАБОТА С ИМЕНОВАННЫМИ РЕГИСТРАМИ:

:reg — показать содержимое всех регистров
{Visual}["x]y — скопировать выделенный текст в регистр x
{Visual}["x]Y — скопировать выделенные строки в регистр x
["x]p — поместить текст из регистра x после курсора
["x]P — поместить текст из регистра x перед курсором
x — [a-z] (перезапись содержимого регистра) или [A-Z] (добавление к содержимому регистра)

ПОИСК В ТЕКСТЕ:

/[шаблон] — поиск соответствия шаблону
n — повторить поиск
* — поиск слова под курсором
# — поиск слова под курсором в обратном направлении
Shift+n — повторить поиск в обратном направлении
?[шаблон] — поиск в обратном направлении
% — поиск парных элементов (например, скобки или if-endif)
[{ или ]} — перемещение между парными {}
gd — переход от места использования переменной к её локальному объявлению

ОПЕРАЦИЯ ЗАМЕНЫ:

:s/xxx/yyy — замена первого вхождения «ххх» на «ууу» в строке
:s/xxx/yyy/g — замена всех вхождений «ххх» на «ууу» в строке
:#,#s/xxx/yyy/g — замена всех «ххх» на «ууу» между двумя строками (# — номера строк)
:%s/old/new/g — замена всех «ххх» на «ууу» во всем файле
:s/xxx/yyy/c/i — /c-спрашивать подтверждение замены, /i-игнорировать регистр

АББРЕВИАТУРЫ:

ab xxx yyy — заменять все xxx на yyy
iab xxx yyy — то же, но только для режима insert
cab xxx yyy — то же, но только для командной строки
ab — показать все аббревиатуры
abc — удалить все аббревиатуры

МЕТКИ:

m{name} — установка метки с именем name (одна буква либо цифра)
‘{name} — переход на установленную метку
`{name} — переход на конкретную позицию курсора, помеченную меткой
:marks — показать все установленные метки
:delm! — удалить все метки в текущем буфере, но не A-Z или 0-9
:delm a — удалить метку a
:delm a b 1 — удалить метки a, b и 1
:delm p-z — удалить метки в диапазоне от p до z

КОДИРОВКА И ФОРМАТ КОНЦА СТРОКИ:

:set ++enc={кодировка} — открывает файл в указанной кодировке (cp1251, koi8-r, ibm866, utf-8)
:set ++fenc={кодировка} — конвертирует файл в указанную кодировку
:set fileformat={формат} — устанавливает формат конца строки dos,unix или mac (,,)

РАБОТА С ОКНАМИ:

:sp или Ctrl+w s — разделить окно на два по горизонтали
:vs или Ctrl+w v — разделить окно на два по вертикали
:new или Ctrl+w n — создаёт новое окно с пустым файлом (горизонтальное разделение)
:vne — создаёт новое окно с пустым файлом (вертикальное разделение)
Ctrl+w Ctrl+w — переход между окнами
Ctrl+w = — устанавливает равную высоту (ширину) окон

РАБОТА С ВКЛАДКАМИ:

:tabnew — создать новую вкладку
:tabc — закрыть текущую вкладку
:tabo — закрыть все остальные вкладки
:gt — перейти на следующую вкладку
:gT — перейти на предыдущую вкладку

СВОРАЧИВАНИЕ БЛОКОВ (ФОЛДИНГ):

:set fdm — показать текущий метод фолдинга
:set fdm={метод} — установить метод фолдинга (manual, indent, expr, marker, syntax, diff)
:zf — сворачивает выделенный блок текста (только для метода manual)
:zo — разворачивает блок
:zc — сворачивает блок
:zR — разворачивает все блоки
:zM — сворачивает все блоки
:zd — удаляет сворачиваемый блок
:zD — удаляет все сворачиваемые блоки
:zi — включить/выключить сворачивание блоков

РУССКАЯ РАСКЛАДКА И КОМАНДНАЯ СТРОКА:

:set keymap=russian-jcukenwin
:set iminsert=0
Теперь раскладку можно менять в режиме вставки клавишами Ctrl+^, оставляя
общую раскладку в латинице для удобства использования командной строки

ПРОВЕРКА ОРФОГРАФИИ:

Качаем с ftp://ftp.vim.org/pub/vim/runtime/spell/ файлы *.sug и *.spl
для соответствующей локали и помещаем их в ~/.vim/spell
(/usr/share/vim/vimcurrent/spell для Debian)
:setlocal spell spelllang=en,ru — включить проверку орфографии для русского и английского языков
:setlocal spell spelllang= — отключить проверку орфографии
]s — перейти к следующей ошибке
[s — к предыдущей ошибке
z= — выдать список возможных замен
zG — добавить слово в словарь
zW — пометить слово как ошибочное

УСТАНОВКА ПАРАМЕТРОВ, ПРИМЕРЫ:

:set ai — автоматически устанавливать отступ как у предыдущей строки
:set ic — игнорировать регистр при поиске
:set hls — подсвечивать все вхождения при поиске
:set sy enable — включить подсветку синтаксиса
:set wrap — переносить длинные строки
:set number — включить отображение номеров строк
:set nonumber — отключить отображение номеров строк
:colorscheme — установить цветовую схему
:set incsearch — показывать вхождения по мере набора при поиске

НАЗНАЧЕНИЕ КОМБИНАЦИЙ КЛАВИШ:

:map xxx yyy — назначает выполнение команды yyy при нажатии комбинации xxx
:unmap xxx — отменяет назначение для xxx
:mapc — отменяет все назначения
Например :map tn :tabnew — назначает открытие новой вкладки при нажатии tn

ФАЙЛ КОНФИГУРАЦИИ VIM:

Unix: ~/.vimrc
Windows: $VIM/_vimrc
Файл примера: $VIMRUNTIME/vimrc_example.vim

2Фев/140

FreeBSD PHP-FPM chroot — iconv(): Wrong charset, conversion from UTF-8 to cp1251 is not allowed

Заметил в логах сервера ошибку

PHP message: PHP Notice:  iconv(): Wrong charset, conversion from `UTF-8' to `cp1251' is not allowed in /public/iconv/file.php on line 22
PHP message: PHP Notice:  iconv(): Wrong charset, conversion from `UTF-8' to `cp1251' is not allowed in /public/iconv/file.php on line 22
PHP message: PHP Notice:  iconv(): Wrong charset, conversion from `UTF-8' to `cp1251' is not allowed in /public/iconv/file.php on line 22
...

Связка: PHP-FPM, Nginx, chroot
Как выяснилось, не хватает каких то файлов для правильной работы iconv, гугление не помогло, на помощь пришла стандартная утилита truss (аналог strace в Linux):

# truss iconv -f utf-8 -t cp1251 file.txt                                
...
open("/usr/lib/i18n/libmapper_std.so.4",O_CLOEXEC,041) = 4 (0x4)
...
open("/usr/share/i18n/csmapper/CP/UCS%CP1251.mps",O_CLOEXEC,037777703140) = 4 (0x4)
...

В выхлопе комманды я увидел, что iconv берет файлы *.mps - это карты кодировок:

open("/usr/lib/i18n/libmapper_std.so.4",O_CLOEXEC,041) = 4 (0x4)
open("/usr/share/i18n/csmapper/CP/UCS%CP1251.mps",O_CLOEXEC,037777703140) = 4 (0x4)

После этого я скопировал директории /usr/lib/i18n/ и /usr/share/i18n/ в chroot окружение и iconv перестал выдавать ошибки, решение не изящное, зато работает 🙂

1Фев/140

Чистка файлов при помощи find

Попробовал почистить файлы в папках при помощи find и xargs, получил ошибку

 find . -name access.log |xargs cat /dev/null >
zsh: parse error near `\n'

Решение:

find . -name access.log -exec dd if=/dev/null of={} \;
0+0 records in
0+0 records out
0 bytes transferred in 0.000024 secs (0 bytes/sec)
0+0 records in
0+0 records out
0 bytes transferred in 0.000037 secs (0 bytes/sec)
0+0 records in
0+0 records out
0 bytes transferred in 0.000018 secs (0 bytes/sec)
1Фев/140

Шпаргалка OpenVZ

 

Создание контейнера

vzctl create 101 --ostemplate centos-6-x86 #Создаем контейнер из шаблона
vzctl set 101 --name srv101 --save #Назначаем имя контейнеру srv101
vzctl set 101 --hostname srv101 --save #Назначаем hostname srv101
vzctl set 101 --onboot yes --save #Автозагрузка при старте системы
vzctl set 101 --privvmpages 1G:1G --save #Выделяем память в 1 Гигабайт
vzctl set 101 --diskspace 10G:10G --save #Выделим 10 Гигабайт дискового пространства
vzctl set 101 --ipadd 192.168.0.55/24 --save # Устанавливаем IP адрес
vzctl set 101 --gateway addr 192.168.0.1 --save #Устанавливаем маршрутизатор
vzctl set 101 --nameserver 8.8.8.8 --save #Установим DNS сервер для контейнера
vzctl set 101 --userpasswd root:123 #Устанавливаем пароль root'а
vzctl start 101 #Стартуем контейнер

Установка сети

vzctl set 101 --ipadd 192.168.0.55 --save #Добавить ip адрес для контейнера
vzctl set 101 --ipdel all --save #Удаление всех ip адресов для контейнера
vzctl set 101 --netif_add eth0 --save #Добавить интерфейс eth0 в контейнер
vzctl set 101 --netif_del all --save #Удаление всех сетевых интерфейсов

Работа с контейнером

Выполнить в контейнере команду можно так:

# vzctl exec 101 hostname
srv101

Войти в контейнер:

vzctl enter 101

Клонирование контейнера

На физическом сервере:

vzdump --compress --suspend 101

Перенос контейнера на другой сервер:

scp /vz/dump/vzdump-101.tgz user@192.168.0.96:/tmp/

На целевом сервере (Новый ID контейнера: если не занят 101 то используем его):

vzrestore /tmp/vzdump-101.tgz {Новый ID контейнера}

Смена IP адреса и хостнейма

vzctl set 101 --hostname {new-hostname} --save
vzctl set 101 --ipdel {old-ip} --save
vzctl set 101 --ipadd {new-ip} --save

Запускаем:

vzctl start 101

OpenVZ Web Panel

В качестве управления всеми виртуальными контейнерами можно воспользоваться Web-панелью "OpenVZ Web Panel" написанную российскими разработчиками.

promo

Установка:

wget -O - http://ovz-web-panel.googlecode.com/svn/installer/ai.sh | sh

После установки, в панел можно войти по ссылке http://your-host:3000