あるまげどーーーん

某ITベンチャー会社に所属する技術者たちの自習室

VPS上にNextclowd構築

きりんです。前の投稿からだいぶ空いてしまいました...

自分専用のオンラインストレージ・CalDAVサーバ・CardDAVサーバが欲しくてレンタルサーバーにNextcloudをインストールして利用してきましたが、数年使って動きが悪くなってきたので心機一転VPS上に新しい環境を用意し、最新バージョンのNextcloud(16.0.3)を構築することにしました。

また、個人情報満載なのでhttps運用必須なのですが、今までは有料のサーバ証明書を購入してました。これも環境を変えるついでに無料で使えるLet's Encryptのサーバ証明書を試してみることにしました。

事前準備

VPSにOSをインストールしてsshでアクセスできるようにしておきます。今回はCentOS7のテンプレートを利用しました。

また、ドメインの取得やDNSの設定なども先に済ませておくとよいでしょう。今まではレンタルサーバと一緒にドメイン名も取得していましたが、利用するサーバ(業者)を変えたときにレジストラの移転をしなくて済むよう、別途ドメイン販売会社から購入することにしました。 (DNSサーバをタダで使わせてくれるところだと色々使いまわせて便利です)

設定項目等

インストール前に決めておいた方がいい内容を書き出してみました。ここに書き出したもの以外にも各種パスワードなどを決めてインストール中に入力する必要があります。 環境や好みに合わせて内容は変えてください。

項目 内容
ドメイン 公開するサイトのドメイン名(例:example.com
サイトのURL https://(ドメイン名)
Nextcloudインストール先 /var/nextcloud
Nextcloudデータディレクト /var/nextcloud-data
RDBMS MariaDB
データベース名 nextcloud_db
DBユーザー名 nc_admin

PHPインストール

NextcloudはPHPで動作するため、必要なモジュールとともにインストールします。

 # yum install epel-release
 # yum install http://rpms.famillecollet.com/enterprise/remi-release-7.rpm
 # yum install --enablerepo=remi,remi-php72 php php-devel php-mbstring php-pdo php-gd php-xml php-mcrypt php-mysql php-pecl-zip php-intl php-process php-imagick php-gmp php-curl php-apcu

 # vi /etc/php.ini
 ...
-memory_limit = 128M
+memory_limit = 512M
 ...
-date.timezone = 
+date.timezone = "Asia/Tokyo"
 ...
-;mbstring.language = Japanese
+mbstring.language = Japanese

httpdのインストール

Let's Encryptではhttp経由(ドキュメントルートディレクトリ経由)で証明書を取得するので、まずは外部からWebサーバにアクセスできるようにします。

 # yum install httpd
 # vi /etc/httpd/conf/httpd.conf
 ...
+ServerName (ドメイン名):80
 ...

 # chown -R apache:apache /var/www/html
 # systemctl enable httpd
 # systemctl start httpd

firewalldの設定

httpとhttpssshでアクセスできるようにします。

 # firewall-cmd --get-default-zone
 public

 # firewall-cmd --set-default-zone=drop
 # firewall-cmd --add-service=http --permanent
 # firewall-cmd --add-service=https --permanent
 # firewall-cmd --add-service=ssh --permanent
 # firewall-cmd --reload

Let's Encrypt(certbot)のインストール

certbotをインストールして実行することで、http経由でサーバ証明書が取得できます。

 # yum install certbot python-certbot-apache
 # certbot certonly --webroot -w /var/www/html -d (ドメイン名) -m (メールアドレス) --agree-tos -n

取得したサーバ証明書は以下に保存されます。

種類 保存先
証明書 /etc/letsencrypt/live/(ドメイン名)/cert.pem
秘密鍵 /etc/letsencrypt/live/(ドメイン名)/privkey.pem
中間CA証明書 /etc/letsencrypt/live/(ドメイン名)/chain.pem

MariaDBのインストール

今回はDBにMariaDBを選択しました。

 # yum install mariadb mariadb-server
 # vi /etc/my.cnf.d/server.cnf
 ...
 [mysqld]
+character-set-server = utf8
+innodb_large_prefix = on
+innodb_file_format = barracuda
+innodb_file_per_table = true
 
 # systemctl start mariadb
 # systemctl enable mariadb

インストールが完了したらDBの初期化を行います。

 # mysql_secure_installation

 Enter current password for root (enter for none): y

 Set root password? [Y/n] y
 New password: (ルート権限のパスワード)
 Re-enter new password: (確認のためもう一度入力)

 Remove anonymous users? [Y/n] y

 Disallow root login remotely? [Y/n] y

 Remove test database and access to it? [Y/n] y

 Reload privilege tables now? [Y/n] y

 # mysql -u root -p
 > CREATE DATABASE nextcloud_db;
 > GRANT ALL PRIVILEGES ON nextcloud_db.* TO nc_admin@localhost IDENFIFIED BY '(DBユーザーのパスワード)';
 > FLUSh PRIVILEGES;
 > quit

Nextcloudのインストール

Nextcloudをダウンロードしチェックサムを確認、問題がなければ解凍しディレクトリを移動します。

 # yum install wget bzip2

 # wget https://download.nextcloud.com/server/releases/nextcloud-16.0.3.tar.bz2
 # wget https://download.nextcloud.com/server/releases/nextcloud-16.0.3.tar.bz2.md5
 # wget https://download.nextcloud.com/server/releases/nextcloud-16.0.3.tar.bz2.asc
 # md5sum -c nextcloud-16.0.3.tar.bz2.md5 < nextcloud-16.0.3.tar.bz2
 # gpg --import nextcloud.asc
 # gpg --verify nextcloud-16.0.3.tar.bz2.asc nextcloud-16.0.3.tar.bz2
 # tar -xvjf nextcloud-16.0.3.tar.bz2
 # mv nextcloud /var
 # chown -R apache:apache /var/nextcloud
 # mkdir /var/nextcloud-data
 # chown apache:apache /var/nextcloud-data

httpsでサーバを公開するための設定を行います。

 # vi /etc/httpd/conf.d/nextcloud.conf
+<VirtualHost *:443>
+  ServerName (ドメイン名)
+  DocumentRoot /var/nextcloud/
+  SSLEngine on
+  SSLCertificateFile /etc/letsencrypt/live/(ドメイン名)/cert.pem
+  SSLCertificateKeyFile /etc/letsencrypt/live/(ドメイン名)/privkey.pem
+  SSLCertificateChainFile /etc/letsencrypt/live/(ドメイン名)/chain.pem
+  <Directory /var/nextcloud/>
+    Options +FollowSymLinks -Indexes
+    AllowOverride all
+    Require all granted
+  </Directory>
+</VirtualHost>
 
 # vi /etc/httpd/conf.d/security.conf
+ServerTokens Prod
+Header unset "X-Powerd-By"
+RequestHeader unset Prox
+Header append X-Frame-Options SAMEORIGIN
+Header set X-XSS-Protection "1; mode=block"
+Header set x_Content-Type-Options nosniff
+TraceEnable Off

 # vi /etc/httpd/conf.d/ssl.conf
 ...
 <VirtualHost _default_:443>
 ...
-SSLProtocol all -SSLv2 -SSLv3
-SSLCipherSuite HIGH:3DES:!aNULL:!MD5:!SEED:!IDEA:!RC4
 ...
 </VirtualHost>
 ...
+SSLProtocol all -SSLv2 -SSLv3
+SSLCipherSuite HIGH:3DES:!aNULL:!MD5:!SEED:!IDEA:!RC4
+SSLHonorCipherOrder On
+Header set Strict-Transport-Security "max-age=31536000"

 # cat /dev/null > /etc/httpd/conf.d/autoindex.conf ;
 # cat /dev/null > /etc/httpd/conf.d/welcome.conf ;

ここまで来たらブラウザでhttps://(ドメイン名)を開き、表示された設定画面に必要な情報を入力すれば初期設定が開始され、Nextcloudが利用可能になります。

入力する情報は、

  • 管理者アカウント名
  • 管理者アカウントパスワード
  • Nextcloudのデータディレクトリ(/var/nextclod-data)
  • 利用するDBの選択(MySQL/MariaDB
  • DBユーザー名(nc_admin)
  • DBユーザーパスワード
  • データベース名(nextcloud_db)
  • ホスト名、ポート番号(localhost:3306)

となります。

残作業

ここまでの作業でNextcloudを利用することができるようになりますが、以下の設定を追加で行う予定です。

  • 証明書の自動チェック・取得
  • DB、データのバックアップ
  • ログローテートの設定
  • セキュリティ設定

それから、Header append X-Frame-Options SAMEORIGINの設定が有効になってない気がするので、後で見直します。