PHP実行ユーザ設定 / CentOS7 / Nginx

プログラミング言語PHP

目次一覧

 状態:試行錯誤履歴  閲覧数:756  投稿日:2018-04-17  更新日:2019-08-30
基本的な考え方 / 2019年8月13日時点の設定 / 問題点 / 選択肢は2案

PHP実行ユーザー確認。方法1.idコマンド使用 / PHP実行ユーザー確認。方法2. / Linuxグループ

groupsコマンド / 「/etc/passwd」ファイルに記述されているユーザ情報を検索

PHP実行ユーザnginxを、PHP経由で「sudo -s」後「chmod」したいがうまくいかない

案1.で問題発生

案2.Set Group ID


基本的な考え方 / 2019年8月13日時点の設定 / 問題点 / 選択肢は2案

 閲覧数:127 投稿日:2018-04-19 更新日:2019-08-30 

基本的な考え方


PHP実行ユーザーは変更しない方が良い
・PHP実行ユーザーはnginx
・PHP実行ユーザーをrootへ変更すれば問題は解決するが、セキュリティの観点から変更しない方が良い

PHPのchownは使用しない方が良い(というより、PHP実行ユーザーをrootへ変更しない限り実行するとエラー発生する)
chown — ファイルの所有者を変更する

・ファイルの所有者変更はrootでしか実行出来ない
※exec経由でchownコマンドを使用すれば、現在の所有者を選択した状態から、グループだけを変更できるかも
コマンドヒエラルキー

選択肢


案A.手動(FTP)で親ディレクトリへ対して Permissions 777

案B.ディレクトリ以下全てへ対して、「所有者」と「グループ」を「コマンド」で変更
hogeディレクトリへ対して $ sudo chown -R ★★:★★ /var/hoge

案C.Set Group ID

案A.手動(FTP)で親ディレクトリへ対して Permissions 777


mkdir使用できるようになる

FTP操作するためには?
0755以上で作成する
<?php mkdir("./hoge", 0755); ?>

<?php mkdir("./hoge", 0777); ?>


0700で作成するとどうなるの?
<?php mkdir("./hoge", 0700); ?>

・FTP経由での操作不可(削除も不可)
※削除する場合はコマンド使用

階層ディレクトリ作成
<?php mkdir('./depth1/depth2/depth3/', 0777, true); ?>


親ディレクトリ777にしただけでは動作しないLinuxコマンド系PHP関数
・posix_setgid()
・chmod()
・chmown()

PHP実行ユーザー確認。方法1.idコマンド使用 / PHP実行ユーザー確認。方法2. / Linuxグループ

 閲覧数:137 投稿日:2018-04-19 更新日:2019-08-16 

PHP実行ユーザー確認。方法1.idコマンド使用


Web経由のPHPページ上で、PHP実行ユーザ確認する方法1.idコマンド使用
登録ユーザーの情報を表示する

system("id");
<?php
 header("Content-Type: text/plain");
 system("id");
?>
uid=994(nginx) gid=992(nginx) groups=992(nginx)


PHP実行ユーザー確認。方法2.


posix_getpwuid(posix_geteuid());
<?php
 $d = posix_getpwuid(posix_geteuid());
 print "<pre>";
 print_r($d);
 print "</pre>";
?>
Array
(
   [name] => nginx
   [passwd] => x
   [uid] => 994
   [gid] => 992
   [gecos] => nginx user
   [dir] => /var/cache/nginx
   [shell] => /sbin/nologin
)


Linuxグループ

表記 省略前 内容
uid user id ユーザー登録番号(ユーザ名)
gid group id メイングループ名(その番号GID)
groups - サブグループ名とその番号(GID)一覧


groupsコマンド / 「/etc/passwd」ファイルに記述されているユーザ情報を検索

 閲覧数:134 投稿日:2018-04-19 更新日:2019-08-16 

groupsコマンド


一般ユーザーが自身の所属しているグループを確認

CentOSの場合
デフォルトではユーザー名と同じ名前のグループに所属しているので、ユーザー名と同じグループ名が表示される
・nginxユーザーは、nginxグループに所属している
$ groups nginx
nginx : nginx


複数のグループに所属している場合
全ての所属グループ名が表示される
・★★ユーザーは、★★グループとwheelグループに所属している
$ groups ★★
★★ : ★★ wheel



「/etc/passwd」ファイルに記述されているユーザ情報を検索


「/etc/passwd」ファイルに記述されているnginxユーザ情報を検索
# grep nginx /etc/passwd
nginx:x:994:992:nginx user:/var/cache/nginx:/sbin/nologin


PHP実行ユーザnginxを、PHP経由で「sudo -s」後「chmod」したいがうまくいかない

 閲覧数:162 投稿日:2018-05-09 更新日:2018-05-09 

この方法ではダメなことを再確認


理由不明
# groups nginx
nginx : nginx


# man usermod

# usermod -aG wheel nginx
# groups nginx
nginx : nginx wheel



$ sudo passwd nginx
[sudo] password for ★★: 
ユーザー nginx のパスワードを変更。
新しいパスワード:
新しいパスワードを再入力してください:
passwd: すべての認証トークンが正しく更新できました。


# gpasswd -d nginx wheel
ユーザ nginx をグループ wheel から削除

# groups nginx
nginx : nginx


案1.で問題発生

 閲覧数:130 投稿日:2018-05-09 更新日:2019-08-29 

案1.で問題発生


手動(FTP)でディレクトリへ対して Permissions 777
通常使用(アップロードなど)では問題なかったが

zipダウンロードできない
PHP経由のコマンド処理しようとするも、正常動作しない

アップロード直後
期待した通り動作しない
$ cd /var/www/html/xxxx/file-origin/article/1
$ ls -la
合計 16
drwxrwxrwx 2 nginx nginx 4096  8月 10 07:15 .
drwxr-xr-x 3 nginx nginx   14  8月  6 11:52 ..
-rw-r--r-- 1 nginx nginx 1312  8月 10 07:15 1-$dataAry.txt
-rw-r--r-- 1 nginx nginx   84  8月 10 07:15 1-・TBSラジオ/90_5MHz.txt
-rw-r--r-- 1 nginx nginx  126  8月  9 08:46 1-『無能の人』(むのうのひと)


期待した通り動作する
$ cd /var/www/html/xxxx/php-demo.w4c.work/demo/file-processing/multiple-file-download/d2-3-rj/file
$ ls -la
合計 292
drwxrwxr-x 2 ★★ ★★     57  8月 13 10:27 .
drwxrwxr-x 4 ★★ ★★     43  8月 13 20:13 ..
-rw-rw-r-- 1 ★★ ★★ 146875  8月 13 10:27 558-1.jpg
-rw-rw-r-- 1 ★★ ★★ 146875  8月 13 10:27 a.jpg
-rw-rw-r-- 1 ★★ ★★     18  8月 13 10:27 おはよう.txt



案2.Set Group ID

 閲覧数:99 投稿日:2019-08-29 更新日:2019-08-30 

事前確認


プライマリグループ情報を一覧表示
ユーザーアカウント情報を一覧表示するコマンドを使用すると、プライマリグループ情報を確認できる
$ less /etc/passwd
root:x:0:0:root:/root:/bin/bash
bin:x:1:1:bin:/bin:/sbin/nologin

//中略

★★:x:1000:1000::/home/★★:/bin/bash
nginx:x:994:992:nginx user:/var/cache/nginx:/sbin/nologin
apache:x:48:48:Apache:/usr/share/httpd:/sbin/nologin
mysql:x:27:27:MySQL Server:/var/lib/mysql:/bin/false
uwsgi:x:993:990:uWSGI daemon user:/run/uwsgi:/sbin/nologin


セカンダリグループ情報を一覧表示
$ less /etc/group
root:x:0:
bin:x:1:
daemon:x:2:
sys:x:3:
adm:x:4:
tty:x:5:
disk:x:6:
lp:x:7:
mem:x:8:
kmem:x:9:
wheel:x:10:★★
cdrom:x:11:
mail:x:12:postfix
man:x:15:
dialout:x:18:
floppy:x:19:
games:x:20:
tape:x:30:
video:x:39:
ftp:x:50:
games:x:20:
tape:x:30:
video:x:39:
ftp:x:50:
lock:x:54:
root:x:0:
bin:x:1:
daemon:x:2:
sys:x:3:
adm:x:4:
tty:x:5:
disk:x:6:
lp:x:7:
mem:x:8:
kmem:x:9:
wheel:x:10:★★
cdrom:x:11:
mail:x:12:postfix
man:x:15:
dialout:x:18:
floppy:x:19:
games:x:20:
tape:x:30:
video:x:39:
ftp:x:50:
lock:x:54:
audio:x:63:
nobody:x:99:
users:x:100:
avahi-autoipd:x:170:
utmp:x:22:
utempter:x:35:
ssh_keys:x:999:
stapusr:x:156:
stapsys:x:157:
stapdev:x:158:
input:x:998:
systemd-journal:x:190:
systemd-bus-proxy:x:997:
:


コマンド実行ユーザーグループ情報を表示
$ groups
★★ wheel


nginxユーザーグループ情報を表示
$ groups nginx
nginx : nginx


案B.第三者グループを新規作成
グループ / よく使用するコマンド一覧



対応1. 共有グループwebdevを新規作成


$ sudo groupadd webdev

対応2.ユーザーを共有グループへ登録する


主要ユーザーのセカンダリグループとして 共有グループwebdevを追加する

ユーザー★★をグループwebdevに登録するには
$ sudo gpasswd -a ★★ webdev
ユーザ ★★ をグループ webdev に追加

あるいは下記コマンドでも同義
$ sudo usermod -a -G webdev ★★

ユーザーnginxをグループwebdevに登録するには
$ sudo gpasswd -a nginx webdev
ユーザ nginx をグループ webdev に追加

あるいは下記コマンドでも同義
$ sudo usermod -a -G webdev nginx

確認
$ id ★★
uid=1000(★★) gid=1000(★★) groups=1000(★★),10(wheel),1001(webdev)


$ id nginx
uid=994(nginx) gid=992(nginx) groups=992(nginx),1001(webdev)


対応3.ディレクトリのグループを共有グループwebdevに設定


$ sudo chgrp -R webdev /var/www/xxxx/xxxx/課金サービス/file-origin/article

$ cd /var/www/xxxx/xxxx/課金サービス/file-origin
$ ls -la
合計 0
drwxrwxrwx 4 ★★ ★★ 30  8月 29 09:54 .
drwxr-xr-x 6 root       root       80  8月  6 11:19 ..
drwxr-xr-x 3 nginx      webdev     14  8月  6 11:52 article
drwxrwxrwx 2 ★★ ★★  6  8月 29 09:54 tmp


$ cd /var/www/xxxx/xxxx/課金サービス/file-origin/article
$ ls -la
合計 4
drwxr-xr-x 3 nginx      webdev       14  8月  6 11:52 .
drwxrwxrwx 4 ★★ ★★   30  8月 29 09:54 ..
drwxrwxrwx 2 nginx      webdev     4096  8月 10 07:15 1


対応4.同じグループのユーザーが読み書きできるように共有ディレクトリのパーミッションを変更し、新規作成したファイルやディレクトリのグループが自動的に共有グループになるように変更する


ディレクトリのみ権限をsgidへ変更する
パーミッションsgidは、ディレクトリ作成時にその親ディレクトリの所有グループと同じにする

共有ディレクトリ「/var/www/xxxx/xxxx/課金サービス/file-origin/article」にSGID(Set Group ID)という属性を付与することで、ユーザーが新しいファイルやディレクトリを作成した場合、そのグループが自動的に(ディレクトリのグループと同じ)webdevになる
SGID(set group ID、setgid)パーミッションが設定されているディレクトリでは、その配下に作られるファイルのグループはディレクトリのグループを継承するようになる
$ sudo chmod -R 2775 /var/www/xxxx/xxxx/課金サービス/file-origin/article
$ ls -la
合計 0
drwxrwxrwx 4 ★★ ★★ 30  8月 29 09:54 .
drwxr-xr-x 6 root       root       80  8月  6 11:19 ..
drwxrwsr-x 3 nginx      webdev     14  8月  6 11:52 article
drwxrwxrwx 2 ★★ ★★  6  8月 29 09:54 tmp

・グループの実行許可部分が「x」ではなく「s」になる


Set Group ID を設定したつもりなのですが、今どういう状態なのか
Set Group ID を設定したつもりなのですが、今どういう状態


Link



案B.第三者グループを新規作成

Q
PHPだけでchownしたい。PHP実行ユーザはnginx
ファイルパーミッションの「777」「1777」「2775」について

関連エントリー
パーミッション
FTP パーミッションエラー
PHPパーミッションエラー対応
mkdir
最終的な設定
SGID(Set Group ID)
chmod
PHPファイルでchmodエラー
PHP実行ユーザ設定 / CentOS6 / Apache
Linuxコマンド系



PHP Extension

php.ini 設定 / CentOS 7 × 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 更新