WWWフォルダーのLinuxアクセス許可を設定する方法


69

更新された要約

/ var / wwwディレクトリの所有者root:rootは、だれも使用できないことを意味し、まったく役に立ちません。私たちは皆、実際に機能する(そして「root」としてログインするべきではない)Webサーバーが必要なので、これを修正する必要があります。

2つのエンティティのみがアクセスを必要とします。

  1. PHP / Perl / Ruby / Pythonはすべて、フォルダーとファイルにアクセスする必要があります(多くの場合/uploads/)。これらのスクリプト言語は、nginxまたはapache(またはFastCGI for PHPなど)で実行する必要があります。

  2. 開発者

彼らはどのようにアクセスしますか?どこか誰かがこれをやったことがあることは知っています。ただし、数十億のWebサイトが存在する場合、このトピックに関する詳細情報があると思われます。


777が所有者/グループ/その他の完全な読み取り/書き込み/実行権限であることを知っています。したがって、これはランダムなユーザーに完全な許可を与えるため、正しい必要はないようです。

次のように使用する必要があるアクセス許可/var/www

  1. gitやsvnなどのソース管理
  2. 「websites」のようなグループのユーザー(または「www-data」に追加されることもあります
  3. apacheやlighthttpdなどのサーバー
  4. PHP / Perl / Ruby

すべてのファイル(およびディレクトリ)を読み取って作成し、実行できますか?

私が正しい場合、RubyおよびPHPスクリプトは直接「実行」されませんが、インタープリターに渡されます。/var/www...のファイルの実行許可は必要ありませんか?したがって、正しい許可はどのようにchmod -R 1660なるでしょう

  1. これら4つのエンティティで共有可能なすべてのファイル
  2. 誤って実行できないすべてのファイル
  3. ディレクトリから他の全員を完全にブロックする
  4. 将来のすべてのファイルの許可モードを「スティッキー」に設定します

これは正しいです?

更新1:ファイルとディレクトリに異なるアクセス許可が必要な場合があることに気付きました-上記のファイルについて話していたので、ディレクトリアクセス許可が必要かどうかわかりません。

更新2:/var/www上記の4つのエンティティの1つが常にフォルダーおよびサブフォルダーを多くのレベルの深さで常に追加(および削除)するため、フォルダーの構造が大幅に変更されます。また、他の3つのエンティティが読み取り/書き込みアクセスを必要とする可能性があるファイルを作成および削除します。したがって、アクセス許可は、ファイルとディレクトリの両方に対して上記の4つのことを行う必要があります。これらのどれも実行許可を必要としないので(上記のruby / phpに関する質問を参照)rw-rw-r--、これら4つのエンティティは信頼できる人員(#2を参照)と他のすべてのユーザーによって実行されるため、許可はすべて必要で完全に安全であると想定しますシステムには読み取りアクセスのみがあります。

更新3:これは、個人用開発マシンおよび企業のプライベートサーバー用です。共有ホストのようなランダムな「ウェブ顧客」はありません。

更新4: slicehostによるこの記事は、wwwフォルダーのアクセス許可をセットアップするために必要なものを説明するのに最も適しているようです。ただし、PHPまたはsvn / gitを使用するapache / nginxのユーザーまたはグループの実行方法と変更方法はわかりません。

更新5:私は最終的に、これらすべてを機能させる方法を見つけました(以下の回答)。しかし、これが正しい安全な方法であるかどうかはわかりません。したがって、私は賞金を開始しました。wwwディレクトリを保護および管理する最良の方法を持っている人が勝ちます。

回答:


47

さらに調査した結果、これに答える別の方法(おそらくより良い方法)のように思えます。

  1. sudo usermod -a -G developer user1 (各ユーザーを開発者グループに追加)
  2. sudo chgrp -R developer /var/www/site.com/ 開発者がそこで作業できるように
  3. sudo chmod -R 2774 /var/www/site.com/ 開発者のみがファイルを作成/編集できるようにします(他/世界は読み取り可能)
  4. sudo chgrp -R www-data /var/www/site.com/uploads www-data(apache / nginx)がアップロードを作成できるようにします。

git呼び出し元のユーザーとして実行されるため、ユーザーが「開発者」グループに属している限り、フォルダーの作成、PHPファイルの編集、gitリポジトリーの管理ができるはずです。

注:ステップ(3)で:2774の「2」は、ディレクトリの「グループIDの設定」を意味します。これにより、その中に作成された新しいファイルとサブディレクトリは、(ユーザーのプライマリグループではなく)親ディレクトリのグループIDを継承します。参照:http : //en.wikipedia.org/wiki/Setuid#setuid_and_setgid_on_directories


私には合理的に見えます。
wazoox

良い。たぶん、さらに数人でこれを確認できれば、このアプローチを使用します。それは私が人々から絞り出すことができた最高の答えのようです。
Xeoncross

誰がファイルの所有者になるかを指定していません。ルートのままにしますか?その後、sudoerのみがアップロードフォルダーを編集できます(おそらく、意図したものではありません)。
ニック

はい、ルートは所有者のままです。ただし、グループの所有者は現在「開発者」であり(wrxの許可を持っている)、すべての開発者(およびapache / nginx)も読み取ることができます。sudoは必要ありません。
Xeoncross

7
注目すべきもう1つのことは、umaskです。多くのシステムには、新しいファイルのグループとパブリックの両方の書き込み許可を削除する022のデフォルトumaskがあります。002(一般向けの書き込み不可)または007(一般向けのアクセス不可)が必要だと思われます。ディレクトリへのアクセスを必要とするすべてのプロセスに対して、Apacheの設定や起動スクリプトでumaskを設定できます。これを/ etc / profileまたは/ etc / bashrcに追加して、開発者にもデフォルトで設定されることを忘れないでください
マークポーター

8

それが「正しい」かどうかはわかりませんが、サーバーで行うことは次のとおりです。

  • / var / wwwには、各Webサイトのフォルダーが含まれています。
  • 各Webサイトには、Webサイトのディレクトリ内のすべてのファイルとフォルダーの所有者として設定された指定所有者がいます。
  • Webサイトを管理するすべてのユーザーは、Webサイトのグループに入れられます。
  • このグループは、ディレクトリ内のすべてのファイルとフォルダーのグループ所有者として設定されます。
  • Webサーバー(つまり、PHP)で書き込む必要があるファイルまたはフォルダーの所有者は、apacheを実行するユーザーであるwww-dataに変更されます。

内容を一覧表示するには、ディレクトリで実行ビットを有効にする必要があることに注意してください。


git / svnまたはPHPはどのようにして新しいフォルダーを作成しますか?
Xeoncross

2
PHPはWebサーバーと同じユーザーコンテキストで実行されるため、Webサーバーが所有する任意のディレクトリにファイルとフォルダーを作成できます。通常、このようなフォルダはわずかです(/ uploads /など)。git / svnについてはわかりません-Webサイトを制御するグループアカウントに追加できますか?
ニック

どうやらgitは、他のツールと同じように、実行中のユーザーとして実行されます。
Xeoncross

次に、gitユーザーをapacheグループに追加し、フォルダーグループに書き込み権限を付与します。
デビッドリックマン

先ほど言ったように、gitにはユーザーがいません-それを使用する現在のユーザーとして実行されます。
Xeoncross

7

さらに調査を行った結果、git / svn TOOLSはユーザーが使用しているものとして実行されるため、問題ではないようです。(ただし、git / svnデーモンは別の問題です!)gitで作成/複製したものにはすべて許可があり、/usr/binこの論文に適合するgitツールがリストされていました。

Gitパーミッションが解決されました。

wwwディレクトリーへのアクセスを必要とするすべてのユーザーをwww-data、apache(およびnginx)が実行されるグループに追加することにより、ユーザーの許可を解決できるようです。

したがって、この質問に対する1つの答えは次のようになります。

デフォルトで/var/wwwはが所有してroot:rootおり、もそこにファイルを追加または変更できません

1)グループ所有者の変更

まず、wwwディレクトリグループを、「root」グループではなく「www-data」が所有するように変更する必要があります。

sudo chgrp -R www-data /var/www

2)www-dataにユーザーを追加する

次に、現在のユーザー(およびその他のユーザー)をwww-dataグループに追加する必要があります。

sudo usermod -a -G www-data demousername

3)CHMOD wwwディレクトリ

所有者(root)とグループ "www-data"のすべてのユーザーのみがファイルとディレクトリをrwx(読み取り/書き込み/実行)できるようにアクセス許可を変更します他のユーザーはアクセスできません)。

sudo chmod -R 2770 /var/www

これで、アクセス権を持つユーザー(つまり「www-data」グループ内のユーザー)によって作成されたすべてのファイルとディレクトリは、Apache、つまりphpによって読み取り/書き込み可能になります。

これは正しいです?PHP / Rubyが作成するファイルはどうですか?www-dataユーザーはそれらにアクセスできますか?


6
すべてのWebファイルをPHPで書き込み可能にするという考えは好きではありません。スクリプトの脆弱性が存在する場合、露出が増える可能性があります。
ニック

わかりました、PHPを使用して多くのテキスト、tar、ログ、およびイメージファイル(およびフォルダー)を作成することを知っているので、すべてが書き込み可能であると仮定していました。ただし、すべてのPHPアプリの99%がスクリプトファイルを作成することは決してないので、おそらく、あなたの権利とPHPは、ITが作成するファイルを変更することしかできないはずです。もう1つの選択肢は、PHPが特定のディレクトリへの書き込みアクセス(/ uploads /)のみを許可することです。何か案は?
Xeoncross

2
スクリプトとデータを別々にしてください。攻撃者が/ uploads /に何かを落としたとしても、それは実行可能ではありません。レイヤー内のセキュリティが重要です。
ニック

6

スティッキネスはアクセス許可の継承ではありません。ディレクトリへのスティッキ性とは、アクセス権が別の方法で指定されていても、ファイルの所有者またはディレクトリ所有者のみがディレクトリ内のそのファイルの名前を変更または削除できることを意味します。したがって、/ tmp /に1777。

従来のUnixでは、ファイルシステムに基づいたアクセス許可の継承はなく、現在のプロセスのumaskのみに基づいています。* BSD、またはディレクトリにsetgidがあるLinuxでは、新しく作成されたファイルのグループフィールドは、親ディレクトリのグループフィールドと同じに設定されます。さらに、ディレクトリの「デフォルト」ACLを使用してACLを調べる必要があります。これにより、アクセス許可を継承できます。

以下を定義することから始める必要があります:*システムにアクセスできるユーザー*脅威モデルとは

たとえば、複数の顧客でWebホスティングを行っており、互いのファイルを表示したくない場合は、それらすべてのユーザーに共通グループ「webcusts」を使用し、ディレクトリモード0705を使用します。 Webサーバープロセス(「webcusts」ではない)は、その他のパーマを参照して許可されます。顧客はお互いのファイルを見ることができず、ユーザーは自分のファイルをいじることができます。しかし、これはあなたがCGIやPHPを許可した瞬間は、あなたがいることを意味していプロセスは、(複数のユーザ対1のホストのために、説明責任のための良い練習とにかく、)特定のユーザーとして実行することを確認します。そうしないと、顧客はCGIにそうすることで、お互いのファイルを台無しにすることができます。

ただし、WebサイトのランタイムユーザーがWebサイトの所有者と同じ場合、スクリプトにセキュリティホールがある場合、コンテンツを悪用者から保護できないという問題があります。ここで専用ホストが勝つため、実行時ユーザーを静的コンテンツ所有者とは区別し、他のユーザーとのやり取りをあまり心配する必要がなくなります。


いい答えだ。MacOS Xでは、システムはSGIDビットがディレクトリにあるかのように自動的に動作します。通常、スティッキービットは、書き込み可能な場合にのみファイルを削除できることを意味します。つまり、誰でも/ tmpにある公的に書き込み可能なファイルを削除できます。MacOS Xでは、/ tmpはユーザーのプライベートディレクトリへのシンボリックリンクです。したがって、結局共有はありません。
ジョナサンレフラー

答えてくれてありがとう、私は質問をより多くの情報で更新しました。
Xeoncross

ジョナサン:スティッキービットは、ディレクトリの所有者またはファイルの所有者のみが名前を変更または削除できることを意味します(つまり、ディレクトリ 'file'のエントリに基づいて動作します)。個々のファイルに対する権限は、これらのディレクトリ操作(rename()unlink())には関係なく、ファイル自体(open())に対するアクションに対してのみ有効です。これが「通常の」動作です。
フィルP

2

これを行う最善の方法は、Posix ACLを使用することだと思います。彼らは快適に仕事をし、必要なすべての機能を提供します。

http://en.wikipedia.org/wiki/Access_control_list#Filesystem_ACLs


ACLについての役立つ情報については+1。ただし、2、3人の開発者がいる単純なサーバーを管理するためだけに、余分なジャンクがシステムを動かさないようにしたくありません。また、ACLを使用するためにカーネルを再コンパイルするのも苦手です。
Xeoncross

@Xeoncross:ACLは何も動かしません。それらは、通常のファイル許可のような単なるメタ情報です。それはそれほど「余分」で複雑なわけではありません。複雑なスティッキー/グループ/その他のソリューションではなく、許可を管理する最も簡単で最良の方法だと思います。怖がらないで、aclで再マウントして試してみてください!
タイファイター

1

ファイルの所有者は作成者である必要があり、グループはwww-dataである必要があります。ディレクトリ/ファイルのモードは一般的に755/644です。ディレクトリとファイルの場合、グループは書き込みアクセスを必要としますが、modは775/664です。水田が開発者であると想定します。全体でこれができます:

chown -R paddy:www-data /var/www/websiteindevelopment
chmod -R 755 /var/www/websiteindevelopment
chmod -R 775 /var/www/websiteindevelopment/directorywritablebygroup
find /var/www/websiteindevelopment -type f -perm 755 -print -exec chmod 644 {} \;  
find /var/www/websiteindevelopment -type f -perm 775 -print -exec chmod 664 {} \;

0

@Xeoncrossの答えに加えて、ファイルとディレクトリのアクセス許可を個別に構成することをお勧めします。

sudo find /var/www -type d -exec chmod 775 {} \;  # Change permissions of directories to rwxrwxr-x
sudo find /var/www -type f -exec chmod 664 {} \;  # Change file permissions to rw-rw-r--

これにより、開発者は/ var / www内のディレクトリを作成および変更できます。開発者は、追加のディレクトリを作成するか、不要になったディレクトリを削除する必要がある場合があるため、これは重要だと思われます。

また、開発者はコードファイルを作成および変更できます(HTML、PHPファイルなどを読み取ります)。ただし、他のすべてのユーザーには読み取り専用アクセスのみが許可されます。

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