FastNetMon

Friday, 15 February 2013

OpenVZ: Показать число running процессов с детализацией по контейнерам

Вот такой вот набор команд на баше:
 for i in `ps aux|awk '{if($8=="R"){print $2}}'`; do vzpid $i | grep -v CTID | awk '{print $2}';done |sort | uniq -c
      1 1003
      2 1004
      1 1011
      5 1018
      5 1020
     19 1023
      1 1027
      5 1034
      2 1039
Выдача примерно такая:

      1 1003
      2 1004
      1 1011
      5 1018
      5 1020
     19 1023
      1 1027
      5 1034
      2 1039

Thursday, 14 February 2013

Chrome does not support Java 7. Java 7 runs only on 64-bit browsers and Chrome is a 32-bit browser.

Вот такая вот оказия с Mac OS X 10.7.5 при заходе на страницу: http://www.java.com/en/download/mac_download.jsp


grub, lenny: The file /boot/grub/stage1 not read correctly.

Такая ошибка может означать, что на диске нету кода grub, например, еще не закончилась синхронизация.

Фикс следующий - ждать конца синхронизации.

Тут лучше использовать grub shell, так как у него ошибки адекватнее:

grub> root (hd1,1)
root (hd1,1)
 Filesystem type is ext2fs, partition type 0xfd
grub> setup (hd1)          
setup (hd1)
 Checking if "/boot/grub/stage1" exists... yes
 Checking if "/boot/grub/stage2" exists... yes
 Checking if "/boot/grub/e2fs_stage1_5" exists... yes
 Running "embed /boot/grub/e2fs_stage1_5 (hd1)"... failed (this is not fatal)
 Running "embed /boot/grub/e2fs_stage1_5 (hd1,1)"... failed (this is not fatal)
 Running "install /boot/grub/stage1 (hd1) /boot/grub/stage2 p /boot/grub/menu.lst "... succeeded
Done.
grub> root (hd0,1)
root (hd0,1)
 Filesystem type is ext2fs, partition type 0xfd
grub> setup (hd1)
setup (hd1)
 Checking if "/boot/grub/stage1" exists... no
 Checking if "/grub/stage1" exists... no
Error 15: File not found

Tuesday, 12 February 2013

Автодополнение команд в bash при наличии sudo

В случае использования sudo на Debian, при вызове команд не выполняется автодополнение.

Ставим спец-пакет:
apt-get intsall -y bash-completion

Результат наших трудов:

sudo apt
apt-cache                     apt-file                      aptitude-create-state-bundle  apt-mark
apt-cdrom                     apt-ftparchive                aptitude-curses               apt-rdepends
apt-config                    apt-get                       aptitude-run-state-bundle     apt-sortpkgs
apt-extracttemplates          aptitude                      apt-key                       

Выдача имени пакета при попытке запуска команды из неустановленного пакета

Такой вот своего рода Ubuntu way :) Фича может быть удобна в ряде случаев.

Установка как всегда крайне проста:
apt-get install -y command-not-found

После установки нужно сформировать кэш:
update-command-not-found
После установки у обычных пользователей, при попытке что-либо вызвать будет появляться сообщение в стиле Ubuntu:
mysql
The program 'mysql' is currently not installed.  To run 'mysql' please ask your administrator to install the package 'mysql-client-5.1'
mysql: command not found

Monday, 11 February 2013

Monit, debian, status not monitored

Если монит в своем статусе пишет, что сервис не могиторится и, как следствие, не ребутает его, то нужно сделать следующее (предварительно основановив monit):
sudo cp /dev/null /var/lib/monit/monit.state
Это обнулит его state данные и все заработает ок. 

Как запретить ntpd слушать внешние соединения вообще?

Это довольно просто, открываем конфиг:
vim /etc/ntp.conf

Вносим там:

interface ignore wildcard
interface listen 127.0.0.1
Перезапускаем:
/etc/init.d/ntp restart 
Убеждаемся, что все ок:
sudo netstat -lnpu
Active Internet connections (only servers)
Proto Recv-Q Send-Q Local Address           Foreign Address         State       PID/Program name
udp        0      0 127.0.0.1:123           0.0.0.0:*                           16625/ntpd    
udp6       0      0 ::1:123                 :::*                                16625/ntpd    
Источник: http://serverfault.com/questions/475635/how-to-prevent-ntpd-to-listen-on-0-0-0-0123/475639#475639 

Защита серверов на Debian Squeeze от брутфорса посредством fail2ban

Ставим:
apt-get install -y fail2ban
Сервис сразу же запустится и будет добавлен в автозапуск.

Также fail2ban сразу создаст свою цепочку, через которую будет пропускать трафик (забаниваемые адрес) конкретного сервера (и как следвствие - крайне низкий оверхед, что плюс):

sudo iptables -nvL
Chain INPUT (policy ACCEPT 845 packets, 149K bytes)
 pkts bytes target     prot opt in     out     source               destination      
    0     0 fail2ban-ssh  tcp  --  *      *       0.0.0.0/0            0.0.0.0/0           multiport dports 22
Chain FORWARD (policy ACCEPT 0 packets, 0 bytes)
 pkts bytes target     prot opt in     out     source               destination      
Chain OUTPUT (policy ACCEPT 815 packets, 336K bytes)
 pkts bytes target     prot opt in     out     source               destination      
Chain fail2ban-ssh (1 references)
 pkts bytes target     prot opt in     out     source               destination      
    0     0 RETURN     all  --  *      *       0.0.0.0/0            0.0.0.0/0           



Открываем конфиг:
vi /etc/fail2ban/jail.conf

Там будет ряд блоков с заголовками вида - [ssh], это блоки правил, описывающих, какие именно сервисы контролируются и защищаются от брутфорса. Стандартно включен лишь один - ssh, он нам и нужен. Обращаю внимание! Что здесь нужно исправить порт, если он у Вас отличается от стандартного (я рекомендую это сделать!).


[ssh]
enabled = true
port    = 1022
filter  = sshd
logpath  = /var/log/auth.log
maxretry = 6


Теперь самое важное - внесите свой IP адрес (если он постоянный) в белый список fail2ban, это делается в том же файле в блоке:
ignoreip = 127.0.0.1 178.xx.yy.zz

Применяем измененный конфиг (если внесли туда коррективы):

/etc/init.d/fail2ban restart

Лог работы сервиса fail2ban можно смотреть так:

tail -f /var/log/fail2ban.log

Теперь настало время проверить fail2ban в деле - пробуем 6 раз ввести неверно ssh пароль со внешнего хоста, чтобы нас забанило.

Забаненые айпи можно смотреть вот так (либо в фаероволле):

sudo fail2ban-client status ssh
Status for the jail: ssh
|- filter
|  |- File list: /var/log/auth.log
|  |- Currently failed: 1
|  `- Total failed: 7
`- action
   |- Currently banned: 1
   |  `- IP list: 188.40.74.10
   `- Total banned: 1

Раазбанивать ошибочно забаненых юзеров вот так (криво, да, но прямой механизм в fail2ban появится лишь к 0.9 версии, да и-то не факт):

sudo iptables -nvL --line-numbers
Chain INPUT (policy ACCEPT 77613 packets, 15M bytes)
num   pkts bytes target     prot opt in     out     source               destination      
1      974 75898 fail2ban-ssh  tcp  --  *      *       0.0.0.0/0            0.0.0.0/0           multiport dports 1022
Chain FORWARD (policy ACCEPT 0 packets, 0 bytes)
num   pkts bytes target     prot opt in     out     source               destination      
Chain OUTPUT (policy ACCEPT 75761 packets, 30M bytes)
num   pkts bytes target     prot opt in     out     source               destination      
Chain fail2ban-ssh (1 references)
num   pkts bytes target     prot opt in     out     source               destination      
1       25  2596 DROP       all  --  *      *       188.xx.xx.xx         0.0.0.0/0        
2      949 73302 RETURN     all  --  *      *       0.0.0.0/0            0.0.0.0/0           

Разбаниваем (очень аккуратно, чтобы ):

sudo iptables -D fail2ban-ssh 1


Источник: http://debianclusters.cs.uni.edu/index.php/Fail2Ban:_Preventing_Brute_Force_SSH

Saturday, 9 February 2013

Работа с zabbix из Python

Под это дело уже есть готовый компонент:
easy_install pyzabbix
Простейший код с выводом версии АПИ и тестом соединения:

#!/usr/bin/python
from pyzabbix import ZabbixAPI
zapi = ZabbixAPI("https://zabbix.domain.ru")
zapi.login("admin", "xxx")
print "Connected to Zabbix API Version %s" % zapi.api_version()
for h in zapi.host.get(extendoutput=True):
    print h['host']

Если работать будете от имени админа, то нужно добавить его в группу API access, иначе доступа не будет.


Источник: https://github.com/lukecyca/pyzabbix/wiki

Wednesday, 6 February 2013

Облачный ssh-copy-id - ssh-import-id

Подробнее:
http://blog.dustinkirkland.com/2012/02/ssh-import-id-gaining-some-steam.html и http://manpages.ubuntu.com/manpages/precise/man1/ssh-import-id.1.html

Суть идеи в создании авторизованного безопасного хранилища для публичных rsa/ssh ключей, откуда их можно быстро вытянуть и внести в систему.

Риквестую подобное вне убунт! 

Monday, 4 February 2013

Как на уровне iptables отсечь DNS запросы определенного типа к определенному домену?

Итак, нам нужен спец-скрипт, берем его по адресу: http://www.bortzmeyer.org/files/generate-netfilter-u32-dns-rule.py  (зеркало).

Генерируем правило для модуля u32 iptables и сохраняем его в переменной:
rule=$(python generate-netfilter-u32-dns-rule.py --qname suxx.us --qtype ANY)
Добавляем это правило для фльтрации:
iptables -A INPUT -p udp --dport 53 --match u32 --u32 "$rule" -j ACCEPT 
Делаем откуда-либо извне запрос:
host -t any suxx.usaa dns-server.ru
После этого, фиксируем попадание правила в фаерволл:
iptables -nvL|grep u32
    4   212 ACCEPT     udp  --  *      *       0.0.0.0/0            0.0.0.0/0           udp dpt:53 u32 0x0>>0x16&0x3c@0x14=0x4737578&&0x0>>0x16&0x3c@0x18=0x78027573&&0x0>>0x16&0x3c@0x1c&0xffffff00=0xff00 
 Как можно убедиться, модуль u32 дает почти неограниченную гибкость для фильтрации различных протоколов.
 

Как посредством сниффера пакетов отловить DNS запросы заданного типа?

This summary is not available. Please click here to view the post.

Универсальный мониторинг любого DNS сервера


Все очень просто
apt-get install -y dnstop
Вот пример выдачи (включен режим анонимизации, флаг -a, который скрывает реальные адреса):
Queries: 594 new, 7867 total                                                                  Mon Feb  4 09:05:11 2013
Sources        Count      %
---------- --------- ------
::34.0.0.0      3313   42.1
::               182    2.3
::2.0.0.0         47    0.6
::3.0.0.0         44    0.6
::20.0.0.0        43    0.5
::31.0.0.0        42    0.5
::37.0.0.0        34    0.4
::24.0.0.0        34    0.4
::22.0.0.0        34    0.4
::42.0.0.0        33    0.4
::4.0.0.0         33    0.4
::5.0.0.0         28    0.4
::1.0.0.0         23    0.3
::47.0.0.0        19    0.2
::35.0.0.0        19    0.2
::45.0.0.0        18    0.2
::46.0.0.0        18    0.2
::48.0.0.0        16    0.2
::43.0.0.0        15    0.2
Обращаю внимание, что программа имеет множество команд в интерактивном режиме, например, для получения распределения по типам запросов нужно нажать t и будет выдано примерно следующее:

Queries: 707 new, 51766 total                                                                 Mon Feb  4 09:11:00 2013
Query Type     Count      %
---------- --------- ------
ANY?           26750   51.7
A?             18165   35.1
AAAA?           2755    5.3
MX?             2356    4.6
PTR?            1208    2.3
TXT?             222    0.4
NS?              208    0.4
SPF?              61    0.1
SOA?              32    0.1
SRV?               7    0.0
CNAME?             2    0.0

Friday, 1 February 2013

Установка puppet из репозитория от разработчиков

В ряде случаев это предпочтительно использованию встроенной в дистрибутив версии: http://docs.puppetlabs.com/guides/puppetlabs_package_repositories.html#open-source-repositories

Переход со стандартной версии (обновление) довольно прост:
wget http://apt.puppetlabs.com/puppetlabs-release-wheezy.deb
sudo dpkg -i puppetlabs-release-wheezy.deb
apt-get update
apt-get upgrade
apt-get dist-upgrade
Для установки новой версии:

wget http://apt.puppetlabs.com/puppetlabs-release-wheezy.deb
sudo dpkg -i puppetlabs-release-wheezy.deb
apt-get update
sudo apt-get install -y puppet

ERROR 1436 (HY000): Thread stack overrun: 8384 bytes used of a 131072 byte stack, and 128000 bytes needed. Use 'mysqld -O thread_stack=#' to specify a bigger stack.

Данная ошибка фиксится довольно просто.

Открываем конфиг:

vim /etc/mysql/my.cnf
И корректируем там:
thread_stack            = 512K


Применяем изменения:

/etc/init.d/mysql restart