タグ: apache Page 1 of 2

Apacheで特定のアクセス元からの通常アクセスをログに残さない設定。

概要

Webサービスの運用時、「誰がいつどこにアクセスしたか」を判別するアクセスログはとても重要なものです。


ではありますが、Webアクセス解析時に自分のアクセスログが邪魔になるケースがありました。

そこで、Apacheの設定ファイルで特定のアクセス元からのログを残さないようにしました。

確認環境

  • OS : Ubuntu 20.04 LTS
  • Apache 2.4.55

前提

  • 大本のコンフィグ(httpd.conf)ではなくバーチャルサイトで設定していること。
  • Apache設定ファイルに管理者権限で設定ができること。
  • 除外するIP/NWに対し、合意が取れていること。

注意事項

  • この方法でエラーログの除外設定はできません。

実施した手順

ほぼ全てSSHクライアントターミナルからの操作です。

さっくりとした手順

  1. コンフィグのバックアップを取ります。
  2. ログを残さない除外IP/NWを加えます。
  3. コンフィグの整合性を確認し、設定を反映します。
  4. 除外したIP/NWからのアクセスログが出ないことを確認します。

コンフィグ設定

コンフィグのバックアップを取ります。

sudo cp -pi /etc/apache2/sites-available/sites.conf /path/to/backup/directory/sites.conf.$(date +%Y%m%d)
# 自分が設定しているバーチャルサイトのコンフィグ / バックアップディレクトリに合わせます。

diff -u /etc/apache2/sites-available/sites.conf /path/to/backup/directory/sites.conf.$(date +%Y%m%d)
# 差分が無いことでバックアップが取れていることを確認します。

コンフィグファイルを編集します。

sudo vi /etc/apache2/sites-available/sites.conf
# 教義・信仰に従ったエディタで編集してください。
編集例

ここでは、以下の設定とします。

  • 除外IP: 192.168.1.11
  • 除外NW: 192.168.2.0/24
  • アクセスログの格納場所: /var/log/redmine/access.log
    # 以下のIP/NWはアクセスログに記録させません
    SetEnvIf Remote_Addr "192.168.1.11" dontlog
    SetEnvIf Remote_Addr "^192\.168\.2\." dontlog
    CustomLog /var/log/redmine/access.log combined env=!dontlog

保存後、以下のような差分を確認します。

diff -u /path/to/backup/directory/sites.conf.$(date +%Y%m%d) /etc/apache2/sites-available/sites.conf
  • ●差分
+    # 以下のIP/NWはアクセスログに記録させません
+    SetEnvIf Remote_Addr "192.168.1.11" dontlog
+    SetEnvIf Remote_Addr "^192\.168\.2\." dontlog
-    CustomLog /var/log/redmine/access.log combined
+    CustomLog /var/log/redmine/access.log combined env=!dontlog

設定反映

コンフィグの整合性を確認後に設定を反映します。

sudo apache2ctl configtest
# Syntax OKを確認します。

systemctl status apache2.service
# active (running)を確認します。

sudo systemctl restart apache2.service

systemctl status apache2.service
# active (running)を確認します。

動作確認

設定後の動作を確認します。

  • ●アクセスログ確認コマンド発行
tail -f /var/log/redmine/access.log
# 自分の環境(設定したアクセスログ)に合わせます。
  • ●エラーログ確認コマンド発行

※別ターミナルで開きます。

tail -f /var/log/redmine/error.log
# 自分の環境(設定したエラーログ)に合わせます。
  • ●ブラウザで以下を実施
  1. 設定したIP / NWから設定対象のWebサイトにアクセスする。
  2. 設定していないIP / NWから設定対象のWebサイトにアクセスする。
  3. 設定したIP / NWから設定対象のWebサイトにアクセスするがエラーを起こす。(404/403エラーなど)
  4. 設定していないIP / NWから設定対象のWebサイトにアクセスするがエラーを起こす。(404/403エラーなど)

その間、以下をターミナルで開いたアクセスログ/エラーログで確認できれば設定は完了です。

  1. 設定したIP / NWからのアクセスログが出ないこと。
  2. 設定していないIP / NWからのアクセスログが出ること。
  3. 設定したIP / NWからのエラーログが出ること。
  4. 設定していないIP / NWからのエラーログが出ること。

アクセス解析システム:matomoのインストール。

概要

オープンソースの解析システムであるmatomoをAWS Lightsail上にインストールしました。

参考としたURL

本記事で実施すること

  • AWSサーバに導入されているPHPがサポート終了しているため、7.4から8.1にアップグレードする。
  • Ubuntu 20.04にアクセス解析システム「matomo」をインストールする。
  • その際に常時SSL化を行う。
  • Web画面から初期設定を行う。

※アクセス対象のシステムへの設定は別の記事で紹介します。

前提

  • 既に以下のシステムがWAN環境に揃っていること。
  • Ubuntu 20.04
  • Apache 2.4
  • mysql 8
  • PHP 7.4
  • matomo用のサブドメインを取得していること。
  • それに即した証明書があること。

手順

さっくりとした手順

  1. PHPを7.4から8.1にアップグレードする。
  2. MySQLのDBとユーザを作成する。
  3. ディレクトリにmatomoプログラムを配置する。
  4. Apache設定ファイルを作成し、常時SSLで接続できるようにする。
  5. matomoサイトにログインできることを確認する。
  6. matomo Web画面で初期設定をする。

PHPのアップグレードを行います。

sudo apt-get --purge autoremove php*

sudo aptitude install php8.1
sudo aptitude install php8.1-{opcache,pdo,bcmath,calendar,ctype,fileinfo,ftp,gd,intl,json,ldap,mbstring,mysql,mysqli,posix,readline,sockets,bz2,tokenizer,zip,curl,iconv,phar,xml,dev}
sudo aptitude install php8.1-apcu
sudo aptitude install php8.1-memcached

sudo systemctl restart apache2.service

php -v
# PHP 8.1.14を確認しました。

PHPアップグレード後、PHPを動かしているサーバ内のサイトが正常に動くことを確認しました。

データベースを作成します。

sudo mysql -u root -p
CREATE DATABASE matomodb;
CREATE USER 'matomouser'@'localhost' IDENTIFIED BY 'password';
/* パスワードは自身の環境に合わせ、強固なものを設定してください */
GRANT ALL ON matomodb.* to 'matomouser'@'localhost';
FLUSH PRIVILEGES;
EXIT;

matomoプログラムをディレクトリに配置します。

cd /tmp &&pwd
# tmpにいることを確認します

wget https://builds.matomo.org/matomo-latest.zip

unzip matomo-latest.zip

sudo chown -R www-data:www-data matomo

sudo mv matomo /var/www/html/
# 今回は/var/www/htmlに配置します。

ls -ld /var/www/html/matomo
# 該当ディレクトリにファイル一式があることを確認します

Apache設定ファイルを作成します。

  • 【】内を自分の環境に合わせます。
  • コマンド一式をコピー → 別のエディタにペースト
  • その後、【】内を自分の環境に修正してコピー
  • コマンド一式をSSHクライアントに貼り付ける
cat <<- __EOF__ | sudo tee -a /etc/apache2/sites-available/matomo.conf
<VirtualHost _default_:80>
ServerName 【設定したドメイン名】
 RewriteEngine On
        RewriteCond %{HTTPS} off
        RewriteRule ^(.*)$ https://%{HTTP_HOST}%{REQUEST_URI} [R=301,L]
</VirtualHost>

<VirtualHost *:443>
    ServerName 【設定したドメイン名】
    CustomLog 【/var/log/matomo/matomo_access.log combined】
    ErrorLog 【/var/log/matomo/matomo_error.log】
    # アクセスログとエラーログは自分の環境に合わせて設定します。

    DocumentRoot /var/www/html/matomo
    <Directory /var/www/html/matomo>
        Options Indexes FollowSymLinks MultiViews
        AllowOverride All
        Require all granted
    </Directory>

  SSLEngine on

    Protocols h2 http/1.1
    Header always set Strict-Transport-Security "max-age=63072000"

SSLCertificateFile 【SSL証明書のファイルパス】
SSLCertificateKeyFile 【SSL秘密鍵のファイルパス】
# SSLCACertificateFile 【SSL中間証明書のファイルパス】
# 中間証明書が発行元から別ファイルで提供されている場合は、この直上をコメントアウトして中間証明書を指定します

</VirtualHost>

SSLProtocol             all -SSLv3 -TLSv1 -TLSv1.1
SSLCipherSuite          ECDHE-ECDSA-AES128-GCM-SHA256:ECDHE-RSA-AES128-GCM-SHA256:ECDHE-ECDSA-AES256-GCM-SHA384:ECDHE-RSA-AES256-GCM-SHA384:ECDHE-ECDSA-CHACHA20-POLY1305:ECDHE-RSA-CHACHA20-POLY1305:DHE-RSA-AES128-GCM-SHA256:DHE-RSA-AES256-GCM-SHA384
SSLHonorCipherOrder     off
SSLSessionTickets       off

SSLUseStapling On
SSLStaplingCache "shmcb:logs/ssl_stapling(32768)"
# これらのセクションはSSL暗号化強度を高めるための記述です
# </VirtualHost>の外側に書くことにご注意ください
__EOF__

設定を反映します。

cd /etc/apache2/sites-available && pwd
# 対象ディレクトリにいることを確認します

sudo a2ensite matomo.conf

sudo apache2ctl configtest
# Syntax OKを確認します

sudo systemctl restart apache2.service

ブラウザで

https://【matomoを設定したドメイン名】

にアクセスし、初期画面が出ることを確認します。

初期インストール画面の設定

「次へ」をクリックします。

全てチェックされていることを確認して「次へ」をクリックします。

◎データベースを設定します。

  • ログイン: MySQLのユーザー(matomouser)
  • パスワード: 設定したパスワード
  • データベース名:作成したDB (matomodb)

をそれぞれ入力し、「次へ」をクリックします。正常に入力されれば「テーブルを作成されました」とデルので「次へ」をクリックします。

◎スーパーユーザーを設定します。

  • スーパーユーザーログイン:ログインするユーザー名
  • パスワード:ログイン時のパスワード
  • パスワード(再入力)
  • メールアドレス

をそれぞれ入力して「次へ」をクリックします。

◎アクセス解析を行うウェブサイトを設定します。

  • アクセス解析対象のウェブサイトの名前
  • ウェブサイトのURL (このmatomoサイトではなく、アクセス解析を行いたいWebサイト)
  • ウェブサイトのタイムゾーン
  • eコマースか否か

を設定して「次へ」をクリックします。

これらを設定後、トラッキングタグが表示されます。これらを控えて「次へ」をクリックします。

「おめでとうございます!」と表示されればインストールの一連の作業は完了します。

ChatGPTが作成したapacheバーチャルファイル。

2022年12月頃にTwitterで大いに話題となったChatGTP。

https://chat.openai.com/chat

これは文書作成のみならずコードも書けると知ったので早速試してみました。

作成してほしいコード

  • apacheでwordpressを動かすためのコンフィグ。
  • httpアクセスをhttpsにリダイレクトする。
  • アクセスログとwordpressのプログラムの格納場所は指定。

質問した内容

以下の文章をChatGPTに入力しました。

apacheでwordpressを公開するためのバーチャルサイトのコンフィグを作成してください。
サーバはUbuntu22.04です。apacheとmod_sslは導入済みです。
ドメインはweblog.example.comです。
wordpressは/home/www-virtual/wordpressに格納されています。
アクセスログは/var/log/apache2/weblog.example.comを指定します。
httpアクセスを強制的にhttpsにリダイレクトし、TLS1.2のみを有効化します。
wp-adminディレクティブは192.168.1.0/24以外アクセスできないようにします。

返ってきた内容

結論から言って驚きの結果でした。


まず、/etc/apache2/sites-available/weblog.example.com.confという名前のファイルを作成します。 次に、以下の内容を記述します:

<VirtualHost *:80>
    ServerName weblog.example.com
    DocumentRoot /home/www-virtual/wordpress
    ErrorLog /var/log/apache2/weblog.example.com/error.log
    CustomLog /var/log/apache2/weblog.example.com/access.log combined
    <Directory /home/www-virtual/wordpress>
        Require all granted
    </Directory>
</VirtualHost>

次に、SSL用のバーチャルサイトの設定を追加します。

<VirtualHost *:443>
    ServerName weblog.example.com
    DocumentRoot /home/www-virtual/wordpress
    ErrorLog /var/log/apache2/weblog.example.com/ssl-error.log
    CustomLog /var/log/apache2/weblog.example.com/ssl-access.log combined
    SSLEngine on
    SSLCertificateFile /path/to/your/certificate.crt
    SSLCertificateKeyFile /path/to/your/privatekey.key
    SSLProtocol TLSv1.2
    <Directory /home/www-virtual/wordpress>
        Require all granted
    </Directory>
    <Location "/wp-admin/">
        Require ip 192.168.1.0/24
    </Location>
</VirtualHost>

最後に、httpアクセスをhttpsにリダイレクトするために、mod_rewriteモジュールを有効化し、以下の設定を追加します。

<VirtualHost *:80>
    ServerName weblog.example.com
    DocumentRoot /home/www-virtual/wordpress
    ErrorLog /var/log/apache2/weblog.example.com/error.log
    CustomLog /var/log/apache2/weblog.example.com/access.log combined
    <Directory /home/www-virtual/wordpress>
        Require all granted
        RewriteEngine on
        RewriteCond %{HTTPS} off
        RewriteRule ^(.*)$ https://%{HTTP_HOST}%{REQUEST_URI} [L,R=301]
    </Directory>
</VirtualHost>

これで、バーチャルサイトの設定が完了しました。

注意: 上記の設定は一例であり、適切な設定はサイトの状況や環境によって異なります。また、必要に応じて、この設定をカスタマイズしてください。


注文通りです。想定通りの動きになるのはほぼ間違いないです。(後で検証したいぐらいです)これに付け加えるならば、

sudo a2ensite weblog.example.com.conf
sudo apache2ctl configtest
# Syntax OKを確認します
sudo systemctl restart apache2.service

ぐらいでしょう。

今後の各種サーバ設定に大いに貢献する予感です。

mod_securityで検知したIPの自動遮断。

ここから更に改良を加えました。

やりたいこと

  • 上記抜き出したIPアドレスのリストを日々統合する。
  • 自動的にmod_securityのnegativeリストに入れる。
  • その上で普段アクセスしているIPアドレスを除外して偽陽性から逃れる。

前提

以下を導入済みです。

  • Mod_security
  • Apache 2.4.1
  • Redmine 4.2
  • ログの格納先は /var/lib/redmine/log/

手順

全て管理者権限で実施しました。

ログを格納するディレクトリを作成します。

mkdir /var/lib/redmine/log/suspicious_ip

自動実行するスクリプトを作成します。

cd /hoge/
vi negativelist_add.sh
スクリプト内容
#!/bin/sh

SHELL=/bin/sh
PATH=/usr/local/sbin:/usr/local/bin:/sbin:/bin:/usr/sbin:/usr/bin

cd /var/lib/redmine/log
cat error.log | awk 'match($0,/[0-9]+\.[0-9]+\.[0-9]+\.[0-9]+/) { print  substr($0, RSTART, RLENGTH) }' | sort | uniq > /var/lib/redmine/log/suspicious_ip/suspicious_ip.`date +%Y%m%d`
chown www-data:www-data /var/lib/redmine/log/suspicious_ip/suspicious_ip.`date +%Y%m%d`
cat /var/lib/redmine/log/suspicious_ip/suspicious_ip.2* |sort |uniq > /var/lib/redmine/log/suspicious_ip_all.txt
cat suspicious_ip_all.txt > /etc/apache2/sites-available/negativelist.txt
chown www-data:www-data suspicious_ip_all.txt
sed -i  /除外したいIPアドレス/d /etc/apache2/sites-available/negativelist.txt

スクリプトに実行権限を設定します。

chmod +x negativelist_add.sh

Apacheの設定ファイルを編集します。

ここでは/etc/apache2/sites-available/redmine-le-ssl.conf にコンフィグを作成済みです。

cd /etc/apache2/sites-available
cp -pi redmine-le-ssl.conf redmine-le-ssl.conf.bak
vi redmine-le-ssl.conf
設定ファイル内容
<VirtualHost _default_:80>
servername [redmineのドメイン名]
 RewriteEngine On
        RewriteCond %{HTTPS} off
        RewriteRule ^(.*)$ https://%{HTTP_HOST}%{REQUEST_URI} [R=301,L]
</VirtualHost>
<VirtualHost _default_:443>
servername [redmineのドメイン名]
CustomLog /var/log/redmine/access.log combined
ErrorLog /var/log/redmine/error.log
Alias /redmine /var/lib/redmine/public

# Mod Security
SecRuleEngine On
## ModSecurity有効化
SecRequestBodyInMemoryLimit 524288000
SecRequestBodyLimit 524288000
## ファイルのアップロードをできるようにします。
SecRuleRemoveById 949110
SecRuleRemoveById 941310
SecRuleRemoveById 980130
SecRuleRemoveById 911100
SecRuleRemoveById 200002
SecRuleRemoveById 200003
SecRuleRemoveById 200004
SecRuleRemoveById 959100
## 上記を無効化しないとチケット更新時にエラーとなりました(偽陽性)ため、上記ルールを除外します。
    SecRule ARGS:modsecparam "@contains test" "id:4321,deny,status:403,msg:'ModSecurity test rule has triggered'"
## テスト用の検知パラメータを付け加えます。

## Negativelist
SecRule REMOTE_ADDR "@pmFromFile negativelist.txt" "phase:1,id:2,deny,msg:'Negativelisted IP address'"

# /etc/apache2/sites-available/negativelist.txt に記載されたIPアドレスを自動的に遮断します。

<Location /redmine>
PassengerBaseURI /redmine
PassengerAppRoot /var/lib/redmine
Require all granted
<RequireAll>
    Require all granted
</RequireAll>
</Location>

  SSLEngine on
    Protocols h2 http/1.1
    Header always set Strict-Transport-Security "max-age=63072000"


SSLCertificateFile [let's encryptが指定した証明書ファイルのパス]
SSLCertificateKeyFile [let's encryptが指定した秘密鍵ファイルのパス]

#Include /etc/letsencrypt/options-ssl-apache.conf

        RewriteEngine On
        RewriteCond %{HTTP_HOST} ^samplehoge\.hogehoge
        RewriteRule ^/$ https://samplehoge.hogehoge/redmine/ [R]

</VirtualHost>

SSLProtocol             all -SSLv3 -TLSv1 -TLSv1.1
SSLCipherSuite          ECDHE-ECDSA-AES128-GCM-SHA256:ECDHE-RSA-AES128-GCM-SHA256:ECDHE-ECDSA-AES256-GCM-SHA384:ECDHE-RSA-AES256-GCM-SHA384:ECDHE-ECDSA-CHACHA20-POLY1305:ECDHE-RSA-CHACHA20-POLY1305:DHE-RSA-AES128-GCM-SHA256:DHE-RSA-AES256-GCM-SHA384
SSLHonorCipherOrder     off
SSLSessionTickets       off

SSLUseStapling On
SSLStaplingCache "shmcb:logs/ssl_stapling(32768)"

設定を反映します。

apache2ctl configtest
# Syntax OKを確認します
systemctl restart apache2

crontabで自動実行できるようにします。

crontab -e

追記内容

0 8 * * * /hoge/negativelist.sh

これで、以下の動きができるようになります。

  • アクセスログ(エラーログ)に従ってIPアドレスの抜き出し
  • 重複を抜き出し、その日にアクセスされた不審なIPアドレスを記載する。
  • 蓄積されたIPアドレスを全て統合。重複を抜き出しネガティブリストに上書きする。
  • そこから普段アクセスしているIPアドレスを削除する。

PHPの再インストール。(混在環境の改善)

こちらの続きです。

  • システム内にPHP 7.4と8.1が混在
  • 一部をアップグレード対応しても満足に動かない

パターンがあったので、完全削除を対応しました。

手順

PHPの完全削除

apt-get --purge autoremove php*

これにより、設定ファイルを含めてPHPが削除されました。

PHP7.4インストール

add-apt-repository ppa:ondrej/php
aptitude update
aptitude upgrade

apt install php7.4

apt install php7.4-{opcache,pdo,bcmath,calendar,ctype,fileinfo,ftp,gd,intl,json,ldap,mbstring,mysqli,posix,readline,sockets,bz2,tokenizer,zip,curl,iconv,phar,xml}


設定反映

systemctl restart apache2

その後、正常に上がっていることを確認。

[--purge]オプションで完全に削除するのを失念していました。

nginxとapache連携。(リバースプロキシー&SSLアクセラレータ)

自室のサーバに専用redmineを運用するようになって半年ほど。一つの課題が浮かび上がりました。

課題

現状、

  • redmine
  • フォトアルバム
  • growi

を自宅サーバ群で運用中。Webサービスが増えるたびに「証明書更新をサーバ毎に行うのが面倒」です。ワイルドカード証明書を用いて、シンボリックリンクの張り替えで済むようにしてもなお各サーバに同じ設定を行うのは手間がかかる上にミスが生じる温床となります。

施策

そこで、既にgrowiサーバで運用しているnginxのリバースプロキシーをredmineにも拡張するようにしました。

やりたいことは以下です。(IPアドレスとドメインは便宜上です)

sequenceDiagram participant クライアント participant nginx as nginxサーバ<br> 192.168.1.30<br>abc .local participant redmine as redmine<br> 192.168.1.99<br>xyz.local クライアント->> nginx: abc.localにhttpアクセス par クライアント~nginxはhttps通信 note over nginx: httpsにリライト nginx -->> クライアント: httpsでの接続要求 and nginx~redmineはhttp通信 クライアント ->> nginx: redmineにhttpsアクセス note over nginx: SSLデコード nginx -->>+ redmine: クライアントからの要求を<br>redmine(xyz.local)に送信 redmine -->>- nginx: redmineのデータを送信 end nginx ->> クライアント:redmineからのデータを<br>abc.localとしてhttpsで送信

サクッとまとめると

  • redmineサーバのリバースプロキシーとしてnginxを利用
  • クライアント~nginxは常時SSL通信
  • nginx ~ redmineはhttp通信

これにより、SSLを導入する箇所をnginxサーバのみとします。

前提

以下を用意しています。

  1. nginxサーバ (仮IP: 192.168.1.30)
  • mkcertでローカル証明書を導入済み
  1. redmineサーバ(apacheで稼働)(仮IP: 192.168.1.99)
  2. ローカルDNSに以下を登録します。(自分の環境に読み替えます)
  3. abc.local - 192.168.1.30
  4. xyz.local - 192.168.1.99

環境

ともにUbuntu Linux 20.04系で動いています。

手順

全て管理者権限で実施します

redmineサーバでの設定(apache)

以下、ファイルを編集します。

vi /etc/apache2/sites-available/redmine.conf
ファイル内容
<Location /redmine>
PassengerBaseURI /redmine
PassengerAppRoot /var/lib/redmine
Require all granted
</Location>

Alias /redmine /var/lib/redmine/public

<VirtualHost 192.168.1.99:80>
    ServerName  abc.local
    ErrorLog /var/log/redmine/error.log
    CustomLog /var/log/redmine/access.log combined

        RewriteEngine On
        RewriteCond %{HTTP_HOST} ^abc\.local
        RewriteRule ^/$ http://abc.local/redmine/ [R]
</VirtualHost>

設定反映

a2ensite redmine.conf
apache2ctl configtest
#Syntax OKを確認
systemctl restart apache2

nginxサーバでの設定

hostsファイル追記

vi /etc/hosts
追記内容
192.168.1.30 abc.local

nginx confファイル作成

vi /etc/nginx/sites-available/redmine.conf
ファイル内容
upstream abc {
       server 192.168.1.99:80;
}

server {
        listen 80;
        server_name abc.local;
        server_tokens off;
        return  301 https://$host$request_uri;
        access_log /var/log/nginx/redmine/access.log;
        error_log /var/log/nginx/redmine/error.log warn;
}

server {
        listen 443 ssl http2;
        server_name abc.local;
        server_tokens off;
        ssl_session_timeout 1d;
        ssl_session_cache shared:SSL:50m;
        ssl_session_tickets off;
        ssl_dhparam /etc/nginx/dhparam.pem;
    #openssl dhparam -out /etc/nginx/dhparam.pem 2048 として作成します(環境によっては5分以上かかります)
        ssl_ciphers ECDHE-ECDSA-AES128-GCM-SHA256:ECDHE-RSA-AES128-GCM-SHA256:ECDHE-ECDSA-AES256-GCM-SHA384:ECDHE-RSA-AES256-GCM-SHA384:ECDHE-ECDSA-CHACHA20-POLY1305:ECDHE-RSA-CHACHA20-POLY1305:DHE-RSA-AES128-GCM-SHA256:DHE-RSA-AES256-GCM-SHA384;
        ssl_prefer_server_ciphers off;
        add_header Strict-Transport-Security 'max-age=63072000';

        ssl_certificate /etc/certs/local.crt;
       # 証明書のパスに読み替えます
        ssl_certificate_key /etc/private/local.key;
      # 秘密鍵のパスに読み替えます

        access_log /var/log/nginx/redmine/ssl_access.log;
        error_log /var/log/nginx/redmine/ssl_error.log warn;

        proxy_set_header Host $host;
        proxy_set_header X-Real-IP $remote_addr;
        proxy_set_header X-Forwarded-Host $host;
        proxy_set_header X-Forwarded-Server $host;
        proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
        proxy_set_header X-Forwarded-Proto https;
        proxy_max_temp_file_size 10240m;
        client_max_body_size 10240m;
        proxy_buffer_size 10240m;
        proxy_buffers 10 10240m;
        proxy_busy_buffers_size 10240m;
        proxy_redirect off;

       set $proxy_target  'abc';

       location / {
          proxy_pass http://$proxy_target;
       }
}

設定反映

ln -s /etc/nginx/sites-available/redmine.conf /etc/nginx/site-enabled/redmine.conf
nginx -t
# syntax is ok と test is successfulを確認します
systemctl restart nginx -t

確認

ローカルNWに接続されているクライアントのブラウザから

http://abc.local

にアクセスし、

  • https://abc.local/redmine の内容が出てくること
  • SSL通信ができていること

を確認します。

Configuration GeneratorによるSSL強度再設定。

AWS Lightsailで運用している「インターネット接続用redmine」。運用にあたり、SSLの強化を図るため

こちらにあるように強度チェッカーで検証しながら設定を行っていました。

ところが最近、このチェックが厳しくなったようで評価がAまで落ちます。

信頼度は高いと言えるものの余り気分がいいものではありません。そこで、再びA+となるように設定を行いました。

SSL Configuration Generator

https://ssl-config.mozilla.org/

mozillaが公式に提供しているこのサイト、

  • サーバプログラム
  • プログラムのバージョン
  • 強度

を設定するだけでサンプルコードを示してくれる優れもの。これを使い、こんな感じで設定しました。

設定ファイル

<VirtualHost _default_:80>
servername 公開するドメイン
 RewriteEngine On
        RewriteCond %{HTTPS} off
        RewriteRule ^(.*)$ https://%{HTTP_HOST}%{REQUEST_URI} [R=301,L]
        # http通信をhttps通信にリダイレクト
</VirtualHost>
<VirtualHost _default_:443>
servername 公開するドメイン

CustomLog /var/log/redmine/access.log combined
ErrorLog /var/log/redmine/error.log
# redmineログ設定

SecRuleEngine On
## ModSecurity有効化
SecRequestBodyInMemoryLimit 524288000
SecRequestBodyLimit 524288000
## ファイルのアップロードをできるようにします。
SecRuleRemoveById 949110
SecRuleRemoveById 941310
SecRuleRemoveById 980130
SecRuleRemoveById 911100
SecRuleRemoveById 200002
SecRuleRemoveById 200003
SecRuleRemoveById 200004
SecRuleRemoveById 959100
## 上記を無効化しないとチケット更新時にエラーとなりました(偽陽性)ため、上記ルールを除外します。
    SecRule ARGS:modsecparam "@contains test" "id:4321,deny,status:403,msg:'ModSecurity test rule has triggered'"
## テスト用の検知パラメータを付け加えます。

## Negativelist
SecRule REMOTE_ADDR "@pmFromFile negativelist.txt" "phase:1,id:2,deny,msg:'Negativelisted IP address'"
## Mod_Securityが検知したIPアドレスをブロックします。

Alias /redmine /var/lib/redmine/public

<Location /redmine>
PassengerBaseURI /redmine
PassengerAppRoot /var/lib/redmine
Require all granted
<RequireAll>
    Require all granted
</RequireAll>
</Location>

## 上記はredmineの設定です

  SSLEngine on
    Protocols h2 http/1.1
    Header always set Strict-Transport-Security "max-age=63072000"
## SSLならびにHSTS有効化。

SSLCertificateFile /path/to/SSL/Certificate
SSLCertificateKeyFile /Path/to/SSL/Private/Key
## 証明書を格納します。

        RewriteEngine On
        RewriteCond %{HTTP_HOST} ^ドメイン名
        RewriteRule ^/$ https://ドメイン名/redmine/ [R]
        # ドメイン名でアクセスした際に/redmine/にリライトします。

</VirtualHost>

SSLProtocol             all -SSLv3 -TLSv1 -TLSv1.1
SSLCipherSuite          ECDHE-ECDSA-AES128-GCM-SHA256:ECDHE-RSA-AES128-GCM-SHA256:ECDHE-ECDSA-AES256-GCM-SHA384:ECDHE-RSA-AES256-GCM-SHA384:ECDHE-ECDSA-CHACHA20-POLY1305:ECDHE-RSA-CHACHA20-POLY1305:DHE-RSA-AES128-GCM-SHA256:DHE-RSA-AES256-GCM-SHA384
SSLHonorCipherOrder     off
SSLSessionTickets       off

SSLUseStapling On
SSLStaplingCache "shmcb:logs/ssl_stapling(32768)"
## Configuration Generatorで追加した設定。<virtualhost>ディレクティブの外に出す必要がありました。

こちらを修正してサービス再起動。

再起動後の強度チェック

再びA+を取り戻しました。

Apache脆弱性対応。(リポジトリを用いたパッケージアップデート)

AWS Lightsailを用いてインターネット接続されている自分用のredmine。

いわゆる

  • Linux
  • Apache
  • MySQL
  • Ruby

で動いておりますが、その中のApacheに脆弱性があるので対応しました。

Apache HTTP Server 2.4における複数の脆弱性に対するアップデート

https://jvn.jp/vu/JVNVU94306894/

手順

全て管理者権限で実行しています。

Ubuntu 20.04の標準パッケージでインストールされているApacheのバージョンを確認します。

apache2 -v

# 以下、脆弱性を受けるバージョンです。
Server version: Apache/2.4.41 (Ubuntu)
Server built:   2022-06-14T13:30:55

リポジトリを追加します。

add-apt-repository ppa:ondrej/apache2
# 途中、Press[Enter]と表示されるので空エンターを打ちます。

パッケージを更新します。

aptitude update
aptitude upgrade
# 確認の前に、パッケージ一覧を確認します。

パッケージ更新後のApacheのバージョンを確認します。

apache2 -v
Server version: Apache/2.4.54 (Ubuntu)
Server built:   2022-06-08T15:59:07
# 最新版である2.54であることを確認します。

サービスを再起動し、既存サイトが問題なく動くかを確認します。

systemctl restart apache2.service 

これで、ひとまずは安心です。

ApacheによるGrowiサーバのリバースプロキシー化。

Growiの使い勝手が非常に良かったので、環境を整えました。

やりたいこと

  • 導入したGrowiサーバ、「IPアドレス:3000」ではなく「ドメイン名」でアクセスできるようにしたい。
  • 既にapacheで稼働しているLychee(フォトアルバム)やZabbixは平行稼働させたい。
  • ローカルとは言えSSL通信を行いたい。

やったこと

  1. hostファイル書き換え
  2. ローカルDNS登録
    1. これに即したSSL証明書をmkcertsで作成
  3. Apacheによるリバースプロキシー有効化
  4. 設定ファイル差し替え
  5. 動作確認

前提

以下の環境を導入済みです。

  • Kubuntu Linux 20.04
  • Apache 2.4
  • Growi 5.1

手順

※ディレクトリ、ドメインなどは個人の環境に読み替えてください。

host書き換え

sudo vi /etc/hosts
追記内容
127.0.0.1       localhost
127.0.0.1       paddington.corn.wall   paddington
# ※Ubuntuの環境では「127.0.1.1」となっていましたので、localhostと同じにします
127.0.0.1       chisataki.lyco.reco     chisataki
# ※別ドメインで通信を行いたいので、この行を追加しました

DNS登録

今回、新たに「lyco.reco」というローカルドメインを作成して「chisataki.lyco.reco」で名前解決できるようにしました。

参照:

mkcertsによるローカルSSL証明書発行

mkcertsを導入したサーバで、以下を発行します。

 mkcert -key-file lyco.reco.key.202208 -cert-file lyco.reco.cert.202208 lyco.reco chisataki.lyco.reco "*.lyco.reco"

この時に発行した証明書と秘密鍵をGrowiサーバの以下に格納します。

  • /etc/certs → 証明書
  • /etc/private → 秘密鍵

参照:

秘密鍵のシンボリックリンク化

証明書と秘密鍵を格納したサーバで

cd /etc/cets
sudo ln -s lyco.reco.cert.202208 lyco.reco.cert
​
cd /etc/private
sudo ln -s lyco.reco.key.202208 lyco.reco.key
# mkcertsの証明書は有効期限が3ヶ月と短いため、更新時にはリンクの貼り替えだけで済むようにあらかじめシンボリックリンクを設定します

としておきます。

リバースプロキシー有効化

sudo a2enmod proxy proxy_http proxy_wstunnel
sudo systemctl restart apache2.service

ログ格納ディレクトリ作成

sudo mkdir /var/log/apache/chisataki.lyco.reco
sudo chown -R www-data:www-data /var/log/apache/chisataki.lyco.reco

リバースプロキシー用apache設定ファイル作成

参考:

https://docs.growi.org/ja/admin-guide/getting-started/ubuntu-server.html

sudo vi /etc/apache2/sites-available/growi.conf
設定ファイル内容

※ServerNameやログなどは読み替えてください。

<VirtualHost _default_:80>
ServerName chisataki.lyco.reco
RewriteEngine On
      RewriteCond %{HTTPS} off
      RewriteRule ^(.*)$ https://%{HTTP_HOST}%{REQUEST_URI} [R=301,L]
</VirtualHost>

<VirtualHost _default_:443>
ServerName chisataki.lyco.reco
CustomLog /var/log/apache2/chisataki.lyco.reco/access.log combined
ErrorLog /var/log/apache2/chisataki.lyco.reco/error.log
SSLEngine on
  SSLProtocol All -SSLv2 -SSLv3 -TLSv1
    SSLCipherSuite ECDHE-RSA-AES128-GCM-SHA256:ECDHE-ECDSA-AES128-GCM-SHA256:ECDHE-RSA-AES256-GCM-SHA384:ECDHE-ECDSA-AES256-GCM-SHA384:DHE-RSA-AES128-GCM-SHA256:DHE-DSS-AES128-GCM-SHA256:kEDH+AESGCM:ECDHE-RSA-AES128-SHA256:ECDHE-ECDSA-AES128-SHA256:ECDHE-RSA-AES128-SHA:ECDHE-ECDSA-AES128-SHA:ECDHE-RSA-AES256-SHA384:ECDHE-ECDSA-AES256-SHA384:ECDHE-RSA-AES256-SHA:ECDHE-ECDSA-AES256-SHA:DHE-RSA-AES128-SHA256:DHE-RSA-AES128-SHA:DHE-DSS-AES128-SHA256:DHE-RSA-AES256-SHA256:DHE-DSS-AES256-SHA:DHE-RSA-AES256-SHA:AES128-GCM-SHA256:AES256-GCM-SHA384:AES128-SHA256:AES256-SHA256:AES128-SHA:AES256-SHA:AES:CAMELLIA:DES-CBC3-SHA:!aNULL:!eNULL:!EXPORT:!DES:!RC4:!MD5:!PSK:!aECDH:!EDH-DSS-DES-CBC3-SHA:!EDH-RSA-DES-CBC3-SHA:!KRB5-DES-CBC3-SHA
  SSLCertificateFile /etc/certs/lyco.reco.crt
  SSLCertificateKeyFile /etc/private/lyco.reco.key

  RewriteEngine On
  RewriteCond %{HTTP:Upgrade} websocket [NC]
  RewriteCond %{REQUEST_URI} ^/socket.io           [NC]
  RewriteCond %{QUERY_STRING} transport=websocket   [NC]
  RewriteRule /(.*) ws://localhost:3000/$1 [P,L]

  ProxyPass / http://localhost:3000/
  ProxyPassReverse / http://localhost:3000/

</VirtualHost>

設定ファイル有効化

sudo a2ensite growi

設定ファイル反映

sudo apache2ctl configtest
 # → syntax OK を確認します
sudo systemctl restart apache2.service

設定後、

「http://[ドメイン]」

にアクセスすることで

  • https通信へのリダイレクト
  • 指定したディレクトリにアクセスログが流れること

を確認しました。

Mod Securityが検知したIPアドレスの抜き出し。

やりたいこと

Mod Securityを導入してから、不正アクセスがerror.logに現れるようになりました。
そのアドレスをネガティブリストに放り込むことで後続のアクセスをブロックする方法は設定しました。

そこで、

  • 日ごとにerror.logで検知したログを確認し
  • IPアドレスのみを抜き出してリスト化する

設定を行います。

環境

  • Ubuntu 20.04(Linux Mint)
  • Apache 2.4
  • Mod Security

※ログは/var/lib/redmine/log に格納されています。

手順

一般ユーザで実施します。

参考:

https://linux.just4fun.biz/?%E9%80%86%E5%BC%95%E3%81%8DUNIX%E3%82%B3%E3%83%9E%E3%83%B3%E3%83%89/%E3%83%86%E3%82%AD%E3%82%B9%E3%83%88%E3%83%95%E3%82%A1%E3%82%A4%E3%83%AB%E3%81%8B%E3%82%89IP%E3%82%A2%E3%83%89%E3%83%AC%E3%82%B9%E3%81%AE%E3%81%BF%E6%8A%BD%E5%87%BA%E3%81%99%E3%82%8B

apacheのerror.logからIPアドレスを抜き出します。

cd /var/lib/redmine/log
cat error.log | awk 'match($0,/[0-9]+\.[0-9]+\.[0-9]+\.[0-9]+/) { print  substr($0, RSTART, RLENGTH) }'
# IPアドレスのみ表示されることを確認。

IPアドレスを並べ替え、重複を除外します。

cd /var/lib/redmine/log
cat error.log | awk 'match($0,/[0-9]+\.[0-9]+\.[0-9]+\.[0-9]+/) { print  substr($0, RSTART, RLENGTH) }' | sort | uniq
# 一意のアドレスのみが表示されることを確認。

自動実行するスクリプトを作成します。

cd /hoge/
vi negativelist.sh
スクリプト内容
#!/bin/sh

SHELL=/bin/sh
PATH=/usr/local/sbin:/usr/local/bin:/sbin:/bin:/usr/sbin:/usr/bin

cd /var/lib/redmine/log
cat error.log | awk 'match($0,/[0-9]+\.[0-9]+\.[0-9]+\.[0-9]+/) { print  substr($0, RSTART, RLENGTH) }' | sort | uniq > /var/lib/redmine/log/suspicious_ip.`date +%Y%m%d`

スクリプトに実行権限を付与します。

chmod +x negativelist.sh

日ごとに実行されるように設定します。

sudo su -
crontab -u www-data -e
# redmineのログプラグインで閲覧できるよう、apache実行ユーザのcronを編集します
cron内容
0 8 * * * /hoge/negativelist.sh

これで、「Mod Securityが不正アクセスと見なしたIPアドレスを日ごとに抜き出す」仕組みが整いました。

(シェルスクリプトで指定したディレクトリ内に、suspicious_ip.yyyymmdd というファイルが作成されます。
 また、/var/lib/redmine/log 配下に置くことで、redmineのログプラグインで表示することができます。)

直接ネガティブリストに追記しないのは、偽陽性で自分自身がブロックされるのを防ぐためです。

Page 1 of 2

Powered by WordPress & Theme by Anders Norén