четверг, 26 февраля 2015 г.

Курсы Java/Android

Всем интересующимся программированием на java: проводятся курсы, доп. информация по ссылке. Автор курса мой знакомый - Лигай Виталий, гуру программирования, как я считаю.

понедельник, 23 февраля 2015 г.

Отказоустойчивый, масштабируемый кластер приложения с балансировкой нагрузки, часть 1

Заголовок броский, я бы даже сказал, слегка желтоват (желтая IT пресса - более унылой вещи трудно представить). Но, тем не менее, это правда, хотя, как известно, все скрывается в деталях. В данном случае детали - это, собственно, возможность самого ПО делить нагрузку или обеспечивать отказоустойчивость. Но хватит лирики, перейдем к постановке задачи.

Мне нужен почтовый релей, забегая вперед, скажу, что с таким же успехом это может быть любое другое приложение, например, web сервер. Могу показаться банальным занудой, но хочу еще раз повторить: каждый сервис требует отдельного анализа, и не факт, что желаемое удастся реализовать. Далее отразим заголовок статьи: релей должен быть отказоустойчивым и иметь возможность масштабирования. Читатель статьи может возразить, что для почтового релея все вышесказанное можно реализовать, добавив несколько MX записей в доменной зоне. К сожалению, я ограничен одним, уже существующим ip адресом релея, таким образом, вариант с MX не годится. Подведем итог: нужно несколько почтовых релеев, обеспечивающих отказоустойчивость сервиса, разделяющих нагрузку и использующих один ip адрес.

В плане выбора ПО все просто и традиционно - я буду использовать дистрибутив oracle linux 7 (почти аналогичны ему centos 7 или rhel 7), в качестве smtp сервиса - postfix. Для балансировки будет использоваться решение LVS, поскольку ее частью является подсистема linux ядра - ipvs, быстрый и надежный вариант балансировки трафика на 4-м уровне сетевой модели OSI. 

В качестве управляющего ПО кластером используется keepalived. Данное ПО использует протокол VRRP для обеспечения высокой доступности (high avialability) нод кластера, а также позволяет организовать мониторинг доступности приложения.

Оставшиеся вводные данные:
Используемая сеть: 192.168.3.0/24
IP серверов по порядку: 192.168.3.[101-105]
Общий IP: 192.168.3.100

Обычно в стандартной практике делают отдельный кластер балансировки и группу серверов приложения, к примеру, рекомендуемое решение от Red Hat. Особенность данной реализации заключается в том, что каждый сервер является сервером приложения и балансировщиком трафика одновременно. Один из балансировщиков является активным, остальные резервные. В моем случае используются четыре релея, расположенные по два в двух географически разнесенных ЦОДах. Ниже приведен рисунок, иллюстрирующий прохождение трафика в кластере, к которому мы будем возвращаться при описании процесса работы.


Посмотрите, что происходит: входящее соединение попадает на активную ноду (кластерный mac не используется), активная нода в соответствии с правилами балансировки обрабатывает соединение самостоятельно или передает его на одну из соседних нод, т.е. в обработке принимают участие все ноды кластера, затем нода отвечает клиенту. Таким образом весь входящий трафик проходит через одну активную ноду, а соответствующий исходящий трафик отправляется напрямую клиенту.

Перейдем к установке и настройке. Все написанное ниже справедливо для всех нод кластера, если не указано обратное. Установку и настройку postfix рассматривать не будем, убедитесь только что postfix использует все доступные сетевые интерфейсы:

# grep "inet_interfaces" /etc/postfix/main.cf | grep -v "^#"
inet_interfaces = all

Отключим firewalld, его можно будет настроить позднее, после того как будете твердо уверены, что кластер функционирует должным образом:

# systemctl disable firewalld.service
# systemctl stop firewalld.service

Установим keepalived, ipvsadm и модуль python ipaddr, модуль нужен для скрипта:

# yum -y install keepalived ipvsadm python-ipaddr

Разберем конфигурационный файл keepalived:

# Секция определения общих параметров
global_defs {
   notification_email {
      # Список почтовых адресов, по которым будут приходить оповещения о
      # недоступности нод или сервисов
      unix_adm@domain.ru
   }
   # Email от которого будет рассылаться почта
   notification_email_from keepalived@domain.ru
   # Адрес smtp сервера и время, в течение которого будет производится попытка
   # отправки почты
   smtp_server 192.168.3.1
   smtp_connect_timeout 30
   # Идентификатор сервера
   router_id server01.domain.ru
}

# Секция описания экземпляров VRRP (перемещаемые IP)
vrrp_instance mail_relay {
    # Начальное состояние при запуске, на остальных серверах должно быть BACKUP
    state MASTER
    # Интерфейс, на котором будет работать экземпляр VRRP
    interface eth0
    # Идентификатор экземпляра VRRP, должен быть идентичен на всех нодах.
    virtual_router_id 11
    # Приоритет при выборе MASTER'а, нода с большим приоритетом становится
    # активной.
    priority 100
    # Интервал уведомлений о состоянии, которые рассылает MASTER нода.
    # При отсутствии уведомлений произойдут перевыборы.
    advert_int 2
    # Секция аутентификации, пароль должен быть идентичен на всех нодах,
    # используется первые 8 символов.
    authentication {
        auth_type PASS
        auth_pass mrelay
    }
    # Список адресов, которые будут добавлены на ноду при выборе ее MASTER
    virtual_ipaddress {
        192.168.3.100
    }
    # Произвести миграцию состояния MASTER при появлении ноды с более высоким
    # приоритетом. В случае установки опции в nopreempt при появлении ноды с 
    # более высоким приоритетом MASTER нодой останется прежняя нода.
    preempt
    # Скрипт, который надо выполнить при событии, когда нода становится MASTER
    notify_master "/etc/keepalived/bypass_ipvs.py -r 192.168.3.100"
    # Скрипт, который надо выполнить при событии, когда нода становится SLAVE
    notify_backup "/etc/keepalived/bypass_ipvs.py -a 192.168.3.100"
    # Скрипт, который надо выполнить при событии ошибки смены роли ноды
    notify_fault "/etc/keepalived/bypass_ipvs.py -a 192.168.3.100"
}

Что выполняет скрипт: при установке состояния BACKUP на ноде он добавляет правило в iptables, которое заменяет (NAT) общий IP в пакетах входящего трафика на локальный IP ноды, и наоборот - для ответного трафика:

-A PREROUTING -t nat -d 192.168.3.100/32 -p tcp -j REDIRECT

Таким образом реализуется совместная обработка трафика всеми нодами, посмотрите еще раз рисунок вверху. В случае, когда нода становится MASTER, скрипт убирает правило натирования, поскольку общий IP принадлежит этой ноде. Скачать скрипт можно здесь.

Несколько замечаний: 
  • state - если вы уверены в качестве сети, можно на всех нодах кластера выставить BACKUP, в этом случае мастер определится в результате выборов. 
  • priority - в случае равных приоритетов побеждает нода с большим IP.
  • nopreempt - при данной опции state должен быть установлен в BACKUP.
  • если установить опции state BACKUP, одинаковый priority и nopreempt на все ноды, мы получим идентичный конфигурационный файл, что очень удобно в системах централизованного сопровождения серверов. Но вместе с тем шансы возникновения ситуации "split brain" в результате каких либо проблем также увеличиваются.
Продолжим далее рассматривать keepalived.conf:

# Секция конфигурации политики балансировки (LVS) и описание серверов приложения
virtual_server 192.168.3.100 25 {
    # Период опроса серверов приложения
    delay_loop 2
    # Планировщик балансировки, wlc - Weighted Least-Connections Scheduling.
    lb_algo wlc
    # Метод передачи пакетов на сервера приложений, dr - Direct Routing
    lb_kind DR
    protocol TCP

    # Секция описание сервера приложения 192.168.3.101
    real_server 192.168.3.101 25 {
        # Вес сервера
        weight 1
        # Секция проверки доступности приложения, в данном случае выполняется
        # проверка доступности smtp приложения. 
        SMTP_CHECK {
            connect_timeout 5
            retry 3
            # Имя в команде smtp helo
            helo_name smtpchecker.domain.ru
        }
    }
    # Далее однотипные описания серверов для 192.168.3.102 и т.д.
}

Еще несколько замечаний:
  • lb_algo wlc - распределяет большее количество запросов серверам с наименьшим количеством активных подключений в соответствии с их весом.
  • lb_kind DR - маршрутизация пакета, в этом случае пакет с активной ноды передается на резервную следующим образом: производится замена MAC адреса в поле destination MAC в ethernet заголовке пакета с MAC адреса активной ноды на MAC адрес сервера приложения. IP адрес остается без изменения. В свою очередь сервер приложения (нода в состоянии BACKUP) получив пакет, натирует общий IP адрес в поле destination IP в свой собственный. 
  • со всеми вариантами балансировки, передачи пакетов, методах проверки доступности приложения можно ознакомиться на сайте проекта LVS.
Ссылка на файл keepalived.conf

Запустим keepalived и проверим что получилось:

# systemctl enable keepalived.service
# systemctl start keepalived.service

$ telnet 192.168.3.100 25
Trying 192.168.3.100...
Connected to 192.168.3.100.
Escape character is '^]'.
220 server01.domain.ru ESMTP Postfix
quit
221 2.0.0 Bye
Connection closed by foreign host.
[valentine@server ~]$ telnet 192.168.3.100 25
Trying 192.168.3.100...
Connected to 192.168.3.100.
Escape character is '^]'.
220 server02.domain.ru ESMTP Postfix
quit
221 2.0.0 Bye
Connection closed by foreign host.

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

Посмотреть логи keepalived:

# journalctl -u keepalived.service

Посмотреть, на какой ноде находится общий IP, привычная команда ifconfig его не показывает:

# ip addr show
...
2: eth0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc pfifo_fast state UP qlen 1000
    link/ether 52:54:00:0d:5a:1a brd ff:ff:ff:ff:ff:ff
    inet 192.168.3.101/24 brd 192.168.3.255 scope global dynamic eth0
       valid_lft 70403sec preferred_lft 70403sec
    inet 192.168.3.100/32 scope global eth0
...

Или более современный вариант:

# nmcli device show eth0
...
IP4.ADDRESS[1]:                         ip = 192.168.3.101/24, gw = 192.168.3.1
IP4.ADDRESS[2]:                         ip = 192.168.3.100/32, gw = 192.168.3.1
...

Посмотреть статистику балансировки:

# ipvsadm -Ln
IP Virtual Server version 1.2.1 (size=4096)
Prot LocalAddress:Port Scheduler Flags
  -> RemoteAddress:Port           Forward Weight ActiveConn InActConn
TCP  192.168.3.100:25 wlc
  -> 192.168.3.101:25             Route   1      2          14         
  -> 192.168.3.102:25             Route   1      3          9      
...

Посмотреть текущие соединения:

# ipvsadm -Lnc
IPVS connection entries
pro expire state       source             virtual            destination
TCP 13:20  ESTABLISHED 192.168.3.3:59527  192.168.3.100:25   192.168.3.102:25
...

Если в сети несколько vrrp экземпляров, можно проверить номера идентификаторов

# tcpdump -nnn ip proto 112
tcpdump: verbose output suppressed, use -v or -vv for full protocol decode
listening on eth0, link-type EN10MB (Ethernet), capture size 65535 bytes
21:11:36.244824 IP 192.168.3.101 > 224.0.0.18: VRRPv2, Advertisement, vrid 11, prio 100, authtype simple, intvl 1s, length 20

Удачных внедрений!

Upd: продолжение, для тех кому мало будет 4 ноды.

воскресенье, 22 февраля 2015 г.

Настройка соединения мост для использования в Virtual Machine Manager

Коллеги, читатели, сегодня мне понадобилось провести эксперимент с несколькими виртуальными машинами на домашнем PC. Для эксперимента надо было пустить машины напрямую в локальную сеть. Сделать это можно путем создания сетевого моста (бридж), в котором будут находится интерфейсы виртуальных машин и интерфейс гипервизора, в литературе этот вариант настройки также называется "shared physical device"
Несмотря на то, что, начиная с Fedora 20 (у меня Fedora 21) NetworkManager поддерживает создание соединений типа мост, выполнять будем по старинке (я не всегда понимаю логику работы NetworkManager, и собственно, попробовав с наскоку настроить, я получил неудовлетворительный результат).
Создайте конфигурационный файл сетевого моста:

# cat /etc/sysconfig/network-scripts/ifcfg-bridge0 
DEVICE=bridge0
ONBOOT=yes
TYPE=Bridge
BOOTPROTO=dhcp
NM_CONTROLLED=no
DELAY=0

где bridge0 это имя моста.
Соответствующая конфигурация сетевого интерфейса гипервизора:

# cat /etc/sysconfig/network-scripts/ifcfg-eno1 
TYPE=Ethernet
ONBOOT=yes
HWADDR=91:DE:80:B4:5F:0C
DEVICE=eno1
BOOTPROTO=none
NM_CONTROLLED=no
BRIDGE=bridge0

Удалите конфигурацию NetworkManadger, относящуюся к физическому интерфейсу. Далее можете перегрузиться или перезапустить network.service. Перейдем к настройке в Virtual Machine Manager. Зайдите в параметры оборудования виртуальной машины, выберите "Указать имя общего устройства" и соответственно укажите имя сетевого моста, как на рисунке ниже



воскресенье, 19 октября 2014 г.

Поиск установленных сторонних rpm пакетов

На серверах, доставшихся в наследство, полезно определить наличие "левых" пакетов. Это можно сделать следующим образом:

$ rpm -qa --qf "%{NAME} - %{VENDOR}\n"

Теперь самое время выяснить, с какими флагами компиляции собрано:

$ rpm -qa --qf "%{NAME} - \"%{OPTFLAGS}\"\n" nginx
nginx - "-O2 -g -pipe -Wall -Wp,-D_FORTIFY_SOURCE=2 -fexceptions -fstack-protector-strong --param=ssp-buffer-size=4 -grecord-gcc-switches -specs=/usr/lib/rpm/redhat/redhat-hardened-cc1 -m64 -mtune=generic"

Если потребуется выяснять дальше, могут пригодится другие теги в запросе:

$ rpm --querytags

Удивляет, почему всякий раз, приходя на новое место работы, приходится разгребать авгиевы конюшни и перевоспитывать IT братию.

понедельник, 9 июня 2014 г.

"Полувысокая" доступность сервиса

Столкнулся со следующей задачей: есть два сервера с развернутым на них СУБД Oracle, один из серверов основной рабочий, второй, соответственно, резервный, операционная система - oel 6. При смене ролей серверов (не буду рассказывать о методе резервирования и процедуре смены, поскольку к теме заметки это не относится), основной становится резервным и наоборот. Все хорошо, но как нетрудно догадаться, на клиентах придется менять IP адрес подключения, что может доставить определенные трудности и затраты времени. Реализовывать варианты HA для IP адреса поздновато, т.к. все работает и времени простоя на внедрение и отладку нет, и просто не имеет смысла т.к. смена ролей серверов производится вручную. В таком случае, напрашивается сразу решение - вынести ip подключения как alias на сетевой интерфейс и переносить его при смене ролей. Это просто, логично, но есть следующая трудность - при переносе IP адреса меняется физический интерфейс и, как следствие, MAC адрес. Таким образом, для того чтобы пакеты пошли на новый интерфейс, необходимо у каждого клиента обновить ARP запись для этого IP адреса. Это можно сделать с помощью пакета ARP оповещения, т.е. сервер, на который "переехал" IP адрес должен отправить широковещательный пакет c новым IP и с mac адресом своего интерфейса. Это можно реализовать с помощью утилиты send_arp. Man страничка для нее несколько запутанно написана, поэтому немного о том, как ее использовать.

send_arp [-i dev] src_ip_addr src_hw_addr targ_ip_addr tar_hw_addr

Итого, допустим, что переносимый IP - 192.168.10.10, интерфейс eth2 и MAC этого интерфейса - 94:de:82:a8:4f:0c, тогда:

send_arp -i eth2 192.168.10.10 94:de:82:a8:4f:0c 192.168.10.10 ffffffffffff

Непонятно почему такие targ_ip_addr и tar_hw_addr? IP адрес назначения, в пакете анонсирования должен быть идентичен IP источника, см RFC 3927. MAC адрес назначения должен быть широковещательным.
Где взять саму утилиту? Она входит в состав пакета piranha, естественно, нет смысла ставить сам пакет и зависимости. Ставим:

# yum install yum-plugin-downloadonly
# yum --downloadonly install piranha
# rpm2cpio /var/cache/yum/x86_64/6Server/public_ol6_latest/packages/piranha-0.8.6-4.0.1.el6.x86_64.rpm | cpio -iumd ./usr/sbin/send_arp
# mv usr/sbin/send_arp /usr/sbin/

Можно уже пользоваться, а можно написать небольшой скрипт, для удобства использования. Входные данные для скрипта - имя alias'а, а так же IP адрес и сетевая маска. Разместим эти данные в файле:


# cat /etc/ipalias.conf
alias_name=eth2:1
alias_ip=192.168.10.10
alias_netmask=255.255.255.0
Собственно сам скрипт:

# cat /usr/local/bin/ipalias.sh
#!/bin/bash
export PATH=/usr/local/sbin:/usr/local/bin:/sbin:/bin:/usr/sbin:/usr/bin:/root/bin
. /etc/ipalias.conf
interface_name=`echo $alias_name | awk -F: '{ print $1 }'`
new_mac=`ifconfig $interface_name | grep HWaddr | awk -FHWaddr '{ print $2 }'`
case "$1" in
  up)
        #Up alias
        ping -c 1 $alias_ip > /dev/null 2>&1
        OUT=$?
        if [ "$OUT" == "0" ]
          then
            echo "ERROR! IP $alias_ip is exist"
            exit 1
          else
            ifconfig $alias_name $alias_ip netmask $alias_netmask
            send_arp -i $interface_name $alias_ip $new_mac $alias_ip ffffffffffff
        fi
        ;;
  down)
        #Down alias
        ifconfig -a | grep $alias_name > /dev/null 2>&1
        OUT=$?
        if [ "$OUT" != "0" ]
          then
            echo "ERROR! Interface $alias_name is not exist"
            exit 1
          else
            ifconfig $alias_name down
        fi
        ;;
  *)
        echo
        echo "Usage:"
        echo "$0 up"
        echo "  or"
        echo "$0 down"
        echo
        echo "/etc/ipalias.conf - Configuration file"
        echo
        ;;
esac

воскресенье, 7 июля 2013 г.

Возможность чтения лог файлов пользователем отличным от root

Бывают случаи, когда нужно пользователю, не обладающему привилегиями root, дать возможность читать системные логи. В случае использования rsyslog, это легко сделать, предоставив определенной группе, в которую входит пользователь, право на чтение лог файлов. Для смены группы владельца всех журналов необходимо добавить в конфигурацию /etc/rsyslog.conf следующие директивы (точно работает в rhel\centos 6, версия rsyslog 5.8.10):

$umask 0000
$FileGroup some_group
$FileCreateMode 0640

Если вы пользуетесь более новой версией rsyslog, чем в rhel\centos 6 (например, которая поставляется в fedora 18 - rsyslog 7.2.6), можно воспользоватся более изящным способом - через action. К примеру, для того, чтобы лог файл messages имел группу владельца wheel:

*.info;mail.none;authpriv.none;cron.none   action(type="omfile" FileCreateMode="0644" FileGroup="wheel" File="/var/log/messages")



вторник, 11 июня 2013 г.

Аудит в Linux

Обычно об аудите задумываются когда возникают подозрения в компрометации системы. Лично я использовал аудит несколько раз за свою практику. И каждый раз я быстренько смотрел одним глазочком, как его настроить. Как правило это был аудит модификаций файлов. В данной статье я не преследую цель раскрыть архитектурные подробности устройства аудита в linux, или дать рекомендации по настройке/администрированию для сред CC-CAPP/EAL (Common Criteria-Controlled Access Protection Profiles/Evaluation Assurance Level), это скорее практическая статья. Хотя минимум теоретической информации все же необходим. Все ниже написанное справедливо для rhel6, расхождения с другими дистрибутивами не существенное.

Подсистема аудита состоит из нескольких компонентов:

  • модуль ядра — перехватывает системные вызовы (syscalls) и регистрирует событие;
  • даемон auditd — пишет зарегистрированное событие на диск в файл;
  • даемон audispd — осуществляет пересылку сообщений (диспетчер) к другому приложению;
  • ряд вспомогательных утилит:

    • auditctl — утилита управления демоном auditd;
    • aureport — дает возможность составить отчет, отчет может быть настроен под задачи;
    • ausearch — позволяет выбрать события по заданному критерию;
    • autrace — утилита позволяет выполнить трассировку отдельного приложения.

Используемые конфигурационные файлы:

  • /etc/sysconfig/auditd — содержит настройки используемые при старте даемона auditd;
  • /etc/audit/auditd.conf — настройки поведения даемона auditd;
  • /etc/audit/audit.rules — файл содержащий правил аудита.

Настройка даемона auditd.
Как отмечено выше, настройка сводится к изменению параметров в файлах конфигурации /etc/sysconfig/auditd и /etc/audit/auditd.conf. Поверьте мне на слово, файл /etc/sysconfig/auditd с содержимым по умолчанию можно не трогать, там ничего интересного нет. Разберем лучше сразу второй файл - /etc/audit/auditd.conf.

# cat /etc/audit/auditd.conf
log_file = /var/log/audit/audit.log 
log_format = RAW 
log_group = root 
priority_boost = 4 
flush = INCREMENTAL 
freq = 20 
num_logs = 5 
disp_qos = lossy 
dispatcher = /sbin/audispd 
name_format = NONE 
##name = mydomain 
max_log_file = 6 
max_log_file_action = ROTATE 
space_left = 75 
space_left_action = SYSLOG 
action_mail_acct = root 
admin_space_left = 50 
admin_space_left_action = SUSPEND 
disk_full_action = SUSPEND 
disk_error_action = SUSPEND 
##tcp_listen_port = 
tcp_listen_queue = 5 
tcp_max_per_addr = 1 
##tcp_client_ports = 1024-65535 
tcp_client_max_idle = 0 
enable_krb5 = no 
krb5_principal = auditd 
##krb5_key_file = /etc/audit/audit.key

Значения параметров:

  • log_file — место расположения и название файла аудита;
  • log_format — формат ведения лога. Возможные значения: RAW — сообщения записываются в том виде как их передало ядро; nolog — не писать сообщения;
  • log_group — группа-владелец лог-файла аудита;
  • priority_boost — приоритет c каким работает даемон (nice).
  • flush — как будет записываться лог-файл на диск. Возможные значения: none — не использовать политики записи, incremental —  лог будет записываться с определенной периодичностью, определенной в параметре freq; data — данные пишутся в файл в синхронном режиме; sync — в синхронном режиме находятся не только данные но и метаданные файла.  
  • freq — число событий при котором осуществляется запись данных на диск, используется при значении flush = incremental. 
  • num_logs — число лог файлов аудита хранимых на диске, если настроена ротация в параметре max_log_file_action.
  • disp_qos — определяет надежность передачи данных между даемоном auditd и диспетчером audispd. Возможные значения: lossy — auditd может не передавать некоторые события аудита, если очередь событий полна при этом события будут записаны на диск; lossless — логирование событий на диск будет остановлено пока не освободится место в очереди.
  • dispatcher — где располагается исполняемый файл диспетчера.
  • name_format и name. name_format — определяет порядок разрешения имен хостов. Возможные значения: none — имя не используется; hostname — имя возвращенное через запрос gethostname; fqd — полное имя хоста, возвращенное через DNS запрос; numeric — ip адрес; user — строка определенная в параметре name.
  • max_log_file и max_log_file_action. max_log_file — максимальный размер лог файла в мегабайтах, по достижению которого будет выполнено действие определенное в max_log_file_action. Возможные действия: ignore — ничего не делать; syslog — отправить предупреждение в syslog; suspend — остановить запись событий на диск; rotate — произвести ротацию лог файлов в соответствии с числом num_logs; keep_logs — осуществить ротацию, при этом не удалять старые файлы.
  • space_left, space_left_action и action_mail_acct. space_left — величина в мегабайтах, определяющая размер оставшегося дискового пространства при достижении которого будет выполнно действие space_left_action. Возможные действия: ignore — ничего не делать;  syslog — отправить предупреждение в syslog; email — отправить письмо аккаунту определенному в action_mail_acct; exec — выполнить скрипт; suspend — остановить запись на диск, перевести систему в single mode; halt — выключить систему.
  • admin_space_left и admin_space_left_action. admin_space_left — величина в мегабайтах оставшегося свободного пространства на диске. Последний шанс для администратора что бы добавить/очистить свободное пространство. Величина должна быть меньше чем space_left. Действия которые можно определить в admin_space_left_action аналогичны space_left_action.
  • disk_full_action — действия выполняемые при заполнении всего дискового пространства, аналогичны space_left_action. 
  • disk_error_action — действия выполняемые при возникновении дисковой ошибки, аналогичны space_left_action.
  • tcp_listen_port, tcp_listen_queue, tcp_max_per_addr, tcp_client_ports и tcp_client_max_idle — даемон аудита может принимать сообщения от других даемонов. Данные переменные определяют сетевые настройки.
  • enable_krb5, krb5_principal, krb5_key_file — переменные определяющие аутентификацию по протоколу kerberos. 

Управление подсистемой аудита
Управление подсистемой аудита и добавление новых правил осуществляется утилитой — auditctl. Естественно эти изменения временные, для того что бы они стали постоянными их необходимо прописать в /etc/audit/audit.rules.

Основные команды управления auditctl:

  • -e [0..2] — (enabled), при 0 — отключить, 1 — включить, 2 — включить и заблокировать конфигурацию аудита. В случае блокировки изменение конфигурации аудита будет доступно только после перезагрузки хоста; 
  • -f [0..2] — (flag), установка поведения при критической ошибке, 1 — ничего не делать, 1 — вывести сообщение на консоль, 2 — немедленное выключение системы;
  • -r — (rate_limit), лимит скорости сообщений в минуту, при 0 — скорость не лимитируется. Если будет осуществлено превышение — будет выполнено действие поведения при критической ошибке flag;
  • -b — (backlog_limit), размер буфера сообщений ожидающих обработки. Если будет осуществлено превышение — будет выполнено действие поведения при критической ошибке flag;
  • -s — запрос текущего состояние даемона аудита;
  • -l — вывод всех текущих правил аудита;
  • -D — очистить все правила аудита.

Приведу несколько примеров:
Посмотрим как выглядит настройка по умолчанию даемона аудита:

# auditctl -s 
AUDIT_STATUS: enabled=1 flag=1 pid=985 rate_limit=0 backlog_limit=320 lost=0 backlog=0

Удалим все существующие правила:

# auditctl -D

Увеличим размер буфера сообщений:

# auditctl -b 1024

Добавим правило аудита, оно включает протоколирование всех попыток изменить содержимое файла /etc/shadows или изменить его атрибуты, структуру правил рассмотрим позже:

# auditctl -w /etc/shadow -p wa

В файл /etc/audit/audit.rules параметры конфигурации и правила записывается точно в таком же виде, как и  консольные команды, за исключением самой команды auditctl, т.е для вышеприведенных примеров будет справедливо:

# cat /etc/audit/audit.rules
-D
-b 1024
-w /etc/shadow -p wa