Недорогой способ защиты от HTTP-флуда
Tuesday, August 25, 2009
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 можно найти в разделе ???.
Обслуживание элементов оформелния страниц, хелперов - хранение большого количества мелких файлов распределённых по разным директориям, чтение большого количества файлов при обслуживании пользовательского запроса.
Для данной задачи рекомендуется использование 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, сайт работает.
в 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...
Для 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
Для предотвращения bruteforce-атак по подбору паролей во FreeBSD или OpenBSD можно использовать
возможность пакетного фильтра PF по лимитированию числа соединений за единицу времени в сочетании с блокировкой по таблицам.
Добавляем в /etc/pf.conf
# Подключаем ранее составленный список заблокированных за излишнее число коннектов IP
table
# Блокируем все входящие соединения с 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
Перечитываем конфигурацию 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);
Иногда структуру созданную с помощью CREATE TABLE нужно изменить. Проще всего это сделать на пустой таблице, иначе нужно смотреть чтобы в итоге преобразования не потерялись какие-то нужные данные. В любом случае, если вы делаете это первый раз, создайте заранее резервную копию базы. Изменение структуры:
Переименовать таблицу:
ALTER TABLE myfirsttable RENAME mysecondtable;
ALTER TABLE mytable CHANGE a b INTEGER;
ALTER TABLE mytable ADD mytimestamp TIMESTAMP;
ALTER TABLE mytable DROP COLUMN notneeded;
ALTER TABLE mytable MODIFY a TINYINT NOT NULL, CHANGE b c CHAR(20);
Subscribe to:
Posts (Atom)