SuPHP是apache的一个模块,它允许PHP在不同的Linux用户下运行。
SuPHP是一个很不错的开源工具。它可以让你的PHP代码以一种安全的方式进行运行。你可以为每个虚拟主机或者站点指定一个特定的用户来运行PHP代码。而不是像PHP和Apache默认的那样运行于nobody、www-data、apache或者root(这样是相当危险的)这些账户下。试想,一个不成熟的PHP代码运行于root帐户下,将带来多么大的安全隐患。另外,一般而言,为了外界能正常使用网站,很多目录(比如附件目录、缓存目录等)都要设置为777才能够正常写入。这样其实也是不安全的。
而SuPHP正好可以解决这个问题。首先,SuPHP可以指定PHP代码以哪个帐户运行。这样您就可以把一些不安全的未经测试的PHP代限制在一些并没有实际权限的用户下进行运行。另外,通过SuPHP,要求写入的目录可以只设置为755,文件等设置为644就可以让外界用户正常使用网站的每一个功能了。所以,SuPHP是一个增强型的安全工具。尤其对于那些空间提供商来说。
SuPHP运行的原理是把PHP代码将由SuPHP进行解释,然后SuPHP将通过您设置好的那个帐户运行PHP解释器。
本帖纪录怎么在CentOS 7.X上安装SuPHP,由于目前还没有现成的模块,我们需要从源码编译安装。
我使用的CentOS是最小化安装的;并且本文使用centos.example.com,192.168.1.100作为CentOS的域名和IP地址,注意替换为你实际的域名和IP地址。
#1 安装防火墙(可选)
如果你没有安装防火墙,强烈建议你安装防火墙。
# yum install firewalld
启动防火墙服务:
# systemctl start firewalld.service
# systemctl enable firewalld.service
首先,打开SSH端口确保可以使用ssh连接:
# firewall-cmd --permanent --zone=public --add-service=ssh
# firewall-cmd --reload
#2 安装Apache和PHP
安装Apache和Aapache开发包:
# yum install httpd httpd-devel
安装PHP和一些常用模块:
# yum install php php-mysql php-gd php-pear php-xml php-xmlrpc php-mbstring curl
启动Apache服务:
# systemctl start httpd.service
# systemctl enable httpd.service
配置防火墙允许80和443端口的连接:
# firewall-cmd --permanent --zone=public --add-service=http
# firewall-cmd --permanent --zone=public --add-service=https
# firewall-cmd --reload
#3 安装 SuPHP
由于我们要从源码编译安装,所以我们还需要安装开发编译工具(gcc、make…):
# yum groupinstall 'Development Tools'
安装wget和vim编辑器:
# yum install wget vim
下载SuPHP源码并解压:
# cd /usr/local/src
# wget http://suphp.org/download/suphp-0.7.2.tar.gz
# tar zxvf suphp-0.7.2.tar.gz
CentOS 7使用Apache 2.4,在编译之前先打一个补丁:
# wget -O suphp.patch https://lists.marsching.com/pipermail/suphp/attachments/20130520/74f3ac02/attachment.patch
# patch -Np1 -d suphp-0.7.2 < suphp.patch
编译安装:
# cd suphp-0.7.2
# autoreconf -if
# ./configure --prefix=/usr/ --sysconfdir=/etc/ --with-apr=/usr/bin/apr-1-config --with-apache-user=apache --with-setid-mode=owner --with-logfile=/var/log/httpd/suphp_log
# make
# make install
配置Apache使用suPHP模块:
# vim /etc/httpd/conf.d/suphp.conf
添加一行:
LoadModule suphp_module modules/mod_suphp.so
创建suPHP配置文件 /etc/suphp.conf:
# vim /etc/suphp.conf
内容如下:
[global]
;Path to logfile
logfile=/var/log/httpd/suphp.log
;Loglevel
loglevel=info
;User Apache is running as
webserver_user=apache
;Path all scripts have to be in
docroot=/
;Path to chroot() to before executing script
;chroot=/mychroot
; Security options
allow_file_group_writeable=true
allow_file_others_writeable=false
allow_directory_group_writeable=true
allow_directory_others_writeable=false
;Check wheter script is within DOCUMENT_ROOT
check_vhost_docroot=true
;Send minor error messages to browser
errors_to_browser=false
;PATH environment variable
env_path=/bin:/usr/bin
;Umask to set, specify in octal notation
umask=0077
; Minimum UID
min_uid=100
; Minimum GID
min_gid=100
[handlers]
;Handler for php-scripts
x-httpd-suphp="php:/usr/bin/php-cgi"
;Handler for CGI-scripts
x-suphp-cgi="execute:!self"
重启Apache:
# systemctl restart httpd.service
#4 配置Apache虚拟主机配置文件
我使用的域名 centos.example.com,网站文档目录 /var/www/centos.example.com,使用的用户web1。
添加一个用户:
# useradd web1
创建网站存放目录:
# mkdir /var/www/centos.example.com
# chown web1:web1 /var/www/centos.example.com
添加虚拟主机配置文件 centos.example.com.conf:
# vim /etc/httpd/conf.d/centos.example.com.conf
写入内容:
<VirtualHost *>
DocumentRoot /var/www/centos.example.com
ServerName centos.example.com
ServerAdmin webmaster@example.com
<FilesMatch ".+\.ph(p[345]?|t|tml)$">
SetHandler None
</FilesMatch>
<IfModule mod_suphp.c>
suPHP_Engine on
<FilesMatch "\.php[345]?$">
SetHandler x-httpd-suphp
</FilesMatch>
suPHP_AddHandler x-httpd-suphp
</IfModule>
</VirtualHost>
重启Apache:
# systemctl restart httpd.service
#5 测试
创建info.php测试文件:
# vim /var/www/centos.example.com/info.php
写入内容:
<?php
phpinfo();
更改文件权限:
# chown web1:web1 /var/www/centos.example.com/info.php
使用浏览器访问 http://centos.example.com/info.php
Server API显示CGI/FastCGI代表PHP的运行模式是SuPHP,而不是mod_php。
查看PHP在哪个用户下运行:
<?php
system('whoami');