web-dev-qa-db-ja.com

PHP is_writable()関数は、書き込み可能なディレクトリに対して常にfalseを返します

PHPベースの ソフトウェアパッケージ をApache2.4.6とPHP)を搭載したRed Hat 7 Amazon EC2インスタンス(AMI-8cff51fb)にインストールしようとしています。 5.4.16 yumを使用してインストールされました。特定のディレクトリが0755または0775のアクセス許可を持つWebサーバーによって書き込み可能である必要があると表示されているため、インストールは失敗します。

問題のディレクトリには、root:Apache所有権を持つ0775のアクセス許可があります。 httpdプロセスがApacheユーザーによって実行されていること、およびApacheユーザーがApacheグループのメンバーであることを確認しました。

/etc/passwdを編集してApacheユーザーに一時的にログインシェルを与え、次にそのアカウントにsuを与えると、touchコマンドを使用してディレクトリ内にApacheユーザーとしてファイルを手動で作成できます。

インストーラースクリプトのソースコードを調べたところ、PHPのis_writable()関数が問題のディレクトリに対してfalseを返しているため、失敗していることがわかりました。別のテストPHPスクリプトを作成して、表示されている動作を分離して検証しました。

<?php
  $dir = '/var/www/html/limesurvey/tmp';
  if (is_writable($dir)) {
    echo $dir, ' is writable';
  } else {
    echo $dir, ' is NOT writable';
  }
?>

書き込み不可のメッセージを出力します。上記の$dir/tmpに変更すると、/tmpが書き込み可能であることが正しく出力されます。

ディレクトリのアクセス許可を0777に変更したり、所有権をApache:apacheに変更したりすると、PHPは、ディレクトリが書き込み可能ではないことを報告します。同じアクセス許可で設定された/testディレクトリを作成しようとしました。所有権と私のテストスクリプトはまだ書き込み可能ではないと報告します。

私はこの振る舞いを説明するのに本当に途方に暮れているので、どんなアイデアでも歓迎します!

前もって感謝します。


/var/www/html/limesurveyのディレクトリリストを以下に示します。 tmpおよびuploadディレクトリには、Lime Surveyの インストール手順 に従って0775の権限があります。 test.phpは、上記の私のテストスクリプトです。

[ec2-user@ip-xx-x-x-xxx limesurvey]$ pwd
/var/www/html/limesurvey
[ec2-user@ip-xx-x-x-xxx limesurvey]$ ls -al
total 80
drwxr-xr-x. 20 root Apache 4096 Mar 30 11:25 .
drwxr-xr-x.  3 root root     23 Mar 25 14:41 ..
drwxr-xr-x.  2 root Apache   38 Mar 10 12:56 admin
drwxr-xr-x. 16 root Apache 4096 Mar 10 12:56 application
drwxr-xr-x.  3 root Apache 4096 Mar 10 12:56 docs
drwxr-xr-x.  2 root Apache 4096 Mar 10 12:56 fonts
drwxr-xr-x. 19 root Apache 4096 Mar 10 12:56 framework
-rw-r--r--.  1 root Apache  429 Mar 10 12:56 .gitattributes
-rw-r--r--.  1 root Apache  399 Mar 10 12:56 .gitignore
-rw-r--r--.  1 root Apache  296 Mar 10 12:56 .htaccess
drwxr-xr-x.  4 root Apache 4096 Mar 10 12:56 images
-rw-r--r--.  1 root Apache 6652 Mar 10 12:56 index.php
drwxr-xr-x.  5 root Apache   39 Mar 10 12:56 installer
drwxr-xr-x. 89 root Apache 4096 Mar 10 12:56 locale
drwxrwxr-x.  2 root Apache   39 Mar 25 14:41 logs
drwxr-xr-x.  4 root Apache   49 Mar 10 12:56 plugins
-rw-r--r--.  1 root Apache   61 Mar 10 12:56 README
drwxr-xr-x.  4 root Apache 4096 Mar 10 12:56 scripts
-rw-r--r--.  1 root Apache  380 Mar 10 12:56 .scrutinizer.yml
drwxr-xr-x.  5 root Apache 4096 Mar 10 12:56 styles
drwxr-xr-x.  5 root Apache 4096 Mar 10 12:56 styles-public
drwxr-xr-x. 12 root Apache 4096 Mar 10 12:56 templates
-rw-r--r--.  1 root Apache  159 Mar 30 11:11 test.php
drwxr-xr-x.  3 root Apache   20 Mar 10 12:56 themes
drwxr-xr-x. 26 root Apache 4096 Mar 10 12:56 third_party
drwxrwxr-x.  5 root Apache   80 Mar 26 13:45 tmp
drwxrwxr-x.  6 root Apache   79 Mar 10 12:57 upload

namei -l /var/www/html/limesurvey/tmpを実行すると、次のようになります。

[ec2-user@ip-x-x-x-xxx ~]$ namei -l /var/www/html/limesurvey/tmp
f: /var/www/html/limesurvey/tmp
drwxr-xr-x root root   /
drwxr-xr-x root root   var
drwxr-xr-x root root   www
drwxr-xr-x root root   html
drwxr-xr-x root Apache limesurvey
drwxrwxr-x root Apache tmp
16
John Topley

多くの頭を悩ませた後、SELinuxがディレクトリへの書き込みを妨げていることが判明しました。 何が起こっているのかを説明する良いチュートリアル を見つけました。このコマンドを実行することで修正できました:

Sudo chcon -R -t httpd_sys_rw_content_t tmp
24
John Topley

inCentOS6上記はSELinuxで強制を有効にする必要があります

setenforce Permissive

ステータスを確認する

sestatus

https://wiki.centos.org/HowTos/SELinux を参照してください

10
jhl

ディレクトリに書き込むには、上記のディレクトリへの実行権限も必要です。

namei -l /var/www/html/limesurvey/tmp

正しい権限がないステップを表示する必要があります。

0
exussum

is_writableはデフォルトで、グループではなくユーザーのみをチェックします。したがって、グループが一致し、権限を持っている場合でも、is_writableはfalseを返します。このチェックを緩和するには、設定する必要があります

safe_mode_gid = On

PHP configで、またはそれに応じてユーザーを変更します。

0
Deckard
HTTPDUSER=`ps aux | grep -E '[a]pache|[h]ttpd|[_]www|[w]ww-data|[n]ginx' | grep -v root | head -1 | cut -d\  -f1`
Sudo setfacl -R -m u:"$HTTPDUSER":rwX -m u:`whoami`:rwX tmp
Sudo setfacl -dR -m u:"$HTTPDUSER":rwX -m u:`whoami`:rwX tmp

Symfony2インストールガイドから直接取得したこれにより、ApacheツールとCLIツール間のキャッシュ書き込みアクセス共有の問題が解決されます。これは、tmpディレクトリでも機能する可能性があります。

0
Flosculus