タグ: redmine Page 1 of 13

Redmineサイトのセキュリティヘッダー修正。(脆弱性サイトの評価をA→A+に引き上げ)

外部に公開しているRedmineサイト。

https://plan.io/redmine-security-scanner

で確認したところ、評価はA。

X-Content-Type-Options header not set Content sniffing may enable cross-site scripting attacks. Since your Redmine server is not properly sending the X-Content-Type-Options header, your users are vulnerable to this attack vector.

の診断が出てA+に至りませんでした。

そこで、設定を修正し、脆弱性評価をA+に引き上げます。

環境

  • Ubuntu 24.04
  • Apache 2.4
  • Redmine 5.1
  • mod_headers モジュール有効化済み

現状のセキュリティヘッダー確認

  • /etc/apache2/sites-available/redmine.conf

で以下の箇所を確認。

    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"

セキュリティヘッダーの適用方法を見直し、適切に設定されるよう修正します。

設定修正

  • ファイルのバックアップ
sudo cp -pi /etc/apache2/sites-available/redmine.conf /path/to/backup/directory/redmine.conf.$(date +%Y%m%d)

※自分のRedmineサイトの設定ファイルを指定します。

任意のバックアップディレクトリを指定します。(筆者環境 /etc/apache2/old/redmine.conf.$(date +%Y%m%d)

  • diffによるファイルバックアップ確認
diff -u /path/to/backup/directory/redmine.conf.$(date +%Y%m%d) /etc/apache2/sites-available/redmine.conf 

差分がなければ(エラーがなければ)バックアップ成功です。

  • ファイルの修正

上記のredmine.confを、以下の差分になるように修正します。(管理者権限が必要)

-    Header set X-Content-Type-Options "nosniff"
-   Header always append X-Frame-Options "SAMEORIGIN"
-   Header set X-XSS-Protection "1; mode=block"
+   Header always set X-Content-Type-Options "nosniff"
+   Header always set X-Frame-Options "SAMEORIGIN"
+   Header always set X-XSS-Protection "1; mode=block"
  • ファイル修正確認
diff -u /path/to/backup/directory/redmine.conf.$(date +%Y%m%d) /etc/apache2/sites-available/redmine.conf 

上記の差分が出てくればOKです。

設定反映

  • 構文確認
sudo apache2ctl configtest

Syntax OKを確認します。

  • Apacheステータス確認(反映前)
systemctl status apache2.service

active (running)を確認します。

  • Apache再起動
sudo systemctl restart apache2.service && echo $?

→ 成功時は 0 が出力されます。

  • Apacheステータス確認(反映後)
systemctl status apache2.service

active (running)を確認します。

修正確認

  • curlによる確認
curl -I https://redmineサイト

以下のような表示を確認します。

X-Permitted-Cross-Domain-Policies: none
X-XSS-Protection: 1; mode=block
X-Request-Id: ***********
X-Download-Options: noopen
X-Frame-Options: SAMEORIGIN
X-Runtime: 0.615862
X-Content-Type-Options: nosniff
  • 脆弱性診断サイトによる確認

https://plan.io/redmine-security-scanner

でURLを入力します。

過去の診断結果が表示されるため、『Re-Scan』をクリックして最新の診断結果を取得します。

「A+」の評価と、以下のような表示が出れば修正できています。

It looks like you are running Redmine 5.1.4. That's a version without any known security issues. Your Redmine is protected by properly configured TLS/SSL. All security relevant headers are configured properly. It appears that you have 3 or more Redmine plugins installed.

Redmine5.1に文書管理プラグイン(dmsf)をインストールする上での注意点。

こちらの記事の補足となります。

前提

2025/01/23時点のdmsfプラグインの最新バージョンはRedmine 6.0に合わせたものです。

そのため、git cloneする際に

https://github.com/danmunn/redmine_dmsf/releases

を確認して、Redmineのバージョンと合っているかを確認。

その上で

sudo -u www-data git clone -b v3.2.4 https://github.com/danmunn/redmine_dmsf

バージョンを指定してからgit cloneします。

これを怠ると

自分の例ですが、「Redmineそのものが深刻な機能不全を起こしました」。

具体的に言うと

  • チケットを発行、閲覧、更新時にエラーが起きる
  • Something wrongの画面が出る

などです。

重ねての注意点

  1. 強力な機能をもたらすプラグインほどDBや機能に深刻な影響をもたらします。DBのバックアップは必須です。
  2. 本当に動くバージョンかを更に確認。

と、躓いた上での経験談でした。

Redmineのかんばんプラグインの差し替えメモ。

概要

Redmineのプラグインをかんばんからダッシュボードプラグインに差し替えたときのメモです。

環境

  • Ubuntu 24.04
  • Redmine 5.1
  • MySQL 8
  • Ruby 3.2
  • Apache 2.4

さっくりとした手順

  1. DBのバックアップ
  2. 既存のかんばんプラグイン削除
  3. ダッシュボードプラグインインストール
  4. 動作確認

DBバックアップ

  • 作業ディレクトリ移動
cd /hoge && pwd

任意の作業ディレクトリに移動

  • DBバックアップ
mysqldump -h localhost -u redmine -p --no-tablespaces --single-transaction redmine > redmine_backup.$(date +%Y%m%d).sql
  • バックアップ確認
view redmine_backup.$(date +%Y%m%d).sql

Redmine kanbanのアンインストール (退避)

  • ディレクトリ移動
cd /path/to/redmine/root/directory/plugins && pwd
  • kanbanプラグインの退避
sudo mv kanban /path/to/backup/directory/kanban_org_$(date +%Y%m%d)
  • 退避確認
ls -ld /path/to/backup/directory/kanban_org_$(date +%Y%m%d)
  • Webサービス再起動
sudo systemctl restart apache2.service && echo $?

0を確認

Dashboardプラグインのインストール

  • git clone
sudo -u www-data git clone https://github.com/jgraichen/redmine_dashboard
  • clone 確認
ls -ld redmine_dashboard
  • Redmineルートディレクトリに移動
cd /path/to/redmine/root/directory && pwd
  • bundle install
sudo -u www-data bundle install --without development test
  • DBマイグレーション
sudo -u www-data bundle exec rake redmine:plugins:migrate RAILS_ENV=production
  • Webサービス再起動
sudo systemctl restart apache2.service && echo $?

0を確認

確認

  1. Redmineに管理者権限でログイン
  2. 管理>プラグインにRedmine Dashboard pluginがあることを確認
  3. 任意のプロジェクト>設定で「ダッシュボード」を有効化して保存。
  4. プロジェクトのタブにダッシュボードが表示されること、自分が担当するチケットをドラッグアンドドロップで表示されることを確認

Railsのハマり案件。状況収束。

昨日のこの案件は無事に解決。

対処

原因が自分のRails/Rubyによるものが明らかだったので、それぞれの入れ直しです。

Rubyアンインストール

sudo apt remove --purge ruby ruby-dev rubygems
apt autoremove

として、関連のパッケージを全て削除。設定は特にしていなかったのが幸いしました。

Ruby 再インストール

sudo aptitude install ruby libruby ruby-dev libmysqlclient-dev
sudo aptitude install libapache2-mod-passenger

gemで関連パッケージインストール

sudo gem install bundler racc mysql2

apache再起動

sudo systemctl restart apache2.service && echo $?

→ 0が返ってきたので反映もOK。

後はbundle installもDBマイグレーションも無事に通るようになりました。

Railsのハマり案件。状況発生。

前に見たことがないエラーにとっ捕まったため、状況をメモしておきます。

環境

  • Ubuntu 24.04
  • Ruby 3.2

何が起きているか

Redmineの検証のため、新たに5.1を立てています。

  1. SVNでチェックアウト
  2. DBなどを作成
  3. database.ymlにDB情報を追記
 sudo -u www-data bundle exec rake generate_secret_token

実行後、

rake aborted!
NameError: uninitialized constant ActiveSupport::LoggerThreadSafeLevel::Logger (NameError)

    Logger::Severity.constants.each do |severity|
          ^^^^^^^^^^
/home/www-data/hideout/vendor/bundle/ruby/3.2.0/gems/activesupport-6.1.7.10/lib/active_support/logger_thread_safe_level.rb:16:in `<module:LoggerThreadSafeLevel>'
/home/www-data/hideout/vendor/bundle/ruby/3.2.0/gems/activesupport-6.1.7.10/lib/active_support/logger_thread_safe_level.rb:9:in `<module:ActiveSupport>'
/home/www-data/hideout/vendor/bundle/ruby/3.2.0/gems/activesupport-6.1.7.10/lib/active_support/logger_thread_safe_level.rb:8:in `<top (required)>'
<internal:/usr/lib/ruby/vendor_ruby/rubygems/core_ext/kernel_require.rb>:38:in `require'
<internal:/usr/lib/ruby/vendor_ruby/rubygems/core_ext/kernel_require.rb>:38:in `require'
/home/www-data/hideout/vendor/bundle/ruby/3.2.0/gems/activesupport-6.1.7.10/lib/active_support/logger_silence.rb:5:in `<top (required)>'
<internal:/usr/lib/ruby/vendor_ruby/rubygems/core_ext/kernel_require.rb>:38:in `require'
<internal:/usr/lib/ruby/vendor_ruby/rubygems/core_ext/kernel_require.rb>:38:in `require'
/home/www-data/hideout/vendor/bundle/ruby/3.2.0/gems/activesupport-6.1.7.10/lib/active_support/logger.rb:3:in `<top (required)>'
<internal:/usr/lib/ruby/vendor_ruby/rubygems/core_ext/kernel_require.rb>:38:in `require'
<internal:/usr/lib/ruby/vendor_ruby/rubygems/core_ext/kernel_require.rb>:38:in `require'
/home/www-data/hideout/vendor/bundle/ruby/3.2.0/gems/activesupport-6.1.7.10/lib/active_support.rb:29:in `<top (required)>'
<internal:/usr/lib/ruby/vendor_ruby/rubygems/core_ext/kernel_require.rb>:38:in `require'
<internal:/usr/lib/ruby/vendor_ruby/rubygems/core_ext/kernel_require.rb>:38:in `require'
/home/www-data/hideout/vendor/bundle/ruby/3.2.0/gems/railties-6.1.7.10/lib/rails.rb:7:in `<top (required)>'
<internal:/usr/lib/ruby/vendor_ruby/rubygems/core_ext/kernel_require.rb>:38:in `require'
<internal:/usr/lib/ruby/vendor_ruby/rubygems/core_ext/kernel_require.rb>:38:in `require'
/home/www-data/hideout/config/application.rb:5:in `<top (required)>'
<internal:/usr/lib/ruby/vendor_ruby/rubygems/core_ext/kernel_require.rb>:38:in `require'
<internal:/usr/lib/ruby/vendor_ruby/rubygems/core_ext/kernel_require.rb>:38:in `require'
/home/www-data/hideout/Rakefile:5:in `<top (required)>'
/home/www-data/hideout/vendor/bundle/ruby/3.2.0/gems/rake-13.2.1/exe/rake:27:in `<top (required)>'
(See full trace by running task with --trace)

が発生。そのため、DBマイグレーションも通らないという状況。

この問題はやっかいそうなので、まずは事象が発生したという事実だけメモをします。

Redmine View Customizeで、ステータスに応じてバージョンを移動させる。

個人用のメモとして活用しているRedmine。

ステータスをハリポタシリーズの呪文に見立てているなど、かなり遊んでいます。

そこで、

  • 終わったチケット
  • 却下されたチケット

を、自動的にそれらのバージョンに移動できないかということで組んだCustomizeです。

  • Redmine 5.1
  • View Customize

で動作を確認しています。

カスタマイズ

  • パスのパターン:空白
  • プロジェクトのパターン:空白
  • 挿入位置:全ページのヘッダ
  • 種別:JavaScript
$(document).ready(function() {
  const prophecyRoomId = 4; // 「予言の間」のバージョンID
  const azkabanId = 5; // 「アズカバン」のバージョンID

  $('#issue_status_id').change(function() {
    const statusId = parseInt($(this).val()); // ステータスのIDを取得
    if (statusId === 5) { // FinitoのステータスID(例)
      $('#issue_fixed_version_id').val(prophecyRoomId); // 「予言の間」に変更
    } else if (statusId === 6) { // Avada KedavraのステータスID(例)
      $('#issue_fixed_version_id').val(azkabanId); // 「アズカバン」に変更
    }
  });
});

変数は自分が分かればいいのでこのような形にしています。なお、バージョンやステータスのIDは管理画面で把握できます。

あとは保存して、

  1. チケットのステータスを移動
  2. それに応じてバージョンが変わる

ことを確認できればOKです。

Redmine 5.1にパスワードマネージャーをインストール&初期設定

概要

性質上、パスワードをやりとりすることが多いRedmine。その管理を一括で行うためのプラグイン、vaultをインストールしてみました。

特記事項

  • ※パスワードを管理するという性質上、インターネットからアクセスできるサイトでこのプラグインの運用はオススメしません。
  • コンフィグファイルをいじるため、可能な限り検証環境でテストを行ってから導入を試みてください。

環境

  • Redmine 5.1
  • Ubuntu 22.04
  • Apache 2.4
  • MySQL
  • Ruby 3.0.2

※筆者環境のRedmineとApacheの実行ユーザーは www-data です。

さっくりとしているけどさっくりとはいかない手順

Redmineサーバでのターミナル操作です。(要管理者権限)

  1. gitでプラグインをcloneします。
  2. DBのマイグレーションを行い、プラグインをインストールします。
  3. Webサービスを再起動します。
  4. 初期設定をWebとターミナルで行います。

プラグインをgit cloneして配置

  • Redmineのプラグイン配置ディレクトリに移動
cd /path/to/redmine/plugins && pwd

自分の環境に合わせます。 (筆者環境 /home/www-data/redmine/plugins )

  • git clone
sudo -u www-data git clone https://github.com/noshutdown-ru/vault
  • clone確認
ls -ld vault

ディレクトリがあることを確認します。

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

  • Redmineのルートディレクトリに移動
cd /path/to/redmine && pwd

自分の環境に合わせます。 (筆者環境 /home/www-data/redmine )

  • bundle
sudo -u www-data bundle install
  • DB マイグレーション
sudo -u www-data bundle exec rake redmine:plugins:migrate RAILS_ENV=production
  • マイグレーションの成功確認
echo $?

0を確認します。0以外は何らかのエラーが起きています。

Webサービスの再起動

  • Webサービス(apache)再起動
sudo systemctl restart apache2.service && echo $?

0を確認します。0以外は何らかのエラーが起きています。

  • Webサービス起動確認
systemctl status apache2.service

active (running)を確認します。

プラグインのインストール確認と初期設定

  • ブラウザでRedmineにログイン

管理者権限でログインします。ログイン後、ヘッダーにKeysというメニューが表示されています。クリックしても

500
The encryption key is not set in the settings

というエラーが出ていますので、対応を行います。

  • 管理画面に移動

管理>Vaultに移動します。

  • 暗号化キーの設定

暗号化キーを、ランダムな文字列:英数記号16文字で入力します。

head /dev/urandom | tr -dc 'a-zA-Z0-9!@#$%^&*()_+{}|:<>?' | head -c 16; echo

等とすると、16文字の文字列を完全ランダムに生成することができます。

この文字列を「暗号化キー」の後のテキストボックスに入れます。

Use Redmine encryptionにもチェックを入れ、適用をクリックします。

この後、Redmineのサーバにターミナルログインします。

Redmineサーバでのパスワードファイルの暗号化

  • Redmineのコンフィグファイル配置ディレクトリに移動
cd /path/to/redmine/config && pwd

自分の環境に合わせます。 (筆者環境 /home/www-data/redmine/config )

  • configuration.ymlのバックアップ
sudo -u www-data cp -pi configuration.yml /path/to/backup/directory/configuration.yml.$(date +%Y%m%d)

任意のバックアップディレクトリを指定します。

  • configuration.ymlのバックアップ確認
diff -u /path/to/backup/directory/configuration.yml.$(date +%Y%m%d) configuration.yml

差分が無いこと(エラーがないこと)を確認します。

  • configuration.ymlの編集

教義・信仰に則ったエディタを用いて以下のように編集します。

production:
  database_cipher_key: "上記で入力した16文字の文字列"
  • production:の項目がある場合は、そのセクションの下に書きます。
  • その際、と、半角スペース2つを行頭に入れるのを忘れないでください。

編集後、保存をします。

  • configuration.ymlの編集後の差分確認
diff -u /path/to/backup/directory/configuration.yml.$(date +%Y%m%d) configuration.yml
+production:
+  database_cipher_key: "上記で入力した16文字の文字列"

を確認します。(productionが既にある場合は + database_cipher_key: "上記で入力した16文字の文字列" )

  • Redmineのルートディレクトリに移動
cd /path/to/redmine && pwd

自分の環境に合わせます。 (筆者環境 /home/www-data/redmine )

  • configuration.ymlに基づき暗号化
sudo -u www-data bundle exec rake redmine:plugins:vault:convert RAILS_ENV=production
  • 暗号化の成功確認
echo $?

0を確認します。0以外は何らかのエラーが起きています。

Webサービスの再起動

  • Webサービス(apache)再起動
sudo systemctl restart apache2.service && echo $?

0を確認します。0以外は何らかのエラーが起きています。

  • Webサービス起動確認
systemctl status apache2.service

active (running)を確認します。

設定反映確認

  1. Redmineのサイトに管理者権限でログインします。
  2. ヘッダーの Keys をクリックしてエラーがないことを確認します。

使い方に関しては改めて。

RedmineにLightbox2プラグインをインストール。

それなりに読まれていると自負している『ライザのアトリエ3』の攻略記事「有料DLC:ロスカ島」の文献探しの記事にも使われているLightbox2プラグインのインストール方法です。

メールアドレスの登録が必要なものの無料で利用できます。

  • 画像を拡大表示できるライトボックス機能。
  • スライドショー形式で画像を順に閲覧可能。

の2つが強力なため、Remdineで画像を多用する際にも大いに役立ちます。

動作環境

  • Ubuntu 24.04
  • Apache 2.4
  • Ruby 3.2

手順

Redmine Xでのパッケージ取得

公式サイトよりメールアドレスを登録します。

登録後、送られてくるメール内に記載されているURLからパッケージを取得。

任意の方法でサーバ内にアップロードします。

パッケージの展開

  • アップロードしたファイルがあるディレクトリに移動
cd /hoge && pwd
  • パッケージの所有者変更
sudo chown www-data:www-data redmine_x_lightbox2.zip

Redmineの実行ユーザーに合わせます。

パッケージの展開と配置

  • パッケージ配置
sudo -u www-data unzip redmine_x_lightbox2.zip -d /path/to/redmine/plugins

自分のRedmine環境に合わせます。

  • パッケージ配置確認
ls -ld /path/to/redmine/plugins/redmine_x_lightbox2

ディレクトリがあることを確認します。

プラグインインストール

  • Redmineルートディレクトリに移動
cd /path/to/redmine && pwd

自分の環境に合わせます。

  • bundle install
sudo -u www-data bundle install
  • DBマイグレーション
sudo -u www-data bundle exec rake redmine:plugins:migrate RAILS_ENV=production
  • Apache再起動
sudo systemctl restart apache2.service && echo $?

返値が0であることを確認します。

  • Apache再起動後のステータス確認
systemctl status apache2.service

active(running)を確認します。

動作確認

  1. 画像を添付 任意のチケットまたはWikiに画像を添付します。
  2. 画像をクリック 添付された画像をクリックし、ポップアップ表示が正常に動作することを確認します。
  3. ナビゲーションの確認 表示された画像を左右に切り替え、スライドショー機能が動作していることを確認します。

Redmineで作成日に基づいて曜日を自動設定

Redmine 5.1環境で「View Customize Plugin」を使用し、チケットの作成日に基づいてカスタムフィールド「曜日」を自動的に設定する方法のメモです。

前提

1. View Customize Pluginのインストール

View Customize Pluginをまだインストールしていない場合は、こちらを参照してください。

プラグインのインストールが完了すると、管理メニューから「View Customize」の設定が利用可能になります。

2. カスタムフィールド「曜日」を作成する

  1. 管理メニューから「カスタムフィールド」を選択。
  2. チケット用カスタムフィールドを作成。
  3. フィールド名を「曜日」とし、以下の設定を行います:
    • 形式: リスト
    • 値月曜日
      火曜日
      水曜日
      木曜日
      金曜日
      土曜日
      日曜日
    • 必須: 任意

カスタムフィールドを作成したら、任意のトラッカーやプロジェクトにこのフィールドを設定してください。さらに、フィールドID(例: 6)を確認してください。このIDはスクリプトで使用します。

スクリプトの設定

1. View Customizeで新しいカスタマイズを作成

  1. 管理メニューから「View Customize」を選択。
  2. 「新しいカスタマイズを追加」をクリック。
  3. 以下の内容を設定:
    • 挿入位置: 全ページのヘッダ
    • 種別: JavaScript
    • コメント: 作成日に基づく曜日設定

2. スクリプトを記述する

以下のスクリプトを入力します。カスタムフィールドID(例: 6)は環境に合わせて変更してください。

$(document).ready(function () {
   // 曜日フィールドと作成日フィールドの取得
   const weekdayField = $('#issue_custom_field_values_6');
   const startDateField = $('#issue_start_date');

   // カスタムフィールドが存在する場合のみ処理を実行
   if (weekdayField.length > 0 && startDateField.length > 0) {
       // 作成日フィールドが変更されたときに曜日を更新
       startDateField.on('change', function () {
           const startDate = startDateField.val(); // 作成日(yyyy-mm-dd形式)
           if (!startDate) return;

           // 作成日から曜日を計算
           const date = new Date(startDate);
           const weekdays = ['月曜日', '火曜日', '水曜日', '木曜日', '金曜日', '土曜日', '日曜日'];
           const dayOfWeek = weekdays[(date.getDay() + 6) % 7]; // 月曜日始まりに調整

           // 計算結果を曜日フィールドに設定
           weekdayField.val(dayOfWeek).change(); // 値を設定して変更を反映
      });

       // 初期表示時にも作成日があれば曜日を計算
       startDateField.trigger('change');
  }
});

動作確認

  1. 任意のトラッカーまたはプロジェクトで「曜日」カスタムフィールドが設定されていることを確認します。
  2. Redmineのチケット作成画面を開きます。
  3. 「曜日」フィールドがあることと、それが開いた日付であることを確認できれば動作完了です。

Redmineの進捗率を自動クローズ/変更時に元に戻すView_Customize

個人メモとして利用しているRedmine。ステータスに応じて進捗率を設定してしまうと、トラッカーが追えなくなるため、以下のカスタマイズを行いました。

スクリプトの内容

  1. Redmineに管理者権限でログインします。
    1. 管理>表示のカスタマイズに進みます。
    2. 新しい表示のカスタマイズを選択し、
      1. パスのパターン:空白
      2. 挿入位置:全ページのヘッダ
      3. 種別:JavaScript
      4. コード
$(document).on('change', '#issue_status_id', function () {
 const closedStatuses = [5, 6]; // 閉じられたステータスIDを指定(例: 5: 完了, 6: 却下)
 const selectedStatus = parseInt($(this).val(), 10);

 // 元の進捗率を保存するための変数
 let originalDoneRatio = $('#issue_done_ratio').data('original-done-ratio');

 if (!originalDoneRatio) {
   // 初回実行時に元の進捗率を保存
   originalDoneRatio = $('#issue_done_ratio').val();
   $('#issue_done_ratio').data('original-done-ratio', originalDoneRatio);
}

 if (closedStatuses.includes(selectedStatus)) {
   $('#issue_done_ratio').val('100'); // 進捗率を100%に設定
} else {
   // 元の進捗率に戻す
   $('#issue_done_ratio').val(originalDoneRatio);
}
});

動作の解説

  1. チケットのステータスが変更されると、指定された閉じられたステータスIDの場合は、自動で進捗率が100%に変更されます。
  2. その他のステータスに変更された場合は、初回に保存した元の進捗率に戻されます。

これで、進捗率を維持しつつステータスの変更が可能になります。

Page 1 of 13

Powered by WordPress & Theme by Anders Norén