WordPressでFTP接続情報が表示、SSH転送で回避

テーマやプラグインインストール時にFTP接続情報が表示され、うまく実行できない場合がありました。

セキュリティを考慮し、WordPress用ディレクトリの所有者を”apache”から通常のユーザーに変更してありますが、/wp-content/themesや/wp-content/upgradeの所有グループはWebサーバーの実行ユーザーである”apache”になっていて、グループに書込み権限を付与してありました。
 
詳しいことは良く分かりませんが、何か別のチェックを行っていて(実行ユーザーとファイル所有者の一致?)それでエラーになっているようです。
 
いろいろ調べてみると”wp-config.php”に設定することによって回避できました。以下、その内容と記載します。
 
※PHP7アップデート後の不具合については以下の記事を参照。
CentOS6でPHP5.3からPHP7.1へアップデート
 

(1)wp-config.phpの設定方法


 
下記オンラインマニュアルに記載されています。
『Editing wp-config.php』
 
wp-config.phpファイルに設定を追加すると”接続情報”の画面が表示されず、ファイル転送できるようになりました。
 
詳しい転送の仕組みは理解できていませんが、主に3つの方法に分けられます。
 
①FTP
 
・FTPはセキュリティ的に問題があり、サーバー内にインストールしていないので、無視しました。
 
②SSH
 
・PHPのSSH拡張を使用。
・php-pear、php-devel、libssh2、libssh2-develなど追加でパッケージをインストールする必要ある。
・SSHの接続情報をwp-config.phpに記載すると”接続情報”画面が表示されず、ファイル転送が可能になる。
・インストールされたテーマやプラグインのファイルの所有者は、SSH接続に使用したユーザーになる。
 
私の環境では、WordPressディレクトリの所有者は、このSSH接続情報に指定したユーザーになっているのでディレクトリの権限変更は必要ありませんでした。
 
③直接
 
・PHPから直接ファイル転送するようです。
・define(‘FS_METHOD’, ‘direct’)と1行記述するのみで設定が簡単。
・Webサーバープロセスの実行ユーザーによって実行されるようで、インストールされたファイルの所有者は”apache”になっていました。
 
私の環境では、WordPress用ディレクトリの所有者は”apache”ではなく、ファイル転送用のユーザーになっているので、テーマのインストールの場合は、下記ディレクトリに対してWebサーバー実行ユーザーの書込み権限が必要でした。
/wp-content/upgrade/
/wp-content/themes/
 
 
設定は③が一番簡単ですが、セキュリティ的には②が良さそうですね。私の環境では、WordPress用ディレクトリはすべてファイル転送用のユーザーを所有者にしているので、導入したテーマやプラグインの所有者が”apache”になってしまうのは全体で統一されなくなくなるといった問題があります。
 
上記より、②のSSH接続を使用することにしました。
 

(2)SSH接続の場合の設定手順


 
1)peclでssh拡張のインストール
 
上記参考サイトに記載されていますが、まずpeclライブラリのssh2をインストールする必要があります。環境によって手順が異なるかと思いますが、私が実施した手順を示します。
 
①pearのインストール
 
CentOSの場合は、peclはpearパッケージをインストールすると利用できます。

# yum install php-pear
  :
Installed:
  php-pear.noarch 1:1.9.4-4.el6

Complete!

 
②libssh2、libssh2-develのインストール
 
peclのssh2には、libssh2、libssh2-develの二つが必要のようです。参考サイトには記載がなかったので、入れずにpeclのssh2をインストールしたら正常に動作しませんでした。
 

# yum install libssh2 libssh2-devel
 
Package libssh2-1.4.2-1.el6.x86_64 already installed and latest version

Installed:
  libssh2-devel.x86_64 0:1.4.2-1.el6
 
Complete!

 
③peclでssh2をインストール
 

# pecl install ssh2
 
Failed to download pecl/ssh2 within preferred state "stable", latest release is version 0.12, stability "beta", use "channel://pecl.php.net/ssh2-0.12" to install
install failed

 
エラーが発生します。”channel://pecl.php.net/ssh2-0.12″を使用しなさいと表示されているので、その通りに実行しなおします。
 

# pecl install channel://pecl.php.net/ssh2-0.12

WARNING: channel "pecl.php.net" has updated its protocols, use "pecl channel-update pecl.php.net" to update
downloading ssh2-0.12.tgz ...
Starting to download ssh2-0.12.tgz (26,223 bytes)
.........done: 26,223 bytes
6 source files, building
running: phpize
sh: phpize: command not found
ERROR: `phpize' failed

 
エラーが発生します。”phpize”が無い言っています。
 
“phpize”を含んでいるパッケージをyumで探します。
 

# yum provides "*/phpize"
  :
php-devel-5.3.3-23.el6_4.x86_64 : Files needed for building PHP extensions
Repo        : updates
Matched from:
Filename    : /usr/bin/phpize

 
“php-devel”というパッケージ含まれているので、”php-devel”をインストールします。
 

# yum install php-devel
  :
Installed:
  php-devel.x86_64 0:5.3.3-23.el6_4

 
再度、peclでssh2をインストールします。
 

# pecl install channel://pecl.php.net/ssh2-0.12
 
WARNING: channel "pecl.php.net" has updated its protocols, use "pecl channel-update pecl.php.net" to update
downloading ssh2-0.12.tgz ...
Starting to download ssh2-0.12.tgz (26,223 bytes)
.........done: 26,223 bytes
6 source files, building
running: phpize
Configuring for:
PHP Api Version:         20090626
Zend Module Api No:      20090626
Zend Extension Api No:   220090626
libssh2 prefix? [autodetect] :

 
ここで処理がとまり入力が求められますが、[autodetect]とあるので、リターンを押して継続します。
 

building in /var/tmp/pear-build-rootIUEpQ4/ssh2-0.12
running: /var/tmp/ssh2/configure --with-ssh2
checking for grep that handles long lines and -e... /bin/grep
   :
   :
Build process completed successfully
Installing '/usr/lib64/php/modules/ssh2.so'
install ok: channel://pecl.php.net/ssh2-0.12
configuration option "php_ini" is not set to php.ini location
You should add "extension=ssh2.so" to php.ini

 
④phpの設定ファイルにssh2拡張をロードするように設定
 
ssh2拡張インストール時に
You should add “extension=ssh2.so” to php.ini
とコメントされているように、phpの設定ファイルに”extension=ssh2.so”を記述する必要があります。
 
私の環境では、/etc/php.iniに直接記述するのではなく、/etc/php.dディレクトリ内にモジュール名.iniをファイル名にしたファイル内に設定を記述してファイルをインクルードしているので、その方法を踏襲しました。
 

# cd /etc/php.d
# echo "extension=ssh2.so" > ssh2.ini

 
Apacheを再起動
# service httpd restart
 
2)WordPress管理画面でssh2拡張が利用できているか確認
 
ssh2拡張をインストールして有効になるとテーマインストールに表示されていた”接続情報”画面の”接続形式”に”SSH2″の項目が表示されるようになります。
 
表示されていない場合、インストールまたは設定がうまくできていないと思われます。
 
この画面上で下記項目を入力するとテーマのインストールを行う事ができます。
 
・ホスト名
 サーバーのドメイン名orIPアドレス:ポート番号
 (デフォルトの22番ポートの場合は省略可能)
・FTP/SSH ユーザー名
 SSHに使用するユーザー名。このユーザーで実行され、インストールしたファイルの所有者もこのユーザーになります。
・FTP/SSH パスワード
 認証キーを指定する場合は不要。
・公開鍵
 SSH公開鍵のフルパス
・秘密鍵
 SSH秘密鍵のフルパス
 
※”ユーザー名の公開鍵と秘密鍵が正しくありません”のエラーが発生する場合
 
Webサーバー実行ユーザー(apache)が認証キーファイルを参照できる状態になっていないのが原因のようです。
 
(エラーが発生した状況)
・ファイルのパス、所有者、権限
/home/winscp/.ssh/id_rsa.pub
/home/winscp/.ssh/id_rsa
所有者:ftpuser、権限:600
 
・.sshディレクトリの所有者、権限
所有者:ftpuser、権限:700
 
(修正方法)
下記サイトを参考にし、修正しました。
Wordpress SSH Upgrade Problem
http://serverfault.com/questions/182508/wordpress-ssh-upgrade-problem
 
①二つのキーファイルid_rsa、id_rsa.pubを”/usr/local”ディレクトリにコピー。
 
②二つのファイルの所有者をWebサーバー実行ユーザー(apache)に変更
chown apache id_rsa*
 
③二つのファイルのパーミッションを600にする
chmod 600 id_rsa*
 
3)wp-config.phpにSSH2接続情報を追加
 
$ cd /var/www/html/ワードプレスルートディレクトリ
$ vi wp-config.php

下記記述を追加します。
 
/** SSH2でファイル転送 */
define(‘FS_METHOD’, ‘ssh2’);
define(‘FTP_HOST’, ‘ドメイン名orIPアドレス:ポート番号’);
define(‘FTP_USER’, ‘ユーザー名’);
define(‘FTP_PUBKEY’, ‘/usr/local/id_rsa.pub’);
define(‘FTP_PRIKEY’, ‘/usr/local/id_rsa’);
 
 
以上の設定によって、テーマのインストール、プラグインの更新などが”接続情報”の画面が表示されずに実行できるようになりました。

関連記事の目次

コメントを残す

メールアドレスが公開されることはありません。 * が付いている欄は必須項目です