タグ: Ubuntu Page 12 of 15

Mod_SecurityのIPアドレス調査。(Cronによる自動実行)

2022年12月現在、「Mod_Securityが検知したIPアドレスネガティブリストに放り込む」は達成しました。

  • これら検知したIPはどこの国からか?
  • 日々、どのぐらいの数、不審なアクセスが来ているのか?

を把握するため、シェルスクリプトを書きました。(今回で一端終了です)

やりたいこと

  1. Mod_securityが検知したエラーログからIPアドレスのみを抜き出す
  2. 検出したIPアドレスがどこの国からアクセスしたかを調査してcsvファイルに出力する
  3. 同じIPアドレスごとに件数を数え、降順で並べ替える
  4. cronで定期実行する

本項でやること

  1. cronで定期実行

前提

  • エラーログからIPアドレスを抜き出しアクセス元の国を抜き出すスクリプト
  • そのIPアドレスをカウントして降順に表示するスクリプト

が用意されていること。(前回前々回で提示)

また、

  • apacheのログが日ごとにローテーションされていること
  • redmineの稼働サーバに導入しているので、ログ表示プラグインで閲覧できる

も想定しています。

スクリプト作成

cron用に一部手を加えます。

エラーログからIPアドレスを抜き出してアクセス元の国を付与

ip_check.sh

スクリプト内容

#!/bin/bash

SHELL=/bin/bash
PATH=/usr/local/sbin:/usr/local/bin:/sbin:/bin:/usr/sbin:/usr/bin

# ログの格納場所に移動
cd /var/lib/redmine/log

# error.logからIPアドレスだけを抜き出します
cat ./error.log | awk 'match($0,/[0-9]+\.[0-9]+\.[0-9]+\.[0-9]+/) { print  substr($0, RSTART, RLENGTH) }' | sort > ip.`date +%Y%m%d`.csv

listfile="./ip.`date +%Y%m%d`.csv"
# ip.YYYYMMDD.csvファイルがない場合にエラーを返します
if [ ! -f $listfile ]; then
        echo "ファイル $listfile が存在しないので終了します。"
        exit 1
fi

country_list="./country_list.csv"
# 国コード,国の名前が書かれたcountry_list.csvがない場合にエラーを返します
# このCSVファイルはログの格納場所に配置します
if [ ! -f $country_list ]; then
        echo "ファイル $country_list が存在しないので終了します。"
        exit 1
fi

# IPアドレスに国名を付与したファイルを定義します。(ip_list.YYYYMMDD.csv)
result_file="./ip_list.`date +%Y%m%d`.csv"
cat /dev/null > $result_file

cat ${listfile} | while read line
do
                # IPアドレスを逆順に並び替えます。(例: 1.2.3.4 → 4.3.2.1
                ip_revers=`echo ${line}|awk -F'.' '{print $4,".",$3,".",$2,".",$1}'|sed -e 's/ //g'`
                # 並び替えたIPアドレスをcc.wariate.jpに並び替えて、国コードを抜き出します。(JP,CH,ESなど
                country_code=`nslookup -type=TXT ${ip_revers}.cc.wariate.jp | grep '"'|awk -F'"' '{print $2}' `
                # 国コードをcountry_list.csvから参照して国名を抜き出します。
                country_name=`cat ${country_list} | grep ${country_code} | cut -d"," -f 2`

                # 次の行は標準出力に返す処理を行います。cron処理する場合は#をつけて作動しないようにします。
                # echo "${line},${country_name}"
                # IPアドレス,国名の形式にして同ディレクトリのip_list.YYYYMMDD.csvに保存します
                echo "${line},${country_name}" >> $result_file
        sleep 1
done

chown www-data:www-data ip.`date +%Y%m%d`.csv
chown www-data:www-data ip_list.`date +%Y%m%d`.csv

exit

アクセス元の国を付与したリストを集計するスクリプト

ip_count.sh

スクリプト内容

#!/bin/bash

SHELL=/bin/bash
PATH=/usr/local/sbin:/usr/local/bin:/sbin:/bin:/usr/sbin:/usr/bin

cd /var/lib/redmine/log

# ip_list.csv.YYYYMMDDを読み込んで、IPアドレスをキー、国を値とする連想配列を作成します
declare -A countries
while read -r line; do
  # CSVの1列目をIPアドレス、2列目を国とします
  ip=$(echo $line | cut -d',' -f1)
  country=$(echo $line | cut -d',' -f2)
  # 連想配列に格納します
  countries[$ip]=$country
done < ip_list.`date +%Y%m%d`.csv

# 結果を格納するための変数を定義します
result=""

# 連想配列を反復処理します
for ip in "${!countries[@]}"; do
  # 各IPアドレスの件数を数えます
  count=$(grep -c $ip ip_list.`date +%Y%m%d`.csv)
  # 件数、IPアドレス、国をカンマ区切りで結合します
  line="$count,$ip,${countries[$ip]}"
  # 結果に追加します
  result="$result\n$line"
done

# カウントした結果をcounted_ip.YYYYMMDD.csvに出力します
echo -e $result > counted_ip.`date +%Y%m%d`.csv

### ↑ここまでchatGPTが作成したスクリプト↑ ###

# 最終結果をsorted_ip.`date +%Y%m%d`.csvに出力します
# LC_ALL=Cを設定しないと日本語で書かれた国名の並べ替えがうまくいきませんでした
cat counted_ip.`date +%Y%m%d`.csv |LC_ALL=C sort -n -r > sorted_ip.`date +%Y%m%d`.csv

# 最終結果以外のログファイルを削除します
# 必要に応じて無効化してください
rm ip.`date +%Y%m%d`.csv
rm ip_list.`date +%Y%m%d`.csv
rm counted_ip.`date +%Y%m%d`.csv

chown www-data:www-data sorted_ip.`date +%Y%m%d`.csv

exit

Cron配置

sudo crontab -e -u root

定期実行

0 7 * * * /スクリプト配置パス/ip_check.sh && /スクリプト配置パス/ip_count.sh

これで、指定した時刻に

  1. IPアドレスの抜き出し
  2. IPアドレスの集計

を行うようにしてくれます。

Mod_SecurityのIPアドレス調査。(アクセス元の国を抜き出す)

2022年12月現在、「Mod_Securityが検知したIPアドレスネガティブリストに放り込む」は達成しました。

  • これら検知したIPはどこの国からか?
  • 日々、どのぐらいの数、不審なアクセスが来ているのか?

を把握するため、シェルスクリプトを書きました。

やりたいこと

  1. Mod_securityが検知したエラーログからIPアドレスのみを抜き出す
  2. 検出したIPアドレスがどこの国からアクセスしたかを調査してcsvファイルに出力する
  3. 同じIPアドレスごとに件数を数え、降順で並べ替える
  4. cronで定期実行する

本項でやること

  1. Mod_securityが検知したエラーログからIPアドレスのみを抜き出す
  2. 検出したIPアドレスがどこの国からアクセスしたかを調査してcsvファイルに出力する

前提と準備

以下の環境です。

  • Ubuntu 20.04とCentOS 7以降で動作を確認しました。

nslookupコマンドが実装されていること

which nslookup
# パスがあれば実装されています。
nslookupがない場合のインストール
sudo apt-get install dnsutils

スクリプト生成

参考

以下のスクリプトをベースにしています。

https://raintrees.net/news/11

本スクリプトの作成者様と、IPアドレスと国の対応を結びつけるサービスの作成者様にこの場を借りて御礼申し上げます。

1. 国コードとアドレスを対応させたCSVを作成します。

以下のようなCSVを作成します。

vi country_list.csv
ファイル内容
AC,アセンション島
AD,アンドラ
AE,アラブ首長国連邦
AF,アフガニスタン
AG,アンティグア・バーブーダ
AI,アンギラ
AL,アルバニア
etc...

作成に当たっての参照先:

https://memorva.jp/memo/website/domain_cctld_country_code.php

スクリプトを作成します。

vi ip_check.sh
スクリプト内容
#!/bin/sh

# error.logのディレクトリを指定する場合は指定して下さい
# error.logからIPアドレスだけを抜き出して同ディレクトリのip.YYYYMMDD.csvに保存します
cat ./error.log | awk 'match($0,/[0-9]+\.[0-9]+\.[0-9]+\.[0-9]+/) { print  substr($0, RSTART, RLENGTH) }' | sort > ip.`date +%Y%m%d`.csv

listfile="./ip.`date +%Y%m%d`.csv"
# ip.YYYYMMDD.csvファイルがない場合にエラーを返します
if [ ! -f $listfile ]; then
        echo "ファイル $listfile が存在しないので終了します。"
        exit 1
fi

country_list="./country_list.csv"
# 国コード,国の名前が書かれたcountry_list.csvがない場合にエラーを返します
if [ ! -f $country_list ]; then
        echo "ファイル $country_list が存在しないので終了します。"
        exit 1
fi

# IPアドレスに国名を付与したファイルを定義します。(ip_list.YYYYMMDD.csv)
result_file="./ip_list.`date +%Y%m%d`.csv"
cat /dev/null > $result_file

cat ${listfile} | while read line
do
                # IPアドレスを逆順に並び替えます。(例: 1.2.3.4 → 4.3.2.1
                ip_revers=`echo ${line}|awk -F'.' '{print $4,".",$3,".",$2,".",$1}'|sed -e 's/ //g'`
                # 並び替えたIPアドレスをcc.wariate.jpに並び替えて、国コードを抜き出します。(JP,CH,ESなど
                country_code=`nslookup -type=TXT ${ip_revers}.cc.wariate.jp | grep '"'|awk -F'"' '{print $2}' `
                # 国コードをcountry_list.csvから参照して国名を抜き出します。
                country_name=`cat ${country_list} | grep ${country_code} | cut -d"," -f 2`

                # 次の行は標準出力に返す処理を行います。cron処理する場合は#をつけて作動しないようにします。
                 echo "${line},${country_name}"
                # IPアドレス,国名の形式にして同ディレクトリのip_list.YYYYMMDD.csvに保存します
                echo "${line},${country_name}" >> $result_file
        sleep 1
done

exit

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

chmod +x ip_check.sh

動作確認

任意のディレクトリに以下のファイルがあることを確認します。

  • error.log (またはスクリプトにログのパスを記載)
  • ip_check.sh スクリプト
  • country_list.csv

スクリプト実行

./ip_check.sh

スクリプト実行結果

出力先(上記例ではスクリプトを配置したディレクトリ)に以下のファイルが出力されます。

  • ip.YYYYMMDD.csv (エラーログからIPアドレスのみを抜き出したファイル)
  • ip_list.YYYYMMDD.csv (以下の様に、IPアドレスとアクセス元の国を記述したファイル)
AAA.BBB.CCC.DDD,シンガポール
AAA.BBB.CCC.DDD,ベトナム
AAA.BBB.CCC.DDD,中国

次にやること

  1. このスクリプトの実行結果を元に件数ごとにまとめて並べ替えるスクリプトの作成
  2. cronによる定期実行化

Ubuntu 22.04でZabbix 6.2(MySQL/nginx構成)を設定するときにハマったこと。

以下の環境でZabbixを導入してみましたが、いくつかハマったことがあったのでメモを残しておきます。

導入した環境

  • Ubuntu 22.04
  • 導入しようとしたZabbix : 6.2
  • MySQL / nginx構成
  • 他サービス未導入(OSインストールと初期設定を終えたのみです)
  • ドメイン登録済みです。
  • ワイルドカードSSL証明書を発行済みです。

導入手順(ハマりポイント込み)

前提

  • 全て管理者権限で実施しています。
  • パッケージ管理は基本的にaptitudeを利用しています。
  • ローカルNWで設定しているのでufwなどは考慮していません。

参考URL

Zabbixレポジトリを追加してインストールします。

aptitude update
aptitude upgrade
wget https://repo.zabbix.com/zabbix/6.2/ubuntu/pool/main/z/zabbix-release/zabbix-release_6.2-1+ubuntu22.04_all.deb
dpkg -i zabbix-release_6.2-1+ubuntu22.04_all.deb
aptitude update
aptitude install zabbix-server-mysql zabbix-frontend-php zabbix-nginx-conf zabbix-sql-scripts zabbix-agent

MySQLの初期設定

aptitude install mysql-server
systemctl start mysql
systemctl enable mysql

必要に応じて: mysql_secure_installation

参考 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でZabbix用のユーザーを作成

mysql -uroot -p
# 上記で設定したパスワードを入力します
CREATE DATABASE zabbix character set utf8mb4;
CREATE USER 'zabbix'@'localhost' IDENTIFIED BY 'パスワード';
# 任意のパスワードを設定
GRANT ALL ON redmine.* TO 'zabbix'@'localhost';
flush privileges;
exit

ハマりポイント1:SQL実行時にエラーが出る

ERROR 1419 (HY000) at line 2123: You do not have the SUPER privilege and binary logging is enabled (you *might* want to use the less safe log_bin_trust_function_creators variable)

と出たので、設定をしておきます。

対処方法
mysql -uroot -p

rootでmysqlにログイン後、以下を実行します。

SHOW VARIABLES LIKE 'log_bin_trust_function_creators';
# OFF を確認
set global log_bin_trust_function_creators=1;
# 設定を有効化
 SHOW VARIABLES LIKE 'log_bin_trust_function_creators';
 # ONを確認

ハマりポイント2: インポート用SQLが存在しない(正しい手順を後述)

Webサイトの手順によると、

zcat /usr/share/doc/zabbix-sql-scripts/mysql/server.sql.gz | mysql -uzabbix -p zabbix

とありますが、該当ディレクトリにmysql用のSQLが存在しません。

対処方法
apt reinstall zabbix-sql-scripts

として、sqlを再インストールします。

updatedb
 locate server.sql.gz
 →  /usr/share/zabbix-sql-scripts/mysql/server.sql.gz

SQLをインポートします。

zcat /usr/share/zabbix-sql-scripts/mysql/server.sql.gz | mysql -uzabbix -p zabbix
# zabbixのDBパスワードを入力します。

Zabbixの設定を行います。

vi /etc/zabbix/zabbix_server.conf
追記/編集内容
DBName=zabbix
DBUser=zabbix
DBPassword=zabbix

nginx用のconfファイルを設定します。

vi /etc/zabbix/nginx.conf
編集内容
        listen          443 ssl http2 default_server;
        # ポートを443のみで受け付けるようにします。
        server_name     ドメイン名;

        ssl_certificate "/SSL証明書と中間証明書を結合したファイル";
        ssl_certificate_key "秘密鍵ファイル";
        ssl_protocols TLSv1.2 TLSv1.3;
        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:ECDHE-RSA-AES128-SHA";
        ssl_prefer_server_ciphers off;
        ssl_session_cache shared:SSL:1m;
        ssl_session_timeout 10m;

設定内容を確認します。

nginx -t
# Syntax OKを確認します

設定内容を反映します。

systemctl restart zabbix-server zabbix-agent nginx php8.1-fpm
systemctl enable zabbix-server zabbix-agent nginx php8.1-fpm

セットアップ確認

ブラウザから

https://ドメイン名/setup.php

が表示されれば問題ないです。その後、Next Stepに進んでください。

サーバ3台構成によるlsyncのバックアップ。

サーバ3台構成になっていることで、データの更なる冗長化を図ります。

バックアップ概要

redmineのデータをnextcloudにリアルタイム同期、nextcloudからgrowiに更に同期させます。

設定

基本的にこの設定通り。以前のサーバ設定をコピペする形なので、バックアップ先と元が逆にならないように細心の注意を払いました。

設定中のエラー

動作確認中のlsyncログを見たら以下を発見。

Sun Dec  4 04:20:39 2022 Error: Terminating since out of inotify watches.
Consider increasing /proc/sys/fs/inotify/max_user_watches

幸い、解決策がネットにありました。

http://blog.livedoor.jp/kmiwa_project/archives/1072412621.html

解決

vi /etc/sysctl.conf
設定内容
fs.inotify.max_user_watches = 819200
# 上記の内容を追記します
設定反映
sysctl -p
systemctl restart lsync

これによって、同期が無事に始まりました。

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

Nectcloud recognizeアプリ導入後のOPcacheの設定。

発生した事象

Nextcloudにアップロードされた画像をタグ付けしてくれる「recognize」アプリを使っています。

それを用いて運用したところ、以下のエラーに出くわしました。

発生画面

メニュー > Administration settings > 概要

  • PHP OPcacheモジュールが正しく設定されていません。詳細はドキュメントを参照してください。
    • 「OPcacheのインターン文字列バッファーがまもなく一杯になります。全てのスクリプトをキャッシュに保管できるようにするには、opcahe,interned_strings_bufferの値を8より多い値で、PHP設定に適用することを推奨します。

これを放置していったところ、Webサービスが止まり、SSHにも接続できなくなりました。そのため、以下の対処を施しました。

前提:環境

以下の環境で動いています。

  • Ubuntu 20.04
  • Apache 2.4.54
  • PHP 7.4.32

※snapは使わず、オンプレで構築しました。

また、Opcacheモジュールは設定済みです。

対処

以下、管理者権限で実施しています。

mkdir /etc/old
cd /etc/php/7.4/mods-available
cp -pi opcache.ini /etc/old/opcache.ini.`date +%Y%m%d`
vi opcache.ini
設定内容
opcache.interned_strings_buffer=16
; 8 → 16に修正

設定反映

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

反映確認

メニュー > Administration settings > 概要

へと進みます。

「全てのチェックに合格しました。」

を確認します。

余談:recognizeアプリの注意点

万単位のファイルを既にインポートしたため、画像認識とタグ付けのためにかなりのCPUリソースを消費します。(平均オーバーロードが7を超えるときもありました)
そのため、zabbix等で負荷を監視している場合は認識中は閾値を上げておく等の対処が必要です。

Ubuntu 20.04にNextcloudをインストール。

Dropboxのようにファイルを保存できて、各種アプリ(プラグイン)で様々な機能を拡張できるOSS、Nextcloudをインストールしました。

このエントリーで行うこと

  1. nextcloud用のphpモジュールを入れる
  2. nextcloudに即したデータベースを入れる
  3. apache設定ファイルを作成する
  4. 設定反映を行い、初期画面を出す。

インストールしたハードウェア

この、2台目のChuwi Herobox Proです。redmineのデータ同期サーバのデータをマウントするために選びました。

前提

以下が導入済みです。

  • Ubuntu 20.04
  • Apache 2.4 (2.4.41)
  • mysql 80 (8.0.30)
  • php 7.4 (7.4.32)
  • nextcloud用のドメインを設定していること
  • サーバ証明書 (Let's Encryptワイルドカードを用いました)

手順

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

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

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}

systemctl restart apache2

データベースを作成します。

mysql -u root -p
CREATE USER 'nextcloud'@'localhost' IDENTIFIED BY 'パスワード';
CREATE DATABASE IF NOT EXISTS nextcloud CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci;
GRANT ALL PRIVILEGES ON nextcloud.* TO 'nextcloud'@'localhost';
FLUSH PRIVILEGES;

ファイルをダウンロードして配置します。

導入したサーバは/homeディレクトリを別SSDにマウントしているため、以下のようにしました。

wget https://download.nextcloud.com/server/releases/latest.zip
unzip latest.zip /home/www-data
chown -R www-data:www-data /home/www-data/nextcloud

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

mkdir /var/log/apache2/nextcloud
chown -R www-data:www-data /var/log/apache2/nextcloud
vi /etc/apache2/sites-available/nextcloud.conf

設定ファイルの内容

<VirtualHost _default_:80>
 ServerName [公開するドメイン名]
 RewriteEngine On
        RewriteCond %{HTTPS} off
        RewriteRule ^(.*)$ https://%{HTTP_HOST}%{REQUEST_URI} [R=301,L]
 CustomLog /var/log/apache2/nextcloud/access.log combined
 ErrorLog /var/log/apache2/nextcloud/error.log
</VirtualHost>

<VirtualHost _default_:443>
 ServerName [公開するドメイン名]
 CustomLog /var/log/apache2/nextcloud/ssl_access.log combined
 ErrorLog /var/log/apache2/nextcloud/ssl_error.log
  SSLEngine on
  Header always set Strict-Transport-Security "max-age=15552000; includeSubDomains"
    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/ssl.crt
    # 証明書のファイルパス
    SSLCertificateKeyFile /etc/private/ssl.key
    # 秘密鍵のファイルパス

    DocumentRoot /home/www-data/nextcloud
    <Directory /home/www-data/nextcloud>
        Options Indexes FollowSymLinks MultiViews
        AllowOverride All
        Require all granted
    </Directory>

</VirtualHost>

設定を反映します。

a2ensite nextcloud.conf
apache2ctl configtest
# Syntax ok を確認します
systemctl restart apache2

起動確認

ブラウザから設定したドメインにアクセスします。

アクセス後、ガイドに従い

  • 管理者アカウント
  • パスワード
  • データベース情報

を設定後、以下の画面が出てくれば成功です。

Ubuntuサーバで再起動が必要かを判断するコマンド。

apt(aptitude)でパッケージをインストール後、以下の判断に迷うことがあります。

  • サーバの再起動は必要なのか
  • サービスを再起動させる必要があるのか

これらをチェックするコマンドがありました。

コマンドインストール

sudo aptitude install debian-goodies update-notifier-common

再起動判断基準

カーネルなどのアップデートがされて、システム全体の再起動が必要な場合、以下のファイルが作成されます。

/var/run/reboot-required

cat /var/run/reboot-required
*** System restart required ***

また、サービスの再起動が必要な場合は、次のコマンドを実行してその判断が可能です。

sudo checkrestart

Found 27 processes using old versions of upgraded files
(14 distinct programs)
(10 distinct packages)

Of these, 9 seem to contain systemd service definitions or init scripts which can be used to restart them.
The following packages seem to have definitions that could be used
to restart their services:
accountsservice:
        441     /usr/lib/accountsservice/accounts-daemon
networkd-dispatcher:
        470     /usr/bin/networkd-dispatcher
policykit-1:
        471     /usr/lib/policykit-1/polkitd
rsyslog:
        473     /usr/sbin/rsyslogd
modemmanager:
        511     /usr/sbin/ModemManager
unattended-upgrades:
        567     /usr/share/unattended-upgrades/unattended-upgrade-shutdown
openssh-server:
        683     /usr/sbin/sshd
        246134  /usr/sbin/sshd
        246245  /usr/sbin/sshd
apache2-bin:
        15285   /usr/sbin/apache2
        238252  /usr/sbin/apache2
        238253  /usr/sbin/apache2
        238254  /usr/sbin/apache2
        238255  /usr/sbin/apache2
        238258  /usr/sbin/apache2
        238559  /usr/sbin/apache2
        238902  /usr/sbin/apache2
        244571  /usr/sbin/apache2
        244580  /usr/sbin/apache2
packagekit:
        246707  /usr/lib/packagekit/packagekitd

These are the systemd services:
systemctl restart accounts-daemon.service
systemctl restart networkd-dispatcher.service
systemctl restart polkit.service
systemctl restart ModemManager.service
systemctl restart packagekit-offline-update.service
systemctl restart packagekit.service

These are the initd scripts:
service rsyslog restart
service unattended-upgrades restart
service ssh restart
service apache2 restart

These processes (1) do not seem to have an associated init script to restart them:
passenger:
        238230  /usr/lib/passenger/support-binaries/PassengerAgent
        238235  /usr/lib/passenger/support-binaries/PassengerAgent

上記で再起動の必要性があったのでシステム全体を再起動。

sudo checkrestart
# Found 0 processes using old versions of upgraded filesと表示されること
cat /var/run/reboot-required
# ファイルがないこと

を確認し、システムを最新の状態に保ちました。

Configuration GeneratorによるSSL強度再設定。

AWS Lightsailで運用している「インターネット接続用redmine」。運用にあたり、SSLの強化を図るため

こちらにあるように強度チェッカーで検証しながら設定を行っていました。

ところが最近、このチェックが厳しくなったようで評価がAまで落ちます。

信頼度は高いと言えるものの余り気分がいいものではありません。そこで、再びA+となるように設定を行いました。

SSL Configuration Generator

https://ssl-config.mozilla.org/

mozillaが公式に提供しているこのサイト、

  • サーバプログラム
  • プログラムのバージョン
  • 強度

を設定するだけでサンプルコードを示してくれる優れもの。これを使い、こんな感じで設定しました。

設定ファイル

<VirtualHost _default_:80>
servername 公開するドメイン
 RewriteEngine On
        RewriteCond %{HTTPS} off
        RewriteRule ^(.*)$ https://%{HTTP_HOST}%{REQUEST_URI} [R=301,L]
        # http通信をhttps通信にリダイレクト
</VirtualHost>
<VirtualHost _default_:443>
servername 公開するドメイン

CustomLog /var/log/redmine/access.log combined
ErrorLog /var/log/redmine/error.log
# redmineログ設定

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'"
## Mod_Securityが検知したIPアドレスをブロックします。

Alias /redmine /var/lib/redmine/public

<Location /redmine>
PassengerBaseURI /redmine
PassengerAppRoot /var/lib/redmine
Require all granted
<RequireAll>
    Require all granted
</RequireAll>
</Location>

## 上記はredmineの設定です

  SSLEngine on
    Protocols h2 http/1.1
    Header always set Strict-Transport-Security "max-age=63072000"
## SSLならびにHSTS有効化。

SSLCertificateFile /path/to/SSL/Certificate
SSLCertificateKeyFile /Path/to/SSL/Private/Key
## 証明書を格納します。

        RewriteEngine On
        RewriteCond %{HTTP_HOST} ^ドメイン名
        RewriteRule ^/$ https://ドメイン名/redmine/ [R]
        # ドメイン名でアクセスした際に/redmine/にリライトします。

</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)"
## Configuration Generatorで追加した設定。<virtualhost>ディレクティブの外に出す必要がありました。

こちらを修正してサービス再起動。

再起動後の強度チェック

再びA+を取り戻しました。

Ubuntu系Linuxの最初の設定。

検証にしろなんにしろ、最初に行っている作業のメモ書きです。

サーバ名をドメイン込みで再設定

hostnamectl set-hostname [サーバ名]
uname -n
# 指定したサーバ名が表示されることを確認

Ubuntu系Linuxは、ドメイン込みでサーバ名を登録してもフルネームで登録されません。ここで最初にサーバ名を確定させます。

~/.bashrc末尾に以下を追記

PS1="[\u@\H \W]\\$ "
HISTSIZE=50000

→ これにより、ユーザ名とホスト名のフルネームがプロンプトに表示されます。また、コマンド「history」で記憶させる上限を増やします。

/etc/bash.bachrcに以下を追記

export HISTTIMEFORMAT='%y/%m/%d %H:%M:%S '

→ これはほぼ必須です。コマンド「history」を実行したときの日時を指定することでその後の証跡が追いやすくなります。

Page 12 of 15

Powered by WordPress & Theme by Anders Norén