Предотвратить Запуск дублирования задания CRON
Когда вы настраиваете задание cron, иногда вам нужно убедиться, что у вас всегда будет только один запущенный экземпляр за раз.
Проверку предыдущего вызова скрипта можно реализовать с помощью другого скрипта оболочки, который обнаруживает запущенный экземпляр перед его повторным выполнением (например, с помощью pidof), альтернатива - вы можете использовать flock или run-once.
Файл блокировки - это обычный файл, который создается перед выполнением сценария и удаляется после завершения сценария.
Таким образом, если какая-либо другая команда попытается выполнить тот же сценарий, используя тот же файл блокировки, она завершиться или подождет, пока не сможет его запустить.
FLOCK: crontab
*/5 * * * * /usr/bin/flock -n /opt/ms.lockfile /opt/my_script
Использование flock для выполнения сценария, явно указывая файл блокировки для использования, и для завершения, если скрипт уже запущен с параметром -n.
RUN-ONE: crontab
*/5 * * * * run-one /opt/my_script
В некоторых дистрибутивах, также есть утилита run-one, которая обрабатывает блокировку автоматически.
Подведем итог:
Хорошей практикой является предотвращение дублирования запущенных экземпляров заданий cron
Когда вы настраиваете задание cron, иногда вам нужно убедиться, что у вас всегда будет только один запущенный экземпляр за раз.
Проверку предыдущего вызова скрипта можно реализовать с помощью другого скрипта оболочки, который обнаруживает запущенный экземпляр перед его повторным выполнением (например, с помощью pidof), альтернатива - вы можете использовать flock или run-once.
Файл блокировки - это обычный файл, который создается перед выполнением сценария и удаляется после завершения сценария.
Таким образом, если какая-либо другая команда попытается выполнить тот же сценарий, используя тот же файл блокировки, она завершиться или подождет, пока не сможет его запустить.
FLOCK: crontab
*/5 * * * * /usr/bin/flock -n /opt/ms.lockfile /opt/my_script
Использование flock для выполнения сценария, явно указывая файл блокировки для использования, и для завершения, если скрипт уже запущен с параметром -n.
RUN-ONE: crontab
*/5 * * * * run-one /opt/my_script
В некоторых дистрибутивах, также есть утилита run-one, которая обрабатывает блокировку автоматически.
Подведем итог:
Хорошей практикой является предотвращение дублирования запущенных экземпляров заданий cron
FAILLOCATE против DD для создания и использования SWAP
Разберем пример использования двух великолепных команд:
~]# fallocate -l 1G /swapfile
и
~]# dd if=/dev/zero of=/swapfile bs=1024 count=1024
Приведенные команды, отрабатывают и формируют SWAP.
Останься задать один вопрос:
Если приведенные команды великолепны и отрабатывают, так в чем же преимущество одной от другой?
mkswap позволяет задействовать одноименную утилиту, предназначенную для создания файлов или разделов подкачки.
Обратившись к man mkswap:
Обратите внимание, что файл подкачки не должен содержать никаких пропусков.
Использование cp для создания файла неприемлемо.
Также не рекомендуется использовать fallocate в файловых системах, поддерживающих XFS или ext4, или в файловых системах btrfs. В этих случаях рекомендуется использовать
dd(1) и /dev/zero.
Обратившись к man swapon:
Вы не должны использовать swapon для файла с пропусками. Это можно увидеть в системном журнале следующим образом
swapon: swapfile has holes.
Реализация файла подкачки в ядре предполагает возможность записи
в файл напрямую, без помощи файловой системы. Это проблема с предварительно распределенными файлами (например, fallocate) в файловых системах, таких как XFS или ext4, и в btrfs.
Из этого следует, что, хотя fallocate может быть быстрее, чем dd, он не подходит для создания файлов подкачки и не поддерживается инструментами, связанными с управлением им.
Разберем пример использования двух великолепных команд:
~]# fallocate -l 1G /swapfile
и
~]# dd if=/dev/zero of=/swapfile bs=1024 count=1024
Приведенные команды, отрабатывают и формируют SWAP.
Останься задать один вопрос:
Если приведенные команды великолепны и отрабатывают, так в чем же преимущество одной от другой?
mkswap позволяет задействовать одноименную утилиту, предназначенную для создания файлов или разделов подкачки.
Обратившись к man mkswap:
Обратите внимание, что файл подкачки не должен содержать никаких пропусков.
Использование cp для создания файла неприемлемо.
Также не рекомендуется использовать fallocate в файловых системах, поддерживающих XFS или ext4, или в файловых системах btrfs. В этих случаях рекомендуется использовать
dd(1) и /dev/zero.
Обратившись к man swapon:
Вы не должны использовать swapon для файла с пропусками. Это можно увидеть в системном журнале следующим образом
swapon: swapfile has holes.
Реализация файла подкачки в ядре предполагает возможность записи
в файл напрямую, без помощи файловой системы. Это проблема с предварительно распределенными файлами (например, fallocate) в файловых системах, таких как XFS или ext4, и в btrfs.
Из этого следует, что, хотя fallocate может быть быстрее, чем dd, он не подходит для создания файлов подкачки и не поддерживается инструментами, связанными с управлением им.
Расширение диска без LVM.txt
14 KB
Как расширить диск без LVM (EXT4)?
TCPDUMP. Анализ и перехват сетевого трафика.
tcpdump — отличный инструмент командной строки, который способен перехватывать и анализировать сетевой трафик.
Синтаксис:
tcpdump опции -i интерфейс фильтры
Опции tcpdump
-A: Позволяет отсортировать пакеты с форматом ASCII
-l: Добавляет функцию прокрутки
-i: После ввода нужно указать сетевой интерфейс, который будет отслеживаться. Чтобы начать отслеживать все интерфейсы, впишите после опции слово «any»
-c: Завершает процесс отслеживания после проверки указанного количества пакетов
-w: Генерирует текстовый файл с отчетом проверки
-e: Показывает уровень интернет-соединения пакета данных
-L: Выводит только те протоколы, которые поддерживает указанный сетевой интерфейс
-C: Создает другой файл во время записи пакета, если его размер больше заданного
-r: Открывает файл для чтения, который был создан с помощью опции -w
-j: Для записи пакетов будет использоваться формат TimeStamp
-J: Позволяет просмотреть все доступные форматы TimeStamp
-G: Служит для создания файла с логами. Опция требует также указания временного значения, по истечении которого будет создаваться новый лог
-v, -vv, -vvv: В зависимости от количества символов в опции, вывод команды будет становиться подробнее
-f: В выводе показывает имя домена адресов IP
-F: Позволяет считывать информацию не из сетевого интерфейса, а из указанного файла
-D: Демонстрирует все сетевые интерфейсы, которые можно использовать
-n: Деактивирует отображение доменных имен
-Z: Задает пользователя, под учетной записью которого будут созданы все файлы
-K: Пропуск анализа контрольных сумм
-q: Демонстрация краткой информации
-H: Позволяет обнаружить заголовки 802.11s
-I: Используется при захвате пакетов в режиме монитора
Фильтры
host: Служит для указания имени хоста
net: Указывает IP подсети и сети
ip: Служит для указания адреса протокола
src: Выводит пакеты, которые были отправлены с указанного адреса
dst: Выводит пакеты, которые были получены указанным адресом
arp, udp, tcp: Фильтрация по одному из протоколов
port: Отображает информацию, относящуюся к определенному порту
and, or: Служит для объединения нескольких фильтров в команде
less, greater: Вывод пакетов меньше или больше указанного размера
Пример вывода:
20:58:26.765637 IP 10.0.0.50.80 > 10.0.0.1.53181: Flags [F.], seq 1, ack 2, win 453, options [nop,nop,TS val 3822939 ecr 249100129], length 0
Описание:
• Метка времени Unix (20: 58: 26.765637)
• протокол (IP)
• имя или IP-адрес исходного хоста и номер порта (10.0.0.50.80)
• имя хоста или IP-адрес назначения и номер порта (10.0.0.1.53181)
• Флаги TCP (Flags [F.]). Указывают на состояние соединения и могут содержать более одного значения:
• o S — SYN. Первый шаг в установлении соединения
• F — FIN. Прекращение соединения
• — ACK. Пакет подтверждения принят успешно
• P — PUSH. Указывает получателю обрабатывать пакеты вместо их буферизации
• R — RST. Связь прервалась
• Порядковый номер данных в пакете. (seq 1)
• Номер подтверждения. (ack 2)
• Размер окна (win 453). Количество байтов, доступных в приемном буфере. Далее следуют параметры TCP
• Длина полезной нагрузки данных. (length 0)
tcpdump — отличный инструмент командной строки, который способен перехватывать и анализировать сетевой трафик.
Синтаксис:
tcpdump опции -i интерфейс фильтры
Опции tcpdump
-A: Позволяет отсортировать пакеты с форматом ASCII
-l: Добавляет функцию прокрутки
-i: После ввода нужно указать сетевой интерфейс, который будет отслеживаться. Чтобы начать отслеживать все интерфейсы, впишите после опции слово «any»
-c: Завершает процесс отслеживания после проверки указанного количества пакетов
-w: Генерирует текстовый файл с отчетом проверки
-e: Показывает уровень интернет-соединения пакета данных
-L: Выводит только те протоколы, которые поддерживает указанный сетевой интерфейс
-C: Создает другой файл во время записи пакета, если его размер больше заданного
-r: Открывает файл для чтения, который был создан с помощью опции -w
-j: Для записи пакетов будет использоваться формат TimeStamp
-J: Позволяет просмотреть все доступные форматы TimeStamp
-G: Служит для создания файла с логами. Опция требует также указания временного значения, по истечении которого будет создаваться новый лог
-v, -vv, -vvv: В зависимости от количества символов в опции, вывод команды будет становиться подробнее
-f: В выводе показывает имя домена адресов IP
-F: Позволяет считывать информацию не из сетевого интерфейса, а из указанного файла
-D: Демонстрирует все сетевые интерфейсы, которые можно использовать
-n: Деактивирует отображение доменных имен
-Z: Задает пользователя, под учетной записью которого будут созданы все файлы
-K: Пропуск анализа контрольных сумм
-q: Демонстрация краткой информации
-H: Позволяет обнаружить заголовки 802.11s
-I: Используется при захвате пакетов в режиме монитора
Фильтры
host: Служит для указания имени хоста
net: Указывает IP подсети и сети
ip: Служит для указания адреса протокола
src: Выводит пакеты, которые были отправлены с указанного адреса
dst: Выводит пакеты, которые были получены указанным адресом
arp, udp, tcp: Фильтрация по одному из протоколов
port: Отображает информацию, относящуюся к определенному порту
and, or: Служит для объединения нескольких фильтров в команде
less, greater: Вывод пакетов меньше или больше указанного размера
Пример вывода:
20:58:26.765637 IP 10.0.0.50.80 > 10.0.0.1.53181: Flags [F.], seq 1, ack 2, win 453, options [nop,nop,TS val 3822939 ecr 249100129], length 0
Описание:
• Метка времени Unix (20: 58: 26.765637)
• протокол (IP)
• имя или IP-адрес исходного хоста и номер порта (10.0.0.50.80)
• имя хоста или IP-адрес назначения и номер порта (10.0.0.1.53181)
• Флаги TCP (Flags [F.]). Указывают на состояние соединения и могут содержать более одного значения:
• o S — SYN. Первый шаг в установлении соединения
• F — FIN. Прекращение соединения
• — ACK. Пакет подтверждения принят успешно
• P — PUSH. Указывает получателю обрабатывать пакеты вместо их буферизации
• R — RST. Связь прервалась
• Порядковый номер данных в пакете. (seq 1)
• Номер подтверждения. (ack 2)
• Размер окна (win 453). Количество байтов, доступных в приемном буфере. Далее следуют параметры TCP
• Длина полезной нагрузки данных. (length 0)
Без парольный доступ. Работа с rsa ключами.
Для осуществления без парольного доступа, используют RSA ключи.
RSA - криптографический алгоритм с открытым ключом.
Предположим у вас есть пул машин, одна из которых, с именем - central.server, а остальные - server
На сервере central.server:
~]# hostname
central.server
~]# cat ~/.ssh/id_rsa
В случае отсутствия, выполните:
~]# ssh-keygen
(На все запросы нажмите Enter)
Помните, при генерации нового ключа с заменой предыдущего, вы не сможете воспользоваться предыдущим ключом.
На серверах, server:
~]# hostname
server
~]# mkdir ~/.ssh
~]# touch ~/.ssh/authorized_keys
~]# chmod -R 700 $HOME/.ssh
~]# chmod 644 ~/.ssh/authorized_keys
Скопировать содержимое из ~/.ssh/id_rsa с central.server в ~/.ssh/authorized_keys на пул серверов к которым вы желаете осуществить подключение.
Альтернативой копирования ключа, может выступить rsa-copy-id
..@central.server ~]# rsa-copy-id username@server
или
..@central.server ~]# cat .ssh/id_rsa.pub | ssh username@server 'cat >> ~/.ssh/authorized_keys'
Проверяем:
..@central.server ~]# ssh username@server
Для осуществления без парольного доступа, используют RSA ключи.
RSA - криптографический алгоритм с открытым ключом.
Предположим у вас есть пул машин, одна из которых, с именем - central.server, а остальные - server
На сервере central.server:
~]# hostname
central.server
~]# cat ~/.ssh/id_rsa
В случае отсутствия, выполните:
~]# ssh-keygen
(На все запросы нажмите Enter)
Помните, при генерации нового ключа с заменой предыдущего, вы не сможете воспользоваться предыдущим ключом.
На серверах, server:
~]# hostname
server
~]# mkdir ~/.ssh
~]# touch ~/.ssh/authorized_keys
~]# chmod -R 700 $HOME/.ssh
~]# chmod 644 ~/.ssh/authorized_keys
Скопировать содержимое из ~/.ssh/id_rsa с central.server в ~/.ssh/authorized_keys на пул серверов к которым вы желаете осуществить подключение.
Альтернативой копирования ключа, может выступить rsa-copy-id
..@central.server ~]# rsa-copy-id username@server
или
..@central.server ~]# cat .ssh/id_rsa.pub | ssh username@server 'cat >> ~/.ssh/authorized_keys'
Проверяем:
..@central.server ~]# ssh username@server
Окружение. Переменные.
Переменные окружения - это переменные каждого пользователя специфичные для определенной среды, в операционной системе .
Несколько примеров переменных окружения в Linux:
• USER – указывает на текущего вошедшего в систему пользователя.
• HOME – отображается домашний каталог текущего пользователя.
• SHELL – путь к оболочке текущего пользователя
• LANG – переменная указывает на текущие настройки языка / локали.
• MAIL – местоположение, в котором хранится почта текущего пользователя.
Эти переменные окружения меняются в зависимости от текущего сеанса пользователя.
Отобразить список переменных окружения:
~]# env
Вывод переменных окружения Linux:
~]# printenv VAR
или
~]# echo $VAR
Установить переменные среды окружения.
Синтаксис
export VAR_NaME=value
Пример:
~]# export LOG=/var/log
Проверить:
~]# env
~]# cd $LOG
Данные метод, является временным и сохраняется для текущего сеанса.
Постоянные переменные окружения.
bashrc - файл сценария, который выполняется всякий раз, когда пользователь входит в систему.
Чтобы сделать LOG переменную постоянной, отредактируйте файл .bashrc и определите ее в нем
~]# vi ~/.bashrc
Для вступления изменений в силу, выполните:
~]# source .bashrc
Данная переменная станет постоянной, но только для текущего пользователя.
Создание глобальных постоянных переменных
Для применения общесистемных переменных (переменных доступных всем пользователям), используется файл /etc/environment
Добавьте переменную LOG с ее значением в файл. Чтобы изменения вступили в силу, используйте команду
~]# source /etc/environment
Переменные, установленные в /etc/profile, считываются всякий раз, когда оболочка bash входит в систему. Отредактируйте:
~]# vi /etc/profile
и внесите, в содержимое:
export hi=“HI Linux Administrator”
Переменные окружения - это переменные каждого пользователя специфичные для определенной среды, в операционной системе .
Несколько примеров переменных окружения в Linux:
• USER – указывает на текущего вошедшего в систему пользователя.
• HOME – отображается домашний каталог текущего пользователя.
• SHELL – путь к оболочке текущего пользователя
• LANG – переменная указывает на текущие настройки языка / локали.
• MAIL – местоположение, в котором хранится почта текущего пользователя.
Эти переменные окружения меняются в зависимости от текущего сеанса пользователя.
Отобразить список переменных окружения:
~]# env
Вывод переменных окружения Linux:
~]# printenv VAR
или
~]# echo $VAR
Установить переменные среды окружения.
Синтаксис
export VAR_NaME=value
Пример:
~]# export LOG=/var/log
Проверить:
~]# env
~]# cd $LOG
Данные метод, является временным и сохраняется для текущего сеанса.
Постоянные переменные окружения.
bashrc - файл сценария, который выполняется всякий раз, когда пользователь входит в систему.
Чтобы сделать LOG переменную постоянной, отредактируйте файл .bashrc и определите ее в нем
~]# vi ~/.bashrc
Для вступления изменений в силу, выполните:
~]# source .bashrc
Данная переменная станет постоянной, но только для текущего пользователя.
Создание глобальных постоянных переменных
Для применения общесистемных переменных (переменных доступных всем пользователям), используется файл /etc/environment
Добавьте переменную LOG с ее значением в файл. Чтобы изменения вступили в силу, используйте команду
~]# source /etc/environment
Переменные, установленные в /etc/profile, считываются всякий раз, когда оболочка bash входит в систему. Отредактируйте:
~]# vi /etc/profile
и внесите, в содержимое:
export hi=“HI Linux Administrator”
system_info.pages
165.6 KB
Информация о системе. Как узнать быстро состояние?
Существует многочисленное количество команд для уточнения состояния системы, таких как mem, cpu, disk и иная информация. Я всегда только «ЗА» оптимизацию, получать своевременно и мгновенно информацию.
Прикрепленный файл system_info, несет в себе bash скрипт, при исполнении которого вам будет выведена информация о:
- загрузка системы
- использование дискового массива
- Использование оперативной памяти
- Количество процессов запущенных в системе
- Количество пользователей авторизованных в системе
- IP адрес
Но при чем тут автоматизация? Верно, автоматизация заключается в получении информации с применением минимальных труда затрат. Именно по этому мы сейчас допилим не большие моменты:
Измените привилегии доступа, сделайте исполняемым файл (при необходимости переименуйте файл):
~]# chown root. system_info.sh
Внесите изменения в конфигурационный файл /etc/bashrc и добавьте в конец файла, содержимое:
InfoScript=«/etc/system_info.sh";
if [[ -n $SSH_CONNECTION ]] && [ -x "$InfoScript" ]; then
/bin/bash $InfoScript; echo "";
fi;
А теперь, вы можете перезайти в систему и наслаждаться результатом информации о ней.
Существует многочисленное количество команд для уточнения состояния системы, таких как mem, cpu, disk и иная информация. Я всегда только «ЗА» оптимизацию, получать своевременно и мгновенно информацию.
Прикрепленный файл system_info, несет в себе bash скрипт, при исполнении которого вам будет выведена информация о:
- загрузка системы
- использование дискового массива
- Использование оперативной памяти
- Количество процессов запущенных в системе
- Количество пользователей авторизованных в системе
- IP адрес
Но при чем тут автоматизация? Верно, автоматизация заключается в получении информации с применением минимальных труда затрат. Именно по этому мы сейчас допилим не большие моменты:
Измените привилегии доступа, сделайте исполняемым файл (при необходимости переименуйте файл):
~]# chown root. system_info.sh
Внесите изменения в конфигурационный файл /etc/bashrc и добавьте в конец файла, содержимое:
InfoScript=«/etc/system_info.sh";
if [[ -n $SSH_CONNECTION ]] && [ -x "$InfoScript" ]; then
/bin/bash $InfoScript; echo "";
fi;
А теперь, вы можете перезайти в систему и наслаждаться результатом информации о ней.
Список пользователей.
Информация о локальных пользователях хранится в файле /etc/passwd.
~]# less /etc/passwd
Если вы хотите отображать только имя пользователя, вы можете использовать команды awk или cut для печати только первого поля, содержащего имя пользователя:
~]# awk -F: '{ print $1}' /etc/passwd
или
~]# cut -d: -f1 /etc/passwd
GETENT.
Команда getent отображает записи из баз данных, настроенных в файле /etc/nsswitch.conf, в том числе и passwd
~]# getent passwd
Если вы используете доменную аутентификацию, getent будет отображать всех пользователей Linux как из файла /etc/passwd, так и из AD/LDAP.
~]# getent passwd | awk -F: '{ print $1}'
или
~]# getent passwd | cut -d: -f1
Аналогично можно выполнить:
~]# compgen -u
Пользователи в Linux подразделяются на обычные и системные.
Обычные пользователи — это пользователи, созданные пользователем root или другим пользователем с привилегиями sudo. У каждого пользователя есть числовой идентификатор пользователя, называемый UID. Если UID не был выбран при создании пользователя с помощью useradd, то он будет выбран автоматически между UID_MIN и UID_MAX. Как их узнать?
~]# grep -E '^UID_MIN|^UID_MAX' /etc/login.defs
Вывод:
UID_MIN 500
UID_MAX 6000
Знание минимального и максимального значения позволяет нам запрашивать список всех обычных пользователей в нашей системе.
~]# getent passwd {500..6000}
Как отобразить пользователей имеющих оболочку входа?
~]# cat /etc/passwd | grep -E 'bash|sh|bin|zsh'
или
~]# cat /etc/passwd | grep -E -v 'nologin'
Информация о локальных пользователях хранится в файле /etc/passwd.
~]# less /etc/passwd
Если вы хотите отображать только имя пользователя, вы можете использовать команды awk или cut для печати только первого поля, содержащего имя пользователя:
~]# awk -F: '{ print $1}' /etc/passwd
или
~]# cut -d: -f1 /etc/passwd
GETENT.
Команда getent отображает записи из баз данных, настроенных в файле /etc/nsswitch.conf, в том числе и passwd
~]# getent passwd
Если вы используете доменную аутентификацию, getent будет отображать всех пользователей Linux как из файла /etc/passwd, так и из AD/LDAP.
~]# getent passwd | awk -F: '{ print $1}'
или
~]# getent passwd | cut -d: -f1
Аналогично можно выполнить:
~]# compgen -u
Пользователи в Linux подразделяются на обычные и системные.
Обычные пользователи — это пользователи, созданные пользователем root или другим пользователем с привилегиями sudo. У каждого пользователя есть числовой идентификатор пользователя, называемый UID. Если UID не был выбран при создании пользователя с помощью useradd, то он будет выбран автоматически между UID_MIN и UID_MAX. Как их узнать?
~]# grep -E '^UID_MIN|^UID_MAX' /etc/login.defs
Вывод:
UID_MIN 500
UID_MAX 6000
Знание минимального и максимального значения позволяет нам запрашивать список всех обычных пользователей в нашей системе.
~]# getent passwd {500..6000}
Как отобразить пользователей имеющих оболочку входа?
~]# cat /etc/passwd | grep -E 'bash|sh|bin|zsh'
или
~]# cat /etc/passwd | grep -E -v 'nologin'
blk_update_request.
Что делать если у вас регулярно регистрируется ошибка:
blk_update_request: I/O error, dev fd0, sector 0
Вы наверняка знаете, ранее в ПК мы использовали FLOPPY.
На ряду новых технологий, мы используем DVD, USB носители информации и совсем забыли о FLOPPY, так же как и о драйвере. Так давайте его отключим:
~]# rmmod floppy
Добавим в черный список загружаемых модулей
~]# echo "blacklist floppy" | sudo tee /etc/modprobe.d/blacklist-floppy.conf
~]# dracut -f -v
Выполним перезапуск системы
~]# reboot
Что делать если у вас регулярно регистрируется ошибка:
blk_update_request: I/O error, dev fd0, sector 0
Вы наверняка знаете, ранее в ПК мы использовали FLOPPY.
На ряду новых технологий, мы используем DVD, USB носители информации и совсем забыли о FLOPPY, так же как и о драйвере. Так давайте его отключим:
~]# rmmod floppy
Добавим в черный список загружаемых модулей
~]# echo "blacklist floppy" | sudo tee /etc/modprobe.d/blacklist-floppy.conf
~]# dracut -f -v
Выполним перезапуск системы
~]# reboot
cheat_sheet_selinux_v2.pdf
128.5 KB
Управление и использование SELinux.
Common Vulnerabilities and Exposures
CVE - база данных общеизвестных уязвимостей информационной безопасности. Каждой уязвимости присваивается идентификационный номер вида CVE-год-номер.
Red Hat CVE Checker
NEW Web site CVE
CVE - база данных общеизвестных уязвимостей информационной безопасности. Каждой уязвимости присваивается идентификационный номер вида CVE-год-номер.
Red Hat CVE Checker
NEW Web site CVE
CVE-2019-14287
Уязвимость CVE-2019-14287 очень интересна в своей природе. Благодаря наличию уязвимости в ОС, злоумышленник может овладеть максимальными привилегиями. Рассмотрим ее.
Для начала настроим разрешенное пользователю user_name для запуска всех прав пользователя, кроме корневых разрешений vim.
~]# visudo
или
~]# vi /etc/sudoers
…
user_name ALL=(ALL, !root) /usr/bin/vim
…
Сохранить.
Выполните:
~]# sudo -u#-1 id -u
или
~]# sudo -u#4294967295 id -u
в случае если после ввода пароля вы стали супер пользователем, сожалею - ваша система уязвима.
Причиной, по которой пользователь овладевает привилегиями- преобразование идентификатора пользователя в имени пользователя -1 (или не действительное значение 4294967295)
Решение:
Уязвимость влияет на все версии Sudo до последней версии 1.8.28. Необходимо повысить версию.
Уязвимость CVE-2019-14287 очень интересна в своей природе. Благодаря наличию уязвимости в ОС, злоумышленник может овладеть максимальными привилегиями. Рассмотрим ее.
Для начала настроим разрешенное пользователю user_name для запуска всех прав пользователя, кроме корневых разрешений vim.
~]# visudo
или
~]# vi /etc/sudoers
…
user_name ALL=(ALL, !root) /usr/bin/vim
…
Сохранить.
Выполните:
~]# sudo -u#-1 id -u
или
~]# sudo -u#4294967295 id -u
в случае если после ввода пароля вы стали супер пользователем, сожалею - ваша система уязвима.
Причиной, по которой пользователь овладевает привилегиями- преобразование идентификатора пользователя в имени пользователя -1 (или не действительное значение 4294967295)
Решение:
Уязвимость влияет на все версии Sudo до последней версии 1.8.28. Необходимо повысить версию.
Cтруктура файловой системы Linux
/ - корень;
Это главный каталог в системе Linux. По сути, это и есть файловая система Linux.
/bin - каталог с бинарными файлами пользователя;
Этот каталог содержит исполняемые файлы. Здесь расположены программы, которые можно использовать в однопользовательском режиме или режиме восстановления.
/sbin - системные исполняемые файлы;
Так же как и /bin, содержит двоичные исполняемые файлы
/etc - каталог с конфигурационными файлами;
В этом каталоге содержатся конфигурационные файлы всех программ, установленных в системе.
/dev - файлы устройств;
Местоположение всех подключенных устройств
/proc - информация о процессах;
Это подсистема, динамически создаваемая ядром ОС.
/var - Переменные файлы;
Название каталога /var говорит само за себя, он должен содержать файлы, которые часто изменяются
/tmp - каталог с временными файлами;
В этом каталоге содержатся временные файлы, созданные системой, любыми программами или пользователями
/usr - Программы пользователя;
Это самый большой каталог с большим количеством функций
/home - раздел для домашних каталогов пользователей;
Тут хранятся домашние каталоги созданных пользователей
/boot - Файлы загрузчика;
Содержит все файлы, связанные с загрузчиком системы
/lib - Системные библиотеки;
Содержит файлы системных библиотек, которые используются исполняемыми файлами в каталогах /bin и /sbin.
/opt - Дополнительные программы;
В этот каталог устанавливаются дополнительные программы
/sys - Информация о системе;
Назначение каталогов Linux из этой папки - получение информации о системе непосредственно от ядра
/ - корень;
Это главный каталог в системе Linux. По сути, это и есть файловая система Linux.
/bin - каталог с бинарными файлами пользователя;
Этот каталог содержит исполняемые файлы. Здесь расположены программы, которые можно использовать в однопользовательском режиме или режиме восстановления.
/sbin - системные исполняемые файлы;
Так же как и /bin, содержит двоичные исполняемые файлы
/etc - каталог с конфигурационными файлами;
В этом каталоге содержатся конфигурационные файлы всех программ, установленных в системе.
/dev - файлы устройств;
Местоположение всех подключенных устройств
/proc - информация о процессах;
Это подсистема, динамически создаваемая ядром ОС.
/var - Переменные файлы;
Название каталога /var говорит само за себя, он должен содержать файлы, которые часто изменяются
/tmp - каталог с временными файлами;
В этом каталоге содержатся временные файлы, созданные системой, любыми программами или пользователями
/usr - Программы пользователя;
Это самый большой каталог с большим количеством функций
/home - раздел для домашних каталогов пользователей;
Тут хранятся домашние каталоги созданных пользователей
/boot - Файлы загрузчика;
Содержит все файлы, связанные с загрузчиком системы
/lib - Системные библиотеки;
Содержит файлы системных библиотек, которые используются исполняемыми файлами в каталогах /bin и /sbin.
/opt - Дополнительные программы;
В этот каталог устанавливаются дополнительные программы
/sys - Информация о системе;
Назначение каталогов Linux из этой папки - получение информации о системе непосредственно от ядра
Что нужно знать о режиме сна и гибернации в Linux?
Режим гибернации при его включении, система Linux записывает свое текущее состояние в файл. Далее при включении все эти данные восстанавливаются и вы продолжаете работу с места остановки.
Режим сна помогает экономить электроэнергию, когда вы не используете свою систему.
В Linux есть 3 режима ожидания:
- Suspend to RAM - ждущий режим, режим используют большинство ноутбуков. В этом режиме питание остается для оперативной памяти,большая часть компонентов отключается.
- Suspend to Disk - в этом режиме состояние ПК сохраняется в файле подкачки, и система полностью выключается.
- Suspend to both - гибридная приостановка, здесь состояние машины сохраняется в swap, но система не выключается
Для отключения описанных выше режимов, необходимо отключить следующие sydtemd:
~]# systemctl mask sleep.target
~]# systemctl mask suspend.target
~]# systemctl mask hibernate.target
~]# systemctl mask hybrid-sleep.target
Выполните перезагрузку ОС
~]# shutdown -r
Режим гибернации при его включении, система Linux записывает свое текущее состояние в файл. Далее при включении все эти данные восстанавливаются и вы продолжаете работу с места остановки.
Режим сна помогает экономить электроэнергию, когда вы не используете свою систему.
В Linux есть 3 режима ожидания:
- Suspend to RAM - ждущий режим, режим используют большинство ноутбуков. В этом режиме питание остается для оперативной памяти,большая часть компонентов отключается.
- Suspend to Disk - в этом режиме состояние ПК сохраняется в файле подкачки, и система полностью выключается.
- Suspend to both - гибридная приостановка, здесь состояние машины сохраняется в swap, но система не выключается
Для отключения описанных выше режимов, необходимо отключить следующие sydtemd:
~]# systemctl mask sleep.target
~]# systemctl mask suspend.target
~]# systemctl mask hibernate.target
~]# systemctl mask hybrid-sleep.target
Выполните перезагрузку ОС
~]# shutdown -r
Управление systemd.
В Linux управлением systemd выполняется утилитой systemctl. Мы прекрасно знаем, как и за что отвечают те или иные команды передаваемые systemd для определенных юнитов, такие как: start, stop, status, mask, unmask. Но на самом деле, функционал достаточно широкий:
• list-units - посмотреть все службы
~]# systemctl list-units
• list-sockets - посмотреть все сокеты служб
~]# systemctl list-sockets
• list-timers - посмотреть список таймеров
~]# systemctl list-timers
• start - запустить службу
~]# systemctl start daemon
• stop - остановить службу
~]# systemctl stop daemon
• reload - перечитать конфигурацию
~]# systemctl reload daemon
• restart - перезапустить службу
~]# systemctl restart daemon
• try-restart - перезапустить службу, только если она запущена
~]# systemctl try-restart daemon
• reload-or-restart - попросить службу обновить свою конфигурацию
~]# systemctl reload-or-restart daemon
• isolate - запустить только одну службу вместе с ее зависимостями
~]# systemctl isolate daemon
• kill - отправить сигнал завершения процессу используется вместе с опциями --signal и --kill-who
~]# systemctl kill daemon
• clean - удалить все данные, которые касаются указанной службы, сюда входит кэш, логи
~]# systemctl clean daemon
• is-active - проверить запущена ли служба
~]# systemctl is-active daemon
• is-failed - проверить не завершилась ли служба с ошибкой
~]# systemctl is-failed daemon
• status - посмотреть состояние и вывод службы
~]# systemctl status daemon
• show - посмотреть параметры управления службой в Linux
~]# systemctl show daemon
• cat - посмотреть содержимое юнит файла в текстовом виде
~]# systemctl cat daemon
• reset-failed - очистить состояние failed для служб, которые завершились с ошибкой
~]# systemctl reset-failed
• list-dependencies - посмотреть зависимости службы
~]# systemctl list-dependencies daemon
• list-unit-files - вывести все установленные файлы служб
~]# systemctl list-unit-files
• enable - добавить службу в автозагрузку
~]# systemctl enable daemon
• disable - удалить службу из автозагрузки
~]# systemctl disable daemon
• is-enabled - проверить есть ли уже служба в автозагрузке
~]# systemctl is-enabled daemon
• reenable - сначала выполнить disable потом enable для службы
~]# systemctl reenable daemon
• list-jobs - все выполняющиеся задачи
~]# systemctl list-jobs
• snapshot - сохранить состояние служб, чтобы потом восстановить
~]# systemctl snapshot daemon
• daemon-reload - обновить конфигурацию юнитов для всех служб
~]# systemctl daemon-reload
• mask - сделать юнит недоступным
~]# systemctl mask daemon
• unmask - сделать юнит доступным
~]# systemctl unmask daemon
• link - добавить юнит файл, который расположен не в стандартной папке для юнитов
~]# systemctl link /home/daemon
• revert - вернуть юнит до состояния по умолчанию
~]# systemctl revert daemon
• edit - отредактировать параметры службы не изменяя основной файл юнита.
~]# systemctl edit daemon
В Linux управлением systemd выполняется утилитой systemctl. Мы прекрасно знаем, как и за что отвечают те или иные команды передаваемые systemd для определенных юнитов, такие как: start, stop, status, mask, unmask. Но на самом деле, функционал достаточно широкий:
• list-units - посмотреть все службы
~]# systemctl list-units
• list-sockets - посмотреть все сокеты служб
~]# systemctl list-sockets
• list-timers - посмотреть список таймеров
~]# systemctl list-timers
• start - запустить службу
~]# systemctl start daemon
• stop - остановить службу
~]# systemctl stop daemon
• reload - перечитать конфигурацию
~]# systemctl reload daemon
• restart - перезапустить службу
~]# systemctl restart daemon
• try-restart - перезапустить службу, только если она запущена
~]# systemctl try-restart daemon
• reload-or-restart - попросить службу обновить свою конфигурацию
~]# systemctl reload-or-restart daemon
• isolate - запустить только одну службу вместе с ее зависимостями
~]# systemctl isolate daemon
• kill - отправить сигнал завершения процессу используется вместе с опциями --signal и --kill-who
~]# systemctl kill daemon
• clean - удалить все данные, которые касаются указанной службы, сюда входит кэш, логи
~]# systemctl clean daemon
• is-active - проверить запущена ли служба
~]# systemctl is-active daemon
• is-failed - проверить не завершилась ли служба с ошибкой
~]# systemctl is-failed daemon
• status - посмотреть состояние и вывод службы
~]# systemctl status daemon
• show - посмотреть параметры управления службой в Linux
~]# systemctl show daemon
• cat - посмотреть содержимое юнит файла в текстовом виде
~]# systemctl cat daemon
• reset-failed - очистить состояние failed для служб, которые завершились с ошибкой
~]# systemctl reset-failed
• list-dependencies - посмотреть зависимости службы
~]# systemctl list-dependencies daemon
• list-unit-files - вывести все установленные файлы служб
~]# systemctl list-unit-files
• enable - добавить службу в автозагрузку
~]# systemctl enable daemon
• disable - удалить службу из автозагрузки
~]# systemctl disable daemon
• is-enabled - проверить есть ли уже служба в автозагрузке
~]# systemctl is-enabled daemon
• reenable - сначала выполнить disable потом enable для службы
~]# systemctl reenable daemon
• list-jobs - все выполняющиеся задачи
~]# systemctl list-jobs
• snapshot - сохранить состояние служб, чтобы потом восстановить
~]# systemctl snapshot daemon
• daemon-reload - обновить конфигурацию юнитов для всех служб
~]# systemctl daemon-reload
• mask - сделать юнит недоступным
~]# systemctl mask daemon
• unmask - сделать юнит доступным
~]# systemctl unmask daemon
• link - добавить юнит файл, который расположен не в стандартной папке для юнитов
~]# systemctl link /home/daemon
• revert - вернуть юнит до состояния по умолчанию
~]# systemctl revert daemon
• edit - отредактировать параметры службы не изменяя основной файл юнита.
~]# systemctl edit daemon
SSH. Как облегчить жизнь?
Создадим наш CA. К примеру это будет ключевая пара, в которой используется схема цифровой подписи типа Ed25519.
~]# ssh-keygen -C CA -t ed25519 -f ca_key
Не забудьте устанавливать пароли
Получаем два файла: ca_key и ca_key.pub. Они и образуют наш CA. Закрытый ключ ca_key перемещаем в необходимый каталог, а открытый ключ ca_key.pub помещаем на удаленном сервере в /etc/ssh/ca_key.pub и выполняем команду доверять всем ключам, подписанным этим CA, добавив в конфигурационный файл сервера /etc/ssh/sshd_config такую строку:
TrustedUserCAKeys /etc/ssh/ca_key.pub
‼️Всегда перезагружайте SSH-сервер после каждого изменения конфигурации
~]# systemctl restart ssh.service
Генерируем пару пользовательских ключей для аутентификации на сервере:
~]# ssh-keygen -t ed25519 -f user
и подписываем открытый ключ пользователя user.pub:
~]# ssh-keygen -s ca_key -I user -n root user.pub
Опция -I — это идентификатор ключа
Опция -n задает принципал
Предположим, у нас есть сервер с тремя непривилегированными пользователями user1, user2 и user3. Каждый пользователь имеет свои, строго ограниченные права доступа к файлам и каталогам.
Любому из этих принципалов может быть предоставлено право авторизоваться на сервере. Для этого создаем на сервере каталог auth_principals:
~]# mkdir /etc/ssh/auth_principals
А в sshd_config вставляем строку
AuthorizedPrincipalsFile /etc/ssh/auth_principals/%u
В каталоге auth_principals для любого пользователя можно создать файл, где указать тех принципалов, которые уполномочены авторизоваться под именем данного пользователя. Например, разрешим принципалам user1 и user2 авторизоваться в системе от имени пользователя user3:
~]# echo -e 'user1\nuser2' > /etc/ssh/auth_principals/user3
А принципалу user3 от имени пользователей user1 и user2:
~]# echo user3 > /etc/ssh/auth_principals/user1
~]# echo user3 > /etc/ssh/auth_principals/user2
Создадим принципалу user3 сертификат:
~]# ssh-keygen -s ca_key -I user -n user3 -z 102348 -O no-x11-forwarding -O source-address=192.168.145.23,192.168.201.0/24 -V always:2023 user.pub
С помощью опции -O source-address мы разрешили user3 входить в систему только с определенного IP-адреса и/или определенной сети.
С помощью опции -z даем сертификату серийный номер для учета и контроля и возможного отзыва.
Опция -O no-x11-forwarding запрещает x11-forwarding.
Теперь не забудьте поместить все эти ключи и сертификаты на клиентской машине в правильный каталог .ssh и отредактировать config
Создадим наш CA. К примеру это будет ключевая пара, в которой используется схема цифровой подписи типа Ed25519.
~]# ssh-keygen -C CA -t ed25519 -f ca_key
Не забудьте устанавливать пароли
Получаем два файла: ca_key и ca_key.pub. Они и образуют наш CA. Закрытый ключ ca_key перемещаем в необходимый каталог, а открытый ключ ca_key.pub помещаем на удаленном сервере в /etc/ssh/ca_key.pub и выполняем команду доверять всем ключам, подписанным этим CA, добавив в конфигурационный файл сервера /etc/ssh/sshd_config такую строку:
TrustedUserCAKeys /etc/ssh/ca_key.pub
‼️Всегда перезагружайте SSH-сервер после каждого изменения конфигурации
~]# systemctl restart ssh.service
Генерируем пару пользовательских ключей для аутентификации на сервере:
~]# ssh-keygen -t ed25519 -f user
и подписываем открытый ключ пользователя user.pub:
~]# ssh-keygen -s ca_key -I user -n root user.pub
Опция -I — это идентификатор ключа
Опция -n задает принципал
Предположим, у нас есть сервер с тремя непривилегированными пользователями user1, user2 и user3. Каждый пользователь имеет свои, строго ограниченные права доступа к файлам и каталогам.
Любому из этих принципалов может быть предоставлено право авторизоваться на сервере. Для этого создаем на сервере каталог auth_principals:
~]# mkdir /etc/ssh/auth_principals
А в sshd_config вставляем строку
AuthorizedPrincipalsFile /etc/ssh/auth_principals/%u
В каталоге auth_principals для любого пользователя можно создать файл, где указать тех принципалов, которые уполномочены авторизоваться под именем данного пользователя. Например, разрешим принципалам user1 и user2 авторизоваться в системе от имени пользователя user3:
~]# echo -e 'user1\nuser2' > /etc/ssh/auth_principals/user3
А принципалу user3 от имени пользователей user1 и user2:
~]# echo user3 > /etc/ssh/auth_principals/user1
~]# echo user3 > /etc/ssh/auth_principals/user2
Создадим принципалу user3 сертификат:
~]# ssh-keygen -s ca_key -I user -n user3 -z 102348 -O no-x11-forwarding -O source-address=192.168.145.23,192.168.201.0/24 -V always:2023 user.pub
С помощью опции -O source-address мы разрешили user3 входить в систему только с определенного IP-адреса и/или определенной сети.
С помощью опции -z даем сертификату серийный номер для учета и контроля и возможного отзыва.
Опция -O no-x11-forwarding запрещает x11-forwarding.
Теперь не забудьте поместить все эти ключи и сертификаты на клиентской машине в правильный каталог .ssh и отредактировать config
Под контролем безопасности
В настоящий момент, преобладающее использование ОС - Astra Linux.
Если есть подозрение, что у Вас в системе проникновение, предлагаю проверить, так ли это.
user_list.sh
# Получим список пользователей
if uname -a | grep astra ;
# Это вариант запроса для Astra Linux.
then
getent passwd {1000..60000} >/dev/null 2>&1
# Сравним с выводом через awk
eval getent passwd {$(awk '/^UID_MIN/ {print $2}' /etc/login.defs)..$(awk '/^UID_MAX/ {print $2}' /etc/login.defs)} | cut -d: -f1
fi
# Зачастую мы хотим просто посмотреть реальных пользователей, у которых есть каталоги.
# Исключаем папку lost+found
users=`ls /home -I lost*`
echo $users
Проверим информацию о входах в систему, основные параметры пользователей.
# Список последних загрузок ОС
~]# journalctl --list-boots 2>/dev/null
search_auth.sh
if [ -e /var/log/btmp ]
then
# Неудачные попытки входа в систему
lastb 2>/dev/null
fi
if [ -e /var/log/wtmp ]
then
# Лог логинов и бутов
last -f /var/log/wtmp
fi
Получаем список привилегированных sudo-юзеров
~]# sudo cat /etc/sudoers 2>/dev/null
~]# cat /etc/passwd 2>/dev/null
Юзеры с пустым паролем
~]# sudo cat /etc/shadow | awk -F":" '($2 == "") {print $1}' 2>/dev/null
Иногда можно найти приватные ключи хоста, что потом позволит изучить исходившие от него подключения. Это пригодится при расследовании сложных инцидентов с массовыми подключениями.
Спросим у рута и у всех пользователей, что у них есть на этот счет:
~]# cat /root/.ssh/* 2>/dev/null
~]# for name in $(ls /home) do cat /home/$name/.ssh/* 2>/dev/null done
Если полученные ключи не принадлежат известным системам, это может быть плохой новостью. Также проверим попытки удаленного входа через SSH:
~]# sudo journalctl _SYSTEMD_UNIT=sshd.service | grep "error" 2>/dev/null
Входы в систему по SSH можем посмотреть через lastlog.
~]# sudo journalctl | grep ssh # или sshd
Ищем ошибки аутентификации
~]# sudo journalctl | grep ssh | grep -i -A2 -B2 fail
В настоящий момент, преобладающее использование ОС - Astra Linux.
Если есть подозрение, что у Вас в системе проникновение, предлагаю проверить, так ли это.
user_list.sh
# Получим список пользователей
if uname -a | grep astra ;
# Это вариант запроса для Astra Linux.
then
getent passwd {1000..60000} >/dev/null 2>&1
# Сравним с выводом через awk
eval getent passwd {$(awk '/^UID_MIN/ {print $2}' /etc/login.defs)..$(awk '/^UID_MAX/ {print $2}' /etc/login.defs)} | cut -d: -f1
fi
# Зачастую мы хотим просто посмотреть реальных пользователей, у которых есть каталоги.
# Исключаем папку lost+found
users=`ls /home -I lost*`
echo $users
Проверим информацию о входах в систему, основные параметры пользователей.
# Список последних загрузок ОС
~]# journalctl --list-boots 2>/dev/null
search_auth.sh
if [ -e /var/log/btmp ]
then
# Неудачные попытки входа в систему
lastb 2>/dev/null
fi
if [ -e /var/log/wtmp ]
then
# Лог логинов и бутов
last -f /var/log/wtmp
fi
Получаем список привилегированных sudo-юзеров
~]# sudo cat /etc/sudoers 2>/dev/null
~]# cat /etc/passwd 2>/dev/null
Юзеры с пустым паролем
~]# sudo cat /etc/shadow | awk -F":" '($2 == "") {print $1}' 2>/dev/null
Иногда можно найти приватные ключи хоста, что потом позволит изучить исходившие от него подключения. Это пригодится при расследовании сложных инцидентов с массовыми подключениями.
Спросим у рута и у всех пользователей, что у них есть на этот счет:
~]# cat /root/.ssh/* 2>/dev/null
~]# for name in $(ls /home) do cat /home/$name/.ssh/* 2>/dev/null done
Если полученные ключи не принадлежат известным системам, это может быть плохой новостью. Также проверим попытки удаленного входа через SSH:
~]# sudo journalctl _SYSTEMD_UNIT=sshd.service | grep "error" 2>/dev/null
Входы в систему по SSH можем посмотреть через lastlog.
~]# sudo journalctl | grep ssh # или sshd
Ищем ошибки аутентификации
~]# sudo journalctl | grep ssh | grep -i -A2 -B2 fail
Файловые аномалии при проникновении.
Необходимо выполнить поиск всех файлов, у которых нет владельца или группы, — это характерно при удаленном проникновении на хост и работе через реверс‑шеллы.
При поиске вредоносов рекомендую искать файлы без владельца
~]# find /root /home -nouser 2>/dev/null
или без группы
~]# find /root /home -nogroup 2>/dev/null
Конкурирующая команда для поиска файлов с SUID и GUID
~]# find / -uid 0 \( -perm -4000 -o -perm 2000 \) -print
Поиск файлов с нехарактерных названиями, например начинающихся на точку, две точки или пробел
~]# find / -name " *" -print # find / -name ". *" -print
~]# find / -name ".. *" -print
Поиск больших файлов (больше 10 Мбайт)
~]# find / -size +10M
Поиск процессов, инициированных удаленными файлами
~]# lsof +L1
Необходимо выполнить поиск всех файлов, у которых нет владельца или группы, — это характерно при удаленном проникновении на хост и работе через реверс‑шеллы.
При поиске вредоносов рекомендую искать файлы без владельца
~]# find /root /home -nouser 2>/dev/null
или без группы
~]# find /root /home -nogroup 2>/dev/null
Конкурирующая команда для поиска файлов с SUID и GUID
~]# find / -uid 0 \( -perm -4000 -o -perm 2000 \) -print
Поиск файлов с нехарактерных названиями, например начинающихся на точку, две точки или пробел
~]# find / -name " *" -print # find / -name ". *" -print
~]# find / -name ".. *" -print
Поиск больших файлов (больше 10 Мбайт)
~]# find / -size +10M
Поиск процессов, инициированных удаленными файлами
~]# lsof +L1
Основы аудита Linux.
Аудит в Linux состоит из двух групп компонентов: в пространстве ядра это kauditd, а в пользовательском — auditd
Ядро, принимая системные вызовы из user space, пропускает их через фильтры user, task, filesystem , exclude и exit.
user используется для фильтрации событий
task применяется для системных вызовов fork() и clone().
filesystem используется для исключения событий для конкретной файловой системы.
exclude задает исключения для событий.
exit проходят все системные вызовы.
auditctl - мы можем управлять потоком событий.
ausearch, aureport, aulast просматривем журнал аудита.
Статус работы подсистемы
~]# auditctl -s
Отправьте текстовое сообщение
~]# auditctl -m hello
убедитесь
~]# ausearch -m USER
, что соответствующее событие попало в журнал аудита
Примеры правил находятся /usr/share/audit/sample-rules/.
Примеры типов правил:
Управляющие правила настраивают систему аудита и поведение агента.
Правила файловой системы. Формат правила следующий:
-w path-to-file -p permissions -k keyname
-w указывает на то, что это правило файловой системы.
-p может содержать любые комбинации прав доступа r (чтение), w (запись), x (выполнение) и a (изменение атрибута).
-k задает имя правила.
Правила системных вызовов используются для мониторинга системных вызовов.
-a action,list -S syscall -F field=value -k keyname
-a означает append (добавление) правила в фильтр.
action может быть always (всегда создавать события) или never (никогда не создавать события).
list содержит один из возможных вариантов: task, exit, user, filesystem или exclude.
-S - указывает конкретный syscall (имя или номер); можно в одном правиле указывать сразу несколько syscall, каждый после своего ключа -S.
-F - задает фильтр по полям.
-k - имя правила.
В качестве примера, создадим правило для регистрации изменения файла passwd.
Для начала убедимся, что у нас не применено ни одно правило.
~]# auditctl -l
Если ранее уже были заданы какие‑то правила, то смело удаляем их командой:
~]# auditctl -D
Применим правило:
~]# auditctl -w /etc/passwd -p wa -k passwd
Проверим, что правило активно:
~]# auditctl -l -w /etc/passwd -p wa -k passwd
Проверим, как правило работает.
~]# useradd testuser
Убедимся, что по нашему правилу сгенерировалось событие.
~]# aureport --summary -k
Посмотрим эти события.
~]# ausearch -i -k passwd
Сформируем отчет
~]# aureport
Все возможные типы регистрируемых событий
~]# ausearch -m
Описание всех типов и полей логов
Аудит в Linux состоит из двух групп компонентов: в пространстве ядра это kauditd, а в пользовательском — auditd
Ядро, принимая системные вызовы из user space, пропускает их через фильтры user, task, filesystem , exclude и exit.
user используется для фильтрации событий
task применяется для системных вызовов fork() и clone().
filesystem используется для исключения событий для конкретной файловой системы.
exclude задает исключения для событий.
exit проходят все системные вызовы.
auditctl - мы можем управлять потоком событий.
ausearch, aureport, aulast просматривем журнал аудита.
Статус работы подсистемы
~]# auditctl -s
Отправьте текстовое сообщение
~]# auditctl -m hello
убедитесь
~]# ausearch -m USER
, что соответствующее событие попало в журнал аудита
Примеры правил находятся /usr/share/audit/sample-rules/.
Примеры типов правил:
Управляющие правила настраивают систему аудита и поведение агента.
Правила файловой системы. Формат правила следующий:
-w path-to-file -p permissions -k keyname
-w указывает на то, что это правило файловой системы.
-p может содержать любые комбинации прав доступа r (чтение), w (запись), x (выполнение) и a (изменение атрибута).
-k задает имя правила.
Правила системных вызовов используются для мониторинга системных вызовов.
-a action,list -S syscall -F field=value -k keyname
-a означает append (добавление) правила в фильтр.
action может быть always (всегда создавать события) или never (никогда не создавать события).
list содержит один из возможных вариантов: task, exit, user, filesystem или exclude.
-S - указывает конкретный syscall (имя или номер); можно в одном правиле указывать сразу несколько syscall, каждый после своего ключа -S.
-F - задает фильтр по полям.
-k - имя правила.
В качестве примера, создадим правило для регистрации изменения файла passwd.
Для начала убедимся, что у нас не применено ни одно правило.
~]# auditctl -l
Если ранее уже были заданы какие‑то правила, то смело удаляем их командой:
~]# auditctl -D
Применим правило:
~]# auditctl -w /etc/passwd -p wa -k passwd
Проверим, что правило активно:
~]# auditctl -l -w /etc/passwd -p wa -k passwd
Проверим, как правило работает.
~]# useradd testuser
Убедимся, что по нашему правилу сгенерировалось событие.
~]# aureport --summary -k
Посмотрим эти события.
~]# ausearch -i -k passwd
Сформируем отчет
~]# aureport
Все возможные типы регистрируемых событий
~]# ausearch -m
Описание всех типов и полей логов
Red Hat Customer Portal
RHEL Audit System Reference - Red Hat Customer Portal
The Audit System Reference provides lists of supported Audit event fields and record types in RHEL 7 and RHEL 8.