Заметки за февраль 2011 года

Блокируем 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

CSS Grid — модульная сетка в YUI3

CSS Grid появился в YUI3 еще когда пакет был на ранней стадии тестирования и перекочевал туда из второй версии YUI. Он открывал широкие перспективы перед программистами верстальщиками в организации структуры страницы. Можно было делить страницу или блок на колонки, сменой всего лишь одного класса менять их местами и много другое. Там применялась обычная техника позиционирования через float: left или float: right.

Однако через некоторое время после официального выпуска разработчики объявили этот компонент устаревшим и не рекомендовали его применять в реальных проектах на базе YUI3.

The current Grids system was designed with the needs of older browsers (including Firefox 2) in mind. With Firefox 2 coming off the A-Grade in the next GBS update (due in July), there are structural changes that we want to make in engineering a successor to the 2.x version of Grids.

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

Теперь CSS Grid ориентирован только на работу в современных браузерах и основан на блоках с display: inline-block.

В место гибкости позиционирования колонок слева или справа (сейчас все колонки располагаются только слева направо согласно своему порядку в документе) мы получили возможность выравнивать их по вертикали с помощью vertical-align.

Как и прежде колонке необходимо явно задать ширину или можно воспользоваться заготовленными классами 24-х колончатой модульной сетки. Имя класса задает пропорции блока относительно родительского контейнера.


<div class="yui3-g">
    <div class="yui3-u-1-4">
        <div>колонка 25%</div>
    </div>
    <div class="yui3-u-1-2">
        <div>колонка 50%</div>
    </div>
    <div class="yui3-u-1-8">
        <div>колонка 12.5%</div>
    </div>
    <div class="yui3-u-1-8">
        <div>колонка 12.5%</div>
    </div>
</div>

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

Интересным моментом этого компонента является то, как разработчики легко избавились от нежелательных зазоров в несколько пикселей между колонками. Так как элементы уже не блочные, то лишние пробелы в коде между блоками с классом yui3-u не игнорируются, а учитываются при отрисовке, как если бы это были пробелы между словами. От этих артефактов можно избавиться, удалив эти пробелы и пожертвовав читаемостью кода. Но такой пробел мог бы случайно возникнуть на любом этапе разработки. В Yahoo поступили гораздо хитрее. Все зазоры между колонками убираются с помощью правил letter-spacing или word-spacing, в зависимости от браузера.

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