タグ: Ubuntu Page 11 of 14

redmine: knowledgeプラグインの画像アップロード時のエラーを解消。

半年ぐらいの問題が解決しました。

環境

  • redmine 4.2.4
  • Linux Mint 20.03
  • Apache 2.4.54
  • mysql 8.0.31
  • redmine_knowledgebase 4.1.1
  • ruby 2.70-p0
  • redmineディレクトリ /var/lib/redmine
  • redmineログディレクトリ /var/log/redmine

事象:

  1. knowledgebaseプラグインを用いて記事を発行します。
  2. 画像をアップロードします。
  3. 「作成」をクリックすると 500 internal server errorになります。

エラーになるものの、元のページに戻ると記事は作成されているため割と放置していました。

とはいえ、記事を発行するたびにエラーが発生するのはストレスフル。今回、その事象を解決までこぎ着けます。

調査

production.logを発行します。

tail -f /var/log/redmine/production.log

上記ログを流しながら、現象を再現させます。

その結果、以下のログに突き当たりました。

Completed 500 Internal Server Error in 1091ms (ActiveRecord: 869.6ms)

ActionView::Template::Error (undefined method `thumbnail_path' for #<#<Class:0x0000564f87f6a428>:0x0000564f87600360>
Did you mean?  thumbnail_tag
               thumbnail_url):
    1: <h1><%= l(:label_new_article) %>: <%= link_to(h(@article.title), @article_url) %>
    2: (<%=h @article.category.title %>)</h1>
    3: 
    4: <% if thumb = get_article_thumbnail_url_absolute( @article ) %>
    5:   <p><img src="<%= thumb %>" alt="[Thumbnail]"></p>
    6: <% end %>
    7: 

このエラーで検索したところ、そのものズバリの記事が書かれています。

https://github.com/alexbevi/redmine_knowledgebase/pull/394/commits/fe9d5952058649d457cec8118f50e4ee14690b40

これを元に解決させていきます。

手順

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

ディレクトリに移動します。

cd /var/lib/redmine/plugins/redmine_knowledgebase/app/helpers

修正するファイルのバックアップを取ります。

cp -pi /var/lib/redmine/plugins/redmine_knowledgebase/app/helpers/knowledgebase_helper.rb /hoge/knowledgebase_helper.rb.org

差分の通りファイルを修正します。

vi /var/lib/redmine/plugins/redmine_knowledgebase/app/helpers/knowledgebase_helper.rb
ファイル差分

(上述したバージョンであれば184行目)

     thumb = get_article_thumbnail( article )

     if thumb
-      return "#{Setting.protocol}://#{Setting.host_name}#{thumbnail_path(thumb)}"
+      return polymorphic_url(thumb, :host => Setting.host_name, :protocol => Setting.protocol)
     else
       return ''
     end

修正したファイルを反映させます。

cd /var/lib/redmine
bundle exec rake redmine:plugins:migrate RAILS_ENV=production
systemctl restart apache2.service

対応後の修正を確認

  1. knowledgebaseプラグインを用いて記事を発行します。
  2. 画像をアップロードします。
  3. 「作成」をクリックしてもエラーが発生しないことを確認します。

Nectcloud recognizeアプリ導入後のOPcacheの設定。

発生した事象

Nextcloudにアップロードされた画像をタグ付けしてくれる「recognize」アプリを使っています。

それを用いて運用したところ、以下のエラーに出くわしました。

発生画面

メニュー > Administration settings > 概要

  • PHP OPcacheモジュールが正しく設定されていません。詳細はドキュメントを参照してください。
    • 「OPcacheのインターン文字列バッファーがまもなく一杯になります。全てのスクリプトをキャッシュに保管できるようにするには、opcahe,interned_strings_bufferの値を8より多い値で、PHP設定に適用することを推奨します。

これを放置していったところ、Webサービスが止まり、SSHにも接続できなくなりました。そのため、以下の対処を施しました。

前提:環境

以下の環境で動いています。

  • Ubuntu 20.04
  • Apache 2.4.54
  • PHP 7.4.32

※snapは使わず、オンプレで構築しました。

また、Opcacheモジュールは設定済みです。

対処

以下、管理者権限で実施しています。

mkdir /etc/old
cd /etc/php/7.4/mods-available
cp -pi opcache.ini /etc/old/opcache.ini.`date +%Y%m%d`
vi opcache.ini
設定内容
opcache.interned_strings_buffer=16
; 8 → 16に修正

設定反映

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

反映確認

メニュー > Administration settings > 概要

へと進みます。

「全てのチェックに合格しました。」

を確認します。

余談:recognizeアプリの注意点

万単位のファイルを既にインポートしたため、画像認識とタグ付けのためにかなりのCPUリソースを消費します。(平均オーバーロードが7を超えるときもありました)
そのため、zabbix等で負荷を監視している場合は認識中は閾値を上げておく等の対処が必要です。

Ubuntu 20.04にNextcloudをインストール。

Dropboxのようにファイルを保存できて、各種アプリ(プラグイン)で様々な機能を拡張できるOSS、Nextcloudをインストールしました。

このエントリーで行うこと

  1. nextcloud用のphpモジュールを入れる
  2. nextcloudに即したデータベースを入れる
  3. apache設定ファイルを作成する
  4. 設定反映を行い、初期画面を出す。

インストールしたハードウェア

この、2台目のChuwi Herobox Proです。redmineのデータ同期サーバのデータをマウントするために選びました。

前提

以下が導入済みです。

  • Ubuntu 20.04
  • Apache 2.4 (2.4.41)
  • mysql 80 (8.0.30)
  • php 7.4 (7.4.32)
  • nextcloud用のドメインを設定していること
  • サーバ証明書 (Let's Encryptワイルドカードを用いました)

手順

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

phpの追加モジュールをインストールします。

sudo 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

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

mysql -u root -p
CREATE USER 'nextcloud'@'localhost' IDENTIFIED BY 'パスワード';
CREATE DATABASE IF NOT EXISTS nextcloud CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci;
GRANT ALL PRIVILEGES ON nextcloud.* TO 'nextcloud'@'localhost';
FLUSH PRIVILEGES;

ファイルをダウンロードして配置します。

導入したサーバは/homeディレクトリを別SSDにマウントしているため、以下のようにしました。

wget https://download.nextcloud.com/server/releases/latest.zip
unzip latest.zip /home/www-data
chown -R www-data:www-data /home/www-data/nextcloud

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

mkdir /var/log/apache2/nextcloud
chown -R www-data:www-data /var/log/apache2/nextcloud
vi /etc/apache2/sites-available/nextcloud.conf

設定ファイルの内容

<VirtualHost _default_:80>
 ServerName [公開するドメイン名]
 RewriteEngine On
        RewriteCond %{HTTPS} off
        RewriteRule ^(.*)$ https://%{HTTP_HOST}%{REQUEST_URI} [R=301,L]
 CustomLog /var/log/apache2/nextcloud/access.log combined
 ErrorLog /var/log/apache2/nextcloud/error.log
</VirtualHost>

<VirtualHost _default_:443>
 ServerName [公開するドメイン名]
 CustomLog /var/log/apache2/nextcloud/ssl_access.log combined
 ErrorLog /var/log/apache2/nextcloud/ssl_error.log
  SSLEngine on
  Header always set Strict-Transport-Security "max-age=15552000; includeSubDomains"
    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/ssl.crt
    # 証明書のファイルパス
    SSLCertificateKeyFile /etc/private/ssl.key
    # 秘密鍵のファイルパス

    DocumentRoot /home/www-data/nextcloud
    <Directory /home/www-data/nextcloud>
        Options Indexes FollowSymLinks MultiViews
        AllowOverride All
        Require all granted
    </Directory>

</VirtualHost>

設定を反映します。

a2ensite nextcloud.conf
apache2ctl configtest
# Syntax ok を確認します
systemctl restart apache2

起動確認

ブラウザから設定したドメインにアクセスします。

アクセス後、ガイドに従い

  • 管理者アカウント
  • パスワード
  • データベース情報

を設定後、以下の画面が出てくれば成功です。

Ubuntuサーバで再起動が必要かを判断するコマンド。

apt(aptitude)でパッケージをインストール後、以下の判断に迷うことがあります。

  • サーバの再起動は必要なのか
  • サービスを再起動させる必要があるのか

これらをチェックするコマンドがありました。

コマンドインストール

sudo aptitude install debian-goodies update-notifier-common

再起動判断基準

カーネルなどのアップデートがされて、システム全体の再起動が必要な場合、以下のファイルが作成されます。

/var/run/reboot-required

cat /var/run/reboot-required
*** System restart required ***

また、サービスの再起動が必要な場合は、次のコマンドを実行してその判断が可能です。

sudo checkrestart

Found 27 processes using old versions of upgraded files
(14 distinct programs)
(10 distinct packages)

Of these, 9 seem to contain systemd service definitions or init scripts which can be used to restart them.
The following packages seem to have definitions that could be used
to restart their services:
accountsservice:
        441     /usr/lib/accountsservice/accounts-daemon
networkd-dispatcher:
        470     /usr/bin/networkd-dispatcher
policykit-1:
        471     /usr/lib/policykit-1/polkitd
rsyslog:
        473     /usr/sbin/rsyslogd
modemmanager:
        511     /usr/sbin/ModemManager
unattended-upgrades:
        567     /usr/share/unattended-upgrades/unattended-upgrade-shutdown
openssh-server:
        683     /usr/sbin/sshd
        246134  /usr/sbin/sshd
        246245  /usr/sbin/sshd
apache2-bin:
        15285   /usr/sbin/apache2
        238252  /usr/sbin/apache2
        238253  /usr/sbin/apache2
        238254  /usr/sbin/apache2
        238255  /usr/sbin/apache2
        238258  /usr/sbin/apache2
        238559  /usr/sbin/apache2
        238902  /usr/sbin/apache2
        244571  /usr/sbin/apache2
        244580  /usr/sbin/apache2
packagekit:
        246707  /usr/lib/packagekit/packagekitd

These are the systemd services:
systemctl restart accounts-daemon.service
systemctl restart networkd-dispatcher.service
systemctl restart polkit.service
systemctl restart ModemManager.service
systemctl restart packagekit-offline-update.service
systemctl restart packagekit.service

These are the initd scripts:
service rsyslog restart
service unattended-upgrades restart
service ssh restart
service apache2 restart

These processes (1) do not seem to have an associated init script to restart them:
passenger:
        238230  /usr/lib/passenger/support-binaries/PassengerAgent
        238235  /usr/lib/passenger/support-binaries/PassengerAgent

上記で再起動の必要性があったのでシステム全体を再起動。

sudo checkrestart
# Found 0 processes using old versions of upgraded filesと表示されること
cat /var/run/reboot-required
# ファイルがないこと

を確認し、システムを最新の状態に保ちました。

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+を取り戻しました。

Ubuntu系Linuxの最初の設定。

検証にしろなんにしろ、最初に行っている作業のメモ書きです。

サーバ名をドメイン込みで再設定

hostnamectl set-hostname [サーバ名]
uname -n
# 指定したサーバ名が表示されることを確認

Ubuntu系Linuxは、ドメイン込みでサーバ名を登録してもフルネームで登録されません。ここで最初にサーバ名を確定させます。

~/.bashrc末尾に以下を追記

PS1="[\u@\H \W]\\$ "
HISTSIZE=50000

→ これにより、ユーザ名とホスト名のフルネームがプロンプトに表示されます。また、コマンド「history」で記憶させる上限を増やします。

/etc/bash.bachrcに以下を追記

export HISTTIMEFORMAT='%y/%m/%d %H:%M:%S '

→ これはほぼ必須です。コマンド「history」を実行したときの日時を指定することでその後の証跡が追いやすくなります。

Linux Mint 21にRedmine 5.0をインストール。

2022/09/03 時点のLinux Mintの最新版21に、やはり最新版のRedmine 5.0のインストールを行えるかを検証しました。

以下、うまくいったときの手順です。

前提

  • OSの初期設定のみが完了しています。
  • また、Webでよく見られる「mysql_secure_installation」は普通に行ったら躓くので、その対応も行っています。

手順

  • 全て管理者権限で実施します。
  • 検証なのでhttps通信などは考慮しません。

apacheリポジトリの追加(脆弱性対応)

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

基本パッケージのインストール

aptitude update
aptitude install build-essential zlib1g-dev libssl-dev libreadline-dev libyaml-dev libcurl4-openssl-dev libffi-dev mysql-server mysql-client apache2 apache2-dev libapr1-dev libaprutil1-dev imagemagick libmagick++-dev fonts-takao-pgothic subversion git ruby libruby ruby-dev libmysqlclient-dev

passengerのインストール

aptitude install libapache2-mod-passenger
systemctl restart apache2.service

gemで必要なライブラリをインストール

gem install bundler racc mysql2 strscan
# redmine5.0の場合、stscanも必要でした

mysql初期パスワード設定

参考 https://level69.net/archives/28557
vi /etc/mysql/mysql.conf.d/mysqld.cnf
追記内容
# 末尾に以下を追加
default_authentication_plugin=mysql_native_password

設定後にmysqlサービス再起動

systemctl restart mysql

MySQL rootパスワード設定

mysql -u root -p
# 未設定のためパスワードは不要です
ALTER USER 'root'@'localhost' IDENTIFIED WITH mysql_native_password BY 'パスワード';
#パスワードは任意のものを入力ください
flush privileges;
exit

mysql初期設定

mysql_secure_installation
初期設定内容
Enter password for user root: 
# 上記で設定したパスワードを入力します

VALIDATE PASSWORD COMPONENT can be used to test passwords
and improve security. It checks the strength of password
and allows the users to set only those passwords which are
secure enough. Would you like to setup VALIDATE PASSWORD component?

Press y|Y for Yes, any other key for No: 
# Yを入力してEnter

There are three levels of password validation policy:

LOW    Length >= 8
MEDIUM Length >= 8, numeric, mixed case, and special characters
STRONG Length >= 8, numeric, mixed case, special characters and dictionary                  file

Please enter 0 = LOW, 1 = MEDIUM and 2 = STRONG:
# ポリシーに合わせて0/1/2を入力(ローカル環境のため0としました)

Estimated strength of the password: 50 
Change the password for root ? ((Press y|Y for Yes, any other key for No) : 
# 既に設定しているのでn

By default, a MySQL installation has an anonymous user,
allowing anyone to log into MySQL without having to have
a user account created for them. This is intended only for
testing, and to make the installation go a bit smoother.
You should remove them before moving into a production
environment.

Remove anonymous users? (Press y|Y for Yes, any other key for No) : 
# anonymousユーザーを削除するためY

Normally, root should only be allowed to connect from
'localhost'. This ensures that someone cannot guess at
the root password from the network.

Disallow root login remotely? (Press y|Y for Yes, any other key for No) : 
# rootユーザのリモートログインを禁止するためY

Remove test database and access to it? (Press y|Y for Yes, any other key for No) : 
# テストDBを削除するためY

Reload privilege tables now? (Press y|Y for Yes, any other key for No) : 
# 設定を反映するためy

MySQLでredmine用のユーザーを作成

mysql -uroot -p
# 上記で設定したパスワードを入力します
CREATE DATABASE redmine character set utf8mb4;
CREATE USER 'redmine'@'localhost' IDENTIFIED BY 'パスワード';
# 任意のパスワードを設定
GRANT ALL ON redmine.* TO 'redmine'@'localhost';
flush privileges;
exit

redmineを取得

mkdir /var/lib/redmine
chown www-data:www-data /var/lib/redmine
sudo -u www-data svn co https://svn.redmine.org/redmine/branches/5.0-stable /var/lib/redmine
database.yml編集
cp -pi /var/lib/redmine/config/database.yml.example /var/lib/redmine/config/database.yml
vi /var/lib/redmine/config/database.yml
編集する箇所(production)を以下のように編集
production:
  adapter: mysql2
  database: redmine
  host: localhost
  username: redmine
  password: "redmine用のパスワード"
  encoding: utf8mb4

bundleによるDBマイグレーション

cd /var/lib/redmine
sudo -u www-data bundle install --without development test --path vendor/bundle
sudo -u www-data bundle exec rake generate_secret_token
sudo -u www-data RAILS_ENV=production bundle exec rake db:migrate
sudo -u www-data RAILS_ENV=production REDMINE_LANG=ja bundle exec rake redmine:load_default_data

apacheの設定ファイルを作成

cd /etc/apache2/sites-available
vi redmine.conf
設定内容(動作確認のため、以下のものだけ)
<VirtualHost *:80>
    RailsEnv production
    DocumentRoot /var/lib/redmine/public

    <Directory "/var/lib/redmine/public">
            Allow from all
            Require all granted
    </Directory>
</VirtualHost>

上記で作成したredmine.confを有効化

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

この後、ブラウザにIPアドレス/ホスト名を入力してredmineの画面が出ることを確認しました。

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 

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

Lightsail上で稼働するSnipe-ITの後処理。(含むMod_Security連携)

ローカル環境からインターネット環境へと移行した資産構成ツールSnipe-IT。これの後処理を行います。

既存の問題に対処

画像をアップロードしても、このように

“Failed to load image”と出て表示されませんでした。

https://github.com/snipe/snipe-it/issues/8701

そのものズバリのissueを発見。

.envファイルのAPP_URLを「httpから始まるドメイン」に変更してapache再起動にて治りました。

APP_URL=http://ドメイン

常時SSL化とMod_Security連携

そして、同じサーバのredmineにMod_Securityが稼働しているので、こちらも利用しない手はありません。

前提:

こちらの通り、

  • Mod_Security有効化
  • 検知したIPアドレスの抜き出ししてブロックできるようにする

処理を事前に施しています。

confファイル修正

sudo vi /etc/apache2/sites-available/snipeit-le-ssl.conf
confファイル内容
<VirtualHost _default_:80>
ServerName ドメイン名
 RewriteEngine On
        RewriteCond %{HTTPS} off
        RewriteRule ^(.*)$ https://%{HTTP_HOST}%{REQUEST_URI} [R=301,L]
# 強制的にhttps通信に飛ばします
</VirtualHost>

<VirtualHost *:443>
    ServerName ドメイン名
    CustomLog /var/log/redmine/asset_access.log combined
    ErrorLog /var/log/redmine/asset_error.log
 # redmineのログプラグインで参照できるようにしています

# 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
## 念の為、redmineで偽陽性となったフィルタをそのまま除外するようにしています
    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'"
# エラーログを検知した際に検出した不審なIPアドレスを全てブロックする設定です

    DocumentRoot /var/www/html/snipe-it/public
    <Directory /var/www/html/snipe-it/public>
        Options Indexes FollowSymLinks MultiViews
        AllowOverride All
        Require all granted
    </Directory>

  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
SSLHonorCipherOrder On 
SSLOptions +StrictRequire
Header set Strict-Transport-Security: "max-age=31536000; includeSubDomains; preload"

SSLCertificateFile /etc/letsencrypt/live/Let's Encryptで指定したドメイン/fullchain.pem
SSLCertificateKeyFile /etc/letsencrypt/live/Let's Encryptで指定したドメイン/privkey.pem

</VirtualHost>

conf反映

sudo a2dissite snipeit.conf
# 最初に設定していたhttp通信のみのconfを無効化します
sudo apache2ctl configtest
# Syntax OKを確認します
sudo systemctl restart apache2

sudo chown www-data:www-data /var/lib/redmine/log/asset*
# redmineのログプラグインが参照できるよう、上記設定したログの所有者を変更します

これにより、常時SSL通信を行いつつ、不正アクセスの脅威をある程度守ることができます。

共存環境。(AWS LightsailにredmineとSnipe-ITを追加)

こちらの資産管理システムSnipe-IT、使っていけば行くほど「これは出先からでも参照したい」と実感。

なので、既にredmineが稼働しているインスタンスに同居させました。

詳細手順は以下のとおりです。

前提

以下の環境で稼働しています。

  • Ubuntu 20.04
  • Apache 2.4
  • Ruby 2.7
  • MySQL 8系

下準備

  • 既に稼働しているインスタンスとDNSに、サブドメインを指定します。
  • そのサブドメインは既に稼働しているインスタンスのIPと紐づけます。

PHPとモジュールを追加します。

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

sudo apt install php7.4
# バージョンを明示しないと、このあとのモジュールとの兼ね合いで失敗しました

sudo 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}
# Web上のマニュアルのとおりに指定しましたが、インストール時に「xml」を入れるよう指示がありました

sudo systemctl restart apache2

Snipe-IT用のDBを設定します。

sudo mysql -u root -p
CREATE DATABASE snipeit_db;
CREATE USER  'snipeit'@'localhost' IDENTIFIED WITH mysql_native_password BY 'パスワード';
GRANT ALL PRIVILEGES ON snipeit_db.* TO 'snipeit'@'localhost' with grant option;
FLUSH PRIVILEGES;
exit

Snipe-ITをダウンロードします。

cd /var/www/html
sudo git clone https://github.com/snipe/snipe-it snipe-it
cd /var/www/html/snipe-it

Snipe-ITの基本設定を行います。

sudo cp -pi .env.example .env
sudo vi .env
設定ファイル内容
APP_URL=設定したURL
APP_TIMEZONE='Asia/Tokyo'
DB_CONNECTION=mysql
DB_HOST=localhost # 127.0.0.1だと接続できないことがありました
DB_DATABASE=snipeit_db
DB_USERNAME=snipeit
DB_PASSWORD=パスワード
DB_PREFIX=null
DB_DUMP_PATH='/usr/bin'
DB_CHARSET=utf8mb4
DB_COLLATION=utf8mb4_unicode_ci

(オプション)Gmailと連携をさせます。

先程の.envの以下の箇所を編集します。

# --------------------------------------------
# REQUIRED: OUTGOING MAIL SERVER SETTINGS
# --------------------------------------------
MAIL_DRIVER=smtp
MAIL_HOST=smtp.gmail.com
MAIL_PORT=587
MAIL_USERNAME=Gmailアドレス
MAIL_PASSWORD='Gmailのアプリパスワード'
MAIL_ENCRYPTION=tls
MAIL_FROM_ADDR=Gmailアドレス
MAIL_FROM_NAME='Snipe-IT'
MAIL_REPLYTO_ADDR=Gmailアドレス
MAIL_REPLYTO_NAME='Snipe-IT'
MAIL_AUTO_EMBED_METHOD='attachment'

Composerのインストールを行います。

sudo su -
curl -sS https://getcomposer.org/installer | php
mv composer.phar /usr/local/bin/composer
cd /var/www/html/snipe-it/
exit
sudo composer update --no-plugins --no-scripts
sudo composer install --no-dev --prefer-source --no-plugins --no-scripts
sudo php artisan key:generate
sudo chown -R www-data:www-data /var/www/html/snipe-it
sudo chmod -R 755 /var/www/html/snipe-it

Snipe-ITのバーチャルサイトを設定します。

cd /etc/apache2/sites-available
vi snipe-it.conf
snipe-it.conf内容
<VirtualHost *:80>
    ServerName 前準備で設定したドメイン
    DocumentRoot /var/www/html/snipe-it/public
    <Directory /var/www/html/snipe-it/public>
        Options Indexes FollowSymLinks MultiViews
        AllowOverride All
        Require all granted
    </Directory>
</VirtualHost>

設定を反映します。

a2ensite snipe-it.conf
apache2ctl configtest
# Syntax OKを確認
systemctl restart apache2

設定後、前準備で指定したURLにアクセスします。

  • プレフライトチェックが走れば問題ありません。
  • let's encryptが設定済みの場合は、最初にこのドメイン用のcertbotを設定します。

これで、Lightsailに2つのWebサービスを稼働させることができました。

Page 11 of 14

Powered by WordPress & Theme by Anders Norén