SSHでSCPとSFTPを使って安全にファイルを転送する方法

SCPとSFTPを使用してSSH経由で安全にファイルを転送する方法。実用的なコマンド、鍵認証、より安全なサーバー側アクセス制御を含みます。

SSHを使用したSCPとSFTPによる安全なファイル転送方法

ローカルシステムとリモートシステム間でのファイル転送は、システム管理や開発における基本的な要件です。しかし、標準のFTPやRコマンドのような暗号化されていないプロトコルを使用すると、機密データが傍受や攻撃にさらされます。Secure Shell(SSH)プロトコルは、ファイル転送のための2つの堅牢で暗号化された方法を提供します。Secure Copy Protocol(SCP)とSSH File Transfer Protocol(SFTP)です。

このガイドでは、SCPをいつ使用すべきか、SFTPをいつ使用すべきか、そして実際に安全なファイル転送を安全性を損なう一般的な間違いを回避する方法について説明します。

基礎の理解:SSH

SCPとSFTPはどちらも、基盤となるトランスポート層としてSSH(通常はポート22で実行)を利用します。どちらかのプロトコルを使用して転送を開始すると、SSHは最初にクライアントとサーバー間に安全で暗号化されたトンネルを確立します。認証情報やファイルの内容を含むすべてのデータは、このトンネルを通じて送信されるため、両方の方法は従来のファイル転送プロトコルに代わる非常に安全な方法となります。

SSH基盤によって提供される主な機能:

  • 暗号化: すべてのデータはエンドツーエンドで暗号化されます。
  • 認証: パスワード認証と、はるかに安全な公開鍵/秘密鍵ペア認証の両方をサポートします。
  • 整合性: 暗号化ハッシュを使用して、転送中にファイルが変更されないことを保証します。

Secure Copy Protocol(SCP)

SCPは、リモートコピープロトコル(rcp)に基づくネットワークプロトコルですが、SSHのセキュリティでラップされています。シンプルさと速度を重視して設計されており、特にスクリプトや自動化において、迅速で非対話型の転送に最適です。

SCPの機能と特性

  1. シンプルさ: 標準のUnix cpコマンドと非常によく似た構文を使用します。
  2. 速度: 単純な1回限りのコピーでは多くの場合高速ですが、パフォーマンスはSSH実装、暗号、ネットワーク、ファイルセットによって異なります。
  3. 非対話型: 開始されると、転送はセッションを管理したり転送状態を中断したりすることなく完了まで実行されます。

実用的なSCPコマンド

SCPの一般的な構文は scp [オプション] [ソース] [宛先] です。

1. ローカルからリモートサーバーへのファイルコピー

ローカルファイルをリモートユーザーのホームディレクトリにプッシュするには:

scp /path/to/local/file.txt user@remote_host:/home/user/destination/

2. リモートからローカルシステムへのファイルコピー

サーバーから現在のディレクトリにファイルをプルするには:

scp user@remote_host:/var/log/system.log . 
# 注:'.' は現在のローカルディレクトリを示します

3. ディレクトリ全体のコピー(再帰的)

-r(再帰的)フラグを使用して、ディレクトリとそのすべての内容をコピーします:

scp -r /path/to/local/folder/ user@remote_host:/data/backups/

4. 非標準ポートの指定

SSHデーモンが22以外のポートで実行されている場合は、-Pフラグ(大文字のPに注意)を使用します:

scp -P 2222 local_file.zip user@remote_host:/tmp/

SCPに関する注意: 従来のSCPプロトコルの動作には、ファイル名とパス処理に関するリスクの履歴があります。一部の最新のOpenSSHクライアントは、デフォルトでscpにSFTPを内部的に使用しますが、すべてのクライアントやサーバーが同じように動作するわけではありません。新しいワークフローでは、特にSCP互換性が必要でない限り、SFTPまたはSSH経由のrsyncを優先してください。

SSH File Transfer Protocol(SFTP)

SFTPはSSHのサブシステムであり、ファイル管理のためのよりリッチで対話型の環境を提供します。純粋にコピーツールであるSCPとは異なり、SFTPはステートフルなプロトコルであり、同じSSHで保護された接続を介して、ファイルの一覧表示、削除、名前変更、ディレクトリ作成を可能にします。

SFTPの機能と特性

  1. 対話型セッション: 転送は専用の対話型シェルセッション内で行われます。
  2. 堅牢性: セッション内での個々の転送のシーク、再開、管理をサポートします。
  3. 完全な管理: セッションコマンド(putgetlcdlmkdir)を使用した、リモートおよびローカルファイルの一覧表示(ls)、ディレクトリ変更(cd)、操作が可能です。
  4. セキュリティ: トランスポートにSSHを使用し、最新の対話型ファイル転送のためのより良いデフォルトです。

実用的なSFTPコマンド

1. SFTP接続の開始

リモートサーバーへの対話型セッションを開始します:

sftp user@remote_host

特定のポートを使用する場合:

sftp -P 2222 user@remote_host

2. SFTP対話型コマンド

接続すると、デフォルトでリモート環境で操作します。コマンドを使用して転送とディレクトリを管理します:

コマンド 説明
ls リモートファイルの一覧表示 ls -l
cd リモートディレクトリの変更 cd /var/www/html
put ファイルのアップロード(ローカル→リモート) put local_data.zip
get ファイルのダウンロード(リモート→ローカル) get server_backup.tar.gz
lcd ローカルディレクトリの変更 lcd /Users/me/downloads
lpwd ローカルの作業ディレクトリを表示 lpwd
mkdir リモートディレクトリの作成 mkdir new_project
quit SFTPセッションの終了 quit

例:SFTPセッション内でのアップロードとダウンロード

$ sftp [email protected]
sftp> cd /data/backups
sftp> lcd /home/local/reports
sftp> put daily_report.csv  # ファイルをアップロード
Uploading daily_report.csv to /data/backups/daily_report.csv
daily_report.csv                                      100% 512KB   4.3MB/s   00:00    
sftp> get configuration.yaml  # ファイルをダウンロード
Fetching /data/backups/configuration.yaml to configuration.yaml
configuration.yaml                                    100% 20KB    1.1MB/s   00:00    
sftp> quit

SCP vs. SFTP:適切なツールの選択

両方のプロトコルは安全ですが、異なる運用ニーズに対応します:

機能 Secure Copy Protocol(SCP) SSH File Transfer Protocol(SFTP)
メカニズム シンプルなコピープロトコル(非対話型) 対話型ファイル管理プロトコル(ステートフル)
ユースケース 迅速な単一ファイル転送、スクリプト/自動化 複雑な転送、ディレクトリ管理、対話型セッション
速度 単純なコピーでは多くの場合良好 通常は十分な速度で、より多くのファイル管理機能を備える
再開 限定的。堅牢な再開動作には別のツールを使用 より制御された転送操作をサポートするが、クライアントの再開動作は異なる
セキュリティ状況 互換性ツール。従来のプロトコルには設計上の懸念あり SSH経由の管理されたファイル転送に適したデフォルト

SCPを使用する場合: 単純なファイル転送で最大の速度が必要で、非対話性が優先されるスクリプト内でコマンドを実行する場合にSCPを使用します。

SFTPを使用する場合: 実質的にすべての手動ファイル転送、複数のファイルを管理する必要がある場合、ディレクトリを変更する場合、またはセッションの堅牢性と最新のセキュリティ機能が必要な場合にSFTPを使用します。

安全なファイル転送のためのベストプラクティス

SCPまたはSFTPを使用することは最初のステップに過ぎません。リモート環境を保護するには、SSHサーバーでの適切なセキュリティ設定が不可欠です。

1. SSH鍵認証を優先する

パスワードベースの認証はブルートフォース攻撃に対して脆弱です。ファイル転送の認証には常に公開鍵/秘密鍵のSSH鍵ペアを使用してください。鍵を使用することで、自動化または手動の転送中にパスワードが漏洩するリスクがなくなります。

鍵の生成(必要な場合):

ssh-keygen -t ed25519 -C "file-transfer"

転送に特定の鍵を使用する:

scp -i ~/.ssh/my_transfer_key file.txt user@remote_host:/tmp/
# または
sftp -i ~/.ssh/my_transfer_key user@remote_host

2. rootログインを無効にする

rootユーザーを使用した直接のファイル転送は決して許可しないでください。転送は常に専用の低権限ユーザーアカウントで実行する必要があります。管理アクセスが必要な場合は、転送後にリモートマシン上でローカルにsudoを使用してファイルを適切な場所に移動できます。

3. ChrootDirectoryを使用したアクセス制限(SFTP)

外部または信頼できないユーザーにSFTPアクセスを提供するシステムでは、sshd_configファイル内でChrootDirectory制限を実装してください。これにより、SFTPユーザーを特定のディレクトリに閉じ込め、ファイルシステムの残り部分を閲覧できなくなります。

/etc/ssh/sshd_configでの設定例:

Match User sftp_external_user
  ForceCommand internal-sftp
  ChrootDirectory /var/sftp/%u
  AllowTcpForwarding no
  X11Forwarding no

4. 権限を制限する

転送に使用されるユーザーアカウントには、そのタスクに必要な最小限の権限のみを付与してください(最小権限の原則)。ユーザーが/data/uploadsにファイルをアップロードするだけでよい場合は、/etc/config内のファイルを削除できないようにしてください。

まとめ

対話的にファイルを参照、アップロード、ダウンロード、または管理する必要がある場合は、デフォルトでSFTPを使用してください。サーバーを信頼し、クライアントの動作を理解している単純な互換性のケースにはSCPを使用してください。どちらの場合も、コマンドをSSH鍵、最小権限アカウント、および厳格なディレクトリ権限と組み合わせてください。