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

SSH経由でのファイル転送を安全に行うには、SFTPのchroot化と限定ユーザーの運用を基本にするのが最適です。
scpやrsyncも便利ですが、環境や運用設計を誤ると、意図せずサーバー全体にアクセスできるリスクが生じます。

ここでは、安全性・再現性・保守性の3点を両立する「SFTP chroot+限定ユーザー+鍵認証」を中心に整理します。

転送手段の役割分担(SFTP=標準/rsync=差分・大量/scp=簡易)

ファイル転送の主な手段は3つあります。

  • SFTP:標準的で安全。ユーザー分離・権限制御が容易。GUIツールも多く、最も汎用的。
  • rsync:差分転送が得意で大量データやバックアップに最適。同期タスクに向く。
  • scp:一時的な転送には手軽だが、再帰や上書きの扱いに注意が必要。

日常的な転送や共有用途にはSFTPを、定期同期にはrsyncを、緊急や小規模用途にscpを使う、という住み分けが基本です。

最小権限・分離・監査性を満たす設計方針

転送専用のユーザーを作成し、ホームディレクトリ外へ出られないようにすることで、安全性を確保します。
加えて、鍵認証+パスワード認証無効化により総当たり攻撃を防ぎ、監査性を保ちます。

特にchroot(ルートディレクトリ制限)設定は、ユーザーを特定ディレクトリ内に閉じ込め、
他領域へのアクセスを防ぐ仕組みです。internal-sftp と組み合わせることで、転送専用の安全な環境を構築できます。

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

最も安全で再現性の高い構成は、「SFTP専用ユーザー+chrootディレクトリ+鍵認証」です。
これにより、ファイル転送専用の“箱”を作り、他のシステム領域を完全に遮断できます。

限定ユーザー作成・鍵登録(PasswordAuthentication無効化)

転送専用ユーザーを作成します。

sudo adduser sftpuser --shell /usr/sbin/nologin

nologin にすることでSSHログインを禁止し、SFTP経由のみを許可します。

公開鍵認証を設定します。

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

パスワード認証を無効化します。
/etc/ssh/sshd_config 内で次を確認または追加します。

PasswordAuthentication no
PubkeyAuthentication yes

internal-sftp+ChrootDirectory+Match設定(書き込みはサブディレクトリ)

SFTPを内部サーバーで制御し、ユーザーを特定ディレクトリに閉じ込めます。

sudo vim /etc/ssh/sshd_config

次のように追記します。

Match User sftpuser
    ChrootDirectory /srv/sftp/%u
    ForceCommand internal-sftp
    AllowTcpForwarding no
    X11Forwarding no
    PermitTunnel no
    PermitTTY no
  • /srv/sftp/%u はユーザーごとに独立した転送領域。

chroot対象ディレクトリの所有者はrootでなければならない点に注意。
例:

sudo mkdir -p /srv/sftp/sftpuser/upload
sudo chown root:root /srv/sftp/sftpuser
sudo chmod 755 /srv/sftp/sftpuser
sudo chown sftpuser:sftpuser /srv/sftp/sftpuser/upload

こうして /upload 以下にのみ書き込みできる安全な構造が完成します。

禁止設定(Port/Agent/X11/Forwarding/PTYの無効化)

上記の Match ブロック内に含めた各禁止設定は、SFTPユーザーがSSHトンネルやポート転送を使って他のサーバー経路を経由しないための安全策です。

項目意味推奨設定
AllowTcpForwardingTCP転送no
X11ForwardingX11転送no
PermitTunnelトンネル機能no
PermitTTY端末利用no

設定を保存後、SSHを再起動して反映します。

sudo systemctl restart ssh

これで、SFTP専用の安全転送ユーザーが構築できました。
以後のファイル操作は sftp sftpuser@server で安全に行えます。

用途別の使い分けと注意点(rsync/scp)

安全なSFTP環境を整えたら、次は用途に応じてrsyncやscpを使い分けます。
それぞれ得意分野が異なり、設定や挙動を誤ると権限エラーやデータ破損を招くことがあります。

大量・頻繁な同期はrsyncを活用する

大量のファイルや定期的なバックアップにはrsyncが最適です。
転送先との内容を比較し、変更差分だけを同期するため、効率と信頼性に優れます。
さらに、--delete オプションを使うと削除も反映でき、ミラー構成を保ちやすくなります。

rsyncの基本構文では、SSH鍵を指定して安全な通信を確保します。
-a は権限やタイムスタンプを保持し、-e でSSH経由を指定します。
除外パターンを使えばログなど不要なファイルを転送対象から外せます。

scpを使う場合の留意点

scpは単純なコピーには便利ですが、再帰的なディレクトリ転送では慎重さが必要です。
転送先に同名ファイルがあると上書きされるため、事前確認が欠かせません。
また、タイムスタンプが保持されないケースがあり、履歴管理を重視する運用には不向きです。
安定運用を優先するなら、scpよりSFTPやrsyncの利用を基本とする方が安全です。

権限と所有権の落とし穴(chroot要件:所有権root・パーミッション厳格)

SFTPのchroot環境では、ルートディレクトリの所有者がrootでなければ接続が拒否されます。
また、ディレクトリのパーミッションは基本的に755が必要です。
アップロード可能なフォルダだけをユーザー所有(例:uploadフォルダ)にし、他の階層はroot所有のまま維持します。
所有権設定を誤ると、ログイン直後に「failure」エラーが発生するため注意が必要です。

まとめ|安全運用チェックリストと次アクション

本記事が設定できたら、次は安全運用の維持と自動化が重要です。
初期設定で安全でも、更新やバックアップ時の緩みが脆弱化を招きます。定期的な点検を習慣化しましょう。

チェックリスト(鍵・chroot・限定化・ログ・バックアップ試験)

安全な転送基盤を保つための代表的な確認項目は以下の通りです。

チェック項目内容
鍵認証パスワードログインを無効化し、公開鍵でのみ接続できるか確認
chroot構成/srv/sftp/ユーザー名 がroot所有で、uploadのみユーザー所有になっているか
限定ユーザー/usr/sbin/nologin でSSHシェルを制限し、SFTP専用化されているか
転送ログ/var/log/auth.log などでアクセス履歴を定期確認しているか
バックアップ試験rsyncで安全な差分バックアップ を実行し、復元テスト済みか

これらを月次などのサイクルでチェックすることで、長期的な安定運用が可能になります。

自動化(cron/systemd-timer)と失敗検知通知へ

安全運用を次の段階へ進めるなら、バックアップや同期処理を自動化しましょう。
cronやsystemd-timerを使えば、夜間に自動転送・同期が可能です。
併せて、rsyncエラー検知の実装 を組み合わせれば、失敗時に即通知でき、復旧対応の遅れを防げます。

安全な転送環境を整えた後は、rsync同期のsystemd化 を通じて運用の定型化を進めましょう。
構成が安定したら、SSH鍵の更新とchroot権限の見直しを定期的に行うことで、長期運用でも堅牢なセキュリティを維持できます。

Bash玄

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

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

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

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

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

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

Bash玄をフォローする