ロリポに SSH で公開鍵接続して rsync でサーバー同期をしてみる

ロリポのレンタルサーバー(以下、PUB)とステージングサーバー(以下、STG)をSSH公開鍵接続でrsyncを使い同期させてみました。

たぶん、さくらのレンタルサーバーなど、SSHとrsyncコマンドが使える他のレンタルサーバーでも同じやり方で出来ると思います。

なお、ステージングサーバーは普通のLAMP環境です。ConoHaに建ててあります。

目的は、ブラウザからボタンを押すと STG -> PUB へ同期が行われるツールを作ることです。

手順は以下の通りです。

  1. ロリポの管理画面でSSHの有効化
  2. 鍵の設置
  3. STGからSSHで接続確認
  4. スクリプトの作成
  5. 権限変更(visudoなど)
  6. サーバーのfingerprintを取得
  7. phpでブラウザ画面を作成

ロリポの設定(PUB側)

管理画面でSSHを有効化

まず、ロリポはスタンダード以上の契約でないとSSHが使えないとのことです。

管理画面のサイドカラムメニューから [サーバーの管理・設定] – [SSH] を選択しSSHを有効化します。

サーバー、アカウント、ポート、パスワードが表示されますので、これらの接続情報に基づいてターミナル(ちなみに私は、WindowsではRLogin、MacではiTerm2を使用しています。)でパスワードログインをしてみます。

鍵を設置

ターミナルでアクセスしたら、とりあえず自分の居場所を確認です。

$ pwd
/home/users/0/main.jp-YourAccount

$ll -a
drwx-----x  4 main.jp-YourAccount LolipopUser 4096 2017-11-05 17:07 .
drwxr-xr-x  3 root                root              4096 2017-11-01 18:27 ..
-rw-------  1 main.jp-YourAccount LolipopUser  779 2017-11-06 16:50 .bash_history
drwx---r-x 17 main.jp-YourAccount LolipopUser 4096 2017-09-29 12:14 web

.sshディレクトリを作成し鍵を作成します。

# 鍵を保存するディレクトリの作成
$ mkdir .ssh
$ chmod 700 .ssh

# 鍵の作成
$ ssh-keygen -t rsa
# 鍵にパスフレーズは設定せず、何も入力しないでEnterを連打します。

# 鍵のファイル名変更と権限変更
$ mv ~/.ssh/id_rsa.pub ~/.ssh/authorized_keys
$ chmod 600 ~/.ssh/authorized_keys

# 秘密鍵を表示しコピーしてPCのテキストなどに保存
$ cat ~/.ssh/id_rsa

# 秘密鍵を削除するか000に権限変更
$ chmod 000 ~/.ssh/id_rsa
# または
$ rm ~/.ssh/id_rsa

ステージングの設定(STG側)

STGからSSHで接続確認

秘密鍵をSTGの然るべき場所に保存します。

今回の接続では最終的にapacheから接続させたいので、/var/www/以下に/key/というディレクトリを作成して保存することにしました。(公開ディレクトリ(/var/www/html/)の一個上の階層になります。

$ mkdir /var/www/key
$ vim /var/www/key/lolipop.id_rsa
# 秘密鍵のテキストを貼り付け

$ chmod 700 /var/www/key
$ chmod 600 /var/www/key/lolipop.id_rsa

さっそくsshで接続できるか試してみます。

# ポート番号、アカウント@サーバーの部分は実際の接続情報に合わせて変更
$ ssh -i /var/www/key/lolipop.id_rsa -p 2222 main.jp-YourAccount@YourServer.lolipop.jp

スクリプトの作成

rsyncのスクリプトを保存します。

今回は、/var/www/sh/というディレクトリを作って、websync.shというファイル名で以下の内容を保存しました。

権限は、chmodで700にしておきます。

なお、rsyncの場所は、which rsync で確認して下さい。うちのサーバーは、/bin/rsync でした。

#!/bin/sh
/bin/rsync -avu --exclude '.well-known/' --exclude '.htaccess' --delete /var/www/html/ -e "ssh -i /var/www/key/lolipop.id_rsa -p 2222" main.jp-YourAccount@YourServer.lolipop.jp:/home/users/0/main.jp-YourAccount/web/

同期元のディレクトリには、Let’s Encrypt用のテンポラリディレクトリと.htaccessファイルがありましたので、これらは同期対象から除外しておきました。

一方、PUB側はファイルの更新やアップロードが無いサイトなので、–deleteオプションを付けて、同期元に無いファイルは削除する設定にしてあります。

権限変更

先ほどのスクリプトはphpから呼び出したいので、鍵ファイルとスクリプトの所有権をapacheに変更しておきます。

$ chown apache:apache -R /var/www/key
$ chown apache:apache -R /var/www/sh

visudoで、apacheの権限を変更します。

$ visudo

# 以下を一番下に追加します。
Defaults:apache  !requiretty
apache  ALL=(ALL) NOPASSWD: /bin/rsync

# apacheにログインできるようにします。
$ vim /etc/passwd
#apacheユーザの /sbin/nologin を /bin/bash に変更


# 接続先サーバーのfingerprintを保存できるようにするため、ディレクトリを作ります。
# なお、初回のSSH接続で違うディレクトリを指示されたら、その指示されたディレクトリを作成してください。
$ mkdir /usr/share/httpd/.ssh
$ chown -R apache:apache /usr/share/httpd/.ssh
$ chmod 700 /usr/share/httpd/.ssh

これで、apacheがパスワードなしで rsync を sudo できるようになります。

apacheにやらせたくなければ、別のアカウントを作って設定すると良いでしょう。

サーバーのfingerprintを取得

apacheにsuして、rsyncコマンドを実際に走らせてみます。

いきなり公開ディレクトリに同期してしまうのもどうかと思うので、PUB側に test というディレクトリを作成し、そこに同期をしてみることにします。

websync.sh を編集して、同期先アドレスを /home/users/0/main.jp-YourAccount/test/ に変更しておきます。

$ su apache
$ /var/www/sh/websync.sh

# fingerprint を保存するかどうか聞かれるので、yesとタイプします。

phpでブラウザに表示画面を作成

phpについては、コアの部分だけ書いておきます。

submit ボタンを押したら、例えば、以下のようなPHPを呼び出してrsyncを実行すると良いと思います。

<?php
  $command = "/var/www/sh/websync.sh";
  $output = array();
  $ret = null;

  exec ( $command, $output, $ret );

  foreach($output as $v){
    $resultStr .= $v."<br>";
  }
?>

また、atコマンドを使えば日時指定も可能です。

使用上の注意

rsyncのみに限定しているとはいうものの apache が sudo できて、また、ログインできるようにしているので、ちょっと’アレ’な感じです。

というわけで rsync 用のユーザーを別に作成して、それにやらせるのも良いかと思います。

しかしながら、どういう形にするにせよウェブページから rsync を動かすことには変わらないので、STG側への一般アクセスは排除しておいたほうが良いでしょう。

それから、アタリマエですが秘密鍵のお取り扱いは厳重に。

ご利用は自己責任でお願い致します。

コメント