2016年7月17日日曜日

Ubuntu (Linux) と QNAP (NAS) 間で rsync - その 3 / 3

rsync は SSH 越しでも行えるので、QNAP の SSH サーバーをセットアップすれば、「VPN を経由した NFS による rsync」(その 2)という少々器用な真似をせずに済むようになる。

※ただし、QNAP の SSH は admin しかログインできない点には留意する。以下の作業ではすべて、admin で SSH 接続するためのものである。

QNAP の SSH 環境を整備する

  1. 自機側で RSA キーペアを作成する。ssh-keygen -t rsa -C "作成するキーペアに関するコメント情報"
  2. 作成したキーペアのうち、公開鍵(id_rsa.pub)の方を QNAP (NAS) へ scp コマンドで転送する。当然、この際は、QNAP 側の SSH サービスはオンにしておく必要があり、admin アカウントとパスワード認証で scp の処理を実行することになる。
    scp ~/.ssh/id_rsa.pub admin@(NAS IP Address):~ (admin にとっての ~ へコピー)
  3. 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 側の準備は終わり。
  4. SSH から一旦ログアウトし、再び SSH で QNAP にログインすると、(自機側によって)パスフレーズを尋ねられる。問題なければ、ログインに成功する。これでパスワード認証ではなく、公開鍵認証によるログインができるようになった。
  5. ※自機にある作成したキーペアはちゃんと管理しておくこと(セキュリティ面と、バックアップ面の両面において)

一応、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 に変更している。これもやはり、情報元では一部が間違っていてそのままでは動かなかったので、適切な形に修正してある。

4. 確認

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

0 件のコメント:

コメントを投稿