【WEBサーバ】アクセスログ確認

自宅サーバをもって約3週間。
アクセスログを確認してみると、何やらレスポンスを確認しているかような怪しいログが。
アクセスログをgpreしてみました。

1zgrep "File does not exist" error*.log* >> /home/ユーザ名/result1.txt
2zgrep "phpMyAdmin" access.log* >> /home/ユーザ名/result2.txt

gpre結果から自身のIPを除き、どこのパスにアクセスしているか、
確認すると下記のパスに連続してGETしていました。

/phpMyAdmin/scripts/setup.php
/myadmin/scripts/setup.php
/pma/scripts/setup.php

プロキシサーバ使われていると調べようもないですが、
IP元は台湾、タイ、中国、ドイツ、トルコ等様々。
アジアが多い感じ。

mySQLはCUIで触るので、そもそもphpMyAdminを導入していないから問題ないですが、勉強になりました。

【WEBサーバ】Apache2設定ファイル

RedHatとDebianでApache2の仕様がだいぶ違うので、メモ程度に記載。
RedHatはVMのCentOS、DebianはRaspberry PiのRaspbainを元にしています。

RedHat:設定は「httpd.conf」で行う。
Debian:設定は外部設定ファイルで行い、かつ、利用する機能分をシンボリックリンクで別管理する。
下記に詳細。

  • RedHat(CentOS)

    【基本設定ファイル】
    /etc/httpd/conf/httpd.conf
    ServerTokensの設定、Timeoutの設定、
    利用モジュールの配置場所、利用モジュールの設定ファイル配置場所
    バーチャルホスト設定等を設定する。

    例) /etc/httpd/conf/httpd.conf
    # ServerTokensの設定
    ServerTokens Prod
    
    # Timeoutの設定
    Timeout 60
    
    # 利用モジュールの配置場所
    LoadModule rewrite_module modules/mod_rewrite.so
    
    # 利用モジュールの設定ファイル配置場所
    include conf.d/ssl.conf
    
    # バーチャルホスト設定
    <VirtualHost *:80>
    

    【利用モジュールの設定ファイル】
    /etc/httpd/conf.d/モジュール.conf
    利用モジュールの各種動作を設定する。

    例) /etc/httpd/conf.d/ssl.conf
    # 証明書のパス
    SSLCertificateFile 証明書のパス
    
  • Debian(Raspbain)

    【基本設定ファイル】
    /etc/apache2/apache2.conf
    Timeoutの設定、追加設定ファイル配置場所、
    利用モジュールの配置場所、利用モジュールの設定ファイル配置場所、
    バーチャルホスト設定ファイル配置場所等を設定する。
    ServerTokensの設定は追加設定ファイルで行う。

    例) /etc/apache2/apache2.conf
    # Timeoutの設定
    Timeout 60
    
    # 追加設定ファイル配置場所
    Include conf.d/
    
    # 利用モジュールの配置場所
    Include mods-enabled/*.load
    
    # 利用モジュールの設定ファイル配置場所
    Include mods-enabled/*.conf
    
    # バーチャルホスト設定ファイル配置場所
    Include sites-enabled/
    

    【追加設定ファイル】
    /etc/apache2/conf.d/追加設定名
    ServerTokensの設定、文字コードの設定を行う。

    例) /etc/apache2/conf.d/security
    # ServerTokensの設定
    ServerTokens ProductOnly
    

    【利用モジュールの設定ファイル】
    /etc/apache2/mods-available/モジュール.conf
    利用モジュールの各種動作を設定する。

    例) /etc/apache2/mods-available/dav_svn.conf
    # SVNのパス
    SVNParentPath /var/www/svn
    

    【バーチャルホスト設定ファイル】
    /etc/apache2/sites-available/バーチャルホスト
    バーチャルホストを設定する。

    例) /etc/apache2/sites-available/default
    <VirtualHost *:80>
    
  • 「/etc/apache2」のディレクトリ構成
    apache2.conf
    ├ conf.d/security
    ├ mods-enabled/モジュール.load ⇒ mods-available/モジュール.load
    ├ mods-enabled/モジュール.conf ⇒ mods-available/モジュール.conf
    └ sites-enabled/バーチャルホスト ⇒ sites-available/バーチャルホスト

    基本設定ファイルに記載している「mods-enabled」、「sites-enabled」には
    実ファイルではなく、シンボリックリンクが配置されており、
    実ファイルは「mods-available」、「sites-available」に配置されている。

    モジュールの有効化と無効化

    1a2enmod モジュール
    2a2dismod モジュール

    バーチャルホストの有効化と無効化

    1a2ensite バーチャルホスト
    2a2dissite バーチャルホスト

【WEBサーバ】Apache2SSL導入

Apache2にSSLを導入し、httpsで接続できるようにします。

  • OpenSSL設定
    「/etc/ssl/openssl.cnf」が存在していたので
    OpenSSLはインストール済のようなので、設定だけ行います。

    # [ usr_cert ] 付近を下記内容に変更
    #nsCertType                      = server
    ↓
    nsCertType                      = server
    
    # [ v3_ca ]付近を下記内容に変更
    #nsCertType = sslCA, emailCA
    ↓
    nsCertType = sslCA, emailCA
    
  • オレオレ認証局作成

    1cd /usr/local/
    2mkdir certs
    3cd certs
    4/usr/lib/ssl/misc/CA.pl -newca
    #Enterすれば作成されると書いてあるので、何も入力せずEnter
    CA certificate filename (or enter to create)
    ...................................+++
    .............+++
    writing new private key to './demoCA/private/cakey.pem'
    # パスワード入力
    Enter PEM pass phrase:
    # パスワード再入力
    Verifying - Enter PEM pass phrase:
    
    -----
    You are about to be asked to enter information that will be incorporated
    into your certificate request.
    What you are about to enter is what is called a Distinguished Name or a DN.
    There are quite a few fields but you can leave some blank
    For some fields there will be a default value,
    If you enter '.', the field will be left blank.
    -----
    
    # JPを入力
    Country Name (2 letter code) [AU]:
    # Tokyoを入力
    State or Province Name (full name) [Some-State]:
    # Akihabaraを入力
    Locality Name (eg, city) []:
    # Praicate_CAを入力
    Organization Name (eg, company) [Internet Widgits Pty Ltd]:
    # 何も入力せずEnter
    Organizational Unit Name (eg, section) []:
    # z-area.net
    Common Name (e.g. server FQDN or YOUR name) []:
    # 何も入力せずEnter
    Email Address []:
    
    Please enter the following 'extra' attributes
    to be sent with your certificate request
    # 何も入力せずEnter
    A challenge password []:
    # 何も入力せずEnter
    An optional company name []:
    
    Using configuration from /usr/lib/ssl/openssl.cnf
    # パスワード再々入力
    Enter pass phrase for ./demoCA/private/cakey.pem:
    Check that the request matches the signature
    Signature ok
    Certificate Details:
    ~(略)~
    Certificate is to be certified until Sep  3 14:39:36 2017 GMT (1095 days)
    Write out database with 1 new entries
    Data Base Updated
    

    オレオレ認証局が出来たので、次に秘密鍵を作成します。

  • 秘密鍵作成

    1openssl genrsa -out server.key 1024
    Generating RSA private key, 1024 bit long modulus
    ...................................+++
    .............+++
    e is 65537 (0x10001)
    

    秘密鍵が作成できたので、次に公開鍵を作成します。

  • 公開鍵作成

    1openssl req -new -key server.key -out server.csr

    先ほどオレオレ認証局を作成したときと同じ値を入力する。

    You are about to be asked to enter information that will be incorporated
    into your certificate request.
    What you are about to enter is what is called a Distinguished Name or a DN.
    There are quite a few fields but you can leave some blank
    For some fields there will be a default value,
    If you enter '.', the field will be left blank.
    -----
    # JPを入力
    Country Name (2 letter code) [AU]:
    # Tokyoを入力
    State or Province Name (full name) [Some-State]:
    # Akihabaraを入力
    Locality Name (eg, city) []:
    # Pravate_CAを入力
    Organization Name (eg, company) [Internet Widgits Pty Ltd]:
    # 何も入力せずEnter
    Organizational Unit Name (eg, section) []:
    # z-area.net
    Common Name (e.g. server FQDN or YOUR name) []:
    # 何も入力せずEnter
    Email Address []:
    
    Please enter the following 'extra' attributes
    to be sent with your certificate request
    # 何も入力せずEnter
    A challenge password []:
    # 何も入力せずEnter
    An optional company name []:
    

    公開鍵が作成できたので、最後にオレオレ証明書を作成する。

  • オレオレ証明書作成
    証明書のシリアルナンバーを発行する。

    1# シリアルナンバー01で発行
    2echo 01 > demoCA/ca-cert.srl
    3# -days 3650 は有効日数なので10年
    4openssl x509 -CA ./demoCA/cacert.pem -CAkey ./demoCA/private/cakey.pem -CAserial ./demoCA/ca-cert.srl -req -days 3650 -in server.csr -out server.crt
    Signature ok
    subject=/C=JP/ST=Tokyo/L=Akihabara/O=Private_CA/CN=z-area.net
    Getting CA Private Key
    # パスワード再々々入力
    Enter pass phrase for ./demoCA/private/cakey.pem:
    
    1ls
    2demoCA  server.crt  server.csr  server.key

    demoCA:オレオレ認証局
    server.crt:オレオレ証明書
    server.csr:公開鍵
    server.key:秘密鍵

  • Apache2SSL設定
    Apache2のSSL設定とSSLモジュールを有効にする。

    Enabling site default-ssl.
    To activate the new configuration, you need to run:
      service apache2 reload
    
    Enabling module ssl.
    See /usr/share/doc/apache2.2-common/README.Debian.gz on how to configure SSL and create self-signed certificates.
    To activate the new configuration, you need to run:
      service apache2 restart
    
    1vi /etc/apache2/sites-enabled/default-ssl
    # ServerAdminの上に下記内容を追加
    ServerName z-area.net
    
    # 下記内容を変更
    SSLCertificateFile    /etc/ssl/certs/ssl-cert-snakeoil.pem
    ↓
    SSLCertificateFile    /usr/local/certs/server.crt
    
    SSLCertificateKeyFile /etc/ssl/private/ssl-cert-snakeoil.key
    ↓
    SSLCertificateKeyFile /usr/local/certs/server.key
    
    # 下記内容を変更(「/var/www/」の子要素)
    Options Indexes FollowSymLinks MultiViews
    ↓
    Options -Indexes FollowSymLinks -MultiViews
    
    # .hatcessファイル制御(単純にAllで良いのかは要検討)
    AllowOverride None
    ↓
    AllowOverride All
    
  • ファイアウォール設定

    1ufw allow 443
    2# yを入力
    3Command may disrupt existing ssh connections. Proceed with operation (y|n)?
    4Firewall is active and enabled on system startup
    5ufw status

    ToActionFrom
    20LIMITAnywhere
    21LIMITAnywhere
    22LIMITAnywhere
    80ALLOWAnywhere
    8080ALLOWAnywhere
    443ALLOWAnywhere

    「https://z-area.net/」でHTTPS接続でIt Works!が表示されれば成功。
    ルータでもポート443を開放後に外からも接続確認。

【WEBサーバ】Apache2ログ設定

現場ではログはデイリーなのでどうやってるのかということで設定お試しです。
さらにログ解析した際、エクセルでやらされた覚えがありますが、
やはりツールがあるようなのでお試しです。

  • Apache2ログローテーション

    1vi /etc/apache2/sites-available/default
    # 下記内容を変更
    CustomLog ${APACHE_LOG_DIR}/access.log combined
    ↓
    #CustomLog ${APACHE_LOG_DIR}/access.log combined
    
    # 下記内容を追加
    # XXは固定化したいIPによって変更
    # ownlog:自身のアクセスログ ⇒ access_own.log に出力
    # robotlog:検索ロボットのアクセスログ ⇒ access_robot.log に出力
    # nolog:自身と検索ロボット以外のアクセスログ ⇒ access.log に出力
    SetEnvIf Remote_Addr "192.168.XX." ownlog nolog
    SetEnvIf Remote_Addr "127.0.0.1" ownlog nolog
    SetEnvIf User-Agent "Googlebot" robotlog nolog
    SetEnvIf User-Agent "bingbot" robotlog nolog
    SetEnvIf User-Agent "MJ12bot" robotlog nolog
    SetEnvIf User-Agent "YahooFeedSeeker" robotlog nolog
    SetEnvIf User-Agent "ichiro/mobile goo" robotlog nolog
    SetEnvIf User-Agent "360Spider" robotlog nolog
    SetEnvIf User-Agent "SurveyBot" robotlog nolog
    SetEnvIf User-Agent "ia_archiver" robotlog nolog
    SetEnvIf Remote_Addr "208.43.225.84" robotlog nolog
    SetEnvIf Remote_Addr "208.43.225.85" robotlog nolog
    SetEnvIf User-Agent "crowler" robotlog nolog
    CustomLog ${APACHE_LOG_DIR}/access_own.log common env=ownlog
    CustomLog ${APACHE_LOG_DIR}/access_robot.log combined env=robotlog
    CustomLog ${APACHE_LOG_DIR}/access.log combined env=!nolog
    
    # 下記内容を変更
    weekly
    ↓
    daily
    
    rotate 52
    ↓
    rotate 90
    

    1日単位でログをローテーションするよう変更したため、
    新規ファイルをログフォルダで作成できるようログ権限を変更する。

  • webalizer導入
    webalizerによるアクセスログの解析を行います。
    解析対象は下記の通り。
    1.自身と検索ロボット以外のアクセスログ
    2.検索ロボットのアクセスログ

    1apt-get install webalizer
    2# インストール時に自動作成された「/var/www/webalizer」は1のアクセスログ用
    3# 2のアクセスログ用フォルダを作成
    4mkdir /var/www/webalizer/robot
    5# 1のアクセスログ解析ファイルを編集
    6vi /etc/webalizer/webalizer.conf
    # 下記内容を変更
    # Incremental no
    ↓
    Incremental yes
    
    # 下記内容を追加
    HTMLHead <META HTTP-EQUIV="content-Type" CONTENT="text/html; charset=UTF-8">
    
    1# 1のアクセスログ解析ファイルをコピーして2のアクセスログ解析ファイルを作成
    2cp -pi /etc/webalizer/webalizer.conf /etc/webalizer/robot.conf
    3vi /etc/webalizer/robot.conf
    # 下記内容を変更
    LogFile /var/log/apache2/access.log.1
    ↓
    LogFile /var/log/apache2/access_robot.log.1
    
    OutputDir /var/www/webalizer
    ↓
    OutputDir /var/www/webalizer/robot
    

    既に出力済のアクセスログがあれば、過去分を解析する。

    1webalizer -c /etc/webalizer/webalizer.conf /var/log/apache2/access.log
    2webalizer -c /etc/webalizer/robot.conf /var/log/apache2/access_robot.log

    アクセスログ解析結果はHTMLで参照する。
    1.http://z-area.net/webalizer/
    2.http://z-area.net/webalizer/robot/

    現状のままでは、誰でもアクセスログ解析結果を参照できてしまうので制御する。

    # 下記内容を追加
    # XXは固定化したいIPによって変更
    order deny,allow
    deny from all
    allow from 192.168.XX.
    allow from 127.0.0.1
    allow from localhost
    
    1vi /var/www/webalizer/robot/.htaccess
    # 下記内容を追加
    # XXは固定化したいIPによって変更
    order deny,allow
    deny from all
    allow from 192.168.XX.
    allow from 127.0.0.1
    allow from localhost
    

【WEBサーバ】Apache2導入

  • IP固定化

    # 下記内容を変更
    iface eth0 inet dhcp
    ↓
    iface eth0 inet static
    
    # 下記内容を追加
    address 固定化したいIP(Cクラス内)
    netmask 255.255.255.0
    gateway ルータのIP
    

Indexes:ディレクト一覧表示制御
FollowSymLinks:シンボリックリンク利用制御
⇒ロリ○ップでのセキュリティ事故はシンボリックリンクに関するもの。
 マイナスオプションで制御しても色々問題があるようなのでひとまず有効のまま。
 参考URL:https://fumiyas.github.io/2013/09/03/no-followsymlinks-is-not-safe.html
MultiViews:多言語表示制御
「http://固定化したいIP/」でIt Works!が表示されれば成功。