Настройка lsync для использования учетных записей без полномочий root

Я искал> 5 дней, пробовал многочисленные хитрости и советы и даже пытался заставить автора lsync помочь, но все тщетно.

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

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

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

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

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

 ----
 -- 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 без удаления. Нет удаления предполагает, что если оба сервера получили разные изображения в то же время, что и тот, который когда-либо сервер проверял цель в первую очередь, он будет удалять файл на цели, так как его нет в источнике.

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

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

Спасибо!

4 ответа

Вы должны установить имя пользователя и ключевой файл в части 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"}
}
settings {
        logfile = "/var/log/lsyncd/lsyncd.log",
        statusFile = "/var/log/lsyncd/lsyncd.status"
}

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

Похоже, что со временем будет проще поддерживать вход без полномочий root.

Вот мой текущий конфиг без манипуляций с параметрами rsync, но с дополнительной таблицей параметров в конфиге ssh:

      sync {
            default.rsyncssh,
            [... more config stuff...]
            ssh = {
                    port = 22,
                    identityFile = "/root/.ssh/id_rsa_somespecialprivatekey",
                    options = {
                            User = "someuser"
                    }
            }
    }

Таким образом, каждая запись в таблице параметров ssh будет передана команде ssh, как если бы вы использовали параметр «-o».

Генерация ssh-ключа на локальном компьютере

ssh-keygen -t rsa

Скопируйте закрытый ключ на удаленный сервер

ssh-copy-id [электронная почта защищена]

С lsync версии 2.2.3 в Ubuntu

судо нано /etc/lsyncd/lsyncd.conf.lua

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

sync {
    default.rsyncssh,
    source = "/on-local",
    host = "ip-remote",
    targetdir = "/on-remote",
    delay = 1,
    rsync = {
            verbose = true,
            inplace = true,
            _extra = {
                    "--info=progress2"
            }
    },
    ssh = {
            identityFile = "/home/user-local/.ssh/id_rsa",
            options = {
                    User = "user-remote",
                    StrictHostKeyChecking = "no",
                    Compression = "no",
                    Cipher = "aes256-gcm@openssh.com"
            },
            _extra = {
                    "-T",
                    "-c",
                    "aes256-gcm@openssh.com"
            }
    }
}
Другие вопросы по тегам