CentOS 6.6 + LAMP实战 (三)

6 PHP安全加固

现在你的VPS网站可以跑了,但是访问多了,安全性就得重视起来,我们从apache php mysql三个方面分别加固。

vim /etc/php.ini

打开PHP配置文件,进行一些修改。

先看386行,这一行指定PHP禁用的函数。PHP的功能很强大,但功能强大就意味着安全隐患多。我们跑一般的网站,也用不着这些功能。像下面这样修改:

disable_functions = show_source,phpinfo,passthru,exec,system,chroot,chgrp,chown,shell_exec,proc_open,proc_get_status,ini_alter,ini_alter,ini_restore,dl,openlog,syslog,readlink,symlink,popepassthru,stream_socket_server,escapeshellcmd,dll,popen,disk_free_space,checkdnsrr,checkdnsrr,getservbyname,getservbyport,disk_total_space,posix_ctermid,posix_get_last_error,posix_getcwd,posix_getegid,posix_geteuid,posix_getgid, posix_getgrgid,posix_getgrnam,posix_getgroups,posix_getlogin,posix_getpgid,posix_getpgrp,posix_getpid, posix_getppid,posix_getpwnam,posix_getpwuid, posix_getrlimit, posix_getsid,posix_getuid,posix_isatty, posix_kill,posix_mkfifo,posix_setegid,posix_seteuid,posix_setgid, posix_setpgid,posix_setsid,posix_setuid,posix_strerror,posix_times,posix_ttyname,posix_uname,pcntl_alarm,pcntl_fork,pcntl_waitpid,pcntl_wait,pcntl_wifexited,pcntl_wifstopped,pcntl_wifsignaled,pcntl_wexitstatus,pcntl_wtermsig,pcntl_wstopsig,pcntl_signal,pcntl_signal_dispatch,pcntl_get_last_error,pcntl_strerror,pcntl_sigprocmask,pcntl_sigwaitinfo,pcntl_sigtimedwait,pcntl_exec,pcntl_getpriority,pcntl_setpriority

需要注意的是,scandir这个功能被禁用,会导致wordpress始终提示翻译有更新。如果出现这个问题就把它去掉。

380行:open_basedir
open_basedir指的是PHP代码可以操作的目录,默认情况下这一行是注释掉,不作限制的。如果对安全性要求高,可以在这一行手工指定。比如可以这样:
open_basedir .:/tmp/
冒号是分隔符,不同的目录之间用冒号分隔。一个句点表示当前目录,也就是PHP代码所在的目录。
如果你的网站在/var/www/html/domain.com,那么就把这个地址也加到open_basedir里去。地址后面加/符号,则操作严格限制在这个目录中,如果不加,凡是以这个地址开头的所有地方都可以操作。

432行:

expose_php = Off  /*不公开php版本的信息*/

745行:

magic_quotes_gpc = On /*防止SQL注入*/
7 Apache安全加固
#vim /etc/httpd/conf/httpd.conf
44行:ServerTokens OS,改为ServerTokens Prod。
ServerTokens表示主机HTTP回应头,按照不同的设置会回应不同的内容:
ServerTokens Prod[uctOnly] 回应:Server:Apache
ServerTokens Major 回应:Server:Apache/2
ServerTokens Minor回应:Server:Apache/2.0
ServerTokens Min[imal] 回应:Server:Apache/2.0.41
ServerTokens OS 回应:Server: Apache/2.0.41 (Unix)
ServerTokens Full (或置空) 回应:Server: Apache/2.0.41 (Unix) PHP/4.2.2 MyMod/1.2
(以上可能和你的服务器回应内容不一样,比如版本号,大致是这个意思)
可见,设置为Prod,回应的内容最小,最大程度保护服务器的隐私。
Options :目录支持的特性。后面有这几个选项:Indexes Includes FollowSymLinks SymLinksifOwnerMatch ExecCGI MultiViews
Indexes:如果目录底下没有任何的DirectoryIndex文件(也就是402行指定的那些文件),那么服务器会返回这个目录底下的所有文件链接列表。
Includes:允许SSI(Server side include,服务器端包含)
FollowSymLinks:允许使用符号链接。
SymLinksifOwnerMatch
ExecCGI:允许执行CGI代码。
MultiViews:允许使用mod_negotiation模块提供内容协商的”多重视图”,安全起见禁止。
按照不同的需求启用不同的参数。
这个Options在每个Directory底下都可以设置,设置时应注意是哪个Directory。你也可以只在以下两处设置:
303行:服务器的默认设置,这里只需设置最基本的。
Options FollowSymLinks
331行:网站根目录,设置为:
Options -Index FollowSymLinks,禁止Index,允许FollowSymLinks。
536行:ServerSignature On,改成Off。ServerSignature指的是在错误页、文件目录页(Index)等地方显示的页脚,设置会On的话会显示Apache的版本、Server名称等信息。我们把它关掉。
338行:AllowOverride,指定是否允许覆盖httpd.conf的设置。可置为On或Off。如果你需要用到.htaccess文件,比如的Wordpress使用固定连接,那可以设置为On,如果不用.htaccess最好把它关掉。我就是关掉的。
8 MySQL安全加固
MySQL的安全性需要多方面考虑。比如帐号设置、权限设置、服务器设置等等。
当网站需要连接数据库时,应该给新建的数据库一个单独的帐号,这个帐号不要授予任何全局权限。
有关MySQL的安全,我也在摸索中,搜索“MySQL安全加固” 可以找到答案。这篇小文里就不多说了。

Leave a Reply

Your email address will not be published. Required fields are marked *