Linux で Rsyslog を使用して中央ログ サーバーをセットアップする方法
ログは、ソフトウェアやオペレーティング システムの重要なコンポーネントです。ログは通常、目的に応じて、ユーザーのアクション、システム イベント、ネットワーク アクティビティなどを記録します。 Linux システムで最も広く使用されているログ システムの 1 つはrsyslog です。
Rsyslog は、さまざまな種類のソース (システム/アプリケーション) からデータを受け取り、それを複数の形式で出力する、強力で安全かつ高性能なログ処理システムです。
通常のsyslogデーモンから、フル機能を備えたエンタープライズレベルのログシステムに進化しました。クライアント/サーバー モデルで設計されているため、クライアントとして、または他のサーバー、ネットワーク デバイス、およびリモート アプリケーションの中央ログ サーバーとして構成できます。
テスト環境
このガイドでは、次のホストを使用します。
- サーバー: 192.168.241.140
- クライアント: 172.31.21.58
Rsyslog サーバーをインストールおよび構成する方法
ほとんどの Linux ディストリビューションには、rsyslog パッケージがプリインストールされています。インストールされていない場合は、図のように Linux パッケージ マネージャー ツールを使用してインストールできます。
sudo yum update && yum install rsyslog #CentOS 7
sudo apt update && apt install rsyslog #Ubuntu 16.04, 18.04
rsyslog をインストールしたら、とりあえずサービスを開始し、起動時の自動開始を有効にして、systemctl コマンドでステータスを確認する必要があります。
sudo systemctl start rsyslog
sudo systemctl enable rsyslog
sudo systemctl status rsyslog
メインの rsyslog 設定ファイルは /etc/rsyslog.conf にあり、モジュールのロード、グローバル ディレクティブの定義、ログ メッセージの処理ルールが含まれており、 /etc 内のすべての設定ファイルも含まれています。 /rsyslog.d/ さまざまなアプリケーション/サービス用。
sudo vim /etc/rsyslog.conf
デフォルトでは、rsyslog は imjournal モジュールと imusock モジュールを使用して、systemd ジャーナルから構造化ログ メッセージをインポートし、syslog を受け入れます。ローカル システム上で実行されているアプリケーションからのメッセージをそれぞれ Unix ソケット経由で送信します。
rsyslog をネットワーク/中央ログ サーバーとして設定するには、リモート syslog 受信に使用するプロトコル (UDP または TCP またはその両方) を設定する必要があります。リッスンするポート。
高速ではありますが信頼性が低い UDP 接続を使用する場合は、以下の行を検索してコメントを解除します (514 をリッスンするポートに置き換えます。これは、クライアントがメッセージを送信するポート アドレスと一致します。これについては、rsyslog クライアントを構成するときに詳しく調べます)。
$ModLoad imudp
$UDPServerRun 514
TCP 接続 (速度は遅くなりますが、信頼性は高くなります) を使用するには、以下の行を検索してコメントを解除します。
$ModLoad imtcp
$InputTCPServerRun 514
この場合、UDP 接続と TCP 接続の両方を同時に使用したいと考えています。
次に、リモート ログを処理するためのルールセットを次の形式で定義する必要があります。
facility.severity_level destination (where to store log)
どこ :
- ファシリティ: メッセージを生成するプロセス/アプリケーションのタイプで、認証、cron、デーモン、カーネル、local0..local7 が含まれます。
*
を使用すると、すべての機能が意味されます。 - severity_level: ログ メッセージのタイプです: emerg-0、alert-1、crit-2、err-3、warn-4、notice-5、info-6、debug-7。
*
を使用するとすべての重大度レベルを意味し、なしは重大度レベルがないことを意味します。 - 宛先: ローカル ファイルまたはリモート rsyslog サーバー (IP:ポートの形式で定義) です。
RemoteLogs テンプレートを使用して、リモート ホストからログを収集するために次のルールセットを使用します。スクリーンショットに示すように、これらのルールはローカル メッセージを処理するルールよりも前に置く必要があることに注意してください。
$template RemoteLogs,"/var/log/%HOSTNAME%/%PROGRAMNAME%.log"
*.* ?RemoteLogs
& ~
上記のルールセットを見ると、最初のルールは“$template RemoteLogs,”/var/log/%HOSTNAME%/%PROGRAMNAME%.log” ”です。
ディレクティブ $template は、受信したすべてのリモート メッセージを収集し、ホスト名に基づいて /var/log の下の個別のログに書き込むように rsyslog デーモンに指示します。 > (クライアント マシン名) と、テンプレート RemoteLogs に存在する設定によって定義されたメッセージを生成したリモート クライアント機能 (プログラム/アプリケーション)。
2 行目の 「*.* ?RemoteLogs 」 は、RemoteLogs テンプレート設定を使用して、すべての重要度レベルですべての施設からのメッセージを記録することを意味します。
最後の行「& ~ 」 は、メッセージがファイルに書き込まれた後でメッセージの処理を停止するように rsyslog に指示します。 「& ~」 を含めない場合、メッセージは代わりにローカル ファイルに書き込まれます。
使用できるテンプレートは他にも多数あります。詳細については、rsyslog 設定のマニュアル ページ (man rsyslog.conf) を参照するか、Rsyslog オンライン ドキュメントを参照してください。
rsyslog サーバーの構成はこれで完了です。構成ファイルを保存して閉じます。最近の変更を適用するには、次のコマンドを使用して rsyslog デーモンを再起動します。
sudo systemctl restart rsyslog
次に、rsyslog ネットワーク ソケットを確認します。 ss コマンド (または同じフラグを使用した netstat) コマンドを使用し、出力を grep にパイプして、rsyslogd 接続を除外します。
sudo ss -tulnp | grep "rsyslog"
次に、CentOS 7 でSELinux が有効になっている場合は、次のコマンドを実行して、ネットワーク ソケット タイプに基づいて rsyslog トラフィックを許可します。
sudo semanage -a -t syslogd_port_t -p udp 514
sudo semanage -a -t syslogd_port_t -p tcp 514
システムでファイアウォールが有効になっている場合は、実行してポート514を開いて、rsyslog サーバーへのUDP/TCPの両方の接続を許可する必要があります。
------------- On CentOS -------------
sudo firewall-cmd --permanent --add-port=514/udp
sudo firewall-cmd --permanent --add-port=514/tcp
sudo firewall-cmd --reload
------------- On Ubuntu -------------
sudo ufw allow 514/udp
sudo ufw allow 514/tcp
sudo ufw reload
Rsyslog サーバーにログを送信するように Rsyslog クライアントを構成する方法
次に、クライアント システムで、次のコマンドを使用して、rsyslog サービスが実行されているかどうかを確認します。
sudo systemctl status rsyslog
インストールされていない場合は、前に示したようにインストールしてサービスを開始します。
sudo yum update && yum install rsyslog #CentOS 7
sudo apt update && apt install rsyslog #Ubuntu 16.04, 18.04
sudo systemctl start rsyslog
sudo systemctl enable rsyslog
sudo systemctl status rsyslog
rsyslog サービスが起動して実行されたら、デフォルト構成への変更を実行するメイン構成ファイルを開きます。
sudo vim /etc/rsyslog.conf
rsyslog デーモンを強制的にログ クライアントとして動作させ、ローカルで生成されたすべてのログ メッセージをリモート rsyslog サーバーに転送するには、次のスクリーンショットに示すように、この転送ルールをファイルの最後に追加します。
*. * @@192.168.100.10:514
上記のルールは、すべての施設からすべての重大度レベルでメッセージを送信します。 認証などの特定の機能からメッセージを送信するには、次のルールを使用します。
auth. * @@192.168.100.10:514
変更を保存し、構成ファイルを閉じます。上記の設定を適用するには、rsyslog デーモンを再起動します。
sudo systemctl restart rsyslog
Rsyslog サーバー上のリモート ログを監視する方法
最後のステップは、rsyslog が実際にクライアントからメッセージを受信し、/var/log の下に hostname/programname.log の形式でメッセージを記録しているかどうかを確認することです。
ls コマンドを実行して親ログ ディレクトリを詳細にリストし、ip-172.31.21.58 というディレクトリ (またはクライアント マシンのホスト名) があるかどうかを確認します。
ls -l /var/log/
ディレクトリが存在する場合は、実行してその中のログ ファイルを確認します。
sudo ls -l /var/log/ip-172-31-21-58/
まとめ
Rsyslog は、クライアント/サーバー アーキテクチャで設計された高性能ログ処理システムです。このガイドで説明されているように、Rsyslog を中央/ネットワーク ログ サーバーおよびクライアントとしてインストールして構成できることを願っています。
さらに詳しいヘルプが必要な場合は、関連する rsyslog マニュアル ページを参照してください。ご意見やご質問がございましたら、お気軽にお問い合わせください。