SSHの安全転送:scp・rsync・SFTPの最適解|chrootと限定ユーザーの作り方

環境&ワークフロー

サーバー運用やインフラ構築において、リモート環境とのファイル転送は日常的に発生する重要なタスクです。しかし、転送手段の選定や権限設計を誤ると、サーバー全体の管理者権限や機密情報が漏洩する重大なセキュリティ事故につながる恐れがあります。

SSHプロトコルを基盤とした安全なファイル転送を実現するには、「用途に応じたプロトコルの適切な使い分け(SFTP / rsync / scp)」「強固なSSH鍵認証基盤」、そして「SFTPのchroot化による限定ユーザー運用(転送専用サンドボックス)」の3つを正しく組み合わせることが実務における最適解です。

本記事は、SSH・セキュアリモート転送クラスターの親ピラー(総合ガイド)として、各プロトコルの選定基準から鍵認証の導入、chrootサンドボックスの構築手順、rsyncによる差分同期、接続トラブルの切り分けまでを体系的に解説します。

【早見表】SSH転送プロトコルの選定と役割分担

ファイル転送を行う前に、まずは要件に合わせて最適なプロトコルを選択しましょう。現在、従来使われてきた scp はレガシー扱いとなっており、SFTP または rsync への移行が推奨されています。

プロトコル特徴・得意用途推奨度詳細ガイド
SFTPSSH上で動作する安全なファイル管理。chrootによる隔離、ユーザー権限制御が容易でGUIクライアント(FileZilla/WinSCP等)にも完全対応。★★★★★
(対話・共有の標準)
sftpコマンドの使い方
rsyncSSH経由(-e ssh)での高速な差分転送・増分バックアップ。ディレクトリミラーリングや定期バッチ処理に最適。★★★★★
(同期・バックアップ標準)
rsyncコマンド完全ガイド
rsync over SSH完全ガイド
scpSSH経由の簡易コピー。構文は直感的だが、内部プロトコルの仕様上の問題から非推奨化が進む。★★☆☆☆
(単発・緊急時のみ)
scpコマンドの使い方
今後はSFTP・rsyncを選ぶ理由

1. 転送手段の役割分担(SFTP / rsync / scp)

各転送プロトコルには設計思想と得意分野があります。それぞれの特性を理解し、業務フローに応じて適切に使い分けましょう。

SFTP:日常的なファイル送受信と安全なユーザー分離の標準

SFTP(SSH File Transfer Protocol)は、SSHセッション内で独立したサブシステムとして動作し、暗号化通信はもちろんのこと、リモートファイルのパーミッション変更、ディレクトリ一覧取得、レジューム(再開)機能などを包括的に提供します。

  • Web制作や外部パートナーへの納品環境など、特定ディレクトリ以外へのアクセスを遮断したい場合に最適。
  • CLI環境だけでなく、GUIツールでの接続性にも優れ、人手によるファイル操作のデファクトスタンダード。

詳しい対話コマンドやオプション一覧については、以下の詳細記事を参照してください。

👉 sftp コマンドの使い方|基本構文・オプション一覧・実行例を解説

scpからSFTP/rsyncへの移行が進む理由(セキュリティと仕様の限界)

長年親しまれてきた scp コマンドですが、OpenSSH 8.0以降、レガシーなRCP(Remote Copy Protocol)プロトコルに起因する脆弱性(ファイル名の意図しない展開やサーバー側でのワイルドカード悪用)が問題視され、非推奨化の流れが進んでいます。

  • 差分転送ができない:同名ファイルがあっても全データを再送するため、帯域と時間を浪費する。
  • 権限分離が困難:scpを許可するとSSHシェルログイン権限も付与せざるを得ず、chrootによる閉じ込めが難しい。

現在ではOpenSSHの scp も内部でSFTPプロトコルを利用するよう改修されていますが、実務では明示的に SFTP または rsync を選択するのがベストプラクティスです。移行の背景とメリットは以下の記事で詳しく解説しています。

👉 scp を使ってきた人向け|今後は SFTP・rsync を選ぶ理由
👉 scp コマンド|SSH を利用したファイル転送の基礎知識

2. SSH認証基盤・セキュリティの徹底

いかに転送プロトコルを正しく選定しても、基盤となるSSHサーバーの認証設定が脆弱であれば意味がありません。安全運用の第一歩は、「パスワード認証の完全禁止」「公開鍵認証の厳格化」です。

公開鍵認証(Ed25519推奨)の導入フロー

従来のRSA(2048/4096bit)に代わり、現在では高速かつ強固な暗号強度を誇る Ed25519 が標準となっています。

# クライアント端末でEd25519鍵ペアを生成
ssh-keygen -t ed25519 -C "admin@example.com"

# リモートサーバーへ公開鍵を安全に転送・登録
ssh-copy-id -i ~/.ssh/id_ed25519.pub user@server_ip

sshd_configのセキュリティ強化(パスワード禁止・ポート変更)

サーバー側の設定ファイル /etc/ssh/sshd_config(または /etc/ssh/sshd_config.d/ 配下)で、パスワードによる総当たり(ブルートフォース)攻撃を遮断します。

# パスワード認証を禁止し、公開鍵認証のみ許可
PasswordAuthentication no
PubkeyAuthentication yes

# rootユーザーの直接ログイン禁止
PermitRootLogin prohibit-password

# 空パスワードの拒否
PermitEmptyPasswords no

設定変更後は、sshd -t で構文エラーがないか確認してからサービスを再起動し、既存の接続セッションを維持したまま別ウィンドウで接続テストを行ってください。

3. 実務最適解|SFTPのchroot化+限定ユーザーで“転送専用箱”を作る

複数人での共同開発や社外クライアントへの納品窓口としてサーバーを開放する場合、ユーザーにシェル操作(Bash)を許さず、指定したフォルダの外を見せない「SFTP chroot限定環境(サンドボックス)」を構築するのが最も堅牢です。

ステップ1:シェル無効化ユーザーの作成

SSHログインを拒否し、SFTP接続のみを受け付ける転送専用ユーザーを作成します。

# sftp専用グループの作成
sudo groupadd sftpusers

# ログインシェルをnologinにしてユーザー作成
sudo adduser --shell /usr/sbin/nologin --ingroup sftpusers sftpuser

ステップ2:公開鍵の登録とパーミッション厳格化

SSHの仕様上、.sshauthorized_keys のパーミッションが緩いと StrictModes により認証が拒否されます。

sudo mkdir -p /home/sftpuser/.ssh
sudo cp /path/to/client_ed25519.pub /home/sftpuser/.ssh/authorized_keys
sudo chmod 700 /home/sftpuser/.ssh
sudo chmod 600 /home/sftpuser/.ssh/authorized_keys
sudo chown -R sftpuser:sftpusers /home/sftpuser/.ssh

ステップ3:sshd_config の Match Group と ChrootDirectory 設定

/etc/ssh/sshd_config の末尾に以下の設定を追記します。internal-sftp は外部プロセスを起動せずsshdプロセス内で完結するため、chroot環境内に複雑なライブラリやバイナリを配置する必要がありません。

# SFTPサブシステムをinternal-sftpに設定(既存のSubsystem行を確認)
Subsystem sftp internal-sftp

# sftpusersグループに対する制限ブロック
Match Group sftpusers
    ChrootDirectory /srv/sftp/%u
    ForceCommand internal-sftp
    AllowTcpForwarding no
    X11Forwarding no
    PermitTunnel no
    PermitTTY no
    PasswordAuthentication no

ステップ4:chrootディレクトリの所有権と書込領域の作成【最重要】

OpenSSHのchroot仕様における最重要ルール
ChrootDirectory に指定されたディレクトリ(およびその親ディレクトリすべて)は、「root所有かつパーミッション755(他者に書込権限なし)」でなければなりません。ここが一般ユーザー所有になっていると、ログイン直後に接続が切断されます。

# 1. chrootルートディレクトリを作成(root所有・755)
sudo mkdir -p /srv/sftp/sftpuser
sudo chown root:root /srv/sftp/sftpuser
sudo chmod 755 /srv/sftp/sftpuser

# 2. ユーザーが書き込めるサブディレクトリを作成
sudo mkdir -p /srv/sftp/sftpuser/upload
sudo chown sftpuser:sftpusers /srv/sftp/sftpuser/upload
sudo chmod 775 /srv/sftp/sftpuser/upload

設定完了後、sudo systemctl restart ssh(RHEL/CentOS系は sshd)を実行し、sftp sftpuser@server_ip で接続テストを行います。ユーザーは /upload 配下に自由にファイルを配置できますが、/srv/sftp/sftpuser より上位のシステム階層を閲覧・変更することは一切できません。

4. rsyncによる安全・高速転送と自動化(差分同期・バックアップ)

大容量データ、Webサイト全体の更新、定期的なログバックアップでは、SFTPよりも rsync の利用が圧倒的に優れています。rsyncは変更のあったブロックのみを圧縮転送するため、ネットワーク帯域と処理時間を最小化できます。

rsync over SSH の基本構文と主要オプション

SSHの暗号化トンネルを経由してrsyncを実行するには、-e ssh オプションを使用します。

# 安全なSSH経由の差分転送(権限・日時保持、圧縮、進捗表示)
rsync -avz -e "ssh -i ~/.ssh/id_ed25519 -p 22" /local/data/ user@remote_server:/backup/data/

# 本番実行前のドライラン(事前シミュレーション)
rsync -avzn --delete /local/data/ user@remote_server:/backup/data/
  • -a(アーカイブ):パーミッション、所有者、タイムスタンプ、シンボリックリンクを忠実に再現。
  • -v(冗長化)/ -z(転送時圧縮):転送効率を高め、状況を把握。
  • --delete:送信元で削除されたファイルを送信先でも削除(完全同期)。
  • -n--dry-run):実際のファイル変更を行わず、対象一覧をテスト確認。

rsyncのコマンド体系、自動化手法、および実践的なバックアップスクリプトは以下の各記事で網羅しています。

5. トラブルシューティング(よくあるエラーと原因切り分け)

リモート転送環境で接続に失敗した場合の主な原因と対処法をまとめました。

エラー症状 / メッセージ主な原因即効対処法
Permission denied (publickey)公開鍵の不一致、パーミッション不備(.sshが700以外、authorized_keysが600以外)。サーバー側のパーミッションを chmod 700/600 に修正。秘密鍵の指定パスを確認。
fatal: bad ownership or modes for chroot directorychrootルートディレクトリがroot以外(ユーザー所有)になっている、または書込権限がある。chrootルートを chown root:root かつ chmod 755 に設定。書込はサブディレクトリに行う。
Connection refusedSSHサービスが停止中、ポート番号の指定ミス、ファイアウォール(UFW/firewalld)遮断。systemctl status ssh で起動確認、-p で指定ポート確認、セキュリティグループ開放。
This service allows sftp connections only.ForceCommand internal-sftp が設定されているユーザーで通常のSSHシェル接続を試みた。シェルログインではなく sftp コマンドまたはSFTPクライアントで接続する。

詳細なデバッグを行うには、クライアント側で詳細フラグ -v(または -vvv)を付与してコマンドを実行します。

# 詳細デバッグモードでSSH/SFTP接続を検証
ssh -vvv user@server_ip
sftp -vvv user@server_ip

エラー原因をステップバイステップで確実に特定するための総合チェックリストは、以下の記事をご活用ください。

👉 SSH接続できないときのチェックリスト|bashで原因を切り分ける手順

まとめ|安全なリモート転送基盤の運用チェックリスト

安全なファイル転送環境を維持するために、構築後も以下の運用チェックリストを定期的に確認しましょう。

点検カテゴリチェック項目推奨状態
認証基盤パスワード認証の無効化PasswordAuthentication no で鍵認証のみ許可
鍵の暗号強度アルゴリズムの選定Ed25519 または RSA 4096bit 以上を使用
アクセス制限chrootとシェル無効化転送専用ユーザーは /usr/sbin/nologininternal-sftp
ディレクトリ権限chrootルートの所有権root:root 所有かつ 755 を厳守
自動同期rsyncの定期実行SSH鍵を指定したcron / systemd-timerで差分バックアップ
監査ログ接続履歴の確認/var/log/auth.logsecure で不審なアクセスを監視

各プロトコル・設定の個別リファレンス

Bash玄

はじめまして!Bash玄です。

エンジニアとしてシステム運用に携わる中で、手作業の多さに限界を感じ、Bashスクリプトを活用して業務を効率化したのがきっかけで、この道に入りました。「手作業は負け」「スクリプトはシンプルに」をモットーに、誰でも実践できるBashスクリプトの書き方を発信しています。

このサイトでは、Bashの基礎から実践的なスクリプト作成まで、初心者でもわかりやすく解説しています。少しでも「Bashって便利だな」と思ってもらえたら嬉しいです!

# 好きなこと
- シンプルなコードを書くこと
- コマンドラインを快適にカスタマイズすること
- 自動化で時間を生み出すこと

# このサイトを読んでほしい人
- Bashに興味があるけど、何から始めればいいかわからない人
- 定型業務を自動化したい人
- 効率よくターミナルを使いこなしたい人

Bashの世界に一歩踏み出して、一緒に「Bash道」を極めていきましょう!

Bash玄をフォローする