Linux下PHP开发环境搭建实战指南
|
去年九月份,我蹲在IDC机房配那台新上架的CentOS 7.9测试机,root密码输错三次,键盘上还粘着前天没擦掉的咖啡渍——这事儿和PHP环境没关系,但和我后来删了十七遍php.ini有关。 我原以为就拉个LNMP一键包跑个laravel scaffold糊弄过去,结果刚curl完install.sh,/var/log/nginx/access.log里就刷出一串IP:103.218.17.84,这个段我熟,三月溯源过一次跳板,他们扫目录爱加/.git/config后缀,但这次没扫,光GET /phpinfo.php,连User-Agent都没换,就写着curl/7.68.0。我截图发群里,没人回。两分钟后,@全员炸了——老张在杭州用手机连SSH改selinux策略,李工在东莞家里的Wi-Fi下重装mysql-client,俩人压根不知道对方在线。 安全是成本不是收入。这句话不是我说的,是我上周翻旧钉钉记录翻到的,2023年9月15号下午四点二十七分,王总在“PHP环境交付对齐”群里敲的。我当时回了个“收到”,顺手把/usr/local/php/etc/php-fpm.d/www.conf里listen.mode改成0666——现在想起来,那个0666就是个伏笔,后来WAF规则日志里反复出现“unix:/tmp/php-cgi.sock denied”,但我当时根本没往权限上想,只当是nginx upstream timeout没调好。 真干起来才发现,apt装的php8.1默认关opcache.enable_cli,你artisan tinker一敲就报错;而yum装的php7.4又默认开着expose_php,header里明晃晃挂着X-Powered-By: PHP/7.4.33——你改完httpd.conf里那行ServerTokens Full,重启Apache前得先check mod_headers是否真的加载了,因为上个月运维小刘打包时漏掉了--enable-headers,这事我敢打包票,他打包脚本第137行grep -q "headers" 的返回值永远是1,但没人校验退出码。
文章配图,仅供参考 服务器上多出来个文件:/tmp/.phpinit_82a9f3。不是webshell,MD5比对过,是phpize生成的临时obj,可它不该在/tmp下存超过三分钟,系统清理脚本每两分钟扫一次。但它就在那儿,从九月十六号凌晨两点零八分创建,一直活到十九号中午我手动rm -f。我没查是谁执行的configure,也没追make install的cwd路径,就把它删了。因为当天下午三点要测OAuth2回调签名验签逻辑,时间不够。 所以你看,所谓“实战指南”,写来写去就是堆命令。但真正卡住你的永远不是php -v不显示版本号,而是你敲完systemctl restart php-fpm,ps aux | grep fpm出来的worker进程UID居然是apache,不是www-data,也不是nginx——这时候你得翻十年前的Red Hat Bugzilla#112769,里面有人说“RHEL7.5之后sysusers.d优先级高于useradd -r”,但你说这事儿和安全有毛关系?有。因为某个被绕过的WAF日志里,攻击载荷刚好打在session.upload_progress.name的解析逻辑上,而这个解析依赖于fpm master进程的uid权限上下文。我试过三遍,只要master是root,payload里混个%00就能逃逸;换成www-data,直接502。这个结论我说不准,没做fuzz,只靠七次手工构造包确认的。 群里吵过一回。甲方CTO说“Docker最安全”,我们这边老陈当场reboot了测试机——不是气的,是他在/root/.bash_history里发现一行dockerd --insecure-registry=192.168.0.0/16,而这个registry指向的是台连外网的Jenkins slave。后来没人提Docker了。倒是李工半夜三点发了个截图:/var/log/php-fpm/error.log最后一条是“failed to acquire scoreboard mutex”,时间戳2023-09-17 02:11:44。我没回,因为我知道,那个mutex问题和fpm的max_children、pm.max_spare_servers、系统semaphores限制全有关,但解决它需要改内核参数,而那天机房断电了两次,UPS电池老化告警在监控大屏闪了十八秒,没人敢碰sysctl。 还有个细节:我在/etc/php.d/99-security.ini里注释掉了disable_functions,因为gd库压缩图片要用getimagesize()。结果上线第三天,攻防演练红队用logrotate的postrotate钩子反连,弹回来的shell里pwd是/var/log/nginx——不是webroot,是log目录。他们没走php,走的是logrotate+sh。这个我早该想到,2018年深圳某金融公司就栽在这上面。但那时候我还在看《Linux系统编程》第二版第342页讲signal handler重入,没注意/etc/logrotate.d/php-fpm那个配置文件最后一行写的是create 0640 root root,而不是0600。这个疏忽我说不准算不算安全漏洞,反正审计报告里没标CVSS分。 昨天我又看了眼那台机器的last -i输出,有个IP重复登陆过五次:119.110.244.163。不是代理,不是扫描器,是福建莆田一家做鞋类SaaS的售后支持,他们用TeamViewer连进来调过支付回调超时参数。我本来想查他们到底改了哪行代码,结果溯源到一半,发现他们的TeamViewer ID在2023年9月18号下午四点被注销了,服务器上的~/.teamviewer/logfiles/TeamViewer15_Logfile.log在同一天被truncate过。线索没了。我干脆把php-fpm.sock权限从0666改回0600,重启服务,等下个补丁周期再看。 我现在手边开着两个终端:左边在跑ansible-playbook -t php_env site.yml,右边tail -f /var/log/php-fpm/slow.log。慢日志里第三条记录的时间戳是2023-09-17 23:59:59,函数名是openssl_decrypt,参数被星号掩了。我懒得展开。明天早上九点前得把dev分支合进staging,至于这个slow log——先留着吧,等哪天有人专门问起,我再翻。 (编辑:站长网) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |


PHP工程师必避的5大服务器选型陷阱与调优实战
Linux无障碍环境搭建:7年接口工程师实战指南
站长评论失焦?PHP老兵的理性技术观察
Linux深度学习环境搭建:16年量子计算人的排障实录
PHP工程师破局关键:外链架构才是权重跃升杠杆
VR工程师转战PHP:三天调试实战通关
Linux老手也常踩的5个Unix环境搭建坑