一覧NW-17-2 · 周辺プロトコル

SSH接続とSFTPによるファイル転送

ホスト鍵の指紋、利用者の認証記録、ローカルとリモートのパスを確認します。一つのCSVを取得し、元ファイルと保存後のハッシュが一致するところまで確かめます。

説明

SSHではサーバーの身元を確かめた後、利用者を認証します。その接続上で動くSFTPを使うと、接続先と手元のファイルを転送できます。

ホスト鍵の指紋、利用者の認証記録、ローカルとリモートのパスを確認します。一つのCSVを取得し、元ファイルと保存後のハッシュが一致するところまで確かめます。

1接続先の設定

SSHは接続先サーバーのホスト鍵を確認してから、利用者の認証へ進みます。まずfilesという接続名がどのホスト・利用者・ポートを指すか表示します。

ssh -G files適用される接続設定 | grep -E '^(hostname|user|port|stricthostkeychecking) '接続・照合に関係する項目

この設定ではlearnerとして22番へ接続し、ホスト鍵の厳密な照合を行います。接続名filesと実ホスト名は別です。-Gは設定を表示する処理で、認証の成功を示すものではありません。

2管理者から受け取った公開鍵の指紋

server_host.pubは管理者から別経路で受け取ったホスト公開鍵です。SHA-256の指紋を計算し、次の接続記録と照合します。

ssh-keygen -lf公開鍵の指紋を表示 server_host.pub別経路で受け取った鍵

指紋は公開鍵を短く表した値です。ネットワークから取得した未知の鍵だけを根拠に登録すると、接続相手の正しさを確認できません。今回は別経路の公開鍵と一致する鍵をknown_hostsへ登録済みです。

3ホスト鍵確認と利用者認証

接続記録の必要な行を抽出します。ホスト鍵の照合後、利用者の公開鍵認証でログインし、接続先の利用者名とホスト名を確認した記録です。

grep -E記録から該当行を抽出 'Server host key:|is known and matches|Authenticated to|^learner$|^files$' ssh-session.logSSH接続と実行の記録

ホスト鍵はサーバーを確かめるための鍵、利用者認証の鍵はlearnerとして入るための鍵です。同じ「公開鍵」という語でも役割が異なります。learnerとfilesは接続後に実行したwhoamiとhostnameの出力です。

4SFTP接続

SFTPはSSH接続上でファイル操作を行います。接続先のreportsディレクトリを開きます。利用者の認証鍵はこの演習用環境に設定済みです。

sftpSSH上でファイル操作 files:/home/learner/reports/接続先とリモートディレクトリ

ここからはSFTPの対話コマンドです。シェルとは利用できるコマンドが異なります。SFTPの既定ポートはSSHと同じ22番で、FTPをTLS化したFTPSとは別のプロトコルです。

5ローカルとリモートの位置

リモートの現在位置をpwd、手元の現在位置をlpwdで確認します。

pwd接続先の現在位置 lpwd手元の現在位置

同じセッションに二つのファイルシステムがあります。getの転送元はリモート、転送先はローカルです。相対パスがどちらを基準にするかを、転送前に確認します。

6名前を変えてダウンロード

report.csvを手元ではreceived.csvという名前で保存します。

get接続先から取得 report.csv接続先のファイル received.csv手元の保存名

リモートのreport.csvを削除・改名する操作ではありません。手元にreceived.csvができ、接続先の元ファイルは残ります。転送の表示だけで内容まで確認済みとはせず、この後ハッシュを比較します。

7SFTPを終了

転送が終わったら対話セッションを閉じ、手元のシェルへ戻ります。

byeSFTP接続を閉じる

SFTPの接続を閉じても、保存済みのreceived.csvは手元に残ります。次の操作はSFTPコマンドではなくシェルのコマンドです。

8保存内容とハッシュの照合

同じSSH設定で元ファイルのSHA-256を取得し、手元のファイルと比較します。続けて内容も表示します。

ssh files検証済み接続先で実行 'sha256sum /home/learner/reports/report.csv'元ファイルのSHA-256 sha256sum received.csv手元のSHA-256 cat received.csv取得した内容

2行のハッシュが一致し、19バイトの内容もid,statusと42,readyです。ハッシュの一致は転送前後の内容が一致する確認であり、ファイルに書かれた情報そのものが正しいという証明ではありません。

まとめ

ホスト鍵の照合と利用者認証は別の処理です。

転送元・転送先のパスを明示し、保存した内容も照合します。

操作履歴と解説を振り返れます。

シェル / 通信とファイル

1
ssh -G files | grep -E '^(hostname|user|port|stricthostkeychecking) '
user learner
hostname files.example.test
port 22
stricthostkeychecking true
2
ssh-keygen -lf server_host.pub
256 SHA256:bbXpuKG6zhzdmnxq256TlqzFBzRl2f6OOg722cYNbU8 files.example.test (ED25519)
3
grep -E 'Server host key:|is known and matches|Authenticated to|^learner$|^files$' ssh-session.log
debug1: Server host key: ssh-ed25519 SHA256:bbXpuKG6zhzdmnxq256TlqzFBzRl2f6OOg722cYNbU8
debug1: Host 'files.example.test' is known and matches the ED25519 host key.
Authenticated to files.example.test ([192.0.2.40]:22) using "publickey".
learner
files
4
sftp files:/home/learner/reports/
Connected to files.
Changing to: /home/learner/reports/
5
pwd lpwd
Remote working directory: /home/learner/reports
Local working directory: /home/learner/downloads
6
get report.csv received.csv
Fetching /home/learner/reports/report.csv to received.csv
7
bye
8
ssh files 'sha256sum /home/learner/reports/report.csv' sha256sum received.csv cat received.csv
0d5088e08ea46cecfb994cccd6fecae6f4a7948c4b0a94f5500eec103855bf6e  /home/learner/reports/report.csv
0d5088e08ea46cecfb994cccd6fecae6f4a7948c4b0a94f5500eec103855bf6e  received.csv
id,status
42,ready

演習完了