タグ: Ubuntu Page 13 of 15

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サービスを稼働させることができました。

既存LAMPサーバに資産管理システム『Snipe-IT』を追加。

一時期試してみた『Snipe-IT』。

このときはインストールスクリプトを用いて、

  • Apache
  • mariaDB
  • php

という状態でした。(また、このときはローカルDNSも構築していませんでした)

そこで、既にある環境にこれを追加します。

前提

  • Linux: Kubuntu 20.04
  • Apache
  • PHP
  • MySQL
  • 既に以下のWebシステムを導入済み
    1. Zabbix
    2. フォトアルバムLychee
    3. Growi

手順

以下のサイトを参考にしました。

Ubuntu 22.04にSnipe-IT資産管理ツールをインストールする方法– VITUX

(参照先では22.04ですが、その前のバージョンでもほぼこの手順通りでした。また、参照先ではmysqlなどを導入するよう指示がありましたが、既に稼働しているため飛ばしています)

PHPインストール

sudo add-apt-repository ppa:ondrej/php

sudo apt install -y php7.4-{opcache,pdo,bcmath,calendar,ctype,fileinfo,ftp,gd,intl,json,ldap,mbstring,mysqli,posix,readline,sockets,bz2,tokenizer,zip,curl,iconv,phar}
# 参照元のコマンドでを叩くとPHPバージョンを指定するよう言われたので、原稿環境のバージョン「7.4」を加えています。
インストール後、既存サービスの設定確認
sudo systemctl restart apache2

→ 再起動後、ZabbixやLycheeが正常に稼働していることを確認しました。

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';
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 .env.example .env
sudo vim .env
設定ファイル内容(編集内容)
APP_URL=marazion.corn.wall
APP_TIMEZONE='JST'
DB_CONNECTION=mysql
DB_HOST=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

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

httpd仮想ファイル作成

vi /etc/apache2/sites-available/snipe-it.conf
設定ファイル内容

ここでは

  1. ServerNameで複数のバーチャルホストを定義
  2. Rewriteで強制的にhttps通信をさせる
  3. 書式をApache2.4に合わせる

を行っています。

<VirtualHost _default_:80>
 ServerName marazion.corn.wall
#Server名は読み替えてください。(ログの場所も同じ)
 RewriteEngine On
        RewriteCond %{HTTPS} off
        RewriteRule ^(.*)$ https://%{HTTP_HOST}%{REQUEST_URI} [R=301,L]
</VirtualHost>

<VirtualHost _default_:443>
 ServerName marazion.corn.wall
 CustomLog /var/log/apache2/marazion.corn.wall/access.log combined
 ErrorLog /var/log/apache2/marazion.corn.wall/error.log
#  ログの場所を別のディレクトリにしたい場合は予め作成します
  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
    SSLCertificateFile /etc/certs/corn.wall.crt
    SSLCertificateKeyFile /etc/private/corn.wall.key
#mkcertで取得したローカル証明書と秘密鍵

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

設定ファイル反映

a2ensite snipe-it
apache2ctl configtest
 # → syntaxOKを確認
systemctl restart apache2.service

反映後、上記指定したドメインにアクセスすることでpre-flight checkが走り、

しっかり動くことを確認です。

ApacheによるGrowiサーバのリバースプロキシー化。

Growiの使い勝手が非常に良かったので、環境を整えました。

やりたいこと

  • 導入したGrowiサーバ、「IPアドレス:3000」ではなく「ドメイン名」でアクセスできるようにしたい。
  • 既にapacheで稼働しているLychee(フォトアルバム)やZabbixは平行稼働させたい。
  • ローカルとは言えSSL通信を行いたい。

やったこと

  1. hostファイル書き換え
  2. ローカルDNS登録
    1. これに即したSSL証明書をmkcertsで作成
  3. Apacheによるリバースプロキシー有効化
  4. 設定ファイル差し替え
  5. 動作確認

前提

以下の環境を導入済みです。

  • Kubuntu Linux 20.04
  • Apache 2.4
  • Growi 5.1

手順

※ディレクトリ、ドメインなどは個人の環境に読み替えてください。

host書き換え

sudo vi /etc/hosts
追記内容
127.0.0.1       localhost
127.0.0.1       paddington.corn.wall   paddington
# ※Ubuntuの環境では「127.0.1.1」となっていましたので、localhostと同じにします
127.0.0.1       chisataki.lyco.reco     chisataki
# ※別ドメインで通信を行いたいので、この行を追加しました

DNS登録

今回、新たに「lyco.reco」というローカルドメインを作成して「chisataki.lyco.reco」で名前解決できるようにしました。

参照:

mkcertsによるローカルSSL証明書発行

mkcertsを導入したサーバで、以下を発行します。

 mkcert -key-file lyco.reco.key.202208 -cert-file lyco.reco.cert.202208 lyco.reco chisataki.lyco.reco "*.lyco.reco"

この時に発行した証明書と秘密鍵をGrowiサーバの以下に格納します。

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

参照:

秘密鍵のシンボリックリンク化

証明書と秘密鍵を格納したサーバで

cd /etc/cets
sudo ln -s lyco.reco.cert.202208 lyco.reco.cert
​
cd /etc/private
sudo ln -s lyco.reco.key.202208 lyco.reco.key
# mkcertsの証明書は有効期限が3ヶ月と短いため、更新時にはリンクの貼り替えだけで済むようにあらかじめシンボリックリンクを設定します

としておきます。

リバースプロキシー有効化

sudo a2enmod proxy proxy_http proxy_wstunnel
sudo systemctl restart apache2.service

ログ格納ディレクトリ作成

sudo mkdir /var/log/apache/chisataki.lyco.reco
sudo chown -R www-data:www-data /var/log/apache/chisataki.lyco.reco

リバースプロキシー用apache設定ファイル作成

参考:

https://docs.growi.org/ja/admin-guide/getting-started/ubuntu-server.html

sudo vi /etc/apache2/sites-available/growi.conf
設定ファイル内容

※ServerNameやログなどは読み替えてください。

<VirtualHost _default_:80>
ServerName chisataki.lyco.reco
RewriteEngine On
      RewriteCond %{HTTPS} off
      RewriteRule ^(.*)$ https://%{HTTP_HOST}%{REQUEST_URI} [R=301,L]
</VirtualHost>

<VirtualHost _default_:443>
ServerName chisataki.lyco.reco
CustomLog /var/log/apache2/chisataki.lyco.reco/access.log combined
ErrorLog /var/log/apache2/chisataki.lyco.reco/error.log
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
  SSLCertificateFile /etc/certs/lyco.reco.crt
  SSLCertificateKeyFile /etc/private/lyco.reco.key

  RewriteEngine On
  RewriteCond %{HTTP:Upgrade} websocket [NC]
  RewriteCond %{REQUEST_URI} ^/socket.io           [NC]
  RewriteCond %{QUERY_STRING} transport=websocket   [NC]
  RewriteRule /(.*) ws://localhost:3000/$1 [P,L]

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

</VirtualHost>

設定ファイル有効化

sudo a2ensite growi

設定ファイル反映

sudo apache2ctl configtest
 # → syntax OK を確認します
sudo systemctl restart apache2.service

設定後、

「http://[ドメイン]」

にアクセスすることで

  • https通信へのリダイレクト
  • 指定したディレクトリにアクセスログが流れること

を確認しました。

メモ帳、追加。(UbuntuにGrowi導入)

以前、Dockerでいじっていたツールが思いの外有用そうだったので、オンプレ環境で作りました。

導入:Growi

いわゆるナレッジベースツールです。すでに

すでにknowledgeベースは入れているものの

  • 階層化でWikiを作ってくれる
  • エディタ周りが高機能
  • 日々の記録に便利そう

ということで、早速入れてみます。

インストールした環境

  • Chuwi Herobox Pro

既に以下の環境を導入済み

  • Linux 20.04
  • Apache
  • MySQL
  • Zabbix
  • WebアルバムLychee

参考にした記事:
https://qiita.com/BigTree777/items/4a67d36c4111a1fb50e7

手順

Node.jsをインストールします。

cd /hoge/
curl -sL https://deb.nodesource.com/setup_14.x -o nodesource_setup.sh
sudo bash nodesource_setup.sh
sudo apt install nodejs

npmを用いてyarnをインストールします。

sudo npm install -g yarn

Elasticsearchのインストール

wget -qO - https://artifacts.elastic.co/GPG-KEY-elasticsearch | sudo gpg --dearmor -o /usr/share/keyrings/elasticsearch-keyring.gpg
sudo apt-get install apt-transport-https
echo "deb [signed-by=/usr/share/keyrings/elasticsearch-keyring.gpg] https://artifacts.elastic.co/packages/7.x/apt stable main" | sudo tee /etc/apt/sources.list.d/elastic-7.x.list
sudo apt-get update && sudo apt-get install elasticsearch

Elasticsearchのメモリ変更

sudo vi /etc/elasticsearch/jvm.options
設定ファイル
# 任意の行に以下を追加
-Xms256m
-Xmx256m

ElasticSearchの自動起動有効化

sudo su -
systemctl start elasticsearch
systemctl enable elasticsearch

GROWIに必要なプラグインのインストール

sudo /usr/share/elasticsearch/bin/elasticsearch-plugin install analysis-kuromoji
sudo /usr/share/elasticsearch/bin/elasticsearch-plugin install analysis-icu

MongoDBのインストール

wget -qO - https://www.mongodb.org/static/pgp/server-4.4.asc | sudo apt-key add -
echo "deb [ arch=amd64,arm64 ] https://repo.mongodb.org/apt/ubuntu focal/mongodb-org/4.4 multiverse" | sudo tee /etc/apt/sources.list.d/mongodb-org-4.4.list
sudo apt update
sudo apt install -y mongodb-org=4.4.13 mongodb-org-server=4.4.13 mongodb-org-shell=4.4.13 mongodb-org-mongos=4.4.13 mongodb-org-tools=4.4.13

MongoDBのバージョン固定

※これをやらないと全文検索がうまくいかないとのこと

echo "mongodb-org hold" | sudo dpkg --set-selections
echo "mongodb-org-server hold" | sudo dpkg --set-selections
echo "mongodb-org-shell hold" | sudo dpkg --set-selections
echo "mongodb-org-mongos hold" | sudo dpkg --set-selections
echo "mongodb-org-tools hold" | sudo dpkg --set-selections

GROWIのインストール

sudo git clone https://github.com/weseek/growi /opt/growi
cd /opt/growi

sudo git checkout -b v5.0.5 refs/tags/v5.0.5
sudo yarn

以降、参考にした記事:
https://qiita.com/hawk777/items/0916024c1bd7b24904ae

systemdスクリプトの作成

sudo vi /etc/systemd/system/growi.service
スクリプト内容
[Unit]
Description = growi
After=network-online.target mongod.service
ConditionPathExists=/opt/growi

[Service]
ExecStart=/opt/growi/growi-start.sh
Restart=no
Type=simple

[Install]
WantedBy=multi-user.target
chown root:root /etc/systemd/system/growi.service
chmod 644 /etc/systemd/system/growi.service

起動スクリプトの作成

sudo vi /opt/growi/growi-start.sh
スクリプト内容
#!/bin/sh
cd /opt/growi
MONGO_URI=mongodb://localhost:27017/growi \
ELASTICSEARCH_URI=http://localhost:9200/growi \
MATHJAX=1 \
PASSWORD_SEED=[任意の文字列] \
npm start

権限変更

sudo chmod +x /opt/growi/growi-start.sh

デーモン化、起動確認

sudo systemctl daemon-reload
sudo systemctl start growi.service
sudo systemctl status growi.service

※起動するまで5分ぐらいかかりました。

起動後、http://[アドレス]:3000

でログインできました。

Mod Securityが検知したIPアドレスの抜き出し。

やりたいこと

Mod Securityを導入してから、不正アクセスがerror.logに現れるようになりました。
そのアドレスをネガティブリストに放り込むことで後続のアクセスをブロックする方法は設定しました。

そこで、

  • 日ごとにerror.logで検知したログを確認し
  • IPアドレスのみを抜き出してリスト化する

設定を行います。

環境

  • Ubuntu 20.04(Linux Mint)
  • Apache 2.4
  • Mod Security

※ログは/var/lib/redmine/log に格納されています。

手順

一般ユーザで実施します。

参考:

https://linux.just4fun.biz/?%E9%80%86%E5%BC%95%E3%81%8DUNIX%E3%82%B3%E3%83%9E%E3%83%B3%E3%83%89/%E3%83%86%E3%82%AD%E3%82%B9%E3%83%88%E3%83%95%E3%82%A1%E3%82%A4%E3%83%AB%E3%81%8B%E3%82%89IP%E3%82%A2%E3%83%89%E3%83%AC%E3%82%B9%E3%81%AE%E3%81%BF%E6%8A%BD%E5%87%BA%E3%81%99%E3%82%8B

apacheのerror.logからIPアドレスを抜き出します。

cd /var/lib/redmine/log
cat error.log | awk 'match($0,/[0-9]+\.[0-9]+\.[0-9]+\.[0-9]+/) { print  substr($0, RSTART, RLENGTH) }'
# IPアドレスのみ表示されることを確認。

IPアドレスを並べ替え、重複を除外します。

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
# 一意のアドレスのみが表示されることを確認。

自動実行するスクリプトを作成します。

cd /hoge/
vi negativelist.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.`date +%Y%m%d`

スクリプトに実行権限を付与します。

chmod +x negativelist.sh

日ごとに実行されるように設定します。

sudo su -
crontab -u www-data -e
# redmineのログプラグインで閲覧できるよう、apache実行ユーザのcronを編集します
cron内容
0 8 * * * /hoge/negativelist.sh

これで、「Mod Securityが不正アクセスと見なしたIPアドレスを日ごとに抜き出す」仕組みが整いました。

(シェルスクリプトで指定したディレクトリ内に、suspicious_ip.yyyymmdd というファイルが作成されます。
 また、/var/lib/redmine/log 配下に置くことで、redmineのログプラグインで表示することができます。)

直接ネガティブリストに追記しないのは、偽陽性で自分自身がブロックされるのを防ぐためです。

Let’s EncryptによるSSL証明書取得と暗号化の強化。

宅内オンプレだけではなくAWSでの運用も始めたredmine。こちらではドメインを取得するためmkcertではくLet's Encryptで証明書を取得します。

環境

  • OS:Ubuntu 20.04
  • Apache 2.4

手順

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

Let's Encryptのcertbotをインストールします。

aptitude install certbot python3-certbot-apache

botの指示に従って証明書を取得します。

certbot --apache

ウィザードに従って設定するだけの非常に簡単な作業。その後、以下のファイルが作成されます。

/etc/apache2/sites-available/redmine-le-ssl.conf
# 既に作成しているバーチャルファイルの内容をコピーしてSSLの設定が追加されていました

SSL接続強化準備

以下のモジュールを有効にして再起動します。

a2enmod headers
a2enmod rewrite

ファイル編集

vi /etc/apache2/sites-available/redmine-le-ssl.conf
ファイルの内容
<VirtualHost _default_:80>
 RewriteEngine On
        RewriteCond %{HTTPS} off
        RewriteRule ^(.*)$ https://%{HTTP_HOST}%{REQUEST_URI} [R=301,L]

# http通信を強制的にhttpsにリダイレクト
</VirtualHost>

<VirtualHost _default_:443>
servername servername
CustomLog /var/log/redmine/access.log combined
ErrorLog /var/log/redmine/error.log
# アクセスログ格納ディレクトリ
Alias /redmine /var/lib/redmine/public
<Location /redmine>
PassengerBaseURI /redmine
PassengerAppRoot /var/lib/redmine
Require all granted
</Location>

# redmineの設定

  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"

# 弱いSSLを無効化し、HSTSを有効化しています

SSLCertificateFile /etc/letsencrypt/live/serverdomain/fullchain.pem
SSLCertificateKeyFile /etc/letsencrypt/live/serverdomain/privkey.pem

# let's encryptの設定通りです
#Include /etc/letsencrypt/options-ssl-apache.conf

# バーチャルファイル上で用いる暗号化強度を明示しているのでlet's encryptの設定はコメントアウトしています
        RewriteEngine On
        RewriteCond %{HTTP_HOST} ^server\.domain
        RewriteRule ^/$ https://server.domain/redmine/ [R]

# https://server.domainをhttps://server.domain/redmine にリダイレクトします
</VirtualHost>

設定を反映します。

cd /etc/apache2/sites-enable
unlink redmine.conf
# 既存のconfファイルを無効化
apache2ctl configtest
# syntax OKを確認
systemctl restart apache2

この設定後、SSL強度チェックで

A+を獲得しました。

ローカルredmineのSSL化。-ローカル証明書のインストールと常時SSL化-

この記事の続きです。

ここでは、mkcertで作成したローカル証明書をredmineサーバに入れておきます。

また、

  • httpを強制的にhttpsにリダイレクト
  • http://ip or DNS名 のアクセスをhttps://ip or DNS名/redmineへとリダイレクトする

設定も同時に入れ込みます。

redmineサーバ上での設定

必要なモジュールの有効化

a2enmod ssl
a2enmod rewrite
systemctl restart apache2
ss -lntp
# 443ポートがLISTENされていることを確認します

証明書ペアの格納

mkdir /etc/certs/
mkdir /etc/private/

その後、

/etc/certs → SSL証明書

  • corn.wall.crt.202204

/etc/private/ → 秘密鍵

  • corn.wall.key.202204

をそれぞれ格納します。

証明書ペアのシンボリックリンク化

後々のメンテナンスを考えて、証明書をシンボリックリンク化します。

cd /etc/certs/
ln -s corn.wall.crt.202204  corn.wall.crt
cd /etc/private/
ln -s corn.wall.key.202204 corn.wall.key

Virtualファイル記載

cd /etc/apahce2/site-available/
cp -pi redmine.conf /path/to/backup/redmine.conf.org
vi redmine.conf
redmine.confの内容
<VirtualHost _default_:80>
 RewriteEngine On
        RewriteCond %{HTTPS} off
        RewriteRule ^(.*)$ https://%{HTTP_HOST}%{REQUEST_URI} [R=301,L]
        #http通信を強制的にhttpsにリダイレクト
</VirtualHost>

<VirtualHost _default_:443>
  SSLEngine on
    SSLProtocol All -SSLv2 -SSLv3  -TLSv1
    SSLCertificateFile /etc/certs/corn.wall.crt
    # 証明書
    SSLCertificateKeyFile /etc/private/corn.wall.key
    # 秘密鍵

        RewriteEngine On
        RewriteCond %{HTTP_HOST} ^penzance\.corn\.wall
        RewriteRule ^/$ https://penzance.corn.wall/redmine/ [R]
        # https://penzance.corn.wallへのアクセスをhttps://penzance.corn.wall/redmine/にリダイレクト

Alias /redmine /var/lib/redmine/public
CustomLog /var/log/redmine/access.log combined
ErrorLog /var/log/redmine/error.log
<Location /redmine>
PassengerBaseURI /redmine
PassengerAppRoot /var/lib/redmine
Require all granted
</Location>

</VirtualHost>

設定反映

apache2ctl configtest
# SyntaxOKを確認
systemctl restart apache2

再起動後、

  • redmineの通信がhttpsで行えること
  • ホスト名でアクセスしても/redmine/に移動すること

を確認しました。

補足とまとめ

  • セキュリティソフトによっては、このローカル認証局を「信頼できない」としてブロックする場合があります。その時はその設定を解除します。
  • また、mkcertsは開発用途なので外に出ていけないローカル環境での運用が前提です。
  • そのためか証明書の有効期限は3ヶ月。この運用をもっと楽にするのが今後の目標です

Page 13 of 15

Powered by WordPress & Theme by Anders Norén