Mono Works

チラシのすきま

SSHを利用してrsyncでファイル同期

以前作ったスクリプトでrsyncを使ったファイル同期(アップロード)について紹介しましたが、今回はSSHを使ったよりセキュアな rsyncによる同期について紹介します。

2018-07-31-rsync-with-ssh01

SSHとは

ネットワーク上をやり取りする情報が平文で流れていると、ネットワークを盗聴された場合、重要な情報やパスワードなどが簡単に漏れてしまいます。これを防ぐため、情報を暗号化して送信する手段が開発され、そのひとつの手段として、SSH(Secure Shell)プロトコルが利用されてます。

SSHを利用するためのソフトウェア

SSHを利用するには、SSHサーバとSSHクライアントが必要で、オープンソースで開発されているOpenSSHには、この2つが含まれてます。OpenSSHは、Linuxに標準でインストールされていて、もちろんWSLでも使えます。OpenSSHの詳細については、下記ページが参考になります。

参考:OpenSSH 日本語マニュアルページ

SSHの認証方式

SSHの認証方式としては、公開鍵認証、パスワード認証、ワンタイムパスワードなどが提供されており、今回紹介するのは、公開鍵認証方式です。パスワード認証は、接続先のユーザアカウント(ユーザ名とパスワード)を使った認証で、セキュリティ的に弱いため無効にされている場合もあります。

公開鍵認証方式

公開鍵認証とは、ローカル環境においてペアで生成する2つの鍵(公開鍵と秘密鍵)のうち、公開鍵をログイン先のサーバに登録することで、登録された公開鍵に対応した秘密鍵を持つクライアントのみが接続できるようになる認証方式です。ペアの鍵と表現されますが、イメージとしては、鍵と錠前といった感じです。

各種パラメータの例

ローカル(WSL)の環境例

WSLのユーザホームディレクトリ /home/yourId

さくらインターネット側の環境例

FTPサーバ hogehoge.sakura.ne.jp
FTPアカウント hogeId
初期フォルダ www
パスワード hogePass
  • さくらのレンタルサーバは、root権限がありません。

公開鍵と秘密鍵をローカルに生成

既存の鍵を確認

デフォルトの鍵生成場所(/home/yourId/.ssh/)に移動して、既存のSSH鍵があるか確認。あれば、名前を違うものにするなど対応する。

cd ~/.ssh
ls -al

鍵の生成

生成する鍵の強度が高いほど破られにくいものになります。鍵の強度などについては、こちらが参考になります。今回は、コメント付きで ECDSA 384bitの鍵を生成することにしました。オプションの詳細は、man見て、適宜設定。

ssh-keygen -t ecdsa -b 384 -C "HomePC"

鍵の保存先を聞かれますが、変更しないので、そのまま Enter

次に、パスフレーズを求めらます。パスフレーズは、仮に秘密鍵が漏洩してもパスフレーズを知らないと使用できないようにするための設定です。

なお、rsyncをパスフレーズ入力なしで同期できるようにするには、未設定にしておかないといけません。単に未設定なだけだとなんだか片手落ちといった感じなので、パスフレーズ未設定でも安全性を高める方法について、次回紹介します。

今回は、パスフレーズを入力して Enter

ペアで鍵(id_ecdsaid_ecdsa.pub)が生成されるので確認。.pubが付いていない方が秘密鍵で、付いている方が公開鍵。

$ cd ~/.ssh
$ ls -l
# 秘密鍵(id_ecdsa)のパーミッションが 600 であることを確認
-rw------- 1 yourId yourId 379 Jul 30 21:11 id_ecdsa
-rw-r--r-- 1 yourId yourId 216 Jul 30 21:11 id_ecdsa.pub

# ついでに中身も確認
cat ~/.ssh/id_ecdsa
cat ~/.ssh/id_ecdsa.pub

参考:2017年版 SSH公開鍵認証で使用する秘密鍵ペアの作り方

リモート先に公開鍵を設置

暗号通信を使って公開鍵をさくらのレンタルサーバへ送信

ローカルで生成した公開鍵(id_ecdsa.pub)をさくらレンタルサーバに送信して、その中身を~/.ssh/authorized_keysに書き出します。ファイル送信には、ローカルとリモート間の通信を sshにより暗号化してファイルをコピーする scpコマンドを使います。

# ファイルを送信
scp /home/yourId/.ssh/id_ecdsa.pub hogeId@hogehoge.sakura.ne.jp:

初めてSSHで接続する際には、本当に接続していいか?と聞かれるので yesと入力して Enter。その後、パスワードを聞かれるので、FTPサーバのパスワード hogePassを入力して Enter。(この時点では、まだ公開鍵認証によるSSH接続はできないので、パスワード認証によりSSH接続をしています)

# SSHでsakuraにログイン後、authorized_keysに書き出し
cat id_ecdsa.pub >> /home/hogehoge/.ssh/authorized_keys

パーミッションを変更

authorized_keysのパーミッションを変更します。もう、この時点で公開鍵認証にてサーバにログインします。

# SSHでログイン
$ ssh hogeId@hogehoge.sakura.ne.jp
# パスフレーズを設定している場合は、パスフレーズを入力してEnter
Welcome to FreeBSD!

% # ログイン成功

# コピーした公開鍵(authorized_keys)のパーミッションを 600 に変更
% chmod 600 ~/.ssh/authorized_keys

# ファイルの状態を確認
% ls -al ~/.ssh

# 問題なければログアウト
% exit

さくらのレンタルサーバでは、~/.sshフォルダはデフォルトでパーミッションが700になってますが、そうでなければ、chmod 700 ~/.sshでフォルダのパーミッションも変更します。

SSHを利用したrsync(パスフレーズあり)

直前の作業で、公開鍵認証方式によるSSHログインには成功しているので、これまでと同じ rsyncコマンドを実行すると、サーバのパスワードは聞かれずにパスフレーズを聞かれるようになります。

今回は、鍵にパスフレーズを設定したので、仮に秘密鍵が漏洩してもパスフレーズを知らないと使用できません。随分とセキュアになりました。

次回に向けて

現在は、記事を書いて、手動でファイルの同期(アップロード)をおこなっている程度なので、パスフレーズを入力するのは大した手間ではないです。しかし、rsync + ssh + cron で自動バックアップを実行させたい場合など、パスフレーズを入力せずに同期させたいので、パスフレーズを未設定にします。

というわけで、次回は、パスフレーズ未設定にする代わりに、なるべく安全性を高める方法を紹介します。

コメント

コメントなどありましたら、GitHubのディスカッションへお願いします。(書き込みには、GitHubのアカウントが必要です)
執筆者
"ぽぽろんち" @pporoch
pporoch120
Mono Worksの中の人。好きなことをつらつらと書き留めてます。
ギターを始めてから 練習動画をYouTubeにアップしてます。ご笑納ください。
"DQX@ぬここ(UD487-754)、コツメ(NO078-818)"
採用案内