Daydreaming in Brookline, MA

rcloneでデータを暗号化してpCloudにバックアップする

1 はじめに

pCloudはライフタイムプランで有名なクラウドストレージプロバイダーです。私は去年のサンクスギビングセールで500GBプランを買っていました。

クラウドストレージはとても便利ですが、ハックされてデータがリークしたり、データを見られたりするリスクがあります。そこで、データを暗号化してクラウドに置くよい方法を探していたところ、rcloneというコマンドラインツールの評判が良さそうなので、これを使うことにしました。

2 pCloud

pCloud はライフタイムプランを売りにしています。容量を前払いで購入し、会社が潰れたりしなければずっと使えます。クラウドストレージベンダーからすると、ライフタイムプランは当座の資金集めに便利ですが、あまりサステイナブルなビジネスモデルではありません。中には、破格の価格をつけているところもありますが、そういうところは本社の住所が普通の民家だったりして、資金集めをするだけして消えてしまいそうです。

pCloudは、グーグルやアマゾンのような最大手ではありませんが、ライフタイムプランを提供しているベンダーの中では大手で、実績もあります。そこで、年に数回ある安売りのタイミングで500GBプランを買いました。

3 rclone

rclone はクラウドストレージ上のファイルを管理するコマンドラインツールです。使い勝手に多少クセがありますが、いったんクラウドストレージを登録して、ファイルやディレクトリの表示ができるようになる頃には慣れると思います。

command comments
rclone listremotes 登録済みクラウドストレージ(remote)の一覧表示
rclone config remoteの登録
rclone ls <remote:> オブジェクトを表示
rclone lsd <remote:> ディレクトリを表示
rclone lsf <remote:> "ls -F"的なシンプル表示
rclone lsl <remote:> "ls -l"的なオブジェクト表示
rclone sync <local> <remote:> <local>から<remote:>へ差分のみ転送

リモート名には最後にコロン(:)を付けるのがポイントです。

普段はsyncを使って差分のみをコピーします。こんな感じで使います。

rclone sync Important pcl_cryp:/

Important はローカルのバックアップしたいファイルやディレクトリの入っているディレクトリ、 pcl_cryp:/ は(crypt)リモートのルートディレクトリです。cron等で自動化するのがオススメです。

注意として、 rclone sync <source> <destination> はsourceとdestinationの方向が決まっています。destinationをsourceに合わせるため、sourceに無いファイルはdestinationから消えてしまいます。

rclone lsrclone lsl はディレクトリ配下のファイルも表示してしまい、少し違和感を覚えました。 rclone --helprclone <subcommand> --help しながら使うといいと思います。

最初に rclone config してクラウドストレージを登録すると設定ファイル ~/.config/rclone/rclone.conf が作られますが、パスワードを設定してこれ自体を暗号化しておくのがおすすめです。毎回パスワードを入力するのはとても面倒なので、環境変数 RCLONE_CONFIG_PASS に設定するとよいです。私は更にこれをgpgで暗号化してクラウドストレージにバックアップしました。

4 セットアップ

4.1 インストールとリモート設定

まずは rclone をインストールします。brewの入っているmacの場合、

brew install rclone

で行けます。

次に念の為、configファイルにパスワードをつけます。

rclone config
No remotes found, make a new one?
n) New remote
s) Set configuration password
q) Quit config
n/s/q> s
(確か、2回パスワードを入れたような)

続いて、このあたり を参考にしてpcloudを登録します。先ほどの続きから行ってもOKです。 後から書いているので、間違いがあるかも。。。

rclone config
(configパスワードを入れる)
No remotes found, make a new one?
n) New remote
s) Set configuration password
q) Quit config
n/s/q> n  # 新規リモート作成を選択
name> pcloud  # リモートの名前を入力
Type of storage to configure.
Choose a number from below, or type in your own value
略
番号 / Pcloud
   \ "pcloud"
略
Storage> pcloud  # pcloudを選択
Pcloud App Client Id - leave blank normally.
client_id>   # ブランクのまま
Pcloud App Client Secret - leave blank normally.
client_secret>   # ブランクのまま
Remote config
Use web browser to automatically authenticate rclone with remote?
 * Say Y if the machine running rclone has a web browser you can use
 * Say N if running rclone on a (remote) machine without web browser access
If not sure try Y. If Y failed, try N.
y) Yes
n) No
y/n> y  # ブラウザーを使った認証を行う

ブラウザーが開いてpcloudへのログインを求められるので、ログインしてrcloneへのアクセスを許可します。

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
--------------------
[remote]
client_id = 
client_secret = 
token = {"access_token":"XXX","token_type":"bearer","expiry":"0001-01-01T00:00:00Z"}
--------------------
y) Yes this is OK
e) Edit this remote
d) Delete this remote
y/e/d> y  # yを押して登録完了

登録を確認します。pcloudという名前のリモートにあるディレクトリを表示してみます。

~ % rclone lsd pcloud:
(configパスワードを入れる)
	  -1 2023-11-23 10:06:14        -1 My Music
	  -1 2023-11-23 10:06:14        -1 My Pictures
	  -1 2023-11-23 10:06:14        -1 My Videos
~ % 

最初からある My Music などのディレクトリが表示できました。

そろそろ面倒になってきたので、環境変数にconfigパスワードを登録します。

export RCLONE_CONFIG_PASS=<パスワード>

これでパスワードを聞かれなくなりました。

4.2 cryptリモートの作成

crypt(暗号化)リモートは、作成済みのリモートの中に暗号化されたリモートを作成します。 今回はpcloudリモートの中にcryptというディレクトリを作り、これをcryptリモートにします。

rclone mkdir pcloud:/crypt  # cryptリモート用ディレクトリ作成
rclone config
n  # 新規作成
pcloud_crypt  # cryptリモート名を指定
crypt  # cryptリモートを作ることを指定
pcloud:/crypt  # cryptリモートを作る場所(pcloud:/crypt)を指定
1  # ファイル名を暗号化する
1  # ディレクトリ名を暗号化する
g  # ランダムパスワードを生成する
128  # 128ビットを指定
y  # はい、そのパスワードを使います
g  # ランダムソルトを生成する
128  # 128ビットを指定
y  # はい、そのソルトを使います
n  # advancedなconfigはしない
y  # OK

確認します。

~ % rclone listremotes
pcloud:
pcloud_crypt:
~ %

試しにファイルを置いてみます。

date > test.txt
rclone copy test.txt pcloud_crypt:
rclone ls pcloud_crypt:  # test.txtが表示される
rclone ls pcloud:/crypt  # jmi...(ランダムな文字列)が表示される

3行目はcryptリモートを通して見た場合、最後の行はcryptリモートを置いているディレクトリを直接(cryptリモートを経由せずに)表示しています。pcloudのweb UIを使って見ても、同じ暗号化されたファイル名が見えます。

ファイルの中身も直接見てみます。

~ % rclone lsf pcloud:crypt
jmilh0..<snip>..og1bpihd4  # 暗号化された"test.txt"
~ % rclone cat pcloud:crypt/jmilh0..<snip>..og1bpihd4
?CLONE.TЂQ???(?..<snip>..?&}????x?!????NG;N?T?/V?
 ????z4?k?FQ%                                                                   ~ % 

しっかりと暗号化されています。

もちろん、cryptリモートを通して見ると、普通に見えます。

~ % rclone cat pcloud_crypt:/test.txt
Thu Mar  7 16:12:41 EST 2024
~ %

たったこれだけのファイルなのに、結構時間がかかります。性能面が心配になりましたが、複数ファイルをまとめてアップロードしたらそこまで遅くなかったです。

私は早速、確定申告用の書類一式をcryptリモートにバックアップしました。

4.3 rclone.confをバックアップする

~/.config/rclone/rclone.conf はパスワードをつけて暗号化したので、中身を見られても多少は安心です。しかし、もしこれが消えてしまうと、2度とcryptリモートにアクセスできなくなってしまいます。そこで、rclone.confを(念には念を入れて)更に暗号化してpcloud上に置きます。

まずは暗号化する gnupg をインストールします。brewのあるmacの場合、

brew install gnupg

で入ります。

続いて、暗号化します。

~/tmp % gpg --output rclone.gpg --symmetric ~/.config/rclone/rclone.conf 
(パスフレーズを2回入力)

これをpcloudにコピーします。ポイントはcryptリモートには入れないことです。そうしてしまうと、リカバリーしたいときにそもそもcryptリモートにアクセスできずにはまります。

rclone copy rclone.gpg pcloud:/rclone.gpg

リストアする場合は以下のようにします。

rclone copy pcloud:/rclone.gpg ./rclone.gpg
gpg --output rclone.conf --decrypt rclone.gpg
(パスフレーズを入力)
mv rclone.conf ~/.config/rclone/rclone.conf
chmod 600 ~/.config/rclone/rclone.conf

他のマシンに環境をコピーする場合は、いったんrcloneをインストールした後、rclone.gpgをpCloudのWebUIを使ってダウンロードし、2行目以降を実行します。

5 終わりに

去年の11月に勢いで500GB分のpcloudストレージを買いましたが、セキュリティー面が心配でほとんど使っていませんでした。rcloneのcryptリモートを設定したことで、センシティブなデータも含めてバックアップ用途に使えるようになりました。

Tech Tech