Archive for the ‘ BSD ’ Category

FreeBSD + IPFW: Блокируем SMTP Bruteforce

На предыдущей работе досталось в подчинение пара почтовых серваков с оооочень древними доменами, огромным количеством ящиков и не менее огромным количеством бесконечных брутфорсов. Не знаю что было причиной бесконечных атак на эти серваки, но то что он был в like list у всевозможных ботов — это уж точно! Почта была критичным сервисом, но ближайшие планы включали миграцию на MS Exchange, поэтому позиция руководства была примерно такой «Ну онож работает? Да! Вот и не трогаем пока … нам бы побыстрее мигронуть на эксчендж да вырубить их нафик!» Но один раз случился инцидент который заставил изменить позицию неприкосновения. Несмотря на рендомные пароли, один ящик был сбрутен, и как результат — отправка через наш сервак порядка 40.000 спам писем со ссылками на различные ресурсы интимного направления 🙂
Короче было дано задание «Чтото с этим сделать!» Читать полностью

Zabbix — CPU Time & Memory Usage для процесса

Задача — мониторить zabbix-ом Memory и CPU Time Usage для конкретного процесса в Linux/Unix.
Больше конкретики …
Есть вот такой процесс:

black@linux9:~$ sudo ps aux |grep java
bioc 8607 40.4 1.2 11097680 418576 pts/0 Sl Feb25 423:27 /usr/java/jdk1.7.0_67/bin/java -classpath /opt/bioc/maven/boot/plexus-classworlds-2.4.jar -Dclassworlds.conf=/opt/bioc/maven/bin/m2.conf -Dmaven.home=/opt/bioc/maven org.codehaus.plexus.classworlds.launcher.Launcher tomcat7:run
black@linux9:~$

Как узнать сколько ресурсов он потребляет? И не просто узнать, но еще и запихнуть в zabbix для сбора статистики и накручивания триггеров.
Процессор!
CPU Time процесса — в дефолте Zabbix не умеет собирать агентом этот параметр. Но есть возможность написать свой UserParameter в конфиг zabbix-agent. Вот мой вариант:

UserParameter=proc.cputime.fc[*],CPUS=$$(grep -c ^processor /proc/cpuinfo); /bin/ps -A --no-headers -o user:16,cputime,args | /usr/bin/awk -v CPU_C="$$CPUS" 'BEGIN {SUM=0; SNAME="$3"; COMM="$2"; USER="$1"} {if (($$9 ~ SNAME || SNAME == "") && ($$3 ~ COMM || COMM == "") && ($$1 == USER || USER == "")) {d[1]=0; d[2]=0; split($$2, d,"-"); if (d[2] != 0) {split(d[2], t, ":"); SUM+=86400*d[1]+3600*t[1]+60*t[2]+t[3]} else {split($$2, t, ":"); SUM+=3600*t[1]+60*t[2]+t[3]}; }} END''{printf "%.1f", 100*SUM/CPU_C}'

На zabbix-server можно использовать Item «proc.cputime.fc» с дополнительными параметрами которые нужны для выборки awk:
USER=$1 — username, в моем случае «bioc»
COMM=$2 — command name, в моем случае «java»
SNAME=$3 — some unique parameter, в моем случае «tomcat7»
В моем случае это:

black@linux9:~$ /bin/ps -A --no-headers -o user:16,cputime,args |grep bioc |awk '{print $1,$3,$9}'
bioc /usr/java/jdk1.7.0_67/bin/java tomcat7:run
black@linux9:~$

Тоесть в моем конкретном случае Item выглядит так: proc.cputime.fc[bioc,java,tomcat7]

А что с памятью?
Поскольку я при настройке сервисов руководствуюсь правилом — один сервис на одного юзера, то в моем случае достаточно иметь Item для сбора использования памяти пользователем. В Zabbix версии 2.4 есть возможность получить от zabbix-client используемую память юзером, но к сожалению только VSZ. А я хочу еще и RSS! Тут опять поможет дополнительный UserParameter в zabbix-agent:

UserParameter=proc.mem.rss[*],/opt/zabbix/scripts/mem_ps_rss.pl "-p" "$1"

Он ведет к скрипту, а вот его листинг:

#!/usr/bin/perl
# Author: Tom Llewellyn-Smith
# Date: 10/12/2012
#
# Comment: simple perl script which sums all rss memory used by a given process (-p)
# tested on linux ps, easily modified to run with BSD ps.
#
# Copyright: © Onix Consulting Limited 2012-2012. All rights reserved.
# This program is free software: you can redistribute it and/or modify
# it under the terms of the GNU General Public License as published by
# the Free Software Foundation, either version 3 of the License, or
# (at your option) any later version.
#
# This program is distributed in the hope that it will be useful,
# but WITHOUT ANY WARRANTY; without even the implied warranty of
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
# GNU General Public License for more details.
#
# You should have received a copy of the GNU General Public License
# along with this program. If not, see <http://www.gnu.org/licenses/>.
#
use strict;
use warnings;
use Getopt::Std;

my $PS='/bin/ps';
my %opts;
getopts('h:p:', \%opts);
my $total_rss = 0;

sub usage
{
print "$0:\n\t-h displays this message\n\t-p [process name]\n";
exit 1;
}

unless ($opts{'p'})
{
# As a side-effect of not having -p set, -h also display help message.
&usage;
}

# Loop over all processes and add to total_rss counter if process matches regex.
foreach my $proc (`$PS -eF`)
{
if ($proc =~ /$opts{'p'}/)
{
my (undef,$pid,undef,undef,undef,$rss) = split(/\s+/,$proc);
# Do not include current script process as it will also match.
unless ($pid == $$)
{
$total_rss += $rss;
}
}
}

print $total_rss;

Этот скрипт был найден на просторах Интернета. Не помню менял я в нем чтото или нет …. Но суть не в том. Так что там с памятью? А вот что:
Memory Usage by Process (RSS) Item — proc.mem.rss[tomcat7]
Memory Usage by User (VSZ) Item — proc.mem[,bioc]

Перестраиваем apache22 + mod_php5 -> nginx + apache22 + mod_php5

На одном из серверов понадобилось добавить чуть больше гибкости web-серверу. Система FreeBSD, web-сервер настроен по олдскульной классике: Apache22 -> mod_php5 -> MySQL. Поскольку ковырять старичка апача особо желания нет, решил просто «накрыть» его nginx-ом и докрутить в нем все свои хотелки (GeoIP, bandwidth limit, различные варианты отдачи в зависимости и User Agent и тд.) Тоесть нужна вот такая схема: Nginx -> Apache22 -> mod_php5 -> MySQL
Основная задача — свести к минимуму Downtime.
Итак, поехали … Читать полностью

FreeBSD 9.3 — portsnap error «Empty error message»

Последнее время только то и делаю что натыкаюсь на досадные баги, которые отнимают время и не дают работать 🙁 В этот раз бага из розряда «тупее не придумаешь!»
Свежеустановленная FreeBSD 9.3 не хочет обновлять порты командой portsnap. Сразу скажу что в процессе инстала порты были установлены.
Вот такой прикол …

root@fr1:~ # portsnap fetch update
Looking up portsnap.FreeBSD.org mirrors... 7 mirrors found.
Fetching public key from ec2-eu-west-1.portsnap.freebsd.org... done.
Fetching snapshot tag from ec2-eu-west-1.portsnap.freebsd.org... done.
Fetching snapshot metadata... done.
Fetching snapshot generated at Tue Feb 10 02:01:06 EET 2015:
9528fd262c49a418579faa6f58bfc3c4040fe96c58d92d100% of   56 MB  601 kBps 01m36s
Extracting snapshot... snap/8bd2f2d1e85bb98a760022703eac8ff47d51700559cfedcb0b158e4eca2fc992.gz: (Empty error message)
tar: Error exit delayed from previous errors.
root@fr1:~ #

Решение этой досадной проблемы нашлось тут. Читать полностью

MySQL — online change storage engine.

Достались мне в наследство некоторые MySQL базы. Случайно обратил внимание что таблицы а базе используют MyISAM Engine. Поскольку базы создавались «за царя Гороха», а свежий MySQL Server был жестко оптимизирован конфигом под InnoDB Engine — решено сменить storage engine с MyISAM на InnoDB «на лету».
Делается это очень просто … Читать полностью

Bye-bye SSH/FTP Bruteforce

Сегодня утром был злой. Задолбал брутфорс ssh и ftp. Освоил новый инструмент бана. Не секрет что бан фаерволом дороже чем blackhole/nullroute. Опробовал в FreeBSD, забанил пару сеток:

root@black:~# route add -net 46.151.48.0/21 127.0.0.1 -blackhole
add net 46.151.48.0: gateway 127.0.0.1
root@black:~# route add -net 62.201.212.0/22 127.0.0.1 -blackhole
add net 62.201.212.0: gateway 127.0.0.1
root@black:~# route add -net 222.161.0.0/16 127.0.0.1 -blackhole
add net 222.161.0.0: gateway 127.0.0.1

И настроение мое …. сразу улучшилось! Чего и Вам желаю!
Хай щастить!

FreeBSD and portupgrade — «HASH: Out of overflow pages. Increase page size error»

Последнее время только то и делаю что разгребаю какието досадные баги разных ОС … То CentOS на ровном месте взбрыкнет, то FreeBSD …. Но фряху на этом поле не переплюнуть, эта система заточена под одну статичную конфигурацию и полную заморозку в вакууме после настройки и проверки. Динамика, обновления системы, обновление пакетов и их зависимостей — нет … не слышали про такое 🙂 Но то вопрос отдельной статьи, которую я обязательно напишу чуть позже, после миграции на Debian последнего сервера с фрёй в моем подчинении …. а пока продолжаем жрать кактус. Ой, ну тоесть админить фряху!
Казалось бы, банальнейшая вещь — обновить пакетик vim-lite, но не тут то было!

root@gw:~# portupgrade vim-lite
[Reading data from pkg(8) ... - 314 packages found - done]
[Updating the portsdb <format:dbm_hash> in /usr/ports ... - 24506 port entries found .........1000.........2000.........3000.........4000.........5000.........6000.........7000.........8000.........9000.........10000.........11000.........12000.........13000.........14000.........15000.........16000.........17000.........18000.........19000.........20000.........21000.........22000.........23000.........24000..... ....HASH: Out of overflow pages.  Increase page size
 error] Remove and try again.
[Updating the portsdb </format:dbm_hash><format:dbm_hash> in /usr/ports ... - 24506 port entries found .........1000.........2000.........3000.........4000.........5000.........6000.........7000.........8000.........9000.........10000.........11000.........12000.........13000.........14000.........15000.........16000.........17000.........18000.........19000.........20000.........21000.........22000.........23000.........24000..... ....HASH: Out of overflow pages.  Increase page size
 error] Remove and try again.
[Updating the portsdb </format:dbm_hash><format:dbm_hash> in /usr/ports ... - 24506 port entries found .........1000.........2000.........3000.........4000.........5000.........6000.........7000.........8000.........9000.........10000.........11000.........12000.........13000.........14000.........15000.........16000.........17000.........18000.........19000.........20000.........21000.........22000.........23000.........24000..... ....HASH: Out of overflow pages.  Increase page size
 error] Remove and try again.
[Updating the portsdb </format:dbm_hash><format:dbm_hash> in /usr/ports ... - 24506 port entries found .........1000.........2000.........3000.........4000.........5000.........6000.........7000.........8000.........9000.........10000.........11000.........12000...^C
Interrupted.
^C
Interrupted.
root@gw:~#

После поверхностного гугления стало ясно что проблема в том что ruby версии 2 не всегда корректно работает с ruby19-bdb5, а именно эта версия ruby-bdb у меня установлена:

root@gw:~#
pkg version -v |grep ruby
ruby-2.0.0.598,1                   < needs updating (index has 2.0.0.598_1,1)
ruby19-bdb5-0.6.6_4                =   up-to-date with index
root@gw:~#

Давайте исправим руками то что с легкостью должен был сделать нормальный пакетный менеджер … Читать полностью

PHP Warning — /usr/local/lib/php/20100525/memcache.so: Undefined symbol «php_session_create_id»

Все время забываю как в FreeBSD лечится вот такая проблема:

root@web5:~# php -v
PHP Warning:  PHP Startup: Unable to load dynamic library '/usr/local/lib/php/20100525/memcache.so' - /usr/local/lib/php/20100525/memcache.so: Undefined symbol "php_session_create_id" in Unknown on line 0
PHP 5.4.35 (cli) (built: Nov 22 2014 21:51:24)
Copyright (c) 1997-2014 The PHP Group
Zend Engine v2.4.0, Copyright (c) 1998-2014 Zend Technologies
root@web5:~#

Решение тривиальное, нужно просто пересобрать pecl-memcache:

root@web5:~# cd /usr/ports/databases/pecl-memcache
root@web5:/usr/ports/databases/pecl-memcache# make deinstall
===>  Deinstalling for pecl-memcache
===>   Deinstalling pecl-memcache-3.0.8
Updating database digests format: 100%
Checking integrity... done (0 conflicting)
Deinstallation has been requested for the following 1 packages (of 0 packages in the universe):

Installed packages to be REMOVED:
        pecl-memcache-3.0.8

The operation will free 136 kB.
[1/1] Deleting pecl-memcache-3.0.8: 100%
root@web5:/usr/ports/databases/pecl-memcache# make install clean
===>  Installing for pecl-memcache-3.0.8
===>   pecl-memcache-3.0.8 depends on file: /usr/local/include/php/main/php.h - found
===>   pecl-memcache-3.0.8 depends on file: /usr/local/lib/php/20100525/zlib.so - found
===>   pecl-memcache-3.0.8 depends on file: /usr/local/lib/php/20100525/session.so - found
===>  Checking if pecl-memcache already installed
===>   Registering installation for pecl-memcache-3.0.8
===>  Cleaning for pecl-memcache-3.0.8
root@web5:/usr/ports/databases/pecl-memcache#

А теперь проверочка!

root@web5:/usr/ports/databases/pecl-memcache# php -v
PHP 5.4.35 (cli) (built: Nov 22 2014 21:51:24)
Copyright (c) 1997-2014 The PHP Group
Zend Engine v2.4.0, Copyright (c) 1998-2014 Zend Technologies
root@web5:/usr/ports/databases/pecl-memcache#

Проблема решена!

Хай щастить!

Win.Trojan.Agent в почте и headers_check в Postfix

Тут недавно отгребал кучу вирусни в почте, к сожалению наличие ClamAV с актуальными базами на почтовом сервере ниразу не спасало 🙁 Письма были шаблонные, тема одна и та же, вложение — zip файл photo.zip или iphone_photo.zip (несколько раз еще приходили transact_store.zip) который внутри содержит вирус exe-шник … основная разница только в том с какого хоста, от кого и кому шлют.
Вот примеры вложений с вирусом сохраненные из тех спам-писем для анализа, можете проверить на стойкость свои антивирусы 🙂
Надо? — жми!
Архив запаролен: FhiibNAfNm
Для тех кто верит мне на слово будет достаточно скриншота с содержимым данного архива:
Email with Virus
Вся эта беда сыпется по почте, ниже пример сообщения Читать полностью

Dovecot2 + zlib = сжатие сообщений на сервере

При обновлении порта dovecot2 заметил в меню «Config» опцию Zlib, может она уже 100 лет там была … но только сейчас заметил. Сразу подумалось — фишка интересная, надо опробовать. Оказалось настраивается крайне просто, так я сделал в FreeBSD … но думаю конфигурация для Linux ничем не отличается.
Сразу перед настройкой решил отправить себе тестовое письмо для наглядности эффективности сжатия, в google-mail быстренько создал письмецо, влил туда какойто первый попавшийся лог … для иммитации текста и пульнул на свой сервак. Замысел в том чтобы после настройки сжатия кинуть такоеже письмецо и сравнить простое и сжатое 🙂
Настройка проще не придумаешь!
В конфиге /usr/local/etc/dovecot/conf.d/15-lda.conf сделал так:

protocol lda {
  # Space separated list of plugins (default is global mail_plugins).
  mail_plugins = $mail_plugins zlib
}

И в конфиге плагинов /usr/local/etc/dovecot/conf.d/90-plugin.conf сделал вот так:

plugin {
  #setting_name = value
  zlib_save_level = 7 # 1..9
  zlib_save = bz2     # or bz2, xz or lz4
}

После этого перегрузил сервис:

root@mx1:~# service dovecot restart

И повторил отправку тестового письма Читать полностью