date コマンドで令和から紀元前まで

Windows元号関連で色々と話題なっているなか、Linuxではどうなっているか?

glibc をupdateすると、新元号にも対応するとの事で、前後の結果をメモしておく。

元号に対応前

$ LC_ALL=ja_JP.utf8 date +%EY -d 20190501
平成31

yum updateした後

# grep glibc /var/log/yum.log
Apr 13 08:08:41 Updated: glibc-common-2.17-260.el7_6.4.x86_64
Apr 13 08:08:43 Updated: glibc-2.17-260.el7_6.4.x86_64
Apr 13 08:09:21 Updated: glibc-headers-2.17-260.el7_6.4.x86_64
Apr 13 08:09:21 Updated: glibc-devel-2.17-260.el7_6.4.x86_64
Apr 13 08:09:30 Updated: glibc-2.17-260.el7_6.4.i686

元号に対応後

$ date +%EY -d 20190501
令和元年

おぉ、令和になった!


%EY オプションを使う事があまりないので、他の引数も試してみる。

$ date +%EY -d 00010101
西暦1

うっかり桁数を間違えたら、、、紀元前(´・ω・`)?

$ date +%EY -d 0001101
紀元前1

少し変えてみたら平成に。

$ date +%EY -d 000110
平成12

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

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