web-dev-qa-db-ja.com

PHP)を使用した適切な権限にもかかわらず、権限が拒否されました

PHPでファイルを読み取ろうとしていますが、誰もがファイルへの読み取りアクセス権を持っていますが、アクセス許可が拒否されましたというエラーが表示されます。

PHPコード:

$config=file_get_contents('/opt/jenkins/home/config.xml');

エラー:

Warning: file_get_contents(/opt/jenkins/home/config.xml): failed to open stream: Permission denied in [...]

ファイルシステムのアクセス許可:

/opt/jenkins/home/から/var/lib/jenkinsを指すシンボリックリンクがあり、誰もがシンボリックリンク、実際のフォルダー、およびファイルに対する読み取り権限を持っています。

$ ls -lh /opt/jenkins/
lrwxrwxrwx 1 sysadmin sysadmin   16 2011-08-04 08:12 home -> /var/lib/jenkins

$ ls -lh /var/lib/ | grep jenkins
drwxr-xr-- 6 jenkins adm     4.0K 2011-08-04 10:04 jenkins

$ ls -lh /var/lib/jenkins/config.xml
-rwxr-xr-- 1 jenkins adm 3.9K 2011-08-04 10:05 /var/lib/jenkins/config.xml

Apache構成

シンボリックリンク(Options All)に従うように構成されています。 /var/lib/jenkins/Directoryディレクティブを追加しても違いはありません。

<Directory /opt/jenkins/home/>
        Options All
        AllowOverride All
        Order Allow,Deny
        Allow from All
</Directory>

追加情報

シンボリックリンクを介したパス("/opt/jenkins/home/config.xml")を使用するか、実際のパス("/var/lib/jenkins/config.xml")を使用するかにかかわらず、同じ問題が発生します。

Apache2 version=2.2.14-5ubuntu8.4
php version=5.3.2-1ubuntu4.9

なぜエラーが発生するのかについて何か考えはありますか?

14
Max

これを機能させるには、ディレクトリにexecute権限が必要です。ワールドが実行されていないようです。また、jenkinsはおそらくApacheユーザーではなく、Apacheユーザーはadmグループに属していないため、機能しません。

$ ls -lh /var/lib/ | grep jenkins
drwxr-xr-- 6 jenkins adm     4.0K 2011-08-04 10:04 jenkins

例ごと:

netcoder@netcoder:~$ mkdir foo
netcoder@netcoder:~$ echo hello > foo/bar
netcoder@netcoder:~$ chmod 777 foo/bar
netcoder@netcoder:~$ ls -lsah foo/bar 
4.0K -rwxrwxrwx 1 netcoder netcoder 6 2011-08-04 08:22 foo/bar
netcoder@netcoder:~$ chmod 444 foo/
netcoder@netcoder:~$ ls -lsah | grep foo
4.0K dr--r--r--  2 netcoder netcoder 4.0K 2011-08-04 08:22 foo
netcoder@netcoder:~$ cat foo/bar 
cat: foo/bar: Permission denied

たとえ foo/bar0777パーミッション、ディレクトリに実行パーミッションがない場合、その内容の読み取りは拒否されます。

ターゲットディレクトリとシンボリックリンクの両方に設定する権限が必要です。

12
netcoder

そのファイルまでの階層内のすべてのディレクトリに実行ビットを設定する必要があります。

chmod o+x /var/lib/jenkins

トリックを行う必要があります。

(注:ls -lhd /var/lib/jenkinsls -lh ...|grep jenkinsよりも少し優れています)

7
Mat

多くの最新のボックス(Digital Ocean、rackspaceなど)には、RedHat互換OS(CentOSなど)用のSELinux(Security Enhanced Linux)が付属しています。これはあなたが心に留めておく必要がある作品に別のレンチを投げます。権限を設定することができます完全に設定しても、権限が拒否されたと表示されます。 SELinuxの書き込み可能なコンテキストを定義する必要があります。

Sudo chcon -t httpd_sys_rw_content_t /data/www/html/sites/mysite -R

3
jpschroeder

ほとんどの場合、ApacheユーザーはWebファイルの読み取りまたはアクセスを許可されていません

  1. Apacheが実行されているユーザーを確認します。

    $ ps aux | grep [a]pache
    root     40283  0.0  0.2 472548 21116 ?        Ss   14:38   0:00 /usr/sbin/Apache2 -k start
    www-data 40287  0.0  0.1 472760  8800 ?        S    14:38   0:00 /usr/sbin/Apache2 -k start
    www-data 40288  0.0  0.1 472760  8540 ?        S    14:38   0:00 /usr/sbin/Apache2 -k start
    www-data 40289  0.0  0.1 472776  8540 ?        S    14:38   0:00 /usr/sbin/Apache2 -k start
    
  2. Webファイルのパス所有権を確認してください。

    $ namei -mol /home/john/app2/
    f: /home/john/app2/
    drwxr-xr-x root root  /
    drwxr-xr-x root root  home
    drwx------ john john  john         # <== Ahaa, no access for Apache user!
    drwxr-xr-x john john  john app2
    
  3. それに応じて権限を調整します。

このステップでは、それをあなたに任せます、あなたは(a)この例ではmakeApacheユーザー 'john'。または、(b)Webフォルダを外部の場所に移動することもできます家。セキュリティのグッドプラクティスを破ることなく、グループまたは他のユーザーに実行アクセスを許可できる場合。

a。 Apacheユーザーをjohnにします(開発サイトの場合、または自分が何をしているかを知っている場合のみ)

Sudo vi /etc/Apache2/envars 
# replace 
export Apache_RUN_USER=www-data 
export Apache_RUN_GROUP=www-data
# with
export Apache_RUN_USER=john 
export Apache_RUN_GROUP=john

b。そのフォルダを家の外に移動します...とにかくそこで何をしているのですか?

Sudo mv /home/john/app2 /var/www/

このディレクトリに一致するようにサイトを変更し、Apacheサーバーを再起動することを忘れないでください。

ここにいくつかの参照があります:

https://wiki.Apache.org/httpd/13PermissionDenied

http://wiki.Apache.org/httpd/FileSystemPermissions

0
mimoralea