Май 2012
Пн Вт Ср Чт Пт Сб Вс
« Июл    
 123456
78910111213
14151617181920
21222324252627
28293031  
Рубрики

Архивы рубрики ‘Программы’

DirectAdmin — ограничение количества писем в час

Итак, вы пользуетесь DirectAdmin для предоставления услуг хостинга или в личных целях. Вам нужно, чтобы в случае закачки на сервер через дырявые скрипты или при взломе аккаунта скриптов для рассылки спама, чтобы весь этот спам не ушел моментом с вашего сервера. По этому вам требуется сделать ограничение на количество писем отправляемых с одного аккаунта.

Факты: DirectAdmin умеет ограничивать количество отправляемых писем в сутки с доменов пользователя, ограничение можно выставить общие для всех. С новой версией exim.pl, которая еще не идет со стабильным релизом DirectAdmin, можно задавать ограничения для определенного пользователя.

Мысли: например мы выставили ограничение в 500 писем в сутки, тогда эти 500 писем можно отправить все сразу, так и периодически. Из этого следует, что это не вариант предотвращения спама, потому что:

  • все письма можно отослать сразу (спамеру этого вполне достаточно);
  • так же есть веб ресурсы, которым требуется большое количество отправок корреспонденции и данное ограничение для них не подойдет.

Вывод: Хороший вариант – это ограничение количества писем в час, настраиваемое как для всех аккаунтов сервера, так и для определенного пользователя.

Решение: Все не только просто, а очень просто. DirectAdmin использует для подсчета количества писем и ограничение скрипт написанный на perl. Посмотрев содержимое /etc/exim.pl можно сразу найти функцию check_limits, где все и считается. Итак, открываем этот файл на редактирование и заменяем эту функцию с ее содержимым на:

sub check_limits
{
my $count = 0;
my $last_send = 0;
my $cur_time = 0;
my $diff_time = 0;

if (open (LIMIT, "/etc/virtual/limit_$name"))
{
$email_limit = int(LIMIT);
close(LIMIT);
}
else
{
open (LIMIT, "/etc/virtual/limit");
$email_limit = int(LIMIT);
close(LIMIT);
}

#find the curent user
$uid = find_uid();

#log_str("Found uid: $uid\n");

if (uid_exempt($uid)) { return "yes"; }

my $name="";

#check this users limit
$name = getpwuid($uid);

if (!defined($name))
{
$name = "unknown";
}

if ($email_limit > 0)
{
$last_send = (stat("/etc/virtual/usage/$name"))[9];

if ($last_send eq "")
{
open(USAGE, ">/etc/virtual/usage/$name");
close(USAGE);
chmod (0660, "/etc/virtual/usage/$name");
}

$time_lock = (stat("/etc/virtual/usage/$name.time"))[9];

if ($time_lock eq "")
{
open(TIMELOCK, ">/etc/virtual/usage/$name.time");
close(TIMELOCK);
$time_lock = (stat("/etc/virtual/usage/$name.time"))[9];
}

$cur_time = time;
$diff_time = $cur_time - $time_lock;
if ($diff_time >= 3600)
{
open(USAGE, ">/etc/virtual/usage/$name");
close(USAGE);
chmod (0660, "/etc/virtual/usage/$name");
open(TIMELOCK, ">/etc/virtual/usage/$name.time");
close(TIMELOCK);
}

$count = (stat("/etc/virtual/usage/$name"))[7];

if ($count eq "")
{
$count = 0;
}

if ($count > $email_limit)
{
die("You ($name) have reach your daily email limit of $email_limit emails\n");
}

open(USAGE, ">>/etc/virtual/usage/$name");
print USAGE "1";
close(USAGE);
chmod (0660, "/etc/virtual/usage/$name");
}

my $sender_address = Exim::expand_string('$sender_address');
my $mid = Exim::expand_string('$message_id');

log_bandwidth($uid,"type=email&email=$sender_address&method=outgoing&id=$mid");

return "yes"
}

Сохраняем файл и перезапускаем exim. Заходим в директорию /etc/virtual/ , создаем файл с названием limit_имяпользователя и вписуем в него цифрами количество писем в час, например 200. Далее идем в директорию /etc/virtual/usage/ и ищем файлы с именем пользователя. При отправке сообщения пользователем, например user, с домена, в директории появятся файлы:

user – в файле калькулируются количество писем, одно письмо = 1 в файле

user.bytes – логируются данные писем (пользователь, исходящее письмо или входящее и т.д.)

user.time – файл является точкой отсчета для проверки ограничения писем в час

Вот и все. Cтавьте, проверяйте и пользуйтеcь на здоровье.

Архив файла exim.pl можно скачать тут — ссылка

MySQL авторизация для Squid

Костяк базы:
base.sql
Код самого авторизатора можно взять здесь:
mysql_auth v.1.0

В mysql_auth.c на свой вкус меняем переменные DBHOST,DBUSER,DB,DBPASSWORD
и делаем make

Если все прошло успешно, то перемещаем бинарник в /usr/local/libexec

В конфиге Squid-а прописываем:
auth_param basic program /usr/local/libexec/mysql_auth
auth_param basic children 5
auth_param basic realm Squid proxy-caching web server
auth_param basic credentialsttl 2 hours

Все, осталось только описать ACL и зделать reconfigure.
Добавление пользователя происходит через MySQL, примерно так:
INSERT INTO proxy_users VALUES(»,’kaba’,password(’123qwe’));

Написать Web интерфейс я думаю не составит большого труда :)

TODO:
дописать чтобы знаки [,],{,} и т.д могли восприниматся при передаче пароля

Ipa и Mysql

Вы наверное наслышаны или уже ставили себе эту утилиту учета IP трафика.
Если нет, то вам сюда http://www.simon.org.ua/ipa/
Утилита действительно очень хороша, но есть некоторые неудобства, например,
нецентрализованное хранение данных. Задумавшись над этим я написал небольшой
patch чтобы ipa могла отсылать статистику в MySQL базу.

Патч можно взять здесь:
Для версии 1.2.7
Для версии 1.2.9
Для версии 1.3

Костяк базы:
base.sql

Утилита для обновления статистики:
update_base.tar.gz

Примеры конфиг файлов:
ipa.conf
ipa.sql

Телодвижения, которые нужно cделать для функциональности:

1) Забираем все с моего сайта
2) Создаем базу в Mysql, например statistic
3) Берем base.sql и импортируем в базу
4) Создаем юзера в MySQL, например ipa и даем ему привелегии на write, read, update на базу statistic
5) Заносим значения в таблицу who, которая отвечает за индефикацию хоста,  например:

insert into who values(1,'mylogin','mypassword','mymashine.domain.ua',0,0);

6) База готова, приступаем к самой ipa


cd /usr/ports/sysutils/ipa/files/
ls -la
total 6
drwxr-xr-x 2 root wheel 512 15 03:35 .
drwxr-xr-x 4 root wheel 512 13 16:20 ..
-rw-r--r-- 1 root wheel 1236 15 03:35 patch-aa


копирум патч взятый с моего сайта в эту дерикторию и переименовываем его как patch-ab (для примера). Если на этой машине будет находится MySQL,
то ставим его, если нет, то достаточно будет поставить только клиента.

Дальше:

cd /usr/ports/sysutils/ipa
make; make install


7) Переходим к конфигурированию ipa:

- копируем файлы ipa.sql и ipa.conf в /usr/local/etc
- редактируем файл ipa.sql: ставим правильный логин пользователя, пароль и базу
- назначаем привелегии:
-rw------- 1 root wheel 62 12 21:13 ipa.sql

- редактируем файл ipa.conf

Добавилось два поля:
who — это id_who в таблице who;
row — значения in или out, т.е. записивать как входящий трафик или как исходящий

- ставим соответствующие права на файл

8) Запускаем ipa и приступаем к update_base.tar.gz

Распаковываем, заходим в каталог, редактируем файл update_base.c, а именно строчки:

char *user="ipa";
char *passwd="ipa123";
char *host="localhost";
char *db="statistic";


Ставим свои значения и делаем make, получаем бинарник.
Ложим его, например, в /usr/local/sbin и в cron прописываем, чтобы он вызывался 1 раз в час, например:

58 * * * * /usr/local/sbin/update_base

Желательно это делать на той машине где стоит Mysql

9) Статистика собирается, теперь можно приступить к настройке страницы для ее просмотра. Берем ее здесь и распаковываем.

Требования: apache + php + mysql client + mrtg

10) Следуем указаниям в README.

Блокировщик несанкционированного доступа по ssh и ftp

Запакованный архив
bruteforce.tar.gz

Содержимое архива:

brblocker - блокировщик IP адрессов
brunblocker - разблокировщик
brblocker.conf - конфигурационный файл
crontab - пример crontab для прописывания разблокировщика
pf.conf - пример конфигурации для фаервола PF
rc.myfirewall - пример конфигурации для фаервола IPFW
syslog.conf - пример прописывания блокировщика

Изменения необходимые в /etc/ssh/sshd_config

LoginGraceTime 2m
PermitRootLogin no
StrictModes yes
MaxAuthTries 4
PasswordAuthentication yes
PermitEmptyPasswords no