シェアする

【Raspbian】最低限必要なセキュリティを導入する

シェアする

セキュリティ対策はある程度必要
私のサーバでさえ一日に約720件近くの不正アタックが来ている

昨今の世の中では一般サーバであろうと熱烈アタッカー集団が探し出してアタックしてくる(特にスペインやアメ坊、チョン等)

よく【ただWEBを公開するだけだからここまでしなくても大丈夫だろう最悪やられても気にする情報無いし】とか言っている人を見かけるが、それはお門違い
ただWEBを公開するだけのサーバでも乗っ取られてしまうとWEB公開が停止する危険だけで無く、そこから踏み台にされ他サーバへのDDoSアタックや下手したら不正アクセスの踏み台にされ捕まる危険だってある

ここではSSHポート変更やpiユーザ削除等基礎的な対策は省略する

今回紹介しているセキュリティを導入、設定すればとりあえずブルーフォートアタックや改竄、乗っ取り等はある程度避けられるだろう。

⒈ログ監視を設定する

ログ監視ツールである【logwatch】を導入する
これは一日のログを整形しまとめてroot宛に送るツールである

sudo apt-get install logwatch

基本的にはインストールするだけで良い

⒉無料アンチウイルスソフト【ClamAV】を導入する

これは通常、本格運用を開始する前(公開する前)に導入するべき物

debian向けにパッケージが用意されてるので簡単に導入できる

sudo apt-get install clamav

sudo vi /etc/clamav/clamd.conf
#User clamav ← #を追加(root権限で動作するようにする)

#編集後再起動
sudo service clamav-freshclam restart

#データベースの更新とデーモンとして更新を登録する 今回は1日24回とする
sudo freshclam
sudo freshclam -d -c 24

#定期スキャンの設定
sudo vi /etc/clamscan.sh

#以下の内容を入力する
#!/bin/sh
# clamscan script

CLAMSCAN='/usr/bin/clamscan'
echo "clamscan start "`date '+%Y%m%d'`
$CLAMSCAN --infected --remove --recursive /home/ -l /var/log/clamav/clamav.log -i -r ~ > /dev/null 2>&1

#ここまで

#実行権限
sudo chmod 755 clamscan.sh 

#cron登録
sudo vi /etc/crontab
#毎日AM 4:02に実行
02  4 * * * root /etc/clamscan.sh > /dev/null 2>&1

検出率は無いよりマシ程度です

⒊rootkit検出ツールを導入する

sudo apt-get install chkrootkit

#rootkitが無いかスキャン
chkrootkit | grep INFECTED

#何も出なければOK

出た場合はファイルパスが出力されるので削除するなりする。

#デイリーチェックするようにする
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 /etc/cron.daily/chkrootkit

⒋改竄監視を導入

sudo apt-get install aide

#このままでは動作しないので設定を変える
sudo vi /etc/aide/aide.conf

Checksums = sha256+sha512+rmd160+haval+gost+crc32+tiger
を
Checksums = sha512+tiger
に変更する

#初回起動DBファイルの作成 ※時間がかかる
aideinit
mv /var/lib/aide/aide.db.new /var/lib/aide/aide.db

改竄チェック

aide --update

改竄が検出されると以下の様な内容が出力される

AIDE found differences between database and filesystem!!
Start timestamp: 2014-12-16 14:26:18
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 : 2014-12-16 14:26:18 , 2014-12-16 15:00:00
Ctime : 2014-12-16 14:26:18 , 2014-11-16 15:00:00

defaultの監視ポリシーでは /var/log や /root 配下もチェックされる為
ログインやrootコマンドを実行しただけで改竄として通知されてしまう

よって以下の様にしてポリシーの変更を行う

sudo vi /etc/aide.conf

#検出から除外するファイルパスを追記
#他にもあれば自分で追記する
!/var/log
!/root
!/home
!/mnt

#追記後アップデートする
aide --update

デイリーチェック設定

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 を無効化

vi /etc/sysconfig/prelink

PRELINKING=no

/usr/sbin/prelink -ua

⒌Denyhostsを導入

今回は、Denyhostsを使用して、一定回数認証に失敗したIPをブロックします。

Denyhostsはlogを解析して自動的に/etc/hosts.denyにIPを追加、削除してくれるPythonスクリプトです。SSH以外も解析できますが今回はSSHのみ。

sudo aptitude update
sudo aptitude safe-upgrade
sudo aptitude install denyhosts

#設定を変更する
sudo vi /etc/denyhosts.conf

#以下を参考に設定する
#/etc/hosts.denyに登録しておく時間。1日経過後に削除される。(空白の場合は削除されない)
PURGE_DENY = 1d
#削除可能な回数。削除回数が2回を超えると削除されない。
PURGE_THRESHOLD = 2
#存在しないユーザのログインに3回失敗したホストはブロックされる。
DENY_THRESHOLD_INVALID = 3
#存在するユーザのログインに3回失敗したホストはブロックされる。
DENY_THRESHOLD_VALID = 3
#ROOTログインに1回失敗したホストはブロックされる。
DENY_THRESHOLD_ROOT = 1

#IPの逆引きはしない。
HOSTNAME_LOOKUP=NO

#メールは送信しない。
ADMIN_EMAIL =

#ここまで

#設定終わったら再起動
sudo service denyhosts restart

#自分のIPが遮断されない様にホワイトリストへ追記しておく
sudo vi /etc/hosts.allow
#こんな感じで追記
sshd:127.0.0.1
sshd:192.168.1.xx

#万が一ホワイトリストへの登録前に遮断されてしまった場合
一旦denyhostsを止めて
/etc/hosts.deny
/var/lib/denyhosts/hosts
/var/lib/denyhosts/hosts-restricted
/var/lib/denyhosts/hosts-root
/var/lib/denyhosts/hosts-valid
/var/lib/denyhosts/users-valid

から対象のIPを削除します。

#denyhostsのログは以下
/var/log/denyhosts.log

とりあえず以上で終了

ここで紹介したセキュリティ対策は最低限あるべきセキュリティです。

スポンサーリンク

シェアする

フォローする

スポンサーリンク