Tuesday, August 25, 2009

Недорогой способ защиты от HTTP-флуда (ddos)

 Недорогой способ защиты от HTTP-флуда

http://habrahabr.ru/blogs/infosecurity/67685/

Thursday, August 20, 2009

Рекомендации по выбору файловых систем для конкретных задач

Рекомендации по выбору файловых систем для конкретных задач

Обслуживание элементов оформелния страниц, хелперов - хранение большого количества мелких файлов распределённых по разным директориям, чтение большого количества файлов при обслуживании пользовательского запроса.

  Для данной задачи рекомендуется использование raid уровня 0 (или 10).

  Наибольшую производительность для такой задачи показывает файловая система reiserfs версии 4 и выше.

  Следом идёт файловая система XFS, в интернете имеется достаточно информации по тюнингу данной файловой системы для работы с большим количеством файлов (искать по запросу "tune XFS").

  Пример 13.1. Настройка XFS для большого количества мелких файлов

  Опции для создания: -f -d sunit=128,swidth=512,unwritten=1 -l version=2,sunit=128

  Опции для монтирования: noatime,largeio,ihashsize=131072,attr2,barrier,allocsize=1073741824

  Следом идёт файловая система JFS.
База данных Postgresql

  Выбор файловой системы для базы Postgresql пока является личным делом администратора сервера. Однако этот выбор должен быть основан на серии экспериментов.

  Имеются хорошие отзывы о получении значительного роста производительность после перехода с различных файловых систем на reiserfs и zfs. Это объясняется наличием встроенного сжатия данных и, соответственно, повышением количества прочитанных данных, при той же скорости физического чтения с диска. Однако, очевидно, что декомпрессия данных требует дополнительных затрат процессорного времени.

  Советы по оптимизации Postgsql можно найти в разделе ???.

Friday, August 14, 2009

nginx ssl сертифікати

openssl req -new -x509 -days 999 -nodes -out server.crt -keyout server.key

борьба с DDOS и DOS на уровне nginx

FreeBSD, сетевая Intel fxp, порт 100Мбит, polling, http accept-filter
в sysctl
sysctl kern.maxfiles=90000
sysctl kern.maxfilesperproc=80000
sysctl net.inet.tcp.blackhole=2
sysctl net.inet.udp.blackhole=1
sysctl kern.polling.burst_max=1000
sysctl kern.polling.each_burst=50
sysctl kern.ipc.somaxconn=32768
sysctl net.inet.tcp.msl=3000
sysctl net.inet.tcp.maxtcptw=40960
sysctl net.inet.tcp.nolocaltimewait=1
sysctl net.inet.ip.portrange.first=1024
sysctl net.inet.ip.portrange.last=65535
sysctl net.inet.ip.portrange.randomized=0

в nginx моменты

worker_processes 1;
worker_rlimit_nofile 80000;
events {
worker_connections 50000;
}

server_tokens off;
log_format IP ‘$remote_addr’;
reset_timedout_connection on;

listen xx.xx.xx.xx:80 default rcvbuf=8192 sndbuf=16384 backlog=32000 accept_filter=httpready;

фильтрацию url например по критерию POST index.php?action=login с пустым реферером можно реализовать так
set $add 1;
location /index.php {
limit_except GET POST {
deny all;
}
set $ban “”;
if ($http_referer = “” ) {set $ban $ban$add;}
if ($request_method = POST ) {set $ban $ban$add;}
if ($query_string = “action=login” ){set $ban $ban$add;}
if ($ban = 111 ) {
access_log /var/log/nginx/ban IP;
return 404;
}
proxy_pass http://127.0.0.1:8000; #тут живёт апач
}

Дальше резали на уровне pf - загружали в таблицу IP с которых приходило слишком
много хитов. PF с таблицами работает очень быстро. Исходники парсера логов есть на
http://www.comsys.com.ua/files.

ну и по крону уже раз в минуту добавлять в ip table новые ip из лога

25Мбитный DDoS, преимущесвенно режущийся ip, остатки проходят на nginx, который по критерию обучает ip и остатки проксирует на апач - LA 0, сайт работает.


http://wiz.su/2007/10/28/borba-s-ddos-i-dos-na-urovne-nginx/

Настройка Pure-FTPd c авторизацией по скрипту

Настройка Pure-FTPd c авторизацией по скрипту
Для Unix систем есть большое количество серверов ftp обладающих богатым функционалом, 
каждый из которых обладает своими особенностями. Но в один прекрасный день мне потребовалось организовать 
авторизацию с помощью скрипта, который в зависимости от IP адреса должен был пускать в разные домашние 
директории. После недолгих поисков в интернете я обнаружил, что у Pure-FTPd авторизация по скрипту - 
штатная возможность. Итак, приступим.

Скачиваем архив с актуальной на текущий момент версии (в момент написания этой статьи текущая версия 1.0.22)

  wget http://download.pureftpd.org/pub/pure-ftpd/releases/pure-ftpd-1.0.22.tar.bz2

Распаковываем и простыми сочетаниями команд устанавливаем
  ./configure --with-rfc2640 --with-everything --prefix=/usr/local/pure-ftpd
  make
  sudo make install

--with-rfc2640 - необходима для перекодировки названий файлов на лету в разные кодировки 
(в моем случае клиенты подсоединяются к серверу с кодировкой cp1251 а на сервере же кодировка UTF-8)

--with-everything - создание демона с поддержкой всех функций Pure-FTPd

--prefix=/usr/local/pure-ftpd - каталог, куда собственно демон устанавливать

Теперь когда сервер установлен переходим к базовой конфигурации. Копируем конфигурационный файл в /etc из каталога с исходниками

  cp configuration-file/pure-ftpd.conf /etc/pure-ftpd.conf

Добавляем следующие строки в конфигурационный файл:

  ExtAuth /var/run/ftpd.sock # Включаем авторизацию по скрипту
  UserBandwidth 100 # Ограничиваем полосу в 100 Kb/c для каждого пользователя,
  # чтобы они не забивали весь канал
  MaxDiskUsage 90 # Установив это значение, мы запрещаем загрузку файлов на сервер, 
  # в случае если осталось всего 10% свободного места
  FileSystemCharset UTF-8 # Говорим что на сервере кодировка UTF-8
  ClientCharset CP1251 # А у пользователей CP1251

Создаем авторизующий скрипт /usr/local/pure-ftpd/sbin/ftp-auth-handler
Со следующим содержанием:

  if test "$AUTHD_REMOTE_IP" = "192.168.0.102"; then
  echo 'auth_ok:1'
  echo 'uid:69'
  echo 'gid:42'
  echo 'dir:/tmp'
  else
  echo 'auth_ok:0'
  fi
  echo 'end'

Этот скрипт успешно авторизует любого пользователя с IP 192.168.0.201

Кроме $AUTHD_REMOTE_IP в скрипте можно использовать следующие переменные:

  AUTHD_ACCOUNT
  AUTHD_PASSWORD
  AUTHD_LOCAL_IP
  AUTHD_LOCAL_PORT
  AUTHD_REMOTE_IP
  AUTHD_ENCRYPTED

В ответе скрипта можно передавать следующие параметры

  uid:xxx - UID пользователя в системе
  gid:xxx - GID пользователя в системе
  dir:xxx - Абсолютный путь до домашней директории
  throttling_bandwidth_ul:xxx - Ширина канала закачки на сервер
  throttling_bandwidth_dl:xxx - Ширина канала скачки с сервера
  user_quota_size:xxx - Дисковая квота пользователя в байтах
  user_quota_files:xxx - Максимальное количество файлов для пользователя
  per_user_max:xxx - Максимальное количество одновременных сессий

После этого осталось запустить сам сервер.

Скопируем запускающий скрипт pure-config.pl из каталога с исходниками

  cp configuration-file/pure-config.pl /usr/local/pure-ftpd/sbin/

Для запуска сервера выполняем следующую команду:

  /usr/local/pure-ftpd/sbin/pure-config.pl /etc/pure-ftpd.conf

Для запуска демона авторизации выполняем это:
  /usr/local/pure-ftpd/sbin/pure-authd -s /var/run/ftpd.sock -r /usr/local/pure-ftpd/sbin/ftp-auth-handler &

Осталось внести последние две строчки в автозагрузку, и на этом базовая настройка сервера закончена.
 
12.08.2009, Автор: ExpE , Источник: http://tips.compuserv.biz/index.php... 

Борьба с перебором паролей на FTP сервере при помощи пакетного фильтра PF

Борьба с перебором паролей на FTP сервере при помощи пакетного фильтра PF [исправить]
Для предотвращения bruteforce-атак по подбору паролей во FreeBSD или OpenBSD можно использовать 
возможность пакетного фильтра PF по лимитированию числа соединений за единицу времени в сочетании с блокировкой по таблицам.

Добавляем в /etc/pf.conf

  # Подключаем ранее составленный список заблокированных за излишнее число коннектов IP
  table persist file "/etc/pf.ftp.block.list"
 
  # Блокируем все входящие соединения с IP, которые присутствуют в черном списке
  block in quick on $ext_if from
 
  # Выявляем IP с которых было более 5 обращений за 40 секунд 
  # и добавляем этот IP в ранее созданную таблицу блокировки
  pass in quick on $ext_if inet proto tcp from any to ($ext_if) port 21 keep state (max-src-conn-rate 5/40, overload flush global)

Перечитываем конфигурацию PF:
  /etc/rc.d/pf reload
или
  /sbin/pfctl -f /etc/pf.conf 

Далее, чтобы сохранить созданную таблицу блокировки между перезагрузками, необходимо добавить
в /etc/rc.shutdown код для сброса в файл состояния таблицы перед завершением работы:
  /sbin/pfctl -t ftp-attacks -T show > /etc/pf.ftp.block.list

Для удаления определенного IP (например, 192.168.1.1) из таблицы:
  /sbin/pfctl -t ftp-attacks -T delete 192.168.1.1

Для добавления IP или подсети вручную:
  /sbin/pfctl -t ftp-attacks -T add 192.168.1.1
  /sbin/pfctl -t ftp-attacks -T add 192.168.1.0/24

Для полной очистки таблицы
  /sbin/pfctl -t ftp-attacks -T flush 

Для загрузки таблицы из файла:
  /sbin/pfctl -t ftp-attacks -T replace -f /etc/pf.ftp.block.list

Для поиска IP в таблице 
  /sbin/pfctl -t ftp-attacks -T test 192.168.1.1

Для вывода более подробной статистики по каждому из IP в таблице:
  /sbin/pfctl -t ftp-attacks -T show -v

Для очистки счетчиков срабатываний:
  /sbin/pfctl -t ftp-attacks -T zero


--------------------------

fail2ban?

зміна типу даних в mysql

изменение структуры таблицы MySQL

Иногда структуру созданную с помощью CREATE TABLE нужно изменить. Проще всего это сделать на пустой таблице, иначе нужно смотреть чтобы в итоге преобразования не потерялись какие-то нужные данные. В любом случае, если вы делаете это первый раз, создайте заранее резервную копию базы. Изменение структуры:

Переименовать таблицу:

ALTER TABLE myfirsttable RENAME mysecondtable;

Переименовать столбец:

ALTER TABLE mytable CHANGE a b INTEGER;

Добавить новый столбец TIMESTAMP с именем mytimestamp:

ALTER TABLE mytable ADD mytimestamp TIMESTAMP;

Удалить столбец:

ALTER TABLE mytable DROP COLUMN notneeded;

Изменить тип столбца a INTEGER на TINYINT NOT NULL (оставляя имя прежним) и изменить тип столбца b с CHAR(10) на CHAR(20) с переименованием его с b на c:

ALTER TABLE mytable MODIFY a TINYINT NOT NULL, CHANGE b c CHAR(20);