Windows/Linux

Apache(httpd)のアクセスログの収集について

この記事は投稿日から2年以上経過しています。

当記事では、Apache(httpd)のアクセスログの収集について記載します。

前提条件

  • root権限にて操作しています。
  • Webサーバは以下の構成です。
OS CentOS Linux release 7.9.2009 (Core)
Webサーバ Apache/2.4.6 (CentOS)
Rsyslog rsyslogd 8.24.0-57.el7_9.1
  • SyslogサーバとしてLogStare Collector(以下、LSCと記載)を利用します。
  • Syslogサーバは以下の構成です。
LSCバージョン 2.1.1
OS CentOS Linux release 7.9.2009 (Core)
JAVA OpenJDK15

設定(Webサーバ)

本記事では2つの異なるログ転送方法を説明します。

loggerを利用したログ転送方法

  • /etc/httpd/conf/httpd.confを編集します。変更後にhttpdサービスを再起動します。本記事ではログ形式「combined」を対象とします。

変更前

# vi /etc/httpd/conf/httpd.conf
~省略~
    #
    # The location and format of the access logfile (Common Logfile Format).
    # If you do not define any access logfiles within a 
    # container, they will be logged here.  Contrariwise, if you *do*
    # define per- access logfiles, transactions will be
    # logged therein and *not* in this file.
    #
    #CustomLog "logs/access_log" common

    #
    # If you prefer a logfile with access, agent, and referer information
    # (Combined Logfile Format) you can use the following directive.
    #
    CustomLog "logs/access_log" combined   ##~追記箇所~
~省略~

変更後

# vi /etc/httpd/conf/httpd.conf
~省略~
    #
    # The location and format of the access logfile (Common Logfile Format).
    # If you do not define any access logfiles within a 
    # container, they will be logged here.  Contrariwise, if you *do*
    # define per- access logfiles, transactions will be
    # logged therein and *not* in this file.
    #
    #CustomLog "logs/access_log" common

    #
    # If you prefer a logfile with access, agent, and referer information
    # (Combined Logfile Format) you can use the following directive.
    #
    CustomLog "|/usr/bin/logger -p local0.info -t httpd_access -n xxx.xxx.xxx.xxx -P 514" combined   ##~追記箇所~
~省略~
  • 上記コマンド及びオプションにて収集したサンプルログは下記になります。
    ※loggerコマンドにて送信しているため、対象のログとは別で先頭にログ日時並びにタグが付与されています。
Jun 15 17:52:29 httpd_access: xxx.xxx.xxx.xxx - - [15/Jun/2021:17:52:29 +0900] "GET / HTTP/1.1" 403 4897 "-" "Apache-HttpClient/4.5.2 (Java/16.0.1)"
  • 上記設定にて利用しているloggerコマンドのオプションについて説明します。
    • p(小文字):ログメッセージに付与するファシリティとプライオリティを指定できます。本記事ではファシリティ、プライオリティの組み合わせとしてlocal0.infoを利用しています。このオプションを利用しない場合はファシリティ、プライオリティの組み合わせとしてuser.noticeが適用されます。
      ※本記事作成時における検証にてSyslogサーバ側でログメッセージを確認した際、ファシリティ、プライオリティの組み合わせはkern.noticeでした。当該オプションを利用しない場合でのSyslogサーバ側の受信設定には気を付けてください。
    • t:ログメッセージに任意のタグをつけることが可能です。当該オプションを利用しない場合、端末にログインしているユーザの名前もしくは実効ユーザ ID に基づいたユーザ名がタグとしてログメッセージに付与されます。サンプルログでは「httpd_access」に該当します。
    • n:ログメッセージ送信対象とするサーバを指定できます。
    • P(大文字):ログメッセージを送信する際に利用する宛先ポート番号を指定できます。

rsyslogのimfileモジュールを利用したログ転送方法

  • /etc/rsyslog.confを編集します。変更後にrsyslogdサービスを再起動します。

変更前

# vi //etc/rsyslog.conf
~省略~
# Provides TCP syslog reception
#$ModLoad imtcp
#$InputTCPServerRun 514
##~追記箇所~
#### GLOBAL DIRECTIVES ####
~省略~
#*.* @@remote-host:514
# ### end of the forwarding rule ###

変更後

# vi /etc/rsyslog.conf
~省略~ 
# Provides TCP syslog reception 
#$ModLoad imtcp 
#$InputTCPServerRun 514

$ModLoad imfile                            ##~追記箇所~
$InputFileName /var/log/httpd/access_log   ##~追記箇所~
$InputFileTag apache_access.log:           ##~追記箇所~
$InputRunFileMonitor                       ##~追記箇所~
$InputFileFacility local6                  ##~追記箇所~
$InputFileSeverity info                    ##~追記箇所~

#### GLOBAL DIRECTIVES #### 
~省略~
#*.* @@remote-host:514
:syslogtag, isequal, "apache_access.log:" @xxx.xxx.xxx.xxx:514   ##~追記箇所~
# ### end of the forwarding rule ###
  • 上記設定にて収集したサンプルログは下記になります。
    ※rsyslogを介して送信しているため、対象のログとは別で先頭にログ日時並びにタグが付与されています。
Jun 16 11:13:43 localhost apache_access.log: xxx.xxx.xxx.xxx - - [16/Jun/2021:11:09:39 +0900] "GET / HTTP/1.1" 403 4897 "-" "Apache-HttpClient/4.5.2 (Java/16.0.1)"
  • 追記したimfileモジュールの各パラメータについて説明します。
    • $ModLoad imfile(必須):imfileモジュールを読み込むための記述です。
    • $InputFileName(必須):syslogとして読み込む対象のテキストファイルを指定する記述です。本記事では「/var/log/httpd/access_log」を指定しています。
    • $InputFileTag(必須):ログメッセージに任意のタグを付与するための記述です。サンプルログでは「apache_access.log:」に該当します。
    • $InputRunFileMonitor(必須):読み込み対象のテキストファイルの監視を有効化する記述です。
    • $InputFileFacility:ログメッセージに任意のファシリティを付与するための記述です。記述されていない場合、デフォルトでは「local0」が付与されます。
    • $InputFileSeverity:ログメッセージに任意のプライオリティを付与するための記述です。記述されていない場合、デフォルトでは「notice」が付与されます。

ログ形式

  • 本記事にて対象としているログ形式「combined」のデフォルトの構成要素は下記になります。
"%h %l %u %t \"%r\" %>s %b \"%{Referer}i\" \"%{User-Agent}i\""
  • 各要素について説明します。
    • %h:アクセス元のホスト名(送信元IP)が表示されます。サンプルログでは「xxx.xxx.xxx.xxx」に該当します。
    • %l:設定ファイルにてIdentityCheckが「On」の場合にクライアント識別子が表示されます。IdentityCheckが「Off」の場合は「-」が表示されます。
    • %u:認証ユーザ名が表示されます。認証がない場合は「-」が表示されます。
    • %t:リクエストを受け付けた時刻が表示されます。 サンプルログでは「[15/Jun/2021:17:52:29 +0900]」に該当します。
    • %r:リクエストの最初の行が表示されます。サンプルログでは「GET / HTTP/1.1」に該当します。引用符(")の前にエスケープ文字(\)が配置されているため、%rの前後に引用符が付与されています。
    • %>s:ステータスが表示されます。内部でリダイレクトされた場合は、最後のステータスが含まれます。サンプルログでは「403」に該当します。
    • %b:レスポンスのバイト数が表示されます。(HTTP ヘッダは除く)1バイトも送られなかった場合は 「-」 が表示されます。サンプルログでは「4897」に該当します。
    • %{xxx}i:サーバに送られたリクエストのヘッダより「xxx」 にて指定した値が表示されます。サンプルログでは「Referer」及び「User-Agent」がヘッダより取得されログに含まれています。

※以下のリンクより上記以外の構成要素に関する説明がありますのでご参照いただければと思います。
https://httpd.apache.org/docs/2.4/en/mod/mod_log_config.html

ログ形式の変更例

  • LB(ELB、ロードバランサー)やPROXYを経由したアクセスにおいて、元の送信元IPをログメッセージに含める場合は/etc/httpd/conf/httpd.confを編集し、ログ形式「combined」に「%{X-Forwarded-For}i」を追加します。
    ※Syslogサーバへの転送設定は記載しておりません。

変更前

~省略~
    #
    # The following directives define some format nicknames for use with
    # a CustomLog directive (see below).
    #
    LogFormat "%h %l %u %t \"%r\" %>s %b \"%{Referer}i\" \"%{User-Agent}i\"" combined   ##~追記箇所~
    LogFormat "%h %l %u %t \"%r\" %>s %b" common
~省略~

変更後

~省略~
    #
    # The following directives define some format nicknames for use with
    # a CustomLog directive (see below).
    #
    LogFormat "%{X-Forwarded-For}i %h %l %u %t \"%r\" %>s %b \"%{Referer}i\" \"%{User-Agent}i\"" combined   ##~追記箇所~
    LogFormat "%h %l %u %t \"%r\" %>s %b" common
~省略~
  • X-Forwarded-Forが含まれたサンプルログは下記になります。
    ※下記サンプルログはクライアント_A(aaa.aaa.aaa.aaa)からWebサーバまでにPROXY_B(bbb.bbb.bbb.bbb)とPROXY_C(ccc.ccc.ccc.ccc)、PROXY_D(ddd.ddd.ddd.ddd)の3つPROXYを経由した場合における複数のX-Forwarded-Forが含まれたサンプルログになります。X-Forwarded-Forに該当する要素がない場合、「-」が表示されます。
Jun 22 17:55:20 httpd_access: aaa.aaa.aaa.aaa, bbb.bbb.bbb.bbb, ccc.ccc.ccc.ccc ddd.ddd.ddd.ddd - - [22/Jun/2021:17:55:20 +0900] "GET / HTTP/1.1" 403 4897 "-" "Apache-HttpClient/4.5.2 (Java/16.0.1)"

error_logについて

error_logのSyslogサーバへの転送にはloggerおよびimfileモジュールを利用できます。

  • error_logのサンプルログは下記になります。
Jun 16 16:00:33 localhost apache_error.log: [Wed Jun 16 16:00:29.436183 2021] [autoindex:error] [pid 8332] [client xxx.xxx.xxx.xxx:36930] AH01276: Cannot serve directory /var/www/html/: No matching DirectoryIndex (index.html) found, and server-generated directory index forbidden by Options directive

ログ形式

  • 上記サンプルログは以下の要素にて構成されています。
    ※ログイベントによって表示される要素は異なります。
[%t] [%l] [pid %P] [client %a] %M
  • 各構成要素について説明します。
    • %t:リクエストを受け付けた時刻が表示されます。サンプルログでは「Wed Jun 16 16:00:29.436183 2021」に該当します。
    • %l:ログメッセージのレベルが表示されます。サンプルログでは「autoindex:error」に該当します。
    • %P(大文字):プロセスIDが表示されます。サンプルログでは「8332」に該当します。
    • %a:リクエストの送信元IPと送信元ポートが表示されます。サンプルログでは「xxx.xxx.xxx.xxx:36930」に該当します。
    • %M:ログイベントの詳細が表示されます。サンプルログでは「AH01276: Cannot serve directory /var/www/html/: No matching DirectoryIndex (index.html) found, and server-generated directory index forbidden by Options directive」に該当します。

※以下のリンクより上記以外の構成要素に関する説明がありますのでご参照いただければと思います。
https://httpd.apache.org/docs/2.4/en/mod/mod_log_config.html

ログ形式の変更例

  • ユーザーエージェントをログに含める場合は/etc/httpd/conf/httpd.confを編集し、ErrorLogFormatを追加し「%{User-Agent}i」を含めたログ形式を定義します。
    ※Syslogサーバへの転送設定は記載しておりません。

変更前

# vi /etc/httpd/conf/httpd.conf
~~省略~~
#
# ErrorLog: The location of the error log file.
# If you do not specify an ErrorLog directive within a 
# container, error messages relating to that virtual host will be
# logged here.  If you *do* define an error logfile for a 
# container, that host's errors will be logged there and not here.
#
ErrorLog "logs/error_log"
##~追記箇所~
#
# LogLevel: Control the number of messages logged to the error_log.
# Possible values include: debug, info, notice, warn, error, crit,
# alert, emerg.
#
LogLevel warn

変更後

# vi /etc/httpd/conf/httpd.conf 
~~省略~~ 
# 
# ErrorLog: The location of the error log file. 
# If you do not specify an ErrorLog directive within a 
# container, error messages relating to that virtual host will be 
# logged here. If you *do* define an error logfile for a 
# container, that host's errors will be logged there and not here. 
# 
ErrorLog "logs/error_log" 
ErrorLogFormat "[%t] [%l] [pid %P] [client %a] %M , %{User-Agent}i"   ##~追記箇所~ 
# 
# LogLevel: Control the number of messages logged to the error_log. 
# Possible values include: debug, info, notice, warn, error, crit, 
# alert, emerg. 
# 
LogLevel warn
  • ユーザーエージェントが含まれたサンプルログは下記になります。
Jun 16 16:53:06 localhost apache_error.log: [Wed Jun 16 16:52:59 2021] [error] [pid 8401] [client xxx.xxx.xxx.xxx:38358] AH01276: Cannot serve directory /var/www/html/: No matching DirectoryIndex (index.html) found, and server-generated directory index forbidden by Options directive , Apache-HttpClient/4.5.2 (Java/16.0.1)

ssl_access_logとssl_request_logについて

ssl_access_logとssl_request_logのSyslogサーバへの転送にはloggerおよびimfileモジュールを利用できます。

  • ssl_access_logのサンプルログは下記になります。
Jun 23 11:16:43 httpd_access: xxx.xxx.xxx.xxx - - [23/Jun/2021:11:16:43 +0900] "GET / HTTP/1.1" 403 4897
  • ssl_request_logのサンプルログは下記になります。
Jun 23 11:32:40 httpd_access: [23/Jun/2021:11:32:40 +0900] xxx.xxx.xxx.xxx TLSv1.2 ECDHE-RSA-AES256-GCM-SHA384 "GET / HTTP/1.1" 4897

ログ形式

  • ssl_access_logの構成要素は下記になります。
    ※デフォルトではTransferlogディレクティブがssl_access_logに適用され明示的にログ形式が定義されてないので、出力されるログ形式は以下の形式となります。
"%h %l %u %t \"%r\" %>s %b"
  • ssl_request_logの構成要素は下記になります。
    ※デフォルトではCustomlogディレクティブがssl_request_logに適用され明示的にログ形式が定義されています。
%t %h %{SSL_PROTOCOL}x %{SSL_CIPHER}x \"%r\" %b"
  • 各構成要素について説明します。
    • %h:アクセス元のホスト名(送信元IP)が表示されます。デフォルトではssl_access_log、ssl_request_log共に含まれサンプルログでは「xxx.xxx.xxx.xxx」に該当します。
    • %l:設定ファイルにてIdentityCheckが「On」の場合にクライアント識別子が表示されます。IdentityCheckが「Off」の場合は「-」が表示されます。デフォルトではssl_access_logのみに含まれます。
    • %u:認証ユーザ名が表示されます。認証がない場合は「-」が表示されます。デフォルトではssl_access_logのみに含まれます。
    • %t:リクエストを受け付けた時刻が表示されます。デフォルトではssl_access_log、ssl_request_log共に含まれ サンプルログでは前者が「[23/Jun/2021:11:16:43 +0900]」、後者は「[23/Jun/2021:11:32:40 +0900]」に該当します。
    • %r:リクエストの最初の行が表示されます。デフォルトではssl_access_log、ssl_request_log共に含まれサンプルログでは「GET / HTTP/1.1」に該当します。引用符(")の前にエスケープ文字(\)が配置されているため、%rの前後に引用符が付与されています。
    • %>s:ステータスが表示されます。内部でリダイレクトされた場合は、最後のステータスが含まれます。デフォルトではssl_access_logのみに含まれサンプルログでは「403」に該当します。
    • %b:レスポンスのバイト数が表示されます。(HTTP ヘッダは除く)1バイトも送られなかった場合は 「-」 が表示されます。デフォルトではssl_access_log、ssl_request_log共に含まれサンプルログでは「4897」に該当します。
    • %{varname}x:特定のモジュールを有効化することで追加されるログ形式です。デフォルトのssl_request_logでは、「SSL_PROTOCOL」と「SSL_CIPHER」が使用されています。デフォルトではssl_request_logのみに含まれサンプルログでは「SSL_PROTOCOL」が「TLSv1.2」であり、「SL_CIPHER」が「ECDHE-RSA-AES256-GCM-SHA384」となります。
      ※本記事ではmod_sslを有効化したことで、ssl.confファイルにて%{varname}xを利用しています。

※一部構成要素はaccess_logと同一となります。
※以下のリンクより上記以外の構成要素に関する説明がありますのでご参照いただければと思います。
https://httpd.apache.org/docs/2.4/en/mod/mod_log_config.html

ログ形式の変更例

  • ssl_access_logに「SSL_PROTOCOL」と「SL_CIPHER」を含める場合は/etc/httpd/conf.d/ssl.confを編集し、Transferlogディレクティブにて明示的にログ形式を定義します。
    ※Syslogサーバへの転送設定は記載しておりません。

変更前

# vi /etc/httpd/conf.d/ssl.conf
~~省略~~
# Use separate log files for the SSL virtual host; note that LogLevel
# is not inherited from httpd.conf.
ErrorLog logs/ssl_error_log       ##~追記箇所~
TransferLog logs/ssl_access_log

#   SSL Engine Switch:
#   Enable/Disable SSL for this virtual host.
SSLEngine on

変更後

# vi /etc/httpd/conf/httpd.conf 
~~省略~~
# Use separate log files for the SSL virtual host; note that LogLevel
# is not inherited from httpd.conf.
ErrorLog logs/ssl_error_log
LogFormat "%h %l %u %{SSL_PROTOCOL}x %{SSL_CIPHER}x %t \"%r\" %>s %b"      ##~追記箇所~
TransferLog logs/ssl_access_log 

#   SSL Engine Switch:
#   Enable/Disable SSL for this virtual host.
SSLEngine on
  • ログ形式変更後のssl_access_logのサンプルログは下記になります。
Jun 23 14:12:40 httpd_access: xxx.xxx.xxx.xxx - - TLSv1.2 ECDHE-RSA-AES256-GCM-SHA384 [23/Jun/2021:14:12:40 +0900] "GET / HTTP/1.1" 403 4897

ssl_error_logについて

ssl_error_logのSyslogサーバへの転送にはerror_logと同様にloggerおよびimfileモジュールを利用できます。

ログ形式

ログ形式はerror_logと同様です。サンプルログ含め、error_logの項を参照してください。

ログ形式の変更例

ログ形式の変更例についてはerror_logの項を参照してください。

設定(LSC側)

基本設定

  • syslogにて転送されたメッセージは「SYSLOG収集」にてLSCで受信します。「SYSLOG収集」につきましては、以下の記事をご参照ください。
    SYSLOG収集
  • 「SYSLOG収集」にて利用されるポート番号はデフォルトでtcp/udp共に514となっています。環境設定より「SYSLOG収集」にて利用されるポート番号を変更することで514以外のポートで「SYSLOG収集」が可能となります。環境設定につきましては、以下の記事をご参照ください。
    LogStare Collector における環境設定について

以上でApache(httpd)のアクセスログの収集についての説明は終了となります。

【今すぐ無償でお試しいただけます!】
無償版 LogStare Collectorのダウンロード | LogStare Collectorの詳しい資料をダウンロード

記載されている会社名、システム名、製品名は一般に各社の登録商標または商標です。

当社製品以外のサードパーティ製品の設定内容につきましては、弊社サポート対象外となります。

D-Link製DGS-3000シリーズ及びDGS-3120シリーズにおけるSYSLOG/SNMP設定前のページ

Nutanix Prism ElementにおけるSNMP監視/REST API監視について次のページ

ピックアップ記事

  1. Zabbixヒストリデータのレポート生成について
  2. ログフォワーダー「okurun.jar」について
  3. IoT機器「Raspberry pi」とLogStare Collectorで温…
  4. 自社製品をAMIにしてAWSマーケットプレイスへ出品

関連記事

  1. AlmaLinux をSNMPで 監視

    Windows/Linux

    AlmaLinuxをSNMPで監視してみた!設定方法や監視項目は?

    当記事では、AlmaLinuxのSNMP設定から、LogStare C…

  2. Windows/Linux

    CloudWatch Logs収集に必要な権限について

    当記事では、CloudWatch Logs収集に必要な権限について記載…

  3. Tech-Blog

    Linuxにて特定のアウトバウンド通信を許可するための設定例

    当記事では、Linuxにて特定のアウトバウンド通信を許可するための設定…

  4. AWS/Azure

    AWSマーケットプレイス上から無償版のLogStare Collectorを試す

    当記事では、AWSマーケットプレイス上に無償版として出品されているLo…

月額200円でM356の監査ログの運用レベルUP LogStare M365

AWSのログ分析・モニタリングに 次世代のマネージド・セキュリティ・プラットフォーム LogStare

  1. 実践記事

    DNSキャッシュポイズニングやってみた
  2. NW機器

    SonicWall UTMにSyslog送信設定を追加する方法について
  3. SNMPを触ってみた

    ログ分析・監視テクニック

    SNMPとは?新入社員が生まれてはじめて触ってみた!
  4. NW機器

    Nutanix Prism ElementにおけるSNMP監視/REST API…
  5. NW機器

    PaloAltoのIPsec IKEv1 Phase1におけるトラブルシューティ…
PAGE TOP