iptables в RHEL 7 / Centos 7

Centos 7 как вернуть iptables вместо firewalld

Я считал, считаю и буду считать, что iptables в его старом чистом виде больше подходит для серверов чем новомодный firewalld который сначала запихнули в дистрибутивы федоры начиная с 18-й, а теперь ещё и в RHEL7 и Centos 7. Во-первых потому, что firewalld генерирует большое количество бессмысленных правил которые излишне тормозят работу iptables. Я пробежался по цепочке INPUT пустого настроенного по умолчанию firewalld и насчитал там 14!!! пустых переходов! Возможно это гениальное приложение с очень продуманной архитектурой, но вот однозначно ему не место в высоконагруженных системах. Во-вторых читать и понимаеть вывод iptables -nvL без обработки практически невозможно.
В-третьих на серверах нет нужды динамически управлять iptables, а fail2ban при небольших доработках конфигов прекрасно справляется со своей работой.

Поэтому если я устанавливаю сервер на Centos 7, то первым делом я возвращаю iptables.
Continue reading iptables в RHEL 7 / Centos 7

sudoers: проверка синтаксиса

Когда вы редактируете файл /etc/sudoers или создаёте подключаемые к нему файлы в каталоге /etc/sudoers.d/* то неплохо бы сразу проверить синтаксис. Если вы редактируете sudoers в его редакторе visudo то он автоматически проверит синтаксис при сохранении. А если как я больше пользуетесь mcedit то после редактирования sudoers можно выполнить проверку указав ключ:

[root@d01 sudoers.d]# visudo -c
/etc/sudoers: parsed OK
/etc/sudoers.d/zabbix_sudo: parsed OK

Как видите синтаксис проверился вместе со вложением /etc/sudoers.d/zabbix_sudo.

Но на боевом сервере, где sudo активно используется системой мониторинга или каким либо скриптом из crontab, не стоит проводить правку файла по-живому. Для этого его можно скопировать в другое место и там редактировать. А после редактирования проверить всё той же командой но с дополнительным ключом:

[root@d01 sudoers.d]# visudo -cf /root/sudoers.new
/root/sudoers.new: parsed OK

После этого его можно смело копировать на место боевого файла. Не забудтре однако правильно поставить права 440 для владелеца и группы root:root.

Почему копипастить команды с web сразу в терминал это глупость?

Потому что bash/sh терминал выполнит команду если в ней будет перевод строки.

Во-первых когда команда набирается руками происходит запоминание, сначала вы внимательно читаете команду, затем вводите ту часть которую запомнили, затем дальше читаете и снова вводите. Работают глаза, голова и руки. Запоминается эффективнее.

Во-вторых вместе с командой можно скопипастить чужой зловредный код. Не верите?
Выделите код который приведён ниже скопируйте и затем вставьте в тектовый редактор. После этого вы всегда будете копипастить код через редактор, а короткие команды будете набирать руками.
Continue reading Почему копипастить команды с web сразу в терминал это глупость?

Мониториг почтовой очереди

Скрипт получает состояние почтовой очереди и подсчитывает количество заданий их общий размер и выводил даты самого молодого и старого задания в очереди.

mailq | sed -e 's/[\t]\+/ /g' | sed -e '/^ \+/d;/^ *$/d' | awk '{if(NR==1){qtimestr=gensub(/^.+ (-+Q-Time-+) .+$/,"\\1","g",$0);start=index($0,qtimestr);len=length(qtimestr);}else{printf("%d;%"len"s\n", $2, substr($0,start,len));}}' | while IFS=';' read size date ; do echo -e "`date -d\"${date}\" '+%F %T'`;${size}"; done | sort | awk -F';' '{count++;size=size+$2;if(NR==1){printf("oldest:%s\n", $1)}}END{if(count>0){printf("youngest:%s\ncount:%d\nsize:%dMB\n", $1, count, size/1024/1024)}}'
oldest:2015-10-31 04:21:00
youngest:2015-11-04 11:25:00
count:10
size:25MB

Теперь немного доработав скрипт можно его использовать в системах мониторинга, чтобы оповестить администратора о неадекватном росте количества заданий в очереди. Например, если через взломанный эккаунт сервер используется для рассылки спама.

Значительно более быстро контролировать количество заданий в очереди можно контролировать если очередь заданий разместить на отдельной файловой системе.

df -iP /var/spool/mqueue
Filesystem            Inodes   IUsed   IFree IUse% Mounted on
/dev/mapper/VG_MAIN-MQUEUE 10485760     120 10485640    1% /var/spool/mqueue
В данном случае интересует количество использованных inodes.
df -iP /var/spool/mqueue | awk '{if($3 ~ /^[0-9]+$/){print $2, $3, $4}}'
10485760 120 10485640

Здесь нужно мониторить второе поле которое показывает количество занятых inode. Их резкий рост и удержание на высоком уровне будет сигнализировать о вероятной спамерской активности с вашего сервера. А так как в отличии от первого (с mailq) такой скрипт работает очень быстро то мониторить можно ежесекундно.
Повторюсь, этот способ не подойдёт если каталог с почтовыми очередями находится в одной файловой системе с другими каталогами, например на корневой FS. Здесь начнут влиять inode временных файлов и всяких других создаваемых пользователями, программами и демонами. Впрочем вынести почтовые очереди на отдельную FS не такая уж и сложная задача. А для сервера полезная.

Мониторинг состояния диска SSD Intel DC S3500

После установки на сервер диска SSD Intel DC S3500 необходимо было подключить его к системе мониторинга.

Для этого необходимо было обновить базу smartctl разобраться с параметрами и выбрать те которые будем мониторить.

Чтобы разобраться с параметрами нужно взять спецификацию на диск. Она нашлась по адресу http://www.intel.com/content/dam/www/public/us/en/documents/product-specifications/ssd-dc-s3500-spec.pdf

Как видно из спецификации для параметров мониторинга подходит несколько атрибутов:
Continue reading Мониторинг состояния диска SSD Intel DC S3500

Доступ к данным на диске гостевой виртуальной машины

Предположим ситуацию когда имеется сервер под управлением Linux на котором установлен KVM и запущены виртуальные машины с Linux. С точки зрения производительности и удобства диски виртуальных машин нужно размещать в разделах LVM. Один LV = один диск для виртуальной машины. Однако когда потребуется достать данные с такого диска, а там установлен Linux с использованием LVM то окажется что LVM сервера не видит LVM расположенный внутри диска.

Для этого потребуется утилита kpartx которая подключит диск виртуальной машины после чего он станет виден ядру, lvm и fdisk.
Continue reading Доступ к данным на диске гостевой виртуальной машины

Отладка logrotate

logrotate запускается по крону один раз в сутки.

/etc/cron.daily/logrotate

Для отладки logrotate предусмотрен ключ -t который пишет операции которые должен сделать но из-за ключа отладки не делает в реальности:

/usr/sbin/logrotate -d /etc/logrotate.conf

Во время отладки конфигурационных файлов logrotate на боевом сервере такую команду можно запускать без опасений, что другие log-файлы будут прокручены слишком много раз и потеряется важная информация которая может ещё пригодиться для поиска проблем.

logrotate --help
Usage: logrotate [OPTION...] <configfile>
  -d, --debug               Don't do anything, just test (implies -v)
  -s, --state=statefile     Path of state file
  -v, --verbose             Display messages during rotation

Ключом -v можно пользоваться в команднике /etc/cron.daily/logrotate чтобы во время работы отладочная информация записывалась в файл:

logrotate -v /etc/logrotate.conf 2>&1 | sudo tee -a /var/log/logrotate.log

Для чего нужно поправить файл /etc/cron.daily/logrotate
Возможно для создания файла вам потребуется добавить исключение SELinux для нового log-файла /var/log/logrotate.log.
Continue reading Отладка logrotate

smartctl и новые диски

Когда в сервер устанавливаются новые диски, часто можно заметить что описания некоторых параметров S.M.A.R.T. регистров не соответствуют действительности либо вообще отствуют. Например так было после установки SSD Intel DC S3500 на сервер с “CentOS release 6.6 (Final)“:

170 Unknown_Attribute       0x0033   100   100   010    Pre-fail  Always       -       0
171 Unknown_Attribute       0x0032   100   100   000    Old_age   Always       -       0
172 Unknown_Attribute       0x0032   100   100   000    Old_age   Always       -       0
174 Unknown_Attribute       0x0032   100   100   000    Old_age   Always       -       1

Continue reading smartctl и новые диски

Получение списка NS серверов для домена

Однострочный скрипт для получения списка ns сероверов домена.

DOMAIN="youngblog.hoster-ok.com"; TLD="${DOMAIN##*.}"; FLD="${DOMAIN%.*}"; FLD="${FLD##*.}"; echo -e "TLD:${TLD}\nFLD:${FLD}"; ROOTNS=`dig +short NS ${TLD}. | head -n 1 | sed -e 's/\.$//g'`; dig +authority +noadditional +nocomments +nostats +nocmd ${FLD}.${TLD}. @${ROOTNS} | sed -e 's/[;#%].*//g;s/^[ \t]*//g;s/[ \t]*$//g;/^$/d'
TLD:com
FLD:hoster-ok
hoster-ok.com.          172800  IN      NS      ns1.vds-ok.com.
hoster-ok.com.          172800  IN      NS      ns2.vds-ok.com.
hoster-ok.com.          172800  IN      NS      ns1.hoster-ok.com.

Принцип следующий:
Первая команда  dig +short NS ${TLD}.  (обратите внимание на точку на конце) получает корневые NS сервера которые обслуживают конкретный TLD (Top Level Domain) например .com .net .org .ru и т.д., а вторая команда  dig +authority +noadditional +nocomments +nostats +nocmd ${FLD}.${TLD}. @${ROOTNS}  получает из определённого NS @${ROOTNS} информацию по домену ${FLD}.${TLD}. (снова обратите внимание на точку на конце) информация, которую нужно включить или подавить, перечислена ключами.

Примечание!В целях балансировки нагрузки первая команда выдаёт список серверов в произвольном порядке для того чтобы те кто выбирает постоянно одну и ту же строку каждый раз получали другой сервер.

Обновление виртуальных квот Pure-FTP

Случается скопировать файлы в папку ftp пользователя или удалить в обход ftp сервера. Тоесть прямо с диска сервера, а не через FTP соединение. После этого наблюдается несоответствие суммарного размера файлов на диске в каталоге ftp с теми размерами которые вычисляет pureftp. В корне каждого ftp каталога при включённых виртуальных квотах размещаются файлы .ftpquota. Эти файлы содержат два числа: количество файлов и их суммарный размер. При каждом добавлении обновлении или удалении файла через FTP демон pure-ftpd вносит измненение в этот файл. И если каталоги FTP изменять (добавлять удалять файлы) в обход pure-ftpd изменения остаются неучтёнными в этом файле. Для того чтобы восстановить соответствие сожержимого папок ftp сервера и файла .ftpquota предназначается команда pure-quotacheck. Работает она только для одного выбранного пользователя. А если необходимо пробежаться по всем пользователям то можно воспользоваться таким скриптом:

#!/bin/bash

PUREPW="/usr/bin/pure-pw"
PUREQUOTACHECK="/usr/sbin/pure-quotacheck"
AWK="/bin/awk"
SED="/bin/sed"
XARGS="/usr/bin/xargs"

# update all virtual quotas with no messages
# "${PUREPW}" list | "${AWK}" '{print $2}' | "${SED}" -e 's|/\./$||g' | "${XARGS}" -I{} "${PUREQUOTACHECK}" -u pureftp -d "{}"

# update all virtual quotas with progress info
"${PUREPW}" list | "${AWK}" '{print gensub(/\.\/$/,"","g",$2)}' | while read FTPHOME ; do
  [ -e "${FTPHOME}" ] && (
    echo -en "${FTPHOME}:";
    [ -e "${FTPHOME}.ftpquota" ] && BEFORE=`cat "${FTPHOME}.ftpquota"` || BEFORE="";
    "${PUREQUOTACHECK}" -u pureftp -d "${FTPHOME}";
    AFTER=`cat "${FTPHOME}.ftpquota"`;
    [ "${BEFORE}" == "${AFTER}" ] && (echo -en " no changes ") || (
      echo -en " changed\n"
      echo -e "1 ${BEFORE}\n2 ${AFTER}" | "${AWK}" '{printf("files:%10d size:%14d", $2, $3); if($1==1){printf("\n");}}'
    )
    echo " [Done]"
  );
done

pureftp – это локальный пользователь для демона pure-ftpd
Этот скрипт отчитается о изменении файлов .ftpquota для каждого пользователя ftp и выведет информацию из этого файла перед и после обновления, так что будет ясно где была разница. Внутри также есть закоментарованный “однострочник” которые обновить файлы .ftpquota без вывода каких либо сообщений.

В документации по PureFTP рекомендуется регулярно обновлять виртуальные квоты. Поэтому скрипт можно добавить в крон и в зависимости от количества и объёма всех FTP файлов запускать его один раз в сутки или в неделю.

А этот скрипт выводит текущие квоты всех пользователей.

pure-pw list | awk '{print gensub(/\.\/$/,".ftpquota","g",$2)}' | while read FN ; do [ -e "${FN}" ] && (echo -en "${FN}:"; cat "${FN}" | tr -d '\n'; echo ) ; done