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

オープンソース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 

以上です。

Subversion でソースコード管理

仕事でもプライベートでもプログラムを書いているとソースコードの版(バージョン)をフォルダで分けたりしている。前々からソースコード管理ツールを使えばいいんだよなと気にはなっていたものの手軽さからフォルダごとコピーして日付を振ったりしていました。今日は少し時間がとれたので Subversion サーバーを CentOS 6.5 にインストールしました。

subversion と dav_svn を組み合わせれば、http サーバーを利用して subversion のリポジトリにアクセスが出来るようになり、Windows から TortoiseSVN や AnkhSVN を利用して Windows Explorer や Visual Studio から利用出来るので便利です。

インストール手順:

CentOS 6.5:

———————————————

1. subversion のインストール
# yum install subversion
# yum install mod_dav_svn
2. ソースコード管理用のリポジトリの作成

ここでは、projects というリポジトリを作成します。

# mkdir /var/www/svn
# cd /var/www/svn
# svnadmin create projects
# chown -R apache.apache projects
# chcon -R -t httpd_sys_content_t projects
3. /etc/httpd/conf.d/subversion.conf の編集

subversion.conf が /etc/httpd/conf.d に作成されているので以下の内容を作成。(コメントアウトすれば良いと思います。)

LoadModule dav_svn_module modules/mod_dav_svn.so
LoadModule authz_svn_module modules/mod_authz_svn.so

<Location /repos>
   DAV svn
   SVNParentPath /var/www/svn

   # Limit write permission to list of valid users.
   <LimitExcept GET PROPFIND OPTIONS REPORT>
      # Require SSL connection for password protection.
      # SSLRequireSSL

      AuthType Basic
      AuthName "Authorization Realm"
      AuthUserFile /path/to/passwdfile
      Require valid-user
   </LimitExcept>
</Location>

これで、http://server-address/repos/projects という URL でリポジトリを参照することができます。

Windows:

———————————————

1. TortoiseSVN のインストール
  •  http://tortoisesvn.net/downloads.html から 32bit 版 か 64bit 版を自分のOSに合っているものをダウンロード。また、日本語版もあります。
  •  ダウンロードした msi ファイルを実行してインストール。

以上で準備は完了です。

2. Subversion リポジトリにソースコードを追加

D:Projects フォルダにソースコードが置いてあるので、これを Subversion リポジトリに追加してソースコード管理が行えるようにします。

  •  Windows エクスプローラーから D:Projects フォルダを選択して右クリック。
  •  TortoiseSVN – Import… メニューを選択
  •  Import ダイアログの URL of repository に http://server-address/repos/projects を入力
  •  OK ボタンをクリックすると、Import が実行されます。進捗状況が表示されます。
  •  Import Finished! が表示され、リストビュー内に “Completed At revision: 1” が表示されていると思います。
  •  OK ボタンをクリック
3. Subversion リポジトリからソースコードを取得(チェックアウト)

リポジトリに追加したソースコードはサーバー上にリビション:1としてあります。ソースコードを編集するにはリポジトリからソースコードの最新版をローカルに取得します。このことをチェックアウトといいます。

  •  ローカルのソースコードは先ほどインポートしたフォルダでも、別の場所でもかまわないので、Windows エクスプローラーで適当なフォルダを選択し、右クリックします。
  •  SVNCheckout… メニューを選択
  •  Checkout ダイアログの URL of repository に http://server-address/repos/projects/foo など取得するソースコードの場所を入力(または […] ボタンをクリックして Repository Browser で選択)
  •  Checkout ダイアログの Checkout directory に D:Workspacefoo などローカルのフォルダを入力(または […] でフォルダを選択)
  •  OK ボタンをクリック
  •  Checkout Finished! が表示されたら OK ボタンをクリック
3. 編集を Subversion リポジトリへ反映(コミット)

編集が終わったら変更結果をリポジトリへ反映します。このことをコミット、またはチェックインといいます。

  •  編集したファイル、またはフォルダを Windows エクスプローラーで選択して右クリック
  •  SVNCommit… メニューを選択
  •  Commit ダイアログの Changes made には変更されたファイルの一覧が表示されます。Message には覚え書きを入力します。
  •  OK ボタンをクリック
  •  Commit Finished! が表示され、リストビュー内に “Completed At revision: 2” が表示されていると思います。
  •  OK ボタンをクリック

以上です。