Фев 10 2009

Проверка и оптимизация всех MySQL бд одной командой

Есть хорошая MySQL утилита, называется mysqlcheck, с помощью этой утилиты можно выполнить сразу несколько полезных операций над всеми MySQL базами данных. Команду нужно запускать от суперпользователя root.

Восстановление & Оптимизация

mysqlcheck -Aor

Только ввостановление

mysqlcheck -Ar

Только оптимизация

mysqlcheck -Ao

Описание аргументов:
-A – Проверить на ошибки все Mysql базы данных
-r – Отремонтировать все Mysql базы данных
-o – Оптимизировать все Mysql базы данных


Фев 9 2009

Блокировка брутфорс атак c помощью iptables

Начиная примерно с 2005-го года увеличилось количество брутфорс атак на SSH сервис. Даже если ваш сервер хорошо зищищен, например установлены последнии версии всех пакетов это не значит что подобрать пароль к ftp,ssh,pop и другим сервисам не является возможным. Любой хакер может сорвать джекпот, подобрав пароль к одному из сервисов установленных на вашем сервере, но только в том случае если ваш фаервол бездействует.
Хватит всего 2-х iptables правил, что бы остановить брутфорс атаку на SSH.

Логи

Вот вам пример из файла auth.log. Как видите боты генерируют разные комбинации логин:пароль и пытаются авторизироваться на разных сервисах.

Jul 12 22:42:46 hostname sshd[10955]: Illegal user office from 211.191.73.xxx
Jul 12 22:42:46 hostname sshd[10855]: Failed password for illegal user office from 213.191.73.xxx port 53033 ssh2
Jul 12 22:42:46 hostname sshd[10957]: Illegal user samba from 213.191.74.xxx
Jul 12 22:42:46 hostname sshd[10957]: Failed password for illegal user samba from 213.191.74.xxx port 53712 ssh2
Jul 12 22:42:46 hostname sshd[10959]: Illegal user tomcat from 213.191.74.xxx
Jul 12 22:42:46 hostname sshd[10959]: Failed password for illegal user tomcat from 213.191.74.xxx port 54393 ssh2
Jul 12 22:42:46 hostname sshd[10961]: Illegal user webadmin from 213.191.74.xxx
Jul 12 22:42:46 hostname sshd[10961]: Failed password for illegal user webadmin from 213.191.74.xxx port 55099 ssh2
Feb  7 06:52:33 sitename24 sshd[31992]: Failed password for root from 87.244.yy.xx port 36490 ssh2
Feb  7 06:52:35 sitename24 sshd[32017]: Failed password for invalid user oracle from 87.244.24.38 port 36917 ssh2
Feb  7 06:52:38 sitename24 sshd[32040]: Failed password for invalid user test from 87.244.yy.xx port 37254 ssh2

Кратко о iptables.

Iptables – это стандартный фаервол в Linux, который я использую у себя на Debian машинах, по умолчанию он установлен и готов к работе. Изначально количество правил равно – 0.

Есть еще утилиты такие как fail2ban, которые занимаются примерно тем же что мы сейчас хотим сделать. Но я выбрал путь использовать iptables потому что он работает на уровне ядра и на сетевом уровне, т.е нагрузка на процессор будет минимальная, а fail2ban занимается тем что парсит логи, ищет там брутфорс атаки и блокирует вредителей.

Обезопасим себя

Пока вы тестируете новые правила для iptables, лучше позаботиться о своей безопасности, что бы не случилось так, что вы сами себя заблокируете, после чего не сможете удаленно подключиться к своему серверу по SSH протоколу.
Для этого пропишем в crontab-e следующее:

*/10 * * * * /sbin/iptables -F

Теперь если вдруг окажется, что вы заблокировали себя, crontab очистит таблицу с правилами через 10 минут, и вы сможете снова подключиться

Два правила

sudo iptables -A INPUT -i eth0 -p tcp --dport 22 -m state --state NEW -m recent --set --name SSH
sudo iptables -A INPUT -i eth0 -p tcp --dport 22 -m state --state NEW -m recent --update --seconds 60 --hitcount 8 --rttl --name SSH -j DROP

-i eth0 это сетевой интерфейс на котором висит SSH. Обычно по умолчанию у многих это eth0, но если у вас другой, уважите его. Посмотореть каие у вас в системе интерфейсы можно используя утилиту ifconfig.

Готово! Теперь все входящие подключения на ваш SSH сервис – лимитированы, максимальное количество попыток подключиться – 8 в минуту. Нормальные пользователи без проблем смогут пользоваться дальше SSH сервисом, а почти все брут-форс атаки на SSH будут блокироваться нашим фаерволом iptables.

Вывести список правил в iptables

iptables -L

Удалить все правила

iptables -F

Это один из тысячь примеров как можно использовать iptables, есть еще много интересных правил которые можно использовать для борьбы легкими dos, ddos, flood атаками, http post брутфорсами, и так далее.

Ссылки

Краткое описание и список команд можно посмотреть на wikipedia
Руководство iptables


Фев 7 2009

Перенос всех MySQL баз данных с одного сервера на другой

Есть задача, нужно перенести все MySQL базы данных с одного сервера на другой, обычно это делают используя дамп всех MySQL баз данных, затем закачивают на другой сервер и импортируют дамп в MySQL, вариант хорош если вам некуда спешить, и нестрашно потратите вы на это час, два, или пол дня. Для одиночного переноса о репликации говорить тут не уместно. Я предлагаю более идеальный вариант как можно напрямую перенаправлять вывод дампа с одного сервера на другой.

Достоинства:

  • Очень быстро, потому что дамп не попадает даже на жесткий диск, а сразу передается по сети на другой сервер и там же импортируется в MySQL. (Ок, тут немного соврал, возможно что-то где-то свопится :) )
  • Мы напишем скрипт который будет все делать сам при запуске, так мы можем делать бекап всех MySQL баз.
  • А также вы можете положить скрипт в crontab, и регулярно синхронизировать базы данных, без репликации.

Предупреждения

Будьте осторожны, этот скрипт уничтожит все существующие базы данных на стороне нового сервера.
Материал очень серьезный, если вы новичок, и не понимаете что делаете, лучше не рискуйте, потратте больше времени, сделайте стандартными методами бекап, зато будете уверены что все нормально.
А те кого уже достало руками перекидывать базы данных, тот может автоматизировать этот процесс, используя скрипт что ниже.

Скрипт

#!/bin/bash
# Указываем путь к mysql и mysqldump
CMD_MYSQL="/usr/bin/mysql"
CMD_MYSQLDUMP="/usr/bin/mysqldump"
 
# логин, пароль, имя хоста на локальном сервере
DB_USER_FROM="root"
DB_PASS_FROM="passxxx"
DB_HOST_FROM="source.example.com"
 
# логин, пароль, имя хоста на удаленном сервере (куда будет заливаться копия всех бд)
DB_USER_TO="root"
DB_PASS_TO="passxxx"
DB_HOST_TO="destination.example.com"
 
# Получаем список всех БД
echo "database sync"
DATABASES=`echo "SHOW DATABASES;" | ${CMD_MYSQL} -p${DB_PASS_FROM} -u ${DB_USER_FROM} -h ${DB_HOST_FROM}`
 
# Начинаем обрабатывать каждую базу данных кроме information_schema и Database
for DATABASE in $DATABASES; do
  # skip non-databases
  if [ "${DATABASE}" != "Database" ] && [ "${DATABASE}" != "information_schema" ]; then
    echo "transmitting ${DATABASE}"
 
    # Создаем базу данных на удаленном сервере если такая еще не существует
    echo "CREATE DATABASE IF NOT EXISTS ${DATABASE}" | ${CMD_MYSQL} -p${DB_PASS_TO} -u ${DB_USER_TO} -h ${DB_HOST_TO}
 
   #Дампим базу данных и перенаправляем вывод дампа прямо на удаленный сервер
    ${CMD_MYSQLDUMP} -Q -B --create-options --delayed-insert --complete-insert --quote-names --add-drop-table -p${DB_PASS_FROM} -u${DB_USER_FROM} -h${DB_HOST_FROM} ${DATABASE} | ${CMD_MYSQL} -p${DB_PASS_TO} -u ${DB_USER_TO} -h ${DB_HOST_TO} ${DATABASE}
  fi
done

Сохраните куда нибудь скрипт, например в /root/bin и сделайте его выполняемым

chmod  a+x /root/bin/mysql-sync.bash

Что дальше

1) Правим скрипт, указывая свои данные.
2) Проверяем как настроен iptables, разрешаем ему коннект к удаленному серверу и 3306 порту.
3) На удаленном сервере разрешаем подключение к себе (на уровне MySQL).

GRANT all on *.* to 'root'@'hostname';

Запуск

/root/bin/mysql-sync.bash

Способ также хорош для разработчиков веб приложений, которые работают с локальной БД, и часто занимаются переносом бд с local на удаленный сервер. Одним кликом запускаете синхронизацию баз данных, и наслаждатесь процессом.


Фев 6 2009

Не работает backspace zsh(ssh) => debian?

Многие пользователи Mac OS X часто сталкиваются с проблемой, когда подключившись к Debian серверу через SSH, клавиша backspace не работает.
Исправить это легко, открываем у себя ~/.zshrc и добавляем в конец файла следующие строки:

bindkey "^?" backward-delete-char 
bindkey "^[[3~" delete-char

Переподключаемся, теперь backspace должен работать.