Quantcast
Channel: 北風研究室
Viewing all 93 articles
Browse latest View live

jqGridの検索と検索演算子

$
0
0

jqGrid の検索機能では検索条件を $_GET パラメータとして渡されます。

検索パラメータは以下の3つです。

searchField: 検索フィールド
searchOper: 検索条件(演算子)
searchString: 検索する値

例えば searchField が “ID”、searchOper が “eq”、searchString が “100” ならば SQL 文に置き換えると ID = 100 という Where 句になります。

ということは、searchOper に入ってくる値にはどんなものがあるかを知っている必要があります。

そこで調べました。以下の簡単な jqGrid とナビゲーションバーに検索ボタンを表示させ、検索ボタンをクリックすると、デフォルトでは以下の検索ダイアログが表示されます。

jqgrid-search

どの演算子を表示させるかは、jqGrid の各カラムの定義で指定ができるのですが、今回は割愛し、各jqGrid の検索演算子とSQLの演算子の対比表にまとめました。

表示名 searchOperの値 SQL 演算子
次に等しい eq =
次に等くない ne <>
次より小さい lt <
次より等しいか小さい le <=
次より大きい gt >
次より等しいか大きい ge >=
次で始まる bw LIKE ‘%searchStr’
次で始まらない bn NOT LIKE ‘%searchStr’
次で終わる ew LIKE ‘searchStr%’
次で終わらない en NOT LIKE ‘searchStr%’
次を含む in LIKE ‘%searchStr%’
次を含まない ni NOT LIKE ‘%searchStr%’
次に含まれる cn LIKE ‘%searchStr%’
次に含まれない nc NOT LIKE ‘%searchStr%’
is null nu IS NULL
is not null nn IS NOT NULL

※ ‘searchStr’ は $_GET[‘searchString’] で渡される値です。
※ 「次に含まれる」、「次を含む」と「次に含まれない」、「次を含まない」は同じですね。
参考:http://stackoverflow.com/questions/9383267/what-is-the-usage-of-jqgrid-search-is-in-and-is-not-in

<table id="list"></table>
<div id="statusbar"></div>

<script type="text/javascript">
    $(document).ready(function () {
        $("#list").jqGrid({
            datatype: "json",
            url: "getdata.php",
            height: 250,
            width: 780,
            colModel: [
                { label: 'No', name: 'id', width: 75, key:true },
                { label: '日付', name: 'invdate', width: 90 },
                { label: 'クライアント', name: 'name', width: 100 },
                { label: '金額', name: 'amount', width: 80 },
                { label: '税', name: 'tax', width: 80 },
                { label: '合計', name: 'total', width: 80 },
                { label: '備考', name: 'note', width: 150 }
            ],
            viewrecords: true, // ページ、件数をツールバー上に表示
            pager: "#statusbar",
            caption: "jqGrid JSON 簡単サンプル"
        });

        // ナビゲーションの検索を有効にする
        jQuery("#list").jqGrid('navGrid','#statusbar',{del:false, add:false, edit:false, search:true});
    });
</script>

jqGrid を URL で指定したデータソースかデータを取得する方法では、データソース側では、これらの検索演算子に応じた検索結果を返さないとなりません。;-)


MySql の root パスワードのリセット

$
0
0

うかつにも MySql の root パスワードの設定時にタイプミスしていたようで、自分の覚えているパスワードを入力してもエラーになっております。


# mysql -u root -p
Enter password:
ERROR 1045 (28000): Access denied for user 'root'@'localhost' (using password: YES)

しょうがないので以下のサイトを参考にパスワードをリセットします。

http://www.rackspace.com/knowledge_center/article/mysql-resetting-a-lost-mysql-root-password

まずは、mysqld が動作しているので停止します。


# /etc/init.d/mysqld stop

次に、mysqld_safe の –skip-grant-tables というオプションで実行。mysql をユーザー特権をスキップして開始する。(このオプションは –help でも表示されないので隠しオプションかな?)
アンパーサンド(&) をコマンドの末尾につけて実行します。


# mysqld_safe --skip-grant-tables &

そして、root でパスワードなしで実行。


# mysql -u root

以下、MySql コンソールで順次実行。ここでは、新しいパスワードを “new password” とします。


mysql> use mysql;
mysql> update user set password=PASSWORD("new password") where User='root';
mysql> flush privileges;
mysql> quit

最後に、mysqld を再起動します。


# /etc/init.d/mysqld stop
# /etc/init.d/mysqld start

新しいパスワードを確認してみます。


# mysql -u root -p
Enter password:
Welcome to the MySQL monitor. Commands end with ; or g.
Your MySQL connection id is 2
Server version: 5.1.73 Source distribution

Copyright (c) 2000, 2013, Oracle and/or its affiliates. All rights reserved.

Oracle is a registered trademark of Oracle Corporation and/or its
affiliates. Other names may be trademarks of their respective
owners.

Type 'help;' or 'h' for help. Type 'c' to clear the current input statement.

以上です。無事リセットできました。 :-)

fatal: open database /etc/postfix/local_recipients.db: Invalid argument

$
0
0

/var/log/maillog で件名のエラーが出て原因を調べていました。

/var/log/maillog:

localhost postfix/smtpd[3766]: fatal: open database /etc/postfix/local_recipients.db: Invalid argument
localhost postfix/master[30580]: warning: process /usr/libexec/postfix/smtpd pid 3766 exit status 1
localhost postfix/master[30580]: warning: /usr/libexec/postfix/smtpd: bad command startup -- throttling

受け取るユーザーを local_recipients で指定しているので、main.cf の local_recipient_maps に /etc/postfix/local_recipients を指定しています。

/etc/postfix/main.cf:

...
local_recipient_maps = $alias_maps btree:/etc/postfix/local_recipients
...

postmap でlocal_recipients.db を再構築して、postfix の再起動

# postmap btree:/etc/postfix/local_recipients
# /etc/init.d/postfix restart

と、やれば問題ないのですが、

/etc/postfix/local_recipients を編集した後、

うっかり、

# postmap /etc/postfix/local_recipients

と、データベースの種類を main.cf で btree を指定しているにもかかわらず、btree:を指定しないで postmap してしまったため、エラーが起きていました。

以上です。

Asterisk 13: asterisk にリモート接続すると libjansson が見つからない

$
0
0

Asterisk 13 をCentOS6.6 にをVOIP-Info.jpを参考にインストールしました。

jansson のインストールのところは ld.so.conf を編集せず、以下の様にconfigure して ldconfig しました。

# wget http://www.digip.org/jansson/releases/jansson-2.7.tar.gz
# tar zxvf jansson-2.7.tar.gz
# cd jansson-2.7
# ./configure --prefix=/usr/ && make clean && make && make install && ldconfig

CentOS ではこれをしないとasterisk にリモート接続すると libjansson が見つからないというエラーになります。 ;-(

# /usr/sbin/asterisk -rvvv
/usr/sbin/asterisk: error while loading shared libraries: libjansson.so.4: cannot open shared object file: No such file or directory

以上です。

ただいま、asterisk 1.8.32.2 から asterisk 13.2.0 へ移行しテスト中です。

PHP socket_connect のタイムアウト

$
0
0

PHP でサーバーからクライアントへデータを通知するのにソケット通信を行う場合、クライアント側のアプリが接続可能状態でないとソケットの接続が長い時間戻って来なくなります。それを回避するには、socket_set_option でタイムアウト時間を設定します。

<?php
$address = "192.168.1.xxx";    // 送信先のIPアドレス
$port = xxxx;                  // 送信先のポート
$msg = "送信するメッセージです。";
$res = "";

$start = time();

// TCP/IP ソケット作成
$socket = socket_create(AF_INET, SOCK_STREAM, SOL_TCP);

if ($socket === false)
{
    $res = "socket_create() 失敗: ".socket_strerror(socket_last_error()).PHP_EOL;
}
else
{
    // 送信タイムアウト時間の設定(10秒)
    $timeout = array('sec' => 10, 'usec' => 0);
    socket_set_option($socket, SOL_SOCKET, SO_SNDTIMEO, $timeout);

    // ソケット接続
    $result = socket_connect($socket, $address, $port);

    if ($result === false)
    {
        $res = "socket_connect() 失敗: ".socket_strerror(socket_last_error($socket)).PHP_EOL;
    }
    else
    {
        $result = socket_write($socket, $msg, strlen($msg));
        if ($result === false)
        {
            $res = "socket_write() 失敗: ".socket_strerror(socket_last_error($socket)).PHP_EOL;
        }
        else
        {
            $res = "送信しました。".PHP_EOL;
        }
    }
    // ソケットを閉じる
    socket_close($socket);
}

$end = time();

echo $res;
echo ($end - $start)." 秒".PHP_EOL;
?>

jQuery UI DatePickerの選択イベント

$
0
0

jQuery UI Datepicker で日付を選択した時に何かをしたい。そんなときは select イベントを使います。

以下の例では、選択された日付を表示しています。

jQuery(document).ready(function() {
    $( "#datepicker" ).datepicker({
        inline: true,
        onSelect: function (date) {
            alert(date);
        }
    });
});

...

<div id="datepicker"></div>

MySql の ユーザー パスワードの変更

$
0
0

MySql のユーザーのパスワードを変更する方法意外にも面倒でした。

root でログインします。


$ mysql -u root -p
Enter password:

次に、使用するデータベースを mysql に変更

mysql> use mysql;

そして、ユーザーのパスワードを変更。
(例として、ユーザ名: username 新パスワード: username_password で行っています。)

mysql> set password for 'username@'localhost' = password('username_password');
Query OK, 0 rows affected (0.11 sec)

以上です。

Access-Control-Allow-Origin ヘッダーに見つかりません。

$
0
0

異なるドメインから利用される Webサービスは、アクセスを許可するドメインをAccess-Control-Allow-Origin ヘッダーで制限できます。

どのドメインからでもアクセスを許可するには

Access-Control-Allow-Origin: *

ドメインを http://www.northwind.mydns.jp に限定するには

Access-Control-Allow-Origin: http://www.northwind.mydns.jp

Access-Control-Allow-Origin の指定がない場合は同一ドメインのみアクセス可となります。つまり、他のドメインからアクセスした場合、「Access-Control-Allow-Origin ヘッダーに見つかりません。」となります。

PHPでヘッダを書き出すには

header("Access-Control-Allow-Origin: *");

と1行追加で対応できます。


Asterisk CLI プロンプトの変更

$
0
0

Asterisk コンソールのプロンプトはデフォルトでは、

hostname*CLI> 

ASTERISK_PROMPT 環境変数にフォーマットをセットすることで変更できます。

例)
export ASTERISK_PROMPT="[%d %t]%H*> "

上記の例のように日時とホスト名を指定すると、

[2015-12-01 12:03:12]hostname*>

参考サイト:
http://pbxinaflash.com/community/index.php?threads/asterisk-cli-date-time-in-logs.7885/

Asterisk ログにタイムスタンプを表示

$
0
0

Asterisk CLIで接続して表示されるログには、デフォルトで日時がないのですが、オプションで表示することができます。

1) CLI起動時に指定

# /usr/sbin/asterisk -rTvvvvvv

2) asterisk.conf で指定

asterisk.conf 
...
[options]
...
timestamp = yes  ; 起動時の -T と同じ
...

結果

# /usr/sbin/asterisk -rvvvvvT
[Dec  1 12:14:10] Asterisk 13.6.0, Copyright (C) 1999 - 2014, Digium, Inc. and others.
[Dec  1 12:14:10] Created by Mark Spencer 
[Dec  1 12:14:10] Asterisk comes with ABSOLUTELY NO WARRANTY; type 'core show warranty' for details.
[Dec  1 12:14:10] This is free software, with components licensed under the GNU General Public
[Dec  1 12:14:10] License version 2 and other licenses; you are welcome to redistribute it under
[Dec  1 12:14:10] certain conditions. Type 'core show license' for details.
[Dec  1 12:14:10] =========================================================================
[Dec  1 12:14:10] Connected to Asterisk 13.6.0 currently running on localhost (pid = 49788)
... 省略 ...
[Dec  1 12:19:14]     -- Executing [201@default:2] Playback("SIP/301-00000001", "demo-echotest") in new stack
[Dec  1 12:19:14]     --  Playing 'demo-echotest.gsm' (language 'ja')              
... 省略 ...
localhost*CLI> 

マイナンバーのチェックデジットをVBAで算出

$
0
0

個人用マイナンバーのチェックデジットをVBAで算出してみました。

参考までに。。。

' http://law.e-gov.go.jp/announce/H26F11001000085.html
'
' (検査用数字を算出する算式)
' 第五条 令第八条の総務省令で定める算式は、次に掲げる算式とする。
' 算式
'  11―(n=1(シグマ)11(Pn×Qn))を11で除した余り)
'  ただし、(n=1(シグマ)11(Pn×Qn))を11で除した余り≦1の場合は、0とする。
' 算式の符号
'   Pn 個人番号を構成する検査用数字以外の十一桁の番号の最下位の桁を1桁目としたときのn桁目の数字
'  Qn 1≦n≦6のとき n+1 7≦n≦11のとき n―5
'
Function CalcCheckDigit(number As String) As Integer
    Dim digits As String
    Dim chkDigit As String
    Dim cd As Integer
    
    cd = -1

    ' 12桁でなければ無効
    If Len(number) <> 12 Then
        CalcCheckDigit = cd
        Exit Function
    End If
    
    ' チェックデジット部分を取出し
    chkDigit = Right(number, 1)
    
    ' マイナンバー11桁取出し
    digits = Left(number, 11)
    
    Dim n, pn, qn, m As Long
    Dim sum As Long
    
    res = False
    sum = 0
    
    For n = 1 To 11
        ' n桁目の数字
        ' 小さい桁から計算(検査用数字以外の十一桁の番号の最下位の桁を1桁目)
        pn = CInt(Mid(digits, 11 - n + 1, 1))
        
        ' 1≦n≦6のときn+1
        If n <= 6 Then
            qn = n + 1
        ' 7≦n≦11のときn―5
        Else
            qn = n - 5
        End If
        
        sum = sum + pn * qn
    Next
    
    ' 11 で割った余り
    m = sum Mod 11

    ' (n=1(シグマ)11(Pn×Qn))を11で除した余り≦1の場合は、0とする
    If m <= 1 Then
        cd = 0
    ' 11―(n=1(シグマ)11(Pn×Qn))を11で除した余り)
    Else
        cd = 11 - m
    End If

    CalcCheckDigit = cd
End Function

ためしに自分のマイナンバーで計算してみると合っていました。^_^;

参考サイト:
http://qiita.com/qube81/items/fa6ef94d3c8615b0ce64

CentOS 6.7 上で SETI@home を動かしてみる

$
0
0

ずいぶん前から自宅のPCから SETI@home プロジェクトに参加しています。 自宅サーバーをリプレースして CentOS 6.7 にしたら以前に投稿した記事 では動作しないので改めてインストールしてみました。

事前準備として、SETI@home のアカウントを持っていることを条件としています。

また、EPEL(Fedora Extra Packages for Enterprise Linux) レポジトリを先にインストールしておきます。

# yum install epel-release

サーバー上で稼働させるので、グラフィカルユーザーインターフェースであるBOINC マネージャを使用しないで、アカウントにコンピュータを接続します。

1. boinc クライアントのインストール

# yum install boinc-client

2. アカウントにコンピュータを接続

上記ステップでクライアントをインストールすると、/var/lib/boinc ディレクトリが作成されているはずです。
このディレクトリに account_setiathome.berkeley.edu.xml というファイル名で以下の内容を保存します。

<account>
    <master_url>http://setiathome.berkeley.edu/</master_url>
    <authenticator>自分のアカウント・キー</authenticator>
</account>

※アカウント・キーの確認方法:
1. ブラウザーから、https://setiathome.berkeley.edu/index.php を表示
2. 「YOUR ACCOUNT」をクリックして、自分のアカウント情報を表示
3. 「Account information」の「Account keys」を 「View」をクリックして表示
「You can access your account either by using your email address and password, or by using an assigned ‘account key’. Your account key is:」に表示されています。

次に、ファイルの所有者を boinc に変更します。

# chown boinc.boinc account_setiathome.berkeley.edu.xml

3. boinc-client の実行

以下のコマンドを実行して boinc-client を開始します。

# service boinc-client start

処理状況は以下のコマンドで確認できます。

# boinccmd --get_simple_gui_info

または、

# boinccmd --get_state

ReactOS: オープンソース Windows 互換OS

$
0
0

ReactOS というオープンソースの Windows 互換OS は、Windows NT アーキテクチャをベースで、Windows NT のバイナリ完全互換を目指しているという。 現在はまだアルファ版で日本語は扱えないようですが楽しみです。

さっそくVMWare で試してみました。

ReactOS 起動画面

1

ReactOS デスクトップ

2

ReactOS スタートメニュー

Windows 2000 のような操作感です。
3

ReactOS コマンドプロンプト

基本的なコマンドは使えるようです。 “net use” コマンドは “This command is not implemented yet” でした。
4

ReactOS アクセサリ

ワードパッド、メモ帳、ペイント、ソリティアなど。。
7

ReactOS ブルースクリーン

アルファー版ですしね。 😉
6

次回は、いくつかアプリを試してみます。

TotoiseSVN コミットされた日時でチェックアウト

$
0
0

TotoiseSVN Subversion でソースコード管理を行っています。

新たなソースをリポジトリからチェックアウトすると、デフォルトの設定ではファイルのタイムスタンプがチェックアウトの日時になってしまいます。

TotoiseSVN のチェックアウトで取得したファイルのタイムスタンプをコミットされた日時で行うためには、設定ファイルを編集します。

その方法は:
1) TotoiseSVN setting の General 設定から Subversion の Subversion configuration file: の Edit ボタンをクリックします。
2) メモ帳でコンフィグファイルが開かれます。その中で use-commit-times = yes の行を探してコメント(行頭の#)を外します。
3) 保存します。

Trac を CentOS 6.7 へインストール

$
0
0

Trac でソフトウェア開発のタスクやバグを管理することになりました。導入までの手順をまとめておきます。

1. 準備

Trac は Python で書かれているので Python が必要です。

# yum install python python-devel

他にも必要なパッケージをインストールします。

# yum install httpd httpd-devel
# yum install sqlite

2. Python Seteuptools のインストール

setuptools が後でインストールする Genshi や Babel などの Python ライブラリのインストールに必要です。

# yum install python-setuptools

3. Genshi のインストール

Genshi は Python のテンプレートエンジンです。先にインストールした setuptools の easy_install コマンドでインストールします。

# easy_install Genshi

4. Babel のインストール

Babel は ローカライズのための Python のパッケージです。Genshi と同様に easy_install コマンドでインストールします。

# easy_install Babel

5. Trac のインストール

Trac の本体をインストールします。

# easy_install Trac

6. mod_wsgi のインストール
Apatch から Python プログラムを実行するための Apache のモジュール mod_wsgi をインストールします。
# yum install mod_wsgi

7. Trac プロジェクトの作成

準備ができたら、Trac プロジェクトを作成します。
ここでは、foo というTracプロジェクトを /var/trac/projects/foo ディレクトリに配置します。

まずは、foo ディレクトリを作成し、ディレクトリのオーナーを apache に設定します。

# mkdir -p /var/trac/projects/foo
# chown -R apache.apache /var/trac/projects/foo

次に、trac-admin にプロジェクト用ディレクトリと initenv コマンドで初期化します。
これは、apache ユーザーで行います。

# sudo -E -u apache /usr/bin/trac-admin /var/trac/projects/foo initenv 

上記コマンドを実行するとプロジェクト名とデータベース接続文字列を聞かれるので適宜入力します。
ここではプロジェクト名には “foo”、データベース接続文字列はデフォルトのままとします。

 (... 途中省略 ...)

プロジェクト名 [My Project]> foo                     <-- プロジェクト名を入力して [Enter] キーを押下

 (... 途中省略 ...)

データベース接続文字列 [sqlite:db/trac.db]>          <-- デフォルトのままで [Enter] キーを押下

 (... 途中省略 ...)

Congratulations!

8. Apache との連携

Apache とtrac を連携できるように設定を追加します。
mod_wsgi モジュールのスクリプトを作成します。

# vi /var/trac/trac.wsgi

上記ファイルに、以下の内容を記述し保存します。

import os

os.environ['TRAC_ENV_PARENT_DIR'] = '/var/trac/projects'
os.environ['PYTHON_EGG_CACHE'] = '/var/trac/.python-eggs'

import trac.web.main
application = trac.web.main.dispatch_request

上記スクリプトのアクセス権限を設定します。

# chmod 755 /var/trac/trac.wsgi
# chown apache.apache /var/trac/trac.wsgi

最後に、Apache の設定を追加します。

# vi /etc/httpd/conf.d/wsgi.conf

上記ファイルに、以下の内容を記述し保存します。

LoadModule wsgi_module modules/mod_wsgi.so

WSGIScriptAlias /trac /var/trac/trac.wsgi

<Directory /var/trac/projects>
    WSGIApplicationGroup %{GLOBAL}
    Order deny,allow
    Allow from all
</Directory>

そして、Basic 認証をかけます。

# vi /etc/httpd/conf.d/trac.conf

以下を入力して保存します。

<LocationMatch "/trac/[^/]+/login">
    AuthType Basic
    AuthName "Trac"
    AuthUserFile /var/trac/.htpasswd
    Require valid-user
</LocationMatch>

Basic認証で使用するユーザー名とパスワードを登録します。

# htpasswd -c /var/trac/.htpasswd admin
New password: 
Re-type new password: 
Adding password for user admin

# htpasswd /var/trac/.htpasswd bar
New password: 
Re-type new password: 
Adding password for user bar

Apache を再起動します。

# service httpd restart

ブラウザから以下のような URL をアドレスに指定するとプロジェクト用 Tracサイトが開かれます。

http://server/trac/foo


sdelete – Windowsでファイルを完全に消去するコマンド

$
0
0

Windows でファイルを完全に消去するために sdelete というコマンドツールが無償でMicrosoft TechNetから提供されています。sdelete はWindows Sysinternalsのツール群のひとつです。

このコマンドで削除したファイルはディレクトリはファイルの復元ソフトなどで復元されることがなくなるため、安全に削除する場合には必要なツールです。

このコマンドを使った便利なライフハックがありましたのでご紹介します。

Windows Sysinternalsをダウンロードして C:\sysinternals へ展開しておきます。

まず、License Agreement に同意する必要があります。コマンドプロンプトから C:\sysinternals へ移動して sdelete.exe を実行します。

> cd sysinternals
> sdelete

License Agreement のダイアログが表示されますので、内容を確認の上、Agree ボタンをクリックします。
2回目以降はこのダイアログは表示されません。

次に、このコマンドを実行するバッチファイルを作成します。メモ帳を立ち上げて以下の内容を書き込みます。

@echo off
echo .* * *W A R N I N G * * *
echo .
echo .The File(s)/Folders(s) Will Be Permanently Deleted!
echo .
echo .Press CTRL-C to Abort and Terminate Batch Job Or...
echo .
pause
sdelete -p 4 -s %1
pause

これを C:\sysinternals\shred.bat という名前で保存します。そしてこのバッチコマンドのショットカット(例:shred.bat – ショートカット)をデスクトップへ配置します。例えば、ごみ箱のとなり。。。

削除したいファイルをエクスプローラから「shred.bat – ショートカット」へドラッグ&ドロップします。
コマンドプロンプトが表示され何かキーを押すと消去が実行されます。中止するには CTRL + C キーを押下します。

shred1

ファイル名に日本語が含まれていると ???? で表示されてしまいますが、消去は実行されます。

shred2

Windows NT System and Kernel がポート80を使用している?

$
0
0

Windows Server 2012 にXAMPP をインストールして Apache と MySQL を使用したかったのですが、Apache が起動できなかった。
[Apache] Problem detected!
[Apache] Port 80 in use by “Unable to open process” with PID 4!
[Apache] Apache WILL NOT start without the configured ports free!
[Apache] You need to uninstall/disable/reconfigure the blocking application
[Apache] or reconfigure Apache and the Control Panel to listen on a different port

PID 4がポート80を使用しているということなので、タスク マネージャで調べてみると PID 4 は NT System & Kernel でした。

しかし、IISもインストールしていなし、このプロセスを止めるわけにはいかなそう。

サービス一覧をみてIIS関連のサービスや他の起動中サービスを眺めていたところ “SQL Server Reporting Services” が気にかかり、ためしに停止したらポート80が未使用になりました。

Fail2ban で不正アクセス防止 (asterisk 編)

$
0
0

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

以上です。

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

$
0
0

前回の投稿で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>:.*\)

CPI レンタルサーバーでPHP/PDO MySql接続エラー

$
0
0

CPIレンタルサーバーにWebシステムを構築していてはまってしまった件なのですが、PHP で PDO を使って MySql へ接続すると以下のエラーが。。。

Can't connect to local MySQL server through socket '/tmp/mysql.sock' (2)

ローカルのサーバーでは出ていなかったので、Unixソケットも調べたが /tmp/mysql.sock で問題なし。

原因は、host=localhost で接続していたためでした。’localhost’ を ‘127.0.0.1’ に変更したら接続ができました。

Viewing all 93 articles
Browse latest View live