web-dev-qa-db-ja.com

ファイルの種類ごとにディレクトリの内容を制限するにはどうすればよいですか?

ファイルの種類によってディレクトリの内容を制限する方法はありますか?

たとえば、ユーザーに画像のみを配置してほしいアップロードディレクトリがありますが、さらに一歩進んで、実際には画像のみを許可する制限を設定できますか?

ファイル拡張子を確認するためのCRONジョブについて考えましたが、別の方法があるのではないかと思いました。

6
Monty

Cronジョブなどを使用して「事後に」これを強制しようとすると、いくつかの問題が発生します。

  1. 競合状態。使用する方法に関係なく、ディレクトリを調べて、対話させたくないファイルを取得して使用する可能性のあるプログラムまたはコードがある場合、実際にpreventを実行する唯一の方法です。 _それを行うことから、(1)そのようにコード化する(またはオープンソースの場合は既存のソースコードを変更する)。または(2)そもそもファイルをそのディレクトリに配置しないようにします。

  2. 実行しているOSを指定していませんが、Linuxでは、fanotifyを使用してディレクトリ内のファイルの作成/名前変更を監視し、許可されていないファイルが作成または名前変更されたときにアクションを実行できます。許可されていない名前またはコンテンツ。もちろん、これは本質的に競合状態であるため、「ユーザー」(他のプログラムまたはユーザーアカウント)がディレクトリにファイルを配置しているときにディレクトリにアクセスする他のコードがある場合、それらのファイルを完全に防ぐことは不可能です。ピックアップされないようにします(コードがそれらを削除/移動する前に、おそらく読み取られます)。

私が提案するのはこれです:

  1. 新しいグループを作成するか、既存のグループを使用します。このグループのメンバーは、不要なファイルをそのディレクトリに配置するプログラムを実行しないと信頼できるユーザーのみです。

  2. ディレクトリの権限を770や775などに設定し、グループとユーザー所有者をそれぞれchmodchownを使用して適切に設定します。これにより、そのグループ外のユーザーがそのディレクトリにアクセス(または書き込み)できなくなるため、正しいファイルをそこに配置することを信頼していないプログラム/ユーザーは、次の方法でアクセスから除外されます。ファイルシステムの随意アクセス制御メカニズム。これは、ほとんどすべてのUNIXライクで機能するはずです(Windowsでも、アクセス許可システムは少し異なります)。このディレクトリをntfs-3gまたは任意アクセス制御を無視する他のファイルシステムに保存していないことを確認してください。

  3. 「アップロード」用のファイル名とともにファイルの内容を受け入れるサービス(Webサービス、UNIXドメインソケット、またはsomething)を提供するプログラムを作成するか、既存のプログラムを使用します。このプログラムは、ユーザーからファイル全体を受け取り、完全にダウンロードされるまでRAMまたは一時フォルダーに保存し、ファイル名と内容を調べて、不要なファイルタイプのファイルがエラーが発生し、ディレクトリに配置されません。ファイルが正常に表示される場合は、上記のグループ制限ディレクトリにある目的のファイル名にファイルの内容を書き込むことができます。

上記の段落の「既存のプログラムを使用する」コンポーネントについては、少しグーグルで検索したところ、1つの可能な解決策しか見つかりませんでした(そしてそれはあまり堅牢ではありません):Samba ファイル拡張子のブラックリストをサポート 。ただし、ファイル拡張子のチェックを簡単にバイパスするために、任意の内容のファイルの名前を変更して、ファイル拡張子を含めることができることを知っておく必要があります。ファイル拡張子チェックは、ユーザーが実行可能ファイルを誤ってアクティブ化するのを防ぐのに役立ちます(たとえば、実行可能ファイルを.txtとしてアップロードした場合、ユーザーのテキストエディターで無害に開き、テキストエディターがフリーズするという最悪の結果が発生します。ファイルが大きすぎますが、拡張子.exeを付けてアップロードした場合、Windowsをダブルクリックするとrunファイルになります)。

ただし、ファイル拡張子のチェックだけでは、ファイルの[〜#〜]コンテンツ[〜#〜]が目的のタイプであることを確認できません(または望ましくないタイプのnot)。そのためには、「ファイルのアップロード時に」カスタムコードを呼び出すための何らかのフックが必要になります。 FTPサーバーで(頭のてっぺんからこの方法で拡張できるFTPサーバーを知りません)-次に、たとえば、結果に対してUNIXユーティリティfileを呼び出して確認します。望ましくないタイプの場合。 fileは防弾ではありませんが、ファイルの名前に関係なく、ファイルのcontentsを認識するのに非常に優れています。


最後に、よく考えておく必要があります。表面の向こう側を見ると、不要なファイルの内容を許可しないという問題ははるかに大きくなります。たとえば、PDFドキュメントから始めるとします。次に、そのPDFドキュメントの1ビットを反転して、ファイルの形式がPDF標準に違反するようにします。このファイルを「ナイーブ」なPDFリーダーで開くと、ファイル形式に違反しているために開くことができません。ただし、「スマート」なPDFリーダーで開くと、may自動的に破損を検出して修復できます!破損が十分に深刻な場合、ファイルタイプ検出プログラムはPDFドキュメントでさえないと思われるかもしれません。ただし、エンドユーザーは引き続きファイルを開くことができる場合があります。

さらに悪いことに、特定のファイルの内容またはファイルの種類が送信されないようにsuppressしようとしている場合、ユーザーがこれを回避する方法は無数にあります。 1つのアプローチは、認識できないほどファイルヘッダーを故意に破損して、ブラックリストがファイルタイプを理解しないようにし、デフォルトでファイルヘッダーを通過できるようにすることです。または、ホワイトリストがある場合は、ファイルをallowedタイプの有効なファイル形式に偽装し、コンテンツに実際のペイロードを含めます。協力するユーザーのペア(または別のユーザーをリモートコントロールする攻撃者)は、このファイルをアップロードしてダウンロードし、受信側のコンテンツを目的の形式に変更して、データを使用する可能性があります。

これはステガノグラフィの分野に入ります。そこでは、絶滅したステゴサウルスDNAを使用して、ファイルが特定のタイプであるかどうかを判断しようとします;-)(冗談です。ステゴサウルスはステガノグラフィとは何の関係もありません:))。ステガノグラフィでは、ファイルは表面上は完全に正当に見える可能性があり、ホワイトリストフィルターによって許可されることさえあります。しかし、攻撃者は別のユーザーと協力して、既存のファイルの一見有効なデータ内にデータを隠すことにより、任意のデータ(任意のファイル形式)を通信する可能性があります。ステガノグラフィは、検出が非常に難しい場合があります。

ただし、ファイルが特定のタイプであることを公然と露骨に宣言する「ハッピーパス」ファイルタイプをブロックすることだけを目的としている場合は、アップロードを許可するステージングディレクトリ内のファイルにfileのようなものを使用できます。 FTP経由でに移動し、テストに基づいてファイルが「チェックアウト」した場合は、制限されたディレクトリに移動できます。これは、暗号化/ステガノグラフィのトレーニングを受けていないユーザーが不要なファイルタイプをシステムにアップロードするのを防ぐのに最適です。

8
allquixotic