Skip to content

シークレットをローカルファイルに置かない方法

This content is a draft and will not be included in production builds.

近年はローカルファイルをスキャンして秘密鍵またはトークンを盗んでいく攻撃がある。その対策をするための方法を考える。

まずはファイルとして置かないためのツールを考える。

ユニットとして登録できるものならsystemdで安全にパスワードを扱うのように記述するといい。環境変数ファイルを読み込んだ後にコマンドを実行する方法で書いたが、必要なときに一度だけ実行したいケースでも systemd-run を使うと LoadCredentialEncrypted= が使える。

ユニットとして実行できない場合は、ユーザー権限でsystemd-credsを使うでみたように、systemd-creds を使うと、TPMに鍵を持った状態で暗号化しておき、必要なときにファイルを複合してプロセスへ渡すことができる。

これが使えるなら一番いい。

Linuxデスクトップでのシークレット管理APIを使う方法もある。これはインターフェイスであってストレージではないので、なんらかのバックエンドストレージが必要になる。

なんらかの方法で暗号化してファイルに保存する方法もある。必ずしもGPGじゃなくてもいいが、どのみち暗号化のために鍵が必要となるので、もともと使っているGPGが都合いいだろうと判断した。使い方などはGPGの使い方でリンクしたメモに書いた。

実際に管理が必要なツールごとにみる。

factotumsecstore を読むためのパスワードが必要になるが、一般的にこれらはsystemdのサービスとして実行することになるのでパスワード入力ができない。なのでfactotumをsystemdで管理するで書いたように LoadCredentialEncrypted= を経由してパスワードを受け取るといい。

Gitは credential-helper という形で資格情報を取り出すための仕組みがある。ここは factotum で対応する。

SSHの秘密鍵は暗号化される機能が組み込まれているのでそれを使う。またはgpg-agentをssh-agentとして使う場合も暗号化されるから安全な状態でファイルシステムに置ける。

これは非常に難しい。特に何もしなければ gh auth token でトークンを取り出せるようになっており、実態は ~/.config/gh/hosts.yml に生のトークンが書かれている。

これも難しい。トークンをテキストファイルに書く方法しか対応していない。