如何设置安全的PHP和SFTP

我目前的设置包括nginx和php5-fpm。 这个问题是关于一个包含Wordpress网站的主机。 主机有自己的用户:组的fpm池,我们称之为wordpress:wordpress 。 Nginx使用默认的www-data:www-data

这意味着:PHP文件由wordpress:wordpress执行wordpress:wordpress ,静态文件由www-data:www-data 。 因此,这两个用户都需要读取所有的文件。 wordpress写入的文件也应该可以通过wordpress:wordpress写入。

但是,问题来了:我想允许通过SFTP修改所有的文件。 目前这是使用wordpress:wordpress用户完成的,这意味着这个用户需要完全访问所有的文件。

因此,上传到服务器的恶意PHP脚本可以修改此Wordpress安装的所有文件,并将恶意软件等发送给最终用户。 我想通过仅使Wordpress需要写入PHP的文件来降低这种风险。

我想build立另一个用户帐户,说wordpress-sftp:wordpress专用于SFTP的wordpress-sftp:wordpress 。 这个用户的home文件夹将是WordPress主机的根,就像wordpress:wordpress的一样。 wordpress-sftp:wordpress可以完全访问这个主机的文件。 WordPress的安装的文件,我会让wordpress组可读。 WordPress的需要写入的文件可以由wordpress组写入。 此外,我会添加www-data用户到wordpress组,以便它可以读取静态文件。

所以所有文件都可以获得644640权限,需要由Wordpress写入的文件将获得664660权限。

这个设置是否合理和安全? 或者你将如何解决这个问题?

这个设置只对你的WordPress站点文件夹中的文件是安全的,但是不要阻止攻击者闯入你的系统并访问/读/写你的服务器上的其他文件。

因为你使用的是php5-fpm,我build议你设置open_basedir来限制php5用户到php5的池目录,像这样:

 php_admin_value[open_basedir] = /home/www/wordpress/httpdocs:/home/www/wordpress/tmp 

更改站点的tmp目录,以避免在共享的tmp文件夹中访问。

禁用CMS未使用的所有phpfunction,以防止对恶意用户使用危险function,即:

 php_admin_value[disable_functions] = apache_child_terminate, apache_setenv, define_syslog_variables, escapeshellarg, escapeshellcmd, eval, exec, fp, fput, ftp_connect, ftp_exec, ftp_get, ftp_login, ftp_nb_fput, ftp_put, ftp_raw, ftp_rawlist, highlight_file, ini_alter, ini_get_all, ini_restore, inject_code, mysql_pconnect, passthru, php_uname, phpAds_remoteInfo, phpAds_XmlRpc, phpAds_xmlrpcDecode, phpAds_xmlrpcEncode, popen, posix_getpwuid, posix_kill, posix_mkfifo, posix_setpgid, posix_setsid, posix_setuid, posix_setuid, posix_uname, proc_close, proc_get_status, proc_nice, proc_open, proc_terminate, shell_exec, system, xmlrpc_entity_decode 

限制内存(如果你可以计算你的wordpress安装所需的最大内存量),这样恶意脚本就不能耗尽你的服务器资源。

 php_admin_value[memory_limit] = 124M 

限制upload_max_file大小和post_max_size,以防止上传大的软件(如果你不需要)

 php_admin_value[upload_max_filesize] = 12M php_admin_value[post_max_size] = 12M