script day.log

大学生がなんとなく始めた、趣味やら生活のことを記録していく。

ownCloudの構築

こんにちは。
テスト期間中なので、勉強しないといけないのですが、
どうもやる気が起きません。
そして今日のお話は、実は以前に組んだシステムのメモになります。

クラウドストレージ欲しい

はい、自前のクラウドストレージが欲しいです。
そう、覚えている方がいるかどうか怪しいので、
過去の記事を引用するので、思い出してください。

makose3p1229.hatenablog.com

そうです。サーバーを建てていましたね。
このサーバーはVPNだったり、Webだったり、
色々な機能を突っ込まれているのですが、
更にクラウドストレージを突っ込みます。
実際、保守の事を考えると分散するべきなのですが…
メインサーバーに仮想サーバーとかいいですねぇ。
せっかくのWindows Serverライセンスの持ち腐れ。
さぁ、落胆はこの辺にして、

なぜownCloud?

私が自前のクラウドストレージを作ろうと思ったとき、
思いついたのがownCloudだったから。
今ならNextCloudにする。

Let's 構築

構築環境としては、
ownCloud on nginx+PHP7+PHP-fpm+Let's Encrypt+ MariaDB
を想定してます。

今後、以下で紹介するコマンドが通らない場合、rootユーザで実行するか、
sudoコマンドを使うことで大抵は解決します(雑

普通に

yum install owncloud

しようと思っていたのですが、
パッケージを調べてみると、
「owncloud」と「owncloud-files」があるみたいで…
中身を見た感じ、
owncloud-files:owncloud単体
owncloud:Apache+PHPもインストールされるみたい。
MariaDBは入っていないみたいなので、
別インストールがおそらく必要。

ちなみに私はOSインストールの際に、MariaDBが入っているので
問題はなかったのですが…
最新バージョンが欲しい人はwgetして来ればいいと思うよ。

MariaDBのインストー

入れてない場合はインストールして。

$ yum -y install mariadb mariadb-server
$ rpm -qa | grep maria
mariadb-5.5.47-1.el7_2.x86_64
mariadb-server-5.5.47-1.el7_2.x86_64
mariadb-libs-5.5.47-1.el7_2.x86_64

my.cnfにて、文字コードの設定をしましょう。

[mysqld]
…
character-set-server=utf8
…

さあ、起動しましょう。

$ systemctl enable mariadb.service
$ systemctl start mariadb.service

MariaDBにowncloudユーザとデータベースを作成。

$ mysql_secure_installation

NOTE: RUNNING ALL PARTS OF THIS SCRIPT IS RECOMMENDED FOR ALL MariaDB
      SERVERS IN PRODUCTION USE!  PLEASE READ EACH STEP CAREFULLY!

In order to log into MariaDB to secure it, we'll need the current
password for the root user.  If you've just installed MariaDB, and
you haven't set the root password yet, the password will be blank,
so you should just press enter here.

Enter current password for root (enter for none):
OK, successfully used password, moving on...

Setting the root password ensures that nobody can log into the MariaDB
root user without the proper authorisation.

Set root password? [Y/n] ←空Enter
New password:   ←パスワード入力
Re-enter new password: ←パスワード入力
Password updated successfully!
Reloading privilege tables..
 ... Success!


By default, a MariaDB installation has an anonymous user, allowing anyone
to log into MariaDB 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? [Y/n] ←空Enter
 ... Success!

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? [Y/n] ←空Enter
 ... Success!

By default, MariaDB comes with a database named 'test' that anyone can
access.  This is also intended only for testing, and should be removed
before moving into a production environment.

Remove test database and access to it? [Y/n] ←空Enter
 - Dropping test database...
 ... Success!
 - Removing privileges on test database...
 ... Success!

Reloading the privilege tables will ensure that all changes made so far
will take effect immediately.

Reload privilege tables now? [Y/n] ←空Enter
 ... Success!

Cleaning up...

All done!  If you've completed all of the above steps, your MariaDB
installation should now be secure.

Thanks for using MariaDB!

$ mysql -u root -p
Enter password: ←初期セットアップコマンドで決めたパスワードを入力
mysql> CREATE DATABASE owncloud;
mysql> GRANT ALL ON owncloud.* to 'owncloud'@'localhost' IDENTIFIED BY 'owncloud';
nginxをインストー
$ rpm -ivh http://nginx.org/packages/centos/7/noarch/RPMS/nginx-release-centos-7-0.el7.ngx.noarch.rpm
$ yum -y update nginx-release-centos
$ yum -y --enablerepo=nginx install nginx
$ nginx -v
nginx version: nginx/1.8.1

CentOS7なので、間違えずnginx-release-centos-7-0.el7.ngx.noarch.rpm
リポジトリに追加し、インストール。

PHP7をインストー
$ yum install epel-release.noarch
$ rpm -Uvh http://rpms.famillecollet.com/enterprise/remi-release-7.rpm
$ yum install --enablerepo=remi --enablerepo=remi-php70 php php-opcache php-devel php-fpm php-gd php-pdo php-dom php-mbstring php-mcrypt php-mysqlnd php-mssql php-pecl-xdebug php-openssl php-json php-pecl-apcu php-pdo_sqlite php-pdo_mysql php-pecl-memcached php-bcmath php-msgpack php-ldap php-pecl-imagick php-pgsql php-pecl-pthreads php-pecl-msgpack php-posix php-pecl-zip
nginxの設定 towards PHP-FPM(FastCGI)&ownCloud

/etc/php-fpm.d/www.confを以下のように変更。

sed -i -e 's/listen = 127.0.0.1:9000/listen = \/var\/run\/php-fpm\/php-fpm.sock/' /etc/php-fpm.d/www.conf
sed -i -e 's/;listen.owner = nobody/listen.owner = nginx/' /etc/php-fpm.d/www.conf
sed -i -e 's/;listen.group = nobody/listen.group = nginx/' /etc/php-fpm.d/www.conf

とりあえず一時的な設定ファイルを書きます。

$ vi /etc/nginx/conf.d/cloud.conf
upstream php-handler {
  #server 127.0.0.1:9000;
  server unix:/var/run/php-fpm/php-fpm.sock;
}

server {
  listen 80;
  server_name cloud.example.com; #ここを自分のアドレスに変更

  # Path to the root of your installation
  root /usr/share/nginx/html/owncloud;
  # set max upload size
  client_max_body_size 10G;
  fastcgi_buffers 64 4K;

  # Disable gzip to avoid the removal of the ETag header
  gzip off;

  # Uncomment if your server is build with the ngx_pagespeed module
  # This module is currently not supported.
  #pagespeed off;

  rewrite ^/caldav(.*)$ /remote.php/caldav$1 redirect;
  rewrite ^/carddav(.*)$ /remote.php/carddav$1 redirect;
  rewrite ^/webdav(.*)$ /remote.php/webdav$1 redirect;

  index index.php;
  error_page 403 /core/templates/403.php;
  error_page 404 /core/templates/404.php;

  location = /robots.txt {
    allow all;
    log_not_found off;
    access_log off;
  }

  location ~ ^/(?:\.htaccess|data|config|db_structure\.xml|README){
    deny all;
  }

  location / {
    # The following 2 rules are only needed with webfinger
    rewrite ^/.well-known/host-meta /public.php?service=host-meta last;
    rewrite ^/.well-known/host-meta.json /public.php?service=host-meta-json last;

    rewrite ^/.well-known/carddav /remote.php/carddav/ redirect;
    rewrite ^/.well-known/caldav /remote.php/caldav/ redirect;

    rewrite ^(/core/doc/[^\/]+/)$ $1/index.html;

    try_files $uri $uri/ /index.php;
  }

  location ~ \.php(?:$|/) {
    fastcgi_split_path_info ^(.+\.php)(/.+)$;
    include fastcgi_params;
    fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
    fastcgi_param PATH_INFO $fastcgi_path_info;
    fastcgi_param HTTPS on;
    fastcgi_pass php-handler;
  }

  # Optional: set long EXPIRES header on static assets
  location ~* \.(?:jpg|jpeg|gif|bmp|ico|png|css|js|swf)$ {
    expires 30d;
    # Optional: Don't log access to assets
    access_log off;
  }
}

サービスの起動と自動起動設定。

$ systemctl start php-fpm
$ systemctl start nginx
$ systemctl enable php-fpm
$ systemctl enable nginx
さあ、owncloud本体のインストー
$ wget http://download.owncloud.org/download/repositories/9.0/CentOS_7/ce:9.0.repo -O /etc/yum.repos.d/ce:9.0.repo
$ yum --installroot=/usr/share/nginx/html
$ chown -R nginx /usr/share/nginx/html/owncloud

or

$ curl -O 'https://download.owncloud.org/community/owncloud-9.0.1.zip'
$ unzip owncloud-9.0.1.zip
$ rm -f owncloud-9.0.1.zip
$ mv owncloud/ /usr/share/nginx/html/
$ chown -R nginx /usr/share/nginx/html/owncloud

さあ、あとはSSL証明書を発行して、設定し直して終了。

Let's Encryptで証明書発行

gitが入っていなければ

$ yum list installed git
# if don't exist
$ yum -y install git

$ git clone https://github.com/letsencrypt/letsencrypt
$ cd letsencrypt/
$ ./letsencrypt-auto --help

# -d でドメインを指定してください(単数、複数可)。
# -m でメールアドレス設定可(省略可)
$ ./letsencrypt-auto certonly --standalone -d cloud.example.com -d cloud1.example.com -m 自分のメールアドレス --agree-tos

セットアップ終了後

$ ls -l /etc/letsencrypt/live/cloud.example.com/

を実行して、生成した鍵が表示されれば問題なしです。

nginxの設定 towards HTTP/2

脆弱性のためにも古い形式の通信は断ち切りましょう。

$ vi /etc/nginx/conf.d/cloud.conf
upstream php-handler {
  #server 127.0.0.1:9000;
  server unix:/var/run/php-fpm/php-fpm.sock;
}

server {
  listen 80;
  server_name cloud.example.com; #ここを自分のアドレスに変更
  # enforce https
  return 301 https://$server_name$request_uri;
}

server {
  listen 443 ssl http2;
  server_name cloud.example.com;

  ssl_certificate /etc/letsencrypt/live/cloud.example.com/fullchain.pem;
  ssl_certificate_key /etc/letsencrypt/live/cloud.example.com/privkey.pem;
  ssl_protocols TLSv1 TLSv1.1 TLSv1.2;
  ssl_prefer_server_ciphers on;
  ssl_ciphers 'kEECDH+ECDSA+AES128 kEECDH+ECDSA+AES256 kEECDH+AES128 kEECDH+AES256 kEDH+AES128 kEDH+AES256 DES-CBC3-SHA +SHA !DH !aNULL !eNULL !LOW !kECDH !DSS !MD5 !EXP !PSK !SRP !CAMELLIA !SEED';
  ssl_session_cache    shared:SSL:10m;
  ssl_session_timeout  10m;

  # Path to the root of your installation
  root /usr/share/nginx/html/owncloud;
  # set max upload size
  client_max_body_size 10G;
  fastcgi_buffers 64 4K;

  # Disable gzip to avoid the removal of the ETag header
  gzip off;

  # Uncomment if your server is build with the ngx_pagespeed module
  # This module is currently not supported.
  #pagespeed off;

  rewrite ^/caldav(.*)$ /remote.php/caldav$1 redirect;
  rewrite ^/carddav(.*)$ /remote.php/carddav$1 redirect;
  rewrite ^/webdav(.*)$ /remote.php/webdav$1 redirect;

  index index.php;
  error_page 403 /core/templates/403.php;
  error_page 404 /core/templates/404.php;

  location = /robots.txt {
    allow all;
    log_not_found off;
    access_log off;
  }

  location ~ ^/(?:\.htaccess|data|config|db_structure\.xml|README){
    deny all;
  }

  location / {
    # The following 2 rules are only needed with webfinger
    rewrite ^/.well-known/host-meta /public.php?service=host-meta last;
    rewrite ^/.well-known/host-meta.json /public.php?service=host-meta-json last;

    rewrite ^/.well-known/carddav /remote.php/carddav/ redirect;
    rewrite ^/.well-known/caldav /remote.php/caldav/ redirect;

    rewrite ^(/core/doc/[^\/]+/)$ $1/index.html;

    try_files $uri $uri/ /index.php;
  }

  location ~ \.php(?:$|/) {
    fastcgi_split_path_info ^(.+\.php)(/.+)$;
    include fastcgi_params;
    fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
    fastcgi_param PATH_INFO $fastcgi_path_info;
    fastcgi_param HTTPS on;
    fastcgi_pass php-handler;
  }

  # Optional: set long EXPIRES header on static assets
  location ~* \.(?:jpg|jpeg|gif|bmp|ico|png|css|js|swf)$ {
    expires 30d;
    # Optional: Don't log access to assets
    access_log off;
  }
}
$ systemctl restart nginx

ブラウザのアドレスバー横に緑色で証明書が信頼されていますという表示になっていて、
かつページが正常に表示されていればOKです。
ただ証明書の有効期限が3ヶ月と短いので、自動更新を設定されることを
おすすめします。

makose3p1229.hatenablog.com
makose3p1229.hatenablog.com

SSL評価をもっとあげたい場合は、ssl_dhparamや
HSTSヘッダを追加してあげると良いと思います。

評価サイトの紹介
www.ssllabs.com

最後に

よいクラウドライフを!