web-dev-qa-db-ja.com

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

更新された概要

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

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

  1. PHP/Perl/Ruby/Pythonすべてがフォルダとファイルにアクセスする必要があります。それらはそれらの多くを作成するためです(つまり、/uploads/)。これらのスクリプト言語は、nginxまたはApache(またはFastCGI for PHPのような他の何か)の下で実行する必要があります。

  2. 開発者

彼らはどのようにしてアクセスするのですか?誰か、どこかが以前にこれを行ったことを知っています。しかし、何十億ものウェブサイトがあるので、あなたはこのトピックについてもっと多くの情報があると思うでしょう。


私は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:ファイルとディレクトリに異なる権限が必要になる可能性があることに気づきました-上記のファイルについて話していたため、ディレクトリの権限がどうなるかわかりませんする必要があります。

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

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

Update 4:この記事 by slicehostは、wwwフォルダーのアクセス許可をセットアップするために必要なものを説明するのに最適なようです。しかし、PHP OR svn/git run asでどのユーザーまたはグループがApache/nginxを実行するか、およびそれらをどのように変更するかはわかりません。

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

70
Xeoncross

より多くの調査の後、これに答える別の(おそらくより良い方法)のようにwwwフォルダをそのように設定することでしょう。

  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

49
Xeoncross

「正しい」かどうかはわかりませんが、サーバーで次のようにしています。

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

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

8
Nic

さらに調査したところ、git/svn [〜#〜] tools [〜#〜]は、ユーザーが使用しているものとして実行されているため、問題ではないようです。 (ただし、git/svnデーモンは別の問題です!)gitで作成/クローンしたものすべてに権限があり、gitツールはこの論文に適合する/usr/binにリストされていました。

Gitの権限を解決しました。

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

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

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

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

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

Sudo chgrp -R www-data /var/www

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

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

Sudo usermod -a -G www-data demousername

3)CHMOD wwwディレクトリ

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

Sudo chmod -R 2770 /var/www

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

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

7
Xeoncross

スティッキネスは権限の継承ではありません。ディレクトリのスティッキネスとは、ファイルの所有者またはディレクトリの所有者だけが、別の方法で許可を与えても、ディレクトリ内のそのファイルの名前を変更または削除できることを意味します。したがって、/ tmp /で1777になります。

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

まず、次の定義を行う必要があります。*どのユーザーがシステムにアクセスできるか*脅威モデルは何か

たとえば、複数の顧客とWebホスティングを行っており、他の顧客にファイルを見せたくない場合は、それらすべてのユーザーに共通のグループ「webcusts」と0705のディレクトリモードを使用することができます。 webserverプロセス(「webcusts」のnot)は、その他の権限を参照して許可されます。顧客はお互いのファイルを見ることができず、ユーザーは自分のファイルをいじることができます。ただし、これは、CGIまたはPHP you haveを許可した瞬間に、プロセスが特定のユーザーとして実行されるようにすることを意味します(とにかく、複数のそれ以外の場合、顧客はCGIにそうさせることでお互いのファイルを混乱させる可能性があります。

ただし、WebサイトのランタイムユーザーがWebサイトの所有者と同じである場合、スクリプトにセキュリティホールが存在する場合、悪用者からコンテンツを保護できないという問題があります。専用ホストが勝つ場所です。これにより、静的コンテンツの所有者とは異なるランタイムユーザーを作成でき、他のユーザーとのやり取りについてそれほど心配する必要がありません。

6
Phil P

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

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

2
Tie-fighter

ファイルの所有者はファイルを作成した人であり、グループはwww-dataである必要があります。その場合、ディレクトリ/ファイルのモードは一般的に755/644です。ディレクトリとファイルの場合、グループには書き込みアクセスが必要ですが、modは775/664です。 paddyが開発者であると想定します。まとめると、次のようになります。

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 {} \;
1
Jonny

@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ファイルなどを読み取ります)。ただし、他の全員には読み取り専用アクセスのみを許可します。

0
MikeyE