サーバ設定記録

以下のメモは、私がサーバを設定した時にメモした内容をまとめたものです。 個人的なメモを、後から思い出しながら修正・追加・削除したものです。 あくまでも参考程度にお読みください。間違いの指摘やアドバイス等は 大歓迎ですが、内容・運用結果についての責任は取れませんので悪しからず...
2002年5月16日

対象OS:Red hat Linux v7.2
ドメイン名:取り合えず mydomain.gr.jp と仮定。
サーバ名:取り合えず server.mydomain.gr.jp と仮定。

目次

サーバ機の構成 最初の確認事項 方針 XINETD
SAMBA APACHE BIND SENDMAIL
DRAC QPOPPER Netfilterの設定(iptables) CVS
PostgreSQL ZLIB OpenSSL OpenSSH

サーバ機の構成

    <インターネット>
           +
+-------- Linux BOX ---------+
|   (eth0:123.345.567.789)   |
|          + (FORWARD)       |
|     (eth1:192.168.0.1)     |
+----------------------------+
           +
  <ローカルネットワーク>
NICは2枚使用。一枚(eth0)はインターネット(外側)、もう一枚(eth1)は ローカル(内部:192.168.x.x)ネットワーク用。 eth0 <-> eth1 間はIPマスカレード。

最初の確認事項

方針

SENDMAIL、SAMBA、APACHE、BIND等のオープンソースは 標準に組み込まれている(/usr/sbin)ものは使用せず、常に最新の ソースをダウンロードして組み込むようにする。 ソースの置き場所は /usr/loca/src 下にそれぞれのディレクトリを作成する。
組み込まれているかどうかの確認は、
rpm -qa | grep -i sendmail
というようにして確認する。また、削除は
rpm -e sendmail
のようにする。

XINETD

まず、以下のようにxinetd.confを設定する。 ここではデフォルトとしてローカルネット側からのみxinetdを使用可能とする。 インターネット側からは、個々のアプリケーション毎に/etc/xinetd.d内の 設定ファイルで個別に設定する。
#
# Simple configuration file for xinetd
#
# Some defaults, and include /etc/xinetd.d/
defaults
{
    instances       = 60
    log_type        = SYSLOG authpriv
    log_on_success  = HOST PID
    log_on_failure  = HOST
    only_from       = localhost 192.168.0.0/24 
}
includedir /etc/xinetd.d

SAMBA

コンパイル & インストール

 ./configure
 make
 make install
インストール先: /usr/local/samba 下

設定

HTTPD(APACHE)

コンパイル & インストール

./configure
make
make install
インストール先: /usr/local/apache 下

設定

BIND

コンパイル & インストール

./configure
make
make install
インストール先: /usr/local/sbin

設定

named は named ユーザ/グループ権限で動作させる(-u オプション)。さらに、 chrootオプションを付けて起動する。chrootオプションは /etc/sysconfig/named に ROOTDIR= /var/named の起動パラメータを与える。 設定ファイルは /etc/named.conf。 以下、chrootオプション用の設定。
cd /var/named
mkdir etc
mkdir run
chown named.named /var/named/*
次に/var/named/etc に named.conf を作成する。 さらに、named.conf の中のルートディレクトリを以下のように 設定する。
............
options {
   directory = "/" <== このように変更
}
そして、/var/named にドメインのデータベースファイルを置く。
/etc/resolve.conf が以下のエントリーを含んでいることを確認する。
search mydomain.gr.jp
nameserver 192.168.0.1
nameserver 123.345.567.789

SENDMAIL

メールはsendmail+qpopper+dracの組み合わせで、POP Before SMTP 機能を 利用する。つまり、予め(決められた時間(30〜1時間)以内に) POP サーバにログインしないとメールを送ることができない。

コンパイル & インストール

sh Build
sh Build install
ここで、sendmail が/usr/sbin にコピーされない場合(要調査)は手動でコピーする。

設定

QPOPPER

最新のQPOPPERはDRACを標準でサポートしているのでAPOPとDRACを用いたPOP Before SMTP を有効にするため、以下のように実行する。QPOPPERをビルドする前にDRACをインストール しておく必要がある。

コンパイル & インストール

./configure --enable-specialauth --enable-apop=/etc/pop.auth --enable-log-login --with-drac=/usr/local/src/drac
make
make install
インストール先: /usr/local/sbin 下(popper、popauth)

設定

QPOPPERはXINETD経由で起動されるため、以下のような設定ファイル popper を /etc/xinetd.d に作成する。
service pop3 
{
	flags		= REUSE
	socket_type	= stream        
	wait		= no
	user		= root
	server		= /usr/local/sbin/popper
	server_args	= -s -p 0 
	only_from	+= .mydomain.co.jp .otherdomain.co.jp
	log_on_failure += USERID
	disable		= no
}

DRAC

コンパイル & インストール

残念ながらDRACはconfigureを提供していない。従って、 ドキュメントINSTALL を読んで添付のMakefileを直接Linux用に編集する。 その後、
make
make install
インストール先: /usr/local/sbin 下(rpc.dracd)

設定

dracd-setup.linux を先頭のコメントを読んで /etc/init.d に dracd としてコピーする。 次に
ln -s /etc/init.d/dracd /etc/rcd/r3.d/S99dracd
portmap が dracd より前に起動されることを確認する。
最後に、/etc/mail/dracd.allow に以下を記述する。
255.255.255.255 127.0.0.1
255.255.255.255 192.168.0.1
255.255.255.255 123.345.567.789

CVS

コンパイル & インストール

./configure
make
make install
インストール先: /usr/bin

設定

xinetd.d に cvspserver を設定する。 /var/cvs/cvsroot を作成。 リポジトリを初期化する。
cvs :pserver:user@server.mydomain.gr.jp:/var/cvs/cvsroot init
次にcvsadmin、cvsguest、cvsuser 等、用途に従ったCVSに関係するユーザ とcvsグループをシステムに登録する。 次に/var/cvs/cvsroot/CVSROOT/passwdファイルにCVSユーザを 以下のように登録する。
user1:xxxxxxxx:cvsadmin
user2:yyyyyyyy:cvsadmin
user3:zzzzzzzz:cvsguest
.....................
ここで、user1、user2等はCVSにログインするときに必要な ユーザ名。xxxxxxxxやyyyyyyyyは、passwd コマンドで作成される ものと同じエンコード化されたCVSにログインためのパスワード。 例ではuser1とuser2は実際のシステムユーザcvsadminの権限で ログインされる。user3はcvsguest権限になる。従って、システム 権限をcvsadminとcvsguestで分けておけば、書き込み制限などが 可能になる。その他に/var/cvs/cvsroot/CVSROOT/writersファイルに 書き込み可能なCVSユーザを登録して、明示的に書き込み可能者を 設定する方法もある。

Netfilterの設定

iptablesの起動スクリプト(iptables.on)。
#!/bin/sh
#

####### actual setting(only needs to be set) #########
internet_dev=eth0
localnet_dev=eth1
local_IPs=192.168.0.0/24
######################################################

MODPROBE=/sbin/modprobe
IPTABLES=/sbin/iptables

#---------------------------------------
## Insert modules fot FTP connection(not necessary if included in the kernel)
#---------------------------------------
$MODPROBE ip_nat_ftp
$MODPROBE ip_conntrack_ftp

# Enable forwarding
echo 1 > /proc/sys/net/ipv4/ip_forward

# Flush first
$IPTABLES -F INPUT
$IPTABLES -F OUTPUT
$IPTABLES -F FORWARD

#---------------------------------------
# Policy definition for INPUT/FORWARD chain: DROP
#---------------------------------------
$IPTABLES -P INPUT DROP --modprobe=$MODPROBE
$IPTABLES -P OUTPUT ACCEPT
$IPTABLES -P FORWARD DROP

#---------------------------------------
## IP MASQUERADE setting.
#---------------------------------------
$IPTABLES -t nat -A POSTROUTING -o $internet_dev -j MASQUERADE --modprobe=$MODPROBE

#---------------------------------------
# Setting for DROP with LOG
#---------------------------------------
$IPTABLES -N log_drop
# $IPTABLES -A log_drop -j LOG --log-level warning -m limit --modprobe=$MODPROBE$IPTABLES -A log_drop -j DROP

#-------------------------------------------------
## Rules for connection to server from outer world
#-------------------------------------------------
$IPTABLES -N from_internet
$IPTABLES -A from_internet -p tcp --dport http -j ACCEPT
$IPTABLES -A from_internet -p tcp --dport https -j ACCEPT
$IPTABLES -A from_internet -p icmp -j ACCEPT
$IPTABLES -A from_internet -p tcp --dport domain -j ACCEPT
$IPTABLES -A from_internet -p udp --dport domain -j ACCEPT
$IPTABLES -A from_internet -p tcp --dport smtp -j ACCEPT
$IPTABLES -A from_internet -p tcp --dport pop3 -j ACCEPT
$IPTABLES -A from_internet -p tcp --dport cvspserver -j ACCEPT
$IPTABLES -A from_internet -p udp --dport cvspserver -j ACCEPT
# Drops for NETBIOS & Local IP connection
$IPTABLES -A from_internet -p udp --dport 137:139 -j DROP
$IPTABLES -A from_internet -p tcp --dport 137:139 -j DROP
$IPTABLES -A from_internet -d 10.0.0.0/8 -j log_drop
$IPTABLES -A from_internet -d 172.16.0.0/12 -j log_drop
$IPTABLES -A from_internet -d 192.168.0.0/16 -j log_drop
$IPTABLES -A from_internet -s 10.0.0.0/8 -j log_drop
$IPTABLES -A from_internet -s 172.16.0.0/12 -j log_drop
$IPTABLES -A from_internet -s 192.168.0.0/16 -j log_drop

# Accept from outer but initiated by local side.
$IPTABLES -A from_internet -m state --state ESTABLISHED,RELATED -j ACCEPT --modprobe=$MODPROBE
# DROP other than above.
$IPTABLES -A from_internet -j DROP

#---------------------------------------
# FORWARD rules from internet to local
#---------------------------------------
$IPTABLES -N forward_from_internet_to_local
$IPTABLES -A forward_from_internet_to_local -d ! $local_IPs -j log_drop
$IPTABLES -A forward_from_internet_to_local -p udp --dport 137:139 -j DROP
$IPTABLES -A forward_from_internet_to_local -p tcp --dport 137:139 -j DROP
$IPTABLES -A forward_from_internet_to_local -s 10.0.0.0/8 -j log_drop
$IPTABLES -A forward_from_internet_to_local -s 172.16.0.0/12 -j log_drop
$IPTABLES -A forward_from_internet_to_local -s 192.168.0.0/16 -j log_drop
$IPTABLES -A forward_from_internet_to_local -m state --state ESTABLISHED,RELATED -j ACCEPT --modprobe=$MODPROBE
# DROP other than above.
$IPTABLES -A forward_from_internet_to_local -j DROP

#-------------------------------------------
# Rules for outgoing to internet from server
#-------------------------------------------
$IPTABLES -N to_internet
$IPTABLES -A to_internet -p udp --dport 137:139 -j DROP
$IPTABLES -A to_internet -p tcp --dport 137:139 -j DROP
$IPTABLES -A to_internet -d 10.0.0.0/8 -j log_drop
$IPTABLES -A to_internet -d 172.16.0.0/12 -j log_drop
$IPTABLES -A to_internet -d 192.168.0.0/16 -j log_drop
$IPTABLES -A to_internet -j ACCEPT

#---------------------------------------
# Rules for lo and local device
#---------------------------------------
$IPTABLES -A INPUT -i lo -j ACCEPT
$IPTABLES -A INPUT -i $localnet_dev -j ACCEPT
$IPTABLES -A FORWARD -i $localnet_dev -j ACCEPT

#-------------------------------------------------------
## Connect to default chain connected to internet device
#-------------------------------------------------------
$IPTABLES -I INPUT   -i $internet_dev -j from_internet
$IPTABLES -I FORWARD -i $internet_dev -j forward_from_internet_to_local
$IPTABLES -I OUTPUT  -o $internet_dev -j to_internet
$IPTABLES -I FORWARD -o $internet_dev -j to_internet
iptablesの終了スクリプト(iptables.off)。
#!/bin/sh
#

####### actual setting(only needs to be set) #########
internet_dev=eth0
localnet_dev=eth1
######################################################

MODPROBE=/sbin/modprobe
IPTABLES=/sbin/iptables

# Flush POSTROUTING chain in nat table
$IPTABLES -t nat -F POSTROUTING

# Flush newly created chains in filter table
$IPTABLES -F from_internet
$IPTABLES -F to_internet
$IPTABLES -F forward_from_internet_to_local
$IPTABLES -F log_drop

# Flush default chains in filter table
$IPTABLES -F INPUT
$IPTABLES -F OUTPUT
$IPTABLES -F FORWARD

## Delete newly created chains in filter table.
$IPTABLES -X from_internet
$IPTABLES -X to_internet
$IPTABLES -X forward_from_internet_to_local
$IPTABLES -X log_drop

# Reset policies in filter table.
$IPTABLES -P INPUT ACCEPT
$IPTABLES -P OUTPUT ACCEPT
$IPTABLES -P FORWARD ACCEPT

PosqreSQLの設定

postmaster等サーバモジュールの作成

以下のように configure する。
./configure --enable-multibyte=UNICODE --enable-syslog
PostgreSQL 7.3 以降では
./configure
インストール前に既にデータベースが存在する場合、
$ pg_dump -b -F c admindb > admindb.dump
のようにしてバックアップしておく。

インストール先: /usr/local/pgsql 下
ユーザ postgres を追加して、 postgres ユーザで make all と make install を実行する。ただし、最上位の /usr/local/pgsql ディレクトリは root で作成してから chown postgres.postgres pgsql とする。 データベースの作成(PostgreSQL 7.3 以降)は

$ initdb --encoding=UNICODE --no-locale -D /usr/local/pgsql/data
postmaster を起動したら
$ createdb --encoding=UNICODE admindb
$ createuser ...
...
$ pg_restore -d admindb admindb.dump
...
とデータベースやユーザを作成。

Windows上でのクライアント

まず、....\postgresql-7.2.1\src\interfaces\libpq\libpqdll.def に以下の行を最後に追加する。
; 以下を追加
	pg_char_to_encoding         @88
	pg_encoding_to_char         @89
	pg_encoding_mblen           @90
	pg_mule_mblen               @91
	pg_mic_mblen                @92
	pg_encoding_max_length      @93
	pg_valid_client_encoding    @94
	pg_valid_server_encoding    @95
	pg_utf_mblen                @96
次に....\postgresql-7.2.1\src で
 nmake /f win32.mak MULTIBYTE=MULTIBYTE
と入力して psql.exe と libpq.dll をビルドする。 psql.exe と libpq.dll を適当な所にコピーして、以下のように 実行すれば日本語を操作できる。
C:\psql>psql -h 192.168.0.100 -U postgres -d test
Welcome to psql, the PostgreSQL interactive terminal.

Type:  \copyright for distribution terms
       \h for help with SQL commands
       \? for help on internal slash commands
       \g or terminate with semicolon to execute query
       \q to quit

test=# \encoding
EUC_JP
test=# \encoding SJIS
test=# \encoding
SJIS
test=# insert into tbl1 values('東京',123.0);
INSERT 16559 1
test=# insert into tbl1 values('京都',-123.0);
INSERT 16560 1
test=# select * from tbl1;
 name | val
------+------
 東京 |  123
 京都 | -123
(2 rows)

test=#

Zlibのインストール

以下のようにインストール。
./configure && make
make install
インストール先: /usr/local 下
/usr/local/include/zlib.h
/usr/local/include/zconf.h
/usr/local/lib/libz.a
/usr/local/lib/libz.so

OpenSSLのインストール

OpenSSL には Zlib が必要。 以下のようにインストール(./configure ではなく ./config であることに注意)。
./config
make
make test
make install
インストール先: /usr/local/ssl 下

OpenSSHのインストール

OpenSSH には OpenSSL が必要。 インストールの前に以下のようにして Privilege separation 用 (sshd が chroot できるよう)に準備する(ROOTで)。
mkdir /var/empty
chmod 755 /var/empty
groupadd sshd
useradd -g sshd -c 'sshd chroot' -d /var/empty -s /bin/false sshd
以下のようにインストール。
./configure --with-pam --with-tcp-wrappers --with-ipv4-default
make
make install
インストール先:
sshd ... /usr/local/sbin
ssh ... /usr/local/bin
設定ファイルは /usr/local/etc

PAMの設定

ソースディレクトリに移ってから、以下のようにsshd.pamをコピーする。
cp contrib/redhat/sshd.pam /etc/pam.d/sshd

サーバ鍵の作成

インストール時に作成されている。新しく作成するには、 ソースディレクトリに移ってから、以下のように実行する。
ssh-keygen -t rsa1 -f /usr/local/etc/ssh_host_key -N ""
ssh-keygen -t rsa -f /usr/local/etc/ssh_host_rsa_key -N ""
ssh-keygen -t dsa -f /usr/local/etc/ssh_host_dsa_key -N ""
結果として -f オプションで指定したファイルに秘密鍵が、 <ファイル名>.pub に公開鍵が作成される。

/etc/hosts.allow と /etc/hosts.deny の設定

hosts.deny は
ALL:ALL
のような設定。ただし、xinetd 等を同時稼動させている場合は、 何も書き込ない。

hosts.allow は

.....
sshd:192.168.0.
ALL:127.0.0.1
というようにする。

OpenSSH のサーバ設定ファイル(/usr/local/etc/sshd_config)の設定

書き換えた部分は以下の通り
PermitRootLogin no
PasswordAuthentication no 
基本的にコメント部分の設定がデフォルトであるので、そのままにした。

OpenSSH のクライアント設定ファイル(/usr/local/etc/ssh_config)の設定

このファイルはリモートから接続してくるユーザのデフォルト値を 指定する。ユーザマシン上に ~/.ssh/config で設定した値があれば、 そちらが優先される。

OpenSSH サーバデーモン(sshd)の起動

最初は以下のようにデバッグモードで起動して、クライアントが うまく接続できることを確認する(この場合、接続が終了した時点で sshd も終了する。)。
/usr/local/sbin/sshd -d -f /usr/local/etc/sshd_config
クライアントがうまく接続できたら、以下のように起動する。
/usr/local/sbin/sshd -f /usr/local/etc/sshd_config

OpenSSH クライアントの設定


小林 茂雄 (E-Mail:<shigeo@tinyforest.gr.jp>)