Skip to content

グループウェア「GroupSession」の導入手順を検討した際のメモ

オープンソースのGroupSessionをLinuxにインストールし、Webからアクセスできるように設定する検討をしたときの手順のメモ。

OS基本設定

OSは、公式の推奨するサーバ環境のうち、CentOS 7を選択する。

ロケール設定

設計

ロケールは日本、文字コードはUTF-8とする

設定手順

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
# 現状のロケール設定の確認
localectl status

# 上記の戻り値が設計通りであれば、以降の手順は不要
# 設定の変更
localectl set-locale LANG=ja_JP.utf8

# 設定内容の確認
cat /etc/locale.conf

# 設定内容の反映
source /etc/locale.conf

時刻設定

設計

時刻設定として、タイムゾーンは Asia/Tokyo、時刻サーバの参照先は ntp.nict.jp とする

設定手順

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
# 現在の設定内容の確認
timedatectl
# 上記の戻り値が設計通りであれば、以降の手順は不要

# タイムゾーンの設定
timedatectl set-timezone Asia/Tokyo

# 上記の戻り値の NTP synchronized が No の場合は、以降の手順で設定を行う
# chrony がインストールされているかの確認
which chronyd

# なければ、以下の手順でインストールを行う
yum install chronyd

# 設定ファイルのバックアップ
cp -a -p /etc/chrony.conf/etc/chrony.conf.org

vi /etc/chrony.conf
---
# すべての server を ntp.nict.jp とする
server ntp.nict.jp
server ntp.nict.jp
server ntp.nict.jp
---

# 自動起動設定
systemctl enable chronyd

# 起動
systemctl start chronyd

# 動作状況の確認
chronyc sources -v
---
# 以下のような表示が出ていれば成功している
^+ ntp-a3.nict.go.jp 1 6 77 59 +972us[ +972us] +/- 5667us
^- ntp-b2.nict.go.jp 1 6 77 61 +1423us[+1423us] +/- 3830us
^* ntp-a2.nict.go.jp 1 6 77 62 +269us[ +547us] +/- 4458us

SSH設定

設計

接続ユーザ
ユーザ名 接続可否 目的
root 許可しない 一般的な特権ユーザ名でのSSH接続は不可とする。 ブルートフォースアタック対応のため。
$SSH_USER 許可 SSH接続ユーザとして設定する。 ただし、ブルートフォースアタックを回避するために、パスワード認証を不可とし、SSH公開鍵認証とする
認証方式

パスワード認証を不可とし、SSH 公開鍵認証とする。 ブルートフォースアタックを回避するため。

設定手順

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
# インストールの確認
yum list installed | grep ssh

# インストールされていなければ以下の通りインストールする
yum install -y openssh-server

# 公開鍵の設定

## 以下の作業はローカルマシンで行う
# 公開鍵、秘密鍵の生成
ssh-keygen -t rsa -b 4096 -f $PRIVATE_KEY

# 公開鍵のサーバへの配置
ssh-copy-id -i ~/.ssh/$PUBLIC_KEY $SSH_USER@$SERVER_IP

# 公開鍵認証でのSSH接続の確認
ssh -i $PRIVATE_KEY $SSH_USER@$SERVER_IP

# sshd設定
# 以下の作業は、公開鍵認証でのSSH接続ができることを確認してから実施する
# PermitRootLogin の設定を変更し、rootでのログインを不可にする
# PasswordAuthentication の設定を変更し、パスワード認証でのログインを不可にする
vi /etc/ssh/sshd_config
---
## 38行目
## コメントアウトまたは no とする
- PermitRootLogin yes
+ #PermitRootLogin yes

## 61行目
## コメントアウトまたは no とする
- PasswordAuthentication yes
+ #PasswordAuthentication yes
---

# sshdの再起動
systemctl restart sshd

Firewall設定

設計

ポート
ポート リソース(接続元) 目的
22 $LOCAL_IP SSH接続を可能とする拠点を限定的にする
80 0.0.0.0/0 Let’s Encrypt certbot の通信だけを通し、それら以外の通信はすべてHTTPSにリダイレクトする
443 0.0.0.0/0 利用者の接続元IPアドレスを特定できないためすべてのIPアドレスからの接続を受け付ける
8080 0.0.0.0/0 Tomcat初期インストール時点での動作・表示確認のみに利用。 Tomcatの動作確認後は削除する

設定手順

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
# インストールの確認
yum list installed | grep firewalld

# インストールされていなければ以下の通りインストールする
yum install -y firewalld

# firewalld の起動、自動起動設定
sudo systemctl enable firewalld
sudo systemctl start firewalld

# 設計の通り、以下の手順でポートごとの設定を投入する
firewall-cmd --add-rich-rule='rule family=ipv4 source address=$LOCAL_IP port protocol=tcp port=22 accept' --permanent --zone=public
firewall-cmd --add-service=http --zone=public --permanent
firewall-cmd --add-service=https --zone=public --permanent
firewall-cmd --add-port=8080/tcp --zone=public --permanent

# 設定の反映
firewall-cmd --reload

# 設定状況の確認
firewall-cmd --list-all

# 設計通りの結果が返ってくれば問題なく設定できている。

SELinuxの無効化

方針

SELinuxは無効化するものとする。 うまく利用すればセキュリティが向上するが、設定項目が多岐にわたり、設定の複雑さなどからくるサーバー管理のしにくさが上回ると判断したため。

設定手順

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
# 現在の設定を確認する
getenforce
# Disabled が返ってきたときは既に無効化されているので、以降の手順は不要

# Enforcing が返ってきたときは、以下の手順で恒久的な無効化をする

vi /etc/selinux/config
---
- SELINUX=enforcing
+ #SELINUX=enforcing
SELINUX=Disabled
---

# 再起動
reboot

ミドルウェア設定

Javaのインストールディレクトリは /usr/local/java とする

Adopt Open Java Development Kit 11

  1. AdoptOpenJDK へアクセスし、最新バージョンのダウンロードURLを控えておく。 また、ファイルは 2021年7月時点の最新版 jdk-11.0.11+9 を利用する

  2. 以下の手順でインストールを行う

1

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
# ディレクトリの作成と移動
mkdir /usr/local/java
cd /usr/local/java

# Adopt Open Java Development Kit 11 のダウンロードと展開
wget https://github.com/AdoptOpenJDK/openjdk11-binaries/releases/download/jdk-11.0.11%2B9/OpenJDK11U-jdk_x64_linux_hotspot_11.0.11_9.tar.gz
tar -zxvf OpenJDK11U-jdk_x64_linux_hotspot_11.0.11_9.tar.gz

# .bash_profileへのパスの追加
echo "JAVA_HOME=/usr/local/java/jdk-11.0.11+9" >> /root/.bash_profile
echo "PATH=\$JAVA_HOME/bin:\$PATH" >> /root/.bash_profile
echo "export PATH" >> /root/.bash_profile

# 設定の反映
source /root/.bash_profile

# インストール状況の確認
java -version
---
# 以下のように 11.0.11 の文字列が返ってくれば問題なく設定が出来ている
openjdk 11.0.11 2021-04-20
OpenJDK Runtime Environment AdoptOpenJDK-11.0.11+9 (build 11.0.11+9)
OpenJDK 64-Bit Server VM AdoptOpenJDK-11.0.11+9 (build 11.0.11+9, mixed mode) 

Tomcatの設定

  1. Apache Software Foundationのサイト にアクセスし、tar.gz形式の最新バージョンのダウンロードURLを控えておく。 また、ファイルは 2021年7月時点の最新版 9.0.50 を利用する。

  2. 以下の手順でインストールを行う

1

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
# ディレクトリの移動
cd /usr/local/java

# Tomcat のダウンロードと展開
wget https://ftp.tsukuba.wide.ad.jp/software/apache/tomcat/tomcat-9/v9.0.50/bin/apache-tomcat-9.0.50.tar.gz
tar -zxvf apache-tomcat-9.0.50.tar.gz

# .bash_profileへのパスの追加
echo "JAVA_HOME=/usr/local/java/jdk-11.0.11+9" >> /root/.bash_profile
echo "PATH=\$JAVA_HOME/bin:\$PATH" >> /root/.bash_profile
echo "export PATH" >> /root/.bash_profile
echo "CATALINA_HOME=/usr/local/java/apache-tomcat-9.0.50" >> /root/.bash_profile
echo "PATH=\$CATALINA_HOME/bin:\$PATH" >> /root/.bash_profile
echo "export PATH" >> /root/.bash_profile

# 設定の反映
source /root/.bash_profile

# Tomcatの起動
/usr/local/java/apache-tomcat-9.0.50/bin/startup.sh

# この後、ブラウザから http://$SERVER_IP:8080 へアクセスし、
# Tomcatの初期画面が表示されることを確認する

# Tomcatの停止
/usr/local/java/apache-tomcat-9.0.50/bin/shutdown.sh 

GroupSession

  1. 公式サイト から最新バージョンの gsession.war をダウンロードする。 また、ファイルは2021年7月時点の最新版 5.1.0 を利用する。

  2. scpでサーバのホームディレクトリへ転送し、以下の通り設置・設定をする

1

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
# バイナリの配置
mv /home/$SSH_USER/gsession.war
/usr/local/java/apache-tomcat-9.0.50/webapps/gsession.war

# Tomcatの起動
/usr/local/java/apache-tomcat-9.0.50/bin/startup.sh

# この後、ブラウザから http://$SERVER_IP:8080/gsession へアクセスし、
# GroupSessionの初期画面が表示され、初期パスワードでログインできることを確認する

# GroupSession ドキュメントルートの変更
# ドキュメントルートを変更し、URLから /gsession を隠す
vi /usr/local/java/apache-tomcat-9.0.50/conf/server.xml
--- # 155行目付近に以下の4行を追記
WEB-INF/web.xml
---

# Tomcatの停止と起動
/usr/local/java/apache-tomcat-9.0.50/bin/shutdown.sh
/usr/local/java/apache-tomcat-9.0.50/bin/startup.sh

# この後、ブラウザから http://$SERVER_IP:8080/ へアクセスし、
# GroupSessionの初期画面が表示され、初期パスワードでログインできることを確認する 

Nginx

以下の目的で、Nginxをリバースプロキシとして利用

  • 8080番ポートを隠す

  • Let's Encryptによる常時SSL化

1

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
# Nginx のインストール
yum install -y nginx

# GroupSession用の設定の作成
vi /etc/nginx/conf.d/groupsession.conf
---
server{
     listen              80;
     server_name         $SERVER_IP;
     root                /usr/local/java/apache-tomcat-9.0.50/webapps/ROOT;
     access_log          /var/log/nginx/access.log;
     error_log           /var/log/nginx/error.log;
     location / {
         proxy_pass      http://localhost:8080/;
     }
 }
---

# Nginxの起動と、自動起動設定
systemctl enable nginx
systemctl start nginx

# この後、ブラウザから http://$SERVER_IP/ へアクセスし、
# GroupSessionの初期画面が表示され、初期パスワードでログインできることを確認する 

SSH 不要ポートの制限

上記手順で、8080での確認とアクセスが不要となるので、以下の通り実施し、ポート設計の通りとする。

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
# 8080/tcp の設定を削除
firewall-cmd --remove-port=8080/tcp --zone=public --permanent

# 設定の反映
firewall-cmd --reload

# 設定状況の確認
firewall-cmd --list-all

# この後、ブラウザから https://$FQDN:8080/ https://$SERVER_IP:8080/ へアクセスし、
# アクセスができなくなっていることを確認する。

Let's Encrypt

DNS設定が完了し、FQDNでアクセスできるようになってから、以下の手順を実施し、SSL接続でのアクセスをできるようにする。

  1
  2
  3
  4
  5
  6
  7
  8
  9
 10
 11
 12
 13
 14
 15
 16
 17
 18
 19
 20
 21
 22
 23
 24
 25
 26
 27
 28
 29
 30
 31
 32
 33
 34
 35
 36
 37
 38
 39
 40
 41
 42
 43
 44
 45
 46
 47
 48
 49
 50
 51
 52
 53
 54
 55
 56
 57
 58
 59
 60
 61
 62
 63
 64
 65
 66
 67
 68
 69
 70
 71
 72
 73
 74
 75
 76
 77
 78
 79
 80
 81
 82
 83
 84
 85
 86
 87
 88
 89
 90
 91
 92
 93
 94
 95
 96
 97
 98
 99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
# certbot のインストール
yum install -y certbot

# Nginx での Let's Encrypt による通信用ルートディレクトリの作成
#
# certbot によるLet's Encrypt SSL証明書取得時に、80番ポートを利用した、
# http://$FQDN/.well-known へのアクセスが可能かどうかのチェックがあるため
#
mkdir -p /var/www/ssl/.well-known

# Nginx コンフィグの調整-01
vi /etc/nginx/conf.d/groupsession.conf
---
server{
  listen              80;
  server_name         $SERVER_IP;

  root                /usr/local/java/apache-tomcat-9.0.50/webapps/ROOT;

  access_log          /var/log/nginx/access.log;
  error_log           /var/log/nginx/error.log;

  # /.well-knownとしてアクセスしたときのドキュメントルートを追加
  location /.well-known {
    root              /var/www/ssl/;
  }

  location / {
    proxy_pass        http://localhost:8080/;
    }
}
---

# SSL証明書の発行
sudo certbot certonly --webroot -w /var/www/ssl -d $FQDN --email $MAIL_ADDR

# 以下のように返ってくればOK
Saving debug log to /var/log/letsencrypt/letsencrypt.log
Plugins selected: Authenticator webroot, Installer None
Requesting a certificate for $FQDN
Performing the following challenges:
http-01 challenge for $FQDN
Using the webroot path /var/www/ssl for all unmatched domains.
Waiting for verification...
Cleaning up challenges

IMPORTANT NOTES:
 - Congratulations! Your certificate and chain have been saved at:
   /etc/letsencrypt/live/$FQDN/fullchain.pem
   Your key file has been saved at:
   /etc/letsencrypt/live/$FQDN/privkey.pem
   Your certificate will expire on 2021-10-20. To obtain a new or
   tweaked version of this certificate in the future, simply run
   certbot again. To non-interactively renew *all* of your
   certificates, run "certbot renew";
 - If you like Certbot, please consider supporting our work by:

   Donating to ISRG / Let s Encrypt:   https://letsencrypt.org/donate
   Donating to EFF:                    https://eff.org/donate-le

# Nginx コンフィグの調整-02
vi /etc/nginx/conf.d/groupsession.conf
---
server{
  listen               443 ssl;
  server_name          $SERVER_IP;

  root                 /usr/local/java/apache-tomcat-9.0.50/webapps/ROOT;

  access_log           /var/log/nginx/access.log;
  error_log            /var/log/nginx/error.log;

  ssl_certificate      /etc/letsencrypt/live/$FQDN/fullchain.pem;
  ssl_certificate_key  /etc/letsencrypt/live/$FQDN/privkey.pem;

  # /.well-knownとしてアクセスしたときのドキュメントルートを追加
  location /.well-known {
    root               /var/www/ssl/;
  }

  location / {
    proxy_pass         http://localhost:8080/;
  }
}
---

# Nginxの起動と、自動起動設定
systemctl restart nginx

# この後、ブラウザから https://$FQDN/ へアクセスし、
# HTTPSでGroupSessionの初期画面が表示され、初期パスワードでログインできることを確認する

# ただし、この状態で http://$FQDN/ へアクセスすると、
# 正しくページが表示できないので、以下の通り Nginx のコンフィグを調整し、
# 以下の目的を果たすことができるようにする。
#
#  1. certbotの通信は80番ポートで http://$FQDN/.well-known への通信はさせつつ、
#  2. それ以外の http://$FQDN/ へのアクセスは https://$FQDN/ へリダイレクトする
#

# Nginx コンフィグの調整-03
vi /etc/nginx/conf.d/groupsession.conf
---
server{
  listen              80;
  server_name         $SERVER_IP;

  location /.well-known {
    root              /var/www/ssl/;
  }

  location / {
    return 301 https://$host$request_uri;
  }
}

server{
  listen              443 ssl;
  server_name         $SERVER_IP;

  root                /usr/local/java/apache-tomcat-9.0.50/webapps/ROOT;

  ssl_certificate     /etc/letsencrypt/live/$FQDN/fullchain.pem;
  ssl_certificate_key /etc/letsencrypt/live/$FQDN/privkey.pem;

  access_log          /var/log/nginx/access.log;
  error_log           /var/log/nginx/error.log;

  location / {
    proxy_pass        http://localhost:8080/;
  }
}
---

# Let's Encrypt SSL証明書の更新テスト

# certbot コマンドの場所を確認
which certbot
/usr/bin/certbot

# Let's Encrypt SSL証明書の更新コマンドの実行
# --force-renewal オプションをつけると、
# 証明書期限前でも強制的に更新をしてくれる
#
# ただし、やりすぎると、Let's Encrypt の取得上限に引っかかるので
# あまりやりすぎないようにする
/usr/bin/certbot renew --force-renewal

# 以下のように返ってくればOK
---
Saving debug log to /var/log/letsencrypt/letsencrypt.log

- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
Processing /etc/letsencrypt/renewal/$FQDN.conf
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
Plugins selected: Authenticator webroot, Installer None
Renewing an existing certificate for $FQDN

- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
new certificate deployed without reload, fullchain is
/etc/letsencrypt/live/$FQDN/fullchain.pem
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -

- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
Congratulations, all renewals succeeded: 
  /etc/letsencrypt/live/$FQDN/fullchain.pem (success)
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
---

# SSL証明書更新の自動化
# 以下は、root ユーザで実行する
#
# 念のため which systemctl を実行して、
# systemctl コマンドの場所も確認しておく
#
crontab -e
---
# CRONによるSSL証明書の更新を毎月1日の午前2時に実行
# 実行後に忘れずにNginxを再起動する
MAILTO=$MAIL_ADDR
0 2 1 * * /usr/bin/certbot && /usr/bin/systemctl reload nginx
---