動作対象
- AlmaLinux 8
- 通知メールを送信したい場合は、dnf install mailxの実施および別途メール送信設定が必要
このスクリプトについて
dnf-automaticを使ったパッケージの自動アップデートのようなことをシェルスクリプトで作成してみました。異なる点としては、カーネルアップデートを適用させるためにOS再起動もできるようになっています。
- 
--rebootオプションでOS再起動も指定できるようになっています。
- 
dnf autoremove,dnf clean allで次回起動以降のディスクスペース節約する処理追加。(※依存されなくなったものを削除dnf autoremoveはまずいという環境では任意で当スクリプトから消してください)
設置手順
- 
/rootディレクトリにsecurity_update.shを設置。(場所は任意)
- オーナー・グループを、chown root:root security_update.shに設定。
- パーミッションを、chmod 744 security_update.shに設定。
- 
crontabにスクリプトを追記。
(例)28日午前4時にセキュリティアップデート後再起動する。
# Linuxセキュリティアップデート
0 4 28 * * root /root/security_update.sh --reboot
シェルスクリプト
- セキュリティアップデートのみにしている。
- 通知メールアドレス、メール送信処理もしています。
- dnf 以外にもsnap 更新もしています。
- 
/var/log/update_log/update_logにメール通知内容と同じ内容でログを出すようにしています。
- リブート前に、systemctl stop httpdしているが実施するかは任意。apachectl -k graceful-stopではないのは、apachectl を使用して httpd に引数を渡すことはサポートされなくなるため。(まぁ、なんとかなるっしょ!でとりまアパッチ停止しま~す、か~ら~の~OS再起動しま~す)
security_update.sh
#!/bin/bash
function usage {
    cat <<EOF
AlmaLinux8のセキュリティアップデートシェルスクリプト
使用方法: $(basename ${0}) [引数]
   もしくは: $(basename ${0}) [help|--help|-h]  ヘルプ(このメッセージ)を表示し終了する
   もしくは: $(basename ${0}) [version|--version|-v]  バージョン情報を表示し終了する
引数:
   --reboot             セキュリティアップデート後にOS再起動を実施する
説明:
   AlmaLinux8のセキュリティアップデートを実施します。
   root権限ユーザーでの実施をしてください。
EOF
}
function version {
    echo "$(basename ${0}) version 1.0 "
}
function proc() {
    mailaddress="通知メールアドレス"
    folderpath="/var/log/update_log"
    filepath=${folderpath}/update_log
    if [ ! -d $folderpath ]; then
        mkdir ${folderpath}
    fi
    if [ ! -e $filepath ]; then
        touch ${filepath}
    fi
    dnf autoremove
    dnf clean all
    dnf upgrade --security -y 2>&1 | tee ${filepath}
    snap refresh 2>&1 | tee -a ${filepath}
    cat ${filepath} | mail -s "【通知】 - AlmaLinux 8 SECURITY UPDATE" ${mailaddress}
    if [ $# = 1 ]; then 
        if [ $1 = "--reboot" ]; then 
            systemctl stop httpd
            reboot
        fi
    fi
}
case ${1} in 
    help|--help|-h)
        usage
    ;;
    version|--version|-v)
        version
    ;;
    *)
        proc $1
    ;;
esac
さいごに
たぶん設置しても大丈夫だろう的な温度感で著者は考えているためOS再起動失敗したらのことを考慮していないまま◯◯社で本番設置しています。ワンオペ職場のためコードレビューしてもらえません😢。親切な兄貴、姉貴からここ問題ありそう的な指摘をもらえたらありがたいです。ぺこりん子。