rsync+sshでのバックアップのセキュリティ強化

※記事内に商品プロモーションを含む場合があります

自宅サーバー(ラズパイ)とさくらのVPSで相互にバックアップを
rsync+sshで行っています。

自宅サーバはSSHをポート開放していないので、バックアップは自宅サーバから
VPSに接続し行っています。

今回、VPSを入れ替えを行ったので、
rsync+sshでのバックアップのセキュリティ強化をしてみました。
【関連】VPSのサーバOSをCentOS8からUbuntuに移行

rsync+sshでのバックアップ方法

基本的なコマンドはこの様になっています。
このコマンドではローカルにある/dataの内容をリモートの/backupにバックアップします。

/usr/bin/rsync -az –delete -e ‘/usr/bin/ssh -i /ed25519 -p 22’ /data user@remote_server:/backup

説明を付けるとこの様になります

/usr/bin/rsync -az –delete -e ‘/usr/bin/ssh -i 【秘密鍵】 -p 【ポート】’ 【ローカル】【ユーザー】@【ホスト】:【リモート】 

秘密鍵と公開鍵がペアになっており、
ペアの公開鍵を、リモートの/home/【ユーザー】/.ssh/authorized_keys
に登録する事で、秘密鍵が使える様になります。

問題点

このコマンドでは、パスフレーズが使えませんので
パスフレーズ無しの秘密鍵を使う事になります。

もし、この秘密鍵が漏れたら、第三者がSSHにアクセスできてしまい、
sudoユーザーだったら、サーバのroot権限も奪う事が出来てしまいます。

そこで、authorized_keysでオプションを追加する事で
特定のコマンド(引数含む)しか実行出来ない様にする事で
セキュリティ性を強化します。

セキュリティ強化の方法

まず、秘密鍵と、公開鍵のペアを作ります。

サーバ上のopensshコマンドでも作れますが、
ファイルのコピーが面倒なので、私はTeraTermで作っています。

設定→SSH鍵生成(N)をクリックすると、SSH鍵生成画面になります。
鍵の種類は、ED25519を使用しました。

生成ボタンをクリックされると、内部で生成されて、
秘密鍵と、公開鍵を保存できます、
この時、パスフレーズは必ず空にします。

秘密鍵を保存する時に、
空のパスフレーズを使用しますか?と聞かれますが
「はい」をクリックして、秘密鍵を保存します。

リモートでauthorized_keysの登録

公開鍵をリモートのauthorized_keysに登録します。

authorized_keysは、ログインしているユーザーがuserなら
/home/user/.ssh/authorized_keys
にあります。

公開鍵はこの様になっています。

ssh-ed25519 AAAAC3NzaC1lZDI1NTE5AAAAINI02aDQIFkju3lVgl0ruVC6SddV10g1fuLpS8hqeArs

これをviなどでコピーすれば
SSHでログインできてししまうので、この様にします。

command=”rsync” ssh-ed25519 AAAAC3NzaC1lZDI1NTE5AAAAINI02aDQIFkju3…

先頭にcommand=”rsync” を入れる事でrsyncしか実行出来なくなります。

ただこのままだと、何の引数もない”rsync”しか実行できないので
後々修正します。

authorized_keysは改行する事で複数の公開鍵を追加出来ます。

.ssh/authorized_keysにcommand="rsync"オプションを追加した公開鍵を追加

私のVPSのauthorized_keysですが、一番上から

  • SSH接続用でパスフレーズ有
  • VPS→自宅サーバーへのバックアップ
  • 自宅サーバー→VPSへのバックアップ
  • テスト用

となっています。

実行コマンドの取得

ローカルではこのコマンド

/usr/bin/rsync -az –delete -e ‘/usr/bin/ssh -i /secret -p 22’ /data user@remote_server:/backup

を実行しますが、リモートで実行されるコマンドが分からないので
リモートで実行されるコマンドを取得します。

上のコマンドを修正し、この様にします。

/usr/bin/rsync -arvz –delete -e ‘/usr/bin/ssh -v -i /secret -p 22′ /data user@remote_server:/backup

このコマンドを実行する事で、エラーにはなりますが
デバッグ情報が表示されます。

この中に、リモートで実行されるコマンドが確認できます。

デバッグ情報の中にdebug1: Sending command:があり
このSending command:がリモート上で実行されるコマンドです。

デバッグ情報の中から、debug1: Sending commandでリモートで実行されるコマンドが確認できる

このrsyncから始まるコマンドをauthorized_keysの
command=””のrsyncと入れ替える事でコマンドが実行できる様になります。

参考にしたサイト


追加

最近ランサムウェアなどが怖いので
ファイルが改ざんされている場合はバックアップを実行ない様にしました。

ローカル、リモートともにwebサーバは稼働しているので
response.txtを作って、適当な文字列(BEAXJP)で保存。

response=$(curl -s https://local.server/response.txt)
if [ "$response" = "BEAXJP" ]; then
/usr/bin/rsync -az --delete -e '/usr/bin/ssh -i /secret -p 22' /data user@remote_server:/backup
fi

シェルスクリプトでこの様にする事で
改ざんされている場合は、バックアップを実行しない様にしています。