Firestoreのセキュリティルールのこと
バックエンドをFirebaseでSPAのシステムを作る場合、データを守る砦はデータベース(今回はFirestore)のセキュリティルールです。
Authenticationのログイン情報とFirestore上のユーザー情報を紐付けし権限によりドキュメントへのアクセスを制限するなど、適切な設定しなければなりません。
service cloud.firestore {
match /databases/{database}/documents {
match /{document=**} {
allow read, write: if request.auth != null;
}
}
}
これは「ログインしているユーザーはフルアクセス」という最低限設定しておくべきルールです。開発中はお世話になりました。
しかし最終的にはもっとこまかく制限をかける必要がありますから、それを前提にデータ構造を設計しておいたほうが良いです。
例として今回作ったシステムのデータ構造とセキュリティルールの一部について解説します。
Nuxt.js 悩み解決の小ネタ集
ここ1ヶ月程Nuxt.js + FirebaseでSPAのシステムを作っていました。
短期構築がご要望でリアルタイム性が求められる内容。Firebaseに向いていると判断、提案したところ技術構成は自由にやらせていただけることになりました。
別件で一昨年末あたりからずっとバックエンドはLaravel、フロントエンドは素のVue.js + Vuex + Vue Routerで開発やってるんですが、PWA化したほうがよさそうだったこともあってNuxt.js(以降Nuxt)使ってみようかなってことで採用。
Nuxt、便利ですね。特にプラグインとミドルウェアが素敵!
Firebase(今回使用したのはAuthentication、Firestore、Hosting、Functions)との相性もバッチリでした。
ですが初めてということもありいろいろと悩んだりもするわけで…
それらをどう解決したか?の小ネタ集です(というか今回の落とし所、かな)
Nuxt.jsのbuild時にconsole.logを削除する
小ネタ集を書いていて分けておいたほうがよさそうだと思ったヤツ、その2。
nuxt buildでproductionビルドするときにconsole.logが削除されると良くないです?
良いですよね?なのでminifyを行うモジュールにはそういう機能が載っているようです。
Nuxt.jsのproduction時にconsole.logを削除する – くらげになりたい。
との情報を見つけました。ありがたい!
ですが、デフォルトのterser-webpack-pluginではなくuglifyjs-webpack-pluginに差し替えて実現されているとのこと。
この情報をもとに調査・実験をすすめたところterserのままでも可能でしたのでnuxt.config.jsのbuildの該当箇所を提示します(“nuxt”: “^2.4.0”)
Vuexのモジュールから他のモジュールのメソッドを呼ぶには
ESP32でディープラーニング
先日作った熱画像をリアルタイムで見れるシステムを改造し、ディープラーニングしてみました。
ジャンケンの3つのジェスチャーを、赤外線アレイモジュールからの入力データをもとに推論します。
ジャンケンの画像データを使いディープラーニングする、というアイデアは雑誌Interface1月号の記事のまねをさせていただきました。他にもいろいろと参考にさせていただきました。
なお、雑誌Interface1月号の記事ではソニーのSPRESENSEボード、および通常のカメラボードを使って行っています。
ディープラーニングのツールとしてNeural Network Console(NNC)のクラウドを使い学習させました。
学習済みモデルをNNPファイルとしてダウンロードし、NNPファイルをC言語ファイルに変換後、ESP32に組み込みました。
【2019/02/04 追記】NNP以外にNNB(Cランタイムフォーマット)でもESP32に組み込むことができることを確認しましたので、それも追記しました。
赤外線アレイセンサー「MLX90640」をESP32につないでWebSocketしてみました
- 2019/01/28
- suganuma
MLX90640搭載の赤外線アレイモジュールをESP32につないで熱画像データを取得、それをWebSocketを使いブラウザから熱画像をリアルタイムで見れるようにしました。
MLX90640は32 x 24のセンサーを搭載し、I2CでESP32と通信を行うことができます。
再帰的問い合わせで、複数点間の経路的な使い方
- 2018/12/28
- aikawa
High Sierra にアップグレードしててヤラレる
Google ColabでGPU使用時に異常終了する問題
- 2018/07/09
- suganuma
- Google Colaboratory
- ディープラーニング
ディープラーニングの開発環境に、Google Colaboratoryを使用しています。
その一番の理由は、GPU(Tesla K80 GPU)が使える、ということです。
Macbook proのCPUにやらせるよりも、10倍は早いです。
しかし何かの拍子に以下のようなエラーが出て、トレーニング中に止まってしまう問題が発生しました。
ネットで調べたところ、
https://github.com/googlecolab/colabtools/issues/156
他のpythonプロセスが動作してるのが問題らしいです。
以下のような感じで、他のpythonプロセスをキルしたら、正常に動作するようになりました。
!ps aux
!kill -9 <pid>
LibreOffice Online デモサーバを構築してみた。
- 2018/06/13
- fumikura
Nextcloud との連携編
前回の記事で、loolwsdのインストール・起動までを取り上げましたが、loolwsd単体では、実用性がほぼありません。
そこで、今回は、loolwsdのUIとなるべきフロントエンドとなるNextcloudのインストールと連携を取り上げます。
Nextcloud のインストール
http、PHPの必要モジュール等のインストール
まずはhttpdと必要なモジュールなどをインストールします。
[lool@scw-6b31f8 ~]$ sudo yum install httpd mod_ssl
[lool@scw-6b31f8 ~]$ sudo yum install --enablerepo=epel,webtatic mod_php72w php72w-mbstring php72w-common php72w-mysqlnd php72w-gd php72w-xml php72w-pdo
/etc/httpd/conf/httpd.confの設定
/etc/httpd/conf/httpd.confを編集し、初期設定を行います。
今回は差分を掲載しておきます。
[lool@scw-6b31f8 ~]$ diff -urw /etc/httpd/conf/httpd.conf.orig /etc/httpd/conf/httpd.conf
--- /etc/httpd/conf/httpd.conf.orig 2018-04-11 05:27:26.000000000 +0900
+++ /etc/httpd/conf/httpd.conf 2018-05-28 17:49:27.559577372 +0900
@@ -94,6 +94,15 @@
#
#ServerName www.example.com:80
+ServerTokens Prod
+Header unset X-Powered-By
+Header append X-Frame-Options SAMEORIGIN
+Header set X-XSS-Protetion "1; mode=block"
+Header set X-Content-Type-Options nosniff
+RequestHeader unset Proxy
+TraceEnable Off
+ServerSignature Off
+
#
# Deny access to the entirety of your server's filesystem. You must
# explicitly permit access to web content directories in other
@@ -141,14 +150,16 @@
# http://httpd.apache.org/docs/2.4/mod/core.html#options
# for more information.
#
- Options Indexes FollowSymLinks
+ #Options Indexes FollowSymLinks
+ Options FollowSymLinks
#
# AllowOverride controls what directives may be placed in .htaccess files.
# It can be "All", "None", or any combination of the keywords:
# Options FileInfo AuthConfig Limit
#
- AllowOverride None
+ #AllowOverride None
+ AllowOverride All
#
# Controls who can get stuff from this server.
バーチャルホストの設定
nextcloud,libre,loolの3ホストを利用します。libre,loolに関しては、同一サーバ内で構築する場合は不要かもしれません。(未検証)
今回のデモサーバを構築する前に検証用として構築していたサーバの構成が、Nextcloudサーバとloolwsdサーバが別サーバである
環境であった為、3ホストでの構成となってます。
Nextcloud <->libre(Proxy)<->lool
libreサーバはProxyとして入っています。
Nextcloud内のLibreOfficeとの連携アプリ「Collabora Online」がhttps接続のみしか受け付けない仕様となっていたので、
https(ポート443番)で受けて、loolサーバのポート番号9980番へ中継するという形です。
libreサーバを設けず、loolサーバのポート443番で受けて、loolサーバか、もしくはlocalhostの9980へ中継するという構成の方が妥当かもしれません。さらに言うならば…loolに関しては…loolwsdサーバそのものが通信相手なので、certbotでSSL証明書を更新し続けるためのダミーだったりします。
が、今回は…3ホスト構成という事で…(LB構成を意識したのはナイショです。)
Nextcloudのバーチャルホスト設定
<VirtualHost *:443>
Servername nextcloud.lancardcom.xyz
DirectoryIndex index.html index.php
DocumentRoot /var/www/nextcloud/
SSLEngine on
SSLProtocol all -SSLv2 -SSLv3
SSLCipherSuite ALL:!ADH:!EXPORT:!SSLv2:RC4+RSA:+HIGH:+MEDIUM:+LOW
SSLCertificateFile /etc/letsencrypt/live/nextcloud.lancardcom.xyz/cert.pem
SSLCertificateKeyFile /etc/letsencrypt/live/nextcloud.lancardcom.xyz/privkey.pem
SSLCertificateChainFile /etc/letsencrypt/live/nextcloud.lancardcom.xyz/chain.pem
Header set Strict-Transport-Security "max-age=31536000; includeSubDomains"
LogFormat "%h %l %u %t \"%r\" %>s %b \"%{Referer}i\" \"%{User-Agent}i\"" combined
CustomLog "|/usr/sbin/rotatelogs /var/log/httpd/nextcloud/ssl_access_log_%Y%m%d 86400 540" combined
ErrorLog /var/log/httpd/nextcloud/ssl_error_log
<Directory "/var/www/nextcloud/">
AllowOverride All
Options FollowSymLinks
</Directory>
</VirtualHost>
<VirtualHost *:80>
Servername nextcloud.lancardcom.xyz
RewriteEngine on
RewriteCond %{HTTPS} off
RewriteRule ^(.*)$ https://%{HTTP_HOST}%{REQUEST_URI} [R,L]
DirectoryIndex index.html index.php
DocumentRoot /var/www/nextcloud/
LogFormat "%h %l %u %t \"%r\" %>s %b \"%{Referer}i\" \"%{User-Agent}i\"" combined
CustomLog "|/usr/sbin/rotatelogs /var/log/httpd/nextcloud/access_log_%Y%m%d 86400 540" combined
ErrorLog /var/log/httpd/nextcloud/error_log
<Directory "/var/www/nextcloud/">
AllowOverride All
Options FollowSymLinks
</Directory>
</VirtualHost>
libreのバーチャルホスト設定
<VirtualHost *:443>
Servername libre.lancardcom.xyz
DirectoryIndex index.html index.php
DocumentRoot /var/www/libre/
SSLEngine on
SSLProtocol all -SSLv2 -SSLv3
SSLCipherSuite ALL:!ADH:!EXPORT:!SSLv2:RC4+RSA:+HIGH:+MEDIUM:+LOW
SSLCertificateFile /etc/letsencrypt/live/libre.lancardcom.xyz/cert.pem
SSLCertificateKeyFile /etc/letsencrypt/live/libre.lancardcom.xyz/privkey.pem
SSLCertificateChainFile /etc/letsencrypt/live/libre.lancardcom.xyz/chain.pem
SSLHonorCipherOrder on
# Encoded slashes need to be allowed
AllowEncodedSlashes NoDecode
# Container uses a unique non-signed certificate
SSLProxyEngine On
SSLProxyVerify None
SSLProxyCheckPeerCN Off
SSLProxyCheckPeerName Off
# keep the host
ProxyPreserveHost On
# static html, js, images, etc. served from loolwsd
# loleaflet is the client part of LibreOffice Online
ProxyPass /loleaflet https://lool.lancardcom.xyz:9980/loleaflet retry=0
ProxyPassReverse /loleaflet https://lool.lancardcom.xyz:9980/loleaflet
# WOPI discovery URL
ProxyPass /hosting/discovery https://lool.lancardcom.xyz:9980/hosting/discovery retry=0
ProxyPassReverse /hosting/discovery https://lool.lancardcom.xyz:9980/hosting/discovery
# Main websocket
ProxyPassMatch "lool/(.*)/ws$" wss://lool.lancardcom.xyz:9980/lool/$1/ws nocanon
# Admin Console websocket
ProxyPass /lool/adminws wss://lool.lancardcom.xyz:9980/lool/adminws
# Download as, Fullscreen prezentation and Image upload operations
ProxyPass /lool https://lool.lancardcom.xyz:9980/lool
ProxyPassReverse /lool https://lool.lancardcom.xyz:9980/lool
Loglevel debug
CustomLog "|/usr/sbin/rotatelogs /var/log/httpd/libre/ssl_access_log_%Y%m%d 86400 540" combined
ErrorLog /var/log/httpd/libre/ssl_error_log
#Header always set Content-Security-Policy "default-src 'none'"
<Directory "/var/www/libre/">
AllowOverride All
Options FollowSymLinks
</Directory>
</VirtualHost>
<VirtualHost *:80>
Servername libre.lancardcom.xyz
RewriteEngine on
RewriteCond %{HTTPS} off
RewriteRule ^(.*)$ https://%{HTTP_HOST}%{REQUEST_URI} [R,L]
DirectoryIndex index.html index.php
DocumentRoot /var/www/libre/
CustomLog "|/usr/sbin/rotatelogs /var/log/httpd/libre/access_log_%Y%m%d 86400 540" combined
<Directory "/var/www/libre/">
AllowOverride All
Options FollowSymLinks
</Directory>
</VirtualHost>
loolのバーチャルホスト設定
このバーチャルホストはLet’s EncryptでSSL証明書を取るためのダミーだったりします。
オレオレ証明書で起動した際、Nextcloudとの連携時に不具合が出た為、正規のSSL証明書で運用する事になりました。
<VirtualHost *:80>
Servername lool.lancardcom.xyz
RewriteEngine on
RewriteCond %{HTTPS} off
RewriteRule ^(.*)$ https://%{HTTP_HOST}%{REQUEST_URI} [R,L]
DirectoryIndex index.html index.php
DocumentRoot /var/www/lool/
CustomLog "|/usr/sbin/rotatelogs /var/log/httpd/lool/access_log_%Y%m%d 86400 540" combined
ErrorLog /var/log/httpd/lool/error_log
<Directory "/var/www/lool/">
AllowOverride All
Options FollowSymLinks
</Directory>
</VirtualHost>
loolwsd 側の設定
連携時に必要なloolwsd側の設定です。
online/loolwsd.xmlにて設定します。
今回は差分を掲載しておきます。
設定の要はSSL証明書の格納場所と通信許可ホストとWOPIホストの設定です。
--- loolwsd.xml.orig 2018-06-04 09:59:41.709736164 +0900
+++ loolwsd.xml 2018-06-07 10:49:16.111249275 +0900
@@ -3,7 +3,7 @@
<!-- Note: 'default' attributes are used to document a setting's default value as well as to use as fallback. -->
<!-- Note: When adding a new entry, a default must be set in WSD in case the entry is missing upon deployment. -->
- <allowed_languages desc="List of supported languages on this instance." default="de_DE en_GB en_US es_ES fr_FR it nl pt_BR pt_PT ru">de_DE en_GB en_US es_ES fr_FR it nl pt_BR pt_PT ru</allowed_languages>
+ <allowed_languages desc="List of supported languages on this instance." default="de_DE en_GB en_US es_ES fr_FR it nl pt_BR pt_PT ru">ja de_DE en_GB en_US es_ES fr_FR it nl pt_BR pt_PT ru</allowed_languages>
<tile_cache_path desc="Path to a directory where to keep the tile cache." type="path" relative="false" default="/usr/local/var/cache/loolwsd"></tile_cache_path>
<sys_template_path desc="Path to a template tree with shared libraries etc to be used as source for chroot jails for child processes." type="path" relative="true" default="systemplate"></sys_template_path>
@@ -39,7 +39,7 @@
<color type="bool">true</color>
<level type="string" desc="Can be 0-8, or none (turns off logging), fatal, critical, error, warning, notice, information, debug, trace" default="trace">trace</level>
<file enable="true">
- <property name="path" desc="Log file path.">/tmp/loolwsd.log</property>
+ <property name="path" desc="Log file path.">/opt/lool/loolwsd.log</property>
<property name="rotation" desc="Log file rotation strategy. See Poco FileChannel.">never</property>
<property name="archive" desc="Append either timestamp or number to the archived log filename.">timestamp</property>
<property name="compress" desc="Enable/disable log file compression.">true</property>
@@ -65,16 +65,19 @@
<net desc="Network settings">
<proto type="string" default="all" desc="Protocol to use IPv4, IPv6 or all for both">all</proto>
<post_allow desc="Allow/deny client IP address for POST(REST)." allow="true">
- <host desc="Regex pattern of ip address to allow.">192\.168\.[0-9]{1,3}\.[0-9]{1,3}</host>
+ <host desc="Regex pattern of ip address to allow.">localhost</host>
+ <host desc="Regex pattern of ip address to allow.">nextcloud.lancardcom.xyz</host>
+ <host desc="Regex pattern of ip address to allow.">libre.lancardcom.xyz</host>
+ <host desc="Regex pattern of ip address to allow.">lool.lancardcom.xyz</host>
</post_allow>
</net>
<ssl desc="SSL settings">
<enable type="bool" default="true">true</enable>
<termination desc="Connection via proxy where loolwsd acts as working via https, but actually uses http." type="bool" default="true">false</termination>
- <cert_file_path desc="Path to the cert file" relative="false">/etc/loolwsd/cert.pem</cert_file_path>
- <key_file_path desc="Path to the key file" relative="false">/etc/loolwsd/key.pem</key_file_path>
- <ca_file_path desc="Path to the ca file" relative="false">/etc/loolwsd/ca-chain.cert.pem</ca_file_path>
+ <cert_file_path desc="Path to the cert file" relative="false">/etc/letsencrypt/live/lool.lancardcom.xyz/cert.pem</cert_file_path>
+ <key_file_path desc="Path to the key file" relative="false">/etc/letsencrypt/live/lool.lancardcom.xyz/privkey.pem</key_file_path>
+ <ca_file_path desc="Path to the ca file" relative="false">/etc/letsencrypt/live/lool.lancardcom.xyz/chain.pem</ca_file_path>
<cipher_list desc="List of OpenSSL ciphers to accept" default="ALL:!ADH:!LOW:!EXP:!MD5:@STRENGTH"></cipher_list>
<hpkp desc="Enable HTTP Public key pinning" enable="false" report_only="false">
<max_age desc="HPKP's max-age directive - time in seconds browser should remember the pins" enable="true">1000</max_age>
@@ -94,6 +97,9 @@
<filesystem allow="false" />
<wopi desc="Allow/deny wopi storage. Mutually exclusive with webdav." allow="true">
<host desc="Regex pattern of hostname to allow or deny." allow="true">localhost</host>
+ <host desc="Regex pattern of hostname to allow or deny." allow="true">nextcloud.lancardcom.xyz</host>
+ <host desc="Regex pattern of hostname to allow or deny." allow="true">libre.lancardcom.xyz</host>
+ <host desc="Regex pattern of hostname to allow or deny." allow="true">lool.lancardcom.xyz</host>
<host desc="Regex pattern of hostname to allow or deny." allow="true">10\.[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}</host>
<host desc="Regex pattern of hostname to allow or deny." allow="true">172\.1[6789]\.[0-9]{1,3}\.[0-9]{1,3}</host>
<host desc="Regex pattern of hostname to allow or deny." allow="true">172\.2[0-9]\.[0-9]{1,3}\.[0-9]{1,3}</host>
httpd、loolwsdサービスの再起動
httpdとloolwsdを再起動して、これまでの設定を有効化します。
エラーが出る場合は、設定の見直しや必要なディレクトリやパーミッションの設定など調整してください。
例)構築中に実際にあったエラー原因
* ログ用のディレクトリを未作成、もしくはオーナー、パーミッションの設定間違い
* SSL証明書のディレクトリのパーミッション設定(700でroot以外読めなかった)
* ドキュメントルートのディレクトリを未作成
* 単純なconfファイルのタイポ
Nextcloudのインストール
ここまで長かったですが…やっとNextcloud本体のインストールです。
まぁ、ソースダウンロードして、ドキュメントルートにおいて、あとは、WebUIの指示に従ってインストールするだけなので、ほぼこれまでの準備が肝だったり。あ…Nextcloud用のDBの準備忘れてました。
Nextcloud用DBの作成
[root@scw-6b31f8 ~]# mysql -u root -p
Enter password:
elcome to the MariaDB monitor. Commands end with ; or \g.
Your MariaDB connection id is 9
Server version: 5.5.56-MariaDB MariaDB Server
Copyright (c) 2000, 2017, Oracle, MariaDB Corporation Ab and others.
Type 'help;' or '\h' for help. Type '\c' to clear the current input statement.
MariaDB [(none)]> CREATE DATABASE データベース名;
Query OK, 1 row affected (0.00 sec)
MariaDB [(none)]> GRANT ALL PRIVILEGES ON データベース名.* TO ユーザ名@localhost IDENTIFIED BY 'パスワード' ;
Query OK, 0 rows affected (0.01 sec)
MariaDB [(none)]> FLUSH PRIVILEGES ;
Query OK, 0 rows affected (0.00 sec)
MariaDB [(none)]> QUIT
Bye
Nextcloudのソースのダウンロードと配置
[lool@scw-6b31f8 Archives]$ wget https://download.nextcloud.com/server/releases/nextcloud-13.0.2.zip
[lool@scw-6b31f8 Archives]$ unzip nextcloud-13.0.2.zip
[lool@scw-6b31f8 Archives]$ sudo cp -rp nextcloud/* /var/www/nextcloud/
[lool@scw-6b31f8 Archives]$ sudo chown -R apache. /var/www/nextcloud
[lool@scw-6b31f8 Archives]$ sudo systemctl restart httpd
後は、ブラウザで、Nextcloud用に設定したURLを開いて、画面の指示に従ってインストールを完了させます。
もしWebUIでのインストールがわからない…という方は…ドキュメントを読み直してください。
(すみません。画像貼るのが面倒なので手抜きさせてください。)
こちらのサイトなどを参照していただけると丁寧に解説されてます。
CentOS7にNextcloudインストール | server-memo.net
CentOS 7 : NextCloud インストール : Server World
Nexcloud側の連携設定
最後に、NexcloudのWebUI上の「アプリ」から「Collabora Online」を有効にします。
すると、「設定」の左サイドメニューに「Collabora Online」の項目が表示されますので、そこで、loolwsdサーバを指定します。
今回の場合は…Proxyであるlibreを指定するので、「https://」から始まるアドレスを入力して「適用」をクリックして完了です。
おそらくここまでの記事で設定を進めてこれた方であれば、見ればわかるので、スクリーンショットなど付けた説明は割愛させていただきます。
(さらにリンクを貼るのも手抜きさせてください。)
最後に構築後、操作してみた感じ
実際に、操作してみた感じですが、やはり…入力、変換等は通信ラグ等により、もっさり感がぬぐえません。まだ完全にLibreOfficeの全機能に対応してはいない為、メニューにはあるのに機能しない部分もちらほらありました。loolwsdのログを見て気が付いたのですが、なぜかUTC表示からローカル時刻への変更ができません。
上記の現象と同一の原因だと思われますがCalc(表計算)のNOW()関数などの結果もUTCで表示される為、その辺が難点になるかと思われます。
やはり…Microsoft Office365やGoogleAppsなどの大手商用サービスと比較すると、ユーザビリティに一歩劣る感は否めませんでした。
ただし…
– どうしてもデータをクラウド上に置けない。オンプレミスである必要がある。
->(社内規定などによるセキュリティ上の制限がある。)
– 内部での共有のみで、外部とのドキュメント等のやり取りをほぼ行わない。
->(MicrosoftのWard、Excelファイル等と互換はありますが、それほど互換性は高くないです。)
– ライセンスにコストをかけたくない
->(オープンソースなので構築コスト・保守コスト以外はかかりません。)
と言った場合には最適のソリューションではないでしょうか。