📮

MacOSでrsyslogを受け付けlogrotateしてみた

2023/02/09に公開

この記事とは

弊社では一部部屋のセキュリティが高いため、通信ログを常に取っております。
設置してある機器が老朽化し、そろそろリプレイスする時期となりました。
機器を構築していくなかで環境構築や疑問に思ったことなどを書いていきます。

機器の検討

現行の機器はあまり大きくない、サーバーラックに2台入っており運用をしております。
あまり大きいPCだと置けないため、以下の要件で機器の検討をいたしました。
・静音である(サーバールームにあるような、うるさい機器はNG)
・親しみ安い UX であること(弊社ではWindows・Macをメイン利用)
・値段が20万円以下であること(大人の諸事情)
・NUCぐらいのサイズ(ただし熱問題があまりないこと)

その結果、Mac Miniに採用されました!!!!

環境について

スペックは以下の通りです。
Mac Mini (M1,2020)
・CPU:8コアCPU、8コアGPU、16コアNeural Engineを搭載したApple M1チップ
・メモリ:16GB
・ストレージ:1TB

あとは、デフォルトの構成です。
ストレージ自体は、長期的保管を想定しているため容量は多めに見積もっています。

環境構築方法(必須コンポーネント)

セキュリティ対策ソフトや管理者アカウントなどは各自におまかせします。
以下では、やりたいことの環境構築を記載します。

#まずはHomeBrewを導入
/bin/bash -c "$(curl -fsSL https://raw.githubusercontent.com/Homebrew/install/HEAD/install.sh)"

#インストール後、Homebrewのパスを設定
echo '# Set PATH, MANPATH, etc., for Homebrew.' >> /Users/r/.zprofile
echo 'eval "$(/opt/homebrew/bin/brew shellenv)"' >> /Users/r/.zprofile
eval "$(/opt/homebrew/bin/brew shellenv)"


#必要コンポーネントインストール
#rsyslogをインストール
brew install rsyslog

#rsyslogを起動(インストール直後)
brew services restart rsyslog

#logrotateをインストール
brew install logrotate
#logrotateを起動(インストール直後)
brew services restart logrotate

rsyslogの設定

rsyslogはSyslogを受信するエージェントです。
デフォルトでは、ログの格納先やポートが異なるため以下の通り設定します。

#rsyslogの設定ファイルが置かれているフォルダに移動
cd /opt/homebrew/etc/

#設定ファイルを操作するため、元のバックアップファイル作成
cp rsyslog.conf rsyslog_yyyymmdd.conf 

#無事に生成されているか確認
ls

#無事に生成されていたら、オリジナルファイルをvimで編集
vim rsyslog.conf

~~~
#以下をデフォルトから変更(機器によって異なるためご注意)
UDP Server run 10514 →***に変更

#保存先変更(M1のHomebrewの場合、既定のフォルダにはログがないため移動
*.* /usr/local/var/log/rsyslog-remote.log 
↓
*.* /opt/homebrew/var/log/hogehoge.log

#保存して終了
:wq

#保存先を変更したため、rsyslogを再起動
brew services restart rsyslog

テストをしましょう!

ここまで設定ができたら、実際にログをMacに向けて流してみましょう。
設定したファイルへ書き込みができてたらOKです!!

logrotateの設定

rsyslogで受けたログをどうするのか設定します。
いくつかオプションがあるため、以下を参考にするのが良いと思います。(筆者も何度も読んだ)https://hackers-high.com/linux/man-jp-logrotate/

またここでスーパーユーザ 権限(root)以外で編集するとlogrotateが動かないようです。
そのため、sudo を使い スーパーユーザ に昇格しています
https://qiita.com/abetomo/items/59ee7d55e5458a33988c

#configファイル編集する
sudo vim /opt/homebrew/etc/logrotate.conf

#ログのローテーション周期どうしますか
## rotate log files weekly
#毎日周期します
daily

#保存して終了
:wq!

続いて、特定のログに対する設定ファイルを作ります。
弊社では、特定のフォルダに過去のログを置きたいため以下要件にしました。
一行ずつ「↑」で説明を書いていきます。

#configファイルを作成する
sudo vim /opt/homebrew/etc/logrotate.d/hogehoge

#どこのログをローテーションするかの設定(「{」 で囲み始めること)
/opt/homebrew/var/log/hogehoge.log{
	#ログファイルが空でもローテーションする
	ifempty
	#毎日実行します
        daily
	#ローテーションしたログをgzipで圧縮します
        compress
	#ローテーション期間
        rotate 36500
	#エラーメッセージ出ても続行
        missingok
	#ローテーションログのファイル名にyyyymmddの名前つける
        dateext
	#ローテーションされた過去ログの置き場所
        olddir /****/****/****
	#元のファイルを空(ファイル自体は消さない)
        copytruncate
#(})これでくくり終わること!	
}


#VIM終了
:wq!

#無事に生成されているか確認
ls /opt/homebrew/var/log/

#ログフォルダ作成
sudo mkdir /****/****/**** 

#無事に生成されているか確認
ls /****/****/****

#logrotateを再起動
brew services restart logrotate

テストをしましょう!

ここまで設定ができたら、logrotateでテストをしてみましょう!
テストするコマンドはいくつかあります

######テストコマンド######
#logrotate デバッグ
sudo logrotate -dv /opt/homebrew/etc/logrotate.d/*****
#詳細なデバックが表示されます(dry runのため実際にローテーションはされない)


#logrotate強制ローテーション
sudo logrotate -f /opt/homebrew/etc/logrotate.d/***** 
#強制的にローテーションが実行されます。ローテーション先に書き込み権限があるか確認が必須

##########################

陥った罠その1

sudo logrotate -f /opt/homebrew/etc/logrotate.d/*****

これでローテーションできる(手動だけど)と思い切っていましたが現実は甘く有りませんでした。
切り分けのため、以下コマンドを使用しテストを行いました。

#logrotate デバッグ
sudo logrotate -dv /opt/homebrew/etc/logrotate.d/*****

warning: logrotate in debug mode does nothing except printing debug messages!  Consider using verbose mode (-v) instead if this is not what you want.
state file /opt/homebrew/var/lib/logrotate.status does not exist

logrotate.status(logrotate実施したステータスファイル)がないと!
ファイルを確認しようとしたところ、上位フォルダがないことに気が付きました。
そのため、以下コマンドを使いフォルダを作成します

#logrotateステータスフォルダ作成
sudo mkdir /opt/homebrew/var/lib/  
 
#無事に生成されているか確認
ls /opt/homebrew/var/ 

#logrotate再起動
brew services restart logrotate

無事にテストコマンドを再度実行したところ、ステータスファイルも作成されました。
ただ、日時実行(daily)が上手く実行がされません...

陥った罠その2

logrotateで指定したのにもかかわらず毎日動いてくれません。(調べ方がわからなかった)
そのため、crontabで日時実行するように以下コマンドを設定しました。
crontabの設定は以下を参照しました
https://www.server-memo.net/tips/crontab.html

#スーパーユーザでcrontabを編集
sudo crontab -e


#毎日3時にcronでlogrotateを実行するように記載
0 3 * * * /opt/homebrew/sbin/logrotate /opt/homebrew/etc/logrotate.conf 


:設定保存
wq!

上記設定を行い、crontabで行うように構成をいたしました。
しかし翌日見てみてもローテーションされておらず😨
上手くcrontabが動いていなかったのかわからず、logrotateの実行結果を出力するようにしました。

#ログ用のログファイルを作成
sudo touch /var/log/***.log

ls /var/log/

#スーパーユーザでcrontabを編集
sudo crontab -e

#編集内容記載
mm hh * * * /opt/homebrew/sbin/logrotate /opt/homebrew/etc/logrotate.conf > var/log/***.log 2>$1


:設定保存
wq!

上記コマンドに変更し実行ログを吐かせた結果、logrotate.confがroot権限になっていないことが原因でした。
そのためlogrotate.confを以下を実行しroot権限にします。

#ファイル権限変更
sudo chown root /opt/homebrew/var/lib/logrotate.status

これでローテーションされると思います。朝か夜かを待ちましょう 🎉

最後に

Windows畑で育った私には、とっても難関な挑戦でした。
ただ、1日目・2日目とローテーションされるのを見ると嬉しく思います。
いつまでもこの気持ちを忘れないように。

そして、老朽化した機器への感謝も忘れないようにしましょう。

Discussion