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 yesinternal-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トンネルやポート転送を使って他のサーバー経路を経由しないための安全策です。
| 項目 | 意味 | 推奨設定 |
|---|---|---|
| AllowTcpForwarding | TCP転送 | no |
| X11Forwarding | X11転送 | 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権限の見直しを定期的に行うことで、長期運用でも堅牢なセキュリティを維持できます。

