CentOS6 にMariaDB をインストール

CentOS 6.9/MySQL5.1 で動いているシステムを CentOS6.9/MariaDB 10.2 での動作検証を行うため、VMware 上でゲストOSとしてCentOS6.9 用意、MySQL はインストールせず、MariaDB をリポジトリでインストールします。

1. MariaDB のリポジトリ生成
こちらのサイトから「Downloads Setting up MariaDB Repositories」から以下の3ステップでリポジトリの内容が生成されます。

1. Choose a Distro
  => CentOS
2. Choose a Release
  -> CentOS 6 (x86_64)
3. Choose a Version
  -> 10.2 [Stable]

# MariaDB 10.2 CentOS repository list - created 2017-09-18 08:06 UTC
# http://downloads.mariadb.org/mariadb/repositories/
[mariadb]
name = MariaDB
baseurl = http://yum.mariadb.org/10.2/centos6-amd64
gpgkey=https://yum.mariadb.org/RPM-GPG-KEY-MariaDB
gpgcheck=1

上記内容を /etc/yum.repos.d/MariaDB.repo というファイル名で保存します。

2. MariaDB のインストール
yum コマンドでインストール出来ます。

# yum install MariaDB-client MariaDB-server
# mysql -V
mysql Ver 15.1 Distrib 10.2.8-MariaDB, for Linux (x86_64) using readline 5.1

以上です。

Composer – PHP 依存関係管理

Composerは、PHPの依存性管理のためのツールです。プロジェクトが依存するライブラリを管理することができます。ライブラリの管理をプロジェクトごと行うことができるので、システム全体に影響することなく利用できます。

Composer のシステム要件は PHP 5.3.2以上ですが、PHP 5.3.4 以上を推奨しています。古いバージョンではエッジケースがあるかもしれないと注意事項があります。

1. インストール

Composer の公式ページのダウンロードのやり方を紹介します。

php -r "copy('https://getcomposer.org/installer', 'composer-setup.php');"
php -r "if (hash_file('SHA384', 'composer-setup.php') === 'e115a8dc7871f15d853148a7fbac7da27d6c0030b848d9b3dc09e2a0388afed865e6a3d6b3c0fad45c48e2b5fc1196ae') { echo 'Installer verified'; } else { echo 'Installer corrupt'; unlink('composer-setup.php'); } echo PHP_EOL;"
php composer-setup.php --install-dir=/usr/local/bin --filename=composer
php -r "unlink('composer-setup.php');"

インストールを確認してみます。

# which composer
/usr/local/bin/composer

これで composer がコマンドラインから使えるようになりました。

2. パッケージリスト

composer で利用できるパッケージは何があるのしょうか?
https://packagist.org/explore/ で確認できます。

私は ocr 関連のライブラリが必要なので “ocr” で検索しみるとたくさんできてきました。
今回は、”thiagoalessio/tesseract_ocr” を利用してみます。

3. パッケージのインストール

パッケージのインストールには、”composer.json” というファイルに依存関係を記述してインストールフォルダに配置する必要があります。(https://packagist.org/ 参照)

今回利用する “thiagoalessio/tesseract_ocr” に composer.json の依存関係の記述があります。バージョンを “1.0.0-RC” から “0.2.1” に変更して使用します。
(追記:実は後でわかったことですが、1.0.0-RC のtesseract_ocr をインストールすると PHP 5.3.3 では文法エラーになる構文が使われています。)

# vi /project/lib/composer.json
--- 以下の内容を記述して保存 ---
{
    "require": {
        "thiagoalessio/tesseract_ocr": "0.2.1"
    }
}

そして、次に以下のコマンドを実行します。

# composer install
Your version of PHP, 5.3.3, is affected by CVE-2013-6420 and cannot safely perform certificate validation, we strongly suggest you upgrade.
You are running composer with xdebug enabled. This has a major impact on runtime performance. See https://getcomposer.org/xdebug
Loading composer repositories with package information
Updating dependencies (including require-dev)
  - Installing thiagoalessio/tesseract_ocr (0.2.1)
    Downloading: 100%         

Writing lock file
Generating autoload files

「使用しているPHPのバージョンが 5.3.3 なのでCVE-2013-6420の影響があるので安全に証明書の確認ができないためアップグレードすることを強くお勧めします。」と注意されました。さっそくエッジケースに出くわしましたね。
取り急ぎ、影響ないので無視します。
(追記:xdebug を有効にして composer を実行しています。。。という注意は /etc/php.d/xdebug.ini の zend_extension=/usr/lib64/php/modules/xdebug.so の行頭に ; セミコロンを付けてコメントアウトすると xdebug が無効になります。)

インストールフォルダをみると以下のファイルとフォルダが出来ています。

composer.json
composer.lock
vendor
 - autoload.php

これがあればインストールは成功です。

5. PHPからパッケージの利用

インストールした “tesseract_ocr” は TesseractOCR のラッパーライブラリなので TesseractOCR をインストールします。

# yum install tesseract

https://packagist.org/packages/thiagoalessio/tesseract_ocr を参考にして画像をOCRしてみます。
画像はこちらを使用させていただきます。

# vi test.php
--- 以下の内容を記述して保存 ---
<?php
include "lib/vendor/autoload.php";

$tocr = new TesseractOCR("./text.jpeg");
$tocr-<setLanguage("eng");
$text = $tocr->recognize();

cho "Output ==>".PHP_EOL;
echo $text;
?>

さっそく実行してみます。

# php test.php
Tesseract Open Source OCR Engine v3.04.00 with Leptonica
Output ==>
The quick brown fox
jumps over the lazy
dog,

しっかり認識できています!

以上です。

CentOS FTP ログインでユーザーをルートフォルダに限定

エンドユーザーからファイルをFTPで受け取ってシステムに取り込む際、エンドユーザーには指定のフォルダ以外を見られたくないときの vsftp の設定。

1. vsftpd ユーザーのホームディレクトリの設定

まずは、ログインユーザーがログインした際のホームディレクトリを指定します。
ユーザー別の config ファイルを作成します。

ここでは、ユーザーを foo 、ユーザーのルートフォルダを /var/ftp_upload とします。フォルダの権限設定などはしてあるものとします。

# mkdir /etc/vsftpd/user_conf
# vi /etc/vsftpd/user_conf/foo
--- 以下の内容を入力します ---
local_root=/var/ftp_upload

以下のように user_config_dir の設定を変えて保存します。

# vi /etc/vsftpd/vsftpd.conf
--- 以下の内容を入力します ---
# User config dir
user_config_dir=/etc/vsftpd/user_conf

2. フォルダの移動させない (chrootさせない)

chroot_local_user が YES の場合、chroot_list は chroot させないユーザーのリストになります。ユーザーがフォルダを移動できないように、chroot_list を有効にして、ユーザーをリストに追加して、chroot_local_user を YES にします。

# vi /etc/vsftpd/vsftpd.conf
--- 以下の内容を入力します ---
chroot_local_user=YES
chroot_list_enable=YES
chroot_list_file=/etc/vsftpd/chroot_list

ユーザー ‘foo’ を /etc/vsftpd/chroot_list に追加します。

# vi /etc/vsftpd/chroot_list
--- 以下の内容を入力します ---
foo

3. vsftpd 再起動

# service vsftpd restart

以上です。

xargs で指定したコマンドに引数を渡す場合の工夫

xargsは標準入力を読み込み、それを引数として指定したコマンドを実行することができます。

例えば、以下のシェルスクリプトを実行すると指定したディレクトリにある更新日時が3日前のファイルを削除することができます。

$ find /tmp -mtime +3 -type f | xargs rm 

ところが find でファイルが見つからなかった場合、 rm のオペランドが不足ということになります。

rm: missing operand
Try `rm --help' for more information.

そこで、xargs に –no-run-if-empty というオプションを指定し実行することで、ファイルがない場合の対処ができます。

$ find /tmp -mtime +3 -type f | xargs --no-run-if-empty rm

以上です。

Fail2ban で不正アクセス防止 (asterisk 編パート2)

前回の投稿でfai2banで不正アクセス対策をした後にも、しつこくアクセス元を変えたり、以下のように fail2ban のフィルターに検出されないような手段でアクセスを試みている様子。

Failed to authenticate device 111<sip:111@NNN.NN.NNN.NNN>;tag=649747a9

voip-info.jpSIP-Fail2ban の投稿記事を参考に SIP のブルートフォース攻撃を抑止するパッチを Asterisk 13.8.2 用に作成し、適用しました。

chan_sip.c の修正パッチ:

--- chan_sip.c.20160512 2016-05-12 10:55:25.221687414 +0900
+++ chan_sip.c  2016-05-12 11:09:13.753796299 +0900
@@ -19347,7 +19347,7 @@
                        return;
                }
                if (res < 0) { /* Something failed in authentication */
-                       ast_log(LOG_NOTICE, "Failed to authenticate device %s\n", sip_get_header(req, "From"));
+                       ast_log(LOG_NOTICE, "Failed to authenticate device %s (%s)\n", sip_get_header(req, "From"), ast_sockaddr_stringify(addr));
                        transmit_response(p, "403 Forbidden", req);
                        sip_scheddestroy(p, DEFAULT_TRANS_TIMEOUT);
                        return;
@@ -25340,7 +25340,7 @@
                        return 0;
                }
                if (res < 0) { /* Something failed in authentication */
-                       ast_log(LOG_NOTICE, "Failed to authenticate device %s\n", sip_get_header(req, "From"));
+                       ast_log(LOG_NOTICE, "Failed to authenticate device %s (%s)\n", sip_get_header(req, "From"), ast_sockaddr_stringify(addr));
                        transmit_response(p, "403 Forbidden", req);
                        sip_scheddestroy(p, DEFAULT_TRANS_TIMEOUT);
                        return 0;
@@ -26122,7 +26122,7 @@
                        goto request_invite_cleanup;
                }
                if (res < 0) { /* Something failed in authentication */
-                       ast_log(LOG_NOTICE, "Failed to authenticate device %s\n", sip_get_header(req, "From"));
+                       ast_log(LOG_NOTICE, "Failed to authenticate device %s (%s)\n", sip_get_header(req, "From"), ast_sockaddr_stringify(addr));
                        transmit_response_reliable(p, "403 Forbidden", req);
                        p->invitestate = INV_COMPLETED;
                        sip_scheddestroy(p, DEFAULT_TRANS_TIMEOUT);
@@ -27842,7 +27842,7 @@
                p->lastinvite = seqno;
                return 0;
        } else if (auth_result < 0) {
-               ast_log(LOG_NOTICE, "Failed to authenticate device %s\n", sip_get_header(req, "From"));
+               ast_log(LOG_NOTICE, "Failed to authenticate device %s (%s)\n", sip_get_header(req, "From"), ast_sockaddr_stringify(addr));
                transmit_response(p, "403 Forbidden", req);
                sip_scheddestroy(p, DEFAULT_TRANS_TIMEOUT);
                ast_string_field_set(p, theirtag, NULL);

上記の変更を行い再ビルドした Asterisk を再起動してログを確認。パッチ適用後のログのように行末へ不正アクセス元のIPアドレスが表示されるようになりました。
※NNN.NN.NNN.NNN はサーバーのIPアドレス

パッチ適用前:

[2016-05-12 11:13:24] NOTICE[30781][C-0000002a]: chan_sip.c:26125 handle_request_invite: Failed to authenticate device 111<sip:111@NNN.NN.NNN.NNN>;tag=649747a9
[2016-05-12 11:13:26] NOTICE[30781][C-0000002b]: chan_sip.c:26125 handle_request_invite: Failed to authenticate device 111<sip:111@NNN.NN.NNN.NNN>;tag=f39f5f63
[2016-05-12 11:13:27] NOTICE[30781][C-0000002c]: chan_sip.c:26125 handle_request_invite: Failed to authenticate device 111<sip:111@NNN.NN.NNN.NNN>;tag=8e066fe2
[2016-05-12 11:13:28] NOTICE[30781][C-0000002d]: chan_sip.c:26125 handle_request_invite: Failed to authenticate device 111<sip:111@NNN.NN.NNN.NNN>;tag=6af3aa52

パッチ適用後:

[2016-05-12 11:21:07] NOTICE[8958][C-00000000]: chan_sip.c:26125 handle_request_invite: Failed to authenticate device 333<sip:333@NNN.NN.NNN.NNN>;tag=1b248211 (xxx.42.218.186:5076)                               
[2016-05-12 11:21:08] NOTICE[8958][C-00000001]: chan_sip.c:26125 handle_request_invite: Failed to authenticate device 333<sip:333@NNN.NN.NNN.NNN>;tag=4323ab38 (xxx.42.218.186:5074)                               
[2016-05-12 11:21:09] NOTICE[8958][C-00000002]: chan_sip.c:26125 handle_request_invite: Failed to authenticate device 333<sip:333@NNN.NN.NNN.NNN>;tag=ba356309 (xxx.42.218.186:5082)                               
[2016-05-12 11:21:11] NOTICE[8958][C-00000003]: chan_sip.c:26125 handle_request_invite: Failed to authenticate device 333<sip:333@NNN.NN.NNN.NNN>;tag=7e32110c (xxx.42.218.186:5076)    

voip-info.jp の投稿記事にありますように、Fail2ban のフィルターに以下のルールを適用すればこの手の不正アクセスを抑止することができるようになります。

NOTICE.* .*: Failed to authenticate user .* \(<HOST>:.*\)