Заметки в категории «Система» (страница 6)

Блокируем brute force атаки по SSH

Для решения этой задачи я использую скрипт denyhosts . Он периодически проверят указанный лог-файл на предмет записей о неудавшихся подключениях, и заносит IP-адреса в файл hosts.deny. Дальше ssh-демон при очередном подключении ищет IP-адрес в «черном» списке и разрывает связь, если он там есть.

Установка denyhosts

Начальная установка denyhosts очень проста. Распаковываем исходники и запускаем скрипт установки под root.

sudo python setup.py install

По умолчанию установка будет осуществлена в папку /usr/share/denyhosts. Там же будут пример конфигурационного файла. Копируем его.

cp denyhosts.cfg-dist denyhosts.cfg

Отредактируем denyhosts.cfg


SECURE_LOG = /private/var/log/secure.log
HOSTS_DENY = /etc/hosts.deny
LOCK_FILE = /var/run/denyhosts.pid
DAEMON_LOG = /var/log/denyhosts

Остальные параметры можете задать по своему усмотрению.

Теперь нужно скопировать и отредактировать управляющий скрипт


cp daemon-control-dist daemon-control

Переменные должны быть установлены следующие значения


DENYHOSTS_BIN = "/usr/local/bin/denyhosts.py"
DENYHOSTS_LOCK = "/var/run/denyhosts.pid"
DENYHOSTS_CFG = "/usr/share/denyhosts/denyhosts.cfg"

Удостоверимся, что этот управляющий скрипт запускается.

chown root daemon-control
chmod 700 daemon-control

До запуска denyhosts нужно создать /etc/hosts.deny

touch /etc/hosts.deny

В целом все готово для запуска denyhosts.

daemon-control start

Если до этого вас уже недавно атаковали, то адреса злоумышленников будут тут же собраны и добавлены в hosts.deny.

Остановить denyhosts можно командой

daemon-control stop

В статье denyhosts on Mac OS X я нашел еще несколько полезных трюков.

Запуск при старте системы

В Mac OS X запуском различных программ и скриптов при старте системы занимается launchd . Проблема в том, что он не очень хорошо работает со скриптами, запускающими демонов. Launchd отслеживает момент, когда скрипт завершает свою работу и запускает его снова.

Модифицируем метод start управляющего скрипта daemon-control


def start(*args):
    cmd = "%s --daemon " % DENYHOSTS_BIN
    if args: cmd += ' '.join(args)

    print "starting DenyHosts:   ", cmd

    while True:
        os.system(cmd)
        time.sleep(5)

        while True:
            pid = getpid()
            if pid >= 0:
                time.sleep(300)
            else:
                break

Теперь его можно использовать в launchd. Создадим файл /Library/LaunchDaemons/net.hosts.deny.plist


<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE plist PUBLIC "-//Apple Computer//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
<plist version="1.0">
  <dict>
    <key>Label</key>
    <string>net.denyhosts</string>
    <key>ProgramArguments</key>
    <array>
      <string>/usr/share/denyhosts/daemon-control2</string>
      <string>start</string>
    </array>
    <key>RunAtLoad</key>
    <true/>
    <key>KeepAlive</key>
    <true/>
    <key>ServiceDescription</key>
    <string>Lauch denyhosts</string>
  </dict>
</plist>

Выполним следующую команду, чтобы запустить его

launchctl load /Library/LaunchDaemons/net.hosts.deny.plist

Ротация лог-файлов

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


# logfilename [owner:group]   mode count size when  flags [/pid_file] [sig_num]
/var/log/denyhosts            640   5     *  $D0     BJ  /var/run/denyhosts.pid 15
#
Комментарии к заметке: 7

Конфигурация проектов в gitosis

После того, как gitosis установлен и настроен доступ к нему из вне, можно переходить к созданию отдельных хранилищ проектов.

Для конфигурирования gitosis используется инфраструктура git. При инициализации нового репозитория всегда создается проект gitosis-admin, где хранятся файлы конфигураций и ключи доступа. Как только в этот проект делается комит с изменениями настроек они сразу же применяются. Это обеспечивается скриптом post-update. Нужно убедиться, что он может выполняться.

sudo chmod 755 /Users/git/repositories/gitosis-admin.git/hooks/post-update

Сделаем копию этого проекта на рабочем компьютере

git clone git@repo.local:gitosis-admin.git

В файле gitosis.conf содержится описание проектов и прав доступа к ним, а в директории keydir — публичные ключи других пользователей репозитория.

После того как необходимые изменения будут сделаны, выполните следующие команды, чтобы отправить их в репозиторий на сервере:


git commit -a -m "Комментарий к комиту"
git push

Создание нового проекта

Исходная конфигурация в gitosis.conf

[gitosis]

[group gitosis-admin]
writable = gitosis-admin
members = user1

В строке members перечисляются имена ключей (без расширения .pub), которые лежат в папке keydir.

По аналогии добавим еще одну группу:

[group project1]
writable = project1
members = user1

Эти правила задают группу project1, в которую входит пока только 1 пользователь user1. Все пользователи из этой группы имеют доступ для записи в проект project1.

Сохраним изменения и опубликуем их в удаленный репозиторий.

Теперь создадим сам проект. На рабочем компьютере выполним команды:


mkdir project1
cd project1
git init
git remote add origin git@repo.local:project1.git

Было бы хорошо, если к этому моменту у вас уже были какие-либо файлы, которые можно отправить в репозиторий. Если таковых нет, то нужно создать пусть даже пустой файл, чтобы его опубликовать (потом этот файл можно удалить или отредактировать).

touch file.txt

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


git add .
git commit -a -m 'init commit'
git push origin master:refs/heads/master

Проект с названием project1 будет создан на сервере в директории /Users/git/repositories/

Оставте свой комментарий

Установка и настройка git-репозитория на Mac OS X 10.6

Переустановка системы на домашнем сервере подтолкнула написать еще одну подробную инструкцию по настройке git-репозитория на Mac OS X 10.6 (Snow Leopard)

Установка и настройка gitosis

Предположим, что git-клиент уже установлен. В интернете можно с легкостью найти несколько готовых сборок. Он нам понадобится, чтобы загрузить gitosis

cd ~/Desktop
mkdir src
git clone git://eagain.net/gitosis.git
cd gitosis
sudo python setup.py install

Создадим пользователя, под которым мы будем подключаться к репозиторию. Это можно сделать из панели управления пользователями или из командной строки

Найдем не используемые uid и gui

sudo dscl . list /Users uid
sudo dscl . list groups gid

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

Создаем группу git


sudo dscl . create groups/git
sudo dscl . create groups/git gid 410

Создаем пользователя git


sudo dscl . create users/git
sudo dscl . create users/git uid 410
sudo dscl . create users/git NFSHomeDirectory /Users/git
sudo dscl . create users/git gid 410
sudo dscl . create users/git UserShell /bin/bash
sudo dscl . create users/git Password '*'

Создаем домашнюю директорию пользователя

sudo mkdir /Users/git
sudo chown git /Users/git
sudo chgrp git /Users/git

Теперь для текущего пользователя на локальном компьютере сгенерируем ssh ключ, если его еще нет. Если ключ есть, то этот шаг пропускаем


ssh-keygen -t rsa

И копируем его на удаленный сервер

scp ~/.ssh/id_rsa.pub repo.local:/tmp/my_key.pub

Если же репозиторий создается на рабочем компьютере, то эта команда немного упрощается

cp ~/.ssh/id_rsa.pub /tmp/my_key.pub

Теперь на сервере выполним инициализацию репозитория

cd /Users/git
sudo -H -u git gitosis-init < /tmp/my_key.pub

При удачном раскладе вы должны увидеть сообщения вроде этих


Initialized empty Git repository in /Users/git/repositories/gitosis-admin.git/
Reinitialized existing Git repository in /Users/git/repositories/gitosis-admin.git/

Устанавливаем переменную PATH для пользователя git

sudo su git
echo "export PATH=$PATH" > ~/.bashrc
exit

На этом настройку gitosis можно считать законченной. Проверим подключение к репозиторию из вне.

git clone git@repo.local:gitosis-admin.git

Если вы увидите сообщение


Cloning into gitosis-admin...
remote: Counting objects: 5, done.
remote: Compressing objects: 100% (5/5), done.
remote: Total 5 (delta 0), reused 5 (delta 0)
Receiving objects: 100% (5/5), done.

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

Потенциальные проблемы

Когда я настраивал gitosis в первый раз, то долго бился над тем, что подключение по SSH для пользователя git ни как не устанавливалось. Причина этому, как выяснилось позже, послужило ограничение доступа по SSH только администраторам.

Общий доступ → Удаленный вход

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

Комментарии к заметке: 1

Восстановление очень большой MySQL базы

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

ERROR 2006 (HY000) at line 781: MySQL server has gone away

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

max_allowed_packet=16M

В MySQL версии 5.1 параметр max_allowed_packet стал динамическим и его можно менять без исправлений в my.cnf и перезапусков сервера. В mysql-консоли выполните команду

set global max_allowed_packet=16M
Комментарии к заметке: 1

Поиск файлов из командной строки

Главным инструментом для поиска файлов служит утилита find. Она имеет множество параметров, которые позволяют задавать различные условия.

Поиск по имени файла

find ~ -name 'article.doc'
  • ~

    домашняя папка пользователя в качестве начального пути для поиска

  • -name

    поиск по имени файла

Так же можно делать поиск по части имени

find ~ -name 'article.*'
find ~ -name '*.doc'

У параметра name есть альтернатива iname — игнорирование регистра символов.

Поиск по дате и времени

У файлов учитывается время создания (create), доступа (access) и изменения (modification). Соответственно параметры поиска начинаются с первых букв соответствующих английских слов.

find . -amin -30

Ищем файлы в текущей папке, которые открывались менее 30 минут назад.


find . -ctime -2h

Ищем файлы в текущей папке, время создания которых отличается от текущего на 2 часа.

В единицах интервала времени можно использовать модификаторы + или , чтобы обозначить условие больше или меньше соответственно.

Поиск по размеру

find . -size +10M

Эта команда выдаст список файлов, размер которых больше 10 мегабайт.

find . -size -10k

А эта — список файлов, размер которых меньше 10 килобайт.

Поиск по содержимому файла

Утилита find сама не осуществляет поиск по содержимому, но ее можно использовать, чтобы задать другие граничные условия поиска. А внутри файла можно найти строку с помощью утилиты grep.

Найдем файлы в домашней папке пользователя, размер которых меньше 10 килобайт и содержащих строку «hello»


find ~ -size -10k -print0 | xargs -0 grep "hello"
  • -print0

    имена файлов будет разделены символом \0

  • xargs

    специальная утилита, которая получает из стандартного ввода набор строк и передает их в качестве аргументов следующей утилите (в нашем случае утилите grep)

  • -0

    строки разделены символом \0

Подробнее о параметрах

Все параметры и их значения можно узнать из документации по соответствующим утилитам

Комментарии к заметке: 3