通常のWebプロジェクトディレクトリの完璧なUNIXパーミッションは何ですか?


12

書かれたWebアプリケーションの次のものに対する8進形式の完璧な最小許可は何ですか?

  1. ユーザーがアップロードした静的ファイル(images / swf / jsファイル)が存在するディレクトリ
  2. 管理者が静的ファイル(images / swf / jsファイル)をアップロードしたディレクトリが存在するディレクトリ
  3. アプリケーションで使用されるライブラリが存在するディレクトリ
  4. 実行可能/閲覧可能なサーバー側スクリプトが存在するディレクトリ
  5. 既存のファイル(txtまたはxml)がサーバー側のコードによって編集されるディレクトリ

ここに私の提案と正当化があります

  1. 555、誰もが読み書きでき、誰も実行できません
  2. 544、所有者だけが書き込み、他の全員が読み取りのみ、誰も実行不可
  3. 000、誰も読み取り、書き込み、実行する必要はありません、Webサーバーでのみ使用されますか?
  4. 661、所有者は読み取り、書き込み、他の全員は実行のみ可能
  5. 600、所有者は読み取り、書き込み(必要ない場合があります)、他の誰も何もできない

今、私は2つのことに興味があります:

  1. 最初のリストで見逃したWebベースのアプリケーションで一般的に使用されているものはありますか?
  2. 2番目のリストにあなたが同意しないものはありますか?あなたの代替案は何ですか?なぜそれが優れていますか?

1
最近人々がなぜACLを使用していないのか理解できません
...-pfo

回答:


20

「Webアプリケーション」がサーバー(apache、nginxなど)で実行され、いくつかの動的スクリプト言語(PHP、Rubyなど)で記述されていると仮定すると、「ユーザー」が誰であるかを誤解します。

ユーザーは、アプリケーションにログインしている人ではありません。つまり、アプリケーションにおけるユーザーの役割(管理者など)は、シナリオとはまったく無関係です。ユーザーは、プロセスが実行されるLinuxシステムユーザーです。Webサイトのコードは1人のユーザーとしてのみ実行されます。Webサーバーのユーザー(実際には良いことではありません)、またはサイト固有のユーザー(より良い)の場合があります。

Linuxでは、ユーザーはグループに属します。ユーザーを別のグループに追加して、そのグループに特権を割り当てることができます。

適切なセットアップでは、サーバーを1人のユーザーとして実行し(このユーザーを「webserver」と呼びます)、動的スクリプト言語を(例えばFastCGIを介して)独自のユーザーとして実行します(サイトごとに1人のユーザー-最初のユーザーを「site1」と呼びます) 。

ファイルを提供するには、ウェブサーバーがファイルにアクセスし、スクリプト言語がファイルにアクセスする必要があります。つまり、「site1」および「webserver」はファイルを読み取ることができる必要があります。ただし、そのうちの1つだけがファイルを「所有」できます。所有者は「ユーザー」です(ユーザー、グループ、その他)。また、スクリプト言語がディレクトリに書き込むことができるようにする必要があります(そして、書き込まれたファイルを読み取る)。したがって、ユーザー「site1」には読み取りおよび書き込み権限が必要です。グループおよびその他のアクセス許可をできるだけ制限する必要があるため、「所有者」は「site1」になり、対応するユーザーのアクセス許可は読み取りと書き込みになります。

Webサーバーのアクセス許可を別の「ユーザー」として指定できないため、「webserver」を「site1」グループに追加します(もちろん、「site1」と「webserver」の両方を含む別のグループを作成できます。すべてこのグループのメンバーには同じアクセス権が与えられます(ユーザー、グループ、その他のセットの)最も緩いアクセス権が、特定のユーザーに適用されて、アクセス権が決定されます。

適切なセットアップでは、ファイルに動的言語の実行許可が必要であってはならないことに注意してください。ファイルは直接実行されるのではなく、インタプリタに読み込まれます-典型的なスクリプト(何も書き込まないスクリプト)を実行するには読み取り権限のみが必要です。

ディレクトリの「実行」権限には別の意味があります-内容を読み取れずにトラバーサルを許可します。ディレクトリ内のファイルを読み取ることができるようにするには、ユーザーはその上のすべてのディレクトリで「実行」権限を持っている必要があります。

Webアプリケーションの場合、すべてのファイルには所有者による読み取り権限が必要です。それ以外の場合、それはかなり無意味なファイルです。ユーザーまたは管理者が(Webアプリケーションを介して)ファイルをアップロードするかどうかに関係なく、「所有者」(つまり動的言語)には書き込み権限が必要です。動的な言語は大きなファイルを読み込んで内容をエコーアウトするのに時間がかかる傾向があるため、効率的なセットアップはWebサーバーを介して静的ファイルを直接提供しようとします。そのため、Webサーバーには静的ファイルへの読み取りアクセスが必要です。

したがって、最小限のファイル許可は次のとおりです。

  • ユーザーが静的ファイル(images / swf / jsファイル)をアップロードするディレクトリ内のファイル:640
  • 管理者が静的ファイル(images / swf / jsファイル)をアップロードしたディレクトリ内のファイル:640
  • アプリケーションで使用されるライブラリが存在するディレクトリ内のファイル:400(または440)
  • 実行可能/閲覧可能なサーバー側スクリプトが存在するディレクトリ内のファイル:400(または440)
  • 既存のファイル(txtまたはxml)がサーバー側のコードによって編集されるディレクトリ内のファイル:640または600
    • (Webサーバーがこれらを表示するかどうかに依存し、時々変更されません)

一方、最小限のディレクトリ権限は次のとおりです。

  • ユーザーが静的ファイル(images / swf / jsファイル)をアップロードしたディレクトリ:750
  • 管理者が静的ファイル(images / swf / jsファイル)をアップロードしたディレクトリ:750
  • アプリケーションで使用されるライブラリが存在するディレクトリ:500(または550)[少なくとも510でなければなりません]
  • 実行可能/閲覧可能なサーバー側スクリプトが存在するディレクトリ:500(または550)[少なくとも510でなければなりません]
  • 既存のファイル(txtまたはxml)がサーバー側のコードによって編集されるディレクトリ:750または700
    • (Webサーバーがここからのファイルを提供するかどうかに依存し、時々変更されません)

繰り返しますが、Webサーバーは、アクセスが必要なディレクトリより上のすべてのディレクトリで「実行」権限を持っている必要があります。したがって、Webサーバーが特定のディレクトリのファイルを提供しない場合でも、実行権限を付与する必要があります。

Webサーバーにほとんどのファイルへの読み取りアクセスを許可することはかなり一般的です(したがって、これらのファイルを500から550に変更します)。デフォルトの「やや安全な」アクセス許可は、通常ディレクトリでは755、ファイルでは644です(実行許可なし、全員が読み取り、ユーザーのみが書き込み可能)。Linuxシステム上の大部分のファイルにはこれらのアクセス許可があります。

「その他」のアクセス許可は、所有者でもグループ内でもないシステムユーザー(つまり、残りのすべてのシステムユーザー)を指すことに注意してください。これらのユーザーは不明であり、明示的に許可を与えていないため、「他の」許可を制限しておくことは良いことです。多くの場合、他のアクセス許可は、侵害されたシステムで利用するのが最も簡単です(たとえば、/ tmpが一般的なターゲットである理由の1つ)。

上記の文脈では、あなたの最後の2つの質問はそれほど適切ではないと思います。ディレクトリのアクセス許可を550(およびファイルのアクセス許可を440)に設定し、アプリケーションが書き込むディレクトリ(ディレクトリ:750、ファイル:640)の書き込み許可をユーザーに付与します。

(ファイルをアップロードするには書き込み権限が必要になります-ただし、必要に応じて後で削除できます-おそらく、誰かが所有者のみが書き込み可能なディレクトリに書き込みを行っている場合-アカウントが侵害されている-これは1つです制限されたアクセス許可を保持する理由)。


@Iain:絶対に-その瞬間にファイルのアクセス権を考えていた-それを修正します-ありがとう。
cyberx86

1

通常、ジョブを実行するための最小限のアクセス許可セットがあります。ウェブサーバーとユーザーが共通のグループを共有している場合は、へのアクセス権を付与する必要を削除できますo。権限もユーザーに関連しています。8進数の許可を誤解しているようです。

  1. 555はr-xr-xr-xありませんrw-rw-rw。それはディレクトリなので、ファイルを作成/削除するにはx、750 rwxr-x---を開始するのに適した場所に設定する必要があります。これにより、ディレクトリを所有するユーザーがファイルを追加/削除し、共通グループの全員がファイルにアクセスできます。
  2. 上記1と同じです。
  3. それらが本当に静的なファイルである場合、050はWebサーバーにアクセスを許可しますが、最初にファイルを作成するには750が最低限必要です。
  4. 上記3と同じ。
  5. Webサーバーがファイルを読み取って変更できるようにするためには、070が最小ですが、ファイルを作成する必要があるため、おそらく770がより現実的です。

Webサーバーは、ファイルを読み取るためにディレクトリの実行権限を必要としませんか(ポイント#1(740?)、3、5)?
cyberx86

ドッ!実際、ファイルにアクセスするにはxが必要です。rを使用すると、それらを一覧表示することができます。
user9517

0

一般に、ディレクトリでモード0755、0775、または2775を使用します(ディレクトリのSGIDビットは、BSDとLinuxの場合、ファイルシステムがBSDセマンティクスでマウントされている場合、新しいファイルのグループ関連付けは親ディレクトリの設定と一致しますファイルの作成者のデフォルトGID)。これにより、すべてのユーザーが問題のディレクトリをトラバース(chdirを介して)および読み取り(lsコマンドを実行するか、readdir / readシステムコールを実行)できます。選択肢は、グループ/書き込みオプションを追加し、ディレクトリにSGIDビットが記載されているように、適切なグループに関連付けられたすべてのファイルとサブディレクトリを保持するのに役立ちます。

ファイルの場合、通常0644または場合によっては0664(誰でも読み取り可能、グループ書き込み可能かどうか)を使用します。明らかに、CGIスクリプトとバイナリの場合、xビットを追加する必要があります。非常によくテストされたバイナリを使用する特別な状況では、SUIDまたはSGIDビットを追加する場合があります。通常、UNIXおよびLinuxはスクリプトのSUID / SGIDビットを無視し、コンパイル済みのネイティブな実行可能バイナリのセマンティクスのみを尊重します。ただし、Webサーバーが解釈されたスクリプト上でもSUID / SGIDビットを尊重するために使用できる「setuidhack」などのモジュールを備えたApacheのようなものの下でサイトを実行している可能性があります。(これは、各ファイルにHTTPデーモンstat()を実行し、独自のカスタムfork()/ execve()コードを使用して、単に実行可能ファイルを渡すのではなく、正しいインタープリター文字列をexecve()ベクトルに挿入することによって行われます '

これらは最も一般的なガイドラインです。これらはすべての状況に「完全」ではないため、Webサーバーや、インストールおよび構成しているWebアプリケーションまたはフレームワークのドキュメントを必ず参照する必要があります。ファイル、コード、またはサーバーを公開インターネットに公開します。

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.