SFTP chrootの実装手順: OpenSSHでのファイル転送の制限と保護

Linux

<景品表示法に基づく表記> 本サイトのコンテンツには、商品プロモーションが含まれている場合があります。

SFTPを利用して複数のユーザー間でディレクトリやファイルを共有したり、移動できるディレクトリ範囲を制御したりすることは可能です。ただし、設定が面倒くさい。

  • OpenSSHを利用してSFTP環境を構築したい
  • 複数ユーザー間でディレクトリやファイルを共有したい
  • chrootを利用して移動できるディレクトリを制限したい

これから、SFTP環境を構築するユーザーに情報提供します。

SFTP とは「SSH+FTP」のこと

SFTPについて

SFTP(Secure File Transfer Protocol)は、ファイルの安全な転送と管理を可能にするネットワークプロトコルの一種です。

SFTPは、データの暗号化とセキュリティのためのプロトコルであり、通信路を通じてファイルを転送する際にデータの機密性と完全性を保護することができます。

SFTPはSSH接続で暗号化された通信を利用してファイル転送を行う仕組み

SFTPはSSHのサブモジュールを利用し「sftp」コマンドを発行しファイルの転送を行います。つまり、SFTPはSSHを利用する技術でありFTPとは全く別のものです。

コマンドはFTPとほぼ同じなので接続が出来てしまえば、FTPと同じように利用することができます。SFTPはFTP(File Transfer Protocol)のセキュリティ版として考えることができます。

FTPはセキュリティが不足しており、パスワードやデータが平文で送信されるため、セキュアな環境でのファイル転送にはSFTPを選ぶことが推奨されます。

SFTPの利用用途

SFTPを使用する主な特徴と用途は次のとおりです。

  • セキュリティ: SFTPはデータを暗号化し、安全な通信チャネルを提供します。これにより、データの傍受や不正アクセスから保護されます。
  • ファイル転送: SFTPはファイルをサーバーからクライアントやクライアントからサーバーに転送するために使用されます。これは、リモートサーバーとのファイル共有やバックアップなど多くの用途に適しています。
  • リモートファイル管理: リモートサーバー上のファイルを操作、編集、削除するためにも使用されます。管理者やユーザーは、セキュアな方法でリモートファイルシステムにアクセスできます。
  • 自動化: SFTPはスクリプトや自動化ツールと統合でき、定期的なファイル転送やバッチ処理を容易に行えます。

FTP chroot環境はセキュリティとアクセス制御を強化し、不正アクセスやシステムへの悪影響を最小限に抑えるのに役立ちます。

SFTP で chroot 環境が必要な理由

SFTPでchroot(Change Root)環境が必要な理由は、セキュリティとアクセス制御の強化を主な目的としています。

SFTP chroot環境はセキュリティとアクセス制御を強化し、不正アクセスやシステムへの悪影響を最小限に抑えるのに役立ちます。

  • セキュリティ向上: chroot環境を設定することで、SFTPユーザーはリモートサーバー上で自分のホームディレクトリ以下のみにアクセスできるよう制限されます。これにより、不正なファイルやコマンドがシステム全体にアクセスするのを防ぎ、セキュリティを向上させます。
  • プライバシーの保護: ユーザーごとに独自のchroot環境を設定することで、異なるユーザー間でのファイルやディレクトリの共有を防ぎ、プライバシーを保護します。各ユーザーは自分の環境内でのみ操作できるため、他のユーザーのデータへの不正なアクセスが難しくなります。
  • システムの安定性: chroot環境は、ユーザーがシステム全体に影響を及ぼすことを制限します。ユーザーが誤ってシステムファイルを削除または変更する可能性を低減し、システムの安定性を維持します。
  • アクセス制御: chroot環境を設定することで、管理者は特定のユーザーがアクセスできるディレクトリを制御できます。必要に応じて、ユーザーごとに異なるアクセス許可を設定でき、セキュアなアクセス制御を実現します。
  • 適切なリソース制約: chroot環境を使用することで、各ユーザーの利用可能なリソース(ディスクスペース、メモリ、CPU)を制限できます。これにより、サーバーの過負荷を防ぎ、公平なリソース共有を実現します。

SFTPを利用する場合は、デフォルト設定を辞めてchroot環境を構築することをオススメします。

SFTP chroot環境の設定方法(基本)

忘れたらハマる。chroot環境を使用する必須条件

chrootするルートディレクトリは、所有者と権限を固定する必要があります。

  • 所有者を root:root にする
  • パーミッションを 755 にする

ルートディレクトリの所有者を root に設定するため、ルートディレクトリ直下のディレクトリやファイルに対してSFTPユーザーは書き込み権がありません。

自由にディレクトリやファイルを追加・削除する場合は1階層下を利用する必要があります。

SFTPユーザーを作成する(個別ユーザー)

SFTPを利用するユーザーアカウントを作成します。個々にSFTPを利用する場合は、通常のアカウント作成を実施してください。

# useradd sftp-user
# password sftp-user
# chown root:root /home/sftp-user
# mkdir /home/sftp-user/chroot
# chown sftp-user /home/sftp-user/chroot

ログインを証明書認証で制御する場合はパスワードの設定は不要です。

この構成 /home/sftp-user は、root アカウントのみがアクセスできるルートディレクトリです。サブディレクトリ /home/sftp-user/chroot に書き込み権を付与します。

SFTPユーザーを作成する(グループ)

SFTPを利用できるユーザーをグループで制御したい場合は、SFTP用のグループを作成してSFTPを利用するユーザーをグループに参加させてください。

グループを利用すると後述する sshd_config の設定を汎用的に記述することが可能となります。

# groupadd sftp-group
# useradd sftp-user -G sftp-group
# password sftp-user
# chown root:root /home/sftp-user
# mkdir /home/sftp-user/chroot
# chown sftp-user:sftp-group /home/sftp-user/chroot

ログインを証明書認証で制御する場合はパスワードの設定は不要です。

この構成 /home/sftp-user は、root アカウントのみがアクセスできるルートディレクトリです。サブディレクトリ /home/sftp-user/chroot に書き込み権を付与します。

sshd_configを修正する

/etc/ssh/sshd_config ファイルを修正し chroot 環境を設定します。

# chroot の場合 
# override default of no subsystems
Subsystem       sftp    /usr/libexec/openssh/sftp-server

# 個別ユーザーを指定する場合
Match User sftp-user
 ChrootDirectory /home/sftp-user
 ForceCommand internal-sftp

# グループを指定し汎用的に設定する場合
Match Group sftp-group
 ChrootDirectory %h
 ForceCommand internal-sftp

ChrootDirectory は、変数を使用して chroot のパスを指定することができます。

  • %h  : ホームディレクトリを指定
  • %u  : 認証されたユーザーのユーザー名を指定

設定後はサービスを再起動し、設定を反映させてください。

# systemctl restart sshd

複数ユーザーでディレクトリ・ファイルを共有する手順(応用)

Webコンテンツを複数ユーザーが更新する場合

SFTP chroot環境はセキュリティとアクセス制御を強化し、不正アクセスやシステムへの悪影響を最小限に抑えるのに役立ちます。

Webコンテンツを複数ユーザーで更新するような場合は、移動できるディレクトリを増やしたいので、chrootのアクセス制御は相性が悪いです。

複数ユーザーで共有できるディレクトリ・ファイルが、ユーザーのホームディレクトリ以外の場所に提供されていた場合、chroot環境ではアクセスできません。

chroot環境は、指定したルートディレクトリより上位階層に移動することができません。つまり、シンボリックリンクは利用できないことを意味しています。

上位階層のディレクトリにアクセスするための解決策は、mountコマンドのbindオプションを利用します。bindオプションを利用すると、既にマウントされているディレクトリを再マウントできます。

mount コマンドの bind オプションを利用

複数ユーザーでディレクトリ・ファイルを共有する場合は、mountコマンドのbindオプションを利用することで SFTP chroot 環境でアクセスすることが可能となります。

# mount --bind /var/www/html /home/sftp-user/chroot

再起動しても自動的にマウントするように /etc/fstab 設定ファイルを修正します。

# /etc/fstab

/var/www/html /home/sftp-user/chroot none bind 0 0

あとがき

SFTPは、ファイルの安全な転送と管理を可能にするネットワークプロトコルの一種です。

昔からファイル転送によく利用されているFTPは、セキュリティが不足しており、パスワードやデータが平文で送信されるため、セキュアな環境でのファイル転送のSFTPに置き換わっています。

SFTPを利用する場合は、chroot環境を設定することを推奨します。

SFTP chroot環境はセキュリティとアクセス制御を強化し、不正アクセスやシステムへの悪影響を最小限に抑えるのに役立ちます。

複数ユーザーで共通のディレクトリやファイルを操作するような環境でも、mount コマンドの bind オプションを利用することで実現することが可能となります。