カテゴリの投稿: » 技術情報

メンテナンス中mod_rewrite

Written in 2014年05月26日 by | コメントする( 0件 )

メンテナンス中にメンテページにリダイレクトさせるよく使うmod_rewriteをメモしておこうっと。httpd.conf内のバーチャルホスト設定内に書く。自分のIPの場合はメンテページに飛ばさないようにしている。

<VirtualHost *:80>
  ( 略 )
  RewriteEngine On
  RewriteCond "%{REQUEST_URI}" "!^/maintenance.html" [NC]
  RewriteCond "%{REQUEST_URI}" "!.(jpg|gif|png|css)$" [NC]
  RewriteCond "%{REMOTE_ADDR}" "!111.222.111.222" [NC]
  RewriteRule "(.*)" http://www.somedomain.co.jp/maintenance.html [R,L]
</VirtualHost>

任意のドメイン、メンテページのパス、自分のIPを入れて設定する。

OpenSSLの脆弱性 The Heartbleed Bug

Written in 2014年04月09日 by | コメントする( 0件 )

OpenSSLの新しいバージョンにかなり危険な脆弱性が報告されています。早急に対処が必要です。

 

■対処バージョン

OpenSSL 1.0.1 から 1.0.1f

OpenSSL 1.0.2-beta から 1.0.2-beta1

 

■修正済みバージョン

OpenSSL 1.0.1g

Tarballs : http://www.openssl.org/source/

■JPCERTによる勧告

http://www.jpcert.or.jp/at/2014/at140013.html

OpenSSL Project が提供する OpenSSL の heartbeat 拡張には情報漏えいの

脆弱性があります。結果として、遠隔の第三者は、細工したパケットを送付す

ることでシステムのメモリ内の情報を閲覧し、秘密鍵などの重要な情報を取得

する可能性があります。

管理するシステムにおいて該当するバージョンの OpenSSL を使用している場合

は、OpenSSL Project が提供する修正済みバージョンへアップデートすること

をお勧めします。

 

■参考サイトURL

・Heartbleed解説ページ(英語)

http://heartbleed.com/

・参考となるブログ(記事をありがとう)

http://d.hatena.ne.jp/nekoruri/20140408/heartbleed

http://devlab.isao.co.jp/openssl_cve-2014-0160/

・脆弱性テストができるサイト

http://filippo.io/Heartbleed/#www2.millet.co.jp

 

■対策等

【1】以下のコマンドでバージョン確認

rpm -qa |grep openssl

openssl version

【2】RPM版ならyumでアップデート

CentOS6.5 では、opensslのRPMにおいてopenssl-1.0.1e-16.el6_5.7 で修正されている

http://lists.centos.org/pipermail/centos-announce/2014-April/020249.html

yum update openssl

※ソースならOpenSSL 1.0.1g 以降をインストールする。

【3】opensslのライブラリを使っているプロセスを確認

lsof | grep ssl

【4】それらのサーバプロセスを再起動

service crond restart

service httpd restart

service php-fpm restart

service fail2ban restart

service vsftpd restart

service mysql restart

service postfix restart

など。

出来れば、サーバマシンごと再起動がよい。

ntpdのmonlist機能を使ったDDos攻撃

Written in 2014年02月14日 by | コメントする( 0件 )

JPCERTコーディネーションセンター 「ntpd の monlist 機能を使った DDoS 攻撃に関する注意喚起」

http://www.jpcert.or.jp/at/2014/at140001.html

■影響を受けるバージョン

ntpd 4.2.7p26 より前のバージョン

以下のコマンドでバージョン確認
ntpq -c rv

■対策

/etc/ntp.conf に以下の設定を追加。
disable monitor

/etc/ntp.conf にrestrict を追加してアクセス制限

例)

restrict default ignore
restrict -6 default ignore
restrict 127.0.0.1
restrict -6 ::1

qmailのリモート送信キューを一括削除

Written in 2014年01月15日 by | コメントする( 0件 )

qmailで送信キューが大量にたまってしまったらどうするか。まずは、状況把握。
# /var/qmail/bin/qmail-qstat
これにより、現在のキューの状況がわかる。

messages in queue: 342007
messages in queue but not yet preprocessed: 843

のようにでる。34万件もたまってる。。。

どんなキューかを確認する。

# /var/qmail/bin/qmail-qread

とすると、


15 Jan 2014 04:28:45 GMT #163011079 644 <but@hogehoge.jp> bouncing
remote fugafauga@gmail.com
remote foofoo@yahoo.com
15 Jan 2014 05:27:46 GMT #163386784 568 <zyse@hogehoge.jp>
remote barbar@hotmail.com

のようにでる。
<but@hogehoge.jp>のように<>で囲まれたものが送信元アドレスだ。
#の後の数字がキュー番号。remote のあとにあるのが送信先アドレス。

リモート配信されるキューの情報は、

/var/qmail/queue/remote/*/(キュー番号)
/var/qmail/queue/info/*/(キュー番号)
/var/qmail/queue/mess/*/(キュー番号)
/var/qmail/queue/bounce/*/(キュー番号)

にたまるので、これらを削除していく。
参考: http://d.hatena.ne.jp/japanrock_pg/20090417/1239959873
そのスクリプトが以下の通り。

/bin/qmail-qread | tail -n '+2' \
| grep '#' | grep '@hogehoge.jp>' \
| sed -e 's/^.*#//g' | sed -e 's/ .*$//g' \
| awk 'NF > 0 { system("rm -f queue/remote/*/"$1";rm -f queue/info/*/"$1";rm -f queue/mess/*/"$1";rm -f queue/mess/*/"$1";rm -f queue/bounce/"$1) }'

一行目で、qmail-qreadを使って、先のリストを出力する。
二行目で、キュー番号があり、かつ送信元がhogehoge.jpのドメインのものだけに絞る。
三行目で、#の前を削除し、キュー番号の後の文字列を削除し、キュー番号だけ残す。
(awkで抜き出そうと思ったのだが、なぜかレコードの区切り文字がうまく働かなかった。。。)
四行目で、awkを使って、各キューファイルを削除している。

qmailで deferral: CNAME_lookup_failed_temporarily._(#4.4.3)

Written in 2014年01月15日 by | コメントする( 0件 )

eFaxにシステムからメールを送ってFAX送信を実現しようとした。
しかし、eFaxの送信用のメールアドレス(ドメイン部efaxsend.com)に送ろうとしたところ、
qmailのメールログに

deferral: CNAME_lookup_failed_temporarily._(#4.4.3)

と記録され、ディファーラルされて送信できない。

原因としては、

送り先ホストをDNSで名前解決できていない。

というものが考えられるが、digコマンドで正常に引けることが確認できた。
別の理由がある。

qmailでは512バイト以上のDNS応答をエラーとする

というのが原因のようです。efaxsend.comのMXレコードは私が見た時点で、16個もあった。
パッチが公開されています。

http://www.ckdhr.com/ckd/qmail-103.patch

このパッチを当てるか、下記のようにqmailのsmtproutes設定ファイルで、所定のドメイン宛の送信先SMTPサーバを直指定することで対応できる。

# vi /var/qmail/control/smtproutes
efaxsend.com:sendrelay10.j2.com

ただ、相手のSMTPサーバは変更されることがあるので、やはりパッチを当ててやる方がよいだろう。

phpMyAdmin4.0.xでカラムの多いテーブルのテーブル構造を開いた際に操作メニューサイズをリサイズするJavascriptのために、表示に時間がかかり操作ができない件の解消

Written in 2013年10月16日 by | コメントする( 0件 )

phpMyAdmin4.0.x (他のバージョンもそうかもしれないが)で、テーブル構造ページを開くと、各カラム情報行の右側にある各種操作メニューを、ブラウザの画面サイズに合わせてリサイズするJavascriptが動くが、これが結構遅くて、カラム数の多いテーブルの場合、画面を開いてから、操作できるようになるまでにかなりの時間がかかり、作業に支障をきたす。これを改善したい。

方法

js/tbl_structure.js

を開き、以下のコードを全箇所でコメントアウトする。(私の使っているバージョンでは3か所あった。)

$('#fieldsForm ul.table-structure-actions').menuResizer(PMA_tbl_structure_menu_resizer_callback);

PMA_tbl_structure_menu_resizer_callback で検索すると全部見つかるでしょう。

これで画面を開いた際にメニューのリサイズ処理が走らなくなる。ただし、画面が狭いとメニューが折り返されて、幾分見づらい。。。

Postfixで特定の送信元アドレス、送信先アドレスのキューを一括削除する

Written in 2013年10月03日 by | コメントする( 0件 )

mailq を実行すると、

-Queue ID- --Size-- ----Arrival Time---- -Sender/Recipient-------

CFC83527CBDA*     851 Thu Oct  3 11:06:56  foo@hogehoge.jp
(delivery temporarily suspended: host smtp.hogehoge.jp[111.222.111.222] refused to talk to me: ・・・・)
recipient1@fugafuga.com
recipient2@foofoo.com
recipient3@barbar.com

のようにキューがリストされる。(上記は一件のみ)

この場合、送信元アドレスはfoo@hogehoge.jpであり、送信先は、recipient1@fugafuga.com、recipient2@foofoo.com、recipient3@barbar.comである。これらの情報を参照し、それを条件としてQueue IDを引っ張ってきて、postsuper –d に渡せばキューを消せる。

そのためのシェルはman postsuperに載っているものを参考にできる。

送信元アドレスを条件にしてキューIDをリストする場合

mailq | tail -n '+2'  | grep -v '^ *(' | awk 'BEGIN { RS = "" } { if ( $7 == "foo@hogehoge.jp" ) print $1 }'

送信先アドレスを条件にしてキューIDをリストする場合

mailq | tail -n '+2'  | grep -v '^ *(' | awk 'BEGIN { RS = "" } { if ( $8 == “recipient1@fugafuga.com” || $9 == “recipient1@fugafuga.com” ) print $1 }'

のようにする。$8以降が送信先アドレスである。

特定のドメインのアドレス、という条件にする場合は正規表現を使う。

mailq | tail -n '+2'  | grep -v '^ *(' | awk 'BEGIN { RS = "" } { if ( $7 ~ "hogehoge.jp" ) print $1 }'

ここで得られるキューIDには*や!がついていたりするので、それを外すため、パイプを追加する。

| tr -d '*!'

そして、これをpostsuper –dに渡す。

| postsuper -d -

完成したシェルは以下の通り。

mailq | tail -n '+2'  | grep -v '^ *(' | awk 'BEGIN { RS = "" } { if ( $7 ~ "hogehoge.jp" ) print $1 }' | tr -d '*!' | postsuper -d -

これで一括削除ができる。

courier-imapの送信済みフォルダ名

Written in 2012年12月07日 by | コメントする( 0件 )

courier-imapでIMAPを通信をする際に、メーラ側から送信済みフォルダや、ごみ箱フォルダを作成・指定できますが、その際、フォルダ名に日本語を使うと、サーバ側のMaildir以下に作成されるフォルダ名は、文字化けしたような文字列になっている。これはフォルダ名が「UTF7-IMAP」にエンコードされているのだ。

「送信済み」というフォルダは、「&kAFP4W4IMH8-」みたいになっているでしょう。

それでこの文字化けしたような文字列をマルチバイトに戻したい時は、PHPでは以下のようにする。

$folder_name = mb_convert_encoding( $folder_name, 'UTF-8', 'UTF7-IMAP' );

ここではUTF-8に変換している。

WEBメールなどを作成される方はこのエンコード変換が必要でしょう。参考になれば幸いです。

10進数と62進数を相互変換するPHP関数

Written in 2012年06月18日 by | コメントする( 0件 )

62進数なんてどこかの古代文明かって感じですが、たとえばたくさんの数値をGETパラメータで渡したいが、クエリーの長さに制限のあるような環境の場合、数値を62進数にすれば桁数が減りますよね。そんなニーズで作ったものです。参考までにコード公開。

16進数は、0,1,2,3,・・・,8,9,A,B,C,D,E,Fで桁があがりますが、62進数は、0,1,2,3,・・・,8,9,a,b,c,・・・,x,y,z,A,B,C,・・・,X,Y,Zまできて桁があがります。数値、小文字、大文字という順ですね。数字が10文字、小文字が26文字、大文字が26文字なので合計で62あるのだ。

<?php

// 62進数を10進数に変換
function dec62to10( $dec62 )
{
  $dec62 = trim( $dec62 );
  if ( !preg_match( '/^[0-9a-zA-Z]*$/', $dec62 ) ) {
    trigger_error( "62進数を指定してください。", E_USER_ERROR );
  }
  if ( !$dec62 ) {
    return 0;
  }
  $digits = strlen( $dec62 );
  $lower_a = unpack( 'C', 'a' );
  $upper_a = unpack( 'C', 'A' );
  $dec10 = 0;
  $code = unpack( 'C', $dec62 );
  for ( $i=1; $i<=$digits; $i++ ) {
    $char = substr( $dec62, $i-1, 1 );
    if ( preg_match( '/[a-z]/', $char ) ) {
      $num = 10 + $code[ $i ] - $lower_a[1];
    } elseif ( preg_match( '/[A-Z]/', $char ) ) {
      $num = 36 + $code[ $i ] - $upper_a[1];
    } else {
      $num = $char;
    }
    $dec10 += pow( 62, $digits - $i ) * $num;
  }
  return $dec10;
}

// 10進数を62進数に変換
function dec10to62( $dec10 )
{
  $dec10 = trim( $dec10 );
  if ( !preg_match( '/^\d*$/', $dec10 ) ) {
    trigger_error( "10進数を指定してください。", E_USER_ERROR );
  }
  if ( !$dec10 ) {
    return 0;
  }
  $lower_a = unpack( 'C', 'a' );
  $upper_a = unpack( 'C', 'A' );
  $digits = 0;
  do {
    $digits++;
  } while ( $dec10 / pow( 62, $digits - 1 ) >= 1 );
  $digits--;
  $dec10_tmp = $dec10;
  $dec62 = '';
  for ( $i=1; $i<=$digits; $i++ ) {
    $digit_num = floor( $dec10_tmp / pow( 62, $digits - $i ) );
    if ( $digit_num < 10 ) {
      $dec62 .= $digit_num;
    } elseif ( $digit_num < 36 ) {
      $dec62 .= pack( 'C', $digit_num - 10 + $lower_a[1] );
    } else {
      $dec62 .= pack( 'C', $digit_num - 36 + $upper_a[1] );
    }
    $dec10_tmp -= $digit_num * pow( 62, $digits - $i );
  }
  return $dec62;
}

?>

mPDF5.xでTTFフォント使用時に一部の文字が四角で出力

Written in 2012年04月23日 by | コメントする( 2件 )

mPDF5.4を使って、PDFのレポートを出力していたが、TTFフォントで日本語を出す際に一部の文字が四角の形で出力されてしまう原因不明の不具合がでた。フォントのサブセットを埋め込む際の問題らしいが、散々検証してようやく解決できた。。。結構みんな困ってるんじゃなかろうか。。。

その四角をコピーして、秀丸とかに貼ると、復元される。間違いなく、文字コードの埋め込みではなく、フォント自体の埋め込みの問題です。

これはTTFフォントのサブセットをPDFに埋め込む際に、
Supplemental Ideographic Plane (SIP i.e. U+20000 to U+2FFFF)を扱うメソッドの方が動作してしまうかららしい。

http://mpdf.bpm1.com/forum/comments.php?DiscussionID=470&page=1#Item_11

が参考となりました。

mPDFがフォントのサブセットを埋め込む際に、そのフォントファイルを調べ、そのフォントにSIP(またはSMP U+10000+1FFFF)が含まれている場合、問題の原因となっているその第二のメソッドが使われるのである。それはドキュメント内でそれらの文字が使われているか否かに関わりません。(mPDFが水面下で融通をきかせてしまうのです。) しかしながら、該当フォントをconfig_fonts.phpの$this->BMPonly配列にくわえることによって、この挙動を上書きできます。こうすることでmPDFに第一のメソッドを使うように強制することができます。ただし、SIPの文字は表示されなくなります。

この設定をするとUnicode Basic Multilingual Plane (BMP i.e. U+0000 to U+FFFF)内の文字だけが利用可能な状態となります。

/mpdf54/config_fonts.phpの307行の
$this->BMPonly に、使用したいフォント名を追加してやる。(”mspgothic”など。)

例)

$this->BMPonly = array(
    "mspgothic",
    "msgothic",
    "mspmincho",
    "msmincho",
    "ipagothicp",
    "ipagothic",
    "ipaminchop",
    "ipamincho",
    "dejavusanscondensed",
    "dejavusans",
    "dejavuserifcondensed",
    "dejavuserif",
    "dejavusansmono",
);