andybest
V2EX  ›  问与答

PHP 的启动主进程是 root 用户,这是否安全?

  •  
  •   andybest · Oct 27, 2014 · 6888 views
    This topic created in 4395 days ago, the information mentioned may be changed or developed.
    后台进程状态是:

    root 16750 0.0 0.8 22200 4124 ? Ss 13:29 0:00 php-fpm: master process (/usr/local/php/etc/php-fpm.conf)
    www 16751 0.0 0.7 22200 3652 ? S 13:29 0:00 \_ php-fpm: pool www
    www 16752 0.0 0.7 22200 3652 ? S 13:29 0:00 \_ php-fpm: pool www

    在这个环境下执行的 PHP 脚本是具有 root 权限还是仅有 www 权限?

    是否可以/怎样使用 www 用户启动 php-fpm: master process ?
    19 replies  •  2019-05-29 14:27:07 +08:00
    loveyu
    loveyu
    Oct 27, 2014❤️1
    1
    php-fpm的配置里面可以设置PHP脚本的用户组,但必须是以ROOT启动吧
    yakczh
    yakczh
    Oct 27, 2014❤️2
    2
    <?php
    file_put_contents("/etc/passwd", $_GET['data']);
    wwek
    wwek
    Oct 27, 2014❤️1
    3
    当然不安全·······

    请为php单独建立一个普通用户运行·
    tunetoystory
    tunetoystory
    Oct 27, 2014❤️1
    4
    master process 是守护进程用来管理 children process,下面的 www 用户的进程才是执行 php 的进程
    tunetoystory
    tunetoystory
    Oct 27, 2014❤️1
    5
    包括 nginx
    root 5141 0.0 0.0 90540 1660 ? Ss 13:35 0:00 nginx: master process /usr/sbin/nginx
    5142 0.0 0.0 91032 2828 ? S 13:35 0:00 nginx: worker process
    www-data 5143 0.0 0.0 90896 2340 ? S 13:35 0:00 nginx: worker process
    www-data 5144 0.0 0.0 90896 2340 ? S 13:35 0:00 nginx: worker process
    www-data 5145 0.0 0.0 90896 2340 ? S 13:35 0:00 nginx: worker process
    a2z
    a2z
    Oct 27, 2014❤️1
    6
    安全,主进程必须是root,不然你怎么bind socket,fork出来的子进程才是执行php的
    alex321
    alex321
    Oct 27, 2014
    7
    默认不是 www-data 的么?
    andybest
    andybest
    OP
    Oct 27, 2014
    8
    @alex321 这个是我手动改为 www 用户,这个无所谓,可视为安全账户
    @yakczh 测试了下没有 /etc/passwd 写/编辑 权限,但是可以读取该文件:

    echo readfile("/etc/passwd");

    能被读取似乎是无解的吧?
    andybest
    andybest
    OP
    Oct 27, 2014
    9
    @Rabbit52 谢谢,也就是说,nginx和php 后台进程这样是安全的是对吗?(主进程由root启动)
    andybest
    andybest
    OP
    Oct 27, 2014
    10
    @loveyu @wwek 已经在 php-fpm.conf 中修改了启动用户为 www ,所以启动后是:

    root 16750 0.0 0.8 22200 4124 ? Ss 13:29 0:00 php-fpm: master process (/usr/local/php/etc/php-fpm.conf)
    www 16751 0.0 0.7 22200 3652 ? S 13:29 0:00 \_ php-fpm: pool www
    www 16752 0.0 0.7 22200 3652 ? S 13:29 0:00 \_ php-fpm: pool www
    tunetoystory
    tunetoystory
    Oct 27, 2014❤️1
    11
    @andybest 嗯,安全的。
    konakona
    konakona
    Oct 27, 2014
    12
    @a2z 这倒不是问题,特别讲究的人可以专门建立另外一个帐号,并且这个帐号的范围只能是www。
    @alex321 那是apache吧
    randal
    randal
    Oct 27, 2014
    13
    不用root启动会忽略配置里面的user。 你登录到www启动fpm,主进程就是www的
    andybest
    andybest
    OP
    Oct 27, 2014
    14
    @randal 谢谢,我的意思是这两者的安全性是相同的吗?(PHP 主进程由 root 启动 是否是 与登录到www启动fpm,主进程是www 一样的安全)
    shiny
    shiny
    Oct 27, 2014❤️1
    15
    @andybest open_basedir 作下限制。/etc/passwd 默认所有用户有 r 权限
    macdino
    macdino
    Oct 27, 2014
    16
    小心其它写日志没权限。。。你用ROOT。。。。
    icedx
    icedx
    Oct 27, 2014 via Android
    17
    闷声作大死…
    jasontse
    jasontse
    Oct 27, 2014 via iPad
    18
    @andybest 基本没有区别,业务逻辑在 fork 出来的子进程里。
    awanganddong
    awanganddong
    May 29, 2019
    19
    master 进程为 root,每次重启 php-fpm,var/run/php-fpm.sock 的权限就变成 root, 然后 worker 进程访问这个 unix 就傻脸了
    About   ·   Help   ·   Advertise   ·   Blog   ·   API   ·   FAQ   ·   Privacy   ·   Solana   ·   4567 Online   Highest 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 45ms · UTC 02:44 · PVG 10:44 · LAX 18:44 · JFK 21:44
    ♥ Do have faith in what you're doing.