Заметки в категории 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 и проверяем, что лог у нас пишется. Для этого нужно перезайти на сервер и выполнить несколько команд. Все они должны появиться в логе.

Передвигаемся в консоли без стрелок

Сегодня совсем небольшая заметка...

В MacOS меня жутко раздражжает, что нельзя прыгать по словам в консоли (да, я в курсе, что можно это настроить сторонним софтом).

А вот век живи и век учись... Таки можно, и вот как:

Moving in cli

Как переехать в Amazon

Предпосылки

До переезда мы арендовали несколько bare metall серверов в SoftLayer.

На всех из них крутились KVM виртуалки, была своя выделенная подсеть (даже не так, несколько подсетей). Поддерживать все это было то еще удовольствие.

Немного спасал OpsCode Chef, но не сильно. Т.к. три ветки в git, которые сливать в кучку не всегда нормально удавалось из-за шифрования критичных вещей.

Не спрашивайте почему так. Это историческое наследие и выкорчевать его было не так просто.

Последней каплей стало то, что у нас как-то пошла небольшая нагрузка и на двух физических серверах тупо не хватило памяти, чтоб добавить ее в виртуалки. Пришлось ждать два дня, пока поддержка SoftLayer'a добавит нам планки.

В этот момент было принято волевое решение - хватит это терпеть. Пора отказываться от такой схемы работы.

Подготовка инфраструктуры

Было понятно, что переезжать куда-то, кроме облаков, нет смысла. Только там есть та самая динамика, которая нас сможет удовлетворить.

Выбор не велик - DigitalOcean и Amazon AWS. Поскольку DO не предоставляет HIPAA и HiTrust, то выбор стал очевиден сразу.


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

Jenkins + LDAPS + самоподписные сертификаты

Проблема

При попытке сконфигурировать Jenkins для подключения к LDAP серверу с использованием шифрования данных получаем ошибку:

Unable to connect to ldaps://ldap.example.com:636 : javax.naming.CommunicationException: anonymous bind failed: ldap.example.com:636 [Root exception is javax.net.ssl.SSLHandshakeException: sun.security.validator.ValidatorException: PKIX path building failed: sun.security.provider.certpath.SunCertPathBuilderException: unable to find valid certification path to requested target]

javax.naming.CommunicationException: anonymous bind failed: ldap.example.com:636 [Root exception is javax.net.ssl.SSLHandshakeException: sun.security.validator.ValidatorException: PKIX path building failed: sun.security.provider.certpath.SunCertPathBuilderException: unable to find valid certification path to requested target]
    at com.sun.jndi.ldap.LdapClient.authenticate(LdapClient.java:198)
    at com.sun.jndi.ldap.LdapCtx.connect(LdapCtx.java:2788)
    at com.sun.jndi.ldap.LdapCtx.<init>(LdapCtx.java:319)
    at com.sun.jndi.ldap.LdapCtxFactory.getUsingURL(LdapCtxFactory.java:192)
    at com.sun.jndi.ldap.LdapCtxFactory.getUsingURLs(LdapCtxFactory.java:210)
    at com.sun.jndi.ldap.LdapCtxFactory.getLdapCtxInstance(LdapCtxFactory.java:153)
    at com.sun.jndi.ldap.LdapCtxFactory.getInitialContext(LdapCtxFactory.java:83)

Она говорит нам, что Java не осилила TLS (SSL) из-за того, что у нас самоподписной сертификат.

Лечение

Заходим на сервер с Jenkins (если у вас он в доккере, то делайте все, что описано ниже внутри доккер контейнера).
Читать далее...

Видеонаблюдение дома

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

Для начала я порылся в закромах и нашел Noname Chinese IP Camera, которая умеет слать поток куда-то в Китай, а значит его можно попробовать поймать.

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

$ sudo nmap -A 192.168.1.156

Ответ впечатляет разнообразностью:
Читать далее...

Мультитач в Ubuntu

Давно хотел нормальные жесты в Ubuntu и все никак не получалось найти способ, чтоб это заработало. Удобно же сделаны рабочие места в той же MacOS.

И вот сегодня нашел проект, который позволяет это все сделать абсолютно безболезненно.

Заводится с полпинка.

У товарища не захотело переключать рабочие столы с ходу. Решилось заменой в конфиге на xdotool. Примеры есть в самом конфиге. Пользуйтесь на здоровье. ;)

30+ Linux команд, которые необходимо знать

30+ простых команд, которые помогут работать в консоли:

  • ls - list, выводит список файлов в каталоге
  • mkdir - make dir, создать каталог
  • pwd - print working dir, показать текущий каталог
  • cd - change dir, сменить каталог
  • rmdir - remove dir, удалить каталог
  • rm - remove, удалить файл/каталог
  • cp - copy, копирование файлов/каталогов
  • mv - move, переместить файл/каталог
  • cat - concatenate/print, объеденить или вывести содержимое файла
  • tail - вывести конец файла
  • less - вывести содержимое файла
  • grep - фильтровать содержимое файла
  • find - поиск файлов
  • tar, gzip, unzip - архивирование/разархивирование файлов/каталогов
  • help - краткая справка
  • whatis - однострочное описание команды
  • man - manual, подробная справка о команде
  • exit - закрытие текущей сессии терминала
  • ping - проверка доступности удаленного хоста
  • who - кто использует текущий компьютер
  • su - switch user, переключить пользователя
  • uname - информация о текущем компьтере
  • free - показать объем свободной памяти
  • df, du - показать статистику использования диска
  • ps - processes, показать выполняемые процессы
  • top - статистика выполняемых процессов
  • shutdown, halt - выключить/перезагрузить компьютер

Настройка DKIM подписи в Amavisd

Если вы пришли сюда, то вероятно уже знаете, что такое DKIM и зачем оно нужно. Если же нет, то вам сюда.

Amavisd умеет сам подписывать письма без сторонней помощи и настривается он весьма просто:

Создаем ключ для домена:

mkdir /etc/amavis/keys/
amavisd-new genrsa /etc/amavis/keys/example.com.key;

Конфигурируем Amavisd:

Создадим файл /etc/amavis/conf.d/55-dkim с содержимым:

$enable_dkim_signing = 1;
dkim_key('example.com', 'mail', '/etc/amavis/keys/example.com.key');

@dkim_signature_options_bysender_maps = ({ '.' => { ttl => 21*24*3600, c => 'relaxed/simple' } } );

@mynetworks = qw(0.0.0.0/8 127.0.0.0/8 10.0.0.0/8 172.16.0.0/12 192.168.0.0/16);  # list your internal networks

1;

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

Gnome3 и suspend при закрытии крышки ноутбука

В связи с новостями о прекращении разработки Unity8 решил посмотреть на альтернативные рабочие окружения. Раньше весьма не плох был Gnome, на него и решил посмотреть в первую очередь. Заодно и систему с нуля переставить, т.к. очень уж засорил я свой ноут.

Установка прошла как по маслу и все вроде бы шло не плохо, пока я не закрыл крышку ноута и не оказалось, что ноутбук не переходит в состояние сна. Просто продолжал работать как и раньше. Открываешь - вот оно все. Даже пароль не просит.

Это не дело и жить с этим нельзя. Копнул поглубже и вот вам решение проблемы, если вы столкнулись с таким же.

В файл /etc/acpi/events/lidbtn пишем эти строки:

# /etc/acpi/events/lidbtn

event=button[ /]lid
action=/etc/acpi/lid.sh

Теперь сам скрипт, который будет блокировать рабочий стол и отправлять машинку в suspend - /etc/acpi/lid.sh:

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
#!/bin/bash

RUNTIME=`grep -l DISPLAY /run/systemd/users/* | xargs grep RUNTIME | awk -F= '{print $2}'`
USERNAME=`grep -l DISPLAY /run/systemd/users/* | xargs grep NAME | awk -F= '{print $2}'`
DISPLAY=`grep -l DISPLAY /run/systemd/users/* | xargs grep DISPLAY | awk -F= '{print $2}'`

export XAUTHORITY=${RUNTIME}/gdm/Xauthority
export DISPLAY=:${DISPLAY}
export `cat ${RUNTIME}/dbus-session`

grep -q closed /proc/acpi/button/lid/*/state

if [ $? == 0 ]; then
  su ${USERNAME} -c 'gnome-screensaver-command -l'
  /usr/sbin/pm-suspend >> /tmp/lid.log
fi

Не забудьте поставить пакет с утилитами:

apt install pm-utils

Перезагружаем acpid и проверяем:

/etc/init.d/acpid restart