защита Apache

Запрет вывода версии Apache

В Debian, в файле /etc/apache2/conf.d/security, в FreeBSD, в файле /usr/local/etc/apache22/extra/httpd-default.conf 
В итоге изменяем в конфиге значение ServerTokens на Prod. Полный список возможных значений:
ServerTokens Full (or not specified)
           Server: Apache/2.4.2 (Unix) PHP/4.2.2 MyMod/1.2
ServerTokens Prod[uctOnly]
           Server: Apache
ServerTokens Major
           Server: Apache/2
ServerTokens Minor
           Server: Apache/2.4
ServerTokens Min[imal]
           Server: Apache/2.4.2
ServerTokens OS
           Server: Apache/2.4.2 (Unix)ServerTokens Prod Server: Apache

Еще одна переменная ServerSignature отвечает за отображение информационной сточки ниже полосы. Ставим в Off .

В Ubuntu по умолчанию эта опция включена. Возможные варианты: ServerSignature On|Off|EMail

 

Asterisk: борьба с Sending fake auth rejection for device 5050;tag=0aad9031

в этих сообщениях asterisk пишет свой внешний IP адрес. Поэтому банить его нет смысла.

здесь предложили банить на основе анализа содержимого пакета с помощью iptables

здесь описан вариант с исправлением модуля asterisk чтобы в логах появилась информация с IP адресом взломщика

При попытке взлома могут появляться вот такие сообщения в full:

chan_sip.c: Sending fake auth rejection for device 5550000<sip:5550000@[external_ip]>;tag=71b060d8″.

Сейчас не видно с какого IP адреса идет атака, необходимо пересобрать астериск со следующими параметрами: Открываем исходники астериска файл /../asterisk-/channels/chan_sip.c ищем строки:

1
ast_log(LOG_NOTICE, "Sending fake auth rejection for device %s\n", get_header(req, "From"));

В окне поиска вводим: Sending fake auth rejection for device

Меняем строку:

1
ast_log(LOG_NOTICE, "Sending fake auth rejection for device %s\n", get_header(req, "From"));

на:

1
ast_log(LOG_NOTICE, "Sending fake auth rejection for device %s [IP: %s]\n", get_header(req, "From"), ast_sockaddr_stringify(addr));

после этого должен отображаться Ip адрес атакующего.

Sending fake auth rejection for device 3050<sip:3050@[external_ip]>;tag=fc23ea52 [IP: 166.78.25.181:5071]

если подмены и попытки загрузить модуль командой module load chan_sip.so получаем ошибку “Module was not compiled with the same compile-time options as this version of Asterisk” значит надо воспользоваться этим решением:

надо подменить в файле include/asterisk/buildopts.h значение в строчке  

#define AST_BUILDOPT_SUM “ac1f6a56484a8820659555499174e588”

на свой код AST_BUILDOPT_SUM. В Ubuntu узнать его можно /usr/include/asterisk/buildopts.h из пакета asterisk-dev

после этого скомпилированный новый модуль принимается астериском.

и теперь можно использовать fail2ban с правилом 

1
NOTICE.* .*: Sending fake auth rejection for device .*\<sip:.*@.*\>;tag=.* \[IP: <HOST>:.*\]

Все описанное выше было проверено на 1.8.7 и 1.8.13

выполнение в mysql команд операционной системы

Бывает надо выполнить команду ОС при каком-то событии, например, отправить e-mail при изменении данных

Родного способа нет, но можно использовать функционал пользовательских функций UDF.

UDF репозитарий нам предлагает библиотеку lib_mysqludf_sys для работы с операционной системой, которая содержит в себе 4 функции: 

  • sys_eval(arg1) – выполняет произвольную команду и возвращает вывод внешней команды
  • sys_exec(arg1) – выполняет произвольную команду и возвращает код возврата
  • sys_get(arg1) – позволяет получить переменную окружения или NULL если таковой нет
  • sys_set(arg1, arg2) – позволяет задать переменную окружения (параметры: имя переменной, значение), возвращает 0 в случае успеха

Подробная документация находится  здесь (на английском языке).

Теперь перейдем к установке. Качаем lib_mysqludf_sys_0.0.3.tar.gz. Распаковываем. Для установки может потребоваться наличие в системе пакета mysql-devel

Копируем библиотеку (или предварительно компилируем) в папку с библиотеками. Путь может быть /usr/lib/mysql, /usr/lib/mysql/plugin/ или другим

 и подгружаем новые функции в mysql

1
CREATE FUNCTION lib_mysqludf_sys_info RETURNS string SONAME 'lib_mysqludf_sys.so';
2
CREATE FUNCTION sys_get RETURNS string SONAME 'lib_mysqludf_sys.so';
3
CREATE FUNCTION sys_set RETURNS int SONAME 'lib_mysqludf_sys.so';
4
CREATE FUNCTION sys_exec RETURNS int SONAME 'lib_mysqludf_sys.so';
5
CREATE FUNCTION sys_eval RETURNS string SONAME 'lib_mysqludf_sys.so';

Или используем скрипт  install.sh из архива с исходниками

Определить текущую версию библиотеки можно

1
mysql> select  lib_mysqludf_sys_info();
2
+--------------------------------+
3
| lib_mysqludf_sys_info()        |
4
+--------------------------------+
5
| lib_mysqludf_sys version 0.0.3 |
6
+--------------------------------+
7
1 row in set (0.00 sec)

 Проверяем работу

1
mysql> select sys_eval('whoami');
2
+--------------------+
3
| sys_eval('whoami') |
4
+--------------------+
5
| mysql
6
             |
7
+--------------------+
8
1 row in set (0.04 sec)

1
mysql> select sys_eval('uname -a');
2
+----------------------------------------------------------------------------------------------------+
3
| sys_eval('uname -a')                                                                               |
4
+----------------------------------------------------------------------------------------------------+
5
| Linux localhost.localdomain 2.6.18-194.11.1.el5 #1 SMP Tue Aug 10 19:09:06 EDT 2010 i686 i686 i386 GNU/Linux
6
 |
7
+----------------------------------------------------------------------------------------------------+
8
1 row in set (0.00 sec)
9

Ненужные UDF функции можно удалить

1
DROP FUNCTION IF EXISTS sys_get;
2
DROP FUNCTION IF EXISTS sys_set;
3
DROP FUNCTION IF EXISTS sys_exec;
4
DROP FUNCTION IF EXISTS sys_eval;

Вот и все. Пользуемся на здоровье 🙂

Mikrotik: Резервирование настроек по E-mail

основываясь на wiki создал скрипт. Тестировал на  v5.6 и 5.22. Должно работать на 5.X

Для начала надо настроить параметры SMTP сервера. Пример будет для gmail.com

Не забываем поменять на свои значения mikrotik@gmail.com, your_password, your_account@gmail.com

 Bash | 
 
 copy code |
?

1
/tool e-mail
2
set address=173.194.65.108 from=mikrotik@gmail.com password=\
3
your_password starttls=yes user=your_account@gmail.com
4

Скрипт делает

  1. удаляет старые бекапы
  2. создае файл бэкапа *.backup
  3. отправляет сообщение с прикреплённым к нему файлом бэкапа на заданный e-mail адрес
  4. создают файл скрипта настроек *.rsc по команде export
  5. отправляет сообщение с прикреплённым к нему файлом скрипта настроек на заданный e-mail адрес
  6. если версия RouterOS выше 5.12, создается файл скрипта настроек *.rsc по команде export compact и отправляется на тот же e-mail

Параллельно в системном журнале производится логирование этапов работы запущенного скрипта.

К сожалению RouterOS пока не умеет прикреплять к сообщению более одного файла за раз, поэтому каждый файл приходится отправлять индивидуально.

 Bash | 
 
 copy code |
?

01
{
02
:log info "Starting Backup Script...";
03
:local sysname [/system identity get name];
04
:local sysver [/system package get system version];
05
:log info "Flushing DNS cache...";
06
#/ip dns cache flush;
07
:delay 2;
08
:log info "Deleting last Backups...";
09
:foreach i in=[/file find] do={:if ([:typeof [:find [/file get $i name] \
10
"$sysname-backup-"]]!="nil") do={/file remove $i}};
11
:delay 2;
12
:local smtpserv [:resolve "smtp.gmail.com"];
13
:local Eaccount "your_account@gmail.com";
14
/tool e-mail set address=$smtpserv;
15
 
16
:local backupfile ("$sysname-backup-" . \
17
[:pick [/system clock get date] 7 11] . [:pick [/system \
18
clock get date] 0 3] . [:pick [/system clock get date] 4 6] . ".backup");
19
:log info "Creating new Full Backup file...";
20
/system backup save name=$backupfile;
21
:delay 2;
22
:log info "Sending Full Backup file via E-mail...";
23
 
24
/tool e-mail send to=$Eaccount tls=yes file="$backupfile" \
25
subject=("$sysname Full Backup (" . [/system clock get date] . ")") \
26
body=("$sysname full Backup file see in attachment.\nRouterOS version: \
27
$sysver\nTime and Date stamp: " . [/system clock get time] . " " . \
28
[/system clock get date]);
29
 
30
:delay 5;
31
:local exportfile ("$sysname-backup-" . \
32
[:pick [/system clock get date] 7 11] . [:pick [/system \
33
clock get date] 0 3] . [:pick [/system clock get date] 4 6] . ".rsc");
34
:log info "Creating new Setup Script file...";
35
/export file=$exportfile;
36
:delay 2;
37
:log info "Sending Setup Script file via E-mail...";
38
 
39
/tool e-mail send to=$Eaccount tls=yes file=$exportfile \
40
subject=("$sysname Setup Script Backup (" . [/system clock get date] . \
41
")") body=("$sysname Setup Script file see in attachment.\nRouterOS \
42
version: $sysver\nTime and Date stamp: " . [/system clock get time] . " \
43
" . [/system clock get date]);
44
:delay 5;
45
 
46
:if ( [/system package get system version] &gt;= "5.12" ) do={
47
:local exportcompactfile ("$sysname-backup-compact-" . \
48
[:pick [/system clock get date] 7 11] . [:pick [/system \
49
clock get date] 0 3] . [:pick [/system clock get date] 4 6] . ".rsc");
50
:log info "Creating new Setup Script Compact file...";
51
/export compact file=$exportcompactfile;
52
:delay 2;
53
:log info "Sending Setup Script Compact file via E-mail...";
54
 
55
/tool e-mail send to=$Eaccount tls=yes file=$exportcompactfile \
56
subject=("$sysname Setup ScriptCompact Backup (" . [/system clock get date] . \
57
")") body=("$sysname Setup Script Compact file see in attachment.\nRouterOS \
58
version: $sysver\nTime and Date stamp: " . [/system clock get time] . " \
59
" . [/system clock get date]);
60
:delay 5;
61
}
62
 
63
:log info "All System Backups emailed successfully.\nBackuping completed.";
64
}

Не переключается на русский язык в freepbx

Проблема возникает в web-интерфейсе при выборе языка (любого) ничего не происходит. Язык с Английского не меняется ни на какой другой. При этом модуль languages установлен.

Решение

надо исправить файл  локализаций  “/usr/share/locale/locale.alias”

Удаляем строку с кодировкой для russian и добавляем 3 строки вместо нее:

russian ru
ru ru_RU
ru_RU ru_RU.UTF-8

Затем в консоли:
# locale-gen ru_RU
# /etc/init.d/apache2 restart

вот и все 🙂

 

если и этого не хватает (бывает и такое :)) делаем как написано

редактируем файл FREEPBX_ROOT/admin/header.php 

находим строки
function set_language() {
if (extension_loaded(‘gettext’)) {
if (isset($_COOKIE[‘lang’])) {
setlocale(LC_ALL, $_COOKIE[‘lang’]);
putenv(“LANGUAGE=”.$_COOKIE[‘lang’]);
} else {

меняем на:
function set_language() {
if (extension_loaded(‘gettext’)) {
if (isset($_COOKIE[‘lang’])) {
setlocale(LC_ALL, $_COOKIE[‘lang’].”.UTF-8″);
putenv(“LANGUAGE=”.$_COOKIE[‘lang’].”.UTF-8″);
} else {