使用するアクセス許可を決定するときは、ユーザーが誰で、何が必要かを正確に知る必要があります。Webサーバーは2種類のユーザーと対話します。
認証されたユーザーはサーバー上にユーザーアカウントを持ち、特定の特権を付与できます。これには通常、システム管理者、開発者、およびサービスアカウントが含まれます。通常、SSHまたはSFTPを使用してシステムに変更を加えます。
匿名ユーザーは、Webサイトへの訪問者です。ファイルに直接アクセスする権限はありませんが、Webページを要求でき、Webサーバーがその代わりに動作します。Webサーバープロセスが持つ権限に注意することで、匿名ユーザーのアクセスを制限できます。多くのLinuxディストリビューションでは、Apacheはwww-data
ユーザーとして実行されますが、異なる場合があります。使用するps aux | grep httpd
か、ps aux | grep apache
Apacheがあなたのシステムに使用しているものユーザーを参照すること。
Linuxの権限に関する注意
Linuxおよびその他のPOSIX準拠システムは、従来のUNIX許可を使用します。ウィキペディアにはファイルシステムのアクセス許可に関する優れた記事がありますので、ここですべてを繰り返すことはしません。ただし、注意すべき点がいくつかあります。
実行ビットの
解釈済みスクリプト(Ruby、PHPなど)は、実行権限がなくても正常に機能します。実行ビットが必要なのはバイナリとシェルスクリプトのみです。ディレクトリをトラバース(入力)するには、そのディレクトリに対する実行権限が必要です。ウェブサーバーは、ディレクトリをリストしたり、その中のファイルを提供したりするためにこの許可が必要です。
デフォルトの新規ファイル許可
ファイルが作成されると、通常は作成者のグループIDを継承します。ただし、新しいファイルが作成されたフォルダーのグループIDを継承したい場合があります。そのため、親フォルダーのSGIDビットを有効にします。
デフォルトの許可値は、umaskに依存します。umaskは、新しく作成されたファイルからアクセス許可を差し引くため、共通の値022は755で作成されるファイルになります。グループと共同作業する場合、umaskを002に変更すると、作成したファイルをグループメンバーが変更できます。また、アップロードされたファイルの権限をカスタマイズする場合は、Apacheのumaskを変更するか、ファイルがアップロードされた後にchmodを実行する必要があります。
777の問題
ときにあなたがchmod 777
あなたのウェブサイト、あなたは一切の保障がありません。システム上のすべてのユーザーは、Webサイト内のファイルを変更または削除できます。しかし、もっと真剣に、WebサーバーはWebサイトへの訪問者に代わって動作し、Webサーバーは実行中の同じファイルを変更できることを覚えておいてください。Webサイトにプログラミングの脆弱性がある場合、それらを悪用してWebサイトの改ざん、フィッシング攻撃の挿入、または知らないうちにサーバーから情報を盗むことができます。
さらに、サーバーが既知のポートで実行されている場合(非ルートユーザーが誰でもアクセスできるリスニングサービスを生成できないようにするため)、ルートでサーバーを起動する必要があります(正常なサーバーはすぐにドロップしますが)ポートがバインドされると、権限の低いアカウントに送信されます)。つまり、メインの実行可能ファイルがバージョン管理の一部であるWebサーバー(CGIアプリなど)を実行している場合、ユーザーの名前を変更できるため、そのアクセス許可(または、そのために、含まれるディレクトリのアクセス許可)を残します実行可能ファイル)777では、すべてのユーザーがルートとして実行可能ファイルを実行できます。
要件を定義する
- 開発者はWebサイトを更新できるように、ファイルへの読み取り/書き込みアクセスが必要です
- 開発者は、ディレクトリを参照/書き込み/実行する必要があります
- Apacheはファイルおよび解釈されたスクリプトへの読み取りアクセスを必要とします
- Apacheは、提供可能なディレクトリへの読み取り/実行アクセスを必要とします
- Apacheは、アップロードされたコンテンツのディレクトリへの読み取り/書き込み/実行アクセスを必要とします
単一のユーザーによって維持されます
サイトの管理を担当するユーザーが1人だけの場合は、それらのユーザーをWebサイトディレクトリのユーザー所有者として設定し、ユーザーに完全なrwx権限を付与します。Apacheは引き続きファイルを提供できるようにアクセスする必要があるため、www-dataをグループ所有者として設定し、グループにrxパーミッションを付与します。
あなたの場合、ユーザー名がである可能性のあるイブ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
これは一般的なアプローチですが、欠点もあります。システム上の他のすべてのユーザーは、Apacheと同じWebサイトへの特権を持っているため、他のユーザーは簡単にサイトを閲覧し、設定ファイルなどの秘密データを含むファイルを読むことができます。
ケーキを持って食べてもいい
これはさらに改善することができます。所有者がグループよりも少ない権限を持っていることは完全に合法であるため、ルートに割り当てることでユーザー所有者を無駄にする代わりに、ApacheをWebサイトのディレクトリおよびファイルのユーザー所有者にすることができます。これは、単一のメンテナーシナリオの反転ですが、同様に機能します。
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サイトに複雑な要件がある場合は、すべてのアクセス許可を設定するスクリプトを作成することをお勧めします。徹底的にテストしてから、安全に保管してください。何らかの理由でウェブサイトを再構築する必要がある場合は、金で一見の価値があります。