SFTPとは
SFTPは、SSHの安全な接続上でファイル操作・転送を行うプロトコルです。正式名称はSSH File Transfer Protocol(エスエスエイチ・ファイル・トランスファー・プロトコル)で、エスエフティーピーと読みます。
SSHがサーバーのホスト鍵確認、利用者認証、暗号化、改ざん検知を済ませた後、SSH接続プロトコルのsubsystem(サブシステム)チャネルとしてSFTPを開始します。別のデータ接続を開かず、同じSSH接続内でファイル操作を要求します。
SFTPは単にファイルのバイトを流す機能ではなく、ディレクトリー一覧、属性取得、ファイルを開く、位置を指定して読む・書く、名前変更、削除などを要求・応答で行う遠隔ファイルシステム型のプロトコルです。

版を合意し、要求IDと状態応答で操作結果を対応付ける
クライアントの版を提示し、サーバーが対応版と拡張名を返す
パス、読書き、作成条件を送り、サーバー内の不透明なハンドルを受け取る
ハンドル、オフセット、長さとデータを使い、複数要求を並行できる
要求IDに対応するデータ、名前、属性、成功・失敗コードを受ける
一時ファイルを閉じ、対応する名前変更機能で公開名へ移す
ファイル・ディレクトリーハンドルを閉じ、終了結果と保存物を検証する
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」