Два варианта:
Локальное ведение журнала (но учетная запись root может так или иначе стереть файлы)
Вы можете использовать chattr + a
в каталоге, чтобы добавить его только . Но, к сожалению, этот атрибут не наследуется для новых файлов и каталогов ( Каков эффект «chattr + a» на каталог ).
chattr -R +a /var/log/sudo-io
Затем вы можете использовать инструмент, который использует функцию inotify ядра, чтобы установить атрибуты только добавить для новых файлов и каталогов (см .: Автоматически устанавливать атрибут добавления для вновь созданных файлов / папок? ). (здесь, вероятно, есть временная атака)
SELinux, безусловно, может помочь ограничить здесь привилегированную учетную запись! ( staff_u
и sysadm_u
не могут получить доступ к журналам)
Удаленное ведение журнала
К сожалению, структура и формат файлов журналов затрудняют пересылку с использованием syslog (5 файлов за сеанс):
/var/log/sudo-io
/var/log/sudo-io/seq
/var/log/sudo-io/00
/var/log/sudo-io/00/00
/var/log/sudo-io/00/00/02
/var/log/sudo-io/00/00/02/stdout
/var/log/sudo-io/00/00/02/log
/var/log/sudo-io/00/00/02/timing
/var/log/sudo-io/00/00/02/stderr
/var/log/sudo-io/00/00/02/ttyout
/var/log/sudo-io/00/00/01
/var/log/sudo-io/00/00/01/stdin
/var/log/sudo-io/00/00/01/stdout
/var/log/sudo-io/00/00/01/log
/var/log/sudo-io/00/00/01/timing
/var/log/sudo-io/00/00/01/ttyin
/var/log/sudo-io/00/00/01/stderr
/var/log/sudo-io/00/00/01/ttyout
Было бы легко записать файлы журнала на удаленный сервер, установив
каталог, указанный sudo iolog_dir
, на удаленный сервер с помощью NFS / CIFS. Для экспортированного каталога NFS потребуется chattr +
, как указано выше.
Очевидно, что этот сервер должен быть более безопасным, чтобы пользователь не мог подключиться к этому серверу и стереть там файлы :-).
Обратите внимание, что sudo откажется запускать , если не сможет создать файлы журнала: sudo: невозможно открыть / var / log / sudo-io / seq: В доступе отказано
{2,}
является квантификатором, в этом случае он будет соответствовать от 2 до максимально возможного количества экземпляров букв в списке между []
.
\.\-
будет соответствовать ' -' или '.'. Эти два символа часто являются специальными, и их часто нужно экранировать с помощью \
. Но внутри группы []
точка не особенная, поэтому \
в этом случае не нужна. Кроме того, -
является индикатором диапазона и не является особенным, если он первый или последний в группе.
Итак, в конце концов вы могли бы использовать:
[,a-zA-Z0-9.-]{2,}
Вот что означает ваше регулярное выражение, слева направо:
[
начало набора символов (или класса символов ). Соответствует одному символу из набора.
a-z,A-Z,0-9
внутри набора символов означает соответствие любому одному символу a-z
, A-Z
или 0-9
. Запятые на самом деле здесь необязательны, если только вы не пытаетесь буквально сопоставить запятую.
\.\-
.
— это специальный символ, который соответствует любому символу, но внутри набора символов он не имеет особого значения, и его не нужно экранировать. Здесь -
не нужно экранировать, если это первый или последний символ в наборе, он соответствует литералу -
, он приобретает особое значение только тогда, когда находится между двумя другими символами в наборе.
]
конец набора символов. Набор соответствует любому одному символу a-z
, или A-Z
, или 0-9
, или .
, или -
.
{2,}
является квантификатором. Это означает, что предыдущее регулярное выражение должно совпасть 2 или более раз.
Так что команду можно сократить до этой:
grep -E "[a-zA-Z0-9.-]{2,}" /etc/hostname
При использовании с флагом -P
grep интерпретирует шаблон как регулярное выражение Perl. Регулярные выражения Perl почти идентичны регулярным выражениям Python. На мой взгляд, это более мощный режим, чем -E
. В режиме Perl ваша команда становится:
grep -P "[a-zA-Z\d.-]{2,}" /etc/hostname
Чтобы понять, разбей на части:
группа
Выполняется ли команда, прочтите man grep
для получения подробной информации.
-Э
Вызывает расширенный параметр регулярного выражения grep (, эквивалентный более старомуegrep
)
"
Рекомендуется заключать в кавычки, чтобы избежать расширений/интерпретаций оболочкой.
[
Введите "выражение скобок" POSIX (, оканчивающееся следующим]
)
A bracket expression (an expression enclosed in square brackets, "[]" ) is an RE that shall match a specific set of single characters.
a -z,A -Z,0 -9.-
Набор одиночных символов для соответствия любому из этого списка:
abcdefghijklmnopqrstuvwxyz,ABCDEFGHIJKLMNOPQRSTUVWXYZ,0123456789.-
\
явно указан в этом списке, он будет сопоставлен. Любой повторяющийся символ действует так, как если бы в списке был только один, поэтому два ,
можно заменить одним ,
. Я считаю, что \
был дан по ошибке. Пользователь может полагать, что (точка).
нуждается в экранировании (, как это обычно делается в регулярном выражении, но не внутри "выражения в квадратных скобках". Это описание диапазона (при условии, что обратная косая черта не предназначена для сопоставления ), может быть сокращено до (сохранить (тире)-
в качестве последнего (или первого )символа):
[a-zA-Z0-9.,-]
Или (эквивалентно):
[[:alnum:].,-]
{
Ввести "интервальное выражение" (заканчивается следующим}
):
… an interval expression of the format "{m}", "{m,}", or "{m,n}", … it shall match … repeated consecutive occurrences …
Таким образом, {2,}
будет соответствовать количеству :от 2 до любого или :двух или более предыдущих элементов.
/etc/имя хоста
Внутри файла /etc/hostname
.