Заметки в категории Linux

Сброс пароля пользователя root в MySQL

Сбросить пароль для пользователя root в MySQL не просто, а очень просто. Для этого надо остановить базу:

$ sudo service mysql stop

Теперь запустим базу без проверки привилегий:

$ sudo mysqld_safe --skip-grant-tables &

Теперь можно зайти в базу и поправить пароль:

$ mysql -u root

После этого будет доступна консоль MySQL. Выполняем обновление пароля:

mysql> SET PASSWORD FOR root@'localhost' = PASSWORD('password');

Иногда установка нового пароля заканчивается ошибкой:

ERROR 1290 (HY000): The MySQL server is running with the --skip-grant-tables option so it cannot execute this statement

Это ошибка в MySQL и тогда пароль можно установить другой командой:

mysql> UPDATE mysql.user SET authentication_string=password('password') WHERE user='root';

Дальше сбрасываем привилегии и перезапускаем сервер в нормальном режиме:

mysql> FLUSH PRIVILEGES;
mysql> exit;
$ sudo mysqladmin -u root -p shutdown
$ sudo service mysql start

Теперь можно логиниться в базу обычным образом:

$ mysql -u root -p

Настройка DNSSEC в Bind 9.9+

DNSSEC (англ. Domain Name System Security Extensions) — набор расширений IETF протокола DNS, позволяющих минимизировать атаки, связанные с подменой DNS-адреса при разрешении доменных имён. Он направлен на предоставление DNS-клиентам (англ. термин resolver) аутентичных ответов на DNS-запросы (или аутентичную информацию о факте отсутствия данных) и обеспечение их целостности. При этом используется криптография с открытым ключом. Не обеспечивается доступность данных и конфиденциальность запросов. Обеспечение безопасности DNS критически важно для интернет-безопасности в целом.

Правда ведь, что мы хотим быть уверенными, что наш DNS никто не подменит (на самом деле не факт)?

Давайте разберемся как нам сделать свой DNS сервер немного более надежным. Это не гарантирует полной безопасности. Но в общем случае - будет полезно.

Фокус в том, что тот же 8.8.8.8 проверяет DNSSEC и перестает резолвить домены, если цифровая подпись нарушена. Не очень знаю на счет 1.1.1.1, но мне кажется, что он ведет себя так же. А вот если клиент использует провайдерский DNS, который не проверяет целостность данных, то вот тут уже возможна подмена.

В общем, решайте, надо оно вам или нет... А я расскажу, как это реализовать.
Читать далее...

Как проверить версию TLS

Заметка на память...

Как проверить поддерживает ли OpenSSL вашего сервера конкретную версию TLS:

echo | openssl s_client -connect google.com:443 -tls1_2 2>&1 | grep Protocol

Опция -tls1_2 отвечает как раз за то, какую версию протокола проверяем.

Вывод должен быть что-то типа:

    Protocol  : TLSv1.2

Timemachine в Docker контейнере

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

Поднялось и все заработало как часы. Вот кусок конфига для docker-compose:

  timemachine:
    image: odarriba/timemachine
    restart: always
    container_name: timemachine
    ports:
      - 548:548
      - 636:636
    volumes:
      - /mnt/Data/timemachine:/timemachine

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

docker exec -ti timemachine add-account USERNAME PASSWORD timemachine /timemachine

USERNAME и PASSWORD поменяйте по своему усмотрению.

Теперь можно использовать этот диск, для этого идем в Finder, нажимаем Cmd+K и вводим протокол и адрес сервера (что-то типа afp://172.20.0.2), вводим логин и пароль созданного аккаунта. Теперь можно настраивать TimeMachine для создания резервных копий на этот диск.

Отправляем логи в 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

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