(O+P)ut

アウトプット



(O+P)ut

エンジニアのアウトプット

【syslog入門】ApacheのログをAIX~Linuxに転送する流れ

スポンサーリンク

f:id:mtiit:20190205184627p:plain
AIX機からLinux機へsyslogを利用してApache(IHS)のログファイルを転送する際に考慮する点をまとめました。

動作確認したバージョンは以下です。

AIX機 AIX 7.1
Linux機 CentOS 7.4

SYSLOGとは?

syslogは、システムから出てくるアラート情報等を一元的に管理して保存したり、別サーバにUDPで転送したりする仕組みです。
fluentdやlogstashといったログ収集基盤技術の一つですが、UNIX機ではsyslogが標準で実装されています。

ちなみに、rsyslogはsyslogの進化系のようなもので、信頼性を意味する"reliable"の略のrが頭についています。ログの転送方式がTCPにも対応しているという違いですが、syslogといってもrsyslogを指しているケースもあります。

ファシリティとプライオリティ

syslogでは「ファシリティ」と「プライオリティ」という2つの観点でログを管理します。

実際に、syslogの設定ファイルは以下のフォーマットで情報を記載します。

<ファシリティ>.<プライオリティ> 出力先

ファシリティとは?

ログの種別」です。ファシリティにはいくつか種類があり、それを元にメッセージの出力元を特定します。

例えば、cronに関するログのファシリティは「cron」、カーネルに関するログのファシリティは「kern」です。
そして、事前に定義されていないログに関しては「local数字」とファシリティを設定します。

今回のIHSのアクセスログは事前に定義されていないログなので、local0を割り当てます。

プライオリティ

プライオリティはメッセージの優先度で、緊急を意味するemergが最も高く、デバックモードを意味するdebugが最も低いです。
指定したプライオリティよりも高いものが全てログとして出力されます。


ここまでの整理ですが、

<ファシリティ>.<プライオリティ> 出力先

の記載例は以下のようになります。

cron.info /var/log/cron

ちなみに、infoはalertよりもプライオリティが低く、debugよりもプライオリティが高い設定値です。
ログを出力しない場合はnoneとします。

サーバへの設定手順

転送元サーバ(AIX)

まず、ログの生成元でありログの送信元でもあるAIX機側の設定です。

httpd.confを編集し、アクセスログをsyslogの管理下に追加します。

CustomLog "|/usr/bin/logger -p local0.info -t httpd_access" combined

今回はlocal0.が空いていたので0を選択しました。
httpd_accessというのはヘッダーで任意の文字列を指定できます。

httpd.confを編集したので、読み込ませるために

apachectl -k stop
apachectl -k start

でWebサーバのプロセスを再起動します。


次に、syslogの設定ファイルを編集します。

/etc/syslog.conf

ここに、以下を追記します。

local0.debug @XX.XX.XX.XX

XX部分には送信先のIPアドレスを記載します。

そして最後に、この設定を反映させるためにsyslogデーモンを再起動します。

# stopsrc -s syslogd
# startsrc -s syslogd

ここで以下の条件を満たしていれば、送信先のsyslog設定ファイルに記載されているルールに基づいてログが転送先側に格納されていきます。

  • 送信先側の514ポートがListenされている
  • syslog設定で受信可能になっている

転送先サーバ(CentOS)

今回は、上の2点がまだ未設定として話を進めます。

まず、514ポートを空けます。
CentOS7ではfirewall-cmdでネットワーク設定を行います。

以下コマンドで現在のFirewallの設定内容が確認できます。

# firewall-cmd --list-all-zones

ここで以下メッセージが出た場合はそもそもfirewalld.serviceが起動していないのでsyslogの設定まで飛ばしてください。

FirewallD is not running

ファイアウォールは下記で特定ポートを開けます。

# firewall-cmd --zone=public --add-port=514/udp --permanent

としてUDPのポートを空けます。

この設定を入れた後、firewallを再起動して設定を反映します。

# systemctl restart firewalld.service

設定が入っているかどうかは以下のコマンドで確認可能です。

# firewall-cmd --zone=public --list-all --permanent

portsという箇所にて設定した514について表示されていれば成功です。

次に、syslogの設定です。

CentOS側のsyslog設定ファイルですが以下にあります。

/etc/rsyslog.conf

ここで以下の箇所のコメントを解除してください。

$ModLoad imudp # コメントアウトを解除(UDP)
$UDPServerRun 514 # コメントアウトを解除(UDP)

そうすれば以下にて該当ポートがListen状態になっていることが確認できます。

# ss -nltu | grep 514

このままでは、送られてきたログは以下のように/var/log/messagesに溜まっていくはずです。

*.*;mail.none;cron.none        /var/log/messages

これは、
全てのファシリティ.全てのプライオリティは/var/log/messagesに書き込む、
ただしファシリティがmailとcronのものは書き込まない

を意味します。

今回は、local0で送られてくるログは別ディレクトリに格納するため

local0.*     /var/log/apache/access.log

と格納先を指定し、

*.*;mail.none;cron.none;local0.none        /var/log/messages

とmessageからは外します。

そして最後にsyslogデーモンを再起動して完了です。ログが所定の場所に記載されていきます。

# systemctl restart rsyslog

(おまけ)TCPで送る場合は

送信元で@を二つにする

local0.debug @@XX.XX.XX.XX

送信先で以下の穴あけを行い、

# firewall-cmd --permanent --add-port=514/tcp

以下のコメントアウトを行えば行えます

$ModLoad imtcp # コメントアウトを解除(TCP)
$InputTCPServerRun 514 # コメントアウトを解除(TCP)

終わりに

長くなってしまいましたが、AIXサーバとLinuxサーバ間でのsyslog転送の流れでした。

参考になれば、幸いです。