2009年1月アーカイブ

1.全てのcronからroot宛のメールを停止する場合。

「/etc/crontab」を開き、

MAILTO = root
   ↓
MAILTO = ""

に変更。


2.ジョブごとにメールを止めたいとき

cron設定ファイルやcrontabでコマンドを書くとき、

例1)
05 2 * * * root コマンド > /dev/null 2>&1 または、
05 2 * * * root コマンド > /dev/null 2> /dev/null
   ↓
メールを送らずログも残さない


例2)
05 2 * * * root コマンド 1> /dev/null
   ↓
標準出力は無視し、標準エラー出力をメールする。
(コマンド実行時にエラーがあったときだけメールする)


例3)
05 2 * * * root (コマンド > ログファイルのパス 2>&1) > /dev/null
   ↓
指定のログファイルにログを残すが、メールは送らない。



補足)
cron実行するスクリプトの文法チェックを行なうように設定しているが、いちいちどうでもいいようなチェックメッセージが毎回メールされてうっとうしい。
でも一応ログは残しておいて、後で参照したい。
・・・なんていう場合は「例3)」が個人的におすすめ。

遅ればせながら、本日Fedora9から10にアップグレードが完了。

参考にさせてもらったのはこちらのサイト
http://k4zmblog.dtiblog.com/blog-entry-129.html


ほぼそのまんまやり方を真似てみたが、コンソール画面で
#telinit3
がなぜか効かなかったので、仕方なくGUIはストップさせないでアップグレードを実行。

サーバとしてはスペックが高めのせいか、意外と早く、約50分程度で全て完了した。

自分の場合、ダウンロードパッケージ数975個、アップデート&クリーニング項目は1886項目であった。

致命的なエラーも出ず、思ったよりすんなり行った感じだったので良かった。

■アップグレードの確認

$ cat /etc/fedora-release

と打って、

Fedora release 10(Cambridge)

と表示されれば成功。


ただアップグレード中に、
/etc/pki/rpm-gpg/RPM-GPG-KEY-fedora-i386 からGPGキーをインポートしてください
みたいな警告が出たので、アップグレード完了後に

#rpm --import /etc/pki/rpm-gpg/RPM-GPG-KEY-fedora-i386

としてみたが、なぜか「インポートに失敗しました」という結果。

でもまあ、yumのインストールもアップデートも支障なさそうな感じなのでまあいいかということで無視。




ぱっと見、変わったと思った点は、「サービス」の起動・停止を実行する際にrootパスワードを要求されるようになったってことくらいかな。とりあえず。


あとは、勝手にFireFoxがアップデートされて、今まで綺麗だったページのレイアウトが崩れてしまったことくらいか・・・。
前回紹介したMTプラグインの一つ「hirosikitextfilter」で、記事内容にURLが含まれていたときに自動リンク(URL補完)させる件だが、デフォルトのままだと、URLのGETクエリに含まれる
「?aaa=111&bbb=222&ccc=333」とかの部分が、
   ↓
「?aaa=111&bbb=222&ccc=333」(実際は全て半角)

みたいな感じに変換されてしまう。

ただHTMLに表示するだけならいいが、URLをクリックしてCGIとかにクエリを渡したとき、nameとvalueの関係が、

aaa ---> 111
amp ---> 未定義
bbb ---> 222
amp ---> 未定義
ccc ---> 333

(※「;」(セミコロン)がデリミタ扱いになる理由は分からないが、掲示板などで調べたら、結果が上記のようになることがわかった。)


になってしまい、無駄なパラメータ(ampの部分)が発生してしまうので、
「hirosikitextfilter.pl」78行目の

$u =~ s/\&/\&/g;

の部分を削除。

試しに記載↓
http://hogehoge.jp/get.php?a=111&b=222
↑「&」が「&」にならずそのままなら成功。



それと、cronからのメールで、

Odd number of elements in hash assignment at /home/****/public_html/mt/plugins/hirosikitextfilter.pl line 12.
Odd number of elements in hash assignment at /home/****/public_html/mt/plugins/hirosikitextfilter.pl line 16.

(※直訳
hirosikitextfilter.plの12行目と16行目でハッシュを定義するとき、KEYとVALUEの合計が奇数(対になってない)ですよ みたいな感じ。)

と毎回怒られるので、よくみたら13〜15行目が

%inTags =
split( ',',
'a,,pre,,script,,object,,embed,'
);

となっているので、最後のembedのあとにカンマをもう一つ追加して修正。

17〜20行目も同様に修正。

したが、まだ同じエラー(というか警告)が出る。

仕方がないので、

%inTags =
split( ',',
"'a',','pre','','script','','object','','embed',''"
);

みたいに全部空文字列で定義してやったらOKになった。

てゆうか、これならsplitしないで普通に定義したほうがスマートのような・・・
サーバも本格稼働させるということで、無停電電源装置(UPS)を導入することにした。

本格稼働と言っても、ディスクスペースを他人に提供したりメルマガスタンドを起こすわけでもなく、サーバ自体も自宅サーバレベルなのでUPSも家庭用のタップ型を使うことにした。

目的としては、停電による電源停止時に1分以上のバックアップ電源を確保できるようにする。
1分というと短すぎるだろと思うが、日本の停電復旧時間はほぼ1分以内。
電力会社のシステム上、送電線が破損した場合でも、別の送電線から迂回させて各家庭に電力を供給するしくみになっている。その切り替えに要する時間がほぼ1分以内なのである。
送電線が袋小路(物理的に電源を迂回させられない)であったり、致命的な設備の破損があり、人力で復旧させなければいけない場合をのぞき、ほとんどの場合電力供給経路の切り替えで対処ができる。

逆に言えば1分以内で復旧できない場合は、1時間かかるかもわからないし、24時間以上復旧されないこともあるので、そんな不確定要素のために莫大なバックアップ電源を確保する必要は、個人運営レベルではないと思われる。
(もちろん病院など建築物に予め非常電源設備が併設されているものは対象外)

次に、バックアップ電源の必要W数だが、今回バックアップ電源が必要な機器は、

1.ブロードバンドルータ(NTT PR200NE)
2.サーバ本体(Dell)
3.モニタ(Dell)
4.ハブ(Logitec製)

の4つで、合計の最大出力数が
250+98+5+5.5 = 358.5(W)
なので、約360W出力時にバックアップが1分以上もつ製品を選ばなければならないということになる。
(出力数の計算方法:http://tuuhan-seikatu.com/31/42/000072.php

製品自体はもAPC、オムロン始めいろいろあるが、バッテリ寿命が4年であるということと、値段も手頃ということ、結構昔から販売されていて売れ行きがいいということで、今回はAPC社製の「ES725」を購入した。
http://www.apc.co.jp/products/ups/es500_725.html

これなら、CPUフル回転の最大出力時でも3〜4分は持つことになる。
http://sturgeon.apcc.com/Kbase.nsf/ForExternal/84EF2537B28CB63449256EAF003E4219?OpenDocument


設置の仕方としては、何も難しいことは無く、所定時間充電したら機器をつないでUPSの電源ボタンを押すだけ。

また、この製品には電源管理ソフトが付属でついているが、Linuxには未対応のため、「apcupsd」(APCのUPSの電源状態を運営・保守するデーモン)をインストールした。

これの使用方法はいろんなところに紹介されているので、割愛する。
参考)http://kazuizm.com/2006/06/02-231431.php

ちなみに私の環境の場合、
# service apcupsd status とすると、

apcupsd (pid 2341) を実行中...
APC : 001,036,0882
DATE : Mon Jan 12 13:22:25 JST 2009
HOSTNAME : XXXXX.jp
RELEASE : 3.14.4
VERSION : 3.14.4 (18 May 2008) redhat
UPSNAME : APC ES725
CABLE : USB Cable
MODEL : APC ES 725
UPSMODE : Stand Alone
STARTTIME: Sat Jan 10 15:57:47 JST 2009
STATUS : ONLINE
LINEV : 104.0 Volts
LOADPCT : 15.0 Percent Load Capacity
BCHARGE : 100.0 Percent
TIMELEFT : 38.4 Minutes
MBATTCHG : 5 Percent
MINTIMEL : 3 Minutes
MAXTIME : 0 Seconds
SENSE : High
LOTRANS : 090.0 Volts
HITRANS : 110.0 Volts
ALARMDEL : Always
BATTV : 13.4 Volts
LASTXFER : Low line voltage
NUMXFERS : 0
TONBATT : 0 seconds
CUMONBATT: 0 seconds
XOFFBATT : N/A
STATFLAG : 0x07000008 Status Flag
MANDATE : 2008-10-11
SERIALNO : 3B0841X77324
BATTDATE : 2000-00-00
NOMINV : 100 Volts
NOMBATTV : 12.0 Volts
FIRMWARE : 821.y2 .A USB FW:y2
APCMODEL : APC ES 725
END APC : Mon Jan 12 13:23:00 JST 2009


という感じ。

バッテリ100%でアイドル時に38.4分モツんだったらまあまあかなといった所。

これらをWEBで管理できるcgiもrpmからインストールしようとしたが、パッケージが足りませんと怒られ、面倒くさいのでやめた(笑)
fedoraを始め多くのLinuxディストリビューションでは、OpenSSHが標準装備されており、サーバのリモート操作が容易にできるようになっている。

便利である半面、ユーザ名・パスワードの総当たり攻撃(brute forceアタック)は現在でも常習的に行なわれており、Logwatchなどの情報を見ると特にsshdを狙った攻撃が非常に多く、プログラムにより断続的に行なわれているのが分かる。


■とある日のLogwatch
################### Logwatch 7.3.6 (05/19/07) ####################


(中略)

--------------------- pam_unix Begin ------------------------

sshd:
Authentication Failures:
unknown (202.169.30.25): 1719 Time(s)
root (202.169.30.25): 393 Time(s)
unknown (65.90.252.67): 294 Time(s)
unknown (213.192.73.162): 127 Time(s)
unknown (125.35.11.211): 60 Time(s)
root (61.134.27.234): 59 Time(s)
root (65.90.252.67): 46 Time(s)
unknown (61.134.27.234): 42 Time(s)
root (125.35.11.211): 32 Time(s)
unknown (122.128.96.6): 28 Time(s)
root (122.128.96.6): 25 Time(s)
root (213.192.73.162): 15 Time(s)
apache (202.169.30.25): 5 Time(s)
hsqldb (202.169.30.25): 5 Time(s)
mysql (125.35.11.211): 5 Time(s)
adm (65.90.252.67): 4 Time(s)
avahi (202.169.30.25): 4 Time(s)
gopher (202.169.30.25): 4 Time(s)
smmsp (202.169.30.25): 4 Time(s)
distcache (202.169.30.25): 3 Time(s)
news (202.169.30.25): 3 Time(s)
unknown (202.165.235.2): 3 Time(s)
adm (61.134.27.234): 2 Time(s)
bin (65.90.252.67): 2 Time(s)
clamav (65.90.252.67): 2 Time(s)
daemon (65.90.252.67): 2 Time(s)
games (65.90.252.67): 2 Time(s)
gopher (65.90.252.67): 2 Time(s)
haldaemon (202.169.30.25): 2 Time(s)
halt (65.90.252.67): 2 Time(s)
lp (65.90.252.67): 2 Time(s)
mail (65.90.252.67): 2 Time(s)
mailnull (65.90.252.67): 2 Time(s)
mysql (202.169.30.25): 2 Time(s)
mysql (65.90.252.67): 2 Time(s)
news (65.90.252.67): 2 Time(s)
nfsnobody (202.169.30.25): 2 Time(s)
nfsnobody (65.90.252.67): 2 Time(s)
nobody (65.90.252.67): 2 Time(s)
operator (65.90.252.67): 2 Time(s)
rpc (65.90.252.67): 2 Time(s)
rpcuser (65.90.252.67): 2 Time(s)
shutdown (65.90.252.67): 2 Time(s)
smmsp (65.90.252.67): 2 Time(s)
sshd (65.90.252.67): 2 Time(s)
sync (65.90.252.67): 2 Time(s)
uucp (65.90.252.67): 2 Time(s)
adm (213.192.73.162): 1 Time(s)
amavis (202.169.30.25): 1 Time(s)
apache (213.192.73.162): 1 Time(s)
apache (61.134.27.234): 1 Time(s)
apache (65.90.252.67): 1 Time(s)
bin (202.169.30.25): 1 Time(s)
bin (213.192.73.162): 1 Time(s)
clamav (213.192.73.162): 1 Time(s)
daemon (202.169.30.25): 1 Time(s)
daemon (213.192.73.162): 1 Time(s)
dbus (202.169.30.25): 1 Time(s)
dovecot (202.169.30.25): 1 Time(s)
ftp (213.192.73.162): 1 Time(s)
games (202.169.30.25): 1 Time(s)
games (213.192.73.162): 1 Time(s)
gdm (202.169.30.25): 1 Time(s)
gopher (213.192.73.162): 1 Time(s)
halt (213.192.73.162): 1 Time(s)
lp (213.192.73.162): 1 Time(s)
mail (202.169.30.25): 1 Time(s)
mail (213.192.73.162): 1 Time(s)
mailnull (213.192.73.162): 1 Time(s)
mysql (122.128.96.6): 1 Time(s)
mysql (213.192.73.162): 1 Time(s)
mysql (61.134.27.234): 1 Time(s)
named (213.192.73.162): 1 Time(s)
named (65.90.252.67): 1 Time(s)
news (213.192.73.162): 1 Time(s)
nfsnobody (213.192.73.162): 1 Time(s)
nobody (213.192.73.162): 1 Time(s)
nobody (61.134.27.234): 1 Time(s)
nscd (202.169.30.25): 1 Time(s)
ntp (202.169.30.25): 1 Time(s)
operator (213.192.73.162): 1 Time(s)
operator (61.134.27.234): 1 Time(s)
polkituser (202.169.30.25): 1 Time(s)
postfix (213.192.73.162): 1 Time(s)
postfix (65.90.252.67): 1 Time(s)
pulse (202.169.30.25): 1 Time(s)
root (202.165.235.2): 1 Time(s)
rpc (213.192.73.162): 1 Time(s)
rpcuser (213.192.73.162): 1 Time(s)
shutdown (213.192.73.162): 1 Time(s)
smmsp (213.192.73.162): 1 Time(s)
smolt (202.169.30.25): 1 Time(s)
sshd (213.192.73.162): 1 Time(s)
sync (213.192.73.162): 1 Time(s)
tcpdump (202.169.30.25): 1 Time(s)
torrent (202.169.30.25): 1 Time(s)
uucp (202.169.30.25): 1 Time(s)
uucp (213.192.73.162): 1 Time(s)
Invalid Users:
Unknown Account: 2273 Time(s)


---------------------- pam_unix End -------------------------

(以下略)



かといって、SSHによる管理をやめてしまうと、うちのような小規模な団体だったらいいが、企業などでは、一元管理上、非常に業務上支障をきたすと思う。



このようなbrutet force攻撃に対しては昔から以下のような対策が慣例になっている。

・rootログインを不許可にする
 sshd_config ファイル内にて、
 #PermitRootLogin yes
    ↓
 PermitRootLogin no
 に変更後、sshd再起動。
・MaxStartupsを利用し、アクセス元に制限をかける
 参考)http://www.itmedia.co.jp/help/tips/linux/l0541.html
・IPを動的検知してファイアーウォールに登録する
 参考)http://www.otsune.com/diary/2004/10/29/7.html#200410297
・指定した期間に受け入れる(match する)パケットの数を制限
 参考)http://dsas.blog.klab.org/archives/50208645.html


しかし、いずれにせよ全てルーターから内側の対策術であり、少なからずCPUやパケットが無駄に浪費されていることに変わりはないし、IPフィルタリングにおいては、アクセス元を無作為に増やされると、それに伴ってこちらのテーブルやログもどんどん肥大化していっていしまう。

くだらないやつらのために、こちらの環境までアップデートを繰り返さなければならないのは非常に頭にくるので今回はsshのポートを変更することにした。


ポート番号は使用されていない番号(10000番代?)あたりで設定。

1./etc/sshd/sshd_configを

 #Port 22
   ↓
 Port 10004

 に変更。(※コメントアウトした状態だと勝手に22番が指定される)

2.ファイアウォールの設定で、22番ポートを閉じ、10004番ポートを新規作成しTCPを許可する。

3.ルータの静的マスカレード設定で、22番ポートを削除し、新しく10004番ポートを追加し開く。

4.sshデーモンを再起動する。


これだけでも、少なくても22番を想定してアクセスしてくるものは全てLANに侵入する前に跳ね返される。
MySQL(4.1.1以降)にて、2つのDATE型の値の差を求めるクエリ。
(※'2009-1-1'と'2009-1-8'であれば日数差は7。)

  2009-1-1から7日以上経過したレコードを返す場合。
-------------------------------------------------------------------------------------------------------
#$current = 本日の日付のDATE型

SELECT * FROM sample_table WHERE DATEDIFF('$crrent', '2009-1-1') >= 7

もしくは、

SELECT * FROM sample_table WHERE DATEDIFF('CURRENT_DATE()', '2009-1-1') >= 7
-------------------------------------------------------------------------------------------------------



 上記にhh:mm:ssを追加した場合
-------------------------------------------------------------------------------------------------------

SELECT * FROM sample_table WHERE DATEDIFF('$crrent 00:00:00', '2009-1-1 23:59:59') >= 7

または、

SELECT * FROM sample_table WHERE DATEDIFF('CURRENT_DATE() CURRENT_TIME()', '2009-1-1 23:59:59') >= 7

※結果は最初と同じ
-------------------------------------------------------------------------------------------------------




ステップメールの配信などに応用できる。

例)
user_table
+−−−−+−−−−−−−−−−−−−−−−−−+−−−−−−−−−−+−−−−−−−−−−−+
| ID  | MAIL        |  entry   | next_story |
+−−−−+−−−−−−−−−−−−−−−−−−+−−−−−−−−−−+−−−−−−−−−−−+
| 01  | hogehoge@hoge.jp |  2009-1-1 | 2     |
+−−−−+−−−−−−−−−−−−−−−−−−+−−−−−−−−−−+−−−−−−−−−−−+
     ・
     ・
     ・

登録日から指定日数経過した読者のレコードを求める例

SELECT * FROM user_table WHERE DATEDIFF('$current', entry) >= $day_interval and next_story=$tmp2 ORDER BY entry




その他日付関係操作の詳しい解説はこちら
http://www.limy.org/program/db/mysql/mysql_operators.html



無料のブログサービスだと、Seesaaとかlivedoorブログとか、携帯電話からの
メールをそのままブログ記事に反映させる機能をサポートしているものもあるが、
MTだと初期状態のままではこの機能は使えない。

そこでおすすめするのが、スカイアークシステムさんが開発した、MTプラグインの
一つである「MailPack」。
詳しくはこちら→ http://www.skyarc.co.jp/engineerblog/entry/4022.html

MTの個人無償ライセンス利用者に限り、こちらも無償でダウンロードできる。
(バージョンは1.1に限る)
また、プロ用で「MailPackPro」というのもあるらしいが、こちらは有償。
ただproじゃなくても、個人レベルでモブログする程度であれば、全く問題ないし、
Seesaaとかにも負けないくらい多機能なので、よっぽどのことがなければこれで
十分事足りると思う。


このプラグインを使うには以下のperlモジュールが必要なので、予めインストール
しておく。

・Net::POP3
・File::Basename
・File::Spec
・MIME-tools

SSLを利用する場合はさらに下記が必要。

・Mail::POP3Client
・IO::Socket::SSL

FCとかだと、yumから直接おとせるものもあるが、CPANに行けば全て揃っているので、
コマンド叩くのが面倒なら、全てブラウザからダウンロードしてmakeinstallした
ほうが早いかもしれない。


ちなみにCPAN用RPMのインストールの仕方と、perlモジュールインストール方法は以下。

コマンドラインからroot権限にて、
# yum -y install perl-ExtUtils-MakeMaker (cpan2rpmに必要なExtUtils::MakeMakerインストール)
   ↓
# yum -y install cpan2rpm (cpan2rpmインストール)
   ↓
※fedora10の場合
# yum -y install rpmdevtools ; rpmdev-setuptree (rpmbuildディレクトリ作成)
   ↓
何かperlモジュールをインストールしたい場合、
# cpan2rpm --no-sign --install File::Spec(File::Specパッケージをインストールする場合)


モジュールの準備ができたら、冒頭のURLからMailPack本体をダウンロード・解凍し、
MTのpluginsディレクトリ内に設置し、さらにmailpack.cgiの実行権限を755に変更。


次に、投稿専用のメールアカウントを作成しておく。
これは、GmailでもYahooメールでも、POP接続できるメールボックスであれば
何でも構わない。
自営サーバの場合は、ユーザを追加しておくだけで大抵のLinuxディストリビューション
なら勝手にメールボックスが作られるはず。

このプラグインは、指定時間になるとこの指定された受信メールBOXにPOPで
接続して、メールBOXからメールを削除しメール内容を記事としてMTに投稿する。

なので、投稿専用にしておかないと、投稿したくもない受信メールが勝手に記事として
投稿されてしまうので注意。


次に管理者権限でエディタを立ち上げ、/etc/cron.d/ 内に新規ファイルを作成し、

*/10 * * * * root cd (MTのメインディレクトリのパス); ./tools/run-periodic-tasks

と記述し「mt-task」とか適当に名前付けて保存。
(この場合は、10分おきにタスク起動→メール送信から早くて10分後にブログ記事に反映。)


その後MTにログインすると、DBのアップデートを尋ねられるので、「OK」。
   ↓
ログイン後、システムメニューに「メール投稿設定」という項目が追加されている。

「投稿先メールアドレスの追加」から各種設定を行なう。

ごっちゃになりやすいが、
「投稿先のメールアドレスを入力してください」の欄には、先ほど作った
投稿専用のメールアドレスを入力。
「メールアドレスのユーザ名を入力してください」の欄には、たいてい前者と同じか、@から前の部分を入力する。
(要は、メールソフトの設定でいうところの、POPサーバ接続ユーザ名)


続いて、「新規作成」→「ユーザ」で、メール投稿専用のユーザを作成。
(既存のユーザの設定を変更して行なうことも出きるが、おすすめしない。)

名前などは適当に決めてよいが、「電子メール」の項目は、「メールを送信する
送信元のメールアドレス」を設定する。
(携帯から送るのであれば、その携帯のメールアドレス)
※このプラグインは、送信元メールアドレスを見て、記事の投稿を行なえる
権限を持つユーザかどうかを判断している。


最後に、追加したユーザに「権限」の設定から、ユーザまたはライターなどの
権限を付与すれば設定完了。



試しに先ほど作成した投稿専用のメールアドレス宛に、メールを送ってみよう。

10分後に指定したブログに、メールの内容が記事として投稿されていれば成功だ。

うまくいかない場合は以下の理由が考えられる。

・メールの送信元アドレスがMTのユーザの電子メールと違う。
・MTのユーザに記事を投稿する権限がない。
・投稿専用アドレスのPOP接続ユーザ名・パスワードが間違っている。
・cronの設定が間違っている。
・cronデーモンが起動していない。
など。

MTシステムメニューの「ツール」→「ログ」を参照すれば大抵の原因は
わかるはず。

このアーカイブについて

このページには、2009年1月に書かれたブログ記事が新しい順に公開されています。

前のアーカイブは2008年12月です。

次のアーカイブは2009年2月です。

最近のコンテンツはインデックスページで見られます。過去に書かれたものはアーカイブのページで見られます。

ウェブページ

Powered by Movable Type 4.22-ja