Posts Tagged ‘ CentOS

ssh — Ограничение доступа по GeoIP

Последнее время обьем говнотрафика в Интернете вырос в разы. Если раньше auth.log насчитывал примерно до 10 SSH ботов в сутки, то на данный момент этот показатель вырос до сотен уникальных ip. Боты в основном из Китая/Тайвани/Кореи… Фаервол конечно спасает, но хочется чегото изощреннее …
На просторах Интернета когдато нашел рецепт ограничения доступа к sshd по GeoIP. Решил опробовать.
Задача: дать доступ по SSH только ip адресам из Украины — остальным зась!
Для начала установил необходимые пакеты:

root@host:~# apt-get install geoip-bin geoip-database

И поехали ваять скрипты … настраивать конфиги!
Читать полностью

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]

DHCP+PXE+TFTP — Boot/Netinstall для CentOS 6.6/CentOS 7/Debian Stable/Ubuntu 14.04

Задача: настроить в сети предприятия сетевую установку CentOS 6.6 minimal, CentOS 7 DVD + minimal, Debian Stable (Wheezy), Ubuntu 14.04 LTS
Для этого нам понадобится DHCP сервер (в моей сети уже был настроен isc-dhcp-server), TFTP сервер и:
— HTTP/FTP сервер (на выбор, кому что больше нравится) для локальной установки по сети CentOS;
— NFS сервер для локальной установки по сети Debian/Ubuntu
Почему так? Да потому что Debian based & RHEL based дистры они хоть и линукс … но между ними пропасть всяческих различий, в частности это одно из них 🙂 Сразу скажу, в моем случае приоритет был именно на RHEL, поэтому инсталяхи CentOS я выложил в локальную сеть по HTTP с помощью nginx. С Debian/Ubuntu особо заморачиваться указания не было так как инстал данных дистрибутивов будет выполняться намного реже. Их в меню добавил, но настроил на сетевую установку через Интернет.
Поехали … Читать полностью

Мониторинг Docker контейнеров в Zabbix

Мониторить хочу количество контейнеров в состоянии Running/Crashed/Available. Для нескольких особо важных контейнеров нужно иметь возможность мониторить их статус по имени.
Что до количества, взял готовое решение вот тут. Добавил в Zabbix вот так:
Размещаем в /etc/zabbix/scripts такой вот скриптец под именем docker_status.sh:

#!/bin/bash
 
function countContainers() {
    docker ps -q $1 | wc -l
}
 
function countCrashedContainers() {
    docker ps -a | grep -v -F 'Exited (0)' | grep -c -F 'Exited ('
}
 
TYPE=${1-all}
 
case $TYPE in
    running) COUNT_FUNCTION="countContainers"; shift;;
    crashed) COUNT_FUNCTION="countCrashedContainers"; shift;;
    all) COUNT_FUNCTION="countContainers -a"; shift;;
esac
 
$COUNT_FUNCTION

В конфиг агента добавляем новый UserParameter:

...
UserParameter=docker.status[*],/etc/zabbix/scripts/docker_status.sh "$1"
...

Также необходимо добавить пользователя zabbix в группу docker:

sudo gpasswd --add zabbix docker

Ну и перегрузить zabbix-agent

sudo service zabbix-agent restart

Теперь с zabbix-server-а можно опробовать получение данных:

usr@zabbixsrv:~$ zabbix_get -s 100.10.100.10 -k docker.status[crashed]
0
usr@zabbixsrv:~$ zabbix_get -s 100.10.100.10 -k docker.status[all]
13
usr@zabbixsrv:~$ zabbix_get -s 100.10.100.10 -k docker.status[running]
6
usr@zabbixsrv:~$

Иногда наличие контейнеров в состоянии Crashed еще не показатель критического состояния системы, к примеру, когда «завалился» тестовый контейнер. Поэтому для меня было важно иметь возможность мониторить состояние нескольких конкретных контейнеров по имени. Эту проверку пришлось сооружать самому. Но особо ничего сложного, добавляем в zabbix-agent вот такой параметр:

UserParameter=docker.if.up[*],/usr/bin/docker ps |awk 'BEGIN { FS = "  +"; STATUS = "0"; DOCKER_NAME="$1" }; {if ( $$7 == DOCKER_NAME ) {if ( $$5 ~ "Up" ) STATUS = 1; else next;} else next; }; END''{print STATUS;}'

и перегружаем сервис zabbix-agent

sudo service zabbix-agent restart

Теперь используя ключ docker.if.up[имя_контейнера] мы можем узнать в состоянии «Up» он (вернется «1») или же состояние «не Up» (вернется «0»)
Попробуем спросить с забикс-сервера состояние конкретного контейнера:

usr@zabbixsrv:~$ zabbix_get -s 100.10.100.10 -k docker.if.up[vm3]
1
usr@zabbixsrv:~$ zabbix_get -s 100.10.100.10 -k docker.if.up[dev5]
0
usr@zabbixsrv:~$

Усе … осталось соорудить Template и добавить его к серверам с docker-ом
Вот для примера мой шаблон, в нем имя контейнера задается макросами «{$CONTAINER_NAME1}«, «{$CONTAINER_NAME2}» и тд, присваивайте на каждом хосте свои имена, лишние элементы данных для хоста можно деактивировать. Вцелом шаблон опробован — работает отлично!
Хай щастить!

Enjoy!

CentOS 6 — zabbix-agent 2.4 и Postgresql «password authentication failed»

Сижу себе тихо мирно, пытаюсь настроить мониторинг Postgres базы zabbix-agent-ом по этой статье, а тут на тебе! Все вроде верно делаю, а zabbix-agent не хочет конектиться к postgres-у хоть ты тресни! Что ему не нравится???
В хомяк забикс-агента файлик авторизации подсунул:

[root@db-01 ~]# ls -la /var/lib/zabbix
total 12
drwxr-xr-x   3 zabbix zabbix 4096 Dec 29 15:02 .
drwxr-xr-x. 20 root   root   4096 Dec 19 10:59 ..
-rw-------   1 zabbix zabbix   42 Dec 29 15:02 .pgpass
[root@db-01 ~]#
[root@db-01 ~]# cat /var/lib/zabbix/.pgpass
localhost:*:postgres:postgres:postgres_pass
[root@db-01 ~]#

файлик проверил скопировав в хомяк рута, отлично работает!

при этом в конфиге pg_hba.conf postgres:

# "local" is for Unix domain socket connections only
local   all             all                                     md5
# IPv4 local connections:
host    all             all             127.0.0.1/32            md5
# IPv6 local connections:
host    all             all             ::1/128                 md5
# Allow replication connections from localhost, by a user with the
# replication privilege.
#local   replication     postgres                                peer
#host    replication     postgres        127.0.0.1/32            ident
#host    replication     postgres        ::1/128                 ident

В логах postgres ругань:

< 2014-12-29 15:19:16.472 UTC >FATAL:  password authentication failed for user "postgres"
< 2014-12-29 15:19:16.472 UTC >DETAIL:  Connection matched pg_hba.conf line 84: "host    all             all             127.0.0.1/32            md5"

В логах zabbix_agent примерно тоже самое:

[root@db-01 ~]# cat /var/log/zabbix/zabbix_agentd.log
...
psql: fe_sendauth: no password supplied
Password for user postgres:
psql: fe_sendauth: no password supplied
Password for user postgres:
psql: fe_sendauth: no password supplied
[root@db-01 ~]#

Помогло шаманское действо, которое я случайно сделал в приступе отчаяния.

[root@db-01 ~]# vipw

Там для пользователя zabbix сменил shell из /sbin/nologin на /bin/bash
После чего из рута перешел под юзера zabbix и проверил коннект к postgres, конечно же он прошел на ура! Дождался пока zabbix-server покажет хоть чтото в «Последних данных». Таки отдуплился и показал заветные циферки! После этого опять финт ушами «чтобы сделать все как было»:

[root@db-01 ~]# vipw

и возврат shell-а в состояние /sbin/nologin
После чего циферки в zabbix-server всеравно бегут! Мистика, че это было так и не понял! Энтерпрайз …. будь он неладен!

Хай щастить!

Pentaho + Saiku = Nginx «Error 400 Illegal character in path…»

Блин, последнее время часто натыкаюсь на какието нёхи … притом на ровном месте 🙂
Решил за nginx засунуть Pentaho и Pentaho-DI, сделал по этой статье … на данном этапе проблем не возникло. А вот установленный в Pentaho плагин Saiku Analytics отказался фильтровать данные при постройке OLAP-ов … После тучи угробленного времени с дебагом java, решил копнуть в сторону nginx, и правильно сделал 🙂 Он то зараза мне свинью и подсунул в виде вот такой ошибки:

122.122.100.2 - - [13/Dec/2014:09:07:01 +0000] "GET /pentaho/plugin/saiku/api/api/query/2CA565443-5B4B-3841-AC54-168602DCE65C/result/metadata/hierarchies/%5Bboss.default%5D/levels/fio?result=true&searchlimit=3000&_=1418720804584 HTTP/1.1" 400 990 "https://pentaho.somedomain.com/pentaho/content/saiku-ui/index.html?biplugin5=true&ts=1418720803760" "Mozilla/5.0 (X11; Linux x86_64; rv:31.0) Gecko/20100101 Firefox/31.0 Iceweasel/31.3.0" "-"

Ошибка эта изза того что jQuery саиковский генерит GET запрос содержащий символы «[]» которые nginx лихо преобразовывает в «%5B» и «%5D» и уже в таком виде отдает tomcat-у … на что томкат рычит и запрос не понимает, тупо отбрасывает с ошибкой.
Для решения данной проблемки достаточно в конфиге nginx убрать слеш в параметре proxy_pass. Короче … делай как я! Читать полностью

PXE + TFTP CentOS7 — Ошибка «Warning: /dev/root does not exist»

Настраивал сетевую загрузку (PXE + TFTP) инсталлеров различных линуксов (об этом чуть позже напишу). Тестил на Virtualbox-овой виртуалке. Наткнулся на интересную багу в CentOS 7. Бага заключается в том, что несмотря на правильно настроенный TFTP, установка CentOS 7 доходила до места «Starting Dracut Emergency Shell …» и на этом долго висела, потом вываливалась с ошибкой: «Warning: /dev/root does not exist»
Выглядило это примерно так …
CentOS7 - PXE netboot error
Долго я мучил google, нашел соратников с такой же проблемой, но ответа как это решить — нету. Но проблему всетаки решил 🙂 Читать полностью