2009年3月30日月曜日

「ノート型コンピュータにUSB HDD」に気をつけろ

再びコンピュータネタ。今回もFreeBSDであげているサーバーのお話。タイトルを見たら想像つくと思うけど,ノート型マシンにFreeBSDを入れて,サーバーとして使っているが,バックアップをしようと思い,USB接続のHDDをつないでみた。つないだのは2.5''のポータブルHDD。どこ製だっけ?忘れてしまった。とりあえず他でバックアップ用に使っていたポータブルHDDの容量が足りなくなってしまったので,新たに購入して,余った奴をFreeBSDのバックアップ用に使った。手順はと言うと,まず,
(1) sysinstall --> Configure --> Fdisk でfdiskの実行。
確か,これでフォーマットをしたことになると思う。HDDをいくつのドライブに切るかとか,どのフォーマットでフォーマットを行うか,などの指定をする。変更の書き込みを確実に行うために「W」を押した方がよい。終了は「Q」。次に
(2) sysinstall --> Configure --> Label
これで /xxx などのドライブのラベルを書き込むことができる。ここでも変更の書き込みを確実に行うために「W」を押した方がよい。終了は「Q」。書き込みをしたら,いっぱい数字が出たはず((1)の作業の後だっけ?)
 次にマウントポイントを作っておく。
(3) mkdir /xxx
(2)の作業と整合性を持たせておいた方がいいはず。そして,まずは
(4) mount -t ufs /dev/da0s1d /xxx
でマウントしてみる。そういえば,/dev/da0s1dってのはどうやって知ったんだっけ?dmesgかな?/var/log/messagesかな?(2)の作業を終えたらどれかのメッセージで読み取れた。うまくいけば、/etc/fstabに以下の行を加える。
/dev/da0s1d             /xxx          ufs     rw              2       2
ufsはFreeBSDのファイルシステムであることを表し、rwは読み書き可能、2 2はダンプコマンドと,起動時のfsckをする順番であり,ルートが1,それ以外は順に番号をふればいいみたい。
 さて,上記の作業で無事バックアップ用の外付けHDDをFreeBSDにつけれたので,早速rsync + cronでバックアップさせるべく,scriptを用意した。そして,バックアップを始めた。すると数分してマシンが凍った!!なんてことだっ!もしかしてHDD壊れてた?あるいはマシン内臓のHDDが壊れた??かなり焦ってしまった。仕方ないので,マシン本体の電源ボタンを長押しして強制終了。そして再び電源を入れてみた。HDDが物理的に壊れたんじゃなさそうな雰囲気だった。でもしっかりファイル情報は壊れていたみたいで,エラーがでた。その後,数回強制終了と電源オンを繰り返したが,ある時は「xxxの情報が壊れてる。Help !!」みたいなメッセージが出て,root用のプロンプトがでたり,ある時はfsckで「xxxの情報がおかしい。直すか?」みたいなメッセージが出たりした。ここで焦ってはいけない。rootのプロンプトが出た時は,折角なので手動でfsckをかけるのがよい。
# fsck /dev/ad0s1a
みたいにね。特に起動ディスクは起動後はfsckがフルにかけれないので,この場で行うのがよいみたい。手動だろうが自動だろうがfsckが起動して,もし「xxxの情報がおかしい。直すか?」と言われたら,基本的に「y」を押しておいた。そしたらなんとか復帰してくれた。でもまたバックアップしようとするとマシンが凍る!,の繰り返しだった。困ったぞ。そもそも何が悪いんやろ?仕方ないので,バックアップを細切れにしたりしてみた。そうこうするうちに,バックアップする量が少ないと上手くいくが,大量(大きなファイルとか数が多い)にすると凍るみたいだった。そういえばやたらとマシンが熱い。もしかしたら外付けのドライブを駆動するのに電源がアップアップなのかもしれないと思い,電源つきのUSBハブを挟んでみた。すると,トラブルが起きなくなった。そっか,外付けのHDDは場合によっては危険なのか。それと,今は多少空気の流れが悪いところにマシンを置いているので,あまり激しくするとマシンに負荷がかかりすぎて,マシンの温度が上るのも悪さをしているかもしれない。とりあえず外付けHDDとマシンの間に電源つきのUSBハブを挟んで,かつ最初のバックアップ(ほぼ全部をコピーするので時間かかる)の時だけ,マシンを風通しのよいところにおいてバックアップしてみた。そしたら,今のところトラブルは起こっていない。状況を変えるといろんなトラブルが起こるねぇ。

2009年3月25日水曜日

onSubmitで,戻り値がfalseなのにsubmitが実行されてしまう

cgiとJavaScriptを使ってweb siteをいじっている。その中ではformを使って同じcgiにPOSTでいろんな情報を投げている。その際,入力値が複数あるのだが,入力値の間違い等をformを飛ばした後(submitした後)に判断をするんじゃなくて,飛ぶ前(submitした直後で次のプロセスの直前)に判断をさせたいと思った。どうするか?webで検索すると,
<form action="http://xxxx.xxxx.xxx/yyy.cgi" method="post" onSubmit="zzz();">
を使うとでてくる。ここで zzz() はJavaScriptで書かせた関数。この関数 zzz() の戻り値を false にすると,submitがキャンセルされる,と書いてある。なので、zzz() の中で入力値の判断を行い、最後に false を返せば、submitされずに入力画面のままとなるはず。これはいい,と思ってさっそくJavaScriptを書いてみた。
 ところがやってみるとこれがうまくいかない。確かに zzz() って処理をしているが,submitがキャンセルされない。なんで??いろんなサイトを見てもその点については書いてくれてない。困った。実は1ヶ月ほど前にも似たような状況になって,あきらめて処理を変更した,というケースがあった。今回もあかんかな?と思ったら,ブログサイトでその件について書いてあるところがあった。でも,そのサイト忘れちゃった。その内容はというと,
<form action="http://xxxx.xxxx.xxx/yyy.cgi" method="post" onSubmit="zzz(); return false;">
のように,onSubmitで実行する関数のところに,return false; ってのを書いておく,って作戦。そうしないとzzz()から戻ってきた時に,submitが実行されてしまうらしい。return false; ってのを入れておくと確かにうまくいった。ちゃんと submit がキャンセルされて、入力画面のままになった。他の onSubmit について書いてるサイトではこの記述を見なかったけど,みんな苦労してないのかなぁ??それともそのようなトラブルにあった事ないのかなぁ?
 そういえば,上記のようにするとreturn false;で戻った時に確かにsubmitはキャンセルされるが,困ったことに今度はsubmitがうまくいかなくなった。その時どうしたかというと,xxx()の処理の最後に
document.yyyyy.submit(); return false;
ってのを入れておいた。そしたらOKの時にはちゃんとsubmitして,途中でreturn false;で戻った時にはちゃんとsubmitがキャンセルされてた。よかったよかった。

2009年3月19日木曜日

MacでもJcode.pmとNet::SMTP::TLS

先日FreeBSDでJcode.pmを使った話をしたが,Mac OS-Xも基本的にFreeBSDなので,そちらでもJcode.pmを使いたくなった。で,いろいろ検索してみた。するとmakizou.comというのがひっかかった。読んでみると,
# perl -MCPAN -e shell
とすればいいみたい。なんや,FreeBSDと同じやんか(って,基本はFreeBSDだから当たり前?)そこで,さっそく実行~。FreeBSDの時と同じような質問をいっぱいされたけど,ほとんどそのままリターン。唯一はmirrorサイトを選ぶのに,地域(Asia)と国名(Japan)ってのを数字で選んだぐらい。そしたらなんかいけたみたいやった。で,さっそく
nohighlight pre> install Jcode
としてみた。するとなんだかうまくいったみたいで,最後に
.....
Running make install
Installing /Library/Perl/5.8.8/Jcode.pm
Installing /Library/Perl/5.8.8/Jcode/Nihongo.pod
Installing /usr/local/share/man/man3/Jcode.3pm
Installing /usr/local/share/man/man3/Jcode::Nihongo.3pm
Writing /Library/Perl/5.8.8/darwin-thread-multi-2level/auto/Jcode/.packlist
Appending installation info to /System/Library/Perl/5.8.8/darwin-thread-multi-2level/perllocal.pod
/usr/bin/make install -- OK
というのが出て,インストールが終了した。どこにインストールされたんだろ?Encode.pmのように最初から入ってるモジュールは
/System/Library/Perl/5.8.8/
に入っているから,そこにインストールされるかと思いきや,別の場所だった。使えるのかね?と思ってさっそくテストしてみた。そしたら普通のFreeBSDでもMac OS-Xでも同じ結果になった。一応動いていそうだ。
 となると,Net::SMTP::TLSもインストールしてみたくなった。というか,こっちを使いたかったんだけどね,ほんとは。
cpan> install Net::SMTP::TLS
としてみた。結果は
.....
Manifying blib/man3/Net::SMTP::TLS.3pm
Installing /Library/Perl/5.8.8/Net/SMTP/TLS.pm
Installing /usr/local/share/man/man3/Net::SMTP::TLS.3pm
Writing /Library/Perl/5.8.8/darwin-thread-multi-2level/auto/Net/SMTP/TLS/.packlist
Appending installation info to /System/Library/Perl/5.8.8/darwin-thread-multi-2level/perllocal.pod
/usr/bin/make install -- OK
だって。FreeBSDで作ったテストのスクリプトもちゃんと働いたぞ。
 おぉ,これで快適CPAN生活がMac OS-Xでもいけるやん。FreeBSDやとportsとCPANがごちゃごちゃになるので,基本的にはportsから入れるようにしてる。MacもMacPortsがあるからやってみないといけないかなぁ?
 そうそう,最後はちゃんと
cpan> exit
としてCPANから抜けておきましょう。

追記:Mac OS 10.6 (Snow Leopard) にアップグレードしてみた。
すると、crontabで設定しておいたPerlスクリプトが上手く働かなくなってしまった。
どうやらJcode.pmやTLS.pmが使えないみたい。
何故かな?って思ったら、Perlのバージョンが上がっていた。
そこでCPANからJcode.pmを再インストールしようと思った。
そしたら、何故かうまくインストールできなかった。
そういえば、Xcodeをインストールしてなかったなぁ、と思い出したので、Mac OSのインストールDVDをいれて、Xcodeをインストールしてみた。
そしたらCPANからのインストールもうまくいった。
いやぁ、めでたしめでたし

2009年3月17日火曜日

FreeBSD,Perlで,プロバイダの認証あり587番ポートへのメール送信

 Net::SMTP::TLS は2006年1月以来更新が止まっていて,2016年時点ではすでに非推奨になっている。 そこで,2016年11月に FreeBSD で,Perl で gmail からメールを送る:Net::SMTP::TLS をやめて,Net::SMTP,IO::Socket::SSL,Authen::SASL を使うことにした というのを書いたので,そちらも参照してみて欲しい。
 後日 FreeBSD,Perl スクリプトで,GmailのSMTPからメールを送るというのを書いた。 そちらも参考にしてみて欲しい。
とあるプロバイダの下にあるサーバーにいろいろと作業をさせているが,そいつからのメールを受け取りたい時があった。サーバーではPerlで作業をさせている(cgiやけど)ので,Perlでメールを送りたいと思ったが,プロバイダの下流なのでちょっと制限があった。その話。

プロバイダはスパムメールを避けるために,SMTPの認証を要求してくる。さらにサブミッションポートが587番になっている。そこにPerlからメールを送りたい,というのが今回のミッション。きっとCPAN辺りにいいモジュールがあるに違いないと思って検索してみた。今回ヒットしたのが,Net::SMTP::TLSとかNet::SMTPなど。Net::SMTPもSASL認証(SMTP-AUTH認証)をしてくれるが,サブミッションポートの指定の仕方がわからなかったので,今回はNet::SMTP::TLSを使ってみることにした。ただし,名前の通りTLS(暗号化通信)を使うためのモジュールなのだが,うちのプロバイダはTLSを使うとなっていないので,TLSを使わない,という指定が必要だった。

2009年3月15日日曜日

dsa認証のやり方(FreeBSDとwindows)

前々回の投稿でパスワード認証を禁止したが,その際,dsa認証を使うのがよい,と書いた。今回はその具体的な方法を書いておこう。筆者はいろいろな都合で,windowsマシンからFreeBSDのマシンに入って作業をすることが多い。なので,(1) FreeBSDの場合,(2) MacintoshのOS-Xの場合,(3) windowsのPuTTYを使う場合,について書いてみる。

2009年3月12日木曜日

FreeBSD:sshサーバーに対する辞書攻撃の防御

FreeBSDでsshをあげているが,かなりの頻度で辞書攻撃されている。webサーバーをあげていて,知り合い(同窓会)を相手にしているので,誰かのマシンがウィルスに感染でもしているのだろうか?基本的にこのサイトは誰にも言ってないから,どっかから情報が漏れているに違いない。ま,でも知られた以上は仕方ないので,攻撃を遮断しないといけない。一応passswordログインはできないようにしているが,攻撃されている間は何度もアクセスしてくるので,回線に負荷をかけるし,auth.logは増えるし,とにかく気に入らない。ということで辞書攻撃の対策を探ってみた。検索語は「FreeBSD 辞書攻撃」としてGoogleにお世話になった。幾つか出てきたが,挑戦してみたのは,ktj Dragonさんのサイト。maxlogins.plというPerlスクリプトを使うパターンらしい。やり方は,何度もsshでアクセスしようとするIPをブラックリストとして,ログファイル(/var/log/maxlogins)に書き込むらしい。で,それを使って /etc/hosts.allow で /var/log/maxlogins にあるIPからの接続を拒否してしまうらしい。

2009年3月5日木曜日

FreeBSD:やっとsshdでパスワードによるログインを禁止できた

今まで数年FreeBSDを運用してきたが,ひとつだけ解決できていない問題があった。それはsshdへのパスワードによるログインの禁止。よくネットで検索すると,/etc/ssh/sshd_configで
PasswordAuthentication no
として,
/etc/rc.d/sshd restart
とすればよい,と書いてあるが,これがうまくいかない。何故かパスワードでログインできてしまう,ということが多々あった。jail環境下でweb siteをあげたりしているので,どうしてもパスワードログインができないようにしかったのだが,それがやっとできた。どうしたかというと,/etc/ssh/sshd_configで
PasswordAuthentication no
ChallengeResponseAuthentication no
UsePAM no
とした。特に2行目のChallenge...が必要だった。これがないとどうもパスワードでのログインに挑戦させてくれてしまうようだった。これを「no」にしたとたん,パスワードによるログインができなくなってしまった。これってどのリリースからあるんやろ?以前の場合はこれを気にしなくてもパスワードによるログインを禁止できたのかなぁ?このChallenge...はデフォルトでyesになっている。それやったら折角「PasswordAuthentication no」ってしてもあかんやん。sshd_configのコメントにも何か書いておいてほしいなぁ。今までの/var/log/auth.logやdaily_status_security.logなんかを見ると,辞書攻撃のオンパレードになってる。これで一気に辞書攻撃が減るかなぁ???
 ちなみにパスワード認証を禁止するためには他の認証方法が必要。ワンタイムパスワードやdsa認証,rsa認証など多数あるけど,とりあえずはdsa認証ぐらい使えるようにしておきましょう。
======================================================================
(追記)
やっぱり辞書攻撃は減らなかった。辞書攻撃が減らないのは考えてみたら当然。辞書攻撃はいろんなuser名でログインを試みる攻撃なので,たいていがInvalid userになって認証まですすめない。一方パスワード認証を禁止した効果は認証しようとして初めて現れる。そりゃ辞書攻撃は減らないわなぁ。仕方ないから次の投稿「辞書攻撃」に挑戦してみた。