タグ: redmine Page 1 of 5

検証: redmine 4.2のデータを別サーバに完全移行。

以前書いた

の、うち、「バックアップしたデータを新しいサーバに移設する」が成功したので、その備忘録になります。

やったこと

現行で稼働しているredmineサーバを、新規LinuxMintサーバにデータを流し込み、復元させた。

以降元と移行先サーバ

共にLinux Mint20.03が稼働しています。

手順

基本的に管理者権限で行っていますが、ユーザーで行う場合はそれを追記します。

移行先で行う作業-redmine構築-

新規にRedmine 4.2を作ります。最初に作成するときにもお世話になった

こちらを用いましたが、以下、異なる部分があります。

Apacheのバージョンを脆弱性対応版に上げる
mysql_secure_installationが正常に動かない問題に対処する
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

後は参考サイトの手順に沿ってredmine4.2を起動させます。 このとき、database.ymlやconfiguration.ymlは以降元に合わせます。また、rubyのバージョンは2.7系にしています。

移行元で行う作業-redmineバックアップと転送-

DBのバックアップ

※こちらは通常ユーザで実行しました。

mysqldump redmine(DB名) --no-tablespaces -u redmine(DBユーザ) -p > redmine_backup

を実行し、DB全体のバックアップを取ります。

redmineデータのバックアップ

ここからは管理者権限で実施します。

cd /var/lib/redmine
# インストールされているredmineディレクトリに移動

このうち、

  • /redmine/files
  • /redmine/plugins
  • /redmin/public/thems

の3ディレクトリが移行先に流し込むデータとなります。

  • rsyncやscpを用いてのデータ転送
  • 一度圧縮して転送

など、任意のものを用います。

移行先で行う作業-redmineデータのリストア-

上段で述べた

  • files
  • plugins
  • public/themes

を、移行元と同じように配置します。このとき、ディレクトリやファイルの所有権が元と同じ(通例はwww-data)になるようにします。

そして、sqldumpで取得したDBも移行先に持っていきます。

プラグインのマイグレーション

cd /var/lib/redmine
bundle exec rake redmine:plugins:migrate RAILS_ENV=production

DBのリストア

 mysql -u redmine -p redmine < redmine_backup

を実施後、

systemctl restart apache2.service

を行うことで

以降元、移行先、共に

  • 同じテーマ
  • 同じプラグイン
  • 同じ添付ファイル

が見えることを確認しました。

前回、ちょっとしたDBのリストアを行いましたが、プラグインや添付ファイルを含めた完全な移行テストは初めて。

これで、もしもの時のためのリストア手順が整いました。

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の画面が出ることを確認しました。

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通信を行いつつ、不正アクセスの脅威をある程度守ることができます。

ThunderbirdとRedmine連携。

メールを元にredmineのチケットを書き起こすパターンが割と発生します。

そんなときに役立つメールクライアント側のプラグインを見つけました。一部動かない機能がありますが、「受信したメールをそのままチケットに起こせる」のはとても便利です。

設定

Redmine側の設定

  1. 管理者権限でログインします。
  2. 管理>設定>APIから以下を有効にしておきます。
    • RESTによるWebサービスを有効にする
    • JSONPを有効にする

APIキーの確認

  1. Redmine > 個人設定 を開きます。
  2. APIアクセスキー > 表示から、出てきた英数字を確認します。

Thunderbirdのアドオンインストール

  1. アドオンマネージャーを開きます。
  2. 「redmine」で検索します。
  3. RedThunderMineBird Plusをインストール後、Thunderbirdを再起動します。

アドオン設定

Thunderbirdのアドオンマネージャー>拡張機能から設定画面を開きます。(スパナアイコン)

アカウントごとのRedmine > 自分のアカウントのラジオボタンをクリックします。

以下を入力して保存します。

  • Redmine URL (自分のRedmineのURL)
  • REST APIキー (先ほど確認したアクセスキー)

また、redmineのテキスト書式を「Markdown」にしている場合は、「説明のテンプレート」の「<pre>」を「```」に変えておきます。

設定確認

メールのプレビューに「Redmine」と出るのを確認します。

「件名と本文でWeb画面を開く」をクリックします。

Redmineが開き、チケット発行画面にメールの件名と本文が流し込まれていることを確認します。

動作未確認の機能

  • 「チケットを作成」「チケットを更新」などがうまく動きません。(設定か、バージョン違いかは不明)

ローカルredmineのSSL更新。

ローカルドメインでもSSL通信を可能にするmkcerts。それだけに有効期限は3ヶ月程度。

それを更新した時の手順です。

前提

こちらのようにSSL化しています。

また、mkcertsは以下の手順でインストールしています。

手順

mkcertsでの証明書更新

mkcert -key-file corn.wall.key.202208 -cert-file corn.wall.crt.202208 corn.wall penzance.corn.wall "*.corn.wall" 
openssl x509 -text -noout -in ./corn.wall.crt.202208 |grep DNS
# DNS:corn.wall, DNS:penzance.corn.wall, DNS:*.corn.wall と、入力したDNS名があることを確認します

こうしてできた証明書と秘密鍵を任意の方法でredmineサーバに転送します。

転送先:

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

redmineサーバでの更新

証明書の入れ替え

cd /etc/certs/
# apacheの設定ファイルで証明書を格納した場所
unlink corn.wall.crt
ln -s corn.wall.crt.202208  corn.wall.crt

秘密鍵の入れ替え

cd /etc/private/
# apacheの設定ファイルで秘密鍵を格納した場所
unlink corn.wall.key
ln -s corn.wall.key.202208  corn.wall.key

設定反映

apache2ctl configtest
# SyntaxOKを確認
systemctl restart apache2

前提で設定したとおり、apacheの設定ファイルはシンボリックリンクの証明書を参照するようにしています。

したがって、証明書更新の際にはリンクを張り替えるだけで更新ができるという次第です。

療養時の“ロギング”。

本来、別の用途で作っていたこれがはからずも役立ちました。

外部からつながるredmine

上述したredmine、

スケジュールの他に「プロジェクト」に分け、様々なことを記録。Webアクセスできる環境ならばメモができる仕組みを整えていたのが幸いしました。

記録

ここに、以下のようにして、今回の療養について記録をしています。

日毎のチケット

「2022/07/11の記録」といったようにチケットを発行し、

  • 体温測定の記録
  • 食べたもの
  • 体調/症状
  • その他特記事項

を記していくという次第。

これなら、後で検索を行えますし、症状の改善/悪化を追うことができます。

なにより、この「療養」も立派なプロジェクトの一つ。成功と完遂を祈るばかりです。

Mod SecurityによるIPアドレスブロック。(ネガティブリスト型)

攻撃の兆候

Mod Securityを導入して一昼夜――

公表していないURLであるにも関わらず、しっかりと攻撃の予兆がログに現れました。

※この方法で、サーバにアクセスすることなく、redmineへのログを一元管理しています。

この、不正アクセスの予兆を示したアクセス元を調べると

Torから来ている望ましくないものまであり、昨今の驚異を嫌でも感じずにいられません。

そこで、Apacheの設定ファイルではなくMod Securityの機能を用いてIPアドレスを遮断していきます。

参考:

Apache×Mod SecurityでカンタンWAF構築

https://qiita.com/m0nch1/items/ac7255399366fb113a82

環境

  • Ubuntu 20.o4 (Linux Mintでも同様)
  • Apache 2.4
  • Mod Security導入済み

手順

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

バーチャルファイル編集

vi /etc/apache2/sites-available/VIRTUALHOST.conf
# 使っているバーチャルファイルに読み替えます
追記内容
## Negativelist
SecRule REMOTE_ADDR "@pmFromFile negativelist.txt" "phase:1,id:2,deny,msg:'Negativelisted IP address'"

ネガティブリスト作成

vi /etc/etc/apache2/sites-available/negativelist.txt
ネガティブリストの内容
XXX.XXX.XXX.XXX
YYY.YYY.YYY.YYY
#ブロックしたいIPアドレスを記入していきます
# 設定確認のため、自分自身のアクセス元を記入しました

ネガティブリスト反映

cd /etc/apache2/site-enabled
ln -s ../sites-available/negativelist.txt negativelist.txt
# 設定ファイルの位置を明示していないのでシンボリックリンクを張ります

設定変更

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

設定確認

上記手順で、「自分自身をブロックする」設定を入れ、redmineにアクセスして「403」が返ってくることとエラーログにその旨が記録されていることを確認。(その後、このアドレスは削除しています)

今後の展望

  • 不正アクセスを検知したらそのIPアドレスを自動的に追記する
  • 数が増え続けるため、いっそのことポジティブリストに切り替える

などが必要になってきます。

Apache + redmine環境にMod Security導入。

インターネット環境に構築したredmineに不正アクセスが飛んでくるというエントリーを投稿したところ、

「Mod Security導入も一つの手」

というコメントをいただき、早速導入することにしました。

環境

  • Ubuntu 20.04 (Linux Mintでも動作確認済み)
  • Apache 2.4

参考

インストール方法

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

システム全体のアップグレード

aptitude update
aptitude upgrade

Ubuntu 20.04にMod Securityをインストールします。

aptitude install libapache2-mod-security2
systemctl restart apache2

ModSecurity 設定ファイル/ディレクトリをコピーしていきます。

cp -pi /etc/modsecurity/modsecurity.conf-recommended /etc/modsecurity/modsecurity.conf
cd /tmp
git clone https://github.com/SpiderLabs/owasp-modsecurity-crs.git
cd /owasp-modsecurity-crs
cp -pi crs-setup.conf.example /etc/modsecurity/crs-setup.conf
cp -pir rules/ /etc/modsecurity/

ModSecurityの設定を行います。

vi /etc/apache2/mods-available/security2.conf
設定ファイル内容
<IfModule security2_module>
   # Default Debian dir for modsecurity's persistent data
   SecDataDir /var/cache/modsecurity

   # Include all the *.conf files in /etc/modsecurity.
   # Keeping your local configuration in that directory
   # will allow for an easy upgrade of THIS file and
   # make your life easier
   IncludeOptional /etc/modsecurity/*.conf
   Include /etc/modsecurity/rules/*.conf
</IfModule>

設定反映

systemctl restart apache2

redmine設定ファイル修正

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

設定反映

systemctl restart apache2

設定確認

ブラウザから

http://your-site-domain/redmine/?modsecparam=test

にアクセスし、「Forbidden」が表示されることを確認します。

また、

  • チケットの更新ができること
  • ファイルのアップロードができること

をそれぞれ確認しました。

redmineにショートカット機能を追加 。(プラグインredmine_shotrcutsを導入)

概要

「ありそうでなかった」というよりも「導入後、これなしでは考えられない」レベルに達したいいプラグインを手に入れました。

タイトルにあるように、Redmineにキーボードショートカットを追加するプラグインです。

環境

  • LinuxMint 21.03
  • Redmine 4.2
  • Apache 2.4

手順

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

プラグイン配置

cd /var/lib/redmine/plugins
# 各自のplugin配置ディレクトリに読み替えてください
sudo -u www-data git clone https://github.com/davidegiacometti/redmine_shortcuts.git

設定反映

systemctl restart apache2

導入後の設定

特にありません。導入後、redmineのトップページに

Redmine shortcuts

と表示されます。こちらをクリックすると

と、ショートカットのサマリーが表示されます。

特に便利だと思ったのがMarkdown記述をするときのショートカット。

強調したい文章を囲み、「Ctrl + B」すると

自動的にMarkdownを補完してくれます。さながら、redmineが高機能エディタとして使えるわけです。

redmineプラグイン起因のエラー解消。(プラグインアンインストール)

概要

redmineはプラグインによる機能追加が最大の魅力。ですが、導入後、

  • バージョンが合わない
  • 他のプラグインとの相性
  • DBやOSの環境

により、画像のようなエラーが多々発生して全てのページが閲覧できない事象が発生します。

今回、それらを解消する方法をメモとして記載します。

手順

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

プラグインアンインストール

cd /var/lib/redmine/plugins
# 各自のplugin配置ディレクトリに読み替えてください
 bundle exec rake redmine:plugins:migrate NAME=[プラグイン名] VERSION=0 RAILS_ENV=production

プラグインのディレクトリ削除

cd /var/lib/redmine/plugins
# 各自のplugin配置ディレクトリに読み替えてください
rm -rf [プラグイン格納ディレクトリ]
systemctl restart apache2

アンインストール後の確認

redmineのトップページにアクセスし、上記のエラー画像がないことを確認します。

Page 1 of 5

Powered by WordPress & Theme by Anders Norén