タグ: Ubuntu Page 6 of 16

ufwの過剰設定によるサーバの暴走とufwの設定リセット。

「やらかしてしまった」メモです。

起こしてしまったこと

事象

aws lightsailで動かしているUbuntu20.04サーバにアクセスできない事象が発生しました。

Webサイトはもちろん、sshにもつながりません。

確認と一時対処。

awsの管理画面にログインしてリソース状況を確認したら、CPUがバースト。いわゆる暴走状態なのでこの状態を止めます。

「停止」→「起動」を選択。(再起動では完全に暴走が止まりませんでした)

それから程なくしてssh接続ができるまでは回復。ですが、

netstat -lntp

を実行してもWebサービスがリッスンしていません。

systemctl status apache2.service

でサービスは動いていることを確認。状態を確認できたところで原因を特定します。

事象発生前に何をしていたか?

バーストが発生しているサーバで、ufwの作業をしていました。これ以外に設定は特にやっていないので、ほぼおおそらくこれが問題だろうと判断。

取り急ぎ、

sudo ufw disable

を行い

サイトが見られることを確認しました。判断するに

  • ルールの数を増やしすぎて処理性能が追いつかなくなった。
  • 増やしたルールがコンフリクトやループを起こしハングアップ。

等でバースト、暴走したと考えられます。

不審なアクセスを無計画に弾いていたことが徒になった形です。

対処

ufwの強制リセットと最小限の設定

ufwが原因だと特定したものの、サーバ内のFWが有効化されていないのは危険です。そこで、以下のようにして設定を強制リセットしました。

  • 設定の強制リセット
sudo ufw --force reset
  • sshとweb通信のみを有効化
sudo ufw limit proto tcp from any to any port 22
sudo ufw allow 80/tcp
sudo ufw allow 443/tcp
  • 設定反映
sudo ufw enable

設定確認

  • ステータス確認
sudo ufw status
状態: アクティブ

To                         Action      From
--                         ------      ----
22/tcp                     LIMIT       Anywhere                  
80/tcp                     ALLOW       Anywhere                  
443/tcp                    ALLOW       Anywhere                  

を確認しました。

  • 通信確認
  1. ssh接続ができること
  2. このサーバで稼働しているWebサイトが見られること

を確認し、対処完了です。

本件の教訓

「FWをいじるだけだから、特に作業履歴をやらなくてもいいだろう」という慢心から起きたものでした。

個人で運営しているサーバだったことに救われた形です。

また、この程度の作業ということで、システム全体のバックアップを取らなかったことも冷や水でした。

  • 自分の作業によって起きる影響
  • ufwの効率的な管理
  • 作業前のバックアップ確認

といった基本的な運用の管理への意識を改める自戒の出来事でした。

検証:Ubuntu20.04にredmine5.1をインストールする。

概要

Redmineとrubyのバージョン対応を見る限りですと、

Redmine 5.1はruby2.7で動きます。

Ubuntu 20.04で標準的にインストールされるrubyは2.7です。そこで、EOLが迫っているUbuntu 20.04で、敢えてRedmine 5.1がインストールできるかを検証しました。

前提

  • Ubuntu20.04サーバの初期設定が終わった直後の状態を想定します。
  • DNSでドメインの名前が解決できることを前提としています
  • 環境は以下の通りです。
  • Apache系
  • MySQL
  • Ruby 2.7
  • また、パッケージ管理としてaptitudeを用いています。aptが好みの方はこちらに読み替えてください。

特記事項

  • 本手順ではRedmine 5.1をインストールします。
  • 2025年4月にEOLが迫っているUbuntu 20.04で動かすという検証が目的であることを重ねて追記します。
  • 本記事のredmineの格納ディレクトリは/home/www-data/redmineです。一般的なディレクトリ(/var/lib/redmine)と異なることを最初に注記します。
  • ほぼコピペだけで済むような構成にしていますが、一部、テキストエディタを使用する箇所があります。
  • また、自身の環境に合わせたりパスワードを設定する項目がありますのでそこは注意してください。
  • Redmineのインストールができたという検証のみです。動作やプラグインと合わせては未検証です。

手順

Apacheのレポジトリを追加します。

sudo add-apt-repository ppa:ondrej/apache2

必要なパッケージをインストールします。

  • パッケージ全体のアップデート
sudo aptitude update
  • 必要なパッケージのインストール
sudo 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

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

sudo aptitude install libapache2-mod-passenger

apacheのバージョンを確認します。

apache2ctl -v

Apache/2.4.59以降であることを確認します。2.4.58には、http/2プロトコルへの脆弱性があるので、左記のバージョンであることを確認します。

rubyのパッケージ管理(gem)を用いて必要なライブラリをインストールします。

sudo gem install bundler racc mysql2

「3 gems installed」が表示されればインストール成功です。

必要に応じてmysqlの初期設定を行います。

mysql_secure_installationによる初期設定を行います。

うまくいかない場合は以下を参照してください。

https://barrel.reisalin.com/books/bbf94/page/mysql-secure-installation

mysqlでDBとユーザーを設定します。

sudo mysql -u root -p

上記で設定した「mysqlのrootパスワード」を入力し、mysqlにログインします

CREATE DATABASE redmine character set utf8mb4;

DB "redmine" を作成します

CREATE USER 'redmine'@'localhost' IDENTIFIED BY 'password';

ユーザ "redmine"を作成し、パスワードを設定します。
この'password'は任意のパスワードに変更してください

GRANT ALL ON redmine.* TO 'redmine'@'localhost';
flush privileges;
exit

設定したDBでログインできることを確認します。

mysql -u redmine -p
SHOW DATABASES;
exit
  • 配置ディレクトリ作成
sudo mkdir -p /home/www-data/redmine

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

  • 所有者変更
sudo chown -R www-data:www-data /home/www-data
  • Redmine 5.1を入手
sudo -u www-data svn co https://svn.redmine.org/redmine/branches/5.1-stable /home/www-data/redmine

Redmineのコンフィグを設定します。

  • サンプルファイルをコピーしてコンフィグを編集
sudo cp -pi /home/www-data/redmine/config/database.yml.example /home/www-data/redmine/config/database.yml

/home/www-data/redmine/config/database.yml

このファイルを教義・信仰に従ったエディタで編集してください。

database.yml 編集内容

production:
  adapter: mysql2
  database: redmine
  host: localhost
  username: redmine
  # rootからredmineに変更します
  password: "redmine用のパスワード"
  encoding: utf8mb4
# 本番環境(production)のみ設定を行います

Redmineのマイグレーションを行います。

  • Redmineのルートディレクトリに移動
cd /home/www-data/redmine/ && pwd

/home/www-data/redmine/ (Redmineを配置したディレクトリ)であることを確認します

  • bundle install
sudo -u www-data bundle install --without development test --path vendor/bundle
  • シークレットトークンの発行(※Ubuntu 20.04の場合)
sudo -u www-data bundle exec rake generate_secret_token

を実行すると、

Could not find date-3.3.4, timeout-0.4.1 in any of the sources
Run `bundle install` to install missing gems.

というメッセージが出てきます。このエラーに対処します。

  • dateのアップデート
sudo -u www-data bundle update date
  • エラー修正後のシークレットトークンの発行
sudo -u www-data bundle exec rake generate_secret_token

今度は通ります。

  • DBマイグレーション
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の設定ファイルを作成します。

【】を自分の作成したRedmineのサーバ名/ドメイン名に変更します。

cat <<- __EOF__ | sudo tee -a /etc/apache2/sites-available/redmine.conf
<VirtualHost *:80>
    ServerName 【hoge.example.com】
    # ServerNameは自身が設定したredmineに読み替えてください。
    DocumentRoot /home/www-data/redmine/public
    <Directory /home/www-data/redmine/public>
        Options -MultiViews
        AllowOverride All
        Require all granted
    </Directory>
</VirtualHost>
__EOF__

設定を反映させます。

  • ファイル作成確認
ls -l /etc/apache2/sites-available/redmine.conf
  • 設定ファイル有効化
sudo a2ensite redmine.conf
  • 初期サイト設定を無効化
sudo a2dissite 000-default.conf
sudo a2dissite default-ssl.conf
  • コンフィグファイル整合性確認
sudo apache2ctl configtest

Syntax OK を確認します

  • 設定反映前のapacheステータス確認
systemctl status apache2.service

active(running)を確認します

  • apache再起動
sudo systemctl restart apache2.service
  • 設定反映後のapacheステータス確認
systemctl status apache2.service

active(running)を確認します

Webページの表示を確認します。

http://設定したRedmineドメイン

でRedmineのトップページが表示されれば成功です。

直ちにadmin/adminでログインし、強固なパスワードを設定し直します。

Redmineに「元に戻す」「やり直し」追加(Redmine Wiki Historyプラグイン)

概要

RedmineにWord / Excel等にある「アンドゥ」「リドゥ」を追加するプラグインで、誤消去などを防ぎます。

Redmine Wiki History

動作確認環境

  • Ubuntu 22.04
  • Redmine 5.1
  • Apacheで稼働(実行ユーザはwww-data)

導入手順

例によって、SSH(または直接ターミナルに入っての)導入です。

ディレクトリ移動

cd /path/to/redmine/root/directory/plugins && pwd

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

プラグイン導入

  • git clone
 sudo -u www-data git clone https://github.com/sk-ys/redmine_wiki_history
  • clone確認
ls -ld redmine_wiki_history

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

  • apache(webサービス再起動)
sudo systemctl restart apache2.service

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

導入後の確認

Wiki、チケットやコメントの編集画面を表示します。

このようにアンドゥ(元に戻す)、リドゥ(やり直し)ボタンが表示されます。

入力した後に取り消し/やり直しができていれば導入成功です。

Growiサーバのnodeバージョンアップ。(18系→20系)

概要

Growi v7系の動作が安定してきたので、サーバのnodeのバージョンを18系から20系に切り替えます。

バージョンアップ前の環境

  • Ubuntu 22.04
  • Growi v7.0.12
  • node v18.20.3
  • npm 10.7.0
  • yarn 1.22.21

Dockerを利用していないオンプレ環境です。

さっくりとした手順

  1. 作業前に周知を行います。(複数ユーザーで運用している場合)
  2. メンテナンスモードに切り替えます。(またはサービスを停止します)
  3. n packageをインストールします。(インストールしていない場合)
  4. n packageを用いてnodeをバージョンアップします。
  5. nodeのバージョンアップを確認します。
  6. growiを再起動します。
  7. メンテナンスモードを解除します。(実行していた場合)

作業前の周知

単独で利用している場合はこれは不要です。

メンテナンスモードの切り替え

以下のいずれかを選んでください。

  • Growiに管理者権限でログイン後に設定→アプリ設定→「メンテナンスモードを開始する」
  • サーバでsudo systemctl stop growi.serviceを実行する(systemdに登録している場合)

n packageをインストール (インストールしていない場合)

sudo npm install n -g

これを用いてnode.jsをインストールしていきます。

n packageを用いてのバージョンアップ

  • node 20系にバージョンアップ
sudo n 20

バージョンアップ確認

node -v

v20.15.1を確認しました。(2024/07/12現在)

growiサービスの再起動

systemdに登録している場合の手順です。

sudo systemctl restart growi.service

再起動後、Growiにアクセスできることを確認します。

nodeバージョンアップ後の対応

  1. Growiに管理者権限でログインします。
  2. 設定を開き、システム情報でnodeがバージョンアップされていることを確認します。
  3. メンテナンスモードの切り替えを行った場合は、設定から解除します。
  4. 既存機能が使えることを確認します。

Ubuntu 20.04のOpenSSLのEOL対応並びにOpenSSHの脆弱性対応

概要

  • Ubuntu 20.04をインターネットに公開している
  • 諸々の事情で22.04にアップグレードできない
  • 2023/09/11にサポート終了となったOpenSSLの1.1.1をアップグレードしたい。
  • OpenSSHの脆弱性、CVE-2024-6387 の対応を行いたい

方を対象としています。

参考環境

OS:Ubuntu 20.04

  • OpenSSLのバージョン確認
openssl version -a
OpenSSL 1.1.1f  31 Mar 2020
built on: Wed May 24 17:14:51 2023 UTC
platform: debian-amd64
options:  bn(64,64) rc4(16x,int) des(int) blowfish(ptr) 
compiler: gcc -fPIC -pthread -m64 -Wa,--noexecstack -Wall -Wa,--noexecstack -g -O2 -fdebug-prefix-map=/build/openssl-mSG92N/openssl-1.1.1f=. -fstack-protector-strong -Wformat -Werror=format-security -DOPENSSL_TLS_SECURITY_LEVEL=2 -DOPENSSL_USE_NODELETE -DL_ENDIAN -DOPENSSL_PIC -DOPENSSL_CPUID_OBJ -DOPENSSL_IA32_SSE2 -DOPENSSL_BN_ASM_MONT -DOPENSSL_BN_ASM_MONT5 -DOPENSSL_BN_ASM_GF2m -DSHA1_ASM -DSHA256_ASM -DSHA512_ASM -DKECCAK1600_ASM -DRC4_ASM -DMD5_ASM -DAESNI_ASM -DVPAES_ASM -DGHASH_ASM -DECP_NISTZ256_ASM -DX25519_ASM -DPOLY1305_ASM -DNDEBUG -Wdate-time -D_FORTIFY_SOURCE=2
OPENSSLDIR: "/usr/lib/ssl"
ENGINESDIR: "/usr/lib/x86_64-linux-gnu/engines-1.1"
Seeding source: os-specific
  • OpenSSHのバージョン確認
ssh -V
OpenSSH_8.2p1 Ubuntu-4ubuntu0.9, OpenSSL 1.1.1f  31 Mar 2020

参考とした手順

実施する前の留意点

  • コピペだけで済むように、エディタを使わない手順にしています。
  • 実際に筆者が実施した手順をそのまま載せています。typo等はご容赦ください。
  • 作業影響が極めて大きいため、作業時間の見積や日時調整は迅速かつ丁寧に行ってください。
    • 特にmake / make testは思っている以上に時間がかかります。
  • この手順では、sslのパスが変わります。同一サーバ内の他のプログラムがsslを参照している場合は、特に注意してください。

さっくりとはならない手順

  1. システム全体のバックアップ
  2. 【OpenSSL】必要なライブラリをインストールします。
  3. 【OpenSSL】githubレポジトリから最新安定版のソースコードをダウンロードします。
  4. 【OpenSSL】ソースからインストールしていきます。
  5. 【OpenSSL】設定を行います。(コンフィグを反映させ、パスを通します)
  6. 【OpenSSL】バージョンアップを確認します。
  7. 【OpenSSL】自動アップデートを無効化します。
  8. システム全体の再起動を行います。(1回目)
  9. 【OpenSSH】コンフィグに必要なディレクトリの作成を行います。
  10. 【OpenSSH】インストールに必要なパッケージをインストールします。
  11. 【OpenSSH】作業用ディレクトリに移動します。
  12. 【OpenSSH】ソースをダウンロードします。
  13. 【OpenSSH】OpenSSHをソースからビルドします。
  14. システム全体の再起動を行います。(2回目)
  15. 【OpenSSH】バージョンアップを確認します。

実施した手順

全体のバックアップを取得します。

任意の方法でシステム全体のバックアップを取ります。とはいえ、EOL/脆弱性対応のため切り戻しは基本的に許されません。

必要なライブラリのインストール

sudo aptitude install build-essential zlib1g-dev libssl-dev libpam0g-dev libselinux1-dev libkrb5-dev checkinstall zlib1g-dev git

aptitudeを用いています。必要に応じてaptを使ってください。

【OpenSSL】root昇格

OpenSSLをソースコードからコンパイルしてインストールする一連の作業は管理者権限で実行します。

sudo su -

【OpenSSL】ソースコードの取得

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

任意のディレクトリを指定します

  • git clone
git clone https://github.com/openssl/openssl -b openssl-3.3.1

2024/07/03現在の最新版をダウンロードします。

※root昇格済みなのでsudoが不要であることにご注意ください

  • ディレクトリ移動
cd openssl

【OpenSSL】ソースからインストール

  • コンフィグ
./config --prefix=/usr/local/ssl --openssldir=/usr/local/ssl shared zlib
  • コンフィグ成功時の出力
Configuring OpenSSL version 3.3.1 for target linux-x86_64
Using os-specific seed configuration
Created configdata.pm
Running configdata.pm
Created Makefile.in
Created Makefile
Created include/openssl/configuration.h

**********************************************************************
***                                                                ***
***   OpenSSL has been successfully configured                     ***
***                                                                ***
***   If you encounter a problem while building, please open an    ***
***   issue on GitHub <https://github.com/openssl/openssl/issues>  ***
***   and include the output from the following command:           ***
***                                                                ***
***       perl configdata.pm --dump                                ***
***                                                                ***
***   (If you are new to OpenSSL, you might want to consult the    ***
***   'Troubleshooting' section in the INSTALL.md file first)      ***
***                                                                ***
**********************************************************************
  • make
make

makeは時間がかかります。状況を時折確認しながら待ちましょう。

  • 整合性確認
make test

make 同様に時間がかかります。

  • インストール
make install

【OpenSSL】インストール後の設定

  • 設定ファイル追記
cat <<- __EOF__ | tee -a /etc/ld.so.conf.d/openssl-3.3.1.conf
/usr/local/ssl/lib64
__EOF__
  • 設定反映
ldconfig -v
  • 既存プログラムの退避
mv /usr/bin/c_rehash /path/to/backup/c_rehash.$(date +%Y%m%d)

任意の退避ディレクトリを指定します

mv /usr/bin/openssl /path/to/backup/openssl.$(date +%Y%m%d)

任意の退避ディレクトリを指定します

  • パスを通す
cat <<- __EOF__ | tee -a /etc/environment
PATH="/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin:/usr/games:/usr/local/games:/usr/local/ssl/bin"
__EOF__
  • 通したパスを反映
source /etc/environment
  • パス確認
echo $PATH

PATH="/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin:/usr/games:/usr/local/games:/usr/local/ssl/bin"

と表示されることを確認します

【OpenSSL】バージョンアップ後の確認

openssl version -a
OpenSSL 3.3.1 4 Jun 2024 (Library: OpenSSL 3.3.1 4 Jun 2024)
built on: Wed Jul  3 02:04:25 2024 UTC
platform: linux-x86_64
options:  bn(64,64)
compiler: gcc -fPIC -pthread -m64 -Wa,--noexecstack -Wall -O3 -DOPENSSL_USE_NODELETE -DL_ENDIAN -DOPENSSL_PIC -DOPENSSL_BUILDING_OPENSSL -DZLIB -DNDEBUG
OPENSSLDIR: "/usr/local/ssl"
ENGINESDIR: "/usr/local/ssl/lib64/engines-3"
MODULESDIR: "/usr/local/ssl/lib64/ossl-modules"
Seeding source: os-specific
CPUINFO: OPENSSL_ia32cap=0xfffa3203578bffff:0x7a9

これで、Ubuntu20.04でもOpenSSL3.3.1を利用することが可能になりました。

システム全体の再起動(1回目)

  • システムの再起動を行います。
sudo reboot

【OpenSSL】自動アップグレード無効

強制的に3.3系に上げるので、その後、1.1.xがアップグレードされる可能性を防ぎます。

  • apt を使用する場合
sudo apt-mark hold openssl
  • aptitude を使用する場合
sudo aptitude hold openssl

これに続けて、CVE-2024-6387の対応を行います。

【OpenSSH】ディレクトリ作成と設定

sudo mkdir /var/lib/sshd && sudo chmod -R 700 /var/lib/sshd/ && sudo chown -R root:sys /var/lib/sshd/

【OpenSSH】作業用ディレクトリ移動

cd /hoge && pwd

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

【OpenSSH】ソースのダウンロードと展開

  • ソース取得
wget -c http://mirror.exonetric.net/pub/OpenBSD/OpenSSH/portable/openssh-9.8p1.tar.gz

上記CVEの脆弱性に対応したバージョンを用います。

  • ソース展開
tar -xzf openssh-9.8p1.tar.gz
  • ディレクトリ移動
cd openssh-9.8p1

【OpenSSH】展開したソースコードをインストール

  • OpenSSLの位置を確認
which openssl
  • 結果確認
/usr/local/ssl/bin/openssl

本手順でSSLのバージョンアップを行った場合の環境となります。

  • コンフィグ
./configure --with-kerberos5 --with-md5-passwords --with-pam --with-selinux --with-privsep-path=/var/lib/sshd/ --sysconfdir=/etc/ssh --with-ssl-dir=/usr/local/ssl

--with-ssl-dir=/usr/local/sslは、opensslがあるディレクトリを指定します。

  • make
make
  • インストール
sudo make install

システム全体の再起動(2回目)

  • システムの再起動を行います。
sudo reboot

【OpenSSH】バージョンアップ確認

  • バージョン確認

この時点でSSH接続できていれば、ほぼ設定完了です。

ssh -V
OpenSSH_9.8p1, OpenSSL 3.3.1 4 Jun 2024

バージョンアップされていることを確認します。

自動アップグレード無効

強制的に9.x系に上げるので、その後、8.xがアップグレードされる可能性を防ぎます。

  • apt を使用する場合
sudo apt-mark hold openssh-server
  • aptitude を使用する場合
sudo aptitude hold openssh-server

システム全体の確認

  1. ログインできることを確認します。
  2. 他のサービスが正常に稼働していることを確認します。

Ubuntu 20.04 / nginx環境でgrowiをv6.x→v7.0.xにアップグレード。(nginxリバースプロキシのWebSocket設定)

概要

長らくUbuntu 20.04で動かしているgrowi。こちらもv7.0.xにアップグレードできることを確認しました。

Apacheと同様、nginx環境でも、WebSocketを適切に設定する必要がありました。

環境

さっくりとした手順

  1. nodeのアップグレードを行います。
  2. growiサービスを停止します。
  3. growiのバージョンアップを行います。
  4. growiサービスを再開します。
  5. nginxのリバースプロキシ設定を書き換え、nginxサービスの再起動を行います。
  6. バージョンアップを行います。

nodeのアップグレード

node -v

OSが少々古いため、Ubuntu 20.04のnodeはv18.16.0。Growi7系の対象外だったので、nodeを最新安定版に変えるところからスタートします。

  • n packageのインストール
sudo npm install -g n
  • nでnode 20系の安定版をインストール
sudo n --stable
  • バージョンアップ確認
node -v

20.15.0を確認します。

growiのアップグレード前のサービス停止

  • growiのステータス確認(停止前)
systemctl status growi.service

※ サービススクリプト名は自分の環境に合わせます。
※ active(running)を確認します

  • growiのサービス停止
sudo systemctl stop growi.service
  • growiのステータス確認(停止後)
systemctl status growi.service

inactive (dead)を確認します

growiのアップグレード

  • growiディレクトリの移動
cd /opt/growi

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

  • 必要パッケージのインストール
sudo aptitude install git-lfs

git-lfsを入れないとclone/build時に画像が表示されません

  • lfs -pull
sudo git lfs pull
  • リリースタグ取得
sudo git fetch --tags
  • リリースタグ確認
sudo git tag -l

2024/06/30現在のv7系最新版、v7.0.11があることを確認しました。

  • gitのバージョンを一時的に退避
sudo git stash
  • チェックアウト
sudo git checkout 【バージョン】

上述した通り、v7.0.11を入力しました。

  • yarn
sudo yarn

v6.xよりも時間がかかります。

  • アプリのビルド
sudo yarn app:build

こちらも時間がかかります。

アップグレード後のgrowiサービス開始

  • 再開前のステータス確認
systemctl status growi.service

inactive (dead)を確認します

  • サービス再起動
sudo systemctl start growi.service
  • 再開後のステータス確認
systemctl status growi.service
サービススクリプトを[growi]にしている場合

active (running)を確認します

nginxのバーチャルファイルを編集

v7.xは、WebSocketによる通信設定を正常に行わないと既存ドキュメントの編集ができません。(編集画面が空白になります)

そのため、nginxの設定を見直します。

  • 既存のgrowiバーチャルファイルを退避
sudo mv /etc/nginx/sites-available/growi.conf /path/to/backup/directory/growi.conf.$(date +%Y%m%d)

大幅に変更する必要があるため、cpではなくmvします。

  • 新規の設定ファイルを作成

【】内を自分の環境に合わせます。

cat <<- __EOF__ | sudo tee -a /etc/nginx/sites-available/growi.conf
upstream growi {
       server 【growiのIPアドレス】:3000;
}

server {
        listen 80;
        server_name 【サーバ名】;
        server_tokens off;
        return  301 https://$host$request_uri;
        access_log 【growiのアクセスログのフルパス】;
        error_log 【growiのエラーログのフルパス】 warn;
}

map $http_upgrade $connection_upgrade {
    default Upgrade;
    ''      close;
}

server {
        listen 443 ssl;
        server_name 【サーバ名】;
        server_tokens off;
        ssl_session_timeout 1d;
        ssl_session_cache shared:SSL:50m;
        ssl_session_tickets off;
        ssl_dhparam /etc/nginx/dhparam.pem;
        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 【サーバ証明書のフルパス】;
        ssl_certificate_key 【サーバ秘密鍵のフルパス】;

        access_log /var/log/nginx/growi/ssl_access.log;
        error_log /var/log/nginx/growi/ssl_error.log warn;


    location / {
        proxy_set_header Host $host;
        proxy_set_header X-Forwarded-Proto $scheme;
        proxy_set_header X-Forwarded-Port $server_port;
        proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
        proxy_pass http://growi;
        proxy_http_version 1.1;
        proxy_set_header Upgrade $http_upgrade;
        proxy_set_header Connection $connection_upgrade;
        proxy_read_timeout 900s;
    }
}

__EOF__

こちらの設定ファイルはGrowiの公式ドキュメントに沿ったものです。

  • nginxの構文チェック
sudo nginx -t
  • nginx: the configuration file /etc/nginx/nginx.conf syntax is ok
  • nginx: configuration file /etc/nginx/nginx.conf test is successful

を確認します。

  • nginx再起動
sudo systemctl restart nginx.service

バージョンアップ確認

  1. 設定したgrowiのサイトにアクセスします。
  2. チェックアウトしたバージョンであることを確認します。
  3. 既存のページにアクセスし、編集できること(編集画面が白くならないこと)を確認します。

Growi v7でページ編集時に空白になる問題に対処(Apache リバースプロキシのWebSocket設定)

事象の内容

  • Growiのバージョンをv6.3.5→v7.0.11にアップグレード後、既存のページを編集しようとすると編集エリアが空白になってしまう。
  • 新規ページを作成する際に、テンプレートが適用されない。

先のエントリーで述べたようにWikiとしては致命的な弱点だったため、やむなくv6.3.5に戻したという経緯があります。

ですが、回避策が見つかりましたのでメモとして残します。

事象が発生した環境

  • Ubuntu 22.04
  • Apache 2.4
  • Growi v7.0.11をDockerではなくオンプレ環境で利用。
  • Apacheによるリバースプロキシを設定

同一事象をネットで確認。

How to reproduce? (再現手順)

2台のHostPCでそれぞれGrowiを立ち上げています。A環境・B環境と呼称します。

「データ移行」機能を用いて、A環境からB環境にデータをインポートする
B環境のGrowiに他のPCからアクセスする
記事の編集画面を表示する

What happens? (症状)

記事の編集画面が白紙になっており、そのまま保存しても記事の内容が失われる(添付画面参照)

と、事象が一致。

事象の原因

上記issueのツリーに

私の環境でも編集画面が空白になる現象が観測されました。

私は https-portal を使ってデプロイしているのですが、 growi-docker-compose/examples/https-portal にある WEBSOCKET: 'true' の環境変数を設定し損ねていたのが原因でした。
私の環境では、これを設定すると通常通り編集を行えることを確認しております。逆に、コメントアウトすると空白に戻ります。

とあります。

これを原因と断定し、対処に臨みます。

対応方法のさっくりとした手順

  1. 現状のgrowiのリバースプロキシの設定を確認。
  2. 設定ファイルのバックアップ。
  3. 設定ファイルを修正。
  4. 修正を反映。
  5. 事象の解決確認。

参考にしたURL

How to Reverse Proxy Websockets with Apache 2.4

現段階でのリバースプロキシの設定を確認します。

  • Apacheのバーチャルファイルを確認
cat /etc/apache2/sites-available/growi.conf

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

  • 内容の一部抜粋
    # socket.io の path を rewrite する
    RewriteEngine On
    RewriteCond %{REQUEST_URI}  ^/socket.io            [NC]
    RewriteCond %{QUERY_STRING} transport=websocket    [NC]
    RewriteRule /(.*) ws://localhost:3000/ [P,L]

    ProxyPass / http://localhost:3000/
    ProxyPassReverse / http://localhost:3000/

設定そのものはgithubのgrowi公式ドキュメントに沿ったものでしたが、これが引っかかっていたようです。

設定ファイルのバックアップを取ります。

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

ファイル名は自分の環境に合わせます。適宜、任意のバックアップディレクトリを指定します。

  • バックアップ確認
diff -u /path/to/backup/directory/growi.conf.$(date +%Y%m%d) /etc/apache2/sites-available/growi.conf

差分が無いこと(エラーがないこと)でバックアップを確認します。

ファイルを修正します。

上記、バックアップを取ったファイルを教義・信仰に沿ったエディタで編集します。(要管理者権限)

  • 削除する内容
    # socket.io の path を rewrite する
    RewriteEngine On
    RewriteCond %{REQUEST_URI}  ^/socket.io            [NC]
    RewriteCond %{QUERY_STRING} transport=websocket    [NC]
    RewriteRule /(.*) ws://localhost:3000/ [P,L]
  • 削除した箇所に追記する内容
     # WebSocketのための設定
     RewriteEngine On
     RewriteCond %{HTTP:Upgrade} =websocket [NC]
     RewriteCond %{HTTP:Connection} upgrade [NC]
     RewriteRule /(.*) ws://localhost:3000/$1 [P,L]

編集後、差分を取ります。

  • 差分確認
diff -u /path/to/backup/directory/growi.conf.$(date +%Y%m%d) /etc/apache2/sites-available/growi.conf
  • 差分結果
-    # socket.io の path を rewrite する
-    RewriteEngine On
-    RewriteCond %{REQUEST_URI}  ^/socket.io            [NC]
-    RewriteCond %{QUERY_STRING} transport=websocket    [NC]
-    RewriteRule /(.*) ws://localhost:3000/ [P,L]
+     # WebSocketのための設定
+     RewriteEngine On
+     RewriteCond %{HTTP:Upgrade} =websocket [NC]
+     RewriteCond %{HTTP:Connection} upgrade [NC]
+     RewriteRule /(.*) ws://localhost:3000/$1 [P,L]

設定を反映します。

  • 構文確認
sudo apache2ctl configtest

Syntax OKを確認します。

  • Apache再起動前確認
systemctl status apache2.service

active (running)を確認します。

  • Apache再起動
sudo systemctl restart apache2.service
  • Apache再起動後確認
systemctl status apache2.service

active (running)を確認します。

事象の解決を確認します。

上記、設定を行ったGrowiサイトにアクセスします。

編集後、左ペイン(エディタ部分)がそのまま残っていれば対処完了です。

apacheで特定のユーザーエージェントからのアクセスを拒否。

概要

自分のサーバのアクセスログを見たら

"GET /picture.php?/6797/category/73 HTTP/1.1" 200 14394 "-" "facebookexternalhit/1.1 (+http://www.facebook.com/externalhit_uatext.php)"

と、クローラーが大量にアクセスしてきました。robots.txtも意に介さない悪名高いbotのようなので、このアクセスを、サーバで拒否します。

環境

  • Ubuntu 20.04
  • Apache 2.4 (aptでインストールしたため、ディレクトリは/etc/apache2配下にあります。

また、バーチャルサイトによる複数のサイトを運用しているので、そのうちの1つだけを弾きます。

さっくりとした手順

  1. Apacheのバーチャルサイトの設定ファイルのバックアップを取ります。
  2. 設定ファイルを追記します。
  3. 設定を反映します。
  4. 拒否されていることを確認します。

設定ファイルのバックアップ

  • ディレクトリ移動
cd /etc/apache2/sites-available && pwd
  • ファイルバックアップ
sudo cp -pi hoge.conf /path/to/backup/directory/hoge.conf.$(date +%Y%m%d)

設定を行いたい自分の設定ファイルを、任意のバックアップディレクトリにバックアップします。

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

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

設定ファイル追記

上述した設定ファイルを教義・進行に則ったエディタで編集します。(要管理者権限)

  • 追記例
    DocumentRoot /var/www/html/hoge
    <Directory /var/www/html/hoge>
        Options Indexes FollowSymLinks MultiViews
        AllowOverride All
     ## GoogleBOTを拒否(正常bot不正bot両方拒否)
     SetEnvIfNoCase User-Agent "Googlebot" bot
     ## Facebookのクローラーを拒否
     SetEnvIfNoCase User-Agent "facebookexternalhit/1.1" fb_bot
     <RequireAll>
      Require all granted
      Require not env bot
      Require not env fb_bot
     </RequireAll>

/var/www/html/hogeは自分の環境に合わせます。

※ついでにGoogleBOTも拒否します。

  • 差分確認
diff -u /path/to/backup/directory/hoge.conf.$(date +%Y%m%d) hoge.conf
  • 差分例
-        Require all granted
+     ## GoogleBOTを拒否(正常bot不正bot両方拒否)
+     SetEnvIfNoCase User-Agent "Googlebot" bot
+     ## Facebookのクローラーを拒否
+     SetEnvIfNoCase User-Agent "facebookexternalhit/1.1" fb_bot
+     <RequireAll>
+      Require all granted
+      Require not env bot
+      Require not env fb_bot
+     </RequireAll>

設定反映

  • 構文確認
sudo apache2ctl configtest

Syntax OKを確認します。

  • Apache再起動
sudo systemctl restart apache2.service
  • Apache再起動確認
systemctl status apache2.service

active(running)を確認します。

設定反映確認

設定を行ったアクセスログを開きます。

403 3772 "-" "facebookexternalhit/1.1 

のように、ステータスコードが「403」になっていれば、アクセス拒否されています。

UbuntuサーバのSwap処理頻度を変更。

Ubuntuサーバを運用中、実メモリに余裕があるにもかかわらずスワップアウトが出ている事象を確認。

これを変更してみます。

環境

  • Ubuntu 20.04
  • メモリ4GB
  • スワップ6GB

事象と設定変更

現状確認

  • メモリ使用量の確認
free -h
  • 自分の環境の確認
              total        used        free      shared  buff/cache   available
Mem:          3.8Gi       1.8Gi       694Mi       176Mi       1.3Gi       1.6Gi
Swap:         6.0Gi       6.0Mi       6.0Gi
  • swappiness確認
cat /proc/sys/vm/swappiness

60を確認しました。

設定変更

sudo cp -pi /etc/sysctl.conf /path/to/backup/directory/systtl.conf.$(date +%Y%m%d)

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

  • バックアップ確認
diff -u /path/to/backup/directory/systtl.conf.$(date +%Y%m%d) /etc/sysctl.conf

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

  • sedによるファイル追記
sudo sed -i '$ a\vm.swappiness = 10' /etc/sysctl.conf

上記の参考サイトを元に、swappinessを10に指定します

  • 設定変更確認
diff -u /path/to/backup/directory/systtl.conf.$(date +%Y%m%d) /etc/sysctl.conf
  • 差分
+vm.swappiness = 10
  • 設定反映
sudo sysctl -p

vm.swappiness = 10と結果が返ってくることを確認します。

設定反映確認

cat /proc/sys/vm/swappiness

10に変更されていることを確認します。

まずはこの値で様子を見てみようと思います。

ufwのエラーに対処(ufwでipv6を無効化)

Linuxサーバのセキュリティを保つため、ufwの遮断スクリプトを用いています

ところが、「UFWが有効になっていない」というメッセージが出始めたため、その対処を行いました。

事象確認

  • ufw のステータス
sudo ufw status
  • 結果
ERROR: problem running ip6tables

対処

参考URL:https://www.reddit.com/r/linux4noobs/comments/nlb4ul/ufw_status_keeps_returning_problem_running/?rdt=58511

ファイルのバックアップを行います。

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

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

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

差分が無いことでバックアップができていることを確認します。

ファイルの書き換えを行います。

  • sedによるファイル書き換え
sudo sed -i 's/IPV6=yes/IPV6=no/' /etc/default/ufw
  • 書き換え確認
diff -u /path/to/backup/directory/ufw.$(date +%Y%m%d) /etc/default/ufw

差分

-IPV6=yes
+IPV6=no

設定を反映します。

  • ufwリロード
sudo ufw reload
sudo ufw status
  • 結果
状態: アクティブ

となっていればOKです。

考えられる原因

パッケージ全体のアップデートなどを行った関係で、IPv6の設定が強制になったためと思われます。

Page 6 of 16

Powered by WordPress & Theme by Anders Norén