WordPress で PHPのバージョンに関する警告が出る、そしてデータベース接続確立エラー

WordPress 5.1 に更新したせいか、管理画面のダッシュボードでPHPのバージョンに関する警告が出るようになった。

f:id:savakan:20190316132118p:plain

!PHPの更新が必要です
サイトが安全ではいバージョンのPHPを実行していることを検出しました。

PHPとは何ですか?サイトにどう影響しますか?

PHPはWordPressの構築およびメンテナンスに使用されるプログラミング言語です。
新しいバージョンのPHPはより高速かつ安全であるため、更新することでサイトのパフォーマンスに良い影響を与えます。

PHPの更新についてさらに詳しく

公式としては、現行の動作要件は以下のようになっている。

wordpress.org


古いPHP(5.2.4)でも動作するが、前述のような警告が出た上に、WordPressが最低限の動作要件を引き上げるとなると、困るケースがありそう。

例えば、
 CentOS 6:PHP 5.3+MySQL 5.1
 CentOS 7:PHP 5.4+MariaDB 5.5
など、RHEL系で標準リポジトリを使っている場合。

Remiリポジトリへ切り替えたり、ソースからビルドしたPHPの環境が必要になる。


WordPress の動作要件の遷移については、調べた方がいるのでリンク。

blog.hinaloe.net



なお、PHP 7系となると、PHPの古いMySQL関数(mysql)が廃止されている。

従って、古いMySQL関数を使ったプラグインがあれば、動作しなくなる。

php.net



PHP Compatibility Checker」というプラグインで、各PHPバージョンにおけるプラグインの互換性を検証できるので、事前にチェックしておくと良い。



ソースからビルドしたPHP 7.x へ切り替えた際、環境によってはデータベース接続確立エラーが発生する。

f:id:savakan:20190316132415p:plain

データベース接続確立エラー

これは、wp-config.php ファイルのユーザー名とパスワードが正しくないか、あるいはlocalhostのデータベースサーバーに接続できないかのどちらかを意味します。
ホスティングサービスのデータベースサーバーがダウンしているかもしれません。
 ・ユーザー名とパスワードに間違いはありませんか?
 ・正しいホスト名を入力しましたか?
 ・データベースサーバーは稼働していますか?

こうした用途が何を意味しているのか分からない場合は、ホスティングサービスに連絡するべきでしょう。
助けが必要であれば、いつでもWordPressサポートフォーラムを訪れることができます。

wp-config.php にて、ユーザ名とパスワードを変更していないなら、データベースへの接続方法の指定に問題がある。

WordPressをDEBUGモード有効で動作させると、画面に次のようなメッセージが表示される。

Warning: mysqli_real_connect(): (HY000/2002): No such file or directory 
in /wordpress-path/wp-includes/wp-db.php on line 1612

No such file or directory

該当ファイルを見ると、、、

1611  if ( WP_DEBUG ) {
1612      mysqli_real_connect( $this->dbh, $host, $this->dbuser, $this->dbpassword, null, $port, $socket, $client_flags );
1613  } else {
1614      @mysqli_real_connect( $this->dbh, $host, $this->dbuser, $this->dbpassword, null, $port, $socket, $client_flags );
1615  }


「No such file or directory」というメッセージからは判断するに、ソケットファイルが見つからないものかもしれない。


回避方法として、2つ挙げておく。

回避方法1

接続ホスト名を localhost127.0.0.1 に変更する。

/** MySQL のホスト名 */
define( 'DB_HOST', 'localhost' );
 ↓
/** MySQL のホスト名 */
define( 'DB_HOST', '127.0.0.1' );

レンタルサーバでは、こちらの方法になると思われる。

回避方法2

php.ini の mysqli.default_socket にソケットのパスを設定する。

パスを調べるには、

# ps aux | grep mariadb
mysql     4984  0.0  0.7 1178220 31860 ?       Sl    204  33:13 /usr/libexec/mysqld --basedir=/usr --datadir=/var/lib/mysql --plugin-dir=/usr/lib64/mysql/plugin --log-error=/var/log/mariadb/mariadb.log --pid-file=/var/run/mariadb/mariadb.pid --socket=/var/lib/mysql/mysql.sock

など。

この場合、/var/lib/mysql/mysql.sock がソケットのパス。

php.ini へ設定を記載する。

mysqli.default_socket =
 ↓
mysqli.default_socket = /var/lib/mysql/mysql.sock

リモートデスクトップの「ローカル セキュリティ機関にアクセスできません」が2月の月例パッチで修正された

先月書いた以下の件の続き。

shobon.hatenablog.com

2月の月例パッチを適用したら、解決しました。

パッチ適用後は、再起動が必要。

CentOS 7 で PHP 7.2 を OpenLDAP 付きで configure/make するとエラーになる

【環境】

$ cat /etc/redhat-release
CentOS Linux release 7.6.1810 (Core)

$ rpm -qa | grep openldap
openldap-clients-2.4.44-20.el7.x86_64
openldap-devel-2.4.44-20.el7.x86_64
openldap-2.4.44-20.el7.x86_64

以下のようなオプションで、PHP 7.2 をconfigureすると、LDAPのところでエラーになる。

# ./configure \
--prefix=/usr/local/lib/php-7.2 \
--with-ldap \
・
・省略
・
checking size of long int... (cached) 8
configure: error: Cannot find ldap libraries in /usr/lib.


OpenLDAPのライブラリが入っているはずだが、状況を確認。

# ls -l /usr/lib64/libldap*
lrwxrwxrwx 1 root root     21 124 08:31 /usr/lib64/libldap-2.4.so.2 -> libldap-2.4.so.2.10.7
-rwxr-xr-x 1 root root 352624 1031 08:15 /usr/lib64/libldap-2.4.so.2.10.7
lrwxrwxrwx 1 root root     21 1216 14:43 /usr/lib64/libldap.so -> libldap-2.4.so.2.10.7
lrwxrwxrwx 1 root root     23 124 08:31 /usr/lib64/libldap_r-2.4.so.2 -> libldap_r-2.4.so.2.10.7
-rwxr-xr-x 1 root root 381440 1031 08:15 /usr/lib64/libldap_r-2.4.so.2.10.7
lrwxrwxrwx 1 root root     23 1216 14:43 /usr/lib64/libldap_r.so -> libldap_r-2.4.so.2.10.7


64bit用パッケージしか入っていないので、/usr/lib/ 以下には、libldap* のファイルは無い。
configure で /usr/lib 以下にライブラリを探しに行っているところを見ると、32bit用のパッケージがあれば良いのかもしれない。

# yum install openldap-devel.i686

でインストールしようとすると、他にも依存関係のあるパッケージが大量にリストアップされる。
この方法は危険な匂いがするので中止。



/usr/lib/libldap.so と /usr/lib/libldap_r.so を探しに行っていると思われるので、次のように /usr/lib 以下から /usr/lib64 のファイルへシンボリックリンクを作成。

# ln -s /usr/lib64/libldap.so /usr/lib/libldap.so
# ln -s /usr/lib64/libldap_r.so /usr/lib/libldap_r.so


確認

# ls -l /usr/lib/libldap*
lrwxrwxrwx 1 root root 21 1216 14:53 /usr/lib/libldap.so -> /usr/lib64/libldap.so
lrwxrwxrwx 1 root root 23 1216 14:53 /usr/lib/libldap_r.so -> /usr/lib64/libldap_r.so


再びconfigureしてみると、問題は回避される。

# ./configure \
--prefix=/usr/local/lib/php-7.2 \
--with-ldap \
・
・省略
・
Thank you for using PHP.

次に、make でも別なエラーに遭遇する。

# make
・
・省略
・
/usr/bin/ld: ext/ldap/.libs/ldap.o: undefined reference to symbol 
'ber_scanf'
/usr/lib64/liblber-2.4.so.2: error adding symbols: DSO missing from 
command line
collect2: error: ld returned 1 exit status
make: *** [sapi/cli/php] エラー 1


ber_scanf というシンボルが見えない事が原因というメッセージなので、これをネットで検索すると、man page が出る。
https://linux.die.net/man/3/ber_scanf

これによると、このシンボルは、
 OpenLDAP LBER (liblber, -llber)
に含まれるらしい。
liblber.so のこと。

configure 前に LDFLAGS で liblber.so を参照するように指定して、やり直し。

# export LDFLAGS=-llber
# configure 
・
・省略
・
# make

これで make できるようになった。

wkhtmltoimage/wkhtmltopdf コマンドで UserAgent を指定する

タイトルの通り、wkhtmltoimage/wkhtmltopdf コマンドで UserAgent を指定したくなったでのメモ。


【環境】
CentOS 6.x
wkhtmltoimage 0.12.5


デフォルトでは、wkhtmlto* コマンドでアクセスしたWebサーバのログに、以下のようなUserAgentが残った。

"Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/534.34 (KHTML, like Gecko) wkhtmltoimage Safari/534.34"

wkhtmltoimage と表示されるのが嫌なら、任意のUserAgentを指定できる。

コマンドのオプションに、

 --custom-header 
 --custom-header-propagation

の両方を指定する。

両方指定しないと、適用されない。

    • custom-header の書式で、HTTPヘッダを追加できる。


例)

wkhtmltoimage \
  --custom-header "User-Agent" "${USER_AGENT}" \
  --custom-header-propagation \
  ${URL} \
  ${OURPUT_FILE}

${...} は、シェルの変数。

なお、wkhtmltopdf コマンドでも同様。


wkhtmltoimage/wkhtmltopdf コマンドの基本的な使い方は、2014年に書いてた。

shobon.hatenablog.com

2019年1月のWindowsUpdate後、Windows7へのリモートデスクトップに失敗する

【環境】
リモートホスト側:Windows 7 Pro SP1
クライアント側:Windows 10 Pro 1809


リモートホスト側とクライアント側の両方に対して、2019年1月のロールパッチを適用したら、Windows7リモートデスクトップに失敗する(繋がらない)ようになった。

エラーメッセージは以下の通り。

f:id:savakan:20190110202122p:plain

認証エラーが発生しました
ローカル セキュリティ機関にアクセスできません


リモートホスト側のリモートデスクトップ接続のオプションを見直して、セキュリティレベルを低くすると、接続できるようになった。(根本的な解決法ではない)

f:id:savakan:20190110202146p:plain

再びセキュリティレベルを高い設定に直すと、やはり接続に失敗する。

リモートホスト側とクライアント側の片方だけWindowsUpdate未更新の状態で検証できないので、どちらに原因があるかは不明。

これは困った(´・ω・`)


【2019.1.11 追記】

ニュースにもあったので貼っておく。
forest.watch.impress.co.jp

MSのBlog
2019 年 1 月 8 日の更新プログラムを適用すると、ファイル サーバーへの通信やリモート デスクトップ接続が不可能となる – Ask the Network & AD Support Team


【2019.2.14 追記】
2月の月例パッチで修正されました。
shobon.hatenablog.com

改竄検知システム(AIDE)の導入と設定

AIDE は、ホスト型の侵入検知システムであり、ファイルの改竄を検知することができる。

公式サイト
AIDE - Advanced Intrusion Detection Environment

公式サイトによると、Advanced Intrusion Detection Environment の略らしい。
読み方は、「エイド」なのか「アイーデ」なのか不明。


【環境】
CentOS 7

CentOS 6でも、同等の手順で導入、設定できる。

導入

CentOS 6/7 なら、yum でインストールできる。

# yum install aide

インストールされるものは以下。

# rpm -ql aide
/etc/aide.conf
/etc/logrotate.d/aide
/usr/sbin/aide
/usr/share/doc/aide-0.15.1
/usr/share/doc/aide-0.15.1/AUTHORS
/usr/share/doc/aide-0.15.1/COPYING
/usr/share/doc/aide-0.15.1/ChangeLog
/usr/share/doc/aide-0.15.1/NEWS
/usr/share/doc/aide-0.15.1/README
/usr/share/doc/aide-0.15.1/README.quickstart
/usr/share/doc/aide-0.15.1/contrib
/usr/share/doc/aide-0.15.1/contrib/aide-attributes.sh
/usr/share/doc/aide-0.15.1/contrib/bzip2.sh
/usr/share/doc/aide-0.15.1/contrib/gpg2_check.sh
/usr/share/doc/aide-0.15.1/contrib/gpg2_update.sh
/usr/share/doc/aide-0.15.1/contrib/gpg_check.sh
/usr/share/doc/aide-0.15.1/contrib/gpg_update.sh
/usr/share/doc/aide-0.15.1/contrib/sshaide.sh
/usr/share/doc/aide-0.15.1/manual.html
/usr/share/man/man1/aide.1.gz
/usr/share/man/man5/aide.conf.5.gz
/var/lib/aide
/var/log/aide

設定

設定ファイルは、/etc/aide.conf である。

最初の方に、参照するデータベースやレポートの出力先などの定義がある。

@@define DBDIR /var/lib/aide
@@define LOGDIR /var/log/aide

# The location of the database to be read.
database=file:@@{DBDIR}/aide.db.gz

# The location of the database to be written.
#database_out=sql:host:port:database:login_name:passwd:table
#database_out=file:aide.db.new
database_out=file:@@{DBDIR}/aide.db.new.gz

# Whether to gzip the output to database.
gzip_dbout=yes

# Default.
verbose=5

report_url=file:@@{LOGDIR}/aide.log
report_url=stdout
#report_url=stderr
#NOT IMPLEMENTED report_url=mailto:root@foo.com
#NOT IMPLEMENTED report_url=syslog:LOG_AUTH


デフォルトでは、次のようになっている。

データベース:/var/lib/aide/aide.db.gz
新しく書き込むデータベース:/var/lib/aide/aide.db.new.gz
ログファイル:/var/log/aide/aide.log

「NOT IMPLEMENTED」とあるが、メールやsyslogへ出力する機能を予定しているのかもしれない。
(AIDE の最終更新が2016年だけど・・・)


設定ファイルでは、監視対象と除外のディレクトリ/ファイルを列挙する。
例えば、デフォルトでは、下記のディレクトリが監視対象になっている。

/boot   NORMAL
/bin    NORMAL
/sbin   NORMAL
/lib    NORMAL
/lib64  NORMAL
/opt    NORMAL
/usr    NORMAL
/root   NORMAL

デフォルトでは、下記のディレクトリが監視対象から除外されている。
(先頭に ! を付けると除外になる)

# These are too volatile
!/usr/src
!/usr/tmp


「NORMAL」は、検査ルールであり、設定ファイルのコメントに記載がある。
<ルールの一覧>

# These are the default rules.
#
#p:      permissions
#i:      inode:
#n:      number of links
#u:      user
#g:      group
#s:      size
#b:      block count
#m:      mtime
#a:      atime
#c:      ctime
#S:      check for growing size
#acl:           Access Control Lists
#selinux        SELinux security context
#xattrs:        Extended file attributes
#md5:    md5 checksum
#sha1:   sha1 checksum
#sha256:        sha256 checksum
#sha512:        sha512 checksum
#rmd160: rmd160 checksum
#tiger:  tiger checksum

#haval:  haval checksum (MHASH only)
#gost:   gost checksum (MHASH only)
#crc32:  crc32 checksum (MHASH only)
#whirlpool:     whirlpool checksum (MHASH only)

FIPSR = p+i+n+u+g+s+m+c+acl+selinux+xattrs+sha256

#R:             p+i+n+u+g+s+m+c+acl+selinux+xattrs+md5
#L:             p+i+n+u+g+acl+selinux+xattrs
#E:             Empty group
#>:             Growing logfile p+u+g+i+n+S+acl+selinux+xattrs

# You can create custom rules like this.
# With MHASH...
# ALLXTRAHASHES = sha1+rmd160+sha256+sha512+whirlpool+tiger+haval+gost+crc32
ALLXTRAHASHES = sha1+rmd160+sha256+sha512+tiger
# Everything but access time (Ie. all changes)
EVERYTHING = R+ALLXTRAHASHES

# Sane, with multiple hashes
# NORMAL = R+rmd160+sha256+whirlpool
NORMAL = FIPSR+sha512

# For directories, don't bother doing hashes
DIR = p+i+n+u+g+acl+selinux+xattrs

# Access control only
PERMS = p+i+u+g+acl+selinux

# Logfile are special, in that they often change
LOG = >

# Just do sha256 and sha512 hashes
LSPP = FIPSR+sha512

# Some files get updated automatically, so the inode/ctime/mtime change
# but we want to know when the data inside them changes
DATAONLY =  p+n+u+g+s+acl+selinux+xattrs+sha256


上記によると、
 FIPSR = p+i+n+u+g+s+m+c+acl+selinux+xattrs+sha256
 NORMAL = FIPSR+sha512
である。
それぞれの識別子の意味は、以下の通り。

p:パーミッション
i:i-node番号
n:対象のファイルを指すリンク数
u:所有者
g:グループ
s:サイズ
m:修正日時
c:アクセス日時
acl:アクセスコントロール
selinuxSELinuxセキュリティ・コンテキスト
xattrs:拡張ファイル属性
sha256:チェックサム
sha512:チェックサム



例えば、/var/log/lastlog ファイルは、デフォルトで LSPP がセットされているが、これではユーザがログインする度に変更が発生する。
パーミッションだけチェックするように変更するには、次のようにする。

/var/log/lastlog LSPP
 ↓
/var/log/lastlog PERMS

使い方

最初に、データベースの初期化を以下のコマンドで行う。

# aide -i

AIDE, version 0.15.1

### AIDE database at /var/lib/aide/aide.db.new.gz initialized.


表示される通り、DBは「aide.db.new.gz」として作成される。
実際にAIDEによる検査を行う際は、ここで作成した新しい定義を参照する用のファイルへコピーする必要がある。

データベースのファイル名は設定ファイルに定義があるが、デフォルトでは次のように上書きする。

# cp /var/lib/aide/aide.db.new.gz /var/lib/aide/aide.db.gz

検査

以下のコマンドで行う。

# aide -C

AIDE, version 0.15.1

### All files match AIDE database. Looks okay!


試しに、「/bin/aide-dummy」というダミーファイルを作成し、AIDEに検出させてみる。

# touch /bin/aide-dummy
# aide -C
AIDE 0.15.1 found differences between database and filesystem!!
Start timestamp: 2018-11-03 13:23:39

Summary:
  Total number of files:        68462
  Added files:                  1
  Removed files:                0
  Changed files:                1


---------------------------------------------------
Added files:
---------------------------------------------------

added: /usr/bin/aide-dummy

---------------------------------------------------
Changed files:
---------------------------------------------------

changed: /usr/bin

---------------------------------------------------
Detailed information about changes:
---------------------------------------------------


Directory: /usr/bin
 Mtime    : 2018-11-03 08:35:57              , 2018-11-03 13:23:37
 Ctime    : 2018-11-03 08:35:57              , 2018-11-03 13:23:37


チェック結果はコマンドの戻り値でも確認できる。

変更がある場合

# echo $?
5

変更が無い場合

# echo $?
0


結果は、/var/log/aide/aide.log にも出力されるが、追記ではなく上書きされる模様。
CentOS 7.x/AIDE Ver-0.15.1 の場合)

また、/etc/logrotate.d/aide にはログローテーションの設定があるが、ログファイルは追記ではなく上書きなので、デフォルトのままではローテーションされにくい。
必要に応じて、daily などを設定して、ローテーションすると良い。

データベースの更新

セキュリティパッチを適用した後などは、AIDE のデータベースを更新する必要がある。

更新は、以下のコマンドで行う。

# aide -u
# cp /var/lib/aide/aide.db.new.gz /var/lib/aide/aide.db.gz


実際の運用では、
 ・定期的にAIDEによる改竄チェックを実行
 ・セキュリティパッチ適用前には、改竄チェックを行い、異常が無い事を確認後に適用する
 ・セキュリティパッチ適用後には、AIDE のデータベースを更新
のようになると思われる。

定期的にAIDE でチェックを行うには、シェルスクリプトをcronなどで実行する方法が考えられる。


簡単なチェックスクリプトの例(変更があった場合のみ、root へメールする。AIDE のデータベースを更新するまで通知し続ける)

#!/bin/bash

MAIL_TO="root"
MAIL_SUBJECT="AIDE detected warning"
MAIL_TEXT=`mktemp /tmp/temp.XXXXXX`

aide -C > $MAIL_TEXT

if [ $? -gt 0 ]; then
  mail -s "$MAIL_SUBJECT" $MAIL_TO < $MAIL_TEXT
fi

rm -rf $MAIL_TEXT

参考

RHEL セキュリティ: ファイル監視による侵入検知 AIDE
http://aikotobaha.blogspot.jp/2011/11/rhel-aide.html

OpenSUSE - 第12章 AIDE を利用した侵入検知
http://manual.geeko.cpon.org/ja/cha.aide.html

CIFSマウント時の SMB バージョンのデフォルトが 1.0 ではなくなった

【環境】
CentOS Linux release 7.6.1810 (Core)
kernel-3.10.0-957.1.3.el7.x86_64
util-linux-2.23.2-59.el7.x86_64


CentOS 7.5 → 7.6 へ更新したら、CentOS からNASをCIFSマウントできなくなった。

/var/log/messages へ次のようなエラーが出力される。

Dec  8 08:22:16 host_name kernel: No dialect specified on mount. Default has changed to a more secure dialect, SMB2.1 or later (e.g. SMB3), from CIFS (SMB1). To use the less secure SMB1 dialect to access old servers which do not support SMB3 (or SMB2.1) specify vers=1.0 on mount.

バージョンが上がった事で、SMB接続する際のデフォルトバージョンが1.0→2.1 になったらしい。

どのパッケージが影響したか分からない。
 ・カーネル(cifs.ko.xz?)
 ・util-linux(mountコマンドが入っている)
あたり?


SMB1.0で接続したければ、マウント時に vers=1.0 オプションを指定しろとの事。

autofs でマウントする場合も同様に、このオプションの指定がなければマウントエラーになる。

マウントするNASが古いなどで、SMB 1.0にしか対応していない場合は、このオプションが必要。

手元のNASLinuxベース)も古いので、「ついに使えなくなったか!?」と一瞬焦った。