sudo по отпечатку в MacOS

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

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

В общем, нашел способ не вбивать пароль при запуске sudo, а использовать датчик отпечатка пальца. Делюсь.

Надо поправить файл /etc/pam.d/sudo, добавив в него первой строкой:

auth       sufficient     pam_tid.so

Вы не поверите... Это все. ;)

Сброс пароля пользователя 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, который не проверяет целостность данных, то вот тут уже возможна подмена.

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

Установка Qt 5.5 на MacOS

Случилось так, что надо было поставить Qt версии 5.5 на мой MacBook. Проблема в том, что Brew эту версию уже не поддерживает.

В итоге нашел рецепт:

brew update
cd $( brew --prefix )/Homebrew/Library/Taps/homebrew/homebrew-core
git checkout 9ba3d6ef8891e5c15dbdc9333f857b13711d4e97 Formula/qt@5.5.rb
brew install qt@5.5

В результате мы имеем установленный Qt и ошибку при запуске терминала:

Error: qt@5.5: unknown version :mountain_lion

Делаем следующее:

cd $( brew --prefix )/Homebrew/Library/Taps/homebrew/homebrew-core
git checkout 9ba3d6ef8891e5c15dbdc9333f857b13711d4e97 Formula/qt@5.5.rb

И правим файл Formula/qt@5.5.rb, комментируя строку номер 25.

Все. Qt готов, ошибка устранена. :)

Debug упавшего packer'a

Эта заметка скорее просто напоминание, что читать документацию хорошо. :)

Итак, представим ситуацию, что вы собираете AMI для AWS с помощью packer и ваш провижнинг падает с ошибкой. Понять, что произошло, из контекста ошибки вы не можете (например не запустился Nginx, а разворачиваете вы все с Ansible).

Как быть? Можно взять Ansible и натравить его на руками развернутую машину. Но что, если у вас внешних переменных столько, что дурно становится от мысли, что все это надо копировать в запуск Ansible?

Выход есть и он описан в документации:

-on-error=cleanup (default), -on-error=abort, -on-error=ask - Selects what to do when the build fails. cleanup cleans up after the previous steps, deleting temporary files and virtual machines. abort exits without any cleanup, which might require the next build to use -force. ask presents a prompt and waits for you to decide to clean up, abort, or retry the failed step.

Т.е. можно при запуске билда указать -on-error=ask и в случае ошибки packer даст возможность оставить запущенным инстанс, на который можно уже посмотреть и руками, что же там пошло не так.

Разбираемся в работе fork бомбы

Можете ли вы объяснить как работает fork бомба на bash?

:(){ :|:& };:

Fork бомба - один из видов DoS атак (атака на отказ в обслуживании).

:(){ :|:& };: - ни что иное, как простая bash-функция. Она запускается рекурсивно. Ее часто используют системные администраторы для проверки настройки лимита количества процессов для пользователя. Лимиты могут быть настроены в /etc/security/limits.conf и PAM для избежания разрушительных действий fork бомбы.

Как только fork бомба запущена - система перестанет нормально функционировать. Остается только перезагрузить хост, т.к. другого способа убить все процессы, клонирующие себя, просто нет.

ВНИМАНИЕ!!! Следующие примеры могут привести к нежелательным последствиям.

Понимание кода

:() - определяем функцию с именем :. Эта функция не принимает аргументов. Синтаксис функциях в bash такой:

foo(){
 arg1=$1
 arg2=$2
 echo 'Bar..'
 #do_something on $arg argument
}

fork бомбу можно записать так:

:(){
 :|:&
};:

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

& - отправляет работу функции в фон, так что потомки не умирают, а начинают отъедать ресурсы системы.

; - заканчивает определение функции.

: - вызывает (запускает) функцию.

Вот переписанный для более читабельного вида код:

bomb() {
 bomb | bomb &
}; bomb

Правильно сконфигурированная система не должна исчерпывать ресурсы после запуска бомбы.

scenery - улучшаем читабельность вывода terraform

scenery - это утилита, которая парсит и переформатирует вывод Terraform для лучшей читабельности.

Установка

Установку распишу для Mac OS X, т.к. ей пользуюсь последнее время.

$ brew install go
$ echo export PATH="$HOME/go/bin:$PATH" >> ~/.bashrc
$ source ~/.bashrc
$ go get -u github.com/dmlittle/scenery

Все, можно пользоваться.

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

$ terraform plan ... | scenery

Результат примерно такой:

scenery

cTop - мониторинг docker контенеров

cTop - это утилита для мониторинга метрик контейнеров в стиле top.

Она предоставляет метрики как по всем контейнерам сразу:

ctop

так и по одному конкретному:

ctop

Установка

Просто скачайте версию для своей операционной системы.

Linux

sudo wget https://github.com/bcicen/ctop/releases/download/v0.7.1/ctop-0.7.1-linux-amd64 -O /usr/local/bin/ctop
sudo chmod +x /usr/local/bin/ctop

OS X

brew install ctop

или

sudo curl -Lo /usr/local/bin/ctop https://github.com/bcicen/ctop/releases/download/v0.7.1/ctop-0.7.1-darwin-amd64
sudo chmod +x /usr/local/bin/ctop

Docker

docker run --rm -ti \
  --name=ctop \
  -v /var/run/docker.sock:/var/run/docker.sock \
  quay.io/vektorlab/ctop:latest

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

ctop не требует аргументов, просто запустите и используйте.

Документацию по горячим клавишам смотрите в официальной документации.

Minio selfhosted S3 + хранение состояния Terraform

Minio - это selfhosted решение, аналог AWS S3. Поддерживает почти полностью API от S3 и можно его интегрировать для того, чтоб хранить свои файлы, почти не меняя кода, который предназначен для работы с Amazon.

Поднимается он с помощью docker-compose буквально с считанные минуты.

Кусок для docker-compose.yml:

  minio:
    image: minio/minio
    hostname: minio
    container_name: minio
    command: server /data
    volumes:
      - /opt/minio:/data
    ports:
      - 9000:9000

Запускаем docker-compose up -d и идем на http://localhost:9000.

Если все прошло хорошо, то мы увидим web-интерфейс с запросом логина и пароля. Эта пара будет сгенерирована автоматически и взять ее можно в конфиге в каталоге /opt/minio. Эта же пара и будет ключами для awscli или terraform.

Теперь сделаем конфиг провайдера и бекэнда terraform, чтоб он зранил свое состояние в minio:

terraform {
  backend "s3" {
    bucket = "terraform-state"
    key    = "dev/terraform.tfstate"
    region = "us-east-1"
    access_key = "AWSKEY"
    secret_key = "AWSSECRET"
    endpoint = "http://localhost:9000"
    skip_credentials_validation = true
    force_path_style = true
  }
}

Ну вот и все. Пробуйте применять план. Все должно получиться.

Docker, CentOS7 - нет доступа к хосту

Начался новый год и пока все доедают салаты, решил я подобрать хвосты с постами в бложик.

Столкнулся с ситуацией, когда docker контейнер пингует хостовую машину нормально, а вот соединение не проходит с ошибкой "No route to host".

Долго я мучался, по не нашел решение в странном месте (странном для меня, т.к. я предпочитаю Ubuntu и там таких проблем нет).

В общем, надо в /etc/firewalld/zones/public.xml добавить такое правило:

<rule family="ipv4">
    <source address="172.18.0.0/16"/>
    <accept/>
</rule>

Диапазон подсети поправьте под себя или добавьте несколько, по необходимости.

Далее рестартуем firewalld и все начинает работать.

systemctl restart firewalld