2017年4月21日 星期五

設定 「只在記憶體裡解密」 的工作環境

用 symbolic link 指向記憶體裡的設定檔 開機隨身碟帶著跑很方便; 但它等於是你的筆電, 如果掉了, 私密資料都在上面, 很危險的啊! 可不可以把重要資料都加密呢? 例如 ssh 的私鑰 gpg 的私鑰 瀏覽器的密碼檔、 各種帳號密碼、 通訊錄、 ...等等。 這樣萬一掉了, 至少沒有人可以拿它來入侵你的帳號。 luks 可以加密整個檔案系統, 但是好像有點殺雞用牛刀。 eCryptfs 可以只加密一個目錄, 但是還是需要 root 權限。 讀了 這個回答 之後理解到: 「開機使用期間」 不太可能完整防護 (除非你自己是 root 大大)。 那就只談關機後的資料保護吧, 範圍縮小, 問題就變簡單啦! 私密檔案存入硬碟或隨身碟時一律加密, 只有在開機時才解開來使用。 這其實不太需要採用太複雜的技術, 只需要確保電腦關機時解密的資料通通自動消失就可以了。

一、 預備

假設你已經 用 GnuPG 建立你的 PGP 金鑰。 先把你的金鑰備份並且加密: tar chz -C ~ .gnupg/ | gpg -c > ~/gnupg.gpg 。 這裡 gpg 後面的 -c 意思是採用 (不需要公私鑰的) 對稱式加解密。 你需要設定一個不會忘記的長密碼。 (會被問兩次, 以便確認。) 這個密碼像是開啟 「放一堆鑰匙的盒子」 的鎖的主鑰匙, 忘記的話, 後面加密的檔案就全部救不回來了。 因為等一下我們要把 gpg 公私鑰分開放、 把私鑰鎖起來, 所以需要用普通 (對稱式加密) 的方式加密整個 ~/.gnupg 目錄。 這個 gnupg.gpg 檔可以多備幾份, 放在隨身碟上也沒關係。

我自己習慣把最近工作玩耍相關、 經常需要備份的所有檔案都放在同一個目錄底下, 比方說叫做 ~/work/ 好了。 把工作檔案集中, 量不大, 才會養成每天備份 (好幾次) 的好習慣、 不怕遺失檔案或被勒贖軟體加密上鎖。 請現在就先備份你的工作檔, 因為等一下我們會把私密資料搬到記憶體裡, 如果你關機前忘記先備份, 就哭了 -- 你會失去所有的朋友 (通訊錄) 跟密碼!

本來我所有的設定檔 -- 例如 ~/.ssh 、 ~/.gnupg 、 一部分的 ~/.config 等等 -- 就都已經放在 ~/work 底下, 然後從原來應該放置這些檔案的位置, 建立 symbolic links (即捷徑的概念) 指向真實的存放位置。 這樣 ssh 跟 gnupg 這類的程式才能正確運作, 而且每拿到一部空電腦或重灌系統, 很快就可以設定好自己的環境。 (我有一個 script 可以一口氣建立所有 symlinks。) 請見上圖的中間及右側。

二、 設定

現在, 改將所有私密的檔案 -- 各種私鑰、 密碼、 通訊錄、 ... -- 移到另一個目錄底下, 比方說叫做 ~/secret/ 好了。 同樣地, 需要重新調整一部分的 symlinks (讓軟體可以在各自預設的目錄下找得到它們自己的設定檔)。 最後結果如上圖。

這個放置私密檔案的目錄, 最好放在記憶體裡, 這樣就可以省略 「用完記得刪檔案!」 的動作。 比方說, 萬一電腦臨時拔插頭也沒關係, 這些未加密的檔案就自動消失了。 下 df 指令, 會看到有一個 tmpfs 掛載在 /run 底下, 這就是一個 ramdisk。 另外, 可能是因為我有在用 psd 防止瀏覽器折磨隨身碟 所以還看到另一個 tmpfs 掛載在 /run/user/1000 底下, 其中 1000 是我的 uid (用 grep $USER /etc/passwdid -u 可以看得出來)。 如果沒有的話, 就手動建立: mkdir -p /run/user/$(id -u)/secret

所以我把剛剛建立的 ~/secret/ 目錄搬到這底下, 並且從家目錄建一個 symlink 指向這裡: ln -s /run/user/$(id -u)/secret ~ (上圖沒有畫出這個連結)。 至於公鑰, 則還是放在正常備份的 ~/work 目錄底下。 另外, 順便把 ~/.gnupg 多複製一份到 ~/secret 的 tmp/ 暫存子目錄下: mkdir ~/secret/tmp ; cp -rL ~/.gnupg ~/secret/tmp 等一下會用到。

再來, 設定三個 alias:

alias dec-gpg="mkdir -p /run/user/$(id -u)/secret ; gpg -d < ~/gnupg.gpg | tar xhz -C ~/secret"
alias dec-all-sec="gpg -d --homedir ~/secret/tmp/.gnupg < ~/secret.gpg | tar xhz -C ~"
alias enc-all-sec="mkdir -p /run/user/$(id -u)/secret ; tar chz -C ~ secret/ | gpg -ear 代號 > ~/secret.gpg"

上面 gpg 指令後面的 --homedir ~/secret/tmp/.gnupg 叫 gpg 去 ~/secret/tmp/.gunpg 暫存目錄讀設定跟金鑰 (因為 secret.gpg 裡面的資料還沒有解出來, 所以 gpg 指令無法在正常的 ~/.gnupg 目錄找到你的公鑰私鑰)。 至於 tar chz 裡面的 h 跟前面 cp -rL 的 L 意思一樣, 指示要順著 symbolic link 追到底抓出真實的檔案內容, 而不要只是記下連結卻漏了檔案內容。 「代號」 則根據當初你設定 gpg 金鑰時所填的值來寫, 例如我自己就填 ckhung@cyut (e-mail 的一部分, 不需要是完整字串, 夠長、具識別力就好)。

測試一下, 如果 ok 的話, 就把這三句話放到 ~/.bashrc 裡面去。 從此以後, 每次開機後第一件事就是先用 dec-gpg 把 gnupg.gpg 解到暫存目錄去 (要打一次主密碼)、 再用 dec-all-sec 把 ~/secret 解出來 (再打 gpg 的密碼)。 如果你在使用電腦的過程當中有改過 ~/secret 底下任何一個檔案的話, 每次關機前還要執行 enc-all-sec 把更動過後的私密檔案打包加密。 (因為是非對稱式加密, 不需要打密碼) 最好也順便把 secret.gpg 跟 ~/work/ 的備份檔一起複製到隨身碟上。

三、 提醒

這樣做不僅很麻煩, 而且還會有一些額外的風險: 如果你透過某些軟體 (例如 pidgin 即時通) 間接修改過任何私密檔案, 但關機前卻忘記打包, 下一次再使用卻又是很久之後, 就會遺失一些資訊, 那就有點麻煩了。 沒辦法, 方便跟安全經常站在對立面。

再來, 這也並不是萬無一失的辦法。 比方說記憶體的內容可能會被 swap 到硬碟上、 vim 在編輯檔案時會建立暫存檔、 ... 對於真正的數位鑑識專家而言, 這還是有很多漏洞的。 大約只能防我自己這種普通等級的高手而己。 此外, 像是 wifi 密碼之類的, 是放在系統設定檔裡面, 所以這個保護也並不完全。 千萬別只學了這一兩招就自以為可以像 Edward Snowden 一樣那麼神勇地揭發美國政府的陰謀啊!

不過以我們原來 「保護遺失的開機隨身碟避免被一般好奇人士偷窺」 的小小目標來說, 這樣做應該還算足夠。 而且這個方法可以很精確地只備份少數真正重要的私密檔案, 做出來的 secret.gpg 還蠻小的, 有利於進一步處理。 (例如 用隱寫術把它藏在圖檔裡) 總之, 實際上我在自家電腦上, 並沒有建立 ~/secret 這個 symlink, 而是直接讓它以未加密的狀態裸露存放在硬碟上, 關機也不會消失。 只有在筆電或隨身碟上才這麼囉嗦。

四、 感言

資安專家 Bruce Schneier 說過: Security is a process, not a product.。 這個例子就是一個實證。 就算我把這些 scripts 打包起來、 整理成一個漂漂好用的 GUI 套件, 也很難讓更多人受惠。 整件事情最麻煩的部分是 請用戶根據自己的需求及使用狀況, 去決定、 整理私密檔案放置的地點。 你還需要知道自己在用的哪些 apps (例如 pidgin 即時通) 其實也包含了私密資料、 這些資料放在哪裡。 資訊安全需要的是文化, 不是產品。 想要要提升國家資安, 補助資安通識教育遠比補助資安教授更重要。

另外, 跟圖形介面比起來, 這些指令顯得有點繁瑣囉嗦甚至嚇人; 但跟寫程式比起來, 這些指令卻又是很簡單的小兒科。 這就是為什麼我認為如果真的要推全民寫程式, 應該推 實用到廿二世紀的 shell script

再來, 這個例子也說明了為什麼 為用而學 很重要、 為什麼 (至少在資安領域) 「為賣而學」 是完全畫錯重點的思考方向。 只有極少的人有機會進入資安產業; 但是所有人都應該有一點資安技能。 即使你的資安技能已經達到可以照著本文實作的程度, 也完全不可能因此而在趨勢科技找到工作啊! 但是像這類 (少有人具備) 的重要技能, 對於個人隱私或小公司機密的基本防護卻有著極大的意義。

更廣泛地來說, 軟體技術的很多其他面向也是如此: 專屬軟體關心的是如何賺你的錢, 所以真正對你有幫助但賣相不好 (需要用戶自己設定一大堆東西) 的軟體, 你很難在市場上買到; 就算出現了, 你可能也不會想買, 然後那家公司就倒了。 另一方面, 自由軟體的使用價值 (use value) 遠高於販售價值 (sale value)。 這也是為什麼我在對於 「在通識課推廣自由軟體」 比對於申請國科會的自由軟體計畫 (現在沒有了, 謝天謝地!) 更有興趣。 我們這個社會現在最欠缺的, 不是軟體跟程式設計師, 而是懂得善用 (自由) 軟體完成工作的 power users。 當一位 power users 的帶路人比寫論文更能讓我感受到生命的意義 :-)

其實手機更需要這樣的保護。 但是因為在 android 上面, 想寫 scripting 語言困難重重、 隱私資訊檔案放置的位置有點神秘、 ... 總之對我來說, 有太多門檻還沒跨過, 就只好放棄了。 雖然同樣是採用 linux 核心, 但 android 的開放自由度遠比不上 GNU/Linux 啊!

沒有留言:

張貼留言