Skip to main content

BookStack、本番環境用のサイト設定(Mod_Security連携)

概要

BookStackインストール の検証が済んだので、本番環境(筆者の場合はAWS Lightsail)で動かしていきます。

前提

  • 上記リンクの手順に従って、本番環境へのBookStackのインストールは完了しました。
  • 環境は以下の通りです。
    • Apache 2.4系
    • Mod_security 2系
  • 既にMod_Securityは稼働しています。
  • /etc/apache2/sites-enabled 配下に、ブロックしたいIPアドレスのリスト「negativelist.txt」があるものとします。

ここでやること

  • apacheの設定ファイルを本番環境に合わせます。
  • Mod_Securityを導入し、不審なアクセスをブロックします。
  • ネガティブリストを利用して、そこからのアクセスは排除します。
  • その反面、自分の環境からアクセスログに残しません。

ファイル修正

  • /etc/sites-available/bookstack.conf
<VirtualHost *:80>
    # ドメイン名を指定します
    servername hoge.example.com
    # HTTPアクセスを強制的にHTTPSにリダイレクトします
    RewriteEngine On
        RewriteCond %{HTTPS} off
        RewriteRule ^(.*)$ https://%{HTTP_HOST}%{REQUEST_URI} [R=301,L]
</VirtualHost>

<VirtualHost *:443>
    # ドメイン名を指定します
    ServerName hoge.example.com

    # ログ設定
    ErrorLog /var/log/bookstack/bs_error.log
    ## 以下のIPはアクセスログに記録させません
    ## 自分のアクセス元などを指定してください。(不要な場合はコメントイン)
    SetEnvIf Remote_Addr "aaa.bb.cc.ddd" dontlog
    CustomLog /var/log/bookstack/bs_access.log combined env=!dontlog

    # Mod_Security設定
    SecRuleEngine On
    ## ファイルのアップロードをできるようにします。
    SecRequestBodyInMemoryLimit 524288000
    SecRequestBodyLimit 524288000

    ## 偽陽性を排除
    ### 下記のIDを除外しないとForbiddenが出ました。
    ### 記述内容やアップロードするファイルなどが影響してForbiddenが出た場合はここに追加してください。
    SecRuleRemoveById 949110
    SecRuleRemoveById 980130

    ## テスト用の検知パラメーター
    SecRule ARGS:modsecparam "@contains test" "id:4321,deny,status:403,msg:'ModSecurity test rule has triggered'"

    ## ネガティブリストに入っているIPからのアクセスは全てブロックします。
    SecRule REMOTE_ADDR "@pmFromFile negativelist.txt" "phase:1,id:2,deny,msg:'Negativelisted IP address'"

    # ディレクトリ設定
    ## 本番環境では/var/lib/Bookstack配下に置いています
    DocumentRoot /var/lib/BookStack/public
    <Directory /var/lib/BookStack/public>
        AllowOverride All
        Require all granted
        Options +FollowSymLinks
        RewriteEngine On
        RewriteCond %{REQUEST_FILENAME} !-d
        RewriteCond %{REQUEST_FILENAME} !-f
        RewriteRule ^ index.php [L]
    </Directory>

  #SSL設定
  SSLEngine on
    Protocols h2 http/1.1
   # SSL証明書を指定します
   SSLCertificateFile /etc/certs/example.com.crt
   # 秘密鍵を指定します
   SSLCertificateKeyFile /etc/private/example.com.key
   # 中間証明書が発行元から別ファイルで提供されている場合は、この真下をコメントアウトして中間証明書を指定します
   # SSLCACertificateFile /etc/certs/example.com.CA.crt

    #セキュリティヘッダー付与
    Header always set Strict-Transport-Security "max-age=63072000"
    Header set X-Content-Type-Options "nosniff"
    Header always append X-Frame-Options "SAMEORIGIN"
    Header set X-XSS-Protection "1; mode=block"

</VirtualHost>

# SSL強化
SSLProtocol             all -SSLv3 -TLSv1 -TLSv1.1 -TLSv1.2
SSLCipherSuite          ECDHE-ECDSA-AES128-GCM-SHA256:ECDHE-RSA-AES128-GCM-SHA256:ECDHE-ECDSA-AES256-GCM-SHA384:EC6-GCM-SHA384
SSLHonorCipherOrder     off
SSLSessionTickets       off

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

設定後の反映

sudo a2ensite bookstack.conf

sudo apache2ctl configtest
# SyntaxOKを確認します

反映後の確認

  • ログインできることを確認
  • ページの保存/編集ができることを確認
  • 自分の環境からアクセスログが流れてこないことを確認