HOMEインデックス

自宅サーバー構築記


11.セキュリティの見直し

a. 攻撃は止まず

  • 毎日、ルータのファイヤーウォール機能で、かなりの数の不正アクセスを検知している。しかし本当に全ての不正アクセスをルータで防いでいるのかは疑問だった。そこでサーバ側にもパケットフィルタリングの設定をしてみることにした。また動作プロセスやアカウントなどセキュリティの基本も同時に見直すことにした。見直す観点は「日本のLinux情報」の"初心者必見、セキュリティ始めの1歩"、@ITの"ゼロから始めるLinuxセキュリティ"などを参考にした。

b. ユーザアカウント、パスワード

  • まずシャドウパスワードは有効になっていた。/etc/passwdファイルにはパスワードはxで表示され、rootしかみることのできない/etc/shadowファイルに記録されている。
  • MD5暗号化パスワードも有効になっていて、パスワードの暗号化はされているため/etc/shadowファイル内のパスワードはスクランブルされ判読不能だった。
  • suコマンドでroot権限になれるユーザの制限はされていなかったので以下のように定義した。これはPAMの機能を使用している。PAM(Pluggable Authentication Modules)とは様々な認証方式を一括管理しているシステムで個々のプログラムはPAMに認証を任せることで開発の負荷を軽減している。PAMの設定ファイルは/etc/pam.dディレクトリにプログラム(例:su)ごと存在する。
  • /etc/login.defsファイルに以下の1行を追加する。

SU_WHEEL_ONLY yes

  • /etc/groupファイルのwheelの行を修正する。ここではuserのみrootになることが許される。

wheel:x:10:root,user

  • /etc/pam.d/suファイルに以下の行を追加する。

auth required /lib/security/pam_wheel.so use_uid group=wheel

c. セキュリティホールの存在するプログラムは動いていないか

  • 不要なプロセスは起動しないようにする。
  • vine linux v2.5からv2.6r3にup。カーネルも最新版に。
  • apt-get dist-upgradeの前に/etc/apt/sources.listの記述を修正

rpm http://updates.vinelinux.org/apt 2.6/$(ARCH) main updates
rpm-src http://updates.vinelinux.org/apt 2.6/$(ARCH) main updates

d. inetdの設定は大丈夫か

  • だいたいinetdとは何なのか?通常のサーバマシンではftpサーバやtelnet、その他いろいろなサービスがクライアントからの要求を待っている。クライアントからの要求が無くても常にプロセスは立ち上がっていてメモリやCPUを消費している。inetdは各サービスへの要求(実はポート)をみはり、クライアントからの要求があった時だけ対応するサービスを実行するというスーパーサーバーの機能を果たすものです。だいたい今回はじめてinetdの存在を知ったのだから、どんなサービスが動いているかなんて知るわけがない。もしそのサービスの中にセキュリティホールが存在したらハッカーの標的にされるというわけだ。まずinetdの動作を定義する/etc/inetd.confに不要なサービスが定義されていないか確認する。実際全く使用しないのでinetd自体を起動しない様webminで設定する。Red Hat Linuxでは、バージョン7.0からinetdではなくxinetdが採用されているということだがVine Linuxはinetdのまま。inetdとTCP_Wrapperの機能を合わせ持ったものがxinetdということだがここでは省略する。

e. XDMの設定は大丈夫か

  • またしてもわからない言葉。調べると「XDM (the X Display Manager)は、コマンドラインのloginプロンプトをグラフィック環境に置きかえたもので、リモートマシンにログインプロンプトを表示させることもできる」XDMの設定いかんによって外部からサーバーにログインされる可能性があるということになる。大丈夫だとは思うが念のため確認しておく。設定ファイルは通常/usr/X11R6/lib/X11/xdm/Xaccessなので中を見ると見事に全て#でコメント化されている。問題なし。

f. iptablesによるパケットフィルタリング

  • やっと今回の本題となるパケットフィルタリングの設定。iptablesは標準でインストールされているので、インストール方法などは省略。以下のシェルスクリプトを作成した。

#!/bin/bash
#
#全てのchain(INPUT,FORWARD,OUTPUT)を削除
iptables -F
#
# まず基本的なルールとして、入力パケット(INPUT)、転送パケット(FORWARD)はDROP(破棄)。出力パケット(OUTPUT)はACCEPT(許可)とする。
iptables -P INPUT DROP
iptables -P FORWARD DROP
iptables -P OUTPUT ACCEPT
#
#port80(http)のみを許可
iptables -A INPUT -p tcp --dport 80 -j ACCEPT
iptables -A INPUT -p tcp --sport 80 -j ACCEPT
#
#応答パケット、FTPデータ受信を許可
iptables -A INPUT -m state --state ESTABLISH,RELATED -j ACCEPT
#
#ホストアドレス,クライアントアドレスに関しては制限無し。
iptables -A INPUT -s ローカルホストアドレス -j ACCEPT
iptables -A INPUT -s クライアントアドレス   -j ACCEPT
#
#上記以外はlog取得、その後、破棄
iptables -A INPUT -j LOG --log-prefix "iptables-log:"
iptables -A INPUT -j DROP
#上記ルールを/etc/sysconfig/iptablesに保存し次回にシステム起動に備える。
iptables-save > /etc/sysconfig/iptables

  • シェルスクリプトに実行権限を与え実行する。

# chmod 744 filename
#./filename

  • ルールの表示は以下のコマンドで確認する。

iptables -nL

g. 本当に防御しているか

  • これに関してはlogを見て判断するしかないが、/var/log/messagesには見事にiptablesでフィルタリングされた情報のメッセージが出力されていた。これでルータで完全に防ぎきれていないということも判明しiptablesの設定も意味あるものになった。

h. ルータログのサーバーへの転送

  • ルータにログの転送機能があることがわかったのでサーバーに転送してサーバー側でログ管理することにした。/etc/syslog.confに以下の赤色の部分の修正を加える。/var/log/routerはtouchコマンドで空ファイルとして作成しておく。これでsyslogを再起動すれば/var/log/routerにルータで取得したログが出力されるのだが、メルコ社AIR STATION WBR-B11のアタックブロック機能で検出されたログは/var/log/messagesに入ってしまう。この場合のファシリティはuserでないことになるが、いったいなんであるのかは不明。(2004/3/13追記 local1.*であることが判明)

# Log all kernel messages to the console.
# Logging much else clutters up the screen.
#kern.* /dev/console
#
# Log anything (except mail) of level info or higher.
# Don't log private authentication messages!
*.info;mail.none;authpriv.none;cron.none;user.none /var/log/messages
#
# The authpriv file has restricted access.
authpriv.* /var/log/secure
#
# Log all the mail messages in one place.
mail.* /var/log/maillog
#
# Log cron stuff cron.* /var/log/cron
#
# Everybody gets emergency messages, plus log them on another
# machine.
*.emerg *
#
# Save mail and news errors of level err and higher in a
# special file.
uucp,news.crit /var/log/spooler
#
# Save boot messages also to boot.log
local7.* /var/log/boot.log
#
#router log
user.* (この間はスペースではなくタブにすること) /var/log/router
#

  • /etc/rc.d/init.d/syslogにルータからのログを受け入れられるように-rオプションを以下のように追加する。

daemon syslogd -r $SYSLOGD_OPTIONS

HOMEインデックス