私は 5 日以上検索し、数多くのトリックやヒントを試し、さらには lsync の作成者に助けを求めようとしましたが、すべて無駄でした。
イメージがアップロードされたときにイメージ ディレクトリを同期する必要がある 2 つの Red Hat 6.3 Web サーバーがあります。アップロード先のサーバーを制御することはできませんが、アップロード時に他のサーバーにロードされることはありません。
root 以外の別のユーザーの資格情報を使用するように lsync に指示できるようにする必要があるだけです。当社の情報セキュリティ チームは、パスワードなしのルート アクセスを許可しません。私が彼らを責めているとは言えません。
ファイルを目的地に送るために必要なすべてを実行するためのsudoアクセスを持つアカウントがあります。rsync で同期を正常に実行することはできますが、lsync から実行すると、権限が拒否されたというエラーで失敗します。
ログから lsync によって実行されるコマンドをコピーし、角かっこを削除して、正常に同期することもできます。したがって、問題を引き起こしているのは lsync であると確信しています。単にルートとして実行されているためです。シェル スクリプトは、root として実行することを強制します。root 以外のアカウントに変更しようとしても、すべてのサポート ファイルがスクリプトと共に変更されましたが、依然として同期を拒否しています。
私が持っているスクリプトとファイルの詳細は次のとおりです。 OS: 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.
注: 私はファイルをサニタイズし、ソースとターゲットの場所に関するアプリケーションの意図をすべて理解していると想定しました。
したがって、目的を明確にするために、次のようにします。
- 負荷分散された 2 つの Web サーバーがあります。
- 画像は、送信先のサーバーを制御せずにアップロードされます。
- アップロードが発生したときに両方のサーバーを更新するデーモンとして lsyncd/rsync を使用して同期アーキテクチャを設計しています。これは、両方のサーバーが削除なしで lsyncd/rsyncd を実行する必要があることを意味します。削除なしは、両方のサーバーが同時に異なるイメージを取得した場合、どちらのサーバーが最初にターゲットをチェックした場合でも、ターゲット上のファイルはソース上にないため、ターゲット上のファイルを削除すると想定しています。
彼らは、画像を 1 つのサーバーに送信する方法を見つけようとしていると話していました。その後、削除オプションを使用して、両方のサーバーに同期サービスがあり、タイミングのために 1 つが失われることを心配することなく、両方のサーバーを正確に同期させることができました。また、一方のファイルが開いていて、もう一方のサーバーがそれを削除しようとした場合に何が起こるかわかりません。
著者に助けを求めることさえできないので、私は必死です。実行できないかもしれませんが、この強力なアプリには、セキュリティ上の懸念がある人が完全に使用できなくなるような、ばかげた小さな欠陥が 1 つあるように思われます。
ありがとう!