カテゴリの投稿: » サーバ・ネットワーク

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サーバは変更されることがあるので、やはりパッチを当ててやる方がよいだろう。

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

MySQLで「Host ‘hogehoge.com’ is blocked because of many connection errors」が発生

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

たとえばPHPなどでは以下のようなエラーメッセージが出力される。

Warning: mysql_connect() [function.mysql-connect]: Host 'hogehoge.com' is blocked because of many connection errors; unblock with 'mysqladmin flush-hosts' in /home/hoge/public_html/somedir/somescript.php on line 50

■原因

MySQLがそのホスト(hogehoge.com)から多くの接続エラーを受けた場合に発生します。接続エラーの大量発生後、MySQLサーバは何か問題(クラッカーからの攻撃など)が発生したと判断し、このホストからの接続を拒否するようにします。

デフォルトでは、接続エラーが 10 回発生すると、mysqld はそのホストを拒否します。この数はMySQLのmax_connect_errors変数によって変更できます。

参照URL: http://dev.mysql.com/doc//refman/4.1/ja/blocked-host.html

 

■対処

①シェルで以下のコマンドを実行する

# mysqladmin flush-hosts

②以下のSQLを実行する

FLUSH HOSTS;

 

■事象発生の確認

上記エラーメッセージが出力されることが事象発生を知らせるものであるが、MySQLサーバ側でその状態を確認することはできないのか。ある程度はできる。

接続エラーが発生するとそれはホストキャッシュ(host cache)に記憶される。このホストキャッシュとは、MySQLがDNSからIP、ホスト名を正引き、逆引きした結果をキャッシュしておくもので、同時に、この接続エラーの状況を記憶しておくものでもあります。それでこのキャッシュを上記のコマンドでフラッシュしてやれば解決するのである。ホストが拒否された場合、これが唯一の解消方法です。

さて、このホストキャッシュを閲覧できるなら状況を把握できるのだが、閲覧するためのコマンドは存在しません。確認できるSQLコマンドを追加するパッチを開発した方もおられるようだが。

しかし、いくつか得られる情報はある。

①error log と general query log

–log-warningsオプションをつけてサーバを起動すると、error logに以下のようなエラーメッセージが記録される。

010301 14:38:23  Aborted connection 854 to db:
'users' user: 'josh'

また、general query logが有効にされていると、問題の原因の種類が書き込まれる。

②ステータス変数「Aborted_clients」「Aborted_connects」

以下のSQLを実行するとこのステータス変数を取得できる。

SHOW GLOBAL STATUS WHERE `Variable_name` IN ( 'Aborted_clients', 'Aborted_connects' );

ホスト拒否の根拠とされるのは、どちらのステータス変数なのか、あるいは両方なのかはわからないが、それぞれの変数の意味は以下の通りです。

Aborted_clients

クライアントが接続できたものの後で不適切に切断されたり終了されたりした場合、MySQLはこのステータス変数を増加させます。また、error logにAborted connectionメッセージが書き込まれます。このステータスになる原因は以下の通りです。

  • クライアントプログラムがmysql_close()をコールせずに終了した
  • クライアントが何のリクエストもしないままwait_timeoutまたはinteractive_timeoutの秒数を経過してスリープしている場合
  • クライアントプログラムがデータ転送中に突然に終了した場合

Aborted_connects

クライアントがコネクトすらできなかった場合にサーバはこのステータス変数を増加させます。コネクション試行の失敗は以下の理由で発生します。

  • クライアントがデータベースへの接続権限を持っていない
  • クライアントが正しくないパスワードを使用している
  • コネクションのパケットに正しい情報が含まれていない
  • コネクションのパケットの取得にconnect_timeout秒以上を要した

これらの種類の問題が起きている場合、誰かがサーバに侵入しようとしていることを意味しているかもしれません。これらのタイプの問題に関するメッセージは(有効にさていれば)genral query logに記録されます。

そのほかにもAborted_clientsやAborted_connectionsになる理由はあるが詳細は以下のURLを参照してください。

参照URL: http://dev.mysql.com/doc/refman/5.0/en/communication-errors.html

64bitのLinuxサーバにPHPを./configureする際にlibjpeg, libpng, ldapなどがない!と怒られる

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

64ビットのLinuxサーバにPHPをソースインストールで./configureする際に、予期せず以下のようなエラーに遭遇したことはないだろうか。

configure: error: libjpeg.(a|so) not found. php 5.2.17

configure: error: libpng.(a|so) not found. php 5.2.17

単にlibjpeg-devel, libpng-develがインストールされていないなら、

yum install libjpeg-devel

yum install libpng-devel

でインストールすればいい。しかし、これはもうやったのに、上記エラーが出る場合、32bit(i386)のライブラリがインストールされていない可能性がある。

# ls -la /usr/lib | grep libjpeg
lrwxrwxrwx   1 root root      17  5月 20 15:58 libjpeg.so -> libjpeg.so.62.0.0
lrwxrwxrwx   1 root root      17  5月 20 15:58 libjpeg.so.62 -> libjpeg.so.62.0.0
-rwxr-xr-x   1 root root  134268  1月  6  2007 libjpeg.so.62.0.0

のように、/usr/lib の中に、ライブラリが入っているか確認するといい。もしかしてなかったりしませんか? 次に64ビット用ライブラリも確認してみよう。

# ls -la /usr/lib64 | grep libjpeg
lrwxrwxrwx  1 root root      17  5月 20 15:17 libjpeg.so -> libjpeg.so.62.0.0
lrwxrwxrwx  1 root root      17  7月  2  2010 libjpeg.so.62 -> libjpeg.so.62.0.0
-rwxr-xr-x  1 root root  138936  1月  6  2007 libjpeg.so.62.0.0

こちらは有ったりしませんか?
なんだ、64bitのしかないなら、

./configure –with-libdir=lib64

のように指定すればいいではないか。でもやってみると、今度は、mysql_clientがないとか言われたりする。今度は32ビット版のライブラリしかないものが見つからなくなってしまう。。。困ったもんだ。

もし、yumでインストールしたlibjpegやlibpngのライブラリが64ビット版はあり、32ビット版がないという状況の場合、yumでi386のパッケージを除外する設定がされている可能性があります。普通、libjpeg, libpngは、yumインストールすると32ビット版、64ビット版の両方がインストールされるはずだからです。以下のように確認してみよう。

# cat /etc/yum.conf

設定の中に、

exclude=*.i386

のような記述があればコメントアウトする必要がある。これでyum install libjpeg-develで、32ビット版のライブラリもインストールされるはずだ。

/etc/yum.repos.d/

の中にあるファイルに関しても確認してみル必要があるかもしれない。

 

Apache2.2+PHP5.3+MySQL5.5環境でApacheが立ち上がらない

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

最近、Apache2.2+PHP5.3+MySQL5.5の構築をしました。何度もしていたので甘く見てたら、Apache起動でOKと表示されるものの実際には立ち上がっておらず、ログにもエラーが出ていなかったので、とても困りました。

おそらくopensslの複数バージョンの混在が原因ではないかと思います。RPM版のopenssl0.9.8eが入っており、別途ソースインストールで、/usr/local/openssl にopenssl1.0.0cを入れていました。

MySQL5.5では、コンパイル時にCmakeを使うようになり、設定方法が以前と変わっており、opensslのインストールPREFIXを指定できずに(方法があるのかもしれませんが、、、)、デフォルトのディレクトリ/usr からライブラリを組み込むようで、RPM版のopenssl0.9.8eが組み込まれました。

一方、PHPではopensslのインストールディレクトリを指定できるので、/usr/local/openssl のopenssl1.0.0cを組み込もうとしたところ、MySQL5.5からクライアントライブラリを組み込む指定もしていたので、MySQL5.5のopenssl0.9.8eとPHP5.3のopenssl1.0.0cがコンフリクトして「セグメンテーション違反」となって、コンパイルできなかった。

なので、opensslは複数バージョンのDSOモジュールがあると競合するようだ。仕方なく、PHPには、/usrのパスを指定してopenssl0.9.8eを組み込んだ。

さて、Apache2.2には、opensslのパス指定ができるので、/usr/local/openssl のopenssl1.0.0cを組み込んでいました。このアパッチにlibphp5.soを読み込ませるわけだが、そうするとApache2.2のopenssl1.0.0cと、PHP5.3およびMySQL5.5に組み込まれたopenssl0.9.8eがコンフリクトするのではなかろうか。PHPコンパイル時のPHP x MySQLのコンフリクトのようにエラーが出ればいいが、Apache起動時にエラーも吐かずに立ち上がらないという状況はいかにも困った。

これらのopensslコンフリクトの仮説をもとに、Apache2.2もopenssl0.9.8eを組み込んでコンパイルし直し、PHP5.3も同様にコンパイルしなおしたところ、動きました。。。。

AmazonEC2を使い始めた

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

AmazonEC2を使い始めました。この柔軟性たまりませんね。CentOS5.5 32bitの既存AMI(イメージ)を使って、インスタンスを作った。EBSにルートパーティションを作るイメージなのですが、10GBのサイズで勝手にできてしまい、これではルートパーティションにしては小さい。それで、以下の手順でルートパーティションのサイズを20GBに拡大した。

①一度このEBSのイメージを作成
②そのイメージで20GBのEBSを新たに作成
③起動済みのインスタンスをSTOP
④10GBのEBSをdetach
⑤新しい20GBのEBSをインスタンスにattach。デバイスは/dev/sda1。
⑥インスタンスを起動
⑤SSHでサーバに入る。この時点ではまだ/dev/sda1 は10GBである。

# df -h
Filesystem            Size  Used Avail Use% Mounted on
/dev/sda1             9.9G  2.3G  7.1G  25% /
/dev/sdb              147G  188M  140G   1% /mnt
none                  854M     0  854M   0% /dev/shm

⑥以下のコマンドを実行する。

# resize2fs /dev/sda1

resize2fs 1.39 (29-May-2006)
Filesystem at /dev/sda1 is mounted on /; on-line resizing required
Performing an on-line resize of /dev/sda1 to 5242880 (4k) blocks.
The filesystem on /dev/sda1 is now 5242880 blocks long.

⑦これでルートパーティションのサイズが広がる

# df -h

Filesystem            Size  Used Avail Use% Mounted on
/dev/sda1              20G  2.3G   17G  13% /
/dev/sdb              147G  188M  140G   1% /mnt
none                  854M     0  854M   0% /dev/shm

rpmファイルはここで取得できますね

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

各種OSのパッケージ等はここで取得できますね。

ftp://ftp.riken.jp/

CentOSなら、Linux => centos と進めばいい。