web-dev-qa-db-ja.com

Apache PHPアップロード-所有権と権限

VPS Webサーバー(Debian 8 + Apache 2 + PHP 5.6))をインストールするための最初のステップを示していますが、ファイル/フォルダーのアクセス許可についてサポートが必要です。

私はすでにこの主題についていくつかの同様のトピックを見つけました(まったく同じではありません)、そしてすべて4または5歳からです。それらのいくつかは、非推奨のPHPメソッドを使用したソリューションを指しています。今日、いくつかの新しいメソッドまたはソリューションがあるかもしれません。

さて、www-dataユーザー/グループで実行されるApache2があります。そこで、webadminというユーザーを作成し、それをwww-dataグループに入れて、メインのWebサイトフォルダーの所有者として構成しました。

adduser webadmin
usermod -a -G www-data webadmin
chown -R webadmin:www-data /var/www/website.com

public_htmlフォルダーのアクセス許可も次のように変更しました。

find /var/www/website.com/public_html -type f -exec chmod 644 {} +
find /var/www/website.com/public_html -type d -exec chmod 755 {} +
find /var/www/website.com/public_html -type d -exec chmod g+s {} +

そして、アップロードされたファイル(静的ファイルのみ-画像)を受け取るフォルダーを作成しました:

mkdir /var/www/website.com/public_html/uploads
chown webadmin:www-data /var/www/website.com/public_html/uploads
chmod 774 /var/www/website.com/public_html/uploads

さて、何が起こっているのでしょうか。SFTP(webadminとして記録)を使用してアップロードしたすべてのフォルダーとPHP/Htmlファイルは、もちろん所有者としてwebadminを取得します。 PHPを使用してサブフォルダーを作成し、画像をアップロードすると、所有者としてwww-dataユーザーが取得されます。このシナリオでは、SFTPを介してファイルを削除するなど、いくつかのアクセス許可の問題が発生しています。

webadminユーザーおよびwww-dataグループとして実行するようにApacheを割り当てることもできますが、セキュリティの問題が発生する可能性があると思います(そうではないですか?)。この問題を回避するためにフォルダを作成してファイルをアップロードするサーバーまたはPHPスクリプトを構成する標準的で最良の方法はありますか?

4
Guybrush

あなたの問題は、新しいファイルがグループ書き込み可能ではないということです。ディレクトリでsetgidを使用してグループを設定する代わりに、 [〜#〜] acl [〜#〜]s より柔軟性があります。

デフォルトのACLエントリは、新しいファイルとディレクトリに継承され、ACLで定義されたアクセス許可を付与します。グループwebadminデフォルトACLエントリを設定して、rwxを許可するには:

setfacl -m default:g:webadmin:rwx /var/www/website.com/public_html/uploads

ディレクトリに作成された新しいファイルは、グループwebadminに対して読み取りと書き込みが可能です。


ACLがオプションでない場合umaskを変更する必要があります、これは新しいファイルのデフォルトのUNIX権限を決定します。新しいumaskの賢明な選択は、002(ワールド書き込み可能なビットマスク)と007(すべてのワールド許可ビットがマスクされている、つまりグループと所有者のみがアクセスできる)。

Apacheumaskを設定するには、systemdユニットファイルを/ etcにコピーします。

cp /lib/systemd/system/Apache2.service /etc/systemd/system/

/etc/systemd/system/Apache2.serviceセクションに UMask=<umask> を追加して、[Service]umaskを構成します。これは、Apacheによって作成されたすべてのファイルに影響することに注意してください。

sftpumaskを変更する必要があるのは、アップロードされたファイル/ディレクトリをPHP/Apacheから変更する必要がある場合のみです。デフォルトのumask022は、ファイルをグループおよび誰でも読み取り可能に作成しますが、グループ書き込み可能ではありません。 sftpのデフォルトumaskを構成する最も簡単な方法は、 pam_umask を使用することです。

カスタムumaskを特定のグループのユーザーにのみ適用し、sftpを使用する場合にのみ、/etc/pam.d/sshdを次のように追加します

session [default=1 success=ignore] pam_succeed_if.so user notingroup <yourgroup>
session optional                   pam_umask.so umask=<umask>

最初のルールは、ユーザーがグループ<yourgroup>に属していない場合、つまりユーザーがグループ<yourgroup>に属している場合にのみ、次のルールを適用するようにpamに指示します。 2番目のルールは、umaskを<umask>に設定します。


補遺mvで移動された既存のファイルは、元の権限と所有権を保持することに注意してください。代わりにcp -dを使用してファイルをコピーすることにより、umaskおよびディレクトリsetgid/ACLからデフォルトの権限を適用できます。

2
sebasth