[RHEL8] 自サーバーに該当するセキュリティアドバイザリーを通知する
こんにちは。
今回は、RHEL8で動作しているシステムの脆弱性を日々チェックしたいと思い、スクリプトを作成しましたので紹介します。
スクリプト概要
- RHEL8 でセキュリティアドバイザリーの RHSAに該当し、かつ「重要」と判断 されている 一覧をメールで送信 する
RHSA は以下のように定義されています。
RHSA (Red Hat Security Advisory): RHSA アドバイザリーには、1 つ以上のセキュリティーの修正と、バグ修正または機能強化が含まれます。 RHSA アドバイザリーは、RHBA および RHEA アドバイザリーよりも優先されます。
セキュリティアドバイザリーの意味 RHSA、RHBA、および RHEA アドバイザリーの説明 - Red Hat Customer Portal
環境・前提
- Red Hat Enterprise Linux release 8 ※おそらくRed Hat 系ならいけると思います
- スクリプトを実行するサーバー自身をチェックする
- スクリプトを実行するサーバーは
sendmail
コマンドでメールが送信できること
コマンド説明
- 動作しているシステムで該当するセキュリティアドバイザリーをチェックする
dnf updateinfo list available
- RHSA かつ 重要 を抜き出す
dnf updateinfo list available | grep RHSA | grep "重要" | awk '{ print $1 }' | sort | uniq
実行すると以下のようになります。
# dnf updateinfo list available | grep RHSA | grep "重要" | awk '{ print $1 }' | sort | uniq
RHSA-2021:2170
RHSA-2021:1206
RHSA-2021:1620
RHSA-2021:1197
RHSA-2021:2354
RHSA-2021:1242
RHSA-2021:2308
RHSA-2021:1024
RHSA-2021:2238
スクリプト本体
#!/bin/bash
### 変数 ###
## セキュリティアドバイザリーのURLベース
URL=https://access.redhat.com/errata/
## セキュリティアドバイザリーの中でRHSAかつ重要を抽出
result=(`dnf updateinfo list available | grep RHSA | grep "重要" | awk '{ print $1 }' | sort | uniq`)
## 該当件数を取得
num=${#result[*]}
## スクリプト実行時間を取得
time=`date +%Y-%m-%d_%H:%M:%S`
## メールタイトル
subject="[`hostname`] Security Advisory Infomation"
## 送信元メールアドレス
from=`hostname`@localhost
## 送信先メールアドレス
to=to-address@example.com
## メール本文テキスト
body=/tmp/security_advisory_${time}.txt
### メール本文作成処理 ###
echo "From: ${from}" > ${body}
echo "To: ${to}" >> ${body}
echo "Subject: ${subject}" >> ${body}
echo >> ${body}
echo "セキュリティアドバイザリーの中でRHSAかつ重要件数" >> ${body}
echo -n ${time} >> ${body}
echo "時点" >> ${body}
echo >> ${body}
echo -n ${num} >> ${body}
echo "件" >> ${body}
for i in "${result[@]}"
do
echo "$URL$i" >> ${body}
done
echo -n >> ${body}
## メール送付処理
/usr/bin/cat ${body} | /usr/sbin/sendmail -i -t
## メール本文削除処理
rm -rf ${body}
このようなメールが通知されます。
あとがき
これを cron に登録して日々チェックしようかなと考えています。
アドバイザリーの抽出条件等を変更したり、抽出した結果をURLベースではなく dnf -y upgrade
と結合して自動アップデートなど応用は利くかな!?と思っています。
何か思いついたら記事にしたいと思います。
それでは次回の記事でお会いしましょう。