2013-08-26 2 views
8

Я искал> 5 дней, пробовал множество трюков и советов и даже пытался заставить автора lsync помочь, но все напрасно.Конфигурация lsync для использования не-root-логинов

У меня есть 2 веб-сервера Red Hat 6.3, которым необходимо синхронизировать свои каталоги изображений при загрузке изображения. Мы не можем контролировать, какой сервер он загружается, но он не загружается в другой, когда он загружается.

Мне просто нужно сказать lsync, чтобы использовать учетные данные другого пользователя, кроме имени пользователя root. Наша команда информационной безопасности не разрешает доступ к rootless root. Не могу сказать, что я их виню.

У меня есть учетная запись, которая имеет доступ к sudo для выполнения всего, что нужно, чтобы получить файлы до места назначения. Хотя я могу заставить rsync выполнять синхронизацию просто отлично, она не работает с разрешенной ошибкой при запуске от lsync.

Я могу даже скопировать команду, которая выполняется lsync из журнала, удалить квадратные скобки и успешно синхронизировать. Таким образом, я уверен, что проблема связана с lsync. Просто потому, что он запускается как root. Сценарий оболочки заставляет его запускаться с правами root. Я даже попытался изменить его на учетную запись, отличную от root, и все поддерживающие файлы были изменены вместе со скриптом, и он по-прежнему отказывается от синхронизации.

Вот подробности о сценариях и файлах, которые у меня есть: ОС: Red Hat Linux версии 6.3 (Santiago) lsyncd конфигурационный файл:

---- 
-- User configuration file for lsyncd. 
-- 
-- Simple example for default rsync, but executing moves through on the target. 
-- 
-- For more examples, see /usr/share/doc/lsyncd*/examples/ 
-- 
-- sync{default.rsyncssh, source="/var/www/html", host="localhost", targetdir="/tmp/htmlcopy/"} 

settings{ 
    logfile = "/var/log/lsyncd.log", 
    statusFile = "/var/log/lsyncd-status.log", 
    delay = 1, 
} 
sync { 
    default.rsyncssh, 
    source="<Absolute path to source directory>", 
    host  = "<Host IP>", 
    targetdir = "<Absolute path to target directory>", 
    rsync = { 
     binary = "/usr/bin/rsync", 
     rsh = "sudo -u <Domain>\\<User ID> ssh", 
     sparse = true, 
     update = true, 
     links = true, 
     times = true, 
    } 
} 

rsyncd.conf файл:

log file = /var/log/rsyncd.log 
pid file = /var/log/rsyncd.pid 
allow = localhost 
deny = * 
list = true 
uid = 16777218 
gid = 16777222 
read only = false 
timeout=600 
use chroot = true 

[Test1] 
path = "<Absolute path to target/source>" 
comment = Test for remote transfer 

Файл rsyncd.conf был изменен для использования другого uid/gid, так как это то, к чему я хотел его изменить.

Вот журнал ошибок из lsyncd.log:

Thu Aug 22 07:58:57 2013 Debug: daemonizing now. 
Thu Aug 22 07:58:57 2013 Function: Inotify.addWatch(<Absolute Path to Source>) 
Thu Aug 22 07:58:57 2013 Inotify: addwatch(<Absolute Path to Source>)-> 1 
Thu Aug 22 07:58:57 2013 Call: getAlarm() 
Thu Aug 22 07:58:57 2013 Alarm: runner.getAlarm returns: (true) 
Thu Aug 22 07:58:57 2013 Masterloop: immediately handling delays. 
Thu Aug 22 07:58:57 2013 Call: cycle() 
Thu Aug 22 07:58:57 2013 Function: invokeActions("Sync1", (Timestamp: 5491559.47)) 
Thu Aug 22 07:58:57 2013 Normal: recursive startup rsync: <Absolute Path to Target> -> <Host IP>:<Absolute Path to Target> 
Thu Aug 22 07:58:57 2013 Exec: /usr/bin/rsync [--delete] [--ignore-errors] [-usltS] [--rsh=sudo -u <Domain>\<User ID> ssh] [-r] [<Absolute Path to Source>] [<Host IP>:<Absolute Path to Target>] 
Thu Aug 22 07:58:57 2013 Function: write((Timestamp: 5491559.47)) 
Thu Aug 22 07:58:57 2013 Statusfile: writing now 
Thu Aug 22 07:58:57 2013 Call: getAlarm() 
Thu Aug 22 07:58:57 2013 Alarm: runner.getAlarm returns: (false) 
Thu Aug 22 07:58:57 2013 Masterloop: going into select (no timeout) 
rsync: Failed to exec sudo: Permission denied (13) 
rsync error: error in IPC code (code 14) at pipe.c(84) [sender=3.0.6] 
rsync: connection unexpectedly closed (0 bytes received so far) [sender] 
rsync error: error in IPC code (code 14) at io.c(600) [sender=3.0.6] 
Thu Aug 22 07:58:57 2013 Call: collectProcess() 
Thu Aug 22 07:58:57 2013 Delay: collected an event 
Thu Aug 22 07:58:57 2013 Error: Temporary or permanent failure on startup of "<Absolute Path to Target>". Terminating since "insist" is not set. 

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

Так, только так мы ясны на цели:

  1. У меня есть 2 веб-серверы, балансировкой нагрузки.
  2. Изображения будут загружены без контроля относительно того, к какому серверу они идут.
  3. Я проектирую архитектуру синхронизации, используя lsyncd/rsync в качестве демона для обновления обоих серверов при загрузке. Это означает, что для обоих серверов потребуется запустить lsyncd/rsyncd без удаления. Ни одно исключение не предполагает, что если оба сервера получили другое изображение одновременно, а затем, когда сервер сначала проверил цель, он удалил бы файл цели, поскольку он не был на исходном.

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

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

Спасибо!

+2

вы добьетесь с этим ли? –

+0

Любые выводы по этому вопросу? –

+0

Пройдя одно и то же. Трудно поверить, что нет никакого работоспособного решения для non-root. Я могу просто разрешить вход в систему root. – Hal50000

ответ

8

Вы должны установить имя пользователя и ключевой файл в части rsyncopts файла lsyncd.conf (на ubuntu это /etc/lsyncd/lsyncd.conf.lua). Ключевой файл должен присутствовать на хосте, где работает демон lsyncd.

sync{ 
    default.rsyncssh, 
    source="/path/to/source", 
    host="target.example.org", 
    targetdir="/path/on/target", 
    rsyncOpts={"-e", "/usr/bin/ssh -l someuser123 -i /home/someuser123/.ssh/id_rsa"} 
} 
+7

Это мне помогает. Обратите внимание, что из ** lsyncd 2.1 **, rsyncOpts не поддерживается. Он должен быть заменен на: 'rsync = { rsh ="/usr/bin/ssh -l someuser123 -i /home/someuser123/.ssh/id_rsa ", }' [См. Это] (https: // github.com/axkibe/lsyncd/wiki/Lsyncd%202.1.x%20%E2%80%96%20Layer%204%20Config%20%E2%80%96%20Default%20Behavior#defaultrsync) – JBENOIT

+0

Это работает, но файлы на цель всегда будет принадлежать 'someuser123' независимо от владельца на исходном сервере. – Hal50000

+1

Ну, вы можете просто установить rsyncOpts -eo, чтобы сохранить владельца. Или -eog сохранить владельца и группу. Существуют также варианты сохранения даты создания, см. «Man rsync» для деталей. – edlerd

0
settings { 
     logfile = "/var/log/lsyncd/lsyncd.log", 
     statusFile = "/var/log/lsyncd/lsyncd.status" 
} 

sync { 
     default.rsyncssh, 
     source = "/home/vagrant/local", 
     host = "[email protected]", 
     targetdir = "/home/vagrant/remote", 
     rsync = { 
       rsh = "/usr/bin/ssh -l vagrant -i /home/vagrant/.ssh/id_rsa -o StrictHostKeyChecking=no" 
     } 
}