CentOSでサーバー公開するためのセキュリティ設定メモ
セキュリティ設定メモ
全パッケージのアップデート
# yum –y update
root アカウントにメールアドレス設定
# vi /etc/aliases root: メールアドレス
設定更新
newaliases
テスト送信
echo test|mail root
ssh 設定
リモートからの root ログインを無効
# vi /etc/ssh/sshd_config PermitRootLogin no PermitEmptyPasswords no
root になれるユーザーを限定
root になれるユーザーは wheel グループのみ。
# usermod -G wheel ggc
# visudo %wheel ALL=(ALL) ALL
ポート番号を変更
# vi /etc/ssh/sshd_config Port 10022
ssh 再起動。
/etc/init.d/sshd restart
iptables 設定
INPUT, FORWARD, OUTPUTを一旦全て閉じる。 使用するIPのポートのみ空ける。 今回は アクセス許可IPの https(443) とローカルのみ。
# vi /etc/sysconfig/iptables # Generated by iptables-save v1.4.7 on Thu May 1 20:30:59 2014 *filter :INPUT DROP [0:0] :FORWARD DROP [0:0] :OUTPUT DROP [0:0] -A INPUT -i lo -j ACCEPT -A INPUT -m state --state ESTABLISHED,RELATED -j ACCEPT -A INPUT -s 200.000.000.000 -p tcp -m tcp --dport 443 -j ACCEPT -A INPUT -s 192.168.36.0/24 -j ACCEPT COMMIT # Completed on Thu May 1 20:30:59 2014
再起動
# /etc/init.d/iptables restart
ログ監視設定
ログ監視ツールとして logwatch をインストールする。 1日一回ログの内容を整形して root にメールを送ってくれる。
# yum install logwatch
ウィルス対策ソフト設定
保険的な対策も含めて導入。 オープンソースのウィルス対策ソフトである Clam AntiVirus を導入する。
EPEL リポジトリ導入
# rpm -Uvh http://dl.fedoraproject.org/pub/epel/6/x86_64/epel-release-6-8.noarch.rpm
Clam AntiVirus 導入
# yum –y --enablerepo=epel install clamd
root 権限で動作するように変更。
# vi /etc/clamd.conf #User clamav
起動と自動起動設定。
# /etc/rc.d/init.d/clamd start # chkconfig clamd on
ウィルス定義ファイル最新化。 ウィルス定義ファイル更新機能の有効化。
# vi /etc/freshclam.conf #Example
ウィルススキャンテスト。
# clamscan --infected --remove --recursive
デイリーでのチェック設定
結果を root のメールアドレスに送信。 /etc/cron.daily に実行スクリプトを配置すると 毎日、AM 3:00 ごろに実行される。
# vi /etc/cron.daily/virusscan
#!/bin/bash PATH=/usr/bin:/bin # clamd update yum -y update clamd > /dev/null 2>&1 # excludeopt setup excludelist=/root/clamscan.exclude if [ -s $excludelist ]; then for i in `cat $excludelist` do if [ $(echo "$i"|grep \/$) ]; then i=`echo $i|sed -e 's/^\([^ ]*\)\/$/\1/p' -e d` excludeopt="${excludeopt} --exclude-dir=^$i" else excludeopt="${excludeopt} --exclude=^$i" fi done fi # virus scan CLAMSCANTMP=`mktemp` clamscan --recursive --remove ${excludeopt} / > $CLAMSCANTMP 2>&1 [ ! -z "$(grep FOUND$ $CLAMSCANTMP)" ] && \ # report mail send grep FOUND$ $CLAMSCANTMP | mail -s "Virus Found in `hostname`" root rm -f $CLAMSCANTMP
実行権限付加。
# chmod +x virusscan
rootkit 検知ツールを導入
chkrootkit というrootkit 検知ツールを導入。 rootkitがLinuxサーバーにインストールされてしまっていないかチェック。
rootkit とは クラッカーが遠隔地のコンピュータに不正に侵入した後に利用するソフトウェアをまとめたパッケージ。
chkrootkit インストール
# yum --enablerepo=epel install chkrootkit
chkrootkit 存在を確認
# chkrootkit | grep INFECTED
上記chkrootkit実行結果として"INFECTED"という行が表示されなければ問題なし
デイリーでのチェック設定
結果を root のメールアドレスに送信。 /etc/cron.daily に実行スクリプトを配置すると 毎日、AM 3:00 ごろに実行される。
# vi /etc/cron.daily/chkrootkit
#!/bin/bash PATH=/usr/bin:/bin TMPLOG=`mktemp` # chkrootkit実行 chkrootkit > $TMPLOG # ログ出力 cat $TMPLOG | logger -t chkrootkit # SMTPSのbindshell誤検知対応 if [ ! -z "$(grep 465 $TMPLOG)" ] && \ [ -z $(/usr/sbin/lsof -i:465|grep bindshell) ]; then sed -i '/465/d' $TMPLOG fi # upstartパッケージ更新時のSuckit誤検知対応 if [ ! -z "$(grep Suckit $TMPLOG)" ] && \ [ -z $(rpm -V `rpm -qf /sbin/init`) ]; then sed -i '/Suckit/d' $TMPLOG fi # rootkit検知時のみroot宛メール送信 [ ! -z "$(grep INFECTED $TMPLOG)" ] && \ grep INFECTED $TMPLOG | mail -s "chkrootkit report in `hostname`" root rm -f $TMPLOG
実行権限付加。
# chmod +x virusscan
改ざん監視ソフト設定
AIDE オープンソースのホスト型侵入検知システム(HIDS)。 これを使うことで、ファイルの改ざん監視を行える。
AIDE のインストール
# yum install aide
設定ファイルの編集
必要のある場合は修正。
# vi /etc/aide.conf
データベースファイルの作成
# aide --init # cp /var/lib/aide/aide.db.new.gz /var/lib/aide/aide.db.gz
改ざんチェック
# aide --update
改ざんが検知されると以下のような結果が出力される。
AIDE found differences between database and filesystem!! Start timestamp: 2009-11-30 14:39:45 Summary: Total number of files=11247,added files=0,removed files=0,changed files=1 Changed files: changed:/bin/ls Detailed information about changes: File: /bin/ls Mtime : 2009-11-30 14:26:18 , 2009-11-30 14:39:39 Ctime : 2009-11-30 14:26:18 , 2009-11-30 14:39:39
データベースファイルの更新
# cp /var/lib/aide/aide.db.new.gz /var/lib/aide/aide.db.gz
監視ポリシー(aide.conf)
監視ポリシーは、インストール時の標準のものでも、例えば/etcや/bin配下などの広範囲にチェックを行う。 ただし、標準では、/var/logや/root配下もチェックするので ユーザーのログイン、rootがコマンドを実行しただけで、改ざんとして通知される。 こうした検知が煩わしい、もしくは独自ファイルの監視を行いたい場合、カスタマイズが必要。
例えば、以下の例の場合、全てのファイルに関して、 パーミッション、ユーザー、グループに変更があった場合、改ざんとして検知されます。
/ p+u+g
デイリーでのチェック設定
結果を root のメールアドレスに送信。 /etc/cron.daily に実行スクリプトを配置すると 毎日、AM 3:00 ごろに実行される。
# vi /etc/cron.daily/aide
#!/bin/bash # These settings are mainly for the wrapper scripts around aide, # such as aideinit and /etc/cron.daily/aide # This is the email address reports get mailed to MAILTO=root # Set this to suppress mailings when there's nothing to report #QUIETREPORTS=1 # This parameter defines which aide command to run from the cron script. # Sensible values are "update" and "check". # Default is "check", ensuring backwards compatibility. # Since "update" does not take any longer, it is recommended to use "update", # so that a new database is created every day. The new database needs to be # manually copied over the current one, though. COMMAND=update # This parameter defines how many lines to return per e-mail. Output longer # than this value will be truncated in the e-mail sent out. LINES=1000 # This parameter gives a grep regular expression. If given, all output lines # that _don't_ match the regexp are listed first in the script's output. This # allows to easily remove noise from the aide report. NOISE="" # This parameter defines which options are given to aide in the daily # cron job. The default is "-V4". AIDEARGS="" PATH="/sbin:/usr/sbin:/bin:/usr/bin" LOGDIR="/var/log/aide" LOGFILE="aide.log" CONFFILE="/etc/aide.conf" ERRORLOG="error.log" ERRORTMP=`mktemp -t "$ERRORLOG".XXXXXXXXXX` [ -f /usr/sbin/aide ] || exit 0 AIDEARGS="-V4" if [ -f /etc/default/aide ]; then . /etc/default/aide fi FQDN=`hostname -f` DATE=`date +"at %Y-%m-%d %H:%M"` # default values MAILTO="${MAILTO:-root}" DATABASE="${DATABASE:-/var/lib/aide/aide.db.gz}" LINES="${LINES:-1000}" COMMAND="${COMMAND:-check}" if [ ! -f $DATABASE ]; then ( echo "Fatal error: The AIDE database does not exist!" echo "This may mean you haven't created it, or it may mean that someone has removed it." ) | /usr/bin/mail -s "Daily AIDE report for $FQDN" $MAILTO exit 0 fi aide $AIDEARGS --$COMMAND >"$LOGDIR/$LOGFILE" 2>"$ERRORTMP" RETVAL=$? if [ -n "$QUIETREPORTS" ] && [ $QUIETREPORTS -a \! -s $LOGDIR/$LOGFILE -a \! -s $ERRORTMP ]; then # Bail now because there was no output and QUIETREPORTS is set exit 0 fi (cat << EOF; This is an automated report generated by the Advanced Intrusion Detection Environment on $FQDN ${DATE}. EOF # include error log in daily report e-mail if [ "$RETVAL" != "0" ]; then cat > "$LOGDIR/$ERRORLOG" << EOF; ***************************************************************************** * aide returned a non-zero exit value * ***************************************************************************** EOF echo "exit value is: $RETVAL" >> "$LOGDIR/$ERRORLOG" else touch "$LOGDIR/$ERRORLOG" fi < "$ERRORTMP" cat >> "$LOGDIR/$ERRORLOG" rm -f "$ERRORTMP" if [ -s "$LOGDIR/$ERRORLOG" ]; then errorlines=`wc -l "$LOGDIR/$ERRORLOG" | awk '{ print $1 }'` if [ ${errorlines:=0} -gt $LINES ]; then cat << EOF; **************************************************************************** * aide has returned many errors. * * the error log output has been truncated in this mail * **************************************************************************** EOF echo "Error output is $errorlines lines, truncated to $LINES." head -$LINES "$LOGDIR/$ERRORLOG" echo "The full output can be found in $LOGDIR/$ERRORLOG." else echo "Errors produced ($errorlines lines):" cat "$LOGDIR/$ERRORLOG" fi else echo "AIDE produced no errors." fi # include de-noised log if [ -n "$NOISE" ]; then NOISTEMP=`mktemp -t aidenoise.XXXXXXXXXX` NOISTEMP2=`mktemp -t aidenoise.XXXXXXXXXX` sed -n '1,/^Detailed information about changes:/p' "$LOGDIR/$LOGFILE" | \ grep '^\(changed\|removed\|added\):' | \ grep -v "^added: THERE WERE ALSO [0-9]\+ FILES ADDED UNDER THIS DIRECTORY" > $NOISETMP2 if [ -n "$NOISE" ]; then < $NOISETMP2 grep -v "^\(changed\|removed\|added\):$NOISE" > $NOISETMP rm -f $NOISETMP2 echo "De-Noised output removes everything matching $NOISE." else mv $NOISETMP2 $NOISETMP echo "No noise expression was given." fi if [ -s "$NOISETMP" ]; then loglines=`< $NOISETMP wc -l | awk '{ print $1 }'` if [ ${loglines:=0} -gt $LINES ]; then cat << EOF; **************************************************************************** * aide has returned long output which has been truncated in this mail * **************************************************************************** EOF echo "De-Noised output is $loglines lines, truncated to $LINES." < $NOISETMP head -$LINES echo "The full output can be found in $LOGDIR/$LOGFILE." else echo "De-Noised output of the daily AIDE run ($loglines lines):" cat $NOISETMP fi else echo "AIDE detected no changes after removing noise." fi rm -f $NOISETMP echo "============================================================================" fi # include non-de-noised log if [ -s "$LOGDIR/$LOGFILE" ]; then loglines=`wc -l "$LOGDIR/$LOGFILE" | awk '{ print $1 }'` if [ ${loglines:=0} -gt $LINES ]; then cat << EOF; **************************************************************************** * aide has returned long output which has been truncated in this mail * **************************************************************************** EOF echo "Output is $loglines lines, truncated to $LINES." head -$LINES "$LOGDIR/$LOGFILE" echo "The full output can be found in $LOGDIR/$LOGFILE." else echo "Output of the daily AIDE run ($loglines lines):" cat "$LOGDIR/$LOGFILE" fi else echo "AIDE detected no changes." fi ) | /bin/mail -s "Daily AIDE report for $FQDN" $MAILTO
prelink を無効化
以下の警告が発生
/usr/sbin/prelink: /usr/sbin/luserdel: at least one of file's dependencies has changed since prelinking
prelink 無効化
vi /etc/sysconfig/prelink PRELINKING=no
/usr/sbin/prelink -ua
Linuxサーバーセキュリティ徹底入門 オープンソースによるサーバー防衛の基本
- 作者: 中島能和
- 出版社/メーカー: 翔泳社
- 発売日: 2013/10/22
- メディア: 大型本
- この商品を含むブログ (4件) を見る