FreeBSD: 2005年11月アーカイブ

Crontabを編集

| | コメント(0) | トラックバック(0)

 昨日のntpの件があるので今日はcrontabを編集。
普通は使用するユーザーでcrontab -eで編集。ちなみに現在登録されている内容を見るのはcrontab -l

# crontab -e

下記のように追加して
0 * * * * /usr/sbin/ntpdate 133.100.9.2

# crontab -l

# DO NOT EDIT THIS FILE - edit the master and reinstall.
# (/tmp/crontab installed on Tue Nov 29 21:14:30 2005)
# (Cron version -- $FreeBSD: src/usr.sbin/cron/crontab/crontab.c,v 1.22 2004/09/14 19:01:19 dds Exp $)
0 * * * * /usr/sbin/ntpdate 133.100.9.2

こんな風にファイルができます。
出来たファイルは/var/cron/tabs/rootです。rootの部分は作成したユーザーです。
これはFreeBSDの場合ですが、Redhatだと/var/spool/cron/rootという風に保存されるディレクトリが違います。

また、システムで使用するcrontabは/etc/crontabです。
とりあえず出力

# /etc/crontab - root's crontab for FreeBSD
#
# $FreeBSD: src/etc/crontab,v 1.32 2002/11/22 16:13:39 tom Exp $
#
SHELL=/bin/sh
PATH=/etc:/bin:/sbin:/usr/bin:/usr/sbin
HOME=/var/log
#
#minute hour mday month wday who command
#
*/5 * * * * root /usr/libexec/atrun
#
# Save some entropy so that /dev/random can re-seed on boot.
*/11 * * * * operator /usr/libexec/save-entropy
#
# Rotate log files every hour, if necessary.
0 * * * * root newsyslog
#
# Perform daily/weekly/monthly maintenance.
1 3 * * * root periodic daily
15 4 * * 6 root periodic weekly
30 5 1 * * root periodic monthly
#
# Adjust the time zone if the CMOS clock keeps local time, as opposed to
# UTC time. See adjkerntz(8) for details.
1,31 0-5 * * * root adjkerntz -a

見たかぎりlinuxと同じような構成の部分がありますね。daily,weekly,monthlyの部分がBSDではperiodicを使い、/etc/periodic/以下にdaily,weekly,monthlyのディレクトリがあってその中にスクリプトを置いています。redhat linuxの場合は/etc/の下にcron.daily, cron.weekly, cron.monthlyとディレクトリがあってその中にスクリプトが入っています。

 今気づいたのがサーバーの時計が3分遅れていること、サーバーの時計が狂っているのは致命傷なのですぐに対策します。
 運よくntpdateは入っていたのでこれを利用。

# ntpdate 133.100.9.2

 …とおもったらうまく行かない。ファイヤーウォールだな。

# vi /etc/ipf.rules
#ipf -Fa -Z -f /etc/ipf.rules

ちなみに使用しているのは123番ポートです。
あとはcrontabかな

 本当はサーバーの前段に設置したいのですが余裕ないのでサーバーに組み込み。なぜ前段にしないといけないのかというとDos攻撃によって回線がパンクするだけならまだしもログでパーティションがパンクしたりCPUの過負荷でデーターが破損したりと二次災害の危険があるからです。

 ファイヤーウォールの設定はカーネルの再構築かカーネルモジュールの組み込みが必要になるので慎重に作業を進めてください。(リモートで接続できなくなっても保証できませんよ)

まずは、カーネルに組み込まれているか確認

# kldstat
Id Refs Address Size Name
1 7 0xc0400000 63070c kernel
2 16 0xc0a31000 568dc acpi.ko
3 1 0xc15af000 15000 linux.ko

# kldstat -v | grep ip
106 ips/ipsd
107 pci/ips
119 miibus/ciphy
160 ppbus/plip
# kldstat -v | grep fw
91 fwohci/firewire
92 pci/fwohci
93 cardbus/fwohci
94 firewire/fwe

カーネルモジュールがあるか確認

# find / -name ipl.ko
/boot/kernel/ipl.ko

設定ファイルがあるか確認

# find /etc -name ipf.rules

いきなり有効にするとSSHが切断されるので
ipf.rulesを編集してlocalhostとSSHの経路のみ確保。
ifconfigコマンドでインターフェースを確認を忘れずに

fxp0:WAN
lo0:localhost

# プログラム本体があるかどうか
# which ipf
/sbin/ipf

# vi /etc/ipf.rules

rc.confに記述を追加
# vi /etc/rc.conf

ipfilter_enable="YES"
ipfilter_rules="/etc/ipf.rules"
ipmon_enable="YES"
ipmon_flags="-D /var/log/ipf.log"


/boot/loader.confに記述を追加(最小環境では空でした)
ipl_load="YES"

モジュール組み込み
# kldload ipl

上手くいったかな?すぐに確認
# kldstat
Id Refs Address Size Name
1 8 0xc0400000 63070c kernel
2 16 0xc0a31000 568dc acpi.ko
3 1 0xc15af000 15000 linux.ko
4 1 0xc1aa0000 2a000 ipl.ko

とりあえず切断はされていない。

運命の再起動
# reboot

SSHでまったく問題なしに入れた。
ここまで楽にできると本当にファイヤーウォールが機能しているか不安だ。

PostgreSQLが起動しているのでtelnetで不正アクセスしてみる。
反応しました、全然機能していません。orz...

起動しているか確認
# /etc/rc.d/ipfilter status
ipf: IP Filter: v4.1.8 (416)
Kernel: IP Filter: v4.1.8
Running: yes
Log Flags: 0 = none set
Default: pass all, Logging: available
Active list: 0
Feature mask: 0x10f

フィルターの確認(-iはイン、-oはアウト)
# ipfstat -i
# ipfstat -o

全然フィルタリングされていませんでした。orz...
設定ファイルの修正
# vi /etc/ipf.rules

設定を反映
# ipf -Fa -Z -f /etc/ipf.rules

 必要なサービスは揃ったので最後の仕上げにセキュリティ強化を行う。
元々無駄は省いていたが残っているのが下記の項目

・不要なユーザー/グループの削除
・ログイン時のメッセージを削除
・SSHでログインできるユーザーを制限(posrgresとかでログインされないようにする)
・ファイヤーウォールでポートの制限をする

ユーザー管理は特に説明の必要はないですね。余計なユーザーアカウントがあるとクラッキングの対象にされます。BSDだとgameユーザーとかあるので消しましょう。

ログイン時に出るメッセージによってOSの種類やバージョンがバレます。すぐに編集しましょう。
対象になっているファイルは/etc/motdです。

SSHユーザーの制限は/etc/ssh/sshd_configにAllowUsersの項目を追加し
AllowUsers user1 user2のようにスペースを開けて記述します。

ファイヤーウォールは個別に紹介。

 前回makeに失敗してパッケージでいれてしまったPerlですが、PostgreSQLを入れる際にgmakeが無かったという発見もあったので再度ソースからコンパイルに挑戦することにしました。

 そういうことでパッケージのPerlを削除します。
# pkg_info
linux_base-8-8.0_6 Base set of packages needed in Linux mode (only for i386)
perl-5.8.7 Practical Extraction and Report Language

# pkg_delete perl-5.8.7

 次にPerlと必要モジュールのダウンロードをします。今回の構成はProject-mmo用のゲームサーバーとしての構築なのでDBIやDBD::Pgの他にFLASHクライアントからのデータを処理するXML::Parserが必要になります。

Perlとモジュールの配布元
http://www.perl.com/CPAN/

Configureで問答するのはイヤなのであらかじめ用意されているconfigure.gnuを利用。
# tar zxvf perl-5.8.7.tar.gz
# cd perl-5.8.7
# ./configure.gnu
# make
# make install

make時に一部errorの表示があったがお構いなし。(後々解析して影響が無いか調べないといけないな)
Perlのインストールが終わったらこれからインストールするモジュールが既に組み込まれていないか確認する。

# find `perl -e 'print "@INC"'` -name '*.pm' -print

DBIのインストール

# tar zxvf DBI-1.48.tar.gz
# cd DBI-1.48
# perl Makefile.PL
# make
# make install

DBD::Pgのインストール
# tar zxvf DBD-Pg-1.41.tar.gz
# cd DBD-Pg-1.41
# perl Makefile.PL
# make
# make install

ここまでは順調だったがXML::Parserについてはperl Makefile.PLを実行した段階でexpatが必要と警告が出て止まる。

XML::Parserインストールの前にexpatをインストール
http://sourceforge.net/projects/expat/

# tar zxvf expat-1.95.8.tar.gz
# cd expat-1.95.8
# ./configure
# make
# make install

XML::Parserのインストール

# tar zxvf XML-Parser-2.34.tar.gz
# cd XML-Parser-2.34
# perl Makefile.PL
# make
# make install

これで完了。用意したゲームサーバースクリプトも動作できました。

入手したソースアーカイブのチェック
# md5 postgresql-8.1.0.tar.gz
MD5 (postgresql-8.1.0.tar.gz) = 644b50b88cd2b93e465bb8ff30da09ed

FreeBSDの最小構成ではgmakeが入ってないのでmake時に失敗するためgmakeをインストール。

ftp://ftp.gnu.org/gnu/make/

# tar zxvf make-3.80.tar.gz
# ./configure
# make
# make install

postgresグループとユーザーを作成する。このとき出来るならばgidとuidを70にセットする。
これはアーカイブを解凍したときにchownを省略できるため。(元々postgresのuid/gidは70で定義されているみたい)※意味がわからなければ解凍後chownでpostgresにしてください。

今回はpwコマンドを初めて使ったので(というかリファレンス不足でpwコマンドの詳細が不明)uidとgidは後から編集しました。

# pw groupadd postgres
# pw useradd postgres -m -d /usr/local/pgsql -g postgres -s /bin/tcsh

## -g グループ
## -s シェル
## -d ホーム
## -m ホームが無ければ作成

パスワードを設定
# passwd postgres

uidを編集(vipwを使わなくて vi /etc/passwdでもOKです)
# vipw

gidを編集
# vi /etc/group

uid/gidが変わったのでホームディレクトリの所有者・グループを修正。
# chown -R postgres:postgres /usr/local/pgsql

解凍
# tar xzvf postgresql-8.1.0.tar.gz

postgresユーザーに切り替え( - をつけるとログインするユーザーのプロファイルを使用します)
# su - postgres

コンフィグレーション
% cd /usr/local/src/postgresql-8.1.0
% ./configure --enable-multibyte=EUC_JP --with-perl

--enable-multibyte=EUC_JP 日本語を使用するとき必要。コードセットはEUC
--with-perl Perl用Pgライブラリをコンパイル

コンパイル
% make

インストール
% make install

環境変数の設定(csh,tcshの場合)
% vi ~/.login

下記を追加

------------------------------------------------------------
# PostgreSQL
setenv PG_HOME "/usr/local/pgsql"
setenv PATH "${PATH}:${PG_HOME}/bin"
setenv PGLIB "${PG_HOME}/lib"
setenv PGDATA "${PG_HOME}/data"

if ($?MANPATH) then
setenv MANPATH "${MANPATH}:${PG_HOME}/man"
else
setenv MANPATH "/usr/man:/usr/local/man:${PG_HOME}/man"
endif

if ($?LD_LIBRARY_PATH) then
setenv LD_LIBRARY_PATH "${LD_LIBRARY_PATH}:${PGLIB}"
else
setenv LD_LIBRARY_PATH "${PGLIB}"
endif
------------------------------------------------------------

環境変数の変更を適用(csh,tcshの場合)
source ~/.login

データディレクトリの作成
% mkdir /usr/local/pgsql/data

データの初期化
% initdb /usr/local/pgsql/data

テスト
% postmaster -D /usr/local/pgsql/data

問題なければ起動
% postmaster -i -S -D /usr/local/pgsql/data

-i TCP/IP経由で接続する場合に使用。現在多くのサーバーシステムでは必須。
-S サイレントモード(バックグランドで起動)
-D [ディレクトリ] データディレクトリを指定

最小構成以外でLinuxやBSDを入れている人は、rpmやportsのpostgresが混入していないかチェックしてください。既に起動していてポートが使えなかったり、バージョンやディレクトリ構成の差異によって予期せぬ不具合を起こします。(違う場所のinitdbやpostmasterを呼び出したりなど)

自動起動(FreeBSD)
ここからはまたrootに戻って作業

ソースに起動ファイルがあるのでコピーする
# cd /usr/local/src/postgresql-8.1.0/contrib/start-scripts
# cp freebsd /usr/local/etc/rc.d/postgres.sh

オプションやパス等が正しいか確認する。(ここでは-iを追加)
# vi /usr/local/etc/rc.d/postgres.sh

実行権を与える
# chmod 755 /usr/local/etc/rc.d/postgres.sh

これで自動起動の設定は完了です。iオプションを有効にしているので外部からの接続が制限できているかpostgresユーザーになって下記のファイルを確認します。

# su - postgres
% less /data/pg_hba.conf

------------------------------------------------------------
# TYPE DATABASE USER CIDR-ADDRESS METHOD

# "local" is for Unix domain socket connections only
local all all trust
# IPv4 local connections:
host all all 127.0.0.1/32 trust
# IPv6 local connections:
host all all ::1/128 trust
------------------------------------------------------------

デフォルトではこのようになっておりlocalhost以外からは接続できないように設定されているようです。これだけでは安心できないので前段にファイヤーウォールを設置した方が良いと思います。

 UNIX系どっぷり生活ですが(仕事でLinux、自宅でBSD)運用上よく使う管理コマンドをメモ。

# top

起動しているプロセスの一覧とCPU、メモリーの使用率を表示。
サーバーが重いなと感じたらまずこれを使いましょう。

# ps

起動しているプロセスの一覧、-xでシステムプロセス、-auで全てのユーザーのプロセスを表示。
全プロセスを確認するときはps -auxと入力。ここではサービス等が正常な状態で起動しているかどうか等をチェックする。

# df

パーティションの使用率を表示。 -hオプションでK(キロ)・M(メガ)・G(ギガ)等単位をつけて表示してくれるので便利です。

# du

ディレクトリの使用量を表示。du -sk * とするとカレント直下のディレクトリの使用量を表示。

# netstat
TCP/IPでサービスを行っているサーバーなら必須のコマンド。-nでポート番号を数値に変換。基本はnetstat -lnで使用しています。

# ipcs
共有メモリ内の使用状況を表示。サービスをkillコマンドで強制終了させた場合にゴミが残っていることがあるのでそのときはipcrmで駆除。

この前ダウンロードしたPerl-5.9.2は安定バージョンでないことを知り、安定版の5.8.7をダウンロードしてコンフィグ→コンパイルとしましたが途中でエラー発生。ここであまり時間を割く余裕が無いのでsysinstallからPerl-5.8.7を探してインストールしました。完敗。

出来た内容が以下の通り
server# ls /usr/local/bin
a2p perl-after-upgrade pod2man
c2ph perl5 pod2text
cpan perl5.8.7 pod2usage
dprofpp perlbug podchecker
enc2xs perlcc podselect
find2perl perldoc prove
h2ph perlivp psed
h2xs piconv pstruct
instmodsh pl2pm s2p
libnetcfg pod2html splain
perl pod2latex xsubpp

これくらいなら許せる範疇です。因みにperl5はシンボリックなんでこれをperlに名前を変えれば直ぐにPerlスクリプトを使用できます。/usr/binにもperlとperl5のシンボリックリンクがありました。
という事で、サーバーの作業は一旦休止してProject-mmoへ引継ぎます。

ps -auxとするとgettyが大量に出ていたので/etc/ttysを編集してgettyを0と1を残して全てコメントアウト、さらにシリアル接続は使わないので全てコメントアウトして再起動。
また、secureをinsecureにすると直接rootでログインできないように設定できます。

全ユーザーのプロセスを表示
# ps -aux

コンソールの設定ファイル
/etc/ttys

さらに、カーネル再構築の前に現状を把握しようとkldstat -vで読み込まれているカーネルモジュールとモジュール内の項目を表示。特にサウンド等の無駄デバイスは組み込まれていないようでした。軽量化しようにもあまりパフォーマンスに影響しないような気がしたのでこのままにします。
それも、sys内にカーネルの設定ファイルが無かったので、sysinstallでインストーラーを立ち上げソースを取得しました。但し、現在のカーネルの設定ファイルではないのでこれにファイヤーウォールを追記して再構築すると元のカーネルより巨大になってさらにノートPC特有のデバイスが組み込まれない事故を起こしそうなので途中でやめました。

使用しているカーネルモジュールの確認
# kldstat

詳細
# kldstat -v

カーネル設定ファイルの取得方法
# sysinstall
Configureを選ぶ→Distributionを選ぶ→src→sysを選択→install

カーネル設定ファイルの場所(/sys -> /usr/src/sys のシンボリックです)
/usr/src/sys/i386/conf/GENERIC
/sys/i386/conf/GENERIC

カーネルモジュールの置き場所
/boot/kernel/

昨日買ったといえ中古ノートだけあってメモリーが128MBしかない、起動したときは80MBあったのに何故かもう2MBしか余ってない。サービスなんかまだインストールすらしてないのに…。これにDB入れようなんて考えているからヤバすぎ、さらにマザーが440BXだから対応メモリー売ってなくてもっとヤバすぎ。
 サーバー用途なので、サウンドとかUSBとかいらないものが沢山組み込まれているしDB入れたら一応FWが必要になるのでカーネル再構築が必要な状態です。

 いろいろと試行錯誤しましたが、リナザウやpscpからはフツーにscpでファイル転送できるのにWinSCPだけは失敗する。OpenSSHとのバージョンも関係あるのだろうか、bash入れてもWinSCP用の設定を入れてもダメだったのでWinSCPが新バージョンに付いてきてくれないと結論をだし諦めました。まぁこうなれば日本語環境のないサーバーで徹底的にコーディングしますよ。えぇ

 まず、ココを読まれた方にお伝えしたいことがあります。
Perlはソースからインストールするメリットがわかりません。
特にカスタマイズするものではないので特にソースコンパイルに興味が無ければパッケージからインストールしてください。

今回のサーバー構築はスペック的にも厳しいものがあるので、使わないサービスは一切入れないこととパッケージインストールはせず意地ででソースコンパイルという名目もあるので、Perlもソースからコンパイルします。

Perlはhttp://www.perl.com/CPAN/src/より入手。実はWindowsからpscpを使って転送しました。

コンフィグ
./Configure

コンパイル
make

インストール
make install

これだけだと超カンタンに見えますが、実はコンフィグが対話式で沢山の質問に対してyesかnoで答えなければいけません。あまりに面倒なのでデフォルトでいいやと[Enter]連打したら…。

> cd /usr/local/bin
> ls
a2p5.9.2 h2ph5.9.2 perldoc5.9.2 pod2text5.9.2 s2p5.9.2
c2ph5.9.2 h2xs5.9.2 perlivp5.9.2 pod2usage5.9.2 splain5.9.2
corelist5.9.2 instmodsh5.9.2 piconv5.9.2 podchecker5.9.2 xsubpp5.9.2
cpan5.9.2 libnetcfg5.9.2 pl2pm5.9.2 podselect5.9.2
dprofpp5.9.2 perl5.9.2 pod2html5.9.2 prove5.9.2
enc2xs5.9.2 perlbug5.9.2 pod2latex5.9.2 psed5.9.2
find2perl5.9.2 perlcc5.9.2 pod2man5.9.2 pstruct5.9.2

ちょっとまて─────!
こんなんじゃ使いにくいだろボケ───!

という事でやり直しです。 orz....

リモートでSSHログインが出来ないから、BSDマシンがDHCPだとダメなのか?hosts.allowに書いてないとダメなのかとやってみましたが、実はローカルでやってもダメだった。そこで出たエラーが

PAM: authentication error

何ですかねこれ?

ググッてみたらこの文章。
Note: The configuration defaults for sshd(8) have been changed. SSH
protocol version 1 is no longer enabled by default. In addition,
password authentication over SSH is disabled by default if PAM is
enabled.

翻訳したらこうなる。
注意: sshd(8)のための構成デフォルトを変えました。 セキュアシェル (SSH)

プロトコルバージョン1はデフォルトでもう可能にされません。 さらに、PAMが
有効にされるなら、SSHの上のパスワード認証はデフォルトで無効にされます。

何ー!?仕様変更でパス認証が無効になっているのか?

/etc/ssh/ssh_config内において
PasswordAuthentication yes
を有効にした時点でサーバー自身からsshログインは可能になった。
さらに、/etc/ssh/sshd_configも同様に設定すると、リモートからログインが出来たーー!!

 さっきSSHログインできなかったのはWindows側のFWとやっぱりBSDはrootのリモートログインをデフォルトで許してないようだ。そういうわけでwheelグループでユーザーを作成してみる。

コマンドはadduserです。これがRed Hat Linuxだとuseraddです。

# adduser
Username: hogehoge
Fullname:
Uid (Leave empty for default):
Login group [hogehoge]: wheel
Login is wheel. Invite hogehoge into other groups? []:
Login class [default]:
Shell (sh csh tcsh nologin)[sh]: tcsh
Home directory [/home/hogehoge]:
Use password-based authentication? [yes]:
Use an empty password? (yes/no) [no]:
Use a random password? (yes/no) [no]:
Enter password: ********
Enter password again: ********
Lock out the account after creation? [no]:
Username : hogehoge
Password : *****
Full Name :
Uid : 1001
Class :
Groups : wheel
Home : /home/hogehoge
Shell : /bin/tcsh
Locked : no
OK? (yes/no): yes

adduser: INFO: Successfully added (hogehoge) to the user database.
Add another user? (yes/no):no
Goodbye!

 やっと、後継サーバーを購入したので早速インストールします。別に新しいものでなくても良かったのですが、将来のことも考えネットワークインストールをする事に(そうなると最新のイメージファイルでないと都合悪かったりします)。

 サーバーのスペックは前回との違いを簡単に書いておきます。

項目:前回 → 今回
筐体:ATX → NOTE
CPU:Celeron 1GHz → PentiumIII 800MHz
RAM:PC133 128MB(256Mbit) → PC100 128MB(128Mbit)
HDD:30GB → 20GB
Optical:DVD-ROM → CD-ROM
UPS:無し → 内蔵バッテリー

コメント:やっぱり自宅に置くなら停電耐性があって夜でも静かなノートPCじゃないとダメですね。ATXで同じ環境性能を求めたら場所と予算ぶっ飛びます。

インストールの作業内容については続きに書きます。ある程度溜まったらTOPメニューにページを設置します。

このアーカイブについて

このページには、2005年11月以降に書かれたブログ記事のうちFreeBSDカテゴリに属しているものが含まれています。

次のアーカイブはFreeBSD: 2005年12月です。

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

ウェブページ

Powered by Movable Type 4.1