PHPファイルでchmodエラー

プログラミング言語PHP

結論

 状態:調査中  閲覧数:2,242  投稿日:2014-04-26  更新日:2014-04-29
VPSのPHPファイルでchmodエラーとなる理由は、アカウント設計がおかしいから
・PHPファイルでchmodするためには、Apache実行ユーザ、かつ所有者でなければならない
・言いかえると、予めApache実行ユーザを所有者に設定しておかなければならない

Apache実行ユーザが所有者ではない場合
・chown(所有者変更)でオーナー変更すれば良い
・しかし、chownできるのは、root ユーザ、もしくはスーパーユーザ(ルート権限保持者)だけ
・phpファイルでchownするためには、sudoでApache実行ユーザに特定のコマンドだけを許すよう、予め設定しておく必要がある

まとめ
・VPSのPHPファイルでchmodエラーとなった場合、PHP処理だけで問題解決することは不可能
・Cent OS のユーザアカウント設計(権限)を見直す必要がある


大前提


一般的にLinuxでのアカウント作成は、下記流れを辿る
1.chown … ファイル、ディレクトリの所有者、グループ所有者を変更
2.chmod … ファイル、ディレクトリのパーミッションを変更

コマンドchownで、オーナー変更できるのは?
・root ユーザ、もしくはスーパーユーザ(ルート権限保持者)だけ

コマンドchownで、グループ変更できるのは?
・root ユーザ、もしくはスーパーユーザ(ルート権限保持者)、または「そのファイル、ディレクトリの所有者」だけ

コマンドchmodで、パーミッションを変更できるのは?
・root ユーザ、もしくはスーパーユーザ(ルート権限保持者)、または「そのファイル、ディレクトリの所有者」だけ

PHPファイルを実行するのは?
・Apache実行ユーザ


エラー対応


chmodエラーの原因
・「2.chmod」自体に問題がある場合と、「1.chown」時点で既に問題がある場合とに分かれる

「2.chmod」自体に問題がある場合
・適切に修正すれば良い
・PHPだけで対応可能

「1.chown」時点で既に問題がある場合
・PHP処理だけでは対応不可能
ディレクトリまたはファイル所有者」が適切ではないケース

今回の件で調査した内容メモ

 閲覧数:856 投稿日:2014-04-26 更新日:2014-04-29 

調査結果


apache から PHP を実行する場合、デフォルト実行ユーザは apache
・chmod() 対象のファイルまたはディレクトリに apache ユーザーが操作できる権限がついていない場合、エラーが表示される

エラーを回避する方法
A. 操作対象のファイルまたはディレクトリに、最初からapache 実行ユーザが操作できる権限を付与しておく
B. system() 関数経由で sudo chmod コマンドを使って、root 権限等で chmod コマンドが実行されるようにする
C. suEXEC 利用


system()系関数


B.system() 関数経由で sudo chmod コマンド使用。root 権限等で chmod コマンド実行

エラーメーセージは表示されない
・system()系の関数で、sudoとからめてosのchmodを実行
・パーミッション変更されなくても、エラーメッセージは表示されないので、注意が必要
system('chmod 0757 po/'); //ディレクトリパーミッション
system('chmod 0757 ./test.php'); //ファイルパーミッション


・execも同様
exec('chmod 0757 po/'); //ディレクトリパーミッション
exec('chmod 0757 ./test.php'); //ファイルパーミッション

//コマンド動作確認
$command='ls -la';
$output=array();
$ret=null;
exec ( $command, $output, $ret );
print_r($output);


・sudo
system('sudo chmod 0757 po/'); //ディレクトリパーミッション
system('sudo chmod 0757 ./test.php'); //ファイルパーミッション

※sudo 使用には、予め下記変更が必要


sudo


sudo(superuser do)とは?
・許可されたユーザが、スーパーユーザをはじめ自分以外のユーザに変身してコマンドを実行できるようにするコマンド

一般ユーザーを sudo できるようにする
・sudo の動作設定は /etc/sudoers に記述されている(sudoを使えるのは/etc/sudoersファイルに定義されたユーザだけ)
・このファイルを編集することで sudo の動作を変更することが可能
・実際に変更する際には「/etc/sudoers」 を直接編集せず、visudo コマンドを使用
・今回は、内容確認だけ実施
sudo cat /etc/sudoers
## Sudoers allows particular users to run various commands as
## the root user, without needing the root password.
##
## Examples are provided at the bottom of the file for collections
## of related commands, which can then be delegated out to particular
## users or groups.
##
## This file must be edited with the 'visudo' command.

## Host Aliases
## Groups of machines. You may prefer to use hostnames (perhaps using
## wildcards for entire domains) or IP addresses instead.
# Host_Alias     FILESERVERS = fs1, fs2
# Host_Alias     MAILSERVERS = smtp, smtp2

## User Aliases
## These aren't often necessary, as you can use regular groups
## (ie, from files, LDAP, NIS, etc) in this file - just use %groupname
## rather than USERALIAS
# User_Alias ADMINS = jsmith, mikem


## Command Aliases
## These are groups of related commands...

## Networking
# Cmnd_Alias NETWORKING = /sbin/route, /sbin/ifconfig, /bin/ping, /sbin/dhclient, /usr/bin/net, /sbin/iptables, /usr/bin/rfcomm, /usr/bin/wvdial, /sbin/iwconfig, /sbin/mii-tool

## Installation and management of software
# Cmnd_Alias SOFTWARE = /bin/rpm, /usr/bin/up2date, /usr/bin/yum

## Services
# Cmnd_Alias SERVICES = /sbin/service, /sbin/chkconfig

## Updating the locate database
# Cmnd_Alias LOCATE = /usr/bin/updatedb

## Storage
# Cmnd_Alias STORAGE = /sbin/fdisk, /sbin/sfdisk, /sbin/parted, /sbin/partprobe, /bin/mount, /bin/umount

## Delegating permissions
# Cmnd_Alias DELEGATING = /usr/sbin/visudo, /bin/chown, /bin/chmod, /bin/chgrp

## Processes
# Cmnd_Alias PROCESSES = /bin/nice, /bin/kill, /usr/bin/kill, /usr/bin/killall

## Drivers
# Cmnd_Alias DRIVERS = /sbin/modprobe

# Defaults specification

#
# Disable "ssh hostname sudo <cmd>", because it will show the password in clear.
#         You have to run "ssh -t hostname sudo <cmd>".
#
Defaults    requiretty

#
# Refuse to run if unable to disable echo on the tty. This setting should also be
# changed in order to be able to use sudo without a tty. See requiretty above.
#
Defaults   !visiblepw

#
# Preserving HOME has security implications since many programs
# use it when searching for configuration files. Note that HOME
# is already set when the the env_reset option is enabled, so
# this option is only effective for configurations where either
# env_reset is disabled or HOME is present in the env_keep list.
#
Defaults    always_set_home

Defaults    env_reset
Defaults    env_keep =  "COLORS DISPLAY HOSTNAME HISTSIZE INPUTRC KDEDIR LS_COLORS"
Defaults    env_keep += "MAIL PS1 PS2 QTDIR USERNAME LANG LC_ADDRESS LC_CTYPE"
Defaults    env_keep += "LC_COLLATE LC_IDENTIFICATION LC_MEASUREMENT LC_MESSAGES"
Defaults    env_keep += "LC_MONETARY LC_NAME LC_NUMERIC LC_PAPER LC_TELEPHONE"
Defaults    env_keep += "LC_TIME LC_ALL LANGUAGE LINGUAS _XKB_CHARSET XAUTHORITY"

#
# Adding HOME to env_keep may enable a user to run unrestricted
# commands via sudo.
#
# Defaults   env_keep += "HOME"

# Defaults    secure_path = /sbin:/bin:/usr/sbin:/usr/bin
Defaults    secure_path = /sbin:/bin:/usr/sbin:/usr/bin:/usr/local/bin

## Next comes the main part: which users can run what software on
## which machines (the sudoers file can be shared between multiple
## systems).
## Syntax:
##
##      user    MACHINE=COMMANDS
##
## The COMMANDS section may have other options added to it.
##
## Allow root to run any commands anywhere
root    ALL=(ALL)       ALL

## Allows members of the 'sys' group to run networking, software,
## service management apps and more.
# %sys ALL = NETWORKING, SOFTWARE, SERVICES, STORAGE, DELEGATING, PROCESSES, LOCATE, DRIVERS

## Allows people in group wheel to run all commands
%wheel  ALL=(ALL)       ALL

## Same thing without a password
# %wheel        ALL=(ALL)       NOPASSWD: ALL

## Allows members of the users group to mount and unmount the
## cdrom as root
# %users  ALL=/sbin/mount /mnt/cdrom, /sbin/umount /mnt/cdrom

## Allows members of the users group to shutdown this system
# %users  localhost=/sbin/shutdown -h now

## Read drop-in files from /etc/sudoers.d (the # here does not mean a comment)
#includedir /etc/sudoers.d



デフォルト設定例
・root ユーザについては次のように設定されている
root   ALL=(ALL)   ALL


root ALL= (ALL) ALL
root ユーザは、 すべてのホストから すべてのユーザに変身でき、 すべてのコマンドを実行できる
グループ設定
・%wheel のように % を付けるとグループ名を指定することになる
%wheel  ALL=(ALL)       ALL

wheel group がsudo コマンドを使えるよう変更


PHP実行ユーザ設定 / CentOS6 / Apache

PHP実行ユーザ設定(デフォルト挙動) / CentOS7 / Nginx



週間人気ページランキング / 9-19 → 9-25
順位 ページタイトル抜粋 アクセス数
1 Nginx設定。エラーログレベル | Nginx(Webサーバ) 16
2 PHP実行ユーザ設定 / CentOS6 / Apache | PHP(プログラミング言語) 15
3 PHPのmb_send_mail関数でメール送信できない | メール処理システム 11
4 9回目-13.MySQL5.7.21設定 | CentOS 7 2週間無料のお試し期間 9回目(さくらVPS) 10
5 tar: これは tar アーカイブではないようです 8
5 ImageMagick と imagick の違い | ImageMagick(ソフトウェアスイート) 8
5 さくらVPS0 8
6 manページ日本語表示 | CentOS 7 (CentOS) 7
6 Python 3.5 アンインストール / yum remove | Python(プログラミング言語) 7
7 ABRT により 問題が検出されました | CentOS 7 (CentOS) 6
7 Reached target Shutdown メッセージが表示されたあと、シャットダウンまたは再起動プロセスがハングアップする | CentOS 7 (CentOS) 6
7 PHPファイルでchmodエラー | PHP(プログラミング言語) 6
7 echo と cat の違い 6
8 FFmpeg 2.8.15 を yum インストール | ソフトウェアスイート 5
8 「設定ファイルに、暗号化 (blowfish_secret) 用の非公開パスフレーズの設定を必要とするようになりました。」対応 5
8 「CentOS6」から「CentOS7」への移行 | CentOS 7 (CentOS) 5
8 「さくらVPS」で、「CentOS6」を「CentOS7」へ変更するためには? | CentOS 7 2週間無料のお試し期間 Link(さくらVPS) 5
9 6回目-10.Nginxでバーチャルホスト設定確認 | CentOS 7 2週間無料のお試し期間 6回目(さくらVPS) 4
9 cronで定期実行しているphpファイルを、コマンドライン経由で即時実行する | cron(Linuxコマンド) 4
9 MySQL 5.5 から 5.6 へのアップグレード | MySQL(データベース) 4
2021/9/26 1:01 更新