用語辞典・通信プロトコル

SFTP

SFTPとは

SFTPは、SSHの安全な接続上でファイル操作・転送を行うプロトコルです。正式名称はSSH File Transfer Protocol(エスエスエイチ・ファイル・トランスファー・プロトコル)で、エスエフティーピーと読みます。

SSHがサーバーのホスト鍵確認、利用者認証、暗号化、改ざん検知を済ませた後、SSH接続プロトコルのsubsystem(サブシステム)チャネルとしてSFTPを開始します。別のデータ接続を開かず、同じSSH接続内でファイル操作を要求します。

SFTPは単にファイルのバイトを流す機能ではなく、ディレクトリー一覧、属性取得、ファイルを開く、位置を指定して読む・書く、名前変更、削除などを要求・応答で行う遠隔ファイルシステム型のプロトコルです。

ホスト鍵と利用者を確認したSSH接続内に、ファイル操作用のサブシステムチャネルを開くハンドルと位置を使って読み書きし、完了確認後に一時名から目的名へ置き換える
クライアントがSSHサーバーのホスト鍵を確認して利用者認証し、暗号化トンネル内の一つのSFTPサブシステムチャネルでディレクトリーを開き、ファイルを区間ごとに読み書きし、完了確認、名前変更、一覧、ハンドル終了を行い、単純コピー方式とは分ける図解
図1図の処理順は安全なアップロード例です。すべてのサーバーが同じ拡張、原子的な名前変更、属性を支えるとは限りません。

版を合意し、要求IDと状態応答で操作結果を対応付ける

転送前後のファイル操作を、個別の要求と応答として追跡する接続成功、ファイルを開けたこと、保存完了を別々に確認する
Initialize版と拡張を確認

クライアントの版を提示し、サーバーが対応版と拡張名を返す

Openハンドルを得る

パス、読書き、作成条件を送り、サーバー内の不透明なハンドルを受け取る

Read / Write位置を指定

ハンドル、オフセット、長さとデータを使い、複数要求を並行できる

Status結果を対応付ける

要求IDに対応するデータ、名前、属性、成功・失敗コードを受ける

Rename目的名へ置換

一時ファイルを閉じ、対応する名前変更機能で公開名へ移す

Close資源を解放

ファイル・ディレクトリーハンドルを閉じ、終了結果と保存物を検証する

図2SFTPの版と拡張対応は実装で異なります。接続時の版番号だけで、すべての高位機能が利用できるとは判断しません。

SSHのホスト鍵確認と利用者認証を、そのまま安全性の土台にする

クライアントは最初にSSHサーバーのhost key(ホスト・キー/ホスト鍵)を確認します。既知の鍵、管理者が配布した指紋、SSH証明書などと照合し、予期せず変わった場合は接続先変更、再構築、攻撃の可能性を調べます。

その後、公開鍵署名、パスワード、多要素などで利用者を認証します。ホスト鍵は「相手サーバー」、利用者鍵は「接続する利用者」を確認するための別の鍵です。暗号化表示だけで進めず、最初のホスト鍵を信頼する根拠と、変更時の確認経路を決めることが重要です。

ハンドルとオフセットにより、区間ごとの読み書きと再開ができる

OPENに成功すると、サーバーは内部ファイルを指す不透明なハンドルを返します。READ・WRITEはそのハンドルと先頭からのオフセットを指定するため、クライアントは複数区間を先行要求し、往復遅延のある経路でも待ち時間を減らせます。

中断後の再開は、ローカルとリモートのサイズ・更新時刻などを比べ、続きのオフセットから送る実装があります。しかし途中で内容が変われば、同じサイズでも不正な結合になります。再開前の識別条件、転送後のサイズ、必要ならハッシュを確認します。

一時ファイルへ送り、完了後に名前を切り替える

公開中のファイルへ直接上書きすると、転送途中の内容を別処理が読む、失敗後に半端なファイルが残る危険があります。同じディレクトリーの一時名へ書き、クローズ・同期・検証後に目的名へ名前変更する方法がよく使われます。

上書き時の原子性、既存ファイルがある場合の動作、サーバー固有のposix-rename拡張などは確認が必要です。ファイルシステムをまたぐ移動はコピーと削除になり、同じ性質を持たない場合があります。

権限、所有者、時刻、シンボリックリンクの意味はOS間で一致しない

SFTPはサイズ、時刻、権限などの属性を扱えますが、POSIX権限、Windows ACL、所有者IDの対応はサーバー実装で異なります。クライアント表示の権限文字列が、保存先の最終アクセス制御を完全には表さないことがあります。

シンボリックリンクをたどるか、リンク自体を操作するか、パス区切り、文字エンコーディング、名前の正規化も相互運用差が出ます。アップロード可能なルートを固定し、親ディレクトリー参照やリンク経由で範囲外へ出ないようサーバー側で制限します。

SFTP、SCP、FTPSは、同じ安全なファイル転送の別名ではない

FTPSはFTPの制御・データ接続をTLSで保護します。SFTPはSSH内の一チャネルで、FTPのコマンドやパッシブポート範囲を使いません。証明書、SSHホスト鍵、ポート、認証方式は互換ではありません。

SCP(Secure Copy/セキュア・コピー)はSSHを使うコピー手段の名称ですが、伝統的なSCPプロトコルとSFTPは別です。現行のscpコマンドが内部でSFTPを使う実装もあるため、コマンド名ではなく、実際の転送プロトコル、必要機能、サーバー側制限を確認します。

仕様の確認資料:IETF Draft「SSH File Transfer Protocol」RFC 4251「SSH Protocol Architecture」RFC 4254「SSH Connection Protocol」

関連用語