当前位置: 首页 > 编程日记 > 正文

正确设置php-fpm和nginx防止网站被黑

2019独角兽企业重金招聘Python工程师标准>>> hot3.png

核心总结:php-fpm 子进程所使用的用户,不能是网站文件所有者。 凡是违背这个原则,则不符合最小权限原则。

根据生产环境不断反馈,发现不断有 php网站被挂木马,绝大部分原因是因为权限设置不合理造成。因为服务器软件,或是 php 程序中存在漏洞都是难免的,在这种情况下,如果能正确设置 Linux 网站目录权限, php 进程权限,那么网站的安全性实际上是可以得到保障的。

那么,造成网站被挂木马的原因是什么?

1.  ftp 连接信息被破解,对这个原因,可行的办法就是使用非常复杂的FTP 用户名(不要使用常用的用户名),如果是固定作业,可考虑使用 iptables 防火墙限制来源 IP 。但是一些情景下,可能需要使用 VPN 以便远程维护。 即网站维护者需要使用 FTP 修改网站文件时,必须先登录到 IDC 机房的 VPN 服务器上,再进行后续的操作。

2.  网站服务器软件/ 配置 /php 程序存在漏洞,被利用
在讨论这个问题前,先说明文件及进程权限的几个概念:

A.  FTP用户对网站目录具有最大修改权限,那么网站的文件所有者一定属于 FTP,  这是毋庸置疑的 ,  否则如何修改文件呢?

B.  php-fpm进程, nginx 进程对网站文件至少需要有读取权限,例如,以下命令即可查看这两个进程所使用的账号:

ps aux|grep nginx

ps aux|grep php

我们可以发现,nginx 和 php-fpm 子进程账号是 nobody 。

我们再查看网站文件目录的权限:

发现网站文件所有者是www 账号,那说明:

|  nginx和 php 对网站只有读取权限,无写入权限

l  如果php 程序需要对网站某些文件有写入权限,需要手工将文件或目录权限修改为 777

l  因为php-fpm 子进程是以 nobody 运行,那么 php-fpm 生成的新文件所有者也是 nobody,  这时 ftp 用户将无法修改这些文件,解铃还需系铃人,当 php 生成文件后,需要调用 chmod("/somedir/somefile", 0777) 将文件权限修改为 777 ,以便 FTP 用户也可以修改这个文件。

l  经常有开发人员找我请求重设php 生成的文件的权限。

l  如果php-fpm 子进程以网站文件所有者用户运行,那意味着 php-fpm 进程对整个网站目录具有可写权限,噩梦也就由此开始。

但是我们发现,有不少系统管理员为了省事,违背了Linux 最小化权限的原则,设置 php-fpm 进程以网站文件所有者账号运行,当然这样可能会方便 php 开发人员( php-fpm 进程对整个网站目录具有可写权限),但是这样一来, Linux 体系的文件系统权限原则将被打破,所有的安全措施将形同虚设。可以想象的是,万一 php 程序中有漏洞,攻击者上传木马,便可以修改网站的所有文件,网站首页被黑,也就不足为怪了。

退一步,如果我们设置了较严格的权限,就算php 程序中存在漏洞,那么攻击者也只能篡改权限为 777 的目录,其它的文件是无法被改写的,网站不就就得更安全了吗?

核心总结:php-fpm 子进程所使用的用户,不能是网站文件所有者。 凡是违背这个原则,则不符合最小权限原则。

经过我参阅网上关于nginx, php-fpm 配置的文章教程和市面上的一些书籍,发现有不少人受这些文章的误导,直接让 php-fpm 子进程以网站所有者账号运行,例如张宴的《实战 nginx  取代 apache 的高性能 Web 服务器》一书的 52 页中,存在以下设置:

<value name="user">www</value>

<value name="group">www</value>

而在第50 页,设置网站文件所有者也为 www 用户:

chown -R www:www /data0/htdocs/blog

显然,此书的这部分内部,对初学者有误导,针对这个问题,我已经向本书作者发邮件,希望其能在第二版中进行强调声明,以免由于过度宽松的权限配置,造成一些安全隐患。

官方提供的配置文件中,php-fpm 子进程使用 nobody 用户,这完全是合理的,无须修改。

那么nginx 的子进程用户,如何设置合理? 我的建议是也使用 nobody (对错误日志写入等无影响),设置方法如下:

nginx.conf文件第一行设置为 user    nobody; ,  再执行 nginx -s reload 即可。

php-fpm子进程用户设置方法:

编辑文件php-fpm.conf (一般位于 /usr/local/php/etc/php-fpm.conf,  视安装参数为准),找到 user 、 group 两个参数的定义,将其设置为nobody( 默认已经是 nobody) ,再重启 php-fpm 进程即可。

网站可写目录的特殊注意

这里的可写,是相对php-fpm 子进程而言。一个网站最容易出安全问题的即是可写目录,如果可写目录权限能控制严格,安全系数也将大大提高。

我们认为,一个网站可写目录主要分为以下几种:

1.  php 数据缓存目录,如 discuz 的 forumdata 目录,就存放了大量数据缓存文件。此类目录一般会禁止用户直接访问,但是 discuz 在这个目录下又存放了不少 js, css 文件,我们并不能简单地拒绝用户访问这个目录。显然,这个目录下的所有文件,不能直接交给 php 解析,我们后面会给出解决方案。

2.  附件上传目录。显然此类目录需要开启访问,但不能交由php 引擎解析(即这个目录下的所有文件均视为普通静态文件)。

3.  静态文件生成目录,这类目录下的文件全部应视为静态文件。

4.  日志目录, 一般都会拒绝用户直接访问之。

也就是说对网站开发人员而言,需要对可写目录实现动静分离,不同性能的文件,应该区别对待之,这样也就方便系统管理员,设置合理的nginx 规则,以提高安全性。

简单地去掉php 文件的执行权限,并不能阻止 php-fpm 进程解析之。

接下来,根据以上总结,系统管理员如何配置nginx 的目录规则,才更安全呢?

1.  数据缓存目录 /cache/
这个目录的特点是需要777 权限,无须提供给用户访问,那么可以按以下参考配置 nginx

location ~ "^/cache" {

return 403;

}

location ~ "\.php$" {

fastcgi_pass 127.0.0.0:9000;

....................

}

这时,任何用户将无法访问/cache/ 目录内容,即使

2. 附件上传目录  attachments

此目录的特点是需要开放访问权限,但所有文件不能由php 引擎解析(包括后缀名改为 gif 的木马文件)

location ~ "^/attachments" {

}

location ~ "\.php$" {

fastcgi_pass 127.0.0.0:9000;

....................

}

注意,上面对attachments 目录的 location 定义中是没有任何语句的。 nginx 对正则表达式的 location 匹配优先级最高,任何一个用正则表达式定义的 location,  只要匹配一次,将不会再匹配其它正则表达式定义的 location 。

现在,请在attachments 目录下建立一个 php 脚本文件,再通过浏览器访问安,我们发现浏览器提示下载,这说明 nginx 把 attachments 目录下的文件当成静态文件处理,并没有交给 php fastcgi 处理。这样即使可写目录被植入木马,但因为其无法被执行,网站也就更安全了。

显然,重要的php 配置文件,请勿放在此类目录下。

3.  静态文件生成目录 public
这些目录一般都是php 生成的静态页的保存目录,显然与附件目录有类似之处,按附件目录的权限设置即可。

可以预见的是,如果我们设置了较严格的权限,即使网站php 程序存在漏洞,木马脚本也只能被写入到权限为 777 的目录中去,如果配合上述严格的目录权限控制,木马也无法被触发运行,整个系统的安全性显然会有显著的提高。

但是网站可写目录的作用及权限,只有开发人员最为清楚。这方面需要php 开发人员和系统管理员积极沟通。我们使用的方式是:项目上线前,开发人员根据以文档形式提供网站可写目录的作用及权限,由系统管理员针对不同目录进行权限设置。任何一方修改了网站目录权限,但未体现到文档中,我们认为是违反工作流程的。

转载于:https://my.oschina.net/kisshua/blog/62260

相关文章:

一个数字键盘引发的血案——移动端H5输入框、光标、数字键盘全假套件实现...

https://juejin.im/post/5a44c5eef265da432d2868f6 为啥要写假键盘&#xff1f; 还是输入框、光标全假的假键盘&#xff1f; 手机自带的不用非得写个假的&#xff0c;吃饱没事干吧&#xff1f; 装逼&#xff1f;炫技&#xff1f; 宝宝也是被逼的&#xff0c;宝宝也很委屈~.~ …

姿态检测 树莓派_怎样在树莓派上轻松实现深度学习目标检测?

原标题&#xff1a;怎样在树莓派上轻松实现深度学习目标检测&#xff1f;雷锋网按&#xff1a;本文为 AI 研习社编译的技术博客&#xff0c;原标题 How to easily Detect Objects with Deep Learning on Raspberry Pi&#xff0c;作者为 Sarthak Jain。翻译 | 小哥哥 狒狒 校对…

Linux目录读写和可执行权限

一 . 进入目录权限如果我在普通用户下创建了一个目录f1&#xff0c;然后使用chomd u-rwx,g-rwx,o-rwx之后&#xff0c;我在普通用户下想进入f1目录&#xff0c;权限不允许。然后我切换到超级用户下&#xff0c;再次尝试进入到f1目录&#xff0c;这个时候允许进入。然后回到普通…

【译】表变量和临时表的比较(转)

关于表变量是什么&#xff08;和表变量不是什么&#xff09;&#xff0c;以及和临时表的比较让很多人非常困惑。虽然网上已经有了很多关于它们的文章&#xff0c;但我并没有发现一篇比较全面的。在本篇文章中&#xff0c;我们将探索表变量和临时表是什么&#xff08;以及不是什…

grub加密。

一、介绍 安全无小事 linux系统的安全分为很多方面&#xff0c;什么端口啊&#xff0c;什么网络啊&#xff0c;听着都特么烦&#xff0c;今天谈谈最简单明显的密码安全。 二、单用户模式 单用户模式个人觉得相当有用&#xff0c;可以用来修复系统&#xff0c;修改密码…… 但是…

Linux下stat + 文件名后, Access,Modify,Change的含义

我们首先在一个目录下创建了一个文件使用命令touch file然后输入命令&#xff1a;stat file&#xff0c;这个时候会输出一系列信息大家注意红色框中的三个时间Access : 文件最近一次被访问的时间Modify: 文件内容最近一次被修改的时间Change: 文件属性最近一次被改变的时间接着…

基于设计模式的学习之旅-----访问者模式(附源码)

基于设计模式的学习之旅-----访问者模式 1、初始访问者模式 2、什么是访问者模式 表示一个作用于某对象结构中的各元素的操作。它使你可以在不改变各元素的类的前提下定义作用于这些元素的新操作。 3、模式结构图 4、模式代码事例 场景&#xff1a;年会&#xff0c;每个小组表演…

x is y python_Python 基础

2.1 程序与用户交互在python3中#input&#xff1a;无论用输入何种类型&#xff0c;都会存成字符串类型nameinput(please input your name:) #name18print(id(name),type(name),name)在python2中#raw_input与python3的input是一样的nameraw_input(please input your name:)print…

【leetcode 简单】 第八十九题 赎金信

给定一个赎金信 (ransom) 字符串和一个杂志(magazine)字符串&#xff0c;判断第一个字符串ransom能不能由第二个字符串magazines里面的字符构成。如果可以构成&#xff0c;返回 true &#xff1b;否则返回 false。 (题目说明&#xff1a;为了不暴露赎金信字迹&#xff0c;要从杂…

创建专属博客栏目

今天给大家get新技能了&#xff0c;是不是很期待捏我们一般看到的博客页面是这样的但是你是不是特别期待这样的捏其实技术上面也不是特别的 难&#xff0c;我们登录自己的csdn博客&#xff0c;然后选择“管理博客”&#xff0c;跳转页面之后选择“博客栏目”进入到这个页面之后…

《帝企鹅日记》观后感

第一次看到是在高中的英语周报上&#xff0c;那时候蛮好奇的&#xff0c;企鹅也写日记&#xff0c;呵呵&#xff0c;后来想了想应该是纪录片&#xff0c;时隔三年&#xff0c;发现当初的猜测果然不假。 我觉得那些企鹅很可爱&#xff0c;也很漂亮。最重要的是&#xff0c;那一条…

合并道路_资质改革已经确定!盘点被合并的资质!有这资质的要注意了

资质改革可以说是在行业里掀起了轩然大波&#xff0c;众多资质面临改革&#xff0c;有的资质被取消&#xff0c;有的资质被合并&#xff0c;有的资质继续保留。此文就带大家来盘点一下那些在近期资质定稿中被取消&#xff0c;被改变的资质&#xff1a;勘察资质勘察资质中&#…

如何为ccflow工作流引擎增加一个优先级PRI?

为什么80%的码农都做不了架构师&#xff1f;>>> 如何为ccflow工作流引擎增加一个优先级PRI&#xff1f; 对于一条流程的优先级可分为 低&#xff0c;中&#xff0c;高三个级别&#xff0c;用这个状态来标示这条流程的紧急程度。 以以前版本的ccflow中是以节点表…

SQL Server (MSSQLSERVER) 服务因 2148081668 服务性错误而停止。

https://zhidao.baidu.com/question/151448005.html 具体步骤&#xff1a;运行-> 输入&#xff1a;“services.msc” ->找到 “SQL Server (SQLEXPRESS)” 服务&#xff0c;双击 -> 在“SQL Server (SQLEXPRESS) 的属性”界面&#xff0c;点登录 -> 默认登录身份是…

面试题--特别是字节对齐

来源&#xff1a;http://www.cnblogs.com/Braveliu/archive/2013/01/04/2844757.html 【1】设置或者清除某位。 示例代码如下: 1 #include<iostream>2 using namespace std;3 4 #define BIT3 (0x1<<3)5 6 void Set_bit3(int &a)7 {8 a|BIT3;9 } 10 11…

vim基础入门

一. vim的三种模式在Linux操作系统下&#xff0c;我们一般会使用vim进行文本编辑&#xff0c;它相当于Windows下的记事本&#xff0c;但是它比记事本的功能强大的多。vim一般有三种模式分别是普通模式&#xff0c;编辑模式和命令模式。普通模式和编辑模式可以来回的切换&#x…

python html解析查找字符串_用python的BeautifulSoup分析html

序言之前用python爬取网页的时候&#xff0c;一直用的是regex或者自带的库sgmllib里的SGMLParser。但是遇到复杂一点的情况时&#xff0c;SGMLParser往往就不那么给力了&#xff01;(哈&#xff0c;难道说我 too native了&#xff1f;毕竟beautifulSoup是继承sgmlparser的么~)所…

ejb 3中bean的种类

会话bean(session bean) 主要用来编写业务逻辑和对数据库进行操作&#xff0c;Session Bean用于实现业务逻辑&#xff0c;它分为有状态bean和无状态bean。每当客户端请求时&#xff0c;容器就会选择一个Session Bean来为客户端服务。Session Bean可以直接访问数据库&#xff0…

Android学习 —— 数据的存储与访问方式一: 文件存取

笔记摘要&#xff1a; 在Android中主要提供了四种数据存储与访问的方式&#xff0c;文件、SharedPreference&#xff08;偏好参数保存&#xff09;、SOLite数据库、内容提供者&#xff08;Content provider&#xff09;和网络&#xff0c; 本篇文章先介绍使用文件的方式进行数据…

react的安装使用

react的重要思想是通过组件来开发应用&#xff0c;而组件就是能够完成某个特定功能而独立、可复用的代码。 react是可以像JQuery那样直接下载引入使用&#xff0c;也可以直接引用官网提供的CDN的地址&#xff1a; <script src"https://unpkg.com/react16/umd/react.dev…

锐捷交换机配置snmp版本_snmp交换机配置

华为交换机1、查询交换机当前是snmp配置命令dis cur2、进入全局模式 int ethernet1/0/7 shutdown 关 undoshutdown 激活sys3、进入SNMP配置snmp-agent4、配置只读字符串snmp-agent community read abcd5、配置写字符串snmp-agent community write abcd6、开启snmp版本支持功能 …

Linux命令find的35个实例

注&#xff1a;本文内容参考《35 Practical Examples of Linux Find Command》 网址&#xff1a;http://www.tecmint.com/35-practical-examples-of-linux-find-command/ Linux 查找命令是Linux系统中最重要和最常用的命令之一。查找用于根据与参数匹配的文件指定的条件来搜索…

PHP使用APNS的 feedback service

http://blog.csdn.net/gnicky/article/details/7544202 1. URL是不一样的&#xff0c;端口是2196 2. 使用同样的Certificate&#xff0c;建立安全连接&#xff0c;接受数据&#xff0c;直到数据不存在&#xff0c;类似table select操作 3.每条纪录是一个token&#xff0c;serve…

洛谷——P2341 [HAOI2006]受欢迎的牛//POJ2186:Popular Cows

P2341 [HAOI2006]受欢迎的牛/POJ2186:Popular Cows 题目背景 本题测试数据已修复。 题目描述 每头奶牛都梦想成为牛棚里的明星。被所有奶牛喜欢的奶牛就是一头明星奶牛。所有奶 牛都是自恋狂&#xff0c;每头奶牛总是喜欢自己的。奶牛之间的“喜欢”是可以传递的——如果A喜 欢…

学习使用Bing Maps Silverlight Control(五):离线使用和自定义地图模式

6 离线使用 在笔记第一部分的时候就提到如果要使用Bing Maps Silverlight Control 进行开发&#xff0c;需要申请一个key&#xff0c;不让会显示一个错误提示出来。但是在实际开发或使用过程中&#xff0c;使用环境和地图数据可能不是在线的&#xff0c;但控件因为验证失败仍然…

python123第k序元素查找_Python实现折半查找并用matplotlib实现动态过程可视化

折半查找是算法中减治策略的基本例子&#xff0c;实现起来也很简单&#xff0c;但是在网上看到的图片教程不觉得很乾巴麽&#xff1f;&#xff1f;在这里插入图片描述这是一个简单的实现&#xff1a;def Reduction(lists, k):""":param lists: 元素列表:param k…

vim进阶技巧

本篇博文是在之前的《vim基础入门》的基础之上写的&#xff0c;不懂的同学可以先看之前的分享 1. 视觉范围的选择 普通模式下&#xff0c;按v键确定范围起点&#xff0c;然后移动光标&#xff0c;光标所在位置为范围的终点&#xff0c;然后按操作键完成其他操作&#xff0c;之…

Flex Air程序打包成独立的exe安装文件

2019独角兽企业重金招聘Python工程师标准>>> 开发背景&#xff1a; FlexBuilder3.2开发生成的Air程序需要能够独立安装&#xff0c;事先不需要安装AdobeAir运行环境 实现方法&#xff1a; 1)用winrar打开xx.air文件爱能&#xff0c;并将它解压在D:\airapp目录中。 2…

《C++primer》第一章--开始

之前开始读《Cprimer》&#xff0c;想着读书不动笔不如不读书&#xff0c;于是就想做一个读书笔记的内容&#xff0c;于是就想起了写一个《Cprimer读思录》的一个专栏。一是为了给自己平时读书做笔记&#xff0c;方便自己随时查看。二是为了督促自己每天学习。三是为了知识的分…

对于计算机网络的整体框架的概括(转载) 个人感觉很好

作者&#xff1a; 阮一峰 日期&#xff1a; 2012年5月31日 我们每天使用互联网&#xff0c;你是否想过&#xff0c;它是如何实现的&#xff1f; 全世界几十亿台电脑&#xff0c;连接在一起&#xff0c;两两通信。上海的某一块网卡送出信号&#xff0c;洛杉矶的另一块网卡居然就…