シークレットをローカルファイルに置かない方法
This content is a draft and will not be included in production builds.
近年はローカルファイルをスキャンして秘密鍵またはトークンを盗んでいく攻撃がある。その対策をするための方法を考える。
まずはファイルとして置かないためのツールを考える。
systemdのLoadCredentialEncrypted=
Section titled “systemdのLoadCredentialEncrypted=”ユニットとして登録できるものならsystemdで安全にパスワードを扱うのように記述するといい。環境変数ファイルを読み込んだ後にコマンドを実行する方法で書いたが、必要なときに一度だけ実行したいケースでも systemd-run を使うと LoadCredentialEncrypted= が使える。
systemd-creds
Section titled “systemd-creds”ユニットとして実行できない場合は、ユーザー権限でsystemd-credsを使うでみたように、systemd-creds を使うと、TPMに鍵を持った状態で暗号化しておき、必要なときにファイルを複合してプロセスへ渡すことができる。
factotum + secstore
Section titled “factotum + secstore”これが使えるなら一番いい。
Secret Service Specification
Section titled “Secret Service Specification”Linuxデスクトップでのシークレット管理APIを使う方法もある。これはインターフェイスであってストレージではないので、なんらかのバックエンドストレージが必要になる。
GPGで暗号化
Section titled “GPGで暗号化”なんらかの方法で暗号化してファイルに保存する方法もある。必ずしもGPGじゃなくてもいいが、どのみち暗号化のために鍵が必要となるので、もともと使っているGPGが都合いいだろうと判断した。使い方などはGPGの使い方でリンクしたメモに書いた。
実際に管理が必要なツールごとにみる。
factotum
Section titled “factotum”factotum は secstore を読むためのパスワードが必要になるが、一般的にこれらはsystemdのサービスとして実行することになるのでパスワード入力ができない。なのでfactotumをsystemdで管理するで書いたように LoadCredentialEncrypted= を経由してパスワードを受け取るといい。
Gitは credential-helper という形で資格情報を取り出すための仕組みがある。ここは factotum で対応する。
SSHの秘密鍵は暗号化される機能が組み込まれているのでそれを使う。またはgpg-agentをssh-agentとして使う場合も暗号化されるから安全な状態でファイルシステムに置ける。
GitHub CLI
Section titled “GitHub CLI”これは非常に難しい。特に何もしなければ gh auth token でトークンを取り出せるようになっており、実態は ~/.config/gh/hosts.yml に生のトークンが書かれている。
blogsync
Section titled “blogsync”これも難しい。トークンをテキストファイルに書く方法しか対応していない。