Qmail Tips: 存在しない宛先に届いたスパムメールを一括削除

運用ドメイン名の不特定多数のランダムなメールアドレスにスパムメールが送信されてくることがあります。

MTAがPostfixであれば、不適切な宛先に送信されてきたメールに対しては、即座にエラーを返すので、キューにそのスパムメールが蓄積されることはありません。一方で、MTAとしてQmailを使っている場合には、宛先ドメイン名が正しければ、そのメールが受信され、ローカル配送用キューに格納後に受信者への配送処理が行われます。

そのローカル配送の過程で初めて、その受信者メールボックスが存在するか否かが分かり、存在しなければ、送信者にエラーを返すことになり、そのエラーメールは、リモート配送用キューに格納されます。

大量の存在しない宛先へのメールを受信すると、Qmailが生成するエラーメールによって、リモートキューが一気に膨れ上がります。また、スパムは送信元メールアドレスが詐称されるのが、常ですから、キューのメールは捌けずに長時間滞留し続けることがあります。

そうなると正規ユーザーが当該サーバーから、メール送信をしようとしても、リモートキューのメールが多すぎて、メールが遅延する事象が起こります。

キューには、次のようなエラーメールが溜まることになります。

From: postmaster@mail.example.com
To: info@spammer.example.com
Subject: failure notice

Hi. This is the qmail-send program at mail.example.com.
I'm afraid I wasn't able to deliver your message to the following addresses.
This is a permanent error; I've given up. Sorry it didn't work out.

<hogehoge@mail.example.com>:
Sorry, no mailbox here by that name. (#5.1.1)

これは宛先「hogehoge@mail.example.com」にメールが送られてきたものの、この宛先が存在しないため、送信者である「info@spammer.example.com」に返送しようと生成されたエラーメールのサンプルです。

この「hogehoge」の部分が、ランダムとなっているエラーメールが、リモートキューに大量に溜まるので、それを一括削除することによって、メールの配送遅延を解消させます。エラーメールの一括削除は、次の手順で行います。

キューに溜まっているメール数の確認(Before)

qmHandle が入っていない場合の確認方法。

# find /var/qmail/queue/local -type f | wc -l
10
# find /var/qmail/queue/remote -type f | wc -l
2035

qmHandle が入っている場合は、次の方法で確認できます。
※qmHandle は、qmailに標準添付されないので、別途インストールが必要です。

# qmHandle -s
Messages in local queue: 10
Messages in remote queue: 2035

宛先不明のエラーメールのリストを生成する

# find /var/qmail/queue/mess -type f -exec egrep -l '^Sorry, no mailbox here by that name.' {} \; > /tmp/spam.queue

または

# find /var/qmail/queue/mess -type f -exec egrep -l '^<.*@mail.example.com>:' {} \; > /tmp/spam.queue

エラーメール(スパムメール)の一括削除

エラーメールの抽出が完了したら、Qmailのプロセスを停止してから、そのメールを削除します。次の例では、10通ずつ削除を行っています。

# cat /tmp/spam.queue | xargs -n10 rm

queue-fix によるキューの修復

削除後は、キューの整合性を修復するために queue-fix を実行します。
※queue-fix は、qmailに標準添付されないので、別途インストールが必要です。

# queue-fix -i /var/qmail/queue

キューに溜まっているメール数の確認(After)

キューの修復後に Qmailを起動し、溜まっているメール数を確認します。

# find /var/qmail/queue/local -type f | wc -l
10
# find /var/qmail/queue/remote -type f | wc -l
39

qmHandleがある場合。

# qmHandle  -s
Messages in local queue: 10
Messages in remote queue: 39

リモートキューから、約2,000通のエラーメールが削除されました。

なお、不特定多数の宛先に送信されてくるスパムメールが、一向に止む気配がないなど場合によっては、存在しない宛先に届いたメールを受信直後に削除する方法を取ることもあります。

Qmailの設定によりますが、.qmail-default などの然るべきファイルに /dev/null と書いておくことで、受信メールは削除され、エラーメールを返すことはなくなります。リモートキューにエラーメールが溜まる事象を抑えることができます。

ソフトウェア配布サイト

No Comments

XHTMLとCSS、時々レスポンシブ [準備体操 – cssで迷いなくす為のポイント]

みなさん、こんにちは。

インフォアライブの二等兵 西本です。

最近、「忍者衣装やたこ焼きの被り物を着用しながら、日々プログラムと戯れている人」というキャラクターのせいで、
社内から少々頭のネジが緩そうな人柄として認識されているような気がしますが、そんなことは無いです。

真面目で好青年なイメージを改めて認識してもらう為にこちらのブログでは若干真面目に記事を書きます。

さて、弊社スタッフ達が色々な知識を投稿しておりますが、
私はWEBサイト構築時の原点であるXHTMLとCSSの内容をピックアップ致します。

最初のお題ですが、cssにあまり触れない方に対する覚えておいた方が良いcssのポイントをご紹介いたします。

1.CSSファイル読込場所について

ズバリ「タイトルタグ下にまとめて記載」するのが一番理想的です。

スタイルシートの基本書sampleでもhead内に記載されていますので
「今更感」がありますが、head内に記載するだけでは駄目です。

「head内に記載するだけ」守れば良いという方に良くあるミスが特定の理由も無しに
外部js読込タグ下でCSSの読込を記載しているパターンです。

というのも、ブラウザがページを表示する時にHTMLに記載されている内容を上から順に読込む為
表示時のレスポンスを左右する可能性があるからです。

jsファイルをスタイルシートの読込前に記載した場合にjsの読込時間が大幅に掛かると、
ブラウザが一時的に真っ白になってしまいます。

エンドユーザがストレス無くサイトへアクセス出来るようにする為にも
こういった基礎的な所に気を使わなければなりません。

尚、補足ですがjsファイルの読込場所に関しては特定の理由がない限り、bodyの閉じタグ上に書込むのが理想的です。

詳細な説明は下記参考書に記載されておりますので、興味がある方は是非読んで下さい(^o^)

https://www.oreilly.co.jp/books/9784873113616/

▼ 理想的な配置例

<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=shift_jis">
<link rel="stylesheet" type="text/css" href="stylesheet1.css" />
<link rel="stylesheet" type="text/css" href="stylesheet2.css" />
<link rel="stylesheet" type="text/css" href="stylesheet3.css" />
</head>
<body>

~ 内容 ~

<script type="text/JavaScript" src="scriptfile1.js" />
<script type="text/JavaScript" src="scriptfile2.js" />
<script type="text/javascript"><!--

~  js処理 ~

--></script>
</body>
</html>

WEBページの表示速度に不満を感じた場合はこの書式を意識して記載してみて下さい。

今回は初の投稿なのでここらへんで終了いたします。

来週は今回の続きで

  • ドキュメントタイプは必ず宣言しよう
  • displayプロパティを理解しよう
  • clearfixを知っておこう

の3点をお送りいたしますのでお楽しみ下さい(^o^)

,

No Comments

Linux Tips: findで見つけたファイルへのコマンド一括実行

ファイル検索コマンド find を使って、マッチしたファイルやディレクトリに対して、一括して何かコマンドを実行したい場合、オプション(-exec)を使って、それを実現することができます。

以下は、一例ですが、CentOS-5.x(Linux)では、マニュアルの「EXAMPLES」セクションに様々な実行例が紹介されています。

特定パターンのファイルの行数を数える

ファイル名の末尾が「log」または「1桁の数字」で終わるファイルを対象に wc コマンドで行数をカウントします。

$ find /var/log/ -type f \( -name "*log" -or -name "*.[0-9]" \) -exec wc -l {} \;
1643 /var/log/messages.2
368 /var/log/messages.1
2 /var/log/httpd/access_log
2882 /var/log/httpd/error_log

特定パターンのファイルについて、ファイルサイズを調べる

ファイル名の末尾が「log」または「1桁の数字」で終わるファイルを対象に du コマンドでサイズを表示します。

$ find /var/log/ -type f \( -name "*log" -or -name "*.[0-9]" \) -exec du -h {} \;
128K    /var/log/messages.2
28K     /var/log/messages.1
4.0K    /var/log/httpd/access_log
344K    /var/log/httpd/error_log

特定パターンのファイルを一括して圧縮

Linuxのログ世代管理ツール「logrotate」は、デフォルトでログを圧縮しない設定(nocompress)になっており、それを圧縮する設定(compress)に変えたいケースがあります。その場合、既存のログファイルを次のコマンドを使って一括して圧縮することができます。

該当ファイルの一覧表示。

$ find /var/log -type f -name "*.[0-9]"
/var/log/messages.1
/var/log/messages.2
/var/log/httpd/access_log.1
/var/log/httpd/access_log.2
/var/log/httpd/error_log.1
/var/log/httpd/error_log.2

圧縮処理の実行。

$ find /var/log -type f -name "*.[0-9]" -exec gzip {} \;

実行結果の確認。

$ find /var/log -type f -name "*.gz"
/var/log/messages.1.gz
/var/log/messages.2.gz
/var/log/httpd/access_log.1.gz
/var/log/httpd/access_log.2.gz
/var/log/httpd/error_log.1.gz
/var/log/httpd/error_log.2.gz

ファイルの所有者を一括して rootに変更する

特定ユーザー(root)が所有していないファイルの所有者を一括で変更します。

該当ファイルの一覧表示。

$ find log/ ! -user root -name "*.[0-9]" -ls
2619934  332 -rw-rw-r--   1 zabbix   zabbix     333562  6月  1 04:02 log/zabbix/zabbix_agentd.log.1
2619915   20 -rw-r-----   1 nginx    adm         18720  6月  7 04:02 log/nginx/access.log.2
2619919    4 -rw-r-----   1 nginx    adm           264  6月  6 14:57 log/nginx/error.log.1
2619918   76 -rw-r-----   1 nginx    adm         72575  6月  7 04:02 log/nginx/error.log.2
2619921   40 -rw-r-----   1 nginx    adm         37950  6月  6 04:02 log/nginx/access.log.3
2619849   20 -rw-r-----   1 nginx    adm         18853  6月  7 03:59 log/nginx/access.log.1

所有者の一括変更。

$ find log/ ! -user root -name "*.[0-9]" -exec chown root:root {} \;

実行結果の確認。

$ find log/zabbix log/nginx -name "*.[0-9]" -ls
2619934  332 -rw-rw-r--   1 root     root       333562  6月  1 04:02 log/zabbix/zabbix_agentd.log.1
2619915   20 -rw-r-----   1 root     root        18720  6月  7 04:02 log/nginx/access.log.2
2619919    4 -rw-r-----   1 root     root          264  6月  6 14:57 log/nginx/error.log.1
2619918   76 -rw-r-----   1 root     root        72575  6月  7 04:02 log/nginx/error.log.2
2619921   40 -rw-r-----   1 root     root        37950  6月  6 04:02 log/nginx/access.log.3
2619849   20 -rw-r-----   1 root     root        18853  6月  7 03:59 log/nginx/access.log.1

特定パターンのファイルについて、パーミッションを一括変更する

パーミッションが 600 ではないファイルを一括して、パーミッションを 600 に一括変更します。

該当ファイルの一覧表示。

find ./log -type f ! -perm 600 -ls
2619933   28 -rw-r--r--   1 root     logcheck    26925  6月  6 22:46 ./log/messages
2619906    8 -rw-r--r--   1 root     logcheck     7393  6月  2 04:02 ./log/messages.1.gz
2619923   24 -rw-r--r--   1 root     root        22166  5月 27 19:39 ./log/messages.2.gz
2619914    8 -rw-r--r--   1 nginx    adm          6325  6月  7 11:59 ./log/nginx/access.log
2619917    4 -rw-r--r--   1 nginx    adm           231  6月  7 07:48 ./log/nginx/error.log

パーミッションの一括変更。

$ find ./log -type f ! -perm 600 -exec chmod 600 {} \;

実行結果の確認。

$ ls -l ./log/messages* ./log/nginx/*
-rw------- 1 root  logcheck 26925  6月  6 22:46 ./log/messages
-rw------- 1 root  logcheck  7393  6月  2 04:02 ./log/messages.1.gz
-rw------- 1 root  root     22166  5月 27 19:39 ./log/messages.2.gz
-rw------- 1 nginx adm       6325  6月  7 11:59 ./log/nginx/access.log
-rw------- 1 nginx adm        231  6月  7 07:48 ./log/nginx/error.log

このように find コマンドのオプション(-exec)を使うことで、効率的に処理を行うことができます。
検索したいディレクトリの階層数(-maxdepth)などのオプションと組み合わせるのも有効です。

No Comments

CheerCatsをリリース

cheerpetcats

cheerpetcats


2011/10/28 にCheerCatsをiTunesストアにリリースしました。ネコの写真専門の写真共有アプリです。無料です。
今回はCheerDogsのコードをXcode4環境に移行してから作成しました。
目新しい機能は特になく、作業はアイコンを変えただけです。

書くこともあまりないので技術のお話を書きます。
CheerCatsのサーバー構成は以下になります。

– サーバー: CentOS
– WEB:Apache2
– DB: MongoDB
– プログラム:PHP

目新しいものですと、MongoDBでしょうか。
MongoDBのプロダクトは社内で3件目になります。
MongoDBはパフォーマンスに優れたデーターベースで、複数のリクエストを高速に処理できます。
MySQL 5.1 だと、複数のリクエストがあると極端な速度低下が発生しますが、MongoDBはかなり安定した動作をします。
MySQL 5.5 から複数リクエストに強くなったそうなので時間があるときに評価したいものです。

No Comments

Apache Range Header DOS 検証補助ツール

Apache HTTPD 1.3/2.xにおいて、RangeヘッダーのDOS脆弱性(CVE-2011-3192)が先日発見されました。

リモートから、Apacheに冗長なRangeヘッダーのリクエストを送信することによって、サーバーのメモリやCPU資源を大きく消費させることができるというものです。なお、最新のアドバイザリでは、1.3に関しては脆弱ではないものの、RangeヘッダーDOSを受けた場合には、それなりに高負荷になるとの指摘があります。

その対策として、Apache開発チームが提示した方法の一つに mod_setenvif や mod_rewrite のモジュールを使って、冗長なRangeヘッダーのリクエストがあった場合には、Rangeヘッダーを無視したり、あるいは、そのリクエストを拒否するというものがあります。

その対策設定をした場合の事後チェックが簡単にできるPerlプログラムを作成しました。
このプログラムを使うことで、mod_setenvif や mod_rewriteを用いた制限が有効であるかを調べることができます。

http://code.google.com/p/apache-range-header-test/wiki/JapaneseManual

以下がその実行例です。例では、Range-Headerで10個の範囲指定をしたリクエストをホストに送信します。「Warning」が返ってきた場合には、制限が効いておらず、Range-Header の要求を Apacheが正常に受け入れられたことを示します。

$ ./httprangetest.pl foo.example.local
[Warning] foo.example.local: Host can accept more than 5 ranges.

次の結果では、Range-Headerの制限が効いており、Range-Headerが無視されています。

$ ./httprangetest.pl bar.example.local
[Info] bar.example.local: Host ignored Range-Header.

次のように第一引数を数値にして、Range-Headerでの範囲指定を任意の数値にすることができます。例では、2個の範囲指定であるため、制限には引っかからず、Apache がリクエストを受け入れています。このプログラムでは、6個以上の範囲指定をApacheが受け入れた場合には、Warning を出します。アドバイザリでは6個以上の範囲指定を制限しており、それに合わせた形です。

$ ./httprangetest.pl 2 bar.example.local
[Info] bar.example.local: Host can accept 2 ranges.

mod_setenvif や mod_rewrite のモジュールを使って、制限を実施した。あるいは、これから実施しようとされている人には、このプログラムを使うと検証が楽になるかもしれません。

なお、RangeヘッダーDOSの脆弱性が閉じられているかどうかを検証するものではないので、その点はご注意ください。

(CVE-2011-3192)

No Comments

iPhoneアプリのリリース


本日 「CheerPet for Dogs」をApp Storeにリリースしました。
今年の4月初めに、「自社開発でiPhoneアプリを作れないか?」と発言があり、白羽の矢が当たった私が開発することになりました。

最初はどのように進めるかが全く決まっておらず、先ずはプロトタイプを4月中旬に作成。
プロトタイプが出来たことから、4月末には開発者2名の社内プロジェクトとして5月末リリースを目標に発足したのですが、
結果としては、6/6にiTunes Connectに申請となり、本日6/16にリリースの運びとなりました。

開発の間にはGWもあり、開発日数は意外に短かったと思います。
思えば色々とありました。(‘ – ‘ ) . o O

エピソード1:2年前にiPhoneアプリを作ろうと社内プレゼンをしたけど、受け入れてもらえなかった。
エピソード2:iPhoneを持っていないので開発者に任命となったので自前でiPod Touchを買ってきた。
エピソード3:社内プロジェクトに昇格させる為に必死に家でコードを書いた。
エピソード4:4月に書いたプロトタイプが気に入らない。会社の就業時間内に書きなおすことは出来そうにないので、GWを利用し基礎構造を評価しなおし書き直した。

と、紹介するとSEってやばい仕事じゃね?ってエピソードですね。

そんなこんなですが、弊社でもiPhoneアプリ開発実績なるものが誕生となりました。
クライアントの皆様iPhoneアプリ発注くださいね!

それでは、SEのみなさん身体だけは気をつけて ( ‘д’ )ノ

No Comments

ストリートビューの[x]が押しにくい

iPad用の地図ページを作成していて思ったのですが、ストリートビューモードが使いにくいです。
[x](閉じる)が反応しない。。
仕方ないので地図の外にリンクを作りました。

<script type="text/javascript" src="http://maps.google.com/maps/api/js?sensor=false"></script>

<script>
var LatLng = new google.maps.LatLng(35.3353548, 134.1196615);
var map = new google.maps.Map(document.getElementById(‘gmaps’), {
zoom: 10,
center: LatLng,
});
var panorama = map.getStreetView();
google.maps.event.addListener(panorama, “visible_changed”, function () {
if (panorama.getVisible()){
$(‘#StreetView’).show();
} else {
$(‘#StreetView’).hide();
}
});

function StreetViewClose(){
var panorama = map.getStreetView();
panorama.setVisible();
}
</script>
<div id=”StreetView”><font size=+2><a href=”javascript:StreetViewClose()”>地図に戻る</a></font></div>

No Comments

スマートフォン用サイトのviewportについて

明けましておめでとうございます、そして初めまして

ソリューション事業部の内田です、新年から色々忙しいですが頑張っていきます!

さて、今回スマートフォン用サイトをいじる機会があったのでそこで知らなかった知識を

1つ紹介したいと思います。

スマートフォン用サイトを作る際のviewportの記述方法について。

機種ごとの横幅を検出し、自動的に横幅設定するには

<meta name="viewport" content="width=device-width" />

さらに拡大縮小禁止にするには

<meta name="viewport" content="width=device-width,user-scalable=no" />

拡大縮小禁止を違う方法で実現するには

<meta name="viewport" content="width=device-width, initial-scale=1.0, maximum-scale=1.0, minimum-scale=1.0" />

各項目説明

・width=device-width・・・デバイス毎の横幅を指定してくれる

・user-scalable・・・noで拡大縮小禁止、yesで拡大縮小可能

・initial-scale・・・倍率の初期値(100%の場合は1.0,120%の場合は1,2等)

・maximum-scale・・・倍率の最大値

・minimum-scale・・・倍率の最小値

以上が今回使用したviewportの一覧です、今年はさらにスマートフォンが活性化してくるようなので

こういったことを学ぶ機会は多くなってきそうだなと思います。

No Comments

twitter公式ウィジェットのtweet検索時に日本語のつぶやきのみ検索させる方法

twitterのサイト上では詳細検索オプションを使用することによって検索対象の言語や地域などを指定することが出来ます。

twitterをつぶやいているもののうち地域:日本周辺のつぶやきを抽出

twitter near:JP

しかしこのキーワードを直接ウィジェットのsearchのパラメータとしてセットしても動作しません。

試行錯誤した結果、以下の方法で日本語tweetのみ抽出することが出来ました。

  • widget.jsをダウンロード
  • テキストエディタでwidget.jsを開き以下の部分を検索
    • ※可読性を上げるためにセミコロン; を ;n など改行コード付きに置換した場合、291行目あたりになります

this.url=this._base+this.format+”?q=”+this.search+”

  • 検索した部分に対して “&lang=ja” を追記

this.url=this._base+this.format+”?q=”+this.search+”&lang=ja

  • 編集したwidget.jsを自サイトにアップロード
  • jsファイルの読み込み先をhttp://widgets.twimg.com/j/2/widget.jsから先程アップロードしたURLに変更

ちなみに、lang=jaではなくlocale=jaとした場合は日本国内でのつぶやきが対象となります。

No Comments

mbedについて語りました。

○ツインモーターはんだづけ完了、動作テスト

○wiiリモコンとmbedをBluetoothで接続し、ツインモーターを制御

No Comments