解決策 1:
使用するアクセス許可を決定するときは、ユーザーが誰で、何を必要としているかを正確に把握する必要があります。 Web サーバーは 2 種類のユーザーと対話します。
認証済み ユーザーはサーバー上にユーザー アカウントを持ち、特定の権限を付与できます。これには通常、システム管理者、開発者、およびサービス アカウントが含まれます。彼らは通常、SSH または SFTP を使用してシステムに変更を加えます。
匿名 ユーザーはあなたのウェブサイトへの訪問者です。ファイルに直接アクセスする権限はありませんが、Web ページを要求でき、Web サーバーが代わりに動作します。 Web サーバー プロセスが持つ権限に注意することで、匿名ユーザーのアクセスを制限できます。多くの Linux ディストリビューションでは、Apache は www-data
として実行されます。 ユーザーですが、異なる場合があります。 ps aux | grep httpd
を使用 または ps aux | grep apache
システムで Apache が使用しているユーザーを確認します。
Linux パーミッションに関する注意事項
Linux およびその他の POSIX 準拠システムは、従来の UNIX パーミッションを使用します。ウィキペディアにファイルシステムのアクセス許可に関する優れた記事があるため、ここではすべてを繰り返しません。ただし、注意すべき点がいくつかあります。
実行ビット
解釈されたスクリプト (Ruby、PHP など) は、実行権限がなくても問題なく動作します。実行ビットが必要なのは、バイナリとシェル スクリプトだけです。ディレクトリをトラバース (入力) するには、そのディレクトリに対する実行権限が必要です。 Web サーバーは、ディレクトリを一覧表示したり、ディレクトリ内のファイルを提供したりするために、この許可を必要とします。
デフォルトの新しいファイル許可
ファイルが作成されると、通常は作成者のグループ ID を継承します。ただし、場合によっては、新しいファイルが作成されたフォルダーのグループ ID を継承するようにする必要があるため、親フォルダーで SGID ビットを有効にします。
デフォルトの許可値は、umask によって異なります。 umask は新しく作成されたファイルから権限を差し引くため、022 という一般的な値は 755 で作成されるファイルになります。グループと共同作業する場合、作成したファイルをグループ メンバーが変更できるように、umask を 002 に変更すると便利です。アップロードされたファイルのパーミッションをカスタマイズしたい場合は、apache の umask を変更するか、ファイルのアップロード後に chmod を実行する必要があります。
777 の問題
chmod 777
の場合 あなたのウェブサイトには、何のセキュリティもありません。システム上のすべてのユーザーは、Web サイト内のファイルを変更または削除できます。しかし、もっと深刻なことに、Web サーバーは Web サイトへの訪問者に代わって動作し、Web サーバーは実行中のファイルと同じファイルを変更できることを思い出してください。 Web サイトにプログラミングの脆弱性がある場合、Web サイトを改ざんしたり、フィッシング攻撃を挿入したり、知らないうちにサーバーから情報を盗んだりするために悪用される可能性があります。
さらに、サーバーが well-known ポートで実行されている場合 (root 以外のユーザーが世界からアクセス可能なリッスン サービスを生成するのを防ぐ必要があります)、サーバーを root で起動する必要があることを意味します (正常なサーバーはすぐにドロップしますが)。ポートがバインドされると、権限の低いアカウントに割り当てられます)。つまり、メインの実行可能ファイルがバージョン管理の一部である Web サーバー (CGI アプリなど) を実行している場合、そのパーミッション (または、ユーザーが名前を変更できるため、それを含むディレクトリのパーミッション) を残します。実行可能ファイル) 777 で 任意の を許可 任意のを実行するユーザー ルートとして実行可能。
要件を定義する
- 開発者は、ウェブサイトを更新できるように、ファイルへの読み取り/書き込みアクセスが必要です
- 開発者は、ディレクトリを参照できるように、ディレクトリに対して読み取り/書き込み/実行を行う必要があります
- Apache には、ファイルと解釈されたスクリプトへの読み取りアクセスが必要です
- Apache には、提供可能なディレクトリへの読み取り/実行アクセスが必要です
- Apache には、アップロードされたコンテンツのディレクトリへの読み取り/書き込み/実行アクセス権が必要です
1 人のユーザーが管理
サイトの保守を担当するユーザーが 1 人だけの場合は、そのユーザーを Web サイト ディレクトリのユーザー所有者として設定し、ユーザーに完全な rwx 権限を付与します。 Apache はファイルを提供できるようにアクセスする必要があるため、www-data をグループ所有者として設定し、グループに r-x パーミッションを付与してください。
あなたの場合、ユーザー名が eve
の Eve です。 、 contoso.com
を維持している唯一のユーザーです :
chown -R eve contoso.com/
chgrp -R www-data contoso.com/
chmod -R 750 contoso.com/
chmod g+s contoso.com/
ls -l
drwxr-s--- 2 eve www-data 4096 Feb 5 22:52 contoso.com
Apache によって書き込み可能にする必要があるフォルダーがある場合は、グループ所有者のアクセス許可の値を変更して、www-data が書き込みアクセスできるようにすることができます。
chmod g+w uploads
ls -l
drwxrws--- 2 eve www-data 4096 Feb 5 22:52 uploads
この構成の利点は、ユーザーとグループの所有者のみが Web サイトのディレクトリを参照できるため、システム上の他のユーザーが詮索することが難しくなります (ただし、不可能ではありません*)。これは、構成ファイルに秘密のデータがある場合に役立ちます。 umask に注意してください。ここで新しいファイルを作成すると、権限の値はおそらくデフォルトで 755 になります。 umask 027
を実行できます。 新しいファイルのデフォルトが 640 (rw- r-- ---
) になるように ).
ユーザーのグループによって維持
複数のユーザーがサイトの維持を担当している場合は、権限の割り当てに使用するグループを作成する必要があります。 Web サイトごとに個別のグループを作成し、その Web サイトにちなんだ名前をグループに付けるのは良い習慣です。
groupadd dev-fabrikam
usermod -a -G dev-fabrikam alice
usermod -a -G dev-fabrikam bob
前の例では、グループ所有者を使用して Apache に権限を付与しましたが、現在は開発者グループに使用されています。ユーザー所有者はもはや役に立たないので、権限が漏洩しないようにする簡単な方法は、root に設定することです。 Apache にはまだアクセスが必要なので、残りの世界に読み取りアクセスを許可します。
chown -R root fabrikam.com
chgrp -R dev-fabrikam fabrikam.com
chmod -R 775 fabrikam.com
chmod g+s fabrikam.com
ls -l
drwxrwxr-x 2 root dev-fabrikam 4096 Feb 5 22:52 fabrikam.com
Apache による書き込みが必要なフォルダーがある場合は、Apache をユーザー所有者またはグループ所有者にすることができます。いずれにせよ、必要なすべてのアクセス権が付与されます。個人的には、開発者がアップロード フォルダーのコンテンツを参照して変更できるように、ユーザー所有者にすることを好みます。
chown -R www-data uploads
ls -l
drwxrwxr-x 2 www-data dev-fabrikam 4096 Feb 5 22:52 uploads
これは一般的なアプローチですが、欠点もあります。システム上の他のすべてのユーザーは、Web サイトに対して Apache と同じ権限を持っているため、他のユーザーが簡単にサイトを閲覧し、構成ファイルなどの機密データを含む可能性のあるファイルを読み取ることができます。
自分のケーキを持って食べてもいい
これはさらに改善することができます。所有者がグループよりも少ない権限を持つことは完全に合法であるため、ユーザー所有者をルートに割り当てて無駄にする代わりに、Web サイトのディレクトリとファイルのユーザー所有者を Apache にすることができます。これは単一のメンテナ シナリオの逆ですが、同様にうまく機能します。
chown -R www-data fabrikam.com
chgrp -R dev-fabrikam fabrikam.com
chmod -R 570 fabrikam.com
chmod g+s fabrikam.com
ls -l
dr-xrwx--- 2 www-data dev-fabrikam 4096 Feb 5 22:52 fabrikam.com
Apache によって書き込み可能にする必要があるフォルダーがある場合は、ユーザー所有者のアクセス許可の値を変更して、www-data が書き込みアクセスできるようにすることができます。
chmod u+w uploads
ls -l
drwxrwx--- 2 www-data dev-fabrikam 4096 Feb 5 22:52 fabrikam.com
このソリューションで注意すべきことの 1 つは、新しいファイルのユーザー所有者が www-data に設定されるのではなく、作成者と一致することです。そのため、作成した新しいファイルは、chown するまで Apache で読み取ることができません。
*Apache 権限の分離
先ほど、使用している権限の種類に関係なく、他のユーザーが Web サイトを詮索する可能性があると述べました。デフォルトでは、すべての Apache プロセスは同じ www-data ユーザーとして実行されるため、どの Apache プロセスも同じサーバー上に構成された他のすべての Web サイトからファイルを読み取ることができ、場合によっては変更を加えることさえできます。 Apache でスクリプトを実行できるすべてのユーザーは、Apache 自体が持っているのと同じアクセス権を取得できます。
この問題に対処するために、Apache で特権を分離するためのさまざまなアプローチがあります。ただし、各アプローチには、さまざまなパフォーマンスとセキュリティの欠点があります。私の意見では、セキュリティ要件の高いサイトは、共有サーバーで VirtualHosts を使用するのではなく、専用サーバーで実行する必要があります。
その他の考慮事項
以前は言及していませんでしたが、通常、開発者が Web サイトを直接編集するのは悪い習慣です。大規模なサイトの場合、バージョン管理システムのコンテンツから Web サーバーを更新する何らかのリリース システムを使用する方がはるかに優れています。単一のメンテナー アプローチはおそらく理想的ですが、人間の代わりにソフトウェアを自動化しています。
Web サイトで提供する必要のないアップロードが許可されている場合、それらのアップロードは Web ルートの外のどこかに保存する必要があります。そうしないと、秘密にすることを意図したファイルをダウンロードしていることに気付く可能性があります。たとえば、学生に課題の提出を許可する場合、課題は Apache によって提供されていないディレクトリに保存する必要があります。これは、シークレットを含む構成ファイルにも適した方法です。
より複雑な要件を持つ Web サイトの場合は、アクセス制御リストの使用を検討することをお勧めします。これらにより、権限のより高度な制御が可能になります。
Web サイトに複雑な要件がある場合は、すべての権限を設定するスクリプトを作成することをお勧めします。徹底的にテストしてから、安全に保管してください。なんらかの理由でウェブサイトを再構築する必要がある場合は、その価値があるかもしれません.
解決策 2:
Apache (および/または PHP) ができることを制御するために、Linux の権利の「その他」(o) の部分を使用する (または推奨する) 人が非常に多いのはなぜでしょうか。この適切な部分を「0」以外の値に設定すると、ファイル/ディレクトリに対して全世界が何かを実行できるようになります。
私のアプローチは次のとおりです。
- 私は 2 人の別々のユーザーを作成しています。 1 つは SSH/SFTP アクセス (必要な場合) 用で、すべてのファイルを所有します。もう 1 つは PHP FastCGI ユーザー (Web サイトを実行するユーザー) 用です。これらのユーザーをそれぞれ bob と呼びましょう そしてボブwww .
- ボブ 完全な権利が与えられます (rwx フォルダ、rw- ウェブサイト全体を読んで編集できるようにする
- PHP FastCGI プロセスには r-x が必要です フォルダと r-- に対する権限
cache/
のような非常に特殊なフォルダを除いて、ファイルに対する権限 またはuploads/
、「書き込み」権限も必要です。 PHP FastCGI にこの機能を与えるには、bob-www として実行します。 、および bob-www 自動的に作成された bob に追加されます グループ。 - すべてのディレクトリとファイルの所有者とグループが bob bob であることを確認しました .
- 何かが足りない :FastCGI を使用していても、Apache には静的コンテンツ用の読み取りアクセス、または
AllowOverride
の場合に読み取ろうとする .htaccess ファイルが必要です。None
以外に設定されている . o の使用を避けるには 権利の一部に www-data を追加します ボブへのユーザー グループ。
現在:
- 開発者ができることを制御するために、u で遊ぶことができます 権利の一部 (ただし、これは以下のメモ)。
- Apache と PHP でできることを制御するには、g を使用します。 権利の一部
- o part は常に 0 に設定されているため、サーバー上の誰も Web サイトを読み取ったり編集したりできません。
- ボブの場合は問題ありません ユーザーが新しいファイルを作成すると、そのファイルは自動的にそのメイン グループ (bob) に属します。 ).
これは要約ですが、この状況では bob SSH が許可されます。 Web サイトの変更を許可されたユーザーがいない場合 (たとえば、顧客が CMS 管理パネルからのみ Web サイトを変更し、Linux の知識がない場合)、とにかく 2 人のユーザーを作成しますが、/bin/false
を与えます。 ボブのシェルとして 同様に、そのログインを無効にします。
adduser --home /var/www/bobwebsite --shell /bin/bash bob
adduser --no-create-home --shell /bin/false --disabled-login --ingroup bob bob-www
adduser www-data bob
cd /var/www/bobwebsite
chown -R bob:bob .
find -type d -exec chmod 750 {} \;
find -type f -exec chmod 640 {} \;
注: 人々は u を制限することを忘れがちです ファイルの所有者は chmod
を実行できるため、(所有者) 権限はほとんどの場合役に立たず、安全ではありません。 コマンドでも、権利は 000 です。
私のアプローチにセキュリティ上の問題があるかどうか教えてください.
この設定には問題があると思います:PHP/Apache が新しいファイルを作成すると (アップロードなど)、それは bob-www:bob に属します 、ボブ 読めるだけになります。ディレクトリの setuid で問題が解決する場合があります。
解決策 3:
上記の優れた回答に対する Google のランクを考えると、注意すべき点が 1 つあります。回答の後にメモを残すことができないようです。
例を続けると、所有者として www-data を使用し、ディレクトリ (またはファイル) に対する 570 のアクセス許可を持つグループとして dev-fabrikam を使用することを計画している場合、Linux は無視することに注意することが重要です。 setuid
、したがって、すべての新しいファイルは、それらを作成したユーザーによって所有されます。これは、新しいディレクトリとファイルを作成した後、次のようなものを使用する必要があることを意味します:
chown -R www-data /newdirectory/
chmod -R 570 /newdirectory/
Rackspace OpenStack の Ubuntu 12.04 では、サーバーを再起動するまでアクセス許可 570 を取得できないという奇妙な問題が発生しましたが、これにより問題が魔法のように修正されました。その一見単純な問題よりも、ますます髪を失っていました....
解決策 4:
私はこの構成で行きます:
<オール>root
にアップロードする以外のすべてのディレクトリ およびグループ root
、0755
へのアクセス許可 .root
に設定されたすべてのファイル およびグループ root
、0644
へのアクセス許可 .root
に設定されたディレクトリをアップロードします 、グループ www-data
、1770
へのアクセス許可 .スティッキー ビットにより、グループ所有者はディレクトリとファイルを削除したり名前を変更したりできなくなります。www-data
の新しいディレクトリが作成されます 所有者のユーザーとグループ、および 0700
各 www-data
の権限 ファイルをアップロードするユーザー
AllowOverride
を拒否 と Index
Apache が .htaccess
を読み取らないように、uploads ディレクトリに ファイル、および Apache ユーザーはアップロード フォルダーのコンテンツにインデックスを付けることができません:
<Directory /siteDir>
Options -Indexes
</Directory>
<Directory /siteDir/uploadDir>
AllowOverride none
</Directory>
6. php.ini
構成:
open_basedir = /siteDir:/tmp:/usr/share/phpmyadmin
post_max_size = 5M
file_uploads = On
upload_max_filesize = 3M
max_file_uploads = 20
この構成では、www-data
ユーザーは siteDir/
以外のディレクトリに入ることができなくなります /tmp
と /usr/share/phpmyadmin
.また、最大ファイル サイズ、最大投稿サイズ、および同じリクエストでアップロードする最大ファイルを制御できます。
解決策 5:
「leo」という名前の FTP ユーザーがファイルを example.com Web ディレクトリにアップロードする必要があり、「apache」ユーザーがキャッシュ ディレクトリに uploa-files/sessions/cache ファイルを作成できるようにする必要がある場合は、次のようにします。
このコマンドは、leo を所有者として、グループを apache として example.com に割り当てます。apache ユーザーはグループ apache の一部であるため、apache グループの権限を継承します
<ブロック引用>chown -R leo:apache example.com
適切な許可を保証し、セキュリティ上の懸念も満たす別のコマンド。
<ブロック引用>chmod -R 2774 example.com
ここで最初の番号 2 はディレクトリ用であり、作成された各新しいファイルが同じグループと所有者のアクセス許可のままであることを保証します。 77 は所有者用で、グループは完全なアクセス権があることを意味します。 4 は、他の人がトラフしか読めないことを意味します。
以下は許可番号を理解するのに役立ちます
Number Octal Permission Representation
0 No permission
1 Execute permission
2 Write permission
3 Execute and write permission: 1 (execute) + 2 (write) = 3
4 Read permission
5 Read and execute permission: 4 (read) + 1 (execute) = 5
6 Read and write permission: 4 (read) + 2 (write) = 6
7 All permissions: 4 (read) + 2 (write) + 1 (execute) = 7