ファイルをディスク上で暗号化し、ログイン時に自動で復号する方法まとめ(Windows・Linux)

概要

モバイルPCなどでは、盗難のリスクがあるため、機密性の高いユーザーデータはディスク上に平文で保存せず、適切に暗号化した状態で保存することが望ましいといえます。ただ、復号のために専用のパスワードを入力するような方法は手間がかかるため、この記事では、ユーザーが特に操作しなくても通常のログインに伴ってシームレスに復号が完了するようなシステムを取り扱います。WindowsLinux(・Android)を対象とします。

Windows①: Bitlocker

Windowsでは、まず標準搭載のBitlockerがこの役割を果たします。Windows Homeエディションでは機能が制限されていてBitlockerの有効/無効を直接切り替えることはできませんが、システムドライブ(C:)に関しては「デバイスの暗号化」という名前でBitlockerによる暗号化を有効にすることができます。

Bitlockerはディスク全体の暗号化であり、特定のユーザーに紐付いたものではありません。正規の方法でWindowsにログインすれば、ユーザーが誰であっても復号されます。

Windows②: EFS

EFSもWindows標準の機能で、こちらはディスク全体ではなくファイル・フォルダ単体での暗号化を提供します。エクスプローラーのプロパティの「内容を暗号化してデータをセキュリティで保護」から有効にできます。ただしこれも、WindowsのHomeエディションでは使用できないという難点があります。Homeエディションは痒いところに手が届きませんね…

Windows③: DPAPI

上記以外の方法として、DPAPI (Data Protection API)を使う方法があります。これは、ログインしているユーザーにしか復号できない方法で文字列データなどを扱うことができます。これを用いてパスワードなどを暗号化しておけば、該当ユーザーでログインしている間だけそのパスワードを使って暗号化ファイルシステムを復号しておくことができます。

これをやってくれるソフトウェアの例がCryptomatorです。ローカルディスクやネットワークフォルダ(WebDAV)など複数の形式でのマウントに対応しており、筆者も愛用しています。おすすめです。

自前でやりたい場合は、DPAPIを直接呼んでもいいですが、軽い用途であればPowerShell経由で呼ぶ方法もあります。以下のサイトを参照してください。例えば筆者はこれを使ってRcloneのconfigのパスワードを暗号化して保存しています。(暗号化した状態でpass.txtに保存しておいて、getcredential passみたいなコマンドで平文が取れる)

スケジュールジョブ(PowerShell)でパスワードをセキュアに使う(セキュアストリング編)

GitHub - senkousya/usingEncryptedStandardStringOnPowershell: 🔰Windows PowerShellで文字列の暗号化と復号化

Linux

Linuxでは、保存データ暗号化 - ArchWikiにだいたいのことが書いてありますが、今回の記事の趣旨に最もよく合致するのはecryptfsかと思います。最低限使うだけだったら、ecryptfs-setup-privateというコマンドを実行すれば、ログイン時だけマウントされる~/Privateというフォルダが作成されます(暗号化された本体データは~/.Privateにあります)。もう少し詳細な説明はLinux で eCryptFS を使用してファイルとディレクトリを暗号化する方法などを見てください。ecryptfs以外だとLUKSも有名ですね。こちらは多分Bitlockerに近いと思います。

自前で似たようなことをしたい(つまりDPAPI的なものが欲しい)場合は、Post Exploitation: Sniffing Logon Passwords with PAM · Embrace The Redのようにするとログイン成功時(GUIログイン含む)にログインパスワードが平文で取れるので、それを使って任意データの暗号化・復号を行うことができそうな感じはします。しかしセキュリティ的に問題のない具体的な実装方法は知りません。ecryptfsも、eCryptfs - ArchWikiに「ログイン時に自動マウントさせる場合、ユーザーアカウントにログインするときに使うのと同じパスワードでなくてはなりません。」とか書いてあるので実質同じような仕組みを使っているのかなとはと思います。特段の理由がなければ、ecryptfsをDPAPIがわりに使うので満足しておくのがよさそうな気がします。

.NETの移植版であるMonoではDPAPIに対応する実装がありますが、暗号化キー自体はディスク上で平文で見れてしまうようです(Storing Secrets in Linux - DZone)。

CryptomatorのLinux版とかはkeyring?っぽいのを使っているようですが、なんかGUIがないと動作しないイメージでよくわかんないです。

あとこれも詳しくはわかりませんが最近はsystemd-creds - ArchWikiというのも出てきているようです。

Android

Androidでは、おそらくある程度最近のものであれば、「スマートフォンの暗号化」「端末の暗号化」といった名前で、パーティションの暗号化がデフォルトで有効になっているはずです。スマホは特に盗難のリスクがあるのでディスク上暗号化が重要ですね。

注意点

保存データ暗号化 - ArchWikiにある通り、今回紹介したような方法は、メモリに直接アクセスしたり、あるいはインターネット経由で(ログインユーザーの権限を使って)攻撃したりといった手法には効果がありません。必要に応じて別の防御手段を追加するなどしましょう。

また当然、ログインパスワードはある程度強固なものにしておく必要があります。

まとめ

Cryptomator(DPAPI)とかecryptfsは手軽に使えますし、何もしないよりマシなのは間違いないので使っていきましょう。

あと盗難には気を付けましょう。