/var/www/html と Web サイトのドキュメント ルートのホーム ディレクトリの権限の問題

/var/www/html と Web サイトのドキュメント ルートのホーム ディレクトリの権限の問題

私はない777フォルダー内で権限を与えています/var/www/htmlが、 なしでファイルを編集したいですsudo。そこで、 内のホーム ディレクトリにフォルダーのシンボリック リンクを作成しようと考えました/var/www/html。次のようにして作成しました。

sudo ln -sT /home/andre/www/moodle/ moodle

出力はls -la次のようになります。

andre@andre-270E5G:/var/www/html$ ls -la
total 8
drwxr-xr-x 2 root root 4096 Mai  4 10:20 .
drwxr-xr-x 4 root root 4096 Abr 29 14:29 ..
lrwxrwxrwx 1 root root   23 Mai  4 10:20 moodle -> /home/andre/www/moodle/

つまり、私のmoodleフォルダには全員の読み取り、書き込み、実行権限が与えられていますが、これは私が望んでいることではありません。私は次のコマンドを使用しました:

sudo chmod -R 775 moodle/

変更しようとしましたが、すべてに対して読み取り、書き込み、実行の権限が付与されたままでした。moodleのフォルダでも同じことを試しましたが、結果は同じでした。の/home/andre/www/moodle出力は次のとおりです。ls -la/home/andre/www/

andre@andre-270E5G:~/www$ ls -la
total 28
drwxrwxr-x  3 andre andre  4096 Mai  4 10:02 .
drwx------ 49 andre andre 20480 Mai  4 10:01 ..
drwxrwxr-x 41 andre andre  4096 Mai  4 10:02 moodle

つまり、フォルダーmoodleには/home/andre/www/必要な権限が与えられます。

追加の問題として、アクセスするとlocalhost/moodle403 Forbidden エラーが発生します。

ここで何が間違っているのでしょうか?

答え1

ホームディレクトリ内からウェブサイトを実行する必要はありませんこれまで。/home/そうしないと、Web サーバーにディレクトリ構造を確認するため のトラバース機能だけでなく、 /home/$USER/(ユーザーのホーム ディレクトリ。ユーザー ディレクトリに他に何が存在するかを確認できる) およびその中の他のサブフォルダーへのトラバース機能も付与する必要があります。構成が不十分、または誤っている、あるいはパッチが適用されていない Web サーバーは、このようにして大量のデータ漏洩や資格情報の損失などを引き起こし、個人データやさまざまなログインが危険にさらされる可能性があります。使用しているシンボリック リンク アプローチも、Apache に読み取り権限を付与しようとするのと同じ理由で役に立ちません/home/andre/www/moodle。Web サーバーは、シンボリック リンクが指す場所に到達するためにホーム ディレクトリをトラバースできる必要があり/var/www/html、それでもセキュリティ リスクが生じます。

まず、 を使用しますsudo cp -r /home/andre/www/moodle/ /var/www/html/。これにより、ファイルが にコピーされ/var/www/html、自分のホーム ディレクトリから切り離されます。次に、権限を再設定して、あなたと Web サーバーがそのディレクトリ内のすべてのものにアクセスできるようにし、ユーザーにすべてのファイルとディレクトリへの完全な読み取り/書き込み権限を与えます。その後、/var/www/htmlサイトでは のみで作業する必要があります。

これは、データをコピーして戻した後、実際には 4 つの手順になります/var/www/html

  1. Apache にフォルダーとファイルへのアクセス権を与え、403 エラーなしでサイトを提供できるようにします。
  2. ユーザーにファイルとフォルダーの「所有者」権限を与え、自分自身にすべてのファイルとフォルダーの読み取り/書き込み権限と、ディレクトリを移動する権限を与えます。
  3. (オプションですが推奨)今後ディレクトリ構造全体で作成されるすべてのファイルまたはフォルダのグループが に設定されるように設定しますwww-data
  4. (オプション)最終的なセキュリティ クリーンアップでは、ユーザーと Web サーバーがサイト データを表示できるように権限を設定しますが、他のユーザーはサイトのファイルやディレクトリ構造にアクセスできません。

(1)Apacheがフォルダとファイルにアクセスできるようにします。

sudo chgrp -R www-data /var/www/html
sudo find /var/www/html -type d -exec chmod g+rx {} +
sudo find /var/www/html -type f -exec chmod g+r {} +

www-dataこれにより、フォルダーとファイルの「グループ」が再帰的に設定します。これにより、Web サーバーに再帰的なアクセス許可が与えられ、サイトのドキュメント ルート ディレクトリ構造 (+xディレクトリのみ) にアクセスできます。また、Web サーバーにすべてのファイルの読み取りアクセス許可が与えられ、サイト データを受信できるようになります。

場合によっては、Web サーバーにファイルまたはディレクトリへの書き込み権限を与える必要があります。これは、sudo chmod g+w /var/www/html/PATH(ここでは、PATHWeb サーバーの書き込み権限を適用する必要のあるディレクトリ構造内のファイルまたはフォルダーへのパス) を実行することで実現できます。

知らせ: これにより、サイト構成に関する「安全な」情報 (データベース アクセス資格情報など) が公開される場合が多くあります。そのため、次の操作を行って、個々のファイルまたはディレクトリのデータに対する「その他の」アクセス権限を削除する必要がありますsudo chmod o-rwx /var/www/html/FILEPATH(ファイルのフォルダーFILEPATHへの相対パスに置き換えます)。/var/www/html

また、「新しいファイル」で 403 の問題が発生した場合は、作成またはコピーされてグループが正しく設定されていないファイルやフォルダーに引き続きアクセスできるように、Web サーバーに正しいアクセス許可を与えるために、将来これらのコマンドを再実行する必要がある場合があることにも注意してくださいwww-data


(2)所有者にフォルダとファイルへの読み取り/書き込み権限を与え、ディレクトリ構造を横断するフォルダアクセスを許可します。

sudo chown -R USER /var/www/html/
sudo find /var/www/html -type d -exec chmod u+rwx {} +
sudo find /var/www/html -type f -exec chmod u+rw {} +

USER最初のコマンドを自分のユーザー名に置き換えてください。

ここでは 3 つのことを行います。まず、ユーザーを 内のすべてのファイルとディレクトリの「所有者」に設定します/var/www/html。次に、フォルダーに読み取りおよび書き込み権限を設定し、フォルダーにアクセスしてフォルダーに入ることを許可します (+xディレクトリ項目の項目)。次に、すべてのファイルに、先ほど設定した所有者の読み取り/書き込み権限を設定します。


(3)(オプション)これ以降のすべての新しいファイルは必ずwww-data「アクセス」ユーザーとして作成してください。

sudo find /var/www/html -type d -exec chmod g+s {} +

これにより、ディレクトリのグループに「set gid」ビットが設定されます。これらのディレクトリ内に作成されたファイルとフォルダには常にwww-dataグループが付けられ、Web サーバーへのアクセスが許可されます。


(4)(オプション)他のユーザーにデータを見せたくない場合は、最終的なセキュリティクリーンアップを行う

ユーザーにディレクトリとファイルを表示させる必要があります。Web サーバーにも同様に表示させる必要があります。他のシステム ユーザー (root を除く) にデータを表示させたくない場合があります。そのため、他のユーザーにそのアクセス権を与えず、ユーザーと Web サーバーだけがデータを表示できるようにします。

sudo chmod -R o-rwx /var/www/html/

注記:後でこれを再実行したり、ここで「その他」カテゴリの権限を編集したりする必要はありません。「その他」のユーザーがアクセスできない場合(ファイル構造とディレクトリ構造をトラバースするために必要なビットも、ファイル リストを読み取るためのビットも/var/www/html/持っていない場合)、他のユーザーまたはグループに対するそのディレクトリの下の項目の権限は、実際にはあまり重要ではありません。+x/var/www/html+r


これに少しだけ影響の少ない解決策もありますが、すべての新しいファイルで機能する保証はなく、すべてのファイルシステムで機能する保証もありません。、ファイル アクセス制御リストを含みます。これにより、ファイルの所有権を他のwww-dataユーザーに残すことができますが、ファイルを個人的に所有していなくても、事実上、有効な所有者権限が付与されます。

このソリューションは、あまり侵襲性がなく、ディレクトリとその中のすべてのファイルを所有したりwww-data:www-dataroot:www-data自分自身にアクセス権を与えたりすることができます。アクセス制御リストを使用すると、個別のグループを設定しなくても、複数のユーザーに権限を与えることができます。これにより、rootまたはwww-dataシステム ユーザーがファイルを所有できるようになりますが、ケースごとに追加の権限を追加したり、特定のユーザーの権限を微調整して、読み取りは許可するが編集は許可しないなど、さまざまなことも可能になります。

まだ で作業していると仮定する/var/www/html/と、私たちとシステム (そしてもちろん root) 以外のスヌーピング ユーザーにデータを見られたくない場合は、次のことを行う必要があります。

  1. 所有権を Web サーバーのシステム ユーザーに返しますwww-data
sudo chown -R www-data:www-data /var/www/html
  1. あなたにはファイルの読み取り/書き込み権限を再帰的に付与しますが、他のユーザー (もちろん除く) にはwww-dataファイルrootへのアクセス権を付与しません。
sudo find /var/www/html -type f -exec setfacl -mu:YOURUSERNAME:rw -m other::--- {} \;
  1. ディレクトリに対する読み取り/書き込み/トラバース権限を再帰的に自分に付与し、他のユーザー (www-dataとを除くroot) のフォルダへのアクセスを削除し、これをディレクトリ内の新しいファイルの「デフォルト」 ACL として設定します。
sudo find /var/www/html -type d -exec setfacl -d -mu:YOURUSERNAME:rwx -mo::--- {} \;
  1. また、すべてのディレクトリにビットを設定する必要がありますsetgid。これにより、ファイルを作成した場合でも、Web サーバーがwww-dataグループ権限を介してそのファイルにアクセスできるようになります。
sudo find /var/www/html -type d -exec chmod g+s {} \;

これですべてのディレクトリにアクセスできるようになりました。そしてアクセスを削除する必要がないwww-dataため、Web サーバーは必要に応じてどこにでもファイルを作成できるため便利です (適切な操作のために作成して書き込む必要がある独自のキャッシュ ディレクトリを持つ PHP ベースのフロントエンドなど)。

唯一の注意点は、手動で新しいファイルを作成する場合は、それに応じて chown を実行して、Web サーバーに所有権を与える必要があることです。これは単純な手順でありsudo chown www-data:www-data filename、アクセス制御リストによって、ファイルに対する有効な所有者権限を引き続き保持できるはずです。

システム管理者として、特定のファイルの所有者を変更せずに、非標準のアクセスを行うためにこれを実行しなければならないケースが複数あります。これは機能しますが、すべてのファイルシステムがそうであるわけではないため、独自の問題があります。サポートファイル アクセス リスト。

答え2

トーマス・ワードの素晴らしい回答 https://askubuntu.com/a/767534/717860

推奨されるすべての手順を、8 つのコマンドではなく 3 つのコマンドで実行できます。

3つのコマンド:

sudo chown -R ubuntu:www-data /var/www
sudo find /var/www -type d -exec chmod 2750 {} \+
sudo find /var/www -type f -exec chmod 640 {} \+

次の 8 つのコマンドと同じ作業を実行します。

sudo chgrp -R www-data /var/www
sudo find /var/www -type d -exec chmod g+rx {} +
sudo find /var/www -type f -exec chmod g+r {} +
sudo chown -R ubuntu /var/www/
sudo find /var/www -type d -exec chmod u+rwx {} +
sudo find /var/www -type f -exec chmod u+rw {} +
sudo find /var/www -type d -exec chmod g+s {} +
sudo chmod -R o-rwx /var/www/

答え3

シンボリックリンクを使用して権限の問題を解決するという考え自体に欠陥があり、機能しません。シンボリックリンク自体に表示される権限はほとんど無関係であり、それらを使用して「実際の」ディレクトリの権限を回避することはできません。 から へのシンボリックリンクを作成しても、/var/www/html/moodle/home/andre/www/moodle/権限は回避されません/home/andre/www/moodle/。 で何かをしたい人は/var/www/html/moodle、 に必要な権限を持っている場合にのみ、それを実行できます/home/andre/www/moodle/

sudo chmod -R 775 moodle/実際に実行した効果はありますが、考えていたものとは違い、シンボリックリンクの権限が変更されたのではなく、シンボリックリンクのターゲットの権限が変更されました/home/andre/www/moodle/

ウェブサーバーで 403 エラーが発生するのは、おそらくウェブサーバーに を入力するための必要な権限がないためです/home/andre。これは「追加の問題」ではなく、同じ権限の問題が原因です。

したがって、シンボリックリンクを使用する代わりに、ファイルを編集し、Web サーバーがそれらにアクセスできるようにする (または、アプリケーションによってはそれらを編集できるようにする) 権限を把握する必要があります。それらの権限が正確に何であるかは、実際の使用例 (アプリケーションとサーバーの構成) によって異なります。

一般的に、ファイルの所有者が rw 権限を持ち、Web サーバーはグループ権限を介してファイルへの読み取りアクセスのみを持ち、他のすべてのユーザーにはアクセス権がまったくないというのが良い考えだと思います。

権限の例 (情報が不足しているため、実際のユースケースでは機能しない可能性があります):

andre@fermat:/var/www/html$ ls -al moodle/
total 0
drwxr-x--- 2 andre www-data 60 mai  4 16:20 .
drwxr-xr-x 3 root  root     80 mai  4 16:20 ..
-rw-r----- 1 andre www-data  0 mai  4 16:20 index.html

ディレクトリには、所有者であるあなたがディレクトリにアクセスしてその内容を変更できるだけのアクセス権があり、Web サーバー (グループ 内www-data) はディレクトリにアクセスして読み取ることができることがわかります。ファイル自体は、所有者であるあなたに対して読み取りと書き込みが可能で、Web サーバー (グループ 内) に対して読み取りが可能ですwww-data。その他のすべてのユーザーには、一切のアクセス権がありません。

繰り返しますが、これはあくまでも例として捉えてください。Web サーバーの正確なユーザー/グループは設定によって異なります。また、アプリケーション (moodle) には異なる権限が必要な場合がありますので、そのドキュメントを参照する必要があります。

関連情報