キャリテク!マガジン
- TOP
- キャリテク!マガジン
- 転ばぬ先のバックアップ (6) 外部ホストへファイルをバックアップしよう - sftp 自動実行編
転ばぬ先のバックアップ (6) 外部ホストへファイルをバックアップしよう - sftp 自動実行編
こんにちは。株式会社パイプラインの濱田です。
前回は自ホストにあるファイルをsftpコマンドでリモートホストへバックアップしました。今回はリモートホストにあるファイルをローカルホストへバックアップする作業を自動化してみましょう。
本稿では、リモートホストのファイルをバックアップとして格納するサーバーを便宜上ローカルホストと称することにします。
[事前準備] ローカルホストで鍵ペアを作成し、リモートホストへ公開鍵を登録する
sshやsftpでのログインを無人で運転するには、主に以下2つの方法があります。
- sshpass パッケージをインストールしてsshpassコマンドを経由してsshやsftpコマンドにパスワード文字列を渡しリモートホストへ接続する
- パスワードの代わりに秘密鍵と公開鍵のペアを作成し、sshやsftpは鍵認証を利用してリモートホストへ接続する
sshpassは、パスワード認証におけるパスワード入力待ちを回避しつつ、パスワードを人間の代わりに入力するためのアプローチです。鍵認証は、そもそもパスワードを利用せずに認証を行うアプローチですが、ここで作成および利用する鍵ペアにはパスフレーズを設定しないことに留意してください。どちらのアプローチを利用するかの検討ですが、実運用環境に新たなパッケージを勝手にインストールするわけにもいきませんし、ここは公開鍵認証を利用することにしましょう。
パスフレーズなしの鍵ペアを作成する
すでに他の用途で鍵ペアが存在している場合に誤って鍵を上書きしてしまう事故を防ぐため、ファイル名を指定して鍵ペアを作成することにします。今回作成する鍵ペアの暗号方式はRSA 4096ビット、ホームディレクトリ直下にSFTP_ID_RSAというファイル名で作成します。
また、鍵ペア作成時にパスフレーズの入力を求められますが、エンターキーのみを押下し、パスフレーズなしで作成することにします。ここでパスフレーズを入力してしまうと、sftp自動運転時に都度人間によるパスフレーズ入力を求められてしまい、自動運転の意味をなさなくなってしまうからです。
それでは以下のコマンドで鍵ペアを作成しましょう。
ssh-keygen -t rsa -b 4096 -f /home/nullpopopo/SFTP_ID_RSA |
途中、「Enter passphrase (empty for no passphrase):」と表示される行で入力待ちになりますが、パスフレーズを設定しないので、エンターキーのみを押下します。同様に、次の行で「Enter same passphrase again:」と表示されてこちらも入力待ちになりますが、こちらもエンターキーのみ押下します。それでは鍵ペアができたか確認してみましょう。
nullpopopo@DESKTOP-FUJ2F2G:~$ ls | grep SFTP_ID_RSA SFTP_ID_RSA SFTP_ID_RSA.pub |
SFTP_ID_RSA が秘密鍵で、SFTP_ID_RSA.pubが公開鍵となります。そしてこの公開鍵"のみ"をリモートホストの authorized_keys ファイルに登録します。今回はローカルホスト、リモートホストともにnullpopopoユーザーでログインしますので、リモートホストの /home/nullpopopo/.ssh/authorized_keys ファイルに SFTP_ID_RSA.pub ファイルの内容を追記します。
鍵ペア運用時の注意点
- 秘密鍵と公開鍵はペアとなりますので、秘密鍵は紛失したり他者へ漏洩したりしないようにしてください(公開鍵ファイルは紛失しても秘密鍵から再生成可能)。
- リモートホストへ公開鍵を登録する際、既存の公開鍵を誤削除しないように気をつけてください。
あらかじめ、今回作成した鍵ペアでログインできるか確認しましょう。
nullpopopo@DESKTOP-FUJ2F2G:~$ sftp -i /home/nullpopopo/SFTP_ID_RSA example.com The authenticity of host 'example.com (192.168.31.28)' can't be established. ECDSA key fingerprint is SHA256:wHMB/MxunqelNRFOTz6NJdQ9/RPO0b2l49PJ8rPBRpY. Are you sure you want to continue connecting (yes/no/[fingerprint])? yes <- yes回答する Warning: Permanently added 'example.com,192.168.31.28' (ECDSA) to the list of known hosts. Connected to example.com. sftp> quit <- quitコマンドでsftpのシェルを抜ける |
いちどsftpコマンドを非バッチモードで実行してホストキーを登録しないと、後述するバッチモード接続で「Host key verification failed.」というエラーが表示されてしまいますので、本番運用前に接続確認を行う習慣をつけるとよいでしょう。
リモートホストのファイルをローカルホストへバックアップする
先ほど作成した鍵ペアでsftpログインできたことが確認できましたので、以下テキストファイルを作成してバッチモードでsftpコマンドを実行し、リモートホストのファイルをローカルホストへバックアップしましょう。
cd /home/nullpopopo/WORKDIR get example.com_dmesg.txt quit |
上記3行のテキストファイルを、今回はホームディレクトリ直下に「SFTP_COMMANDS.txt」として保存します。そして、以下のコマンドを実行し、バッチモードでsftpコマンドを実行します。下記コマンドは行が折り返されていますが、1行で実行します。
sftp -i /home/nullpopopo/SFTP_ID_RSA -b /home/nullpopopo/SFTP_COMMANDS.txt nullpopopo@example.com |
上記コマンド実行時に与えた引数を解説しますと、 -i オプションの後に秘密鍵ファイルを指定し、 -b オプションの後にバッチコマンドを記述したテキストファイルを指定し、リモートホストへ接続しています。sftp接続に成功すると、下記のようにコマンド処理の流れがターミナルに表示されます。
sftp> cd /home/nullpopopo/WORKDIR sftp> get example.com_dmesg.txt sftp> quit |
ローカルホスト側でlsコマンドを実行し、example.com_dmesg.txtファイルがあればバッチモードでのsftpを用いたリモートホストのファイルバックアップは成功です。あとはcronに登録して無人で定期的にファイルのバックアップを行うことが可能になります。
さて、前回と今回は、単一のファイルをsftpコマンドでバックアップする方法について取り上げましたが、次回は以下の要求をかなえる、少しすすんだバックアップの手法について解説したいと思います。
- ディレクトリ単位で複数のファイルやディレクトリを再帰的にバックアップしたい
- すべてのファイルをネットワーク越しに転送せず、更新されたファイルのみを転送するようにしたい
- リモートホスト側で削除されたファイルはローカルホスト側でいつまでも保持したくない
まずはエンジニアデビューしたい、という方は、3ヶ月間学びながらお給料が貰える AltX キャリテク!の門を叩いてみてはいかがでしょう。
https://www.kcct.co.jp/careetec/