Thank you for reading this post, don't forget to subscribe!
Логированием вводимых команд в Linux терминале можно преследовать ряд целей, например отправка такого рода логов на syslog сервер, для аудита, исторической хронологии… Типичная ситуация - на одном сервере работает несколько админов, программеров, просто людей. Все эти люди выполняют различные команды, что-то делают, а потом с удивленным лицом говорят - я этого не делал 🙂
Включение логирования
Логирование вводимых команд можно настроить индивидуально для каждого пользователя в файле ~/.bash_profile или глобально для всех в файле /etc/profile, для этого достаточно поместить в файл настроек профиля скрипт (допустим это файл настроек конкретного пользователя ~/.bash_profile)
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 |
<span class="hljs-comment"># Determine remote user IP</span> IP=$(who am i | awk <span class="hljs-string">'{ print $5 }'</span> | sed <span class="hljs-string">'s/(//g'</span> | sed <span class="hljs-string">'s/)//g'</span>) <span class="hljs-comment"># Put to log logged user notiify</span> logger -p <span class="hljs-built_in">local</span>7.notice -t <span class="hljs-string">"bash <span class="hljs-variable">$LOGNAME</span> $$"</span> User <span class="hljs-variable">$LOGNAME</span> logged from <span class="hljs-variable">$IP</span> <span class="hljs-comment"># Prefix for messages filtering (if messages logged to /var/log/messages)</span> PREF=<span class="hljs-string">"usrlog"</span> <span class="hljs-comment"># Logger</span> <span class="hljs-keyword">function</span> h2<span class="hljs-built_in">log</span> { <span class="hljs-built_in">declare</span> CMD <span class="hljs-built_in">declare</span> _PWD CMD=$(<span class="hljs-built_in">history</span> 1) CMD=$(<span class="hljs-built_in">echo</span> <span class="hljs-variable">$CMD</span> |awk <span class="hljs-string">'{print substr($0,length($1)+2)}'</span>) _PWD=$(<span class="hljs-built_in">pwd</span>) <span class="hljs-keyword">if</span> [ <span class="hljs-string">"<span class="hljs-variable">$CMD</span>"</span> != <span class="hljs-string">"<span class="hljs-variable">$pCMD</span>"</span> ]; <span class="hljs-keyword">then</span> logger -p <span class="hljs-built_in">local</span>7.notice -t bash -i -- <span class="hljs-string">"<span class="hljs-variable">${PREF}</span> : SESSION=$$ : <span class="hljs-variable">${IP}</span> : <span class="hljs-variable">${USER}</span> : <span class="hljs-variable">${_PWD}</span> : <span class="hljs-variable">${CMD}</span>"</span> <span class="hljs-keyword">fi</span> pCMD=<span class="hljs-variable">$CMD</span> } <span class="hljs-built_in">trap</span> h2<span class="hljs-built_in">log</span> DEBUG || EXIT |
Далее необходимо добавить строку с указанием в какой файл сливать логи в настройках rsyslog.conf (ниже регулярка):
1 |
sed -i <span class="hljs-string">'/log\/boot.log/a local7.notice /var/log/users.log'</span> /etc/rsyslog.conf |
Перезапустить rsyslog:
1 |
systemctl restart rsyslog |
Применить параметры профиля к пользователю:
1 |
. ~/.bash_profile |
Отключение логов в messages
Логи будут собираться и в users.log и messages, для отключения дублирования логов в messages достаточно добавить / изменить в rsyslog.conf параметр исключения для local7.notice в найстроках messages (я использую регулярку):
1 |
sed -i <span class="hljs-string">'s/cron.none\b/&;local7.!notice/'</span> /etc/rsyslog.conf |
Ротация логов
Для ротации с годовым интервалом /размером в 100Мб положим файл users в /etc/logrotate.d с параметрами:
1 2 3 4 5 6 7 8 |
/var/<span class="hljs-built_in">log</span>/users.log { yearly rotate 10 size 100M compress missingok } |
Результат
Теперь смотрим как выглядит итоговый результат:
1 2 3 4 |
...User root logged from xxx.xxx.xx.x ...xxx.xxx.xx.x : root : /root : 11/01/19 19:58:38 <span class="hljs-built_in">exit</span> ...xxx.xxx.xx.x : root : /root : 11/01/19 19:59:00 <span class="hljs-built_in">echo</span> <span class="hljs-string">"Hello from Sys-Adm.in"</span> ...xxx.xxx.xx.x : root : /root : 11/01/19 19:59:11 cat /var/<span class="hljs-built_in">log</span>/users.log |