2007年10月31日水曜日

rsyncの--dry-runオプションで実際に同期を取る前に確認する

便利なrsyncですが、たまに間違えて同期してはいけないのに同期してしまい、必要なファイルを上書きしたり消してしまったりといったことがあります。

そんなミスを防ぐには、--dry-runのオプションをつけてrsyncを実行します。

このオプションがあると実際にファイルの更新は行わず、更新ファイルのリストだけが表示されるので、同期前に確認ができるというわけです。
便利なので覚えておくと良いと思います。

2007年10月22日月曜日

生年月日から年齢を計算する簡単な計算式

(今日の日付-誕生日)/10000の小数点以下切捨て

これで計算できちゃうそうです。
すごい便利なので覚えておこう。
http://itpro.nikkeibp.co.jp/article/Watcher/20070822/280097/

2007年10月17日水曜日

phpの連想配列の添字は必ずダブルクオートで囲むこと!

以前、どこかのブログで

連想配列の添字は必ずダブルクオートで囲むこと!

というエントリを読んだことがあります。
つまり、こういうことです。

× $row[hoge]
○ $row["hoge"]


ダブルクオートなしとありでは、6倍近くパフォーマンスが変わってくるんだそうです。

というわけで、それを知ってからは必ず連想配列の添字はダブルクオートで囲むようにしていました。


そして今回、あるきっかけでこのダブルクオートの重要さを思い知ることになりました。。

きっかけは、2年近く前に作ったアプリケーションの動作が重たくなってきたことでした。2年の運用によってデータ量が多くなっており、ひとつの処理に数分かかって途中でタイムアウトしちゃったり、、といったことがしばしば。

ずっとDB側を疑っていました。SQLが効率悪いんじゃないか、とか、DBのチューニングが必要なんじゃないか、とか。

そしてある日、「そういえばこのアプリ、配列の添字をダブルクオートで囲んでいないな」ということを思い出しまして、特に重い処理を行うphpプログラムを選んで、添字をダブルクオートで囲んでやると、、、劇的に症状が改善!!

たしかに、このスクリプトでは何百回もループして同じ処理を繰り返しているので、積み重ねでどんどん重くなっていたんでしょう。たかがダブルクオート、されどダブルクオート、、、いい勉強になりました。

phpで使える正規表現

http://phpspot.org/blog/archives/2007/10/php_84.html
これは便利ですね。使わせていただこうと思います

2007年10月16日火曜日

sshパスワード無し公開鍵で接続でエラー(結局パーミッションエラーだった)

sshパスワード無し公開鍵接続のやり方については特に難しくないと思います。
ssh パスワード」とか「ssh_keygen」などで検索すると有用なドキュメントがワンサカでてきます。
なので自分の環境でもスンナリ行くかな、、、と思っていたんですが、思わぬ罠にはまりました。
すべてお膳立てしてさあ接続!とやっても
Permission denied (publickey,password,keyboard-interactive).

というエラーが出てしまうのです。
わからん、さっぱりわからん。rsaもdsaもダメだし、sshd_configの記述に間違いは見当たらない、、、
見落としがちな「~/.ssh」と「~/.ssh/authorized_keys」のパーミッションも問題なし。
そのまま悩むこと半日。
http://www.upken.jp/report/cronrsyncssh.html
こちらのページを見て、「そういえば、ログを見てなかった」という超初歩的なことを思い出した。
さっそく/var/log/secureをみてみると、
Authentication refused: bad ownership or modes for directory /home/hoge

というエラーが出ていた。
そう、「~/.ssh」 と 「~/.ssh/authorized_keys」だけじゃなく、ホームディレクトリのパーミッションも適切に設定する必要があったのです(700じゃないとダメ)
パーミッションを直して再度試してみたら、、、無事接続できました!!
トラブったらまずはログを見る。鉄則ですね。
性格の問題なのか、たまーに忘れてしまうんです。。

sshd_configの設定内容にミスがないか確認する

# /usr/sbin/sshd -t


記述にミスがある場合のみ、その旨が表示されます。
リモートから接続している場合、sshd_configの設定が間違っている状態でrestartすると取り返しのつかないことになりかねないので、テストしてからrestartしたほうが安全です。
ちなみにCentOSでのsshd_configのパスは「/etc/ssh/sshd_config」。

2007年10月8日月曜日

mrtgのインストール・設定

mrtgを入れました。
まずはyumでインストール。

# yum install net-snmp
# yum install net-snmp-utils
# yum install mrtg

/etc/snmp/snmpd.confを編集。

# sec.name source community
#com2sec notConfigUser default public
com2sec local localhost private
# groupName securityModel securityName
#group notConfigGroup v1 notConfigUser
#group notConfigGroup v2c notConfigUser
group MYROGroup v1 local
group MYROGroup v2c local
group MYROGroup usm local
# Make at least snmpwalk -v 1 localhost -c public system fast again.
# name incl/excl subtree mask(optional)
#view systemview included .1.3.6.1.2.1.1
#view systemview included .1.3.6.1.2.1.25.1.1
view all included .1 80
# group context sec.model sec.level prefix read write notif
#access notConfigGroup "" any noauth exact systemview none none
access MYROGroup "" any noauth exact all all none
#disk / 10000
disk / 10000

そしてsnmpdを起動。

# /etc/rc.d/init.d/snmpd start
# chkconfig snmpd on

/etc/mrtg.mrtg.cfgの編集。
※以下の例は、メモリは498516、swapは1052248

WorkDir: /var/www/mrtg
Refresh: 300
Language: eucjp
### Traffic Analysis ###
Target[traffic]: 2:private@localhost:
MaxBytes[traffic]: 12500000
Options[traffic]: growright
Title[traffic]: Traffic Analysis
PageTop[traffic]:

Traffic Analysis


###CPU Used###
Target[cpu]: .1.3.6.1.4.1.2021.10.1.5.1&.1.3.6.1.4.1.2021.10.1.5.2:private@localhost
MaxBytes[cpu]: 100
Unscaled[cpu]: dwmy
Options[cpu]: gauge, absolute, growright, nopercent
YLegend[cpu]: CPU Load Av. (%)
ShortLegend[cpu]:%
LegendI[cpu]: 1minute
LegendO[cpu]: 5minute
Legend1[cpu]: 1minute(%)
Legend2[cpu]: 5minute(%)_
Title[cpu]: CPU Load
PageTop[cpu]:

CPU Load Average


### Memory Used ###
Target[mem]: .1.3.6.1.4.1.2021.4.6.0&.1.3.6.1.4.1.2021.4.4.0:private@localhost
MaxBytes1[mem]: 498516
MaxBytes2[mem]: 1052248
Unscaled[mem]: dwmy
Options[mem]: gauge, absolute, growright
YLegend[mem]: Memory Used (MB)
ShortLegend[mem]:Bytes
kilo[mem]: 1024
kMG[mem]: k,M,G,T,P
LegendI[mem]: Real
LegendO[mem]: Swap
Legend1[mem]: Physics Memory(MB)
Legend2[mem]: Physice Swap(MB)
Title[mem]: Memory Used
PageTop[mem]:

Memory Used


### Disk Used ###
Target[disk]: .1.3.6.1.4.1.2021.9.1.9.1&.1.3.6.1.4.1.2021.9.1.9.1:private@localhost
MaxBytes[disk]: 100
Unscaled[disk]: dwmy
Options[disk]: gauge, absolute, growright, nopercent, noinfo
YLegend[disk]: Disk Used(%)
ShortLegend[disk]: (%)
LegendI[disk]: / Disk used
LegendO[disk]: / Disk Used
Legend1[disk]: / Disk used
Legend2[disk]: / Disk used
Title[disk]: Disk Used
PageTop[disk]:

Disk Used



mrtgを実行。

# mrtg /etc/mrtg/mrtg.cfg
# mrtg /etc/mrtg/mrtg.cfg
# mrtg /etc/mrtg/mrtg.cfg

インデックス作成。
indexmaker /etc/mrtg/mrtg.cfg > /var/www/mrtg/index.html

以上ですべて完了。
今のところはうまく動いているようです。
参考サイト
http://www.k2.dynsite.net/redhat/14.MRTG.htm
http://centossrv.com/net-snmp-mrtg.shtml
http://fedorasrv.com/mrtg.shtml
http://crosss.jugem.jp/?eid=76

2007年10月7日日曜日

ウェブサーバーの設定(ServerTokens,ServerSignature,expose_php)

apache+phpはデフォルトでは第三者に対してサーバーのバージョンを公開する設定になっています。
攻撃者に余計な情報を与えないようにするため、以下のように設定しました。
・httpd.conf
ServerTokens ProductOnly
ServerSignature Off
・php.ini
expose_php = off

2007年10月6日土曜日

mtaをsendmailからpostfixにする

まずはyumを使ってサクサクっとpostfixをインストール。
http://fedorasrv.com/postfix.shtml
↑こちらのページを参考にさせていただきました。
で、MTAの切り替えにはalternativesというコマンドが使えることを知りました。
# alternatives --config mta

これを実行してpostfixをmtaにすると、シンボリックリンクを張ったりしてmta入れかえをしてくれるんです。いやー便利だ。

2007年10月5日金曜日

PECL(PHP拡張モジュール)でモジュールを導入する

jsonモジュールを使おうと思ったら、php5.1系だったのでモジュールが含まれていない。というわけでモジュールを入れようと思い、調べてみたらpeclコマンドで簡単に導入できるとのこと。
こんな感じ。
# pecl install json

pearと全く同じですね。
ただ、自分の環境だと
running: phpize
sh: phpize: command not found

というエラーが出てしまいました。
phpizeが、、ない
phpizeはphp-develというパッケージを入れればOKです。ソースコンパイルの場合はデフォルトで付属します。
# yum install php-devel

やり直したら、見事成功!
で、php.iniに
extension=json.so

を追加して完了です。

2007年10月4日木曜日

Linuxのカーネルバージョンを調べるには

unameコマンドで分かります。
uname -m //CPUのタイプを表示する
uname -n //PCのホスト名を表示する
uname -r //カーネルのバージョンを表示する
uname -s //OS名を表示する
uname -v //OSのリリース日を表示する
uname -a //すべての情報を表示する
http://www.atmarkit.co.jp/flinux/rensai/linuxtips/068infokernelver.html

yumでパッケージを削除するには

新しいサーバーが届いて、現在環境構築中。
yum関係をいじっており、yum list installed したらpostgresが入っていた。
postgresは使わないのでアンインストールしたい。そんなときはグループごとまとめて削除するのが楽です。
# yum groupremove "PostgreSQL Database"
まとめて一気に引っこ抜けるので、すごくさっぱりします。
http://www.atmarkit.co.jp/flinux/rensai/linuxtips/678yumgroup.html

2007年10月2日火曜日

selinuxを無効にする

CentOS4.5をインストールすると、selinuxというのがもれなくインストールされます。(インストール時のオプションだったかも)
selinuxについてまったく知らなかったので、軽く調べてみました。
selinuxは「Security Enhanced Linux」の略で、セキュリティを高めるためのものだそうです。しっかり設定すると堅固なセキュリティを組むことができるんだそうです。
なるほど、機会があったらしっかり勉強してみるのもいいかもしれないな、、、とは思うんですが、いまのところまだあまり普及していない様子。また、きちんと理解しておかないとトラブルが起こった時の原因の切り分けにおいて手間がかかってしまうそうです。
導入するのは時期尚早かな、、、という感じ。
というわけで無効にすることに。

# vi /etc/selinux/config
SELINUX=enforcing
 ↓
SELINUX=disabled

これで再起動後にはselinuxは無効になります。
再起動せずに無効にしたい場合は、

# /usr/sbin/setenforce permissive

でOK。

iptablesの勉強

iptablesについて、けっこう頑張って勉強したのでまとめてアップします。
iptablesは多機能でいろんなことができるようですが、この記事では単体サーバーで、外部からのアクセスを全部遮断し、サービスを行うポートのみ特定(または不特定)のユーザーに対して開放するという点のみを書きます。ルーター機能とかについては触れません。
まずiptablesコマンドの使い方ですが、説明は割愛します。この記事の最後に参考サイトをリンクしたのでそちらをごらんください。
さっそくですが、具体例を示します。
以下は入ってくるパケットを全部拒否(DROP)し、80番ポート(http)は全開、22番ポート(ssh)は192.168.1.0/24のみ許可という設定です。

 1. iptables -P OUTPUT ACCEPT
 2. iptables -P FORWARD DROP
 3. iptables -P INPUT DROP
 4. iptables -A INPUT -i lo -j ACCEPT
 5. iptables -A INPUT -p icmp -j ACCEPT
 6. iptables -A INPUT -m state --state ESTABLISHE,RELATED -j ACCEPT
 7. iptables -A INPUT -p tcp --dport 80 -j ACCEPT
 8. iptables -A INPUT -p tcp --sport 80 -j ACCEPT
 9. iptables -A INPUT -p tcp -s 192.168.1.0/24 --sport 22 -j ACCEPT
10. iptables -A INPUT -p tcp -s 192.168.1.0/24 --dport 22 -j ACCEPT

行ごとに説明します。
まず1~3行目。「-P」オプションは基本ルールの設定です。後述する「-A」のルールに当てはまらないパケットにはすべて「-P」の処理が行われます。

1. 内部から外部へのパケット(OUTPUT)を許可(ACCEPT)
2. サーバーを経由して転送されるパケット(FORWARD)をすべて破棄(DROP)
3. 外部から内部へのパケット(INPUT)をすべて破棄(DROP)

4~6行目はそれぞれ以下の意味を持っています。

4. ループバックアドレスからのパケット(自分自身からのパケット)を許可
5. icmp(ping)のパケットを許可
6. ESTABLISHED(確立済みのコネクション)とRELATED(新しいコネクションだがFTPデータ転送やICMPエラーのように既存の接続に関係する)のパケットを許可

7~10行目は特定ポートでのサービスへのパケットの処理です。

7. 80番ポートへのパケットを許可(dportは宛先ポートの指定)
8. 80番ポートへのパケットを許可(dportは送信元ポートの指定)
9. 22番ポートへのパケットを192.168.1.0/24に対してのみ許可(dportは宛先ポートの指定)
10. 22番ポートへのパケットを192.168.1.0/24に対してのみ許可(dportは送信元ポートの指定)

以上でこのサーバーは80と22以外は外部からのアクセスはすべて破棄されるようになりました。
さて、ここでいくつか注意点を。
まず上記のコマンドは、コンソールから実行しないといけません。リモートから実行した場合、3行目を実行した時点で「外部から内部へのパケット(INPUT)をすべて破棄(DROP)」されてしまうので、切断されてしまいます。
というわけなので、リモートからの作業の場合には「iptables -P INPUT DROP」は一番最後に実行してください。
あと6行目の「iptables -A INPUT -m state --state ESTABLISHE,RELATED -j ACCEPT」。
この設定をしておけばたとえ途中で設定を間違えてしまっても、その時点で接続が切れることはなくなります。たとえばsshのルールを間違えて設定したとしても突然接続が切れたりしないので安心です。
だいたいこんなところです。
あと実際に本番機でルールを設定する時は、iptablesコマンドを使うより/etc/sysconfig/iptablesのスクリプトを編集したほうがいいと思います。上の例をスクリプトにすると、

:INPUT DROP [0:0]
:FORWARD DROP [0:0]
:OUTPUT ACCEPT [0:0]
-A INPUT -i lo -j ACCEPT
-A INPUT -p icmp -j ACCEPT
-A INPUT -m state --state RELATED,ESTABLISHED -j ACCEPT
-A INPUT -p tcp -m tcp --dport 80 -j ACCEPT
-A INPUT -p tcp -m tcp --sport 80 -j ACCEPT
-A INPUT -s 192.168.1.0/255.255.255.0 -p tcp -m tcp --sport 22 -j ACCEPT
-A INPUT -s 192.168.1.0/255.255.255.0 -p tcp -m tcp --dport 22 -j ACCEPT

となります。ルールを有効にするには「/etc/init.d/iptables restart」。
コマンドは実行した瞬間にルールが適用されるのでミスが起こりやすいので、その点スクリプトだと安全です。
最後に、iptablesはテスト環境を用意して実際にコマンドを試しながら勉強するのがいいと思います。自分もそうしましたが、習うより慣れろなところがあるので、そうすることをおすすめします。(ぶっつけ本番で失敗したら大変なことになっちゃいますしね)
以下、勉強の参考にさせていただいたサイトです。
http://linux.shoukun.com/security/iptables.htm
http://www.fmmc.or.jp/fm/nwts/rh_linux/ch6/6_2_1_4.html
http://kurosuke.net/linux/iptables.shtml
http://www.linux.or.jp/JF/JFdocs/packet-filtering-HOWTO-7.html
http://cyberam.dip.jp/linux_security/iptables.html
http://www.asahi-net.or.jp/~bk3k-andu/linux/tips/iptables4.html
http://www.d3.dion.ne.jp/~koetaka/router.html
※追記
/etc/sysconfig/iptablesはデフォルトでは存在しません。
# /etc/rc.d/init.d/iptables save
を実行すると保存されます。

2007年10月1日月曜日

特定のパッケージだけyumのアップデート対象から外す

/etc/yum.confの、[main]のセクションに
exclude=アップデートから外したいパッケージ名

とすればOK。
ワイルドカードも使える。
exclude=kernel*

カーネルを更新すると最悪起動しなくなってしまうというリスクもあるので、自分の環境ではこのように設定しています。
参考
http://www.atmarkit.co.jp/flinux/rensai/linuxtips/596noupyum.html