Automatic WordPress Updates Using FTP/FTPS or SSH
Introduction
When working with WordPress in a more secure environment
where websites are not entirely world-writable,
you will notice upgrades request FTP or FTPS credentials
as the server itself does not typically have write access in properly-configured environments.
Entering these credentials for every upgrade can become quite tedious,
and WordPress has implemented some constants
you can define within wp-config.php to make upgrades automatic.
It should be noted here that you can also make upgrades automatic
by setting the file ownership of all files within the WordPress directory
to the same user/group under which the webserver is running.
THIS IS HORRIBLE SECURITY PRACTICE!
While storing your FTP credentials for a specific user can also be considered insecure in certain instances,
it can be a very safe method to automate WordPress updates under the proper conditions.
Some general considerations which can make stored credentials MUCH more secure include:
FTP:
1. Creating a separate user and restricting its access to only allow connections from localhost
2. Ensuring your FTP daemon is “chrooting” the user to their own directory only
3. Configuring your FTP daemon to listen only on localhost, thus preventing external connections
4. Using something more secure than FTP, such as SSH — Yes, we realize this one does not actually improve FTP security
SSH:
1. Creating a separate user (usually an alias with the same UID, different GID) and
restricting access to only localhost for this specific user in sshd_config with the AllowHosts option
2. Creating some advanced SSH configuration such as chrooted SFTP-only users
3. Using public key authentication, which can be further secured
by specifying a “from” address in the user’s authorized_keys file
There are several other ways one can make their FTP/FTPS or SSH setup more secure,
but they are far beyond the scope of this post and can vary greatly in their application
due to the hosting environment and several other factors.
We are going to assume you’re already working with a secure setup for the purposes of this guide.
WordPress Upgrade Constants
From the WordPress Codex, the following constants are available to define FTP and SSH credentials in wp-config.php:
FS_METHOD
This setting forces the filesystem (or connection) method, and you probably won’t need to adjust or define it.
It can be one of: “direct”, “ssh2″, “ftpext”, or “ftpsockets”.
WordPress will automatically determine the proper method using the following preferential order:
—(Primary Preference) “direct” causes the use of direct file I/O requests from within PHP,
but this requires the webserver to have write access to your WordPress installation, which is NOT recommended.
This setting will be chosen automatically when the permissions allow.
—(Secondary Preference) “ssh2″ allows forcing usage of the SSH2 PHP extension if installed (via PECL).
—(3rd Preference) “ftpext” allows forcing the usage of the FTP PHP extension (this is usually the default when you connect via FTP/FTPS).
—(4th Preference) “ftpsockets” utilizes the PHP sockets class for FTP access (far less common, but can resolve FTP connection issues in rare cases).
FTP_BASE is the full path to the “base” (absolute path) folder of your WordPress installation.
FTP_CONTENT_DIR is the full path to the wp-content folder of your WordPress installation.
FTP_PLUGIN_DIR is the full path to the plugins folder of your WordPress installation.
FTP_PUBKEY is the full path to your SSH public key.
FTP_PRIKEY is the full path to your SSH private key.
FTP_USER is either your FTP or SSH username, depending on which method you use.
FTP_PASS is the password for the username entered for FTP_USER. If you are using SSH public key authentication, this can be left blank.
FTP_HOST is the hostname[:port] combination for your SSH/FTP server.
The default FTP port is 21 and the default SSH port is 22.
You only need to specify the port if using a non-standard one.
FTP_SSL is only for FTPS connections, and should not be defined
unless you have already configured your FTP daemon to support TLS.
Note – SFTP is NOT the same thing, so make sure you do not confuse the two.
Here’s an example of the most common configuration options with sample values so you can see the proper method of defining them within wp-config.php:
define('FS_METHOD', 'ftpext');
define('FTP_BASE', '/path/to/wordpress/');
define('FTP_CONTENT_DIR', '/path/to/wordpress/wp-content/');
define('FTP_PLUGIN_DIR ', '/path/to/wordpress/wp-content/plugins/');
define('FTP_PUBKEY', '/home/username/.ssh/id_rsa.pub');
define('FTP_PRIKEY', '/home/username/.ssh/id_rsa');
define('FTP_USER', 'username');
define('FTP_PASS', 'password');
define('FTP_HOST', 'ftp.example.org');
define('FTP_SSL', false);
To configure FTP/FTPS, you simply define the necessary constants from the list above in wp-config.php.
A minimal configuration requires at least
FTP_BASE, FTP_USER, FTP_PASS and FTP_HOST (usually 127.0.0.1).
Enter these required constants, also adding FTP_SSL (true) if using FTPS,
then your next upgrades should be automatic,
and you should no longer be prompted to enter these details.
Enabling SSH support in WordPress Using the PECL SSH2 extension
Most users are not aware of this, but WordPress already supports SSH connections in addition to FTP/FTPS by simply enabling the SSH2 extension in PHP. Let’s begin by installing the SSH2 extension via PECL.
On RHEL/CentOS, you will need the php-devel, php-pear and libssh2/libssh2-devel packages and a working compiler/development libraries if you installed PHP via Yum (RPM-based installation):
# yum install php-devel php-pear gcc gcc-c++ make automake autoconf pcre-devel re2c libssh2 libssh2-devel
With the necessary prerequisites installed, you can now use the CLI tool ‘pecl’ to automagically install the extension for you:
# pecl install ssh2-0.12
The reason we need to define the version here is to avoid an error message about the extension being in “beta,” since there was never a release of this particular extension that was labeled as “stable.” Once the installation completes successfully, you’ll be presented with a success message that instructs you to enable the extension in php.ini. When using CentOS, each extension’s INI file is stored separately from the main php.ini for cleanliness and easy addition/removal of extensions. To update /etc/php.d/ssh2.ini, we will use the following command:
# echo "extension=ssh2.so" > /etc/php.d/ssh2.ini
Now, running ‘php -m’ should show the SSH2 extension in the list of extensions. If you see it there, you must now restart your PHP processor (we’ll assume it’s Apache):
# /etc/init.d/httpd restart
You now have the SSH2 extension installed and enabled. If you have not already entered any constants in wp-config.php, you can attempt an upgrade or plugin installation/deletion and you will now see a new radio button that says SSH, in addition to the FTP and FTPS choices you’ve always had. To complete this configuration, you can now just enter the same minimal options used above, possibly including the FS_METHOD constant (ssh2) to ensure only SSH connections are attempted. However, we assume you would rather use the most secure method you can, so let’s configure SSH with public key authentication.
We’ll start by generating a public/private keypair, which we will later define in wp-config.php:
# ssh-keygen -t rsa -b 4096 Generating public/private rsa key pair.
Enter file in which to save the key (/root/.ssh/id_rsa): /home/user1/wp_rsa
Enter passphrase (empty for no passphrase):
Enter same passphrase again:
Your identification has been saved in /home/user1/wp_rsa.
Your public key has been saved in /home/user1/wp_rsa.pub.
The key fingerprint is:
xx:xx:xx:xx:xx:xx:xx:xx:xx:xx:xx:xx:xx:xx:xx:xx root@server1.example.com
The location of the keys should be somewhere outside of your webroot, so the user’s home directory is usually a safe choice. You should NOT enter a password here, as there have been many issues getting passworded SSH keys to work properly with WordPress. After creating the keypair, we need to make it readable by the webserver (we’ll assume your webserver runs under the “apache” user for simplicity):
# chown user1:apache /home/user1/wp_rsa
# chown user1:apache /home/user1/wp_rsa.pub
# chmod 0640 /home/user1/wp_rsa
# chmod 0640 /home/user1/wp_rsa.pub
Next, you just need to edit wp_rsa.pub to specify the ‘from=’ option and add the contents to the authorized_keys file in /home/user1/.ssh/authorized_keys:
# vim /home/user1/wp_rsa.pub
You can use whichever editor you please (vi, nano, emacs, etc), so there’s no need to cry. Once you’ve opened the file, add the following ‘from=’ restriction at the beginning of the line (there should only be one very long line) right before ssh-rsa and the key data:
from="127.0.0.1" ssh-rsa ...
Now, we can actually place the public key’s contents in the user’s authorized_keys file:
# mkdir /home/user1/.ssh
# chown user1:user1 /home/user1/.ssh/
# chmod 0700 /home/user1/.ssh/
# cat /home/user1/wp_rsa.pub >> /home/user1/.ssh/authorized_keys
# chown user1:user1 /home/user1/.ssh/authorized_keys
# chmod 0644 /home/user1/.ssh/authorized_keys
As long as PubkeyAuthentication is enabled in sshd_config (default), you should now be ready to configure wp-config.php for automatic SSH upgrades:
define('FTP_PUBKEY','/home/user1/wp_rsa.pub');
define('FTP_PRIKEY','/home/user1/wp_rsa');
define('FTP_USER','user1');
define('FTP_PASS','');
define('FTP_HOST','127.0.0.1:22');
From now on, installing/removing/upgrading WordPress and its plugins should no longer prompt you for credentials. Happy blogging!
Automatic WordPress Updates Using FTP/FTPS or SSH的更多相关文章
- Easy WordPress Updates: Store FTP Info in wp-config.php
Saw an interesting blog post on Twitter today about storing WordPress FTP information in wp-config.p ...
- Install WordPress Plugins without FTP Access
WordPress will only prompt you for your FTP connection information while trying to install plugins o ...
- ubuntu 使用 vsftpd 基于系统用户配置相互隔离的 ftp (ftps) 服务
我们在日常使用 UbuntuServer 服务器时,经常会直接使用基于 ssh 的 sftp 连接服务器直接进行文件上传和下载,不过这个方式其实有一定的安全隐患,当一个团队有多个人员,需要连接服务器 ...
- FTP,FTPS,FTPS与防火墙
昨天搭建了一台FTPS服务器,过程中学习了很多不清楚的知识点,还有遇到的问题,记录一下. (大部分内容汇集.整理自网络) 一. 关于FTP传输模式 众所周知,FTP传输有两种工作模式,Active M ...
- ubuntu系统ftp连接 以及ssh连接
tfp连接 ssh连接 ubuntu下ssh使用 与 SCP 使用 1 ssh远程登录服务器 ssh username@remote_ip #将username换成自己的用户名,将remote_ip换 ...
- FileZilla_server在Windows和Linnx下的部署安装
1. FileZilla官网下载FileZilla Server服务器,目前最新版本为0.9.53. 2. 安装FileZilla服务器.除以下声明的地方外,其它均采用默认模式,如安装路径等. 2.1 ...
- FTP、FTPS和SFTP
FTP 一.两种传输方式 ASCII传输方式 假定用户正在拷贝的文件包含的简单ASCII码文本,如果在远程机器上运行的不是UNIX,当文件传输时ftp通常会自动地调整文件的内容以便于把文件解释成另外那 ...
- Ftp、Ftps与Sftp之间的区别
Ftp FTP 是File Transfer Protocol(文件传输协议)的英文简称,而中文简称为“文传协议”.用于Internet上的控制文件的双向传输.同时,它也是一个应用程序(Applica ...
- FTP、FTPS、SFTP概览
1. 基本概念 FTP:File Transfer Protocol FTPS:FTP over SSL.构建在SSL/TLS(Secure Socket Layer/Transport Layer ...
随机推荐
- python网络编程--线程锁(互斥锁Mutex)
一:为什么需要线程锁 一个进程下可以启动多个线程,多个线程共享父进程的内存空间,也就意味着每个线程可以访问同一份数据,此时,如果2个线程同时要修改同一份数据,会出现什么状况? 很简单,假设你有A,B两 ...
- 利用vw+rem实现移动web适配布局
基本概念 1.单位 Px(CSS pixels) 像素 (px) 是一种绝对单位(absolute units), 因为无论其他相关的设置怎么变化,像素指定的值是不会变化的 其实是相对于某个设备而言的 ...
- KVM virsh常用命令篇
1.查看运行的虚拟机 virsh list 2.查看所有的虚拟机(关闭和运行的虚拟机) virsh list --all 3.连接虚拟机 virsh console +域名(虚拟机的名称) 4.退出虚 ...
- 2016-2017-2 20155309 南皓芯《java程序设计》第八周学习总结
教材学习内容总结 本周学习的主要是第十四章,第十五章的内容. NIO与NIO2 同步非阻塞IO(Java NIO) : 同步非阻塞,服务器实现模式为一个请求一个线程,即客户端发送的连接请求都会注册到多 ...
- **PHP错误Cannot use object of type stdClass as array in错误的
错误:将PHP对象类型当做了PHP数组 解决方法:用对象操作符-> 今天在PHP输出一个二维数组的时候,出现了“Fatal error: Cannot use object of type s ...
- Inno setup 常用修改技巧
Inno setup 常用修改技巧1 .如何让协议许可页面默认选中我同意按钮 [code]procedure InitializeWizard();beginWizardForm.LICENSEACC ...
- 30 最小的k个数
输入n个整数,找出其最小的k个数,例如输入4,5,1,6,2,7,3,8,最小的4个数为1,2,3,4 解法一:快排思想,会改变原数组 O(n) 注意是vector<int>& ...
- CentOs 安装 swftools
一 下载安装包 #wget http://www.swftools.org/swftools-0.9.1.tar.gz 二 安装相关依赖库 #yum install gcc* automake zli ...
- ASP.NET MVC5+ 路由特性
概述 ASP.NET MVC 5支持一种新的路由协议,称为路由特性. MVC5也支持以前定义路由的方式,你可以在一个项目中混合使用这两种方式来定义路由. 案例 1.使用Visual Studio 20 ...
- Django第一步
对于一个web框架,掌握了三部分的内容,就可以说是迈出了第一步. 1. 准备开发环境 2. 创建一个工程,并运行 3. 开发hello world应用 1. 准备环境 首先应该是安装python和dj ...