ownCloudの内部構造と設定方法
ownCloudの内部構造について
今回は、ownCloudの内部構造の説明と前回お伝えし切れなかった細かな設定内容、そして皆さんが気になっているであろうownCloudのパフォーマンスチューニングについて解説したいと思います。
内部構造
まずownCloudの内部は以下のような構造になっています。
これは一番下にOSがあり、WebサーバーやDBサーバー、セッションサーバーがその上で動いていて、PHPからアクセスするという図になっています。そしてownCloudは、そのPHPの実行基盤の上にownCloudのフレームワークとなるcoreが稼働しています。ownCloudのフレームワークのcoreの上でownCloudのアプリケーションが動いています。
上記のApplicationの枠の中は以下のようになっており、ownCloudの様々な機能が一つ一つ別のアプリケーションとして実装されています。
ownCloudのアプリケーション
これにより、ownCloudは機能を様々に拡張できる仕組みを備えています。この拡張できる仕組みはownCloudに大きな柔軟性をもたらしています。通常のオンラインストレージサービスとの違いはここにもあります。インターネットサービスとしてのオンラインストレージサービスはユーザー毎のカスタマイズは提供されません。画一的なインターフェースや機能を提供することにより、インターネットサービスとして低価格やオペレーションのしやすさを確保しています。
しかし、ユーザーや企業によりニーズや使い方が違います。すべての会社に対してすべて要求に沿うような機能、使い勝手を提供することはできません。そこがインターネットサービスとしてのオンラインストレージの欠点にもなっています。ところが、オンプレミスやユーザー個別のクラウドにセットアップするownCloudではこの拡張性を活用して必要な機能を追加したり削除したりできるので、ニーズに合ったオンラインストレージを構築できるのです。
設定やデータの保存先
ownCloudの構造はわかりましたが、ownCloudのデータはどこに入っているのでしょうか? ownCloudに入っている情報は、ひとくちにデータと言っても様々な種類があります。
- ユーザーが保存した情報
- ownCloudがシステムとして動くために必要な情報
- ownCloudを動かす為に必要なミドルウェアの設定情報
の3種類です。
上記の3種類のデータが、
- 設定ファイル
- データベース
- ファイルシステム
- 外部ストレージ、外部サーバー
に保存されています。
これらの情報の設定場所は以下の図で表すことができます。
左のセッションデータは、ownCloudにログインした後に自動的に生成されるデータでログインしている間に必要なものです。この情報がなくなるとログアウトした状態になり再度ログインを求められます。
DBサーバーのデータは、ユーザー情報や、ファイルのメタ情報、ownCloudのアプリの情報が入っています。特にユーザー情報とファイルのメタ情報は重要です。ユーザー情報はパスワードのハッシュ情報が入っています。ファイルのメタ情報はファイルに関する「所有者」や「ファイルのハッシュ情報」、「更新日付」「ファイル名」「ファイルパス」等が入っています。
ファイルシステムには、ユーザーがアップロードしたファイルが入っています。その他にもゴミ箱ファイルや、履歴ファイル、画像のサムネイルファイル、暗号化を利用した場合の鍵ファイルも保存されます。
通常のセットアップでは、ユーザーデータは /var/www/html/owncloud/data/ に保存されますが、別のところに移動することも可能です。
次に、.htaccess と .user.ini です。これは、Apacheの設定とPHPの設定を保存しています。
では、これらの情報を以下のように分類して設定を見ていくことにします。この時点ではパフォーマンス的な観点ではなく、セキュリティや運用といった観点で設定を行います。
- config.php
- ウェブサーバーのSSL設定
- Firewallの設定
- SELinux
一番重要なのが、ownCloud のconfig.php です。これは、ownCloudのアプリケーションのディレクトリ配下の config というディレクトリに入っています。この config.php でDB接続設定や、メモリキャッシュ設定、ログ出力先、メール設定などを設定します。
次に必要なのが、ウェブサーバーの設定です。前回のインストールでは、Apacheを使いましたが、本来はもう少し設定しなければならないことがあります。これ以外にもセキュリティを高めるために、FirewallやSELinuxなども設定しておいた方がいいでしょう。
config.php について
それでは、config.php から設定を見ていくことにしましょう。前回、CentOSにインストールしたマシンの config.php を見てみましょう。CentOSにRPMでインストールした場合は、以下になります。
/var/www/html/owncloud/config/config.php
config.phpにはいくつかの情報が既に入っています。これは、ブラウザーUIからownCloudを初期設定した時に生成されて入るものです。自動的に生成されるものもありますし、入力情報がそのままconfig.phpに転記されているものもあります。
ここで、config.php の大事さについて一番最初に説明しておきます。config.php には、パスワードソルトというものが入っています。これはパスワードをハッシュ化するときに、パスワードに追加するものです。これにより同じパスワードでもハッシュの値が違うものになりますので、総当たりによるパスワードクラックに対する耐性が上がります。
"パスワード文字列"+"パスワードソルト" ⇒ ハッシュ化
ここで "パスワードソルト" が失われるといくら正しいパスワードを入力していてもログインできなくなります。そうなった場合は、ユーザーのパスワードを全部付け直しという荒技もありますが、そういう事態は極力避けるべきでしょう。バックアップ取得対象として忘れないようにしてください。
もう一つの重要な情報は、データベースへの接続パスワードが書かれていると言うことです。データベースの中には、ownCloudの設定情報が入っていますがデータベースに接続するためのパスワードをそこには書くことができません。データベースへの接続パスワードは外に書いておかなければなりません。当然、データベースへの接続パスワードは暗号化もされていませんので平分で見ることができてしまいます。接続IDとパスワードがあれば誰でも接続できてしまいます。
config.php は上記のような重要な情報が入っていますので取り扱いには注意をお願いいたします。
デフォルトでは以下のような設定値が入っています。
設定項目名 | 設定内容 | デフォルト値 |
---|---|---|
updatechecker | ownCloudのアップデートがあるか管理画面で知らせる | True |
instanceid | ownCloudのインストールを一意に示すID | 自動生成 |
passwordsalt | ユーザーのパスワードハッシュ化に利用するソルト | 自動生成 |
secret | ownCloud暗号フレームワークで利用する文字列 | 自動生成 |
trusted_domains | ホストヘッダーインジェクション対策用のドメイン名 ownCloudを動かすドメイン名、IPアドレスを記載 | 設定時のIPアドレス |
datadirectory | ownCloudのユーザー毎のファイルを保管するディレクトリの大元のディレクトリ | 初期設定画面で選択したもの |
overwrite.cli.url | occコマンドで接続するownCloudのURLを指定 | http://<owncloudのIPアドレス> |
dbtype | ownCloudで利用するデータベースのサーバの種類 | 初期設定画面で選択したもの以下のものがある sqlite (SQLite3) mysql (MySQL/MariaDB) pgsql (PostgreSQL) oci (Oracle エンタープライズ版のみ) |
version | ownCloudのインストールされているバージョン | インストール時に自動設定 |
dbname | データベース名 | 初期設定画面で入力したもの |
dbhost | データベースサーバーのホスト名 | 初期設定画面で入力したもの |
dbtableprefix | データベースのテーブル名の前置文字列 | oc_ |
dbuser | データベース接続ID | 初期設定画面で入力したもの |
dbpassword | データベース接続パスワード | 初期設定画面で入力したもの |
loglevel | ログの出力レベル | 0 = Debug 1 = Info 2 = Warning 3 = Error 4 = Fatal |
installed | 初期設定が完了しているかどうかのフラグ | true |
maintenance | メンテナンス中かどうかの設定 これがtrueの場合ユーザーがログインできなくなります。 | false |
その他の設定については config.php と同じフォルダに config.sample.php がありますので参考にしてください。ディストリビューションによっては入ってない場合もあります。その場合は、GitHubの config.sample.php を参考にされると良いでしょう。
デフォルトの設定は上記の通りですが、ログに関する設定を変更しておきましょう。
'logdateformat' => 'Y-m-d H:i:s', 'logtimezone' => 'Asia/Tokyo', 'loglevel' => 1,
です。行末の(,)を忘れないようにしてください。
上記でownCloudのログの日付が日本時間になり、ログの時刻フォーマットが "年ー月-日 時:分:秒" になります。
次に各ミドルウェアの設定を詳細に見ていくことにしましょう。
ApacheのSSL設定
SSL証明書
言うまでもないことですが、インターネット上ではデータの盗み見がどこでされていても不思議ではありません。インターネットからアクセスできるようにownCloudをセットアップする場合は必ずSSL証明書を設定しましょう。ドメインさえあれば、*1Let's Encryptで無料のSSL証明書を取得できるようになっています。
[*1] Let's Encrypt - Free SSL/TLS Certificates https://letsencrypt.org/
SSL設定
Apacheの設定ではあまりすることはありませんが、SSL証明書の設定についてはデフォルトではSSLv3が有効であるなど良くない設定がありますので修正します。
※1) SSL/TLS暗号設定ガイドライン~安全なウェブサイトのために(暗号設定対策編)~:IPA 独立行政法人 情報処理推進機構https://www.ipa.go.jp/security/vuln/ssl_crypt_config.html
vi /etc/httpd/conf.d/ssl.conf SSLProtocol all -SSLv2 -SSLv3
SSLv3は現在問題がある事が分かっていますので対応プロトコルから外す必要があります。
SSLHonorCipherOrder on SSLCompression off SSLSessionTickets off
サーバー側から暗号化スイートの順番を指定します。予期せぬ脆弱な暗号の選択を避けます。
SSLCipherSuite "EECDH+AESGCM:EECDH+AES:EDH+AES:-EDH+AESGCM:!DSS"
を最低限設定しましょう。
ログ保存場所の変更
ownCloudのログの保存場所は、config.php で設定します。ログの保存場所を作成して出力先を変更します。
# mkdir /var/log/owncloud/ # chown -R apache /var/log/owncloud/
# vi config.php 'logfile' => '/var/log/owncloud/owncloud.log',
設定を有効にするためにApacheを再起動します。
systemctl restart httpd
ログイン画面でパスワードをワザと間違えるとログが出力されます。 /var/log/owncloud/owncloud.log にファイルができていることを確認してください。
ログローテート
ログの出力先は変更しましたが、そのままではログファイルがずっと貯まってしまうのでログをローテートしておきましょう。
Apacheのセキュリティ設定
同様に、SSLの設定で HTTP Strict Transport Security (HSTS)の設定をしましょう。ssl.conf の最後の</VirtualHost>の前に以下の設定を追加してください。
Header always set Strict-Transport-Security "max-age=15768000; includeSubDomains; preload"
サブドメインでのアクセスを含まない場合は includeSubDomainsを削除してください。
バックアップ
バックアップは、以下の3つものをバックアップしてください。
- owncloudの config.php 設定ファイル
- DBのダンプ
- datadirectoryで示したディレクトリ
ここでは記載しませんが、バックアップはスクリプトでバックアップするようにして保存期間なども10日ぐらいで指定するとよいでしょう。
以上で、設定の基本的なところとセキュリティ設定、バックアップの方針について説明しました。次回はownCloudの動作を軽くするチューニングポイントについてお伝えする予定です。