2017年01月一覧

rcloneでAmazonCloudDriveにデータを暗号化して同期する


2017/6/4
RcloneのAmazonCloudDrive接続がClientIDが無効になったことによりできなくなっています。
https://forum.rclone.org/t/rclone-has-been-banned-from-amazon-drive/2314

rcloneが暗号化に対応したと聞いて試してみた。

やること

rcloneを使用してローカルのファイルをAmazonCloudDriveと同期する。
rcloneの機能でAmazonCloudDrive上にデータをアップロードする際は暗号化し、ダウンロードする際は復号化する。

暗号化の必要性

Amazon Cloud Drive利用規約を読むと、アマゾンがファイルにアクセスすることもありうる内容になっている。
私がアヘ顔ダブルピースしているホームビデオを見られる可能性があると困るため、暗号化してファイルを置くことが必須となる。

確認環境

ローカル側
– Ubuntu 16.04
– rclone v1.35
– Windows10(認証用)

リモート側
– Amazon Cloud Drive(プライム会員の5GB)

手順

手順は以下を参考にした。
https://www.reddit.com/r/DataHoarder/comments/598pb2/tutorial_how_to_make_an_encrypted_acd_backup_on/

Ubuntuへのrcloneインストール

ほぼ公式に書いてある手順と同一。

mkdir -p ~/work/rclone
cd ~/work/rclone

sudo apt install unzip

curl -O http://downloads.rclone.org/rclone-current-linux-amd64.zip
unzip rclone-current-linux-amd64.zip
cd rclone-*-linux-amd64

sudo cp rclone /usr/sbin/
sudo chown root:root /usr/sbin/rclone
sudo chmod 755 /usr/sbin/rclone

sudo mkdir -p /usr/local/share/man/man1
sudo cp rclone.1 /usr/local/share/man/man1/
sudo mandb

rcloneにAmazonCloudDriveを設定

実行ユーザ毎に設定が作られる。
途中で入力するトークンは後述の方法で入手した。

$ rclone config
2017/--/-- --:--:-- Config file "/home/test/.rclone.conf" not found - using defaults
No remotes found - make a new one
n) New remote
s) Set configuration password
q) Quit config
n/s/q> n <-新規に設定を作成
name> ACD <-設定の名前をつける
Type of storage to configure.
Choose a number from below, or type in your own value
 1 / Amazon Drive
   \ "amazon cloud drive"
 2 / Amazon S3 (also Dreamhost, Ceph, Minio)
   \ "s3"
 3 / Backblaze B2
   \ "b2"
 4 / Dropbox
   \ "dropbox"
 5 / Encrypt/Decrypt a remote
   \ "crypt"
 6 / Google Cloud Storage (this is not Google Drive)
   \ "google cloud storage"
 7 / Google Drive
   \ "drive"
 8 / Hubic
   \ "hubic"
 9 / Local Disk
   \ "local"
10 / Microsoft OneDrive
   \ "onedrive"
11 / Openstack Swift (Rackspace Cloud Files, Memset Memstore, OVH)
   \ "swift"
12 / Yandex Disk
   \ "yandex"
Storage> 1 <-AmazonCloudDriveを使うので1
Amazon Application Client Id - leave blank normally.
client_id> <-空Enter
Amazon Application Client Secret - leave blank normally.
client_secret> <-空Enter
Remote config
Use auto config?
 * Say Y if not sure
 * Say N if you are working on a remote or headless machine
y) Yes
n) No
y/n> n <-確認したのがブラウザが開けない環境だったので、nで進めた
For this to work, you will need rclone available on a machine that has a web browser available.
Execute the following on your machine:
        rclone authorize "amazon cloud drive"
Then paste the result below:
result> *** <-後述の方法で入手したトークンを貼り付け
--------------------
[ACD]
client_id =
client_secret =
token = ****
--------------------
y) Yes this is OK
e) Edit this remote
d) Delete this remote
y/e/d> y <-設定完了
Current remotes:

Name                 Type
====                 ====
ACD                  amazon cloud drive

e) Edit existing remote
n) New remote
d) Delete remote
s) Set configuration password
q) Quit config
e/n/d/s/q> q <-一旦終了

認証を別端末のWindows10で行う

rcloneのWindows版をダウンロードしてきて、コマンドプロンプトで以下を実施。
途中でブラウザからアマゾンの認証画面が開かれるので、ログインする。

C:\test>rclone authorize "amazon cloud drive"
2017/--/-- --:--:-- Config file "C:\\Users\\test/.rclone.conf" not found - using defaults
If your browser doesn't open automatically go to the following link: http://127.0.0.1:53682/auth
Log in and authorize rclone for access
Waiting for code...
Got code
Paste the following into your remote machine --->
**** <-ここに表示されるのがトークン
<---End paste

rcloneに暗号化するディレクトリを設定

AmazonCloudDrive上で暗号化するため必要な設定をする。

$ rclone config
Current remotes:

Name                 Type
====                 ====
ACD                  amazon cloud drive

e) Edit existing remote
n) New remote
d) Delete remote
s) Set configuration password
q) Quit config
e/n/d/s/q> n <-設定を作成
name> ACD_crypt <-設定に名前をつける
Type of storage to configure.
Choose a number from below, or type in your own value
 1 / Amazon Drive
   \ "amazon cloud drive"
 2 / Amazon S3 (also Dreamhost, Ceph, Minio)
   \ "s3"
 3 / Backblaze B2
   \ "b2"
 4 / Dropbox
   \ "dropbox"
 5 / Encrypt/Decrypt a remote
   \ "crypt"
 6 / Google Cloud Storage (this is not Google Drive)
   \ "google cloud storage"
 7 / Google Drive
   \ "drive"
 8 / Hubic
   \ "hubic"
 9 / Local Disk
   \ "local"
10 / Microsoft OneDrive
   \ "onedrive"
11 / Openstack Swift (Rackspace Cloud Files, Memset Memstore, OVH)
   \ "swift"
12 / Yandex Disk
   \ "yandex"
Storage> 5 <-暗号化設定なので5
Remote to encrypt/decrypt.
Normally should contain a ':' and a path, eg "myremote:path/to/dir",
"myremote:bucket" or maybe "myremote:" (not recommended).
remote> ACD:/DataBackup/ <- 設定ディレクトリ(書き方は後述)
How to encrypt the filenames.
Choose a number from below, or type in your own value
 1 / Don't encrypt the file names.  Adds a ".bin" extension only.
   \ "off"
 2 / Encrypt the filenames see the docs for the details.
   \ "standard"
filename_encryption> 2 <-ファイル名の暗号化をする場合は2
Password or pass phrase for encryption.
y) Yes type in my own password
g) Generate random password
y/g> g <-暗号化パスワードを自動生成
Password strength in bits.
64 is just about memorable
128 is secure
1024 is the maximum
Bits> 128
Your password is: dw37uhP1Dl56Fhr8DYuZjg
Use this password?
y) Yes
n) No
y/n> y <-暗号化パスワードを承認
Password or pass phrase for salt. Optional but recommended.
Should be different to the previous password.
y) Yes type in my own password
g) Generate random password
n) No leave this optional password blank
y/g/n> g <-暗号化のソルトを自動生成
Password strength in bits.
64 is just about memorable
128 is secure
1024 is the maximum
Bits> 128
Your password is: 8UubLhAxmfQc1Cvs3UbuQw
Use this password?
y) Yes
n) No
y/n> y <-暗号化のソルトを承認
Remote config
--------------------
[ACD_crypt]
remote = ACD:/DataBackup/
filename_encryption = standard
password = *** ENCRYPTED ***
password2 = *** ENCRYPTED ***
--------------------
y) Yes this is OK
e) Edit this remote
d) Delete this remote
y/e/d> y <-設定に問題なければy
Current remotes:

Name                 Type
====                 ====
ACD                  amazon cloud drive
ACD_crypt            crypt

e) Edit existing remote
n) New remote
d) Delete remote
s) Set configuration password
q) Quit config
e/n/d/s/q> q <-設定ウィザードを終了

設定ディレクトリの書き方

(クラウドストレージの設定名):(ディレクトリ)
なので、上述の設定ではAmazonCloudDrive上のDataBackupディレクトリ内に暗号化したファイルを置く設定となる。

ルートに暗号化したデータを置く場合は以下の例のようにディレクトリを空にするらしい?(未検証)
– ACD:

ファイルを暗号化/復号化して同期

ローカルからAmazonCloudDriveに暗号化して同期

ローカルの/dataディレクトリからAmazonCloudDriveの/DataBackupディレクトリに同期する場合。

rclone sync /data ACD_crypt:/DataBackup/

こんな感じに暗号化されたファイル/ディレクトリができる。

AmazonCloudDriveからローカルに復号化して同期

AmazonCloudDriveの/DataBackupディレクトリからローカルの/dataディレクトリに同期する場合。

rclone sync ACD_crypt:/DataBackup/ /data

その他

  • Linuxのrcloneでアップロードしたファイルを、Windowsのrcloneで暗号化パスワードとソルトを同一にしてダウンロードすることもできた。
  • 以前にEncFSを使用して暗号化する方法も検討していたのですが、暗号化したファイルを一時的にでもローカルに置く必要がある点がネックになってました。rcloneだけでできればシンプルで便利。
  • ACDだとファイルとフォルダの名前は半角で255文字以内である必要があるのですが、ファイル名/フォルダ名の暗号化により文字数が増えて制限を超える可能性もあります。制限を超えると、rclone実行時に「failed to satisfy constraint: Member must have length less than or equal to 280」というエラーが出るかもしれません。

Space EngineersのDedicatedサーバをWindowsで構築する

内容について

ほとんど以下の公式ページに書いてあります。
http://www.spaceengineersgame.com/dedicated-servers.html

SpaceEngineersのサーバを立てる際に自分がやった内容を残しておきます。
とはいえこのゲームをやるEngineerならこの程度は問題とならないような気もしますが、手間を省く一助となれば幸いです。
ちなみに、Dedicatedサーバはゲームクライアントを起動せず、スタンドアローンのサーバアプリケーションのみを起動して使うものになります。

確認環境

この内容は全て以下の環境で確認しています。
特にSpaceEngineersはBeta版での確認となるため、仕様が変更となる可能性が大きくあります。

  • SpaceEngineers 01.168 Stable
  • Windows10 64bit

Dedicatedサーバのインストール

SteamクライアントでダウンロードするゲームアプリケーションにもDedicatedサーバが同梱されていますが、ここではSteamCMDでダウンロードする方法をとります。

SteamCMDの準備

以下からSteamCMDをダウンロードして、適当な場所に解凍。
https://steamcdn-a.akamaihd.net/client/installer/steamcmd.zip

ダウンロード/アップデートバッチの作成と実行

「steamcmd.exe」と同じディレクトリに以下の内容のバッチファイルを作成。
名前は任意なので、ここでは例として「SE_inst_updt.bat」とする。

※「C:\SE」の部分はDedicatedサーバのインストール先となるため。任意に変更する。
※app_updateで指定するIDはここを参照。

@echo off
start "" steamcmd.exe +login anonymous +force_install_dir "C:\SE" +app_update 298740 validate +quit

作成後、バッチを実行し、終わるまで待つ。

以上で、インストールは完了。

サーバの起動

サービスへの登録を行う場合、以下の作業はAdministrators権限のあるユーザで行うこと。

サーバ管理アプリケーションの起動

[(バッチで指定したインストールフォルダ)\DedicatedServer64\SpaceEngineersDedicated.exe]を起動。

インスタンス選択画面

インスタンス(サービス/OS起動時の自動起動)を設定するか否かで以下の手順が異なります。

インスタンスを作成しない場合

「Lcal/Console」を選択して「Continue to Server Configuration」を押す。

インスタンスを作成する場合

「Run as Admin」ボタンで管理者権限を与えて、「Add new instance」ボタンからインスタンス名を決めて作成。
その後、作成したインスタンスを選択して「Continue to Server Configuration」を押す。

サーバ設定画面

ここの設定値については、ドキュメントが見つからなくってよくわからない部分が多い。

とりあえず、新規にワールドを作るときは以下になる。
1. Nwe gameを選択
2. Scenarioを選択
3. Server portが標準のUDP27016意外であれば変更(当然ですが、NAT等でインターネットからアクセス可能であること)
4. Server nameを入力(サーバリスト上で表示される)
5. World nameを入力(サーバリスト上で表示される)
6. 適当にその他の設定値を入力。
7. Save & startでサーバを起動

これで、ゲーム上のサーバリストから見えて、サーバに入ることができる状態になっている。

以前に作成したワールドを再度起動する場合

Saved worldsと、起動したいワールド名を選択して起動。

インスタンスで自動起動されるワールド

最後に起動したワールドが自動起動で使用されているように見えるが、設定場所も正確な記述もわからなかった。

アップデート

SpaceEngineersは定期的にアップデートがあり、ほとんどの場合、新しいクライアントから古いサーバへはアクセスできなくなる。
そのため、ある程度定期的にサーバのアップデートが必要になると思われる。
サービスを停止してバッチを動かすだけのため、自動化もむすかしくはなさそう。

アップデート方法

サーバをサーバ設定の「Stop」ボタンで停止し、インストール時に使用したバッチファイルを実行する。

Modの設定

ワールド内で、ワークショップで公開されているModが使用できる。

ModのIDを調べる

ワークショップのページから適当に入れたいModを探しページを開く。
URLの後ろの方の[id=]の後の数字をメモする。

サーバ設定

サーバ設定のModタブに入力する。
複数の場合は改行して入力していく。

あとは起動すればModの内容が使用可能な状態となっており、クライアントが接続するとクライアント側で必要なModのデータがダウンロードされるようになる。
一度ダウンロードすれば2度目以降は差分のみとなるため、素早くサーバに入れる。

適用されないMod?

ブループリントとスクリプトはサーバで指定しても出てこないっぽい?
クライアントでサブスクライブしてれば使えるから?

グループメンバーのみが入れるように設定する

サーバは公式のリストに載せられてしまうため、そのままだと誰でも簡単に入ってこれる状態となる。
しかし、Steamで作成したグループのメンバーのみがサーバに入れるよう設定することができる。

グループを作成

Steamクライアントからであれば、以下で作成画面に行ける。

  1. (ユーザ名)->グループを選択。
  2. 「新しいグループを作成」をクリック。

グループを作ったら、サーバに入れるようにしたいユーザを招待する。

グループIDを調べる

グループ管理画面から「フレンドを招待」をクリックし、その後のページのURLの「invitegid=」の後の数字列がグループID。
(例)http://steamcommunity.com/profiles/???????????/friends/?invitegid=(グループID)

サーバ設定

サーバ設定の「Steam Group IDに調べたグループIDを入力して起動。


Ampacheを無理やりSJISのタグに対応させる

何をするのか

Ampacheは便利なのですが、そのままだと日本語のSJISのタグが付いたmp3などを突っ込むと文字化けしまくる。
WindowsはSJIS以外だとエクスプローラで文字化けするため、意識してないとSJISで管理しちゃうことが多い。

タグを別の文字コードに変換するのは面倒なため、Ampache側をいじることとする。

やり方

注意:かなり雑な方法なので、通常だと問題ない文字コードや特殊な文字などを処理したときに文字化けするかも。

確認環境

ubuntu 16.04 + nginx + php 7.0 + Ampache 3.8.3 (+ getID3 1.9.11)

「mb_detect_encoding」関数を使うので、php-mbstringパッケージをインストールして有効化

もう入っていれば飛ばして問題なし。

sudo apt-get install php7.0-mbstring
sudo systemctl restart php7.0-fpm.service

getID3にSJIS判定を追加

以下のファイルを編集する
– (ampacheインストールディレクトリ)/lib/vendor/james-heinrich/getid3/getid3/getid3.lib.php

この部分のすぐ後に

public static function iconv_fallback($in_charset, $out_charset, $string) {

       if ($in_charset == $out_charset) {
                return $string;
       }

以下を追加する

       if( mb_detect_encoding($string,"SJIS-win",true) ){
                return mb_convert_encoding($string,$out_charset,"SJIS-win");
       }

対応方法についてのメモ

何か問題が起こったときに確認するためのメモ。

getID3について

以下で公開されてる。
https://github.com/JamesHeinrich/getID3

Ampacheではこれを使ってmp3などのタグを処理してるのですが、getID3は本記事時点で最新のv1.9.13でもSJISに対応していない。
とはいえプルリクエストしてどうにかなるものではなさそう。

文字コードに何を使っているのか文字列から判定する必要があるのですが、その対応がとても難しいです。
少なくともPHPの関数だけでは世界中の文字コードを間違いなく判定することはできないと思われる。
なので、対応する文字列を無難な中から取捨選択するしかなさそう。

そもそもSJISなんて使ってるMicrosoftが諸悪の根源に違いない。

getID3に追記した内容について

文字列の判定と変換を、通常では以下の順番でやってる。

  1. [変換前文字コード=変換後文字コード]の場合
  2. …もろもろそれ以外の場合

それをこうする

  1. [変換前文字コード=変換後文字コード]の場合
  2. [変換前文字コード=SJIS]の場合 <= 追加
  3. …もろもろそれ以外の場合