памятка по автоматическому копированию аплоадов юзеров на сторонний unix сервер

Главные вкладки

Аватар пользователя zman zman 11 октября 2011 в 17:55

для исключения частых memory allocation error
гик-памятка по автоматическому копированию файлов (например аплоадов) юзеров на сторонний сервер,
средствами unixlike систем: rsync и ssh авторизацией по паре ключей

проверяем работоспособность rsync или простейший бэкап
rsync -azvv --progress --size-only /temp/source/ /backup/test

первый этап
---------------------------------
первый сервер, откуда происходит копирование linuxexmpl.ru
и второй freebsdexmpl.ru, куда происходит копирование

1 юзеры на обеих серверах должны совпадать (например rsync_user)

2 на всякий случай генерацию ключей делаю на старой freebsd
ssh-keygen -t rsa -b 2000 -f rsync-key
( rsa считается безопасной при длинне ключа более 1000 )

появилось два файла
публичный ключ rsync-key.pub (владальца rsync_user с правами 644 и содержания ssh-rsa бла-бла-бла)
и частный ключ rsync-key (владельца rsync_user с правами 600 и содержания -----BEGIN RSA PRIVATE KEY----- бла-бла-бла)

3 публичный ключ rsync-key.pub переименовываем в authorized_keys (права 600)
и копируем (тут был основной мой косяк) в дирректорию /home/rsync_user/data/.ssh
созданную юзером rsync_user с правами (!!!) 700
( а не в дирректорию /home/rsync_user/.ssh как везде написано )

4 частный ключ нужно скопировать на 1й сервер,
с которого происходит копирование ( если по фтипи то в ascii режиме )
или например так
scp rsync-key rsync_user@linuxexmpl.ru:/home/rsync_user/data/.ssh

проверяем скрипт
rsync -aczvv --progress -e "ssh -i /var/www/rsync_user/.ssh/rsync-key" /temp/source rsync_user@freebsdexmpl.ru:/home/rsync_user/data/temp --log-file=/temp/rsync.log
после удачной работы можно verbose (две vv) убрать также как и --progress

не работает шайтан труба? ашипки?
------------------------------------------------------------------
1 к команде rsynс добавляем ключи --verbose --stats --perms --progress
2 добавление к команде ssh -vvv вывод ещё кучку дебаг сообщений уже со стороны ssh
3 включаем на обоих серверах в sshd_config
LogLevel DEBUG
перегружаем sshd, смотрим лог /var/log/auth.log
курим гуглы-маны

2 этап
-----------------------------------
настройка drupal директории куда будет скидываться аплоад контент

filefield что-то не захотел у меня работать вместе с comment_upload
пришлось использовать uploadpath, а comment_upload обрабатывать напильником ( http://drupal.org/node/785596 )

теперь все аплоады падают в директорию linuxexmpl.ru/sites/default/files/upload

3 этап
-----------------------------
запуск rsync через друпал, точнее через вызов друпалом урла с cgi скриптом
www.linuxserv/cgi-bin/rsync.cgi с правами 500 и примерно такого содержания:

#!/usr/bin/perl
print "\n\n"; # убираем ошибку

system "/usr/bin/rsync -aczvv -e \"ssh -p22 -2 -vvv -i /var/www/rsync_user/data/.ssh/rsync-key\"
/var/www/rsync_user/data/www/linxuexmp.ru/sites/default/files/upload rsync_user\linuxexmpl.ru:
/home/rsync_user/data/www/img.freebsdexmpl.ru --log-file=/temp/rsync.log --verbose --stats --perms --progress >>/temp/sync2.log 2>&1";

в моём случае
пришлось вручную копировать (на строне отправляющего linux сервера, ранее созданный)
файл known_hosts в директорию .ssh пользователя
из под которого происходит запуск cgi-perl скрипта

4 этап
------------------------------
теперь, когда происходит автоматический слив документов на файловый сервер
необходимо изменение урла вывода файлов

наверное корректней сделать изменение урла-src выводимого документа с помощью дубляжа контента на поддомен посредстовм Domain Access или Virtual Sites

но мне проще-быстрее найти концы в исходниках
стоят модули imagecache, imageapi, lightbox2 и itweak upload

в модуле itweak_upload.module
находим $html = l($thumbnail, $href, $options);
и меняем например на

$href2=str_ireplace ('www.linuxexmpl.ru/sites/default/files/', 'img.freebsdexmpl.ru/', $href);
$html = l($thumbnail, $href2, $options);

5 этап
---------------------------
запуск rsync скрипта друпалом

пилим скрипты drupal'a для запуска синхронизации файлами по событию
( или используем варианты запуска по крону или по встроенным триггерам или сторонним модулем типа рулес )

в моём случае это синхронизация по добавлению новости (а также коментария или записи в блоге) с аттачментом
код находится тут: drupal/includes/form.inc

было

function drupal_redirect_form($form, $redirect = NULL) {
  $goto = NULL;
  if (isset($redirect)) {
    $goto = $redirect;
  }

стало:

function drupal_redirect_form($form, $redirect = NULL) {
  $goto = NULL;
  if (isset($redirect)) {
        $url = 'http://linuxexmpl.ru/cgi-bin/rsync.cgi';
        $ch = curl_init();
        curl_setopt($ch, CURLOPT_URL,$url);
        curl_setopt($ch, CURLOPT_FAILONERROR, 0);
        curl_setopt($ch, CURLOPT_FOLLOWLOCATION, 0);
        curl_setopt($ch, CURLOPT_RETURNTRANSFER,1);
        curl_setopt($ch, CURLOPT_TIMEOUT, 5);
        $result = curl_exec($ch);
        curl_close($ch);

        $goto = $redirect;
  }

6 этап
-------------------------
настройка сервера отдающего файлы
настройка apache-nginx-lighhtpd
...

безопасность
-------------------------------
работу по ssh можно засунуть в chroot окружение
более простой (и менее кошерный вариант) использование ограничений через слоупок шел - lshell
pkg_add -r lshell (или как там у вас ... юмюм_аптгет_рпм_мэйк)
chsh -s /usr/local/bin/lshell rsync_user

в файле /usr/local/etc/lshell.conf пишем что-то типа
[rsync_user]
sftp : 1
allowed : ['cd','exit','ls']
path : [/home/rsync_user/data','/home/rsync_user/.ssh']

ну и не забывать конечно по крону антивирусом прогонять
clamscan /img.freebsdexmpl.ru/ -r -i --move=/temp/infected

защита по кол-ву сессий ssh (fail2ban, DenyHosts, ipt_recent)
вход в ssh с определённых айпи (ipfw, hosts.allow)

ошибки
--------------------------
ssh: Could not resolve hostname rsync_userfreebsdexmpl.ru: Name or service not known
rsync: connection unexpectedly closed (0 bytes received so far) [sender]
rsync error: unexplained error (code 255) at io.c(601) [sender=3.0.7]
[sender] _exit_cleanup(code=12, file=io.c, line=601): about to call exit(255)
***
Host key verification failed.^M
rsync: connection unexpectedly closed (0 bytes received so far) [sender]
rsync error: unexplained error (code 255) at io.c(601) [sender=3.0.7]
[sender] _exit_cleanup(code=12, file=io.c, line=601): about to call exit(255)

ошибка возникала при запуске из под оболочки cgi-perl
из-за отсутствия обратной косой перед /@именем пользователя

debug3: check_host_in_hostfile: host 60.*00.1.1 filename /etc/ssh/ssh_known_hosts
debug3: check_host_in_hostfile: host linuxexmpl.ru filename /var/www/rsync_user/data/.ssh/known_hosts
debug2: no key of type 0 for host linuxexmpl.ru
debug2: no key of type 1 for host linuxexmpl.ru
debug1: read_passphrase: can't open /dev/tty: No such device or address
Host key verification failed.
rsync: connection unexpectedly closed (0 bytes received so far) [sender]
rsync error: unexplained error (code 255) at io.c(601) [sender=3.0.7]
[sender] _exit_cleanup(code=12, file=io.c, line=601): about to call exit(255)

ошибка возникала из-за отсутствия файла known_hosts (/var/www/rsync_www_user/data/.ssh/known_hosts) от запускающего cgi-perl пользователя

вопросы
---------------------------
где кто какие видит косяки?

Комментарии

Аватар пользователя bsyomov bsyomov 11 октября 2011 в 20:48

"zman" wrote:
для исключения частых memory allocation error
гик-памятка по автоматическому копированию файлов (например аплоадов) юзеров на сторонний сервер

Какое отношение копирование файлов имеет к memory allocation error?

"zman" wrote:
1 юзеры на обеих серверах должны совпадать (например rsync_user)

Зачем они должны совпадать?

"zman" wrote:
ssh-keygen -t rsa -b 2000 -f rsync-key

-b 2048, но нет смысла, это значение по умолчанию.

"zman" wrote:
4 частный ключ нужно скопировать на 1й сервер,
с которого происходит копирование ( если по фтипи то в ascii режиме )
или например так
scp rsync-key rsync_user@linuxexmpl.ru:/home/rsync_user/data/.ssh

Если мы имеем возможность использовать ssh, то sftp или scp, какой ftp - мы же за безопасность? Smile

Вообще тема не раскрыта
-зачем всё это понадобилось. Smile
-что будет, если кто-нить начнёт долбиться в http://www.linuxserv/cgi-bin/rsync.cgi?
-зачем вообще rsync использовать и каждый раз по загрузке файла, вместо того, чтобы его отправить на удалённый сервер, синхрить всё дерево?

По мне, проще было бы запускать rsync редко по крону, например чтобы зачистить от удалённых файлов, и отправлять файлы например по sftp или scp, прямо внутри друпала, модулем, средствами php. И наружу ничего торчать не будет. Или, если файлы могут быть большими, по крону, создавая очередь закачки из друпала, что в общем-то правильнее.

Аватар пользователя zman zman 12 октября 2011 в 11:19

>Какое отношение копирование файлов имеет к memory allocation error
это шутка юмора, про собственную забывчивость

>Зачем они должны совпадать?
да, действительно работают и разные

> ssh-keygen -t rsa -b 2000 -f rsync-key
> -b 2048, но нет смысла, это значение по умолчанию
памятка она для памяти, что бы проще было вспомнить где какие ключи
а так конечно стоит размер ключа побольше чем стандартный

>мы же за безопасность
а то

>зачем всё это понадобилось
т.к. хостеры нашенские, то приходится извращаться
у одного хостера быстрый процессор, но жёсткие ограничения по объёму трафика
у другого хостера нет ограничений по трафику, на него и скидывается файло

> зачем вообще rsync использовать и каждый раз по загрузке файла,
> вместо того, чтобы его отправить на удалённый сервер, синхрить всё дерево
как вариант вполне, но это надо хорошо вглубь друпала лезть

> что будет, если кто-нить начнёт долбиться в http://www.linuxserv/cgi-bin/rsync.cgi
да, надо поставить ограничение на кол-во сессий

Аватар пользователя bsyomov bsyomov 12 октября 2011 в 15:31

"zman" wrote:
как вариант вполне, но это надо хорошо вглубь друпала лезть

Ну не глубже чем сейчас, в общем-то. Но намного ведь эффективнее.
"zman" wrote:
да, надо поставить ограничение на кол-во сессий

Просто не надо, чтобы такие вещи торчали наружу, особенно тогда, когда это реально не нужно.

По поводу же хостеров, надо просто найти пару хороших вариантов, и не париться так. Или ещё лучше, взять себе сервачёк, или хотя бы vps у хетзнера например, раз уж есть знания в области администрирования, и захостить там свои проекты.