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

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

VPS Webサーバー(Debian 8 + Apache 2 + PHP 5.6)をインストールするための最初のステップを提供しており、ファイル/フォルダの権限についての支援が必要です。

このトピックでは、いくつかの同様のスレッド(まったく同じではありません)が見つかりましたが、すべて4歳または5歳の子供のためです。そのうちのいくつかは、廃止予定のPHPメソッドを使用するソリューションを指しています。たぶん今日は新しい方法や解決策があるかもしれません。

さて、Apache 2はwww-dataユーザー/グループで実行されます。だから私はという名前のユーザーを作成してグループに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を使用してアップロードするすべてのフォルダとPHP / Htmlファイル(として記録されているwebadmin)はwebadminもちろん、所有者になります。 PHPを使用してサブフォルダを作成して画像をアップロードすると、ユーザーはwww-data所有者になります。この場合、SFTP経由でファイルを削除するなど、いくつかの権限の問題が発生しました。

webadminユーザーとグループで実行するようにApacheを指定できますが、セキュリティ上のwww-data問題がある可能性があります(いいえ?)。この問題を回避するために、フォルダを作成してファイルをアップロードするようにサーバーまたはPHPスクリプトを構成する標準およびベストプラクティスはありますか?

答え1

問題は、新しいファイルを書き込めないことです。使用する代わりに設定ディレクトリにグループを設定するには、次のようにします。前方十字靭帯Sこれにより大きな柔軟性が得られます。

これ基本アクセス制御リスト新しいファイルとディレクトリは、ACLで定義された権限を付与するエントリを継承します。設定するには基本アクセス制御リストwebadminグループ入力を許可rwx:

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

このディレクトリに作成された新しいファイルは、グループから読み書きできますwebadmin


ACLがオプションでない場合、あなたは変更する必要がありますマスク、新しいファイルに対するデフォルトのUNIX権限を決定します。新入社員のための賢明な選択マスクはい002(世界書き込み可能ビットマスク)と007(世界中の権限ビットマスク、つまりグループと所有者のみがアクセスできます)

Apacheの設定マスク、systemdユニットファイルを次の場所にコピーします。/など:

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

構成マスク/etc/systemd/system/apache2.service追加してUMask=<umask>[Service]セクションに。これはApacheによって生成されたすべてのファイルに影響します。

変化マスク~のためSFTPPHP / Apacheからアップロードされたファイル/ディレクトリを変更する必要がある場合にのみ必要です。デフォルトでは、umaskは022ファイルグループを作成してグローバルに読み取ることができますが、グループに書き込むことはできません。デフォルト値を設定する最も簡単な方法マスク~のためSFTPそしてpam_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>

最初のルールは、ユーザーがグループにない場合は、次のルールをスキップするようにpamに指示します<yourgroup>。つまり、次の規則は、ユーザーがグループにいる場合にのみ適用されます<yourgroup>。 2番目のルールはumaskを<umask>


付録:移動された既存のファイルはmv元の権限と所有権を保持します。ファイルをコピーして、umaskおよびディレクトリsetgid / ACLのデフォルト権限を適用できますcp -d

答え2

標準の良い点は、一般的に選択できるものが多いことです。

権限を考慮し、WebサーバーのUIDがアップロードされたコンテンツ以外のファイルを書き込めないようにしていただきありがとうございます。アップロードディレクトリでPHPの実行を完全に無効にしてください。現在、追加権限を持つグループにApacheを追加しているため、モデルにはいくつかの欠陥があります。しかし、それは問題の一部にすぎません。しかし、私はあなたが尋ねる質問から抜け出しました。

作成したユーザーは、デバイスへのルートアクセス権があることを意味します(明示的に言及する必要があります)。しかし、独自のソフトウェアを使用しているのか、既製のパッケージを使用しているのかは明らかではありませんでした。後者は、カスタマイズが実行する必要がある定期的なパッチに影響を与える可能性があるため、少し複雑になります。 Apacheがターゲットに対して高いレベルの制御権を持つ唯一のuidである場合は、Apacheのファイルアクセス権をユーザーまたはグループの代わりに「other」に設定することで問題を解決できます。

または、アップロードされたコンテンツへのアクセスを他のアカウントに提供するには、umask 000 / chmodを使用してファイルを666に変更します。 move_uploaded_file() は実際にコピーを作成し、元のファイルを削除します。ファイル生成はumaskに従います。。したがって、適切に書かれたPHPは、Webサーバーにumask 000を設定することで、コードを変更せずにhttpアップロードを誰でも読み書きできるように保存できます。

または、httpアップロードの権限を通常のユーザーアカウントを使用してコンテンツを操作する権限に変更するシェルスクリプトを作成し、sudoを介してスクリプトを呼び出すWebサーバーのuid権限を付与することもできます。これは move_uploaded_file() 以降のコードで呼び出す必要があります。

または、やや醜い解決策は、権限を変更するためにスクリプトにリンクされているアップロードディレクトリにinotify監視を置くことです。インクロン)

最後の手段として、アップロードディレクトリで通常のcronジョブを実行して権限を変更できます。

使用することをお勧めしますマスク方法。

関連情報