SSHを利用したSCPおよびSFTPによる安全なファイル転送方法
ローカルシステムとリモートシステム間でのファイル転送は、システム管理および開発において基本的な要件です。しかし、標準FTPやRコマンドのような暗号化されていないプロトコルを使用すると、機密データが傍受や攻撃にさらされる可能性があります。セキュアシェル(SSH)プロトコルは、ファイル転送のための堅牢で暗号化された2つの方法を提供します。それが、セキュアコピープロトコル(SCP)とSSHファイル転送プロトコル(SFTP)です。
このガイドでは、SCPとSFTPがSSH暗号化をどのように活用して、転送中のデータの完全性と機密性を確保するかを詳述します。各プロトコルの長所と短所を探り、実用的なコマンドライン例を提供し、安全なファイル管理のための重要なセキュリティベストプラクティスを概説します。
基礎の理解:SSH
SCPとSFTPはどちらも、基盤となるトランスポートレイヤーとしてSSH(通常ポート22で動作)を利用します。いずれかのプロトコルを使用して転送を開始すると、SSHはまずクライアントとサーバーの間に安全で暗号化されたトンネルを確立します。認証資格情報やファイルの内容を含むすべてのデータは、このトンネルを介して送信されるため、どちらの方法もレガシーファイル転送プロトコルに対する非常に安全な代替手段となります。
SSH基盤が提供する主な機能:
- 暗号化: すべてのデータはエンドツーエンドで暗号化されます。
- 認証: パスワード認証と、はるかに安全な公開/秘密鍵ペア認証の両方をサポートします。
- 完全性: 転送中にファイルが改ざんされていないことを保証するために、暗号学的ハッシュを使用します。
セキュアコピープロトコル(SCP)
SCPは、リモートコピープロトコル(rcp)に基づいたネットワークプロトコルですが、SSHのセキュリティでラップされています。シンプルさと速度を重視して設計されており、特にスクリプトや自動化において、迅速で非対話的な転送に最適です。
SCPの機能と特徴
- シンプルさ: 標準のUnix
cpコマンドに非常に似た構文を使用します。 - 速度: 対話的な確認やセッション設定を必要とせず、基盤となるSSHトンネルにのみ依存するため、通常はSFTPよりも高速です。
- 非対話性: 開始されると、セッションを管理したり転送状態を中断したりする能力なしに、転送は完了まで実行されます。
実用的な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はレガシープロトコルと見なされています。SCPプロトコルの設計、特にファイル名の操作に関連する既知の脆弱性により、最新のシステムではSFTPまたはRsync over SSHの使用がますます推奨されています。
SSHファイル転送プロトコル(SFTP)
SFTPはSSHのサブシステムであり、ファイル管理のためのよりリッチで対話的な環境を提供します。純粋なコピーツールであるSCPとは異なり、SFTPはステートフルプロトコルであり、詳細なセッション制御、ファイル一覧表示、削除、名前変更、ディレクトリ作成を可能にします。これは、強化されたFTPセッションに似ていますが、完全に安全です。
SFTPの機能と特徴
- 対話型セッション: 転送は専用の対話型シェルセッション内で行われます。
- 堅牢性: セッション内の個々の転送のシーク、再開、管理をサポートします。
- 完全な管理: セッションコマンド(
put、get、lcd、lmkdir)を使用して、リモートおよびローカルファイルのリスト表示(ls)、ディレクトリの変更(cd)、操作を可能にします。 - セキュリティ: 非常に信頼性が高く、最新の安全なファイル転送の標準と見なされています。
実用的な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対SFTP:適切なツールの選択
どちらのプロトコルも安全ですが、異なる運用ニーズに対応します:
| 特徴 | セキュアコピープロトコル(SCP) | SSHファイル転送プロトコル(SFTP) |
|---|---|---|
| メカニズム | シンプルなコピープロトコル(非対話型) | 対話型ファイル管理プロトコル(ステートフル) |
| ユースケース | クイック、単一ファイル転送。スクリプト/自動化。 | 複雑な転送。ディレクトリ管理。対話型セッション。 |
| 速度 | オーバーヘッドが少ないため、一般的に高速。 | 対話的なハンドシェイクのため、わずかに遅い。 |
| 再開 | サポートが不十分または存在しない。 | 転送の再開とシークを完全にサポート。 |
| セキュリティステータス | レガシー(一部プロトコルに脆弱性あり)。 | 最新、堅牢な標準。 |
SCPを使用する場合: 単純なファイル転送で最大限の速度が必要な場合、および非対話性が望ましいスクリプト内でコマンドを実行する場合にSCPを使用します。
SFTPを使用する場合: ほぼすべての手動ファイル転送、複数のファイルを管理する必要がある場合、ディレクトリを変更する場合、またはセッションの堅牢性と最新のセキュリティ機能が必要な場合にSFTPを使用します。
安全なファイル転送のためのベストプラクティス
SCPまたはSFTPを使用することは最初のステップにすぎません。SSHサーバー上の適切なセキュリティ設定は、リモート環境を保護するために不可欠です。
1. SSH鍵認証を優先する
パスワードベースの認証は、ブルートフォース攻撃に対して脆弱です。ファイル転送の認証には、常に公開/秘密SSH鍵ペアを使用してください。鍵の使用により、自動化または手動転送中のパスワード漏洩のリスクが排除されます。
鍵の生成(必要な場合):
ssh-keygen -t rsa -b 4096
転送に特定の鍵を使用する:
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内のファイルを削除できないようにします。
結論
SSHは、信頼できるリモート操作に必要な不可欠なセキュリティレイヤーを提供します。SCPはスクリプト化されたコピーのための高速で簡単なオプションとして残っていますが、SFTPは包括的なファイル管理に必要な優れた機能セット、対話制御、および最新の堅牢性を提供します。鍵ベースの認証と適切なサーバーサイド設定を活用することで、システム管理者はファイル転送が機能的であるだけでなく完全に安全であることを保証できます。