[vsftpd] 特定の拡張子のファイルのアップロードを禁止する | A Day In The Boy's Life

A Day In The Boy's Life

とあるエンジニアのとある1日のつぶやき。

FTPサーバーをユーザーに開放している場合、それを使って予期せぬファイルをやり取りされる場合があったりします。

コンテンツファイルなどを更新するためにFTPを開放しているのに、そこで動画ファイルなど関係のない大容量のファイル交換に利用されていたなど、サーバーを管理する側としては問題がおきそうな行為は極力禁止したいと思うでしょう。

ここではvsftpdデーモンを使った、特定のファイルのアップロードを禁止する設定を追加してみたいと思います。



vsftpdで特定のファイルのアップロードを禁止する設定


設定方法はいたって簡単です。

vsftpd設定ファイル(vsftpd.confまたはユーザーの設定ファイル)にdeny_fileディレクティブを追加することで実現できます。


例)
deny_file={*.zip,*.doc,*.xls,*.ppt}

上記の場合、zipファイル、オフィスドキュメント(Word、Excel、PowerPoint)ファイルのアップロードを禁止しています。


deny_fileディレクティブには、正規表現を指定できますが簡易的な実装であるため、複雑なファイル名のパターンを登録することはできません。

そのため、本来禁止したいファイルがアップロードされる可能性もあったりします。

例えば、HTMLファイルを禁止したいとして、


deny_file={*.html}

と、書いていたとしましょう。
ただ、これは「.htm」の拡張子のファイルはdeny_fileディレクティブの簡易的な正規表現ではマッチングしないため、アップロード可能となってしまいます。

設定する場合は十分なテストを行う必要があります。


設定ファイルのほうは、vsftpd.confに書くと全員に適用され、個別のユーザー設定ファイル(user_config_dirディレクティブで指定したディレクトリ内に作るユーザー専用の設定ファイル)に書いた場合は、そのユーザーだけに適用されます。

設定を変更したら、vsftpdデーモンを再起動させます。


上記の例で示した4種類の拡張子のファイルアップロードを禁止した場合、実際にどのような動きになるのかテストしてみましょう。


# ftp localhost
Connected to localhost
220 (vsFTPd 2.0.5)
530 Please login with USER and PASS.
530 Please login with USER and PASS.
KERBEROS_V4 rejected as an authentication type
Name (localhost:hoge):
331 Please specify the password.
Password:
230 Login successful.
Remote system type is UNIX.
Using binary mode to transfer files.

ftp> put test.zip
local: test.zip remote: test.zip
227 Entering Passive Mode (127,0,0,1,99,207)
550 Permission denied.

ftp> get test.zip
local: test.zip remote: test.zip
227 Entering Passive Mode (127,0,0,1,58,252)
550 Permission denied.

ftp> del test.zip
550 Permission denied.

test.zipファイルをアップロードしようとしていますが、「550 Permission denied」が表示されアップロードができていません。

また、ダウンロードやファイルの削除も同様にエラーが出て正常に実行できないことがわかります。


ちなみに、特定のファイルだけを許可するというディレクティブは存在しないため、ブラックリスト方式で登録することしかできません。


予断ですが、サーバー上の特定のファイルに対し、削除や上書きをできなくしたいのであれば、「[Linux] 削除できないファイルの作り方 」で紹介した、特殊な権限をファイルに付与しておくというのも一つの手だと思います。