Ubuntu (Linux) と QNAP (NAS) 間で rsync - その 3 / 3
rsync は SSH 越しでも行えるので、QNAP の SSH サーバーをセットアップすれば、「VPN を経由した NFS による rsync」(👉 その 2)という少々器用な真似をせずに済むようになる。
※ただし、QNAP の SSH は admin しかログインできない点には留意する。以下の作業ではすべて、admin で SSH 接続するためのものである。
QNAP の SSH 環境を整備する
- 自機側で RSA キーペアを作成する。
ssh-keygen -t rsa -C "作成するキーペアに関するコメント情報"
- 作成したキーペアのうち、公開鍵(id_rsa.pub)の方を QNAP (NAS) へ scp コマンドで転送する。当然、この際は、QNAP 側の SSH サービスはオンにしておく必要があり、admin アカウントとパスワード認証で scp の処理を実行することになる。
scp ~/.ssh/id_rsa.pub admin@(NAS IP Address):~
(admin にとっての ~ へコピー) - SSH で QNAP に admin でログインし、~/id_rsa.pub を ~/.ssh/authorized_keys へ(追記)コピーする
cat id_rsa.pub >> .ssh/authorized_keys
chmod 600 .ssh/authorized_keys
rm id_rsa.pub
以上で、QNAP 側の準備は終わり。 - SSH から一旦ログアウトし、再び SSH で QNAP にログインすると、(自機側によって)パスフレーズを尋ねられる。問題なければ、ログインに成功する。これでパスワード認証ではなく、公開鍵認証によるログインができるようになった。
- ※自機にある作成したキーペアはちゃんと管理しておくこと(セキュリティ面と、バックアップ面の両面において)
一応、SSH を利用するための作業としては以上である。SSH というのは、公開鍵をサーバー側にアップロードしておいて(公開鍵をアップロードできるのは、本人であるという前提による)、その公開鍵(サーバー側)と暗号鍵(本人側)をペアで使って、本人認証を行うというのが基本コンセプト。
ただし実用上の問題として、QNAP ではパスワード認証によるログインの方も依然として可能な状態のままなので、セキュリティ的に好ましい状態ではない。
QNAP の SSH でパスワード認証を潰しておく
これをやろうとすると、実は結構、複雑。ネットでもいくつか情報が見つかるが、少し古かったりするせいか、そのままでは動かなかったり、また他の情報をツギハギしたような情報だったりで、イマイチ洗練されていなかったりしたので、それなりに納得行く方法に辿り着くために、工夫を要した。
1. qpkg.conf の編集
/etc/config/qpkg.conf に自動起動アプリのエントリーを追記する:1) 自機にダウンロード(scp)して、2) 編集し、3) QNAP の /etc/config にコピー(scp)して戻す。
[autorun] Name = autorun Version = 1.0 Author = scaredeer Date = 2016-07-15 Shell = /share/homes/admin/autorun.sh Install_Path = /share/homes/admin QPKG_File = autorun.qpkg Enable = TRUE
※起動スクリプトは、wiki の説明にあるような複雑怪奇な path に置く必要はなく、admin の home フォルダに置けばよい。この方が普通に FTP などで更新できるので、全然スマート。
2017-08-30 追記:最近、QTS をアップデートしたところ、autorun が無効になり、SSH のパスワード認証が自動で無効化されなくなった。すぐに解決方法がわからなかったので、そのまま放置していたら、今日、SSH に対する brute force 攻撃が発生し、NAS から警告メールが 5 分毎に送信され続けた(ログイン異常は 5 分間 ban する設定)。とりあえず、攻撃元の IP を永久 ban して対応したものの、やはり SSH のパスワード認証が有効なのが気になり、今日、改めて調べたら、「QNAP QTS4.3.3で自作QPKGがブロックされたので対処」という完全に一致するケースのナイスな記事を見付け出すことができ、上の qpkg.conf の QPKG_File = autorun.qpkg
のエントリーを追加することで、解決した。
2. autorun.sh
下のような autorun.sh を自機で作成し、/share/homes/admin に置き(FTP、scp を使うなどする)、パーミッションを適切に設定(chmod +x)する。
#!/bin/sh
echo "Shutting down SSHd services:"
/sbin/daemon_mgr sshd stop /usr/sbin/sshd
/usr/bin/killall sshd
rm -f /var/lock/subsys/sshd
echo "SSHd"
/bin/sed -i -e 's/#PasswordAuthentication yes/PasswordAuthentication no/g' /etc/ssh/sshd_config
echo "Disabled SSHd Password Authentication in config file: /etc/ssh/sshd_config"
echo "Restarting SSHd services:"
/sbin/daemon_mgr sshd start '/usr/sbin/sshd -f /etc/ssh/sshd_config -p $(/sbin/getcfg LOGIN "SSH Port" -d 22)'
echo "SSHd"
(Ref. How do I disable password access for the default SSHd?)
※1 この起動スクリプトは、sed コマンドの実行を前提とする。Entware-ng をインストールするなどして、sed が使える状態を整えておく必要がある。
※2 この起動スクリプトでは、ssh の常駐アプリを一旦停止してから、sshd_config の該当する 1 行(PasswordAuthentication)を yes から no に変更している。これもやはり、情報元では一部が間違っていてそのままでは動かなかったので、適切な形に修正してある。
3. 確認
NAS をリブートし、自機からパスワード認証ではログインできないことを確認する。
通常では、公開鍵認証で SSH が接続されてしまうので、公開鍵認証を禁止してパスワード認証で接続させるには、自機の SSH コマンド実行時に、以下のようなオプションで実行する:
ssh -o PreferredAuthentications=password -o PubkeyAuthentication=no admin@XXX.XXX.XXX.XXX
※ポートをデフォルトの 22 から変更している場合は、ポート番号も指定する必要があることに留意する。
パスワード認証によるログインが拒絶されると、次のようなメッセージとなる。
Permission denied (publickey,keyboard-interactive).
SSH のポートの変更
以上までの作業が成功したら、最後にセキュリティのため、SSH のポートをデフォルトの 22 から変更する(QNAP の Web UI から設定する。上の autorun.sh の中での SSH Port の値は 22 のままでも、Web UI から設定したポート番号で問題なく稼動するようだ)。例えば 50022 であれば、ssh では -p 50022
という風にオプションを追加すればいいし、rsync においても -e 'ssh -p 50022'
という風にすれば、ポートを指定できる。
ssh admin@XXX.XXX.XXX.XXX -p 50022
注意
最初に注記したように、以上はすべて admin アカウントで QNAP にログインすることが前提となっている。アカウントを admin 以外で行う方法は、ない(sshd_config をいじっても無理;任意のユーザーアカウントを使って SSH でログインできるようにするには、QNAP デフォルトの SSH ではなく、OpenSSH を別途インストールして使うしか方法はない)。この点はセキュリティ面での潜在的リスクであることは、よく認識しておく必要がある。QNAP のセキュリティ設定のネットワークアクセス保護機能を使うなどして、潜在的リスクに対して備えておくこと。
そして rsync
以上で、rsync から直接、SSH 経由で同期できる。NFS はもはや必要ないし、SSH をポートマップして公開すれば、VPN を経由する必要もない(さらに myQNAPcloud の機能を使えば、XXX.XXX.XXX.XXX の部分を ???.myqnapcloud.com にできる。)。
rsync -e 'ssh -p 50022' -auv --delete --progress src_folder admin@remote_address:dest_path
コメント
コメントを投稿