Subversion リポジトリのバックアップとレストア

CentOS 上でのSVN(Subversion)リポジトリを新しいサーバに移動する必要があったのでその簡単な方法の備忘録です。
手順は現行サーバーのリポジトリをバックアップ(dump)して、それを新サーバーでレストア(load)するだけです。

1. リポジトリのバックアップ

# svnadmin dump /var/www/svn/projects > projects.dump

2. リポジトリのレストア
※ レストアの前に、こちらの手順で予めサブバージョンのインストールとレポジトリを作成しておきます。

# svnadmin load /var/www/svn/projects < projects.dump

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

以上です。

PHP で複数ページのTIFFファイルをJPGに変換

ひとつのファイルに複数のページを格納したTIFFフォーマットの画像ファイルをそれぞれのページごとにJPGファイルとして保存する方法をPHPで実現します。

$path = "./src/foo.tif";
$dest = "./dst/";
$type = "jpg";

# ファイル名の取得
$extract = pathinfo($path);
$file = $extract['filename'];

# TIFF画像ファイルを読み込み
$images = new Imagick($path);

foreach($images as $i => $image) {
    $n = $i + 1;
    $image->writeImage("{$dest}{$file}_page{$n}.{$type}");
}
$images->clear(); 

例:

ソースファイル: foo.tif
出力ファイル: foo_page1.jpg  foo_page2.jpg foo_page3.jpg

以上です。

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 編)

オープンソースIP-PBX Asterisk サーバーを外部公開サーバーへ入れてデモ環境を整えました。外部からの攻撃を抑止するために Fail2ban で対策をしました。

参考サイト:
http://www.voip-info.org/wiki/view/Fail2Ban+%28with+iptables%29+And+Asterisk
http://www.fail2ban.org/wiki/index.php/Asterisk

Fail2ban はCentOS 6.7 + EPEL リポジトリから yum でインストールします。

1. Fail2ban のインストール

# yum install fail2ban

2. jail.conf の変更

jail.conf をエディターで開いて、以下の設定を追加します。

# cd /etc/fail2ban
# vi jail.conf

-- ここから --
[asterisk-iptables]

enabled  = true
filter   = asterisk
action   = iptables-allports[name=ASTERISK, protocol=all]
           sendmail-whois[name=asterisk, dest=root, sender=fail2ban]
logpath  = /var/log/asterisk/messages
maxretry = 4
findtime = 21600
bantime = 86400
-- ここまで --

3. asterisk.conf (フィルター) の変更

fail2ban をインストールすると、/etc/fail2ban/filter.d/ の下にフィルターが用意されています。 asterisk.conf もありますので、これをバックアップしておいて、あらたにフィルターを作成します。

# cd /etc/fail2ban/filter.d/
# mv asterisk.conf asterisk.conf.bak

エディターで asterisk.conf を開いて以下の内容を入力します。

# vi asterisk.conf

-- ここから --
# Fail2Ban configuration file

[INCLUDES]
# Read common prefixes. If any customizations available -- read them from
# common.local
before = common.conf

[Definition]
#_daemon = asterisk
# Option:  failregex
# Notes.:  regex to match the password failures messages in the logfile. The
#          host must be matched by a group named 'host'. The tag '' can
#          be used for standard IP/hostname matching and is only an alias for
#          (?:::f{4,6}:)?(?P\S+)
# Values:  TEXT
#
failregex = NOTICE.* .*: Registration from '.*' failed for ':.*' - Wrong password
            NOTICE.* .*: Registration from '.*' failed for ':.*' - No matching peer found
            NOTICE.* .*: Registration from '.*' failed for ':.*' - No matching peer found
            NOTICE.* .*: Registration from '.*' failed for ':.*' - Username/auth name mismatch
            NOTICE.* .*: Registration from '.*' failed for ':.*' - Device does not match ACL
            NOTICE.* .*: Registration from '.*' failed for ':.*' - Peer is not supposed to register
            NOTICE.* .*: Registration from '.*' failed for ':.*' - ACL error (permit/deny)
            NOTICE.* .*: Registration from '.*' failed for ':.*' - Device does not match ACL
            NOTICE.* .*: Registration from '\".*\".*' failed for ':.*' - No matching peer found
            NOTICE.* .*: Registration from '\".*\".*' failed for ':.*' - Wrong password
            NOTICE.*  failed to authenticate as '.*'$
            NOTICE.* .*: No registration for peer '.*' \(from \)
            NOTICE.* .*: Host  failed MD5 authentication for '.*' (.*)
            NOTICE.* .*: Failed to authenticate user .*@.*
            NOTICE.* .*:  failed to authenticate as '.*'
            NOTICE.* .*:  tried  to authenticate with nonexistent user '.*'
            VERBOSE.*SIP/-.*Received incoming SIP connection from unknown peer

# Option:  ignoreregex
# Notes.:  regex to ignore. If this regex matches, the line is ignored.
# Values:  TEXT
ignoreregex=
-- ここまで --

入力ができたら保存します。

4. Fail2ban 起動

# service fail2ban start
# chkconfig fail2ban on

5. 確認

iptables で確認すると以下のように Ban 状況がわかります。

# iptables -L -v
...
-- 省略 --
Chain f2b-ASTERISK (1 references)
 pkts bytes target     prot opt in     out     source               destination         
    0     0 REJECT     all  --  any    any     xxx.75-143-13.dyn.dsl.cantv.net  anywhere            reject-with icmp-port-unreachable 

以上です。