2013-08-26 53 views
8

私は> 5日間検索し、数多くのトリックとヒントを試してみました。root以外のログインを使用するためのlsync設定

イメージがアップロードされるときにイメージディレクトリを同期させる必要のある2台のRed Hat 6.3 Webサーバーがあります。どんなサーバにアップロードするのかを制御することはできませんが、アップロードされたサーバにはアップロードされません。

root以外のユーザーの資格情報を使用するようにlsyncに指示するだけで済みます。当社の情報セキュリティチームは、パスワードなしのルートアクセスを許可しません。私がそれらを責めるとは言えません。

私はsudoアクセス権を持っているアカウントを持っており、ファイルを宛先に送るために必要なすべてを実行します。私は同期をうまくやるためにrsyncを得ることができますが、lsyncから実行すると権限が拒否されたエラーで失敗します。

lsyncで実行されたコマンドをログからコピーして、角括弧を削除しても正常に同期できます。だから、私はそれが問題を引き起こしているlsyncだと確信しています。単にルートとして実行されているためです。シェルスクリプトは、それを強制的にrootとして実行します。私はそれを非rootアカウントに変更しようとしていて、すべてのサポートファイルがスクリプトと共に変更され、それでも同期を拒否しています。

は、ここで私が持っているスクリプトやファイルの詳細です: OS:Red Hat Linuxのバージョン6.3(サンティアゴ) 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台のWebサーバを持っています。
  2. 画像は、移動先のサーバーを制御せずにアップロードされます。
  3. アップロードの際に両方のサーバーを更新するデーモンとしてlsyncd/rsyncを使用して同期アーキテクチャを設計しています。つまり、両方のサーバーでlsyncd/rsyncdを削除せずに実行する必要があります。削除されないと仮定すると、両方のサーバが同じ時刻に別のイメージを取得した場合、最初にサーバがターゲットを最初にチェックした場合、ソース上にないため、ターゲット上のファイルが削除されます。

画像を1つのサーバーに転送する方法を理解しようとしていましたが、削除オプションを使用して両方のサーバーで同期サービスを行うことを心配せずに両方のサーバーを正確に同期させることができましたタイミングのために。また、あるファイルが開いていて、他のサーバーがそのファイルを削除しようとすると、何が起こるかわからない。

私は助けてもらえないので、私は絶望的です。多分それはできないかもしれませんが、この強力なアプリはセキュリティ上の懸念を持っている人には完全に使えないようにするこの愚かな小さな欠陥を持つようです。

ありがとうございます!

+2

あなたはこれでどこに行くでしたか? –

+0

これに関するリードは? –

+0

同じことをやっている。非ルートのための実行可能な解決策がないと考えるのは難しいです。私はターゲット上でrootログインを許可するかもしれません。 – Hal50000

答えて

8

lsyncd.confファイルのrsyncopts部分にユーザー名とキーファイルを設定する必要があります(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を設定することもできます。所有者とグループを保持するにはまた、作成日を保存するためのオプションもあります。詳しくは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" 
     } 
} 
関連する問題