2015年10月5日月曜日

[lsyncd] lsyncd + rsync のリモートでsudoする設定


lsyncdを使って、ファイル同期(rsync)したい時に、同期先でsudoしたい場合があります!(ownerを同期元と合わせたいとか)

そういう時に、rootじゃなく一般ユーザーでsudoを使って、実現する方法です!

lsyncd使う手順はいくつか見つかるし、
「セキュリティのために、一般ユーザーでsudoやるといいよ!」って書いてある割にはやり方が書いてない!ってことで。

自分のメモ用に残しておこうと思います!


もくじ



前提条件

  • OSはAmazon Linux(たぶんほかのLinuxでも大丈夫かと)
  • EPELリポジトリを利用(lsyncd インストールのため)
  • sudo使う
  • sshは「パスフレーズなし」

手順

  • rsyncのインストール
  • 「パスフレーズなし」のssh-keyを作る
  • ssh pubkeyの配置
  • (同期先) sudo の設定
  • (同期元のみ) lsyncdのインストール(EPEL)
  • (同期元のみ) lsyncdの設定

rsyncのインストール

本当はAnsibleでやっているんだけど、とりあえず手順

rsyncが必要なので、入れます!
sudo yum install rsync


「パスフレーズなし」のssh-keyを作る

  • キーペアを作成
ssh-keygen -b 2048
  • ログ
Generating public/private rsa key pair.
Enter file in which to save the key (/home/snicker_jp/.ssh/id_rsa): ./rsync.pem
Enter passphrase (empty for no passphrase):
Enter same passphrase again:
Your identification has been saved in ./rsync.pem.
Your public key has been saved in ./rsync.pem.pub.
The key fingerprint is:
07:84:a5:90:cb:ea:81:d4:2e:02:7e:9b:XX:XX:XX:XX snicker_jp@localhost
The key's randomart image is:
+--[ RSA 2048]----+
|    .. oo        |
|    ...o         |
|  o. .. .        |
|.E .o    .       |
|+.+.    S .      |
|o+oo     .       |
|..+.*            |
|  .= o           |
|    .            |
+-----------------+

ssh pubkeyの配置

  • 公開鍵の配置
ここは適宜やりやすい方法で!
ssh-copy-id -i ./rsync.pem.pub user@remote_host

(同期先)sudo の設定

  • 同期先でsudoが使えるようにします!(今回はrsyncユーザーを使いました)
/etc/sudoers.d/sudo-rsync
(参考設定)
Defaults:rsync !requiretty
rsync ALL= NOPASSWD:/usr/bin/rsync


(同期元のみ) lsyncdのインストール(EPEL)

  • EPELのリポジトリを使ってインストール
sudo yum install lsyncd --enablerepo=epel
※ epelのリポジトリ、なければ設定しておいてくださいね!

(同期元のみ) lsyncdの設定

  • /etc/lsyncd.conf (今回のキモ!)
ちなみにlsyncdのバージョンはlsyncd-2.1.5-0でした。

(参考設定)
settings {
   logfile = "/var/log/lsyncd/lsyncd.log",
   statusFile = "/var/log/lsyncd/lsyncd-status.log",
   statusInterval = 20
}
 
sync {
    default.rsync,
    delay = 0,
    source="/var/www/html",
    target="rsync@192.168.100.100:/var/www/html/",
    rsync = {
        archive = true,
        rsync_path = "sudo /usr/bin/rsync",
        rsh = "ssh -i /home/rsync/.ssh/rsync.pem -o StrictHostKeyChecking=no"
    }
}


ここの部分がキモですかね!

    rsync_path = "sudo /usr/bin/rsync",
rsyncをよくわかっている方なら、すぐできたんでしょうが。。。

よく知らなかったものでw

まとめ

  • rsync_pathオプションが要です!
  • lsyncdで、rsyncするときに「root」を使わなくてよくなりました!
  • これで、パーミッション揃えられます!!(^o^)

参考


Zenback