Инструкция по превращению нескольких компьютеров в MPI-кластер и последующем запуске в этом кластере John the Ripper с целью организации эксперимента по распределенному подбору значений, соответствующих заданному хэшу (например, для проверки своих паролей на надежность). Руководство носит упрощенный характер и не охватывает некоторых вопросов по обеспечению высокой надежности и безопасности, рассматривая процесс создания кластера как проводимый в академических целях эксперимент.Для создания кластера нам понадобиться как минимум два компьютера, работающих под управлением Ubuntu Linux 10.04. Для соединения машин будет достаточно любых сетевых карт, John the Ripper не требует большой пропускной способности.
++ Настройка сервера.
Для работы кластера нам потребуются следующие пакеты c реализацией MPI Message Passing Interface:
$ sudo apt-get install libmpich1.0-dev libmpich-mpd1.0-dev libmpich-shmem1.0-dev mpich2 mpich2-doc
Дополнительно, установим John the Ripper, OpenSSH и комплект для сборки из исходных текстов:
$ sudo apt-get install john openssh-server build-essentials
Для упрощения настройки заносим IP и имя текущего хоста в /etc/hosts
127.0.0.1 localhost
10.0.0.1 server1.test.ru server1
Создаем в системе пользователя "cluster" и создаем каталог bin в домашней директории этого пользователя:
$ sudo useradd -m -s /bin/bash cluster
$ sudo passwd cluster
$ sudo su - cluster -c "mkdir ~/bin;export PATH=~/bin:$PATH"
++ Настраиваем MPICH
Создаем в домашней директории пользователя cluster конфигурационный файл ~/.mpd.conf с настройками аутентификации для MPI-кластера.
Записываем в файл ~/.mpd.conf строку "secretword=пароль", где пароль для аутентификации всех узлов кластера.
Правим права доступа:
$ chmod 600 ~/.mpd.conf
Список узлов кластера, включая текущий сервер, перечисляем в файле ~/mpd.hosts. Формат строки файла "хост:число процессоров", т.е. для четырехядерного сервера c IP 10.0.0.2 указываем "10.0.0.2:4". Все IP должны быть доступны по сети, т.е. 127.0.0.1 для локального узла указывать нельзя.
Итоговый процесс настройки MPICH выглядит следующим образом:
$ touch ~/.mpd.conf
$ chmod 600 ~/.mpd.conf
$ echo secretword=pass>~/.mpd.conf
$ /sbin/ifconfig|grep "inet addr" # смотрим IP на хостах
inet addr:10.0.0.1 Bcast:10.255.255.255 Mask:255.0.0.0
inet addr:127.0.0.1 Mask:255.0.0.0
$ cat /proc/cpuinfo|grep processor|wc -l # смотрим число ядер CPU
1
$ echo "10.0.0.1:1" >> ~/mpd.hosts
Запускаем кластер:
$ mpdboot
Просматриваем список узлов кластера:
$ mpdtrace
Завершаем работу кластера:
$ mpdallexit
++ Установка John the Ripper
Исходные тексты версии John the Ripper с дополнительными MPI-патчами можно загрузить на странице http://www.bindshell.net/tools/johntheripper
Загружаем код:
$ mkdir source
$ cd source
$ wget http://www.bindshell.net/tools/johntheripper/john-1.7.2-bp17...
Распаковываем архив и выполняем сборку:
$ tar -zxf john-1.7.2-bp17-mpi8.tar.gz
$ cd john-1.7.2-bp17-mpi8/src/
$ make # будет выведен список опций
$ make linux-x86-sse2
где вместо linux-x86-sse2 можно указать другой тип системы:
linux-x86-mmx Linux, x86 с MMX
linux-x86-sse Linux, x86 с SSE2 (лучший выбор)
linux-x86-any Linux, x86
linux-x86-64 Linux, AMD x86-64, 64-bit/SSE2 (лучший выбор)
linux-x86-64-mmx Linux, AMD x86-64, 32-bit с MMX
Проверяем работу собранной программы:
$ ../run/john -format=DES -test
Benchmarking: Traditional DES [128/128 BS SSE2]... DONE
Many salts: 1994K c/s real, 1994K c/s virtual
Only one salt: 1658 c/s real, 1654K c/s virtual
Копируем исполняемый файл в директорию ~/bin
$ mv ../run/* ~/bin
Проверяем, что John the Ripper собран с поддержкой MPI:
$ john|grep mpi
John the Ripper password cracker, version 1.7.2_bp17_mpi
Повторяем все ранее описанные шаги на всех узлах кластера.
Настраиваем беспарольный вход по SSH для пользователя cluster для всех узлов кластера.
Генерируем rsa-ключ:
$ ssh-keygen -t rsa
Копируем ключ на другие узлы кластера:
$ ssh cluster@10.0.0.2 mkdir -p .ssh
$ cat .ssh/id_rsa.pub | ssh cluster@10.0.0.2 'cat>>.ssh/authorized_keys'
Добавляем параметры узла в ~/mpd.hosts и создаем ~/.mpd.conf и ~/mpd.hosts на удаленных узлах:
$ ssh cluster@10.0.0.2 'cat /proc/cpuinfo|grep processor|wc -l'
2
$ echo 10.0.0.2:2 >> ~/mpd.hosts
$ for i in `cut --delimiter=: -f1 ~/mpd.hosts`;do scp ~/.mpd.conf cluster@$i:~; scp ~/mpd.hosts cluster@$i:~; done
Добавляем в /etc/hosts имя дополнительного узла:
10.0.0.2 node1
Синхронизируем содержимое /etc/hosts на всех узлах.
Если этого не сделать возникнет ошибка:
mpdboot_server (handle_mpd_output 407): failed to handshake with mpd on 10.0.0.2; recvd
Запускаем кластер:
$ mpdboot --verbose --ncpus=1 -n 2
running mpdallexit on server
LAUNCHED mpd on server via
RUNNING: mpd on server
LAUCNHED mpd on 10.0.0.2 via server
RUNNING: mpd on 10.0.0.2
где, --verbose - вывод расширенной информации, а "--ncpus=1" - задаем число CPU для текущего сервера, "-n 2" - указываем, что в кластере 2 узла (текущий сервер 10.0.0.1 + внешний узел 10.0.0.2).
На втором узле 10.0.0.2 MPICH будет запущен автоматически.
Смотрим список активных узлов:
$ mpdtrace
server
node1
Для тестирования, запустим команду hostname на всех узлах:
$ mpiexec -np 3 hostname
server
node1
node1
node1 - вывелось два раза так как к узлу привязано 2 CPU и задача была выполнена два раза.
Завершаем работу кластера:
$ mpdallexit
Using the MPI cluster to crack passwords.
Попробуем подобрать значение для MD5-хэша:
$ echo fb7852f240efac3c0bdce8cf9dcb2e50 > crackme1.md5
Запускаем кластер:
$ mpdboot --ncpus=2 -n 2
Копируем файл crackme1.md5 на все узлы:
$ for i in `cut --delimiter=: -f1 ~/mpd.hosts`;do scp ~/crackme1.mp5
cluster@$1:~;done
Чтобы упросить процесс копирования на все узлы кластера напишем простой скрипт distributer.sh:
#!/bin/bash
# usage: ./distributer.sh filename
for x in `cut --delimiter=: -f1 ~/mpd.hosts`;do scp $1 cluster@$i:~;done
Запускаем John the Ripper на 3 CPU:
$ mpiexec -np 3 john --format:raw-MD5 crackme1.md5
Loaded 1 password hash (Raw MD5 [raw-md5 SSE2])
Loaded 1 password hash (Raw MD5 [raw-md5 SSE2])
Loaded 1 password hash (Raw MD5 [raw-md5 SSE2])
test1 (user)
Process 2 completed loop.
Threat: 2 guesses: 1 time 0:00:00:02 (3) c/s: 5616K trying: 12345 – 56778
После завершения подбора завершаем работу кластера:
$ mpdallexit
URL: http://www.petur.eu/blog/?p=59
Обсуждается: http://www.opennet.dev/tips/info/2542.shtml