« 2006年11月 | メイン | 2007年01月 »

2006年12月 アーカイブ

2006年12月04日

syslogサーバを構築してログの一元管理

複数台のUNIXマシンを管理しているとログを見ることを怠りがちです。
こんなときはログを一元管理するマシンを作りましょう。

CentOS4マシンをsyslogサーバに仕立てるのはとても簡単。
以下のように-rオプションを追加してsyslogデーモンを再起動するだけ。

# vi /etc/sysconfig/syslog
---
SYSLOGD_OPTIONS="-m 0 -r"
---

# service syslog restart

ここではsshとtelnetとrshのログをsyslogサーバに転送することを考えます。
ここからはログを転送したいマシン上での操作になります。
sshのログ出力設定は/etc/ssh/ssh_configで行っています。

# more /etc/ssh/sshd_config
---
SyslogFacility AUTHPRIV
---

CentOS4のデフォルトはこのようになっていると思います。
rshのログはファシリティauthに、telnetのログはどうもファシリティauthとauthprivに出るようです。
標準のログ出力設定では/var/log/secureと/var/log/messagesの両方にログが出てしまうので
/var/log/secureだけにログが出るよう以下のファイルを書き換えます。

# vi /etc/syslog.conf
---
*.info;mail.none;authpriv.none;auth.none;cron.none /var/log/messages
authpriv.*;auth.* /var/log/secure
---

# service syslog restart

次に/var/log/secureに書かれるログをsyslogサーバに転送する設定をしてみましょう。

# vi /etc/syslog.conf
---
authpriv.*;auth.* @192.168.0.x
---

# service syslog restart

 上ではsyslogサーバのIPアドレスを指定したがホスト名でもかまわない。
 これでsyslogサーバへの転送設定完了。syslogサーバの/var/log/secureに出力されているので確認してみましょう。
 致命的なエラーをsyslogサーバで一元管理することやルータやスイッチのログをsyslogサーバで一元管理など使い方はさまざまあるかと思います。


●参考

syslog.confでのログ出力の詳細

ファシリティ(facility)

auth セキュリティや認証関連
authpriv セキュリティや認証関連(プライベート)
cron cron
daemon facility 値を持たないデーモン
kern カーネルメッセージ
lpr プリンタ関連
mail メール
news ネットニュース
syslog syslogdの内部メッセージ
user ユーザレベルメッセージ
uucp UUCP
local0~7 予約、アプリケーションに依存


プライオリティ(priority)

debug デバッグ情報
info 情報
notice 通知
warn 警告
err 一般的なエラー
crit 致命的なエラー
alert 緊急に対処すべきエラー
emerg システムが落ちるような状態

※指定したpriority以上のログが出力されます。
 例えばuucp.alertと指定すればuucp.emergのログも出力されます。

2006年12月05日

yumコマンドの使い方

yumはrpmコマンドと違い依存関係を考慮して関係するパッケージも更新・削除してくれる。
rpmに慣れている人もyumに慣れておいて損はないでしょう。

yumコマンドを使うと公開鍵のインポートを促すメッセージが表示される。
これが嫌な人は先にインストールしておく。以下はCentOS4の場合。

#rpm --import /usr/share/doc/centos-release-4/RPM-GPG-KEY
#rpm --import /usr/share/doc/centos-release-4/RPM-GPG-KEY-CentOS-4

プロキシサーバ経由の場合は以下の変数を設定しておく。
yumコマンドを実行するたび設定する必要がないように~/.bash_profileなどに記述しておくと便利でしょう。

export http_proxy="http://プロキシサーバ:ポート番号"


●システム全体

アップデート及び新規インストール可能な全パッケージを表示

# yum list

アップデート可能な全パッケージを表示

# yum check-update

システム全体のパッケージのアップデートをします。

# yum update

インストールされている全パッケージを表示

# yum list installed


●個別パッケージ関係

パッケージの検索

# yum search パッケージ名(検索ワード)

パッケージを個別にインストール

# yum install パッケージ名

ファイルがどのパッケージに含まれているのか調べる

# yum provides ファイル名

パッケージの削除

# yum remove パッケージ名

パッケージ情報の表示

# yum info パッケージ名

2006年12月07日

chkconfigコマンドの使い方

このコマンドでサービスの自動起動の設定を操作します。
CentOS4の場合 /etc/init.d/ 配下の起動スクリプト、例えばsshdの中を見るとはじめのほうにコメントアウトして、
---
# chkconfig: 2345 55 25
# description: OpenSSH server daemon
---
とかかれています。これをchkconfigは見ています。

書式は以下
---
chkconfig: サービス開始ランレベル 起動する順番 停止する順番
description: サービスの説明
---
ランレベル2,3,4,5で起動順番55で開始され停止順番は25番、という意味になります。
rpmでインストールした場合は既に登録されていますがもし自分で起動スクリプトを作った場合は以下のコマンドで登録しておきます。

# chkconfig --add sshd

削除

# chkconfig --del sshd

確認

# chkconfig --list sshd

全てのサービスを確認

# chkconfig --list

特定のランレベル、たとえば2をoffにしたい場合

# chkconfig --level 2 sshd off

onにしたい場合

# chkconfig --level 2 sshd on


現在のランレベルでonにしたい場合

# chkconfig sshd on

以上でほぼ使いこなせると思います。

squid(プロキシサーバ)の設定 - その1

 squidは定番のWebプロキシサーバです。回線の遅かった時代にはキャッシュを利用することで同サイト閲覧者が現れたときにキャッシュを見せるという合理的な手段として利用することが多かったのですが、現在はクライアントの代理としてWEBサイトを見に行く機能(安全対策)の意味合いが強いと思われます。
 今回はCentOS4上でソースから導入を行い必要な設定全てを書こうと思います。役立つと思うのでアクセス制御やサイト制限の設定も書こうと思います。


なぜソースから導入するの?
rpmで入れればいいんじゃないの?

 と私も考えていたんですが出来る限りソースから導入しています。メリットは、最新のバージョンが使えることと,自分のマシンに最適化されて性能が向上し、より安定する、と思うからです。rpmはi386で作っていることが多く、ほぼ全てのインテルCPUで動作するようになっています。自分のマシンはPentium4だ!なんて思っても最適化されていません。当然自分のマシンに最適化したい、と思うようになってくると思います。
 しかしソースから入れると設定することが増えてしまいどうしても時間がかかります。当然設定ミスをする可能性が高くなります。
 業務で使うならソースからのほうがいいでしょうか。安定動作が最優先ですから。


始めにsquidをrpmで導入しておきます。一部のファイルを利用するからです。

インストールされているか確認

# rpm -qa|grep squid

インストール

# yum install squid

rpmで導入したsquidが自動起動しないように設定。
コマンドの使い方はカテゴリ「コマンド」に書いておきます。

# chkconfig --list squid
# chkconfig --level 35 squid off

めんどくさい時は削除しちゃってもいいです。

# chkconfig --del squid

上のコマンドを入力してもパッケージファイルが削除されるわけではないので安心を。
事前準備が整ったのでsquid公式サイトから最新安定バージョンをダウンロード。
以下現時点の最新バージョンで記入。

# wget http://www.meisei-u.ac.jp/mirror/squid/Versions/v2/2.6/squid-2.6.STABLE5.tar.bz2

さっそく解凍

# tar jxvf squid-2.6.STABLE5.tar.bz2 -C /usr/local/src/
(-C: 指定した場所に解凍)

解凍先に移動

# cd /usr/local/src/squid-2.6.STABLE5

READMEとINSTALLに目を通す。INSTALLに書かれているとおりに実行でよさそう。
configure --help でさまざまなオプションを見ることができる。
今回はprefixだけつけました。ちなみにこれはデフォルトのようなのでなくてもいい。

# ./configure --prefix=/usr/local/squid
(--prefix:インストール先の指定)

これで関数やライブラリなどの有無をチェックしコンパイルに使うMakefileを生成します。
実際にコンパイルするのは以下のコマンドです。

# make all

これで必要なファイルが出来ました。後はファイルの配置処理(インストール)です。

# make install

これでインストールが完了しました。
後からバージョンが分からなくなるのが心配な方は--prefix=/usr/local/squid-2.6.STABLE5と指定しておいてシンボリックリンクでも作成しておくとよいかと思います。
# ln -s /usr/local/squid-2.6.STABLE5 /usr/local/squid

設定ファイルは/usr/local/squid/etc/squid.confです。
追加・変更した所だけ抜粋しておきます。

http_port 8080
  クライアントからの受付ポート
ftp_user
  FTPサイトでanonymousでログインする時のパスワード(メールアドレス)
cache_mgr name@domain.com
  このサーバ管理者のメールアドレス
acl my_network src 192.168.0.0/255.255.255.0
  アクセスグループの作成
http_access allow my_network
  アクセスグループからの接続許可
cache_effective_user squid
  squidを起動するユーザをsquidに変更
ache_effective_group squid
  squidを起動するグループをsquidに変更
visible_hostname hostname.domain.jp
  これを設定しないとエラーが出ます

特に変更しませんでしたが設定したほうがいいと思うところを下にあげておきます。

cache_mem
  キャッシュに使用するメモリ容量の指定
cache_dir ufs /usr/local/squid/var/cache 100 16 256
  デフォルトでは100Mしかキャッシュしない


※http_access の記述は http_access deny all の前に書きましょう。
※http_access allow の記述はアクセス制限なので十分注意しましょう。
※cache_effective_userとache_effective_groupをsquidに設定しましたがそれぞれ/etc/passwd,/etc/groupに存在するか確認しておきましょう。

ここで作業ユーザ(rootですよね)の環境変数PATHにsquidの実行ファイルをディレクトリを入れておきましょう。squidのrpmパッケージが入っているのでそちらのコマンドとダブっているのでPATHの先頭に追加するのが無難です。

# vi ~/.bash_profile
---
export PATH=/usr/local/squid/bin:/usr/local/squid/sbin:$PATH:$HOME/bin
---
# source =/.bash_profile

確認の為以下のコマンドを入力

# which squid
---
/usr/local/squid/sbin/squid
---

上のように表示されたらOK。


設定が済んだら今度はsquid.confで指定したキャッシュディレクトリを用意して初期化しましょう。
squid付属のコマンドを絶対指定していますがPATHを通しているので省略も可能です。

# mkdir /usr/local/squid/var/cache
# chown squid.squid /usr/local/squid/var/cache
# /usr/local/squid/sbin/squid -z

起動前にログ出力先にアクセス権がないのでchownコマンドを使って権限を与える。

# chown squid.squid /usr/local/squid/var/logs

ようやく準備完了なのでさっそく起動

# /usr/local/squid/bin/RunCache &

なんらかのエラーが出る場合は /usr/local/squid/var/squid.out に出力されているので確認・修正を行います。

あとは確認です。ログを確認するのとアクセス制限がかからないマシンにプロキシの設定をしてWEBブラウズしてみましょう。あまり役にたたないかもしれませんがsquid付属のsquidclientコマンドでも確認出来ます。

# squidclient -p 8080 http://www.google.com/

ここまでで起動は出来ました。ちょっと休憩といったところでしょうか。

次はマシン起動時に自動で起動してほしいのでシステムサービスへの登録を行うのですが長くなってしまったので次回にしたいと思います。

2006年12月14日

squid(プロキシサーバ)の設定 - その2

その1ではRunCacheスクリプトを使って起動するところまで書きました。
このスクリプトのいいところはなにかの都合でsquidがダウンしてしまってもダウンしたことを検知して自動で起動してくれます。しかし停止したい時通常以下のコマンドを使いますがしばらくするとsquidが起動しているのです。

# squid -k shutdown

なので先にRunCacheを落としてからsquidを停止するという順番で停止させます。

# skill RunCache
# squid -k shutdown

RunCacheスクリプトをのぞいて不思議に思ったことがあるので書いておきます。
---
echo "Running: squid -sY $conf >> $logdir/squid.out 2>&1"
---
の最後の数字ですが2はエラー出力、1は標準出力、>&はエラー出力を扱うときのリダイレクト方法のようです。

次にシステムの起動時に自動起動するスクリプトを用意します。
rpmでsquidがインストールされた状態なので/etc/init.d/squidをカスタマイズするか新たに作るかのどちらかです。私は新たに作りました。

# vi /etc/init.d/squid
---
#!/bin/bash
#
# Startup script for the squid-2.6.STABLE5
#
# chkconfig: 35 99 1
# description: squid is Internet Object Cache.

export PATH="/bin:/usr/bin:/usr/local/bin:/sbin:/usr/sbin:/usr/local/sbin"

RUNCACHE=/usr/local/squid/bin/RunCache
LOCKFILE=/var/lock/subsys/squid
SQUID=/usr/local/squid/sbin/squid

case "$1" in
start)
if [ -x $RUNCACHE ]; then
if [ -f $LOCKFILE ]; then
echo "squid-2.6.STABLE5 already started!!"
else
touch $LOCKFILE
echo "Starting squid-2.6.STABLE5 Please wait......"
$RUNCACHE &
sleep 5
fi
else
echo "squid-2.6.STABLE5 program Not Found"
fi
;;
stop)
if [ -x $SQUID ]; then
if [ -f $LOCKFILE ]; then
echo "Shutting down squid-2.6.STABLE5: "
skill RunCache >/dev/null
$SQUID -k shutdown
rm -f $LOCKFILE
else
echo "squid-2.6.STABLE5 already Stopped!!"
fi
else
echo "squid-2.6.STABLE5 program Not Found"
fi
;;
*)
echo "Usage: httpd {start|stop}" 1>&2
exit 1
esac
exit 0
---
その後以下のコマンドでパーミッションを変更

# chmod 755 /etc/init.d/squid

chkconfigを使ってシステムにこの自動起動スクリプトを登録するので chkconfig の行と description の行を書きましょう。そしてシステムへの登録コマンドをを入力します。

# chkconfig --add squid

確認は以下

# chkconfig --list squid
---
squid 0:off 1:off 2:off 3:on 4:off 5:on 6:off
---

起動スクリプトのはじめの方に
# chkconfig: 35 99 1
と書きましたが35はランレベル3と5で起動し起動する順番は99番目、停止する順番は1番目、という意味になります。私はランレベル5で動かしているので自動起動するようになりました。

serviceコマンドも使えるようになっているのでsquidを起動してみましょう。

# service squid start

ここまででほぼ完成で、やり残しているのはログの管理です。
またまた長くなったので次回書くことにします。

2006年12月21日

squid(プロキシサーバ)の設定 - その3

ログ関係、その他役立ちそうな機能をいくつか書こうと思います。

squidのaccess.logを見ていると先頭は日時のようだけど1970/01/01から始まるUNIX時間で書いている。
わかりにくいのでsquid.confの設定を少し変更しました。

# vi /usr/local/squid/etc/squid.conf
---
access_log /usr/local/squid/var/logs/access.log common
---

ログの場所は階層が深いのでシンボリックリンクでアクセスしやすくしましょう。

# mv /var/log/squid /var/log/squid.old

↑のsquidフォルダはrpmでインストールしてある場合存在するので削除か移動する。

# ln -s /usr/local/squid/var/logs /var/log/squid


●ログのローテーション

以下のコマンドを叩くとsquidの出す3つのログファイルが「元のファイル名.番号インクリメント」という名前に変わってくれる。

# squid -k rotate

あとはcronにこのコマンドを登録して週1や月1など好みで動かしてやればいい。
ログの削除もcronに登録することでローテーションの完成。
簡単にローテーションさせたいならこれでOKと思います。

もうひとつはlogrotateがせっかくあるのでこれを使う方法。
以下の変更はログ全般の設定なので慎重に考えた上で変更しましょう。

# vi /etc/logrotate.conf
---
monthly
rotate 3
---
私のマシンはテスト用なので混雑していません。なのでログは1ヶ月単位でローテーションさせても十分です。
3ヶ月分はログを見たいのでログを残す設定を3にしました。
もし圧縮してログを置いていく場合はcompress行のコメントをはずしましょう。

次はsquid用個別の設定です。
以下のファイルを記述しましょう。rpmでsquidをインストールしてあれば既に存在しているので変更すると楽に作ることが出来ます。

vi /etc/logrotate.d/squid
---
/usr/local/squid/var/logs/access.log {
monthly
rotate 3
###copytruncate
###compress
###notifempty
missingok
}
/usr/local/squid/var/logs/cache.log {
monthly
rotate 3
###copytruncate
###compress
###notifempty
missingok
}

/usr/local/squid/var/logs/store.log {
monthly
rotate 3
###copytruncate
###compress
###notifempty
missingok
postrotate
/usr/local/squid/sbin/squid -k rotate
endscript
}
---
missingokはローテーションに失敗しても気にせず処理を続行するという意味。
notifemptyはからのファイルはローテーションしないという意味。
copytruncateはログを切りつめるという意味。よくわかりませんが作業中のログは残らないようなのでコメントアウトしました。

これでcrondが起動していれば機能します。一応確認しておきましょう。
# ps aux|grep cron
---
root 2704 0.0 0.2 6400 916 ? Ss Dec15 0:00 crond
root 29875 0.0 0.2 5528 724 pts/3 S+ 14:44 0:00 grep cron
---
起動していれば上のように表示されると思います。


●直接アクセスさせたい

ローカル内のページや確実に最新のページが見たいページなどはプロキシを通っても直接アクセスしたい。
そのような時は squid.conf に always_direct の設定をしましょう。
例としてヤフーとローカルネットワークを直接アクセスするようにしてみました。

# vi /usr/local/squid/etc/squid.conf
---
acl yahoo dstdomain .yahoo.co.jp
acl my_network src 192.168.1.0/255.255.255.0
always_direct allow yahoo
always_direct allow my_network
---

●特定のサイトの閲覧を禁止したい

aclの設定をします。例えばgoogleとyahooのアクセスを禁止したい場合は以下のようにします。

# vi /usr/local/squid/etc/squid.conf
---
acl deny_domain dstdomain "/usr/local/squid/etc/deny_domain"
http_access deny deny_domain
---

# vi /usr/local/squid/etc/deny_domain
---
www.google.co.jp
www.yahoo.co.jp
---
しかしこの設定だとauctions.yahoo.co.jpには行けるなどお粗末な設定です。あくまで例としてなので。。。

●上位プロキシサーバの設定

# vi squid.conf
--
cache_peer 上位プロキシIPアドレス parent 上位プロキシポート番号 3130 no-query
never_direct allow all
---

3130 はICPポート番号です。私は使っていないのでデフォルトのまま記述しました。
never_directを設定しないと上位プロキシだけじゃなくて自分で見に行ってしまいます。

●cachemgrの設定

squidにはcachemgr.cgiというプログラムがついてきます。どうもWEBブラウザから統計情報が見えるようなのですがなかなかうまく起動させることが出来ませんでした。
わかり次第書きたいと思います。