◆ noperm をマウントオプションに追加する

ある PHP で作られたページを開くと

PHP Warning:  chmod(): Operation not permitted in ***

というエラーが毎回のようにでていました
エラーの場所は chmod 関数が実行されていました

composer であれこれライブラリ読み込んでいてその中の部分なので原因特定が大変そう
なんかめんどうだから後でいいや を続けていました

ですが エラーログを見たときにすごく邪魔だったのでそろそろどうにかしようと思いました

環境

まずは問題切り分けようと単純に chmod をシンプルな PHP で使ってみると同じ現象がおきました
ライブラリとか全く関係なかった!

再現する方法

Windows

まずは Windows で share01 というフォルダを作ってフォルダを共有します
方法はここ参考に
Windows と Linux のファイル共有

share という名前のユーザでアクセス権限はフルコントロールにします

このフォルダに test.php というファイルを作ります
<?php

mkdir("dir");
chmod("dir", 0777);

Linux

これを Linux でマウントして apache の DocumentRoot の内側からシンボリックリンクを作ります
「notepc」 は Windows の PC 名です
mkdir /mount
mount -t cifs //notepc/share01 /mount -o username=share,password=password,iocharset=utf8,file_mode=0777,dir_mode=0777
ln -s /mount /var/www/html/share01

これで /var/www/html/share01/test.php へのアクセスが Windows の test.php へのアクセスになりました

/var/www/html が DocumentRoot なので

http://fedora/share01/test.php

とアクセスすれば PHP が実行されてフォルダが作られるはずです

「fedora」は Linux のホスト名で家の中だと通常は IP アドレスになります
私は IP アドレス覚えれないので Linux はディストリビューション名にして hosts 設定しています
ここの下の方参考に
https で通信できるサーバを作る

実行する

実行してみると

PHP Warning:  chmod(): Operation not permitted in /mount/test.php on line 4

原因は?

マウントは 0777 オプションですし ll で見てもこうなってます
[root@fedora ~]# ll /mount/
合計 1
drwxrwxrwx 2 root root  0  4月  1 11:58 dir
-rwxrwxrwx 1 root root 42  3月 31 21:51 test.php

絶対 0777 だから 0777 にしてもエラー出ないと思うんだけど

PHP だと何か問題あるのかと試してみる
[root@fedora ~]# cd /mount
[root@fedora mount]# php -a
Interactive shell

php > mkdir("dir1");
php > chmod("dir1", 0777);
php > exit

何もおきない

ここで詰まってしまったのですが しばらく考えていると

web で動いてるときは apache ユーザだった!

ということに気づいて root 以外のユーザでやってみました
[root@fedora mount]# sudo -u user php -a
Interactive shell

php > mkdir("dir2");
php > chmod("dir2", 0777);
PHP Warning:  chmod(): Operation not permitted in php shell code on line 1
php > exit

警告出たっ!


root 以外だと起きるようです

通常 mkdir して自分で作ったものは自分のものなので chmod できます
ですが cifs マウントなので自分で作ったものも root が所持者になります

なので chmod で警告が出る ということのようでした

解決方法

PHP に限らずシェルで mkdir → chmod しても同じくパーミッションが許可されていないエラーになります

chmod でエラーにならないようにする設定がないのか調べてみると ありました

noperm

permission を無視してくれます

設定するには mount のときのオプションに noperm を追加するだけ

[root@fedora /]# umount /mount
[root@fedora /]# mount -t cifs //notepc/share01 /mount -o username=share,password=password,iocharset=utf8,file_mode=0777,dir_mode=0777,noperm
[root@fedora /]# cd /mount
[root@fedora /mount]# php -a
Interactive shell

php > mkdir("dir3");
php > chmod("dir3", 0777);
php > exit

無事 PHP の警告がなくなりました

騙された 編

最初に調べてた時のこと

Windows の設定で 共有設定はフルコントロールですが セキュリティタブでは共有用ユーザに書き込み権限がありませんでした

これが原因か と思ってフルコントロールにすると警告がでなくなりました
そういうことかぁ と思ってブログにまとめるために別 PC で同じことをして確認すると……警告出てる

そのときは複雑なライブラリの中のものそのまま試していて たまたま そこを通らないような if だったようです
設定変えて F5 しただけなのでてっきりそれが原因だと騙されました

やっぱりシンプルに再現出来る環境を準備してからがいいですね


ところで セキュリティタブで書き込み権限ないのに なぜ mkdir はできたんだろうと調べてみると
Authenticated Users に属しているので書き込み権限がありました

A から始まってるのは Administrators という思い込みでちゃんと見てなかったです

この Authenticated Users ですが Everyone みたいなもので 基本全員が対象だけど Guest だけは除いたものらしいです
ちゃんとしたユーザみんな ということらしいです
そういうもののためにグループユーザを追加削除もできないようで net localgroup コマンドでも出てきませんでした