如何设置安全的 PHP 和 SFTP

如何设置安全的 PHP 和 SFTP

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

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

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

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

我考虑设置另一个用户帐户,例如wordpress-sftp:wordpress仅用于 SFTP。此用户的主文件夹将是 wordpress 主机的根目录,就像wordpress:wordpress's.wordpress-sftp:wordpress可以完全访问此主机的文件一样。我将使 wordpress 安装的文件可由组读取wordpress。我将使需要由 wordpress 写入的文件可由组写入wordpress。此外,我将把www-data用户添加到wordpress组,以便它可以读取静态文件。

因此,所有文件都可以获得权限644,或者640,需要由 Wordpress 可写的文件将获得权限664660

这种设置听起来合理且安全吗?或者你会如何解决这个问题?

答案1

此设置仅对您的 wordpress 站点文件夹中的文件是安全的,但不能阻止攻击者侵入您的系统并访问/读取/写入您服务器中的其他文件。

由于您使用 php5-fpm,我建议您设置 open_basedir 以将 php5 用户限制在 php5 池目录中,如下所示:

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

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

禁用 CMS 未使用的所有 php 函数,以防止恶意用户使用危险函数,即:

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 安装所需的最大 RAM 量),这样恶意脚本就无法耗尽您的服务器资源。

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

相关内容