30分で構築できる運用管理環境とセキュリティ対策

 安定した運用を続けていくためには,サーバー管理者による日々のサーバー管理が欠かせない。グループウエアの運用を開始し,業務の一部として機能し始めると,システム・ダウンが業務に及ぼす影響が計り知れなく大きくなるからだ。

 さらに,グループウエアではシステムが停止せずに稼働すること以上に,内部に蓄積されたデータが安全・確実に保持されることが重要だ。システムは復旧できても,いったん失ったデータは二度と元に戻らないからだ。そのため,ハード・ディスク障害などのアクシデント発生に備え,データを保護しておくことが不可欠である。

 データを保護する対策としては,主に,ハード・ディスクの冗長化とバックアップの2種類がある。ハード・ディスクの冗長化はOS側にまかせるとして,ここではLa!cooda WIZのバックアップ手順を紹介しよう。

バックアップファイルとDB内のデータを保存

 バックアップ対象となるファイルやデータは,(1)ファイル共有やワークフローでアップロードしたファイル群,(2)掲示板管理ファイル,(3)グループウエア設定ファイル(gw.php),(4)データベース管理システム「MySQL」に保存されているデータ,の4つだ。

 (1)は,gw.phpの「$savefile_path」で指定したディレクトリに格納されている。デフォルトでは,/var/www/html/wiz/filesディレクトリ以下のファイルだ。( 2 )は,w i z ディレクトリ( 連載では「/var/www/html/wiz/」)配下のbbs/admin/settingsディレクトリ内に格納されているファイルである。(3)は,wizディレクトリ内に格納されている。

 この(1)から(3)までは,すべて独立したファイルなので,テープなどのバックアップ・メディアやネットワーク経由で別のマシンのディスクなどに,そのままコピーして保存するだけで構わない。また,すべてのファイルはwizディレクトリ内に保存されているため,wizディレクトリごとコピーしてもよい。

 例えば,wizディレクトリ全体をtarコマンドでまとめてgzipコマンドにより圧縮して1つのファイル(ここでは,/rootディレクトリ内の「wizbackup.tar.gz」とする)に保存するには,

$ su
# cd /var/www/html
# tar cvzf /root/wizbackup.
tar.gz wiz

のようにコマンドを発行する。そして,このファイルをテープや別のマシンにコピーすればよいだろう。

MySQLのバックアップ

 (4)のMySQLに保存されているデータをバックアップする方法としては,主に,「論理バックアップ」と「物理バックアップ」の2種類がある。

 前者は,データベースを停止せずにバックアップを取得する方法だ。一方,後者はデータベースを停止させて,確実にバックアップを取得する方法である。

 前者の場合,データベースに更新処理が行われていない状態,つまりユーザーからのアクセスがない状態にしなければならない。さもないと,バックアップしたデータから復旧した際にデータに不整合が起こるかもしれないからだ。運用方法を考慮して,どちらかの方法を選択していだたきたい。

(1)論理バックアップとリストア

 論理バックアップには,MySQL付属のmysqldumpユーティリティを用いる。このユーティリティでは,SQLを用いたテキスト形式のダンプ・ファイルとしてデータベースの中身を出力できる。そのため,部分的なリストアも可能だ。

 例えば,次のように実行すると,
# mysqldump -u root -phogehoge --single-transaction masters > /root/masters_dump.sql

/rootディレクトリ以下のダンプ・ファイル「masters_dump.sql」に,バックアッ プが作成される。

 なお,ここで指定した,mysqldumpユーティリティのオプションの意味は,MySQLのマニュアル「4.9.7 mysqldump(テーブル構造とデータのダンプ)」(http://dev.mysql.com/doc/mysql/ja/mysqldump.html)を見て理解していただきたい。

 リストアには,mysqlユーティリティを用いる。ただし,mysqldumpが生成するSQL文は,テーブル名称順になる。その場合,InnoDB形式で外部参照キーが定義されているとテーブルの作成に失敗する。そこで,ダンプ・ファイルの先頭に,
SET FOREIGN_KEY_CHECKS=0;

を追記してから,mysqlユーティリティに読み込ませる必要がある。
 リストアの手順としては,

# mysqladmin -u root -phogehoge drop masters
# mysqladmin -u root -phogehoge create masters
# mysql -u root -phogehoge masters < /root/masters_dump.sql
のように,mastersデータベースをいったん削除し,新しく作成してダンプ・ファイルを読み込ませる。

(2)物理バックアップとリストア

 24時間,常に運用しているシステムではなかなか難しいのだが,システムを一定時間停止できれば,物理バックアップの方が確実だ。

 手順としては,データベースが含まれるディレクトリをすべてバックアップしてしまうのが良いだろう。

 MySQLをいったん停止し,データベースが含まれる/var/lib/mysqlディレクトリをtarコマンドでまとめて,gzipコマンドにより圧縮して1 つのファイル(mysqldata.tar.gz)として作成する。
# /sbin/service mysql stop
# cd /var/lib/
# tar cvzf /root/mysqldata.tar.gz mysql

 これをテープなどのバックアップ・メディアに保存すればよいだろう。バックアップを作成し終えたら,必ず運用が再開できるように,MySQLを起動しておく。
# /sbin/service mysql start

パフォーマンスの維持 不要なデータを削除

 グループウエアの運用を続けていくと,データ量やログの増加により性能が劣化することがある。日々の運用管理として性能を劣化させないことも重要だ。

そこで,初期の性能を維持できる方法を紹介しよう。

一定期間経過したデータを消す

 グループウエアが保存する情報には,スケジュール,当番表,施設予約,アクセス・ログなどのように,時間が経過してしまうと価値がなくなる情報と,共有ファイルや掲示板のように時間を経過しても価値を持つ情報の2種類がある。前者のデータであれば,ある一定の期間を過ぎたデータを削除した方がハード・ディスクの無駄な領域を減らし,データ量の増大も防げる。

 例えば,“1年以上経過したスケジュールなどのデータは削除する”といった,グループウエアの運用ポリシーを策定したとしよう。この運用ポリシーに従って,機械的にデータを削除することもできる。

 削除対象になるデータは,スケジュール,当番表,施設予約とアクセス・ログの4つになる。それぞれデータは,「schedule2」「touban」「reservation」「gwlog」のテーブルに格納されている。図1に示したシェル・スクリプト(wiz_deldata.sh)を作成し,cronコマンドで毎月1回実行する(図2)
 なお,図1の3行目のdateコマンドのパラメータを書き換えれば,保存期間を任意に指定できる。詳しくはdateコマンドのマニュアルを参照していただきたい。

図1 1年以上経過したスケジュールなどのデータを削除するスクリプト(wiz_deldata.sh)
1:#!/bin/sh
2:
3:R=$(date --date '1 years ago' +%Y-%m-%d)
4:DBNAME=masters
5:MYSQL='/usr/bin/mysql'
6:USER=root
7:PASSWORD=hogehoge
8:
9:if [ -f $MYSQL ]
10:then
11::
12:else
13: echo "mysql file is nothing"
14: exit
15:fi
16:
17:/bin/echo 'delete old data'
18:
19:/bin/echo "DELETE FROM schedule2 WHERE scdl_e_date <= '$R' OR 
scdl_s_date <= '$R' AND scdl_e_date IS NULL;" | $MYSQL -u $USER -p$PASSWORD $DBNAME
20:
21:/bin/echo "DELETE FROM touban WHERE touban_date <= '$R';"
 | $MYSQL -u $USER -p$PASSWORD $DBNAME
22:
23:/bin/echo "DELETE FROM reservation WHERE rsv_date <= '$R';"
 | $MYSQL -u $USER -p$PASSWORD $DBNAME
24:
25:/bin/echo "DELETE FROM gwlog WHERE record_time <= '$R';"
 | $MYSQL -u $USER -p$PASSWORD $DBNAME
(:の前は行番号)
図2 cronコマンドによりwiz_deldata.shを定期実行 毎月1日に実行される。
# chmod +x /root/wiz_deldata.sh
# crontab -e
を実行し,以下の1行を書き加える
* * 1 * * /root/wiz_deldata.sh

セキュリティ対策基本から応用まで

 セキュリティ対策と一口で言っても,情報漏えいの防止や,ウイルスやワームからのデータ保護など,さまざまなものがある。また,ある一部分だけをセキュアにしても,ほかが弱いのであれば,セキュリティ対策として不十分だ。当然,これだけやっておけば完璧という線引きはないのだが,インターネットに接続して稼働させるグループウエアとして,最低限必要な対策を施しておこう。

最も基本となるセキュリティ対策

 インターネットに接続するサーバーの基本的なセキュリティ対策は以下の3点である。
(1)不要なサービスを停止する
(2)不要なポートを閉じる
(3)定期的にアップデートする

 いずれも,システム全体で弱い部分を減らし,クラッキングなどからサーバーを守るために効果的な方策だ。不要なサービスが起動されていなければ,それをターゲットとする攻撃は無効になる。不要なポートを閉じておけば,そのポートへは外部から攻撃することすらできない。さらに,定期的にソフトウエアをアップデートしておけば,既に発見されているセキュリティ・ホールへの攻撃も未然に防げるだろう。

 本連載第1回ではインストールや設定作業を円滑に行えるよう,不要なサービスを立ち上げたままにしておいたり,不要なポートをふさぐファイアウオールの設定をオフにしていた。ここで,不要なサービスを止め,ファイアウオールを有効にしよう。

(1)不要なサービスを停止する

 Fedora Core2において,既に起動しているサービスを停止するには,
# /sbin/service サービス名 stop
のように実行する。本連載のようにFedora Core2をインストールしたのなら,表1に示したサービスだけは止めておこう。

表1 不必要なサービス
サービス名/説明
apmd/ラップトップ用のAPM (Advanced Power Management) BIOSユーティリティ。
電源のON/OFFの頻度が低いサーバーでは不要
canna/日本語入力システム。日本語入力を行わない場合や別のものを使う場合は不要
FreeWnn/日本語入力システム。日本語入力を行わない場合や別のものを使う場合は不要
cups/UNIX共通プリンティング・システム。プリント・サーバーとして使用しない場合は不要
netfs/NFS(Network File System)関連のサービス。NFSを使わない場合は不要
nfslock/NFS関連のサービス。NFSを使わない場合は不要
portmap/RPC(Remote Procedure Call)接続を管理するサービス。
NIS(Network Information Service)やNFSを使わない場合は不要

 なお,serviceコマンドで不要なサービスを止めただけでは不十分である。システムを再起動した際に自動的に起動されてしまうからだ。自動起動するサービスの設定には,ntsysvコマンドもしくはchkconfigコマンドを用いる。
# /usr/sbin/ntsysv
により,CUIの設定画面を起動し,停止させたいサービスの「*」を外す。あるいは,
# /sbin/chkconfig サービス名 off
により停止させる。

(2)不要なポートを閉じる

 Fedora Core 2では,Linuxカーネルに標準で組み込まれているファイアウオール・ソフト「iptables」を使用する。setupコマンドを実行して「ファイヤーウォールの設定」を選び,起動したCUI画面から必要な設定を施す。

# /usr/sbin/setup
 〔カスタマイズ〕ボタンを押下し,「受信を許可」項目の「SSH」と「WWW(HTTP)」を選択して〔OK〕ボタンを押す。このように設定すれば,SSH(Secure SHell)が利用するポート番号(22番)とHTTPおよびHTTPSによるアクセスのポート番号(80番および443番)などの必要なポート以外は閉じられる。

 最後に「セキュリティレベル」の「有効」にチェックを付けて,〔OK〕ボタンを押すと設定が反映される。

 ちなみに,ここで実施したファイアウオールの設定は,/etc/sysconfig/iptablesファイルに記録される(図3)。CUIからでも任意のポートを開けるなどの設定は可能だが,より木目細かい設定をするのなら,/etc/sysconfig/iptablesファイルを直接編集しよう。書き換えた設定を反映させるには,iptablesを再起動すればよい。

図3 ファイアウオールの設定 /etc/sysconfig/iptablesファイルに書き込まれる。
# Firewall configuration written by system-config-securitylevel
# Manual customization of this file is not recommended.
*filter
:INPUT ACCEPT [0:0]
:FORWARD ACCEPT [0:0]
:OUTPUT ACCEPT [0:0]
:RH-Firewall-1-INPUT - [0:0]
-A INPUT -j RH-Firewall-1-INPUT
-A FORWARD -j RH-Firewall-1-INPUT
-A RH-Firewall-1-INPUT -i lo -j ACCEPT
-A RH-Firewall-1-INPUT -p icmp --icmp-type any -j ACCEPT
-A RH-Firewall-1-INPUT -p 50 -j ACCEPT
-A RH-Firewall-1-INPUT -p 51 -j ACCEPT
-A RH-Firewall-1-INPUT -m state --state ESTABLISHED,RELATED -j ACCEPT
-A RH-Firewall-1-INPUT -m state --state NEW -m tcp -p tcp --dport 22 -j ACCEPT
-A RH-Firewall-1-INPUT -m state --state NEW -m tcp -p tcp --dport 80 -j ACCEPT
-A RH-Firewall-1-INPUT -m state --state NEW -m tcp -p tcp --dport 443 -j ACCEPT
-A RH-Firewall-1-INPUT -j REJECT --reject-with icmp-host-prohibited
COMMIT

# /usr/sbin/service iptables restart

(3)定期的なアップデート

 ソフトウエアの定期アップデートには,Fedora Core2が備える「yum」(Yellowdog Updater Modified)を用いる。定期アップデートを有効にするには,yum のサービスを起動するだけでよい。

# /sbin/chkconfig yum on
# /usr/sbin/service yum start

 この設定により毎日午前4時2分にアップデートが実行される。

バッファ・オーバーフロー対策

基本的なセキュリティ対策を実施したら,典型的な攻撃に対する防御も施そう。コンピュータを攻撃する代表的な方法として,バッファ・オーバーフローを悪用するものがある。これは,不正プログラムを含んだ多量のコードをコンピュータに送り込み,プログラムが用意したバッファをあふれさせ,関数の戻り値を書き換えるという方法だ。うまく書き換えることができれば,送り込んだ不正プログラムが関数実行の終了時に起動される。最悪の場合,root権限を取られてしまうこともあり得る。バッファ・オーバーフローを悪用した攻撃を防ぐ対策もぜひ実施しておきたい。

(1)Libsafeを用いる

 「Libsafe」は,スタック・バッファ・オーバーフローを引き起こす原因となる,C言語の関数(strcpyやgets)に渡すデータの境界値を事前にチェックしたり,スタックの戻りアドレスやフレーム・ポインタの正当性をチェックしたりすることで,攻撃を察知して防御するライブラリである。

 Libsafeは,次のようにバイナリ・パッケージを入手し,rpmコマンドで導入できる。

$ wget http://www.research.avayalabs.com/project/libsafe/src/libsafe-2.0-16.i386.rpm
# su
# rpm -ivh libsafe-2.0-16.i386.rpm

 Libsafeをインストールすると,システム全体で,Libsafeを使用する設定になる。正常に動作しているかは,Libsafeのバイナリ・パッケージに含まれるテスト用のバッファ・オーバーフロー攻撃ツールにより確認できる。攻撃ツールを実行し,図4のように「セグメンテーション違反です」と表示されれば,Libsafeのバッファ・オーバーフロー防御機能が有効になっている。

図4 Libsafeの動作確認 「セグメンテーション違反です」と表示される。
# /usr/doc/libsafe-2.0/exploits/t1
This program tries to use strcpy() to overflow the buffer.
If you get a /bin/sh prompt, then the exploit has worked.
Press any key to continue...
セグメンテーション違反です

 必ずApacheでも有効になっていることを確認しよう。図5のようにlddコマンドを実行して,「/lib/libsafe.so.2 => /lib/libsafe.so.2」という行が表示されると,Libsafeのライブラリが呼び出されていることが確認できる。

 ただし,Libsafeの防御機能は既に動作中のプロセスには適用されない。最後にすべてのプロセスに適用されるようにマシンを再起動する。

なお,Libsafeは共有ライブラリとしてインストールされる。そのため,ライブラリが静的にリンクされたコマンドには無効だ。さらに,すべての関数がチェックされるわけではないし,ヒープ領域で発生するバッファ・オーバーフローには無効であることに注意されたい。

(2)Exec-Shieldを用いる

 Fedora Coreは,「Exec-Shield」という,バッファ・オーバーフローによる攻撃を防止する機能を備えている。具体的には,スタックを含む,いくつかの領域に実行権限を与えない機能と,領域の配置をランダムに変更する機能だ。Fedora Core2では,後者の機能は既に有効になっている。一方,前者は有効になっていない。

 前者の機能を常に有効にするには,カーネルの起動時オプションに「execsh i e l d = 2 」を指定する。それには,/etc/grub.confファイルの,起動するカーネルを指定している行に「e x e c -shield=2」のオプションを追加し,マシンを再起動する。
kernel /vmlinuz-2.6.8-1.521
ro root=LABEL=/ rhgb execshield=
2 quiet

 有効になれば,
# cat /proc/sys/kernel/exec-shield
のコマンドにより「2」が表示される。
 もし,Exec-Shield により動作しないプログラムがあった場合は,個々の実行ファイルごとに無効にする。以下は,メール・サーバー「Postfix」の実行ファイルに対し,Exec-Shieldを無効にした例だ。

# execstack -s /usr/sbin/postfix
# execstack -q /usr/sbin/postfix
X /usr/sbin/postfix

 -sオプションで無効に設定する。また,-qオプションで有効と無効が確認できる。「X」が無効,「-」が有効である。ちなみに有効にするには,-cオプションを用いる。

# execstack -c /usr/sbin/postfix
# execstack -q /usr/sbin/postfix
- /usr/sbin/postfix

WAFによる対策

 たとえ,Apacheを最新の状態に保っていたとしても,Apacheの設定ミスやWebアプリケーションのバグにより,SQLインジェクションやクロス・サイト・スクリプティングなどの攻撃からサーバーを守れないことは十分にあり得る。何かの対策を施しておかなければならない。そこで,Apache用のWebアプリケーション・ファイアウォール(WAF)である「mod_security」を導入してセキュリティを高めよう(図6)。

このmod_securityは,Webアプリケーション用の侵入検知・防止エンジンであり,Apacheのモジュールとして動作する。そして,Webサーバーのすべての入出力をチェックし,設定したフィルタリング・ルールを用いて不正な文字列を検出した場合に,その文字列を含む通信をブロックできる。

(1)mod_securityの導入

 まず,mod_securityをビルドするのに必要なhttpd-develパッケージを導入する。

# yum install httpd-devel
:
Is this ok [y/N]:y
:
# exit

 次にmod_securityのソース・アーカイブを入手し,展開する(執筆時点の最新バージョンは1.8.6)。
$ wget http://www.modsecurity.org/download/mod_security-1.8.6.tar.gz
$ tar -xvzf mod_security-1.8.6.tar.gz

 最後に,Apacheのapxsコマンドでモジュールのコンパイルや設定を施す。

$ cd mod_security-1.8.6/
apache2/
$ su
# /usr/sbin/apxs -cia mod_security.c

 ちなみに,apxsコマンドに指定した-c オプションによりコンパイルが実行され,-aオプションによりApacheの起動時にmod_securityが読み込まれるように/etc/httpd/conf/httpd.confファイルに設定が書き込まれる。そして,-iオプションにより,/usr/lib/httpd/modulesディレクトリにコンパイルされたモジュールのファイル(mod_security.so)が格納される。

(2)mod_securityの設定

 mod_securityを導入したら,フィルタリング・ルールを作成する。フィルタリング・ルールは,/etc/httpd/conf.d/mod_security.confファイルに書き込まれている(図7)。これをカスタマイズしよう。HTTPのリクエストに対するフィルタリング・ルールは,SecFilterディレクティブを用いて記述する。書式は以下の通りだ。「キーワード」には,通信を遮断したいキーワード(正規表現が使用可能)を,「アクション」には,キーワードと一致した際の動作(allow,deny,status,redirect,execなど)を記述する。ちなみにアクションは省略可能である。

SecFilter "キーワード" ["アクション" ]

リクエストではなく,ヘッダーやパラメータなどのフィルタリングする場合は,SecFilterSelectiveディレクティブを使う。

SecFilterSelective "位置" "キーワード" ["アクション")]

 なお,SecFilterScanPOSTディレクティブを「On」にすると,フォーム内に入力した「<」「>」や「'」などの特殊文字を検知すると通信が遮断される。HTMLタグなどの入力を許可したい場合には注意が必要だ。

 書き換えたフィルタリング・ルールを有効にするには,Apacheを再起動する。

# /sbin/service httpd restart

 通信を遮断した際には,/var/log/httpd/audit_logファイルにアクセス・ログが記録される。図8に示したものは,Windows用のWebサーバー・ソフト「IIS」(Internet Information Server/Services)のセキュリティ・ホールを狙ったワーム「Nimda」によるアタックのログである。

ログ監視 管理者にメールで通知

 それでは,最後にFedora Core2のログ監視機能を紹介しよう。日々の運用管理に役立てていただきたい。

 Fadora Core 2には「Logwatch」というログ監視ツールが含まれている。Logwatchは,/etc/log.d/conf/logwatch.confファイルに設定した内容を基にして,毎日4時2分に各種ログをチェックして管理者にメールを送るソフトウエアだ。標準で導入されるため,すぐに使える。

 例えば,管理者を「root」にし,すべてのサービスのログを詳細なレポートとしてメールにて日々送信するには,/etc/log.d/conf/logwatch.confファイルの以下の個所を書き換える。

MailTo = root
これでrootにログ情報が送信される。

Detail = High

にすると,詳細なレポートが出力される。

Service = All

にしてあれば,/etc/log.d/scripts/servicesディレクトリ配下にある,すべてのサービスのログが監視対象になる。ディスク容量も監視対象になるため,ディスクの空き領域不足も未然に避けられることだろう。

***
セキュリティには完全な対策方法はないことを念頭に置き,運用に入ってからも,ネットワーク監視の「Snort」,改ざん検知の「Tripwire」,ログ監視のや「Swatch」などのソフトウエアも必要に応じて導入し,より強固なセキュリティ対策を実施していただきたい。さらに,セキュアOS「SELinux」やLinux侵入検知システム「LIDS」(Linux Intrusion Detection System)などを用いて,Linux自体のセキュリティを高めることも良い方法だ。

連載第2回目までが終了したが,連載では紹介し切れないことが多数ある。システム・コンサルタンツがまとめている,La!cooda WIZに関するよくある質問と回答「FAQ(Frequently AskedQuestions)」(http://wiz.syscon.co.jp/FAQ.htm),またはLa!cooda WIZユ ーザー・コミュニティのサイト「La!cooda WIZ ファンクラブ♪」(http://wiz.syscon.co.jp/xoops/)なども活用していただきたい。

図8 遮断された通信のログ(/var/log/httpd/audit_log)
Windows用のWebサーバー・ソフト「IIS」(Internet Information Server/Services)のセキュリティ・ホールを狙ったワーム「Nimda」によるアタックのログである。
========================================
Request: xxx.xxx.xxx.xxx - - [07/Nov/2004:18:31:14 +0900] "GET /scripts/..%255c../w
innt/system32/cmd.exe?/c+dir HTTP/1.0" 406 360
Handler: (null)
----------------------------------------
GET /scripts/..%255c../winnt/system32/cmd.exe?/c+dir HTTP/1.0
Host: www
Connnection: close
mod_security-message: Access denied with code 406. Pattern match "\.\./" at THE_
REQUEST
mod_security-action: 406
HTTP/1.0 406 Not Acceptable
Content-Length: 360
Connection: close
Content-Type: text/html; charset=iso-8859-1




  1. 導入から15分以内で運用開始
  2. 30分で構築できる運用管理環境とセキュリティ対策
  3. 1時間以内で便利な新機能を追加する
  4. La!cooda WIZ 情報源



あのオープンソースがガチンコ!

インストールはラクラク簡単、5分で完了!

ムリ・ムラ・ムダをなくすグループウェア「ラクーダST」とは。

[PR] 短期・高収入・高校生向けのバイト検索
パートやアルバイトを探すのに、いまやパソコンや携帯電話を使ってネットで検索するのが常識。




実践グループウェア構築術


ウィルス対策ソフトなんてどれも同じだと考えていませんか?検出性能か、価格か、ブランドか、あなたに合ったベストソリューションはどれ? ウイルス対策ソフトに関するトピックスをメールマガジンでお知らせしています
まぐまぐ Logo ウィルス対策ソフトを比較するメルマガ をまぐまぐで登録
電子メールアドレス(半角):


ウイルス対策ソフト メニュー

ESET Smart Security

シマンテック ノートン

ウイルスバスター

マカフィー

NOD32

ウイルスセキュリティZERO

Copyright(c) 1999-2017 ITNAVI.com サイト運営者情報