podman secret の pass ドライバー
podman の secret はデフォルトのドライバーとだとコンテナホスト側に暗号化されずに保存される。
However, the only implemented driver at the moment to store the sensitive information is a file driver, which means that the data will be stored on disk in unencrypted files controlled by the container host.
いまは暗号化されるドライバーあるようなので試してみる。
いまは暗号化されているパスワードストアを利用するドライバーがあるようなので試してみる。
先に書いておくと、パスワードストアは暗号化されていても、コンテナ実行中には復号化されたファイルがホスト側に保存されています。
pass ドライバー
ドライバーの一覧が記載されたドキュメントは見つからないのだが、pass
ドライバーというものがあるらしいことがわかる。
Bing の AI チャットで確認すると pass のパスワードストアを利用するドライバーとのこと。
パスワードストアを作成
とりあえずのテストなので CodeSandbox でサンドボックスを作り、その中のターミナルで実施。
デフォルトだと pass
はインストールされていないので、nix-env -iA nixpkgs.pass
でインストールしておく。あとは gpg
も少し古いぽいので気になるならどうにかして更新する(今回はそのまま使う)
gpg を使うということなので、テスト用にてきとうに鍵を作成しておく。
$ gpg --gen-key
<snip>
Real name: hankei6km
Email address: hankei6km@gmail.com
You selected this USER-ID:
"hankei6km <hankei6km@gmail.com>"
Change (N)ame, (E)mail, or (O)kay/(Q)uit? O
鍵ができたら pass
コマンドで init してパスワードストアを作成。
$ pass init hankei6km@gmail.com
mkdir: created directory '/project/home/hankei6km/.password-store/'
Password store initialized for hankei6km@gmail.com
Permission denied
CodeSandbox で gpg --gen-key
するとエラーになる。
gpg: agent_genkey failed: Permission denied
Key generation failed: Permission denied
原因の根本はたぶんこれと同じ。
対応方法。下記のようにして、script
の中でコマンドを実行する。
$ script -q -c "gpg --gen-key" /dev/null
うまくいけば、pinentry の画面が表示される。
おそらく、鍵のロックを解除するときにも同じことになるので、そのときはそれぞれのコマンドを script
で動かす。
CodeSandbox 以外でもブラウザーでターミナルを表示するような環境だと同じようなことがあるかもしれない。
Podman からシークレット追加
$ cat password.txt
abcdefg
$ podman secret create --driver pass my_pass password.txt
f0a3d9069826c63813ebc3cd6
podman secret ls
で確認すると DRIVER
が pass
になっていている。また pass
で確認すると パスワードストアにも追加されている。
$ podman secret ls
ID NAME DRIVER CREATED UPDATED
f0a3d9069826c63813ebc3cd6 my_pass pass 11 seconds ago 11 seconds ago
$ pass
Password Store
└── f0a3d9069826c63813ebc3cd6
コンテナから利用する
利用方法は file
ドライバーのシークレットと同じ、なのだが何故かエラーになる。
$ podman run --rm -it --secret my_pass alpine:latest
Error: f0a3d9069826c63813ebc3cd6: no secret data with ID
これは冒頭に引用した issue と同じエラーでとりあえずの対処法も同じ。
rm ~/.gnupg/S.gpg-agent*
ln -s {$XDG_RUNTIME_DIR/gnupg/,~/.gnupg/}S.gpg-agent
ただし、CodeSandbox 特有のことかもしれないが、これでもエラーになることがある。おそらくエージェントのソケットとかその辺がかみ合っていないと思われる。
そのときは、鍵のロックをなんらかの方法で解除しておく。上記の場合だと pass f0a3d9069826c63813ebc3cd6
を実行すると解除することになる。
あらためて run
するとコンテナ内でファイルが配置され、シークレットが読み出せる。
$ podman run --rm -it --secret my_pass alpine:latest
/ # ls -al /run/secrets/
total 12
drwxr-xr-x 2 root root 4096 Apr 19 17:42 .
drwxr-xr-x 3 root root 4096 Apr 19 17:42 ..
-r--r--r-- 1 root root 7 Apr 19 17:42 my_pass
/ # cat /run/secrets/my_pass
abcdefg
とりあえず動くことは確認できたので良いのだが、まだちょっと不安定なのかな?
issue の人はハードウェアトークンで使っているらしいので、頑張ればそういったこともできるのだろうなと。
あとは、できれば gnome keyring が使えるとうれしいのだけど、 keyring
みたいなドライバーはなさそう。
コンテナ実行中はコンテナホスト側に復号化されたファイルができている
確認
コンテナ側でマウント情報を確認。
$ podman secret ls
ID NAME DRIVER CREATED UPDATED
f954b111c3c625d9f138f1346 my_pass pass About a minute ago About a minute ago
$ podman run --rm -it --secret my_pass alpine:latest
/ # cat /run/secrets/my_pass
abcdefg
/ # grep my_pass /proc/self/mountinfo
338 325 254:32 /home/hankei6km/.local/share/containers/storage/overlay-containers/887571e87450aed1b363f9da97ff471ec950a869f7431e6c7a82c26c0e7cc9bd/userdata/secrets/my_pass /run/secrets/my_pass rw,relatime - ext4 /dev/vdc rw,stripe=16
ホスト側でも見ることができる(mountinfo
では /project
が抜けている理由は不明)。
$ cat /project/home/hankei6km/.local/share/containers/storage/overlay-containers/887571e87450aed1b363f9da97ff471ec950a869f7431e6c7a82c26c0e7cc9bd/userdata/secrets/my_pass
abcdefg
コンテナ側で書き換えるとホスト側も変更される
/ # echo 12345 > /run/secrets/my_pass
/ # cat /run/secrets/my_pass
12345
$ cat /project/home/hankei6km/.local/share/containers/storage/overlay-containers/887571e87450aed1b363f9da97ff471ec950a869f7431e6c7a82c26c0e7cc9bd/userdata/secrets/my_pass
12345
緩和策
--userns auto
などで id を remap しておくと見るのは難しくなる。ただし、root
がその気になればたぶん見ることができる。
$ podman run --rm -it --secret my_pass --userns auto alpine:latest
/ # cat /run/secrets/my_pass
abcdefg
/ # grep my_pass /proc/self/mountinfo
295 282 254:32 /home/hankei6km/.local/share/containers/storage/overlay-containers/36a3d7296e650ac225bd09938593d4265df5a4b216e15b242628d75ca59aee01/userdata/secrets/my_pass /run/secrets/my_pass rw,relatime - ext4 /dev/vdc rw,stripe=16
# cat /project/home/hankei6km/.local/share/containers/storage/overlay-containers/36a3d7296e650ac225bd09938593d4265df5a4b216e15b242628d75ca59aee01/userdata/secrets/my_pass
cat: /project/home/hankei6km/.local/share/containers/storage/overlay-containers/36a3d7296e650ac225bd09938593d4265df5a4b216e15b242628d75ca59aee01/userdata/secrets/my_pass: Permission denied
$ ls -l /project/home/hankei6km/.local/share/containers/storage/overlay-containers/36a3d7296e650ac225bd09938593d4265df5a4b216e15b242628d75ca59aee01/
total 4
drwx------ 5 231072 231072 4096 Apr 21 08:06 userdata