#セキュリティ設定メモ
##全パッケージのアップデート
# 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