Посты по тегу: Linux

Отправляем логи в CloudWatch

Задача

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

Итак, будем отправлять логи в сервис AWS CloudWatch.

Amazon CloudWatch можно использовать для сбора и отслеживания метрик, накопления и анализа файлов журналов, создания предупреждений, а также автоматического реагирования на изменения ресурсов AWS. Amazon CloudWatch может использоваться для мониторинга следующих ресурсов AWS: инстансов Amazon EC2, таблиц Amazon DynamoDB, инстансов Amazon RDS DB, а также для мониторинга пользовательских метрик приложений и сервисов и любых логов ваших приложений.

Реализация

Устанавливаем агента для сбора логов:

$ curl https://s3.amazonaws.com//aws-cloudwatch/downloads/latest/awslogs-agent-setup.py -O
$ python ./awslogs-agent-setup.py

Отвечаем на все вопросы скрипта и идем править конфиг /etc/awslogs/awslogs.conf. В конце этого файла есть секции, отвечающие за сборку конкретных логов. Их может быть столько, сколько лог-файлов надо собирать и отправлять в CloudWatch.

Пример:

[/var/log/commands.log]
datetime_format = %Y-%m-%d %H:%M:%S
file = /var/log/commands.log
buffer_duration = 100
log_stream_name = {hostname}
initial_position = start_of_file
log_group_name = all_commands

Более детальное описание формата файла смотрите в документации.

Остается перезапустить демона:

$ sudo service awslogs restart

Логгируем все команды на сервере

Иногда надо из соображений безопасности логировать все дейстия пользователей на сервере.

Очень полезно для того, чтоб потом исследовать кто и что делал и как получилось, что у нас что-то упало. Ну или это могут быть требования сертификации, например.

Итак, что нам надо сделать для полного логгирования действий:

Логгер в окружении пользователя

Добавляем следующую строку в файл /etc/bash.bashrc:

export PROMPT_COMMAND='RETRN_VAL=$?;logger -p local6.debug "$(whoami) [$$]: $(history 1 | sed "s/^[ ]*[0-9]\+[ ]*//" ) [$RETRN_VAL]"'

Таким образом вся история пользователя будет попадать в rsyslog с уровнем local6.

Отдельный файл для лога команд

Создаем файл /etc/rsyslog.d/bash.conf с содержимым:

local6.*    /var/log/commands.log

Рестартуем rsyslog и проверяем, что лог у нас пишется. Для этого нужно перезайти на сервер и выполнить несколько команд. Все они должны появиться в логе.

Как правильно удалить пользователя MySQL/MariaDB

ВНИМАНИЕ: Сделайте резервную копию ваших данных перед запуском команд из этой инструкции!

Шаг 1 - Подключение к серверу MySQL/MariaDB

Если у вас есть необходимость удалить какой-либо продукт типа WordPress или Drupal, то вы должны удалить пользователя из базы данных. Вам нужно удалить все выданные ранее права/разрешения и только после этого удалять пользователя.

Для начала вам необходимо подключиться к базе данных:

$ mysql -u root -p mysql

или

$ mysql -u root -h db.example.com -p mysql

Шаг 2 — список всех пользователей

Для того чтоб увидеть разрешения для пользователя bloguser введите:

mariadb> SHOW GRANTS FOR 'bloguser'@'localhost';

Где:

  • bloguser — имя пользователя MySQL/MariaDB
  • localhost — имя хоста, с которого разрешено подключаться этому пользователю
  • mywpblog — имя базы данных

Шаг 3 - отзыв всех разрешений

Введите следующую sql команду:

mariadb> REVOKE ALL PRIVILEGES, GRANT OPTION FROM 'bloguser'@'localhost';

Пример вывода:

Query OK, 0 rows affected (0.00 sec)

Шаг 4 - Удаление пользователя

Введите следующую команду:

mariadb> DROP USER 'bloguser'@'localhost';

Пример вывода:

Query OK, 0 rows affected (0.00 sec)

Шаг 5 - удаление базы данных

Введите следующую команду:

mariadb> DROP DATABASE mywpblog;

Пример вывода:

Query OK, 0 rows affected (0.00 sec)

На этом все. :) Вы удалили пользователя базы данных.

Ошибка ttf-mscorefonts-installer

Последнее время достает ошибка ttf-mscorefonts-installer.

Решение проблемы:

sudo dpkg -P ttf-mscorefonts-installer  
wget http://ftp.de.debian.org/debian/pool/contrib/m/msttcorefonts/ttf-mscorefonts-installer_3.6_all.deb
sudo dpkg -i ttf-mscorefonts-installer_3.6_all.deb
sudo fc-cache -fv
fc-cache ~/.fonts

Консольные полезности 7

й, где была использована вспышка. Требуется ImageMagick

identify -format "%f F:%[EXIF:Flash]\n" *.jpg | egrep " F:(0|16|24|32)$"

Показать в файле символы табуляции

cat -T example.txt

Показать процессы httpd исключив сам grep

ps auxww | grep "[h]ttpd"

Список 20 самых больших по объему файлов/каталогов в текущем каталоге

du -ma | sort -nr | head -n 20

Удалить все письма из очереди Postfix за 11 декабря

mailq | awk '/^[0-9A-F]+ .+ Dec 11 /{print $1}' | xargs -n 1 postsuper -d

Сканировать внутренню сеть на хочты с открытым 22 портом

nmap --open -p T:22 192.168.1.0/24

Автоматически установить публичный ключ на удаленный хост

ssh-copy-id 'user@remotehost'

Использование -w в diif позволит игнорировать разницу в табах и пробелах

diff -w index.html bookexample/index.html

Поиск по файловой системе без спуска в /sys и /proc

find / \( -path /proc -o -path /sys \) -prune -o -print

Консольные полезности 6

Переименовать файл короткой командой:

mv foo.{old,new}

Показать количество НЕуспешных запросов (не 2хх, 3хх HTTP коды ответа)

awk '$9!~/^[23]/{print $4}' access_log | cut -c1-12 | uniq -c

Создать каталог и сразу перейти в него

mkdir dir && cd $_

Запустить скрипт из крона только если он еще не работает

*/3 * * * * if [[ -z $(pgrep offlineimap) ]]; then offlineimap -u quiet; fi

Проверить как давно работает процесс

ps -p PID -o pid,cmd,etime

scp не несколько удаленных хостов

parallel -j0 scp file.txt {}:/dstDir ::: user@srv1 user@srv2

Вывод dmesg в режиме реального времени и в "человеческом" виде (цвет, даты и т.п.)

dmesg -wH

Ого файла

sed '9417q;d' dbdump.sql

Текущее время в UTC:

date -u

Отцензурировать все email в report.txt

sed -r -i 's/\b[A-Za-z0-9._%+-]+@[A-Za-z0-9.-]+\.[a-z]{2,30}\b/xxx@yyy.zzz/' report.txt

wc имеет опции для подсчета символов, слов или строк:

wc -c
wc -w
wc -l

Объединить несколько pdf в один для печати

convert 1.pdf 2.pdf 3.pdf all.pdf

Суммировать числа из третьего столбца файла data.txt

awk '{s+=$3} END {print s}' data.txt

Вывести самую длинную строку из файла

awk 'length > max { max=length;maxline=$0 } END { print maxline; }' quotes.txt

Отсортировать вывод df, оставив заголовок вверху

df -hP | awk 'NR==1;NR>1{print|"sort -k5rn"}'

Разделить файл на несколько по 50 строк

split --lines=50 foo.txt

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

dmidecode -t 17 
lshw -short -C memory

Свой NTP сервер в локальной сети

NTP (англ. Network Time Protocol — протокол сетевого времени) — сетевой протокол для синхронизации внутренних часов компьютера с использованием сетей с переменной латентностью.

NTP использует для своей работы протокол UDP и учитывает время передачи. Система NTP чрезвычайно устойчива к изменениям латентности среды передачи. В версии 4 способен достигать точности 10 мс (1/100 с) при работе через Интернет, и до 0,2 мс (1/5000 с) и лучше внутри локальных сетей.

Наиболее широкое применение протокол NTP находит для синхронизации серверов точного времени.

Установка на Ubuntu

sudo apt update
sudo apt install ntp

Настройка сервера

sudo mv /etc/ntp.conf{,.bak}
sudo nano /etc/ntp.conf

Добавляем в конфиг эти строки:

server 0.ru.pool.ntp.org iburst prefer
server 1.ru.pool.ntp.org iburst
server 2.ru.pool.ntp.org iburst
server 3.ru.pool.ntp.org iburst

disable monitor

driftfile /var/db/ntpd.drift
logfile /var/log/ntpd.log

restrict 127.0.0.1

restrict 0.ru.pool.ntp.org noquery notrap
restrict 1.ru.pool.ntp.org noquery notrap
restrict 2.ru.pool.ntp.org noquery notrap
restrict 3.ru.pool.ntp.org noquery notrap

restrict 192.168.0.0 mask 255.255.255.0 nomodify notrap nopeer

Перезапускаем сервер:

sudo /etc/init.d/ntp restart

Проверяем пиры:

ntpq -c peers

Знак «+» перед пиром означает, что время было синхронизировано с этим пиром.

Теперь можно настроить свой маршрутизатор на выдачу клиентам нашего NTP сервера для синхронизации времени с ним.

lftp: зеркалируем локальные и удаленные каталоги

lftp — программа для передачи файлов в сложных условиях ftp, http и других соединений. lftp имеет встроенную поддержку зеркалирования всего дерева каталогов. Она так же может зеркалировать в обратном режиме, т.е. сделать зеркало локального каталога на сервере, загрузив все файлы. Еще одна интересная возможность: зеркалирование двух удаленных серверов по протоколу FXP, если он доступен на серверах.

Синтаксис

mirror
mirror options
mirror -c
mirror -R

Пример: Как сделать зеркало удаленного каталога (скачать файлы)

Для начала необходимо подключиться к удаленному серверу:

lftp ftp.example.com

Введите имя пользователя и пароль:

lftp ftp.example.com:~> user user@example.com

Пример вывода:

Password:
lftp user@example.com@ftp.example.com:~>

Введите ls, чтоб увидеть список файлов:

lftp ftp.example.com:~> ls

Пример вывода:

-rw-r--r--    1 80       www      36809419 Jun 24 23:59 2012-06-24.log.gz
-rw-r--r--    1 80       www      100912271 Jun 25 23:59 2012-06-25.log.gz
-rw-r--r--    1 80       www      102926055 Jun 26 23:59 2012-06-26.log.gz

Для зеркалирования всех файлов в текущий каталог введите:

lftp ftp.example.com:~> mirror

С командой mirror вы можете указать исходный каталог и каталог назначения. Если каталог назначения будет оканчиваться на слеш («/»), то имя исходного каталога будет добавлено к каталогу назначения.

lftp ftp.example.com:~> mirror source destination

или

lftp ftp.example.com:~> mirror logs/ /data/logs

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

lftp ftp.example.com:~> mirror -c source destination

или

lftp ftp.example.com:~> mirror --continue

Чтоб скачать только новые файлы (не работает с -c):

lftp ftp.example.com:~> mirror -n

или

lftp ftp.example.com:~> mirror --only-newer

Вы можете ускорить загрузку файлов используя опцию параллельной загрузки:

lftp ftp.example.com:~> mirror -p

Чтоб указать количество потоков, введите:

lftp ftp.example.com:~> mirror --parallel=10

Пример: как сделать обратное зеркалирование (загрузка файлов)

Для создание обратного зеркала каталога вам необходимо передать опцию -R или —reverse команде mirror. Для начала вам необходимо подключиться к серверу, как было показано в предыдущем примере.

Сменить локальный каталог:

lftp ftp.example.com:~> lcd /home/silver/project/lftp

Пример вывода:

lcd ok, local cwd=/home/silver/project/lftp

Для загрузки дерева файлов и каталогов на сервер:

lftp ftp.example.com:~> mirror -R

или укажите локальный и удаленный каталоги:

lftp ftp.example.com:~> mirror -R /home/silver/project/lftp /var/www/html

Для выхода из FTP сессии:

lftp ftp.example.com:~> quit

Cron: How To

Введение

Cron - это системный демон, который используется для запуска периодических задач в фоновом режиме.

Файл crontab - простой текстовый файл со списком команд, которые должны быть выполнены в указанное время.

Каждый пользователь в системе имеет свой crontab файл, включая root. Все пользовательские файлы проверяются cron'ом вне зависимости от того, залогинен пользователь в системе или нет.

Для вывода справки по crontab введите:

man crontab

Использование Cron

Для настройки cron для вашего пользователя введите:

crontab -e

Отредактируйте файл и сохраните его для применения изменений запуска фоновых задач. Не забываенем/датой не могут содержать пробелы и содержат в себе минуты (0-59), часы (0-23, 0 - полночь), дни (1-31), месяцы (1-12), дни недели (0-6, 0 - воскресенье).

01 04 1 1 1 /usr/bin/somedirectory/somecommand

В примере выше будет выполнена команда /usr/bin/somedirectory/somecommand в 4 часа 1 минуту 1 января плюс каждый понедельник в январе.

Разделенные запятыми значения можно использовать для указания нескольких значений. Так же можно использовать дефис "-" в значениях для указания периодов.

01,31 04,05 1-15 1,6 * /usr/bin/somedirectory/somecommand

В этом случае команда будет выполнена в 01 и 31 минуты 4 и 5 часов утра с 1 по 15 января и июня.

Рекомендуется указывать полный путь к команде для запуска, как указано в примерах выше.

Иногда есть необходимость запускать команды через определенные промежутки времени. Следующий пример будет запускать команду раз в 10 минут (0, 10, 20, 30, 40 и 50 минут каждого часа):

*/10 * * * * /usr/bin/somedirectory/somecommand

Эта запись абсолютно эквивалентна:

0,10,20,30,40,50 * * * * /usr/bin/somedirectory/somecommand

Так же crontab поддерживает некоторые специальные строки, которые могут быть использованы вместо указания времени/даты:

строка что имеется ввиду
@reboot Единожды, при загрузке
@yearly Один раз в год, "0 0 1 1 *"
@annually Так же, как и @yearly
@monthly Один раз в месяц, "0 0 1 * *"
@weekly Один раз в неделю, "0 0 * * 0"
@daily Один раз в день, "0 0 * * *"
@midnight Так же, как и @daily
@hourly Один раз в час, "0 * * * *"
@reboot /path/to/execuable1

Пример выше запустит команду при старте системы.

Опции crontab

  • -l - выведет список заданий
  • -r - удалит все задания из crontab
  • -e - редактировать crontab с помощью редактора, указанного в переменной окружения EDITOR

После сохранения и выхода crontab проверит корректность файла и, если ошибок не будет обнаружено, применит изменения.

Два других способа конфигурации crontab

До этого мы говорили о пользовательских crontab файлах. В системе есть еще два способа конфигурации crontab.

ВременнЫе каталоги /etc/cron.{hourly,daily,weekly,monthly} используются для запуска скриптов. В них можно создать скрипты, которые будут выполнены один раз в час, день, неделю или месяц соответственно.

Так же есть общесистемный файл /etc/crontab, который имеет немного другой синтаксис:

00 01 * * * rusty /home/rusty/rusty-list-files.sh

В данном примере после времени/даты идет имя пользователя, с правами которого будет выполнен скрипт /home/rusty/rusty-list-files.sh

Такой же синтаксис может быть использован в crontab файлах в каталоге /etc/cron.d. В отличие от временнЫх каталогов, в это каталог складываются не скрипты для запуска, а crontab файлы с синтаксисом, показанным выше.

Переменные окружения

В crontab файле можно указывать переменные окружения. Это делают в самом начале файла:

SHELL=/bin/bash
PATH=~/bin:$PATH

Иногда надо чтоб результат работы скрипта cron отправлял на почту. Обычно он отправляет письмо тому пользователю, чей crontab файл используется. Адрес доставки письма можно переопределить с помощью переменной MAILTO:

MAILTO='user@example.com'

Консольные полезности 5

Пинг с префиксом в виде времени:

$ stdbuf -i0 -o0 ping 192.168.42.1 | while read l; do echo "[$(date '+%H:%M:%S')] $l"; done

В bash, выполнить предыдущю команду с заменой foo на bar:

$ ^foo^bar

Показать процессы по потреблению питания (полезно для ноутбуков):

$ sudo powertop

Не очищать экран при выходе из less:

alias less='less -FX'

Принудительная проверка диска после перезагрузки:

Читать далее...