ファイルの転送のみに使用する (システムへの ssh には使用しない) アカウントをシステムにセットアップする場合は、この記事で説明されているように SFTP Chroot Jail をセットアップする必要があります。
典型的な sftp シナリオ (chroot sftp がセットアップされていない場合) では、sftp を使用すると、以下に示すように root のファイルが表示されます。
ファイルを転送するために外部ベンダーにシステムへの sftp アクセスを許可する場合は、標準の sftp を使用しないでください。代わりに、以下で説明するように Chroot SFTP Jail をセットアップする必要があります。
非 Chroot SFTP 環境
次の例 (典型的な sftp 環境) では、john はシステムに sftp でアクセスし、/etc フォルダーを表示して、そこからファイルをダウンロードできます。
# sftp [email protected] john@thegeekstuff's password: sftp> pwd Remote working directory: /home/john sftp> ls projects john.txt documents sftp> cd /etc sftp> ls -l passwd -rw-r--r-- 0 0 0 3750 Dec 29 23:09 passwd sftp> get passwd Fetching /etc/passwd to passwd /etc/passwd 100% 3750 3.7KB/s 00:00
Chroot SFTP 環境
次の例では、john はシステムに sftp でき、john が sftp を実行するように指定したディレクトリ (つまり /incoming) のみを表示できます。
ジョンが「cd /etc」を実行しようとすると、エラー メッセージが表示されます。 SFTP は chroot 環境でセットアップされているため、ジョンはシステム内の他のファイルを表示できません。
# sftp [email protected] john@thegeekstuff's password: sftp> pwd Remote working directory: /home/john sftp> ls sftp> cd /etc Couldn't canonicalise: No such file or directory
Chroot SFTP 環境が何であるかがわかったので、これを設定する方法を見てみましょう。
1.新しいグループを作成
sftpusers というグループを作成します。このグループに属するユーザーのみが、このシステムの SFTP chroot 環境に自動的に制限されます。
# groupadd sftpusers
2.ユーザーの作成 (または既存のユーザーの変更)
chroot 環境で SFTP の実行のみを許可し、SSH の実行を許可しないユーザー guestuser を作成するとします。
次のコマンドは、guestuser を作成し、このユーザーを sftpusers グループに割り当て、ホーム ディレクトリとして /incoming を作成し、/sbin/nologin をシェルとして設定します (これにより、ユーザーは ssh を実行してシェル アクセスを取得できなくなります)。
# useradd -g sftpusers -d /incoming -s /sbin/nologin guestuser # passwd guestuser
ユーザーが正しく作成されたことを確認してください。
# grep guestuser /etc/passwd guestuser:x:500:500::/incoming:/sbin/nologin
既存のユーザーを変更して sftp ユーザーのみにし、chroot sftp 監獄に入れたい場合は、次のようにします:
# usermod -g sftpusers -d /incoming -s /sbin/nologin john
関連する注意事項として、Windows から Linux にファイルを転送する必要がある場合は、この上位 7 つの sftp クライアント リストに記載されている sftp クライアントのいずれかを使用してください。
3. sshd_config で sftp-server サブシステムをセットアップ
(デフォルトの sftp-server の代わりに) sftp に internal-sftp を使用するように sshd に指示する必要があります。
/etc/ssh/sshd_config ファイルを変更し、次の行をコメントアウトします:
#Subsystem sftp /usr/libexec/openssh/sftp-server
次に、次の行を /etc/ssh/sshd_config ファイルに追加します
Subsystem sftp internal-sftp
# grep sftp /etc/ssh/sshd_config #Subsystem sftp /usr/libexec/openssh/sftp-server Subsystem sftp internal-sftp
4.グループの Chroot ディレクトリを指定
特定のユーザー (つまり、sftpusers グループに属するユーザー) のみを chroot jail 環境に入れたいとします。 /etc/ssh/sshd_config の最後に次の行を追加します
# tail /etc/ssh/sshd_config Match Group sftpusers ChrootDirectory /sftp/%u ForceCommand internal-sftp
上記では:
- Match Group sftpusers – これは、グループ sftpusers に属するユーザーに対してのみ、次の行が一致することを示します
- ChrootDirectory /sftp/%u – これは、ユーザーが認証された後に chroot に使用されるパスです。 %u はユーザーを示します。したがって、ジョンの場合、これは /sftp/john になります。
- ForceCommand internal-sftp – これにより、internal-sftp が強制的に実行され、~/.ssh/rc ファイルに記述されているコマンドはすべて無視されます。
5. sftp ホーム ディレクトリの作成
上記で ChrootDirectory として /sftp を指定したので、このディレクトリを作成します (これは通常の /home ディレクトリに相当します)。
# mkdir /sftp
ここで、/sftp の下に、sftpusers グループの一部であるユーザー用の個別のディレクトリを作成します。つまり、sftp の実行のみが許可され、chroot 環境にいるユーザーです。
# mkdir /sftp/guestuser
したがって、/sftp/guestuser はゲストユーザーの / と同等です。ゲストユーザーがシステムに sftp し、「cd /」を実行すると、「/sftp/guestuser」の下のディレクトリの内容のみが表示されます (システムの実際の / は表示されません)。これが chroot の力です。
したがって、このディレクトリ /sftp/guestuser の下に、ユーザーに表示するサブディレクトリを作成します。たとえば、ユーザーがファイルを sftp できる着信ディレクトリを作成します。
# mkdir /sftp/guestuser/incoming
6.適切な権限を設定
chroot が適切に機能するためには、上記で作成したディレクトリに適切な権限が適切に設定されていることを確認する必要があります。
以下に示すように、所有者をユーザーに設定し、グループを sftpusers グループに設定します。
# chown guestuser:sftpusers /sftp/guestuser/incoming
アクセス許可は、受信ディレクトリに対して次のようになります。
# ls -ld /sftp/guestuser/incoming drwxr-xr-x 2 guestuser sftpusers 4096 Dec 28 23:49 /sftp/guestuser/incoming
/sftp/guestuser ディレクトリのアクセス許可は次のようになります
# ls -ld /sftp/guestuser drwxr-xr-x 3 root root 4096 Dec 28 23:49 /sftp/guestuser # ls -ld /sftp drwxr-xr-x 3 root root 4096 Dec 28 23:49 /sftp
7. sshd を再起動し、Chroot SFTP をテストします
sshd を再起動します:
# service sshd restart
chroot sftp 環境をテストします。以下に示すように、gusetuser が sftp を実行し、「cd /」を実行すると、着信ディレクトリのみが表示されます。
# sftp [email protected] guestuser@thegeekstuff's password: sftp> pwd Remote working directory: /incoming sftp> cd / sftp> ls incoming
ゲストユーザーがファイルを sftp から /incoming ディレクトリに転送すると、実際にはシステムの /sftp/guestuser/incoming ディレクトリの下に配置されます。