Open8

podman secret の pass ドライバー

hankei6kmhankei6km

podman の secret はデフォルトのドライバーとだとコンテナホスト側に暗号化されずに保存される。

https://www.redhat.com/sysadmin/new-podman-secrets-command

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.

いまは暗号化されるドライバーあるようなので試してみる。

いまは暗号化されているパスワードストアを利用するドライバーがあるようなので試してみる。

hankei6kmhankei6km

先に書いておくと、パスワードストアは暗号化されていても、コンテナ実行中には復号化されたファイルがホスト側に保存されています。

hankei6kmhankei6km

パスワードストアを作成

とりあえずのテストなので 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
hankei6kmhankei6km

Permission denied

CodeSandbox で gpg --gen-key するとエラーになる。

gpg: agent_genkey failed: Permission denied
Key generation failed: Permission denied

原因の根本はたぶんこれと同じ。

https://wiki.archlinux.jp/index.php/GnuPG#su

対応方法。下記のようにして、script の中でコマンドを実行する。

$ script -q -c "gpg --gen-key" /dev/null

うまくいけば、pinentry の画面が表示される。
新しい鍵に設定するパスワードを入力ダイアログをターミナル上で pinentry が表示しているスクリーンショット

おそらく、鍵のロックを解除するときにも同じことになるので、そのときはそれぞれのコマンドを script で動かす。

CodeSandbox 以外でもブラウザーでターミナルを表示するような環境だと同じようなことがあるかもしれない。

hankei6kmhankei6km

Podman からシークレット追加

$ cat password.txt 
abcdefg                                                                                                                                                                                                    
$ podman secret create --driver pass my_pass password.txt 
f0a3d9069826c63813ebc3cd6

podman secret ls で確認すると DRIVERpass になっていている。また pass で確認すると パスワードストアにも追加されている。

$ podman secret ls
ID                         NAME        DRIVER      CREATED         UPDATED
f0a3d9069826c63813ebc3cd6  my_pass     pass        11 seconds ago  11 seconds ago
$ pass
Password Store
└── f0a3d9069826c63813ebc3cd6
hankei6kmhankei6km

コンテナから利用する

利用方法は 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 の人はハードウェアトークンで使っているらしいので、頑張ればそういったこともできるのだろうなと。

https://support.yubico.com/hc/en-us/articles/360013790259-Using-Your-YubiKey-with-OpenPGP

あとは、できれば gnome keyring が使えるとうれしいのだけど、 keyring みたいなドライバーはなさそう。

hankei6kmhankei6km

コンテナ実行中はコンテナホスト側に復号化されたファイルができている

確認

コンテナ側でマウント情報を確認。

$ 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