タグ: redmine Page 10 of 15

Redmineへの不正ログインをfail2banで制御する。

概要

インターネット環境にあるRedmineを不正ログインから防ぐため、不正ログイン対策パッケージfail2banと連携させました。

参考としたURL

https://www.redmine.org/projects/redmine/wiki/HowTo_Configure_Fail2ban_For_Redmine

環境

2023年1月現在、以下の環境で動かしています。

  • AWS Lightsailに立てているUbuntu20.04インスタンス

前提(導入済みパッケージ)

以下、既に導入済みです。

  • Redmine 4.2
  • fail2ban 0.11.1

本記事ではproduction.logの格納場所を

/var/log/redmine/production.log

としています。ご自身の環境に合わせてください。(通例は/var/lib/redmine/log の場合が多いです)

手順

さっくりとした手順

  1. fail2banの設定ファイルにredmine用の設定ファイルを作成します。
  2. jail.localファイルに上記設定ファイルを読み込ませます。(ファイルに追記します)
  3. fail2banサービスを再起動します。

稼働サービス(fail2ban)に修正を加えるので、必ずバックアップは取りましょう。

詳細手順

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

cat <<- __EOF__ | sudo tee -a /etc/fail2ban/filter.d/redmine.conf
# redmine configuration file
#
# Author: David Siewert
#
# $Revision$
#
[INCLUDES]

# Read common prefixes. If any customizations available -- read them from
# common.local
before = common.conf

[Definition]

datepattern = %%Y-%%m-%%d %%H:%%M:%%S %%Z$
failregex = Failed [-/\w]+ for .* from <HOST>

# Option:  ignoreregex
# Notes.:  regex to ignore. If this regex matches, the line is ignored.
# Values:  TEXT
#
ignoreregex =

# Source:
#http://www.fail2ban.org/wiki/index.php/MANUAL_0_8
__EOF__
作成確認
ls -l /etc/fail2ban/filter.d/redmine.conf
# rootユーザで上記ファイルが作成されていることを確認します。

jail.localファイルのバックアップを取ります。

sudo cp -pi /etc/fail2ban/jail.local /etc/old/jail.local.$(date +%Y%m%d)
# バックアップの格納ディレクトリは自分の環境に合わせます。

diff -u /etc/fail2ban/jail.local /etc/old/jail.local.$(date +%Y%m%d)
# バックアップ元とバックアップ先の差分が無いことでバックアップが取れていることを確認します。(何も返ってこなければ正常にバックアップできています)

jail.localファイルに追記を行います。

cat <<- __EOF__ | sudo tee -a /etc/fail2ban/jail.local

[redmine]
enabled  = true
filter   = redmine
port     = 80,443
#backend  = polling
# 動作がうまくいかない場合は上記「backend」をコメントアウトしてください。
action   = iptables-allports[name=redmine]
logpath  = /var/log/redmine/production.log
# production.logの格納位置です。ここは自分の環境に合わせます。
maxretry = 3
# ログイン試行に3回失敗した場合、アクセスを拒否します。
findtime = 86,400
# 1日アクセスを禁止します。
bantime  = 20
# ログイン試行の判定です
# トータルで「20秒の間、ログインに3回失敗したときに1日アクセスを禁止する」設定です
__EOF__

追記した内容の差分を確認します。

diff -u /etc/old/jail.local.$(date +%Y%m%d) /etc/fail2ban/jail.local
差分内容
+
+[redmine]
+enabled  = true
+filter   = redmine
+port     = 80,443
+#backend  = polling
+# 動作がうまくいかない場合は上記「backend」をコメントアウトしてください。
+action   = iptables-allports[name=redmine]
+logpath  = /var/log/redmine/production.log
+# production.logの格納位置です。ここは自分の環境に合わせます。
+maxretry = 3
+# ログイン試行に3回失敗した場合、アクセスを拒否します。
+findtime = 86,400
+# 判定失敗時、1日アクセスを禁止します。
+bantime  = 20
+# ログイン試行の判定です
+# トータルで「20秒の間、ログインに3回失敗したときに1日アクセスを禁止する」設定です。

設定ファイルの動作確認を行います。

まず、自分のredmineのログイン画面でわざとログインを失敗させます。

このとき、

cat /var/log/redmine/production.log |grep Failed
# production.logのパスは自分の環境に合わせます。

とすることで、

Failed login for 'ユーザ名' from IPアドレス at 2023-01-01 00:00:00 UTC

のように、失敗させたときのログが表示されます。

次に、

fail2ban-regex /var/log/redmine/production.log /etc/fail2ban/filter.d/redmine.conf
# production.logのパスは分の環境に合わせます。

を実行します。

Results
=======

Failregex: 1 total
|-  #) [# of hits] regular expression
|   1) [1] Failed [-/\w]+ for .* from <HOST>
`-

Ignoreregex: 0 total

Date template hits:
|- [# of hits] date format
|  [2] Year-Month-Day 24hour:Minute:Second Zone name$
`-

Lines: 4281 lines, 0 ignored, 1 matched, 4280 missed
[processed in 0.08 sec]

と、ログイン失敗時の行数分「X matched」と表示されます。これで、設定ファイルとログのパス設定に問題がないと確認が取れました。

設定を反映します。

sudo systemctl restart fail2ban.service

systemctl status fail2ban.service
#active (running)であることを確認します。

以上で、設定は完了です。

Redmineのチケットをダイレクトに編集するプラグインを追加。 (redmine_issue_dynamic_edit)

概要

Redmineのチケット、作成した後に細部を修正することは多々あると思います。
そういうとき、Jiraのように修正したい箇所をクリックするだけで修正できるプラグインを導入しました。

プラグイン名

redmine_issue_dynamic_edit

動作を確認した環境

Redmine 4.2

導入時

Gem追加:不要
DBマイグレーション:不要

手順

さっくりとした手順

  1. SSHログイン後、Redmineプラグインに移動
  2. gitでレポジトリをダウンロード
  3. Webサービス再起動

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

cd /var/lib/redmine/plugins
# 自分の環境に合わせます。

プラグインを配置します。

sudo -u www-data git clone https://github.com/Ilogeek/redmine_issue_dynamic_edit

ls -ld redmine_issue_dynamic_edit
# このディレクトリがあることを確認します

Webサービスを再起動します。

sudo systemctl restart apache2

動作

Redmineで任意のチケットを開きます。

エディットアイコンが出てくるのでそれをクリックします。

項目を編集し、チェックをクリックします。

修正内容が反映されています。

redmineのテーブルをタブ区切りで書くプラグイン導入。(redmine_tsv_macro)

これで、Redmineでの記事やチケットの作成作業が更に捗ります。

プラグイン概要

こういうエクセルファイルのテーブルをredmineのMarkdownに書き写す場合、TyporaやGrowiのテーブル機能を経由して変換する必要がありました。

これをほぼコピペだけで完結させるプラグインです。

参照URL

  • https://taikii.net/posts/2019/12/redmine-plugins-2019/
  • https://github.com/taikii/redmine_tsv_macro

手順

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

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

cd /var/lib/redmine/plugins
# 自分の環境に読み替えます

プラグインをインストールします。

sudo -u www-data git clone https://github.com/taikii/redmine_tsv_macro.git
# Webサービスを実行するユーザに合わせます(apache,nginxなど)

システムに反映させます。

systemctl restart apache2.service
# 自身の環境に合わせます

使い方

テーブルを作りたいところに{{tsv_h }}と入力し、その間にエクセルのブックをコピーしてペーストするだけです。

入力例

{{tsv_h
日付    曜日  天気  朝   朝:場所    昼   昼:場所    夜   夜:場所    備考
2023/1/1    日   晴れ  おせち 自宅  おせち 自宅  カレー 自宅  
2023/1/2    月   晴れ  明太釜玉うどん 自宅  クリームパスタ 自宅  餃子雑煮    自宅  
2023/1/3    火   晴れ  鳥オムレツ   自宅  ソーセージ定食 自宅  カツ丼 自宅  
2023/1/4    水   晴れ  ハンバーグ定食 自宅  春巻き弁当   自宅  雑煮  自宅  
2023/1/5    木   晴れ  ソーセージ定食 自宅  チャーシュー麺セット  ぎょうざの満洲 プラウンマサラ 自宅  
}}

出力結果

Excelのみならず、Googleスプレッドシート経由でも他のアプリを利用することなく、ブラウザ間のみでシートの貼り付けが可能になります。

また、{{tsv_h }}{{tsv }}とすることで、ヘッダを用いないテーブルが作成可能です。

注意点

  • ヘッダは空白行を作らないようにしてください。そうしないと全体のテーブルがずれます。
  • また、セルに改行があったり記号などでも崩れるようです。
  • 崩れないテーブルを作りたい場合は素直に他のツールを使います。

同一サーバ上で2つめのredmineを構築。

redmineはプロジェクトごとに機能の増減やアクセス権を増やせるものの、諸般の事情で「全く別のドメインで新たにredmineを構築する」必要がありました。

以下の手順でうまくいったので、メモとして残します。

環境

  • Ubunut 20.04 (AWS Lightsailインスタンス上)
  • 既に以下のredmineを立ち上げ済み
    • redmine 4.2
    • ruby 2.7
    • mysql 8.0.31

rubyのバージョンの関係で4.2系をインストールすることにします。また、既に動いている環境なのでapacheやmysqlの初期設定は行っていません。

立ち上げ手順

前提

  1. 新たなドメインを取得しているものとします。
  2. mysqlは同一サーバ上にあり、管理者権限を持っているものとします。
  3. この段階ではhttpsを行わないので、グローバル環境で実施する際は早急にSSL化を行ってください。
  4. また、筆者が使いたいプラグインの関係上、4.2をインストールします。

さっくりとした概要

次の内容を実施します。

  1. 新たなredmine用のデータベースを新規で作る。
  2. 現行とは別のディレクトリ上にredmineのプログラムを展開する。
  3. apacheのバーチャルホスト機能で新規redmineの機能を

注意事項

  • 現行のredmineをredmine.sample.com/redmine
  • 新しいredmineをredmine2.sample.com/redmine2

で稼働させます。

現行稼働している時に新しいものを立ち上げる場合は、現行環境のバックアップを取るなどの施策を行ってください。

以下、管理者権限で行います。

redmine用DB/ユーザ作成

mysql -uroot -p
CREATE DATABASE redmine2 character set utf8mb4;
CREATE USER 'redmine2'@'localhost' IDENTIFIED BY 'パスワード';
GRANT ALL ON redmine2.* TO 'redmine2'@'localhost';
flush privileges;
exit

redmine取得

ソースダウンロード

mkdir /var/lib/redmine2
chown -R www-data:www-data /var/lib/redmine2
sudo -u www-data svn co https://svn.redmine.org/redmine/branches/4.2-stable /var/lib/redmine2

configファイル編集

cp -pi /var/lib/redmine2/config/database.yml.example /var/lib/redmine2/config/database.yml
vi /var/lib/redmine2/config/database.yml
編集ファイル内容

productionの部分を以下のように変更します。

production:
  adapter: mysql2
  database: redmine2
  host: localhost
  username: redmine2
  password: "パスワード"
  encoding: utf8mb4

redmineインストール

cd /var/lib/redmine2
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

設定ファイル編集

vi /etc/apache2/sites-available/redmine2.conf
設定ファイル内容
<VirtualHost *:80>
  ServerName redmine2.sample.com

Alias /redmine2 /var/lib/redmine2/public
<Location /redmine2>
PassengerBaseURI /redmine2
PassengerAppRoot /var/lib/redmine2
Require all granted
</Location>

  ErrorLog /var/log/apache2/redmine2.sample.com_error.log
  CustomLog /var/log/apache2/redmine2.sample.com_access.log combined
</VirtualHost>

リダイレクトなどで軽くハマり、この設定に落ち着きました。この後、SSL化の手順を実施します。

設定ファイル有効化

a2ensite redmine2.conf
apache2ctl configtest
# Syntax OKを確認します。
systemctl  reload apache2.service

アクセス確認

http://redmine2.sample.com/redmine2

でログインします。

定期作業のチケット化。(redmine_チケットテンプレート)

やりたいこと

このワイルドカード証明書発行は自動発行ではありません。また、ローカル証明書としても保存したいので結構やることがあります。

現時点での運用案

redmineのチケットテンプレートとすることで、手順をチケットに流し込むことにしました。

一度作ってしまえば後は新規チケットとして発行し、それに沿って行けば抜け漏れがありません。(redmineのリマインド機能も利用します)

また、テンプレートそのものを直すことで後の手順変更にも対応可能です。

設定したテンプレート

  • ドメインはsample.domainとしています。
  • 実施時期はLet's Encryptの更新サイクルに合わせています。
  • 作成年月を後で修正することがないように変数化しています。
  • apacheとnginxの設定ファイルの証明書/秘密鍵参照先はそれぞれシンボリックリンク先なので、リンクを貼り替えるだけで証明書が更新できるようにしています。
### 概要

Let's EncryptのSSLワイルドカード証明書を発行して更新する。

### 実施時期

毎年
- 3月
- 6月
- 9月
- 12月

### 実施手順 (AWS Lightsailサーバ)

#### 作業ディレクトリ作成

```bash
mkdir -p /home/work/ssl$(date +%Y%m)
cd /home/work/ssl$(date +%Y%m)
```

#### 証明書発行

```bash
sudo certbot certonly --manual \
    --preferred-challenges dns-01 \
    --server https://acme-v02.api.letsencrypt.org/directory \
    -m メールアドレス \
    -d *.sample.domain
```

1. コマンド発行後、TXTレコードの登録指示がある。
1. AWS管理コンソールにログインする
1. 指示があったTXTレコードを登録
1. 以下のコマンドで結果が返ってくるまでしばらく待つ

```bash
nslookup -type=TXT _acme-challenge.sample.domain
```
→ 結果が返ってきたらEnter。証明書が更新される。

#### 証明書を作業ディレクトリにコピー

```bash
sudo cp -pi /etc/letsencrypt/live/sample.domain-0001/fullchain.pem ./sample.domain.crt.$(date +%Y%m)
sudo cp -pi /etc/letsencrypt/live/sample.domain-0001/privkey.pem ./sample.domain.key.$(date +%Y%m)
```

#### 証明書の整合性を確認

```bash
openssl x509 -noout -dates -subject -in sample.domain.crt.$(date +%Y%m)
# 期限が延びていることを確認

openssl x509 -in sample.domain.crt.$(date +%Y%m) -noout -modulus | md5sum
openssl rsa -in sample.domain.key.$(date +%Y%m) -noout -modulus | md5sum
# 証明書-秘密鍵のハッシュ値が同じであることを確認

openssl x509 -issuer_hash -noout -in sample.domain.crt.$(date +%Y%m)
sed -n -e'1d' -e'/BEGIN/,$p' sample.domain.crt.$(date +%Y%m) | openssl x509 -subject_hash -noout
# 証明書-中間証明書の発行元のハッシュ値が同じであることを確認
```

### 実施手順 (apache/nginxサーバ)

#### 証明書を格納する(nginx/apache共通)

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

```
cd /etc/certs/
# 証明書ファイルを格納したディレクトリに移動します

vi sample.domain.crt.$(date +%Y%m)
# AWSサーバで発行した証明書を貼り付けます

ls -l
# *以下を確認します*
# 更新したLet's Encyrptの証明書ファイルがあること
# 証明書のシンボリックリンクの向き先が前回更新年月であること

ln -sf sample.domain.crt.$(date +%Y%m) sample.domain.crt 

ls -l
# *以下を確認します*
# 証明書のシンボリックリンクの向き先が*今回*更新年月であること
```


#### 秘密鍵を格納する(nginx/aapche共通)

```bash
cd /etc/private
# SSL秘密鍵を格納したディレクトリに移動します

vi sample.domain.key.$(date +%Y%m)
# AWSサーバで発行した秘密鍵を貼り付けます

ls -l
# *以下を確認します*
# 更新したLet's Encyrptの秘密鍵ファイルがあること
# 証明書の秘密鍵の向き先が前回更新年月であること

ln -sf sample.domain.key.$(date +%Y%m) sample.domain.key 

ls -l

# *以下を確認します*
# 証明書の秘密鍵の向き先が*今回*更新年月であること
```

#### 設定反映 

##### nginxの場合

```bash
nginx -t
# syntax is okを確認
systemctl restart nginx
systemctl status nginx
# 再起動後、正常に稼働していることを確認
```

##### apacheの場合

```bash
apache2ctl configtest
# Syntax okを確認
systemctl restart apache2
systemctl status apache2
# 再起動後、正常に稼働していることを確認
```

#### 反映確認

ブラウザで証明書が延びていることを確認

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. 「作成」をクリックしてもエラーが発生しないことを確認します。

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アドレスを削除する。

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通信ができていること

を確認します。

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

以前書いた

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

やったこと

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

以降元と移行先サーバ

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

手順

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

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

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

https://eco.senritu.net/ubuntu20-04%E3%81%B8redmine4-2-x%E3%82%92%E3%82%A4%E3%83%B3%E3%82%B9%E3%83%88%E3%83%BC%E3%83%AB/

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

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

Page 10 of 15

Powered by WordPress & Theme by Anders Norén