hana_shinのLinux技術ブログ

Linuxの技術情報を掲載しています。特にネットワークをメインに掲載していきます。

Podman secretコマンドの使い方



1 はじめに

コンテナを実行する際、コンテナ内で稼働するサービスに機密情報を渡す場合があります。例えば、データベースを操作するサービスの場合、管理者ユーザー名とパスワードが必要です。これらを環境変数としてコンテナに渡すこともできますが、その場合、稼働中のコンテナのイメージをcommitすると、機密情報がイメージに書き込まれてしまいます。これを防ぐために、secretコマンドがあります。secretコマンドを使うと、機密情報をコンテナに渡しても、これらはコンテナをcommitしてもイメージに書き込まれません。そのため、イメージから機密情報を盗まれる心配がありません。

2 検証環境

サーバのAlmaLinux版数は以下のとおりです。

[root@server ~]# cat /etc/redhat-release
AlmaLinux release 9.2 (Turquoise Kodkod)

カーネル版数は以下のとおりです。

[root@server ~]# uname -r
5.14.0-284.11.1.el9_2.x86_64

3 podmanのインストール方法

podmanパッケージをインストールします。

[root@server ~]# dnf -y install podman

podmanコマンドの版数を確認します。

[root@server ~]# podman -v
podman version 4.9.4-rhel

4 secretコマンドのオプション一覧

secret コマンドのオプション一覧は以下のとおりです。

[user1@server ~]$ podman secret --help
Manage secrets

Description:
  Manage secrets

Usage:
  podman secret [command]

Available Commands:
  create      Create a new secret
  exists      Check if a secret exists in local storage
  inspect     Inspect a secret
  ls          List secrets
  rm          Remove one or more secrets

5 シークレットの作成、削除方法

秘密情報をファイルに書き込みます。

[user1@server ~]$ echo "This is my secret" > /tmp/secret

秘密情報からシークレットを作成します。

[user1@server ~]$ podman secret create my_secret /tmp/secret
316775a474faa7e8fd7d02ae9

作成したシークレットを確認します。my_secret という名前のシークレットが作成できたことが確認できます。

[user1@server ~]$ podman secret ls
ID                         NAME        DRIVER      CREATED         UPDATED
316775a474faa7e8fd7d02ae9  my_secret   file        30 seconds ago  30 seconds ago

シークレットを削除します。

[user1@server ~]$ podman secret rm my_secret
316775a474faa7e8fd7d02ae9

シークレットを確認します。シークレットが削除されたことが確認できます。

[user1@server ~]$ podman secret ls
ID          NAME        DRIVER      CREATED     UPDATED

6 シークレットを使った実施例

コンテナに秘密情報(IDやパスワード等)をシークレットとして渡す方法について説明します。

6.1 シークレットをパラメータでコンテナに渡す方法

秘密情報(ID/パスワード)をファイルに書き込みます。

[user1@server ~]$ echo "My_ID" > /tmp/ID
[user1@server ~]$ echo "My_PASS" > /tmp/PASS

秘密情報のシークレットを作成します。

[user1@server ~]$ podman secret create my_id /tmp/ID
[user1@server ~]$ podman secret create my_pass /tmp/PASS

作成したシークレットを確認します。

[user1@server ~]$ podman secret ls
ID                         NAME        DRIVER      CREATED        UPDATED
7e2ee29c41b71ad99f1ae6ff8  my_pass     file        3 seconds ago  3 seconds ago
40e84374a2b5845bf8409aa92  my_id       file        7 seconds ago  7 seconds ago

イメージ(almalinux)からコンテナ(test1 )を起動します。このとき、--secretオプションを使用して、シークレットをコンテナ内で使用できるようにします。

[user1@server ~]$ podman run -dit --secret my_id --secret my_pass --name test1 almalinux

コンテナでbashを実行します。

[user1@server ~]$ podman exec -it test1 bash
[root@e369a7f4a5ab /]#

/run/secrets 配下を確認すると、ホストからコンテナにシークレットが渡されていることがわかります。

[root@e369a7f4a5ab /]# cat /run/secrets/my_id
My_ID
[root@e369a7f4a5ab /]# cat /run/secrets/my_pass
My_PASS

コンテナからぬけます。

[root@e369a7f4a5ab /]# exit
exit

コンテナを確認します。test1という名前のコンテナが動作していることが確認できます。

[user1@server ~]$ podman ps
CONTAINER ID  IMAGE                               COMMAND     CREATED         STATUS         PORTS       NAMES
e369a7f4a5ab  docker.io/library/almalinux:latest  /bin/bash   47 seconds ago  Up 47 seconds              test1

commit コマンドを実行して、コンテナをイメージ(secret_img)に保存します。

[user1@server ~]$ podman commit test1 secret_img

イメージを確認します。

[user1@server ~]$ podman images
REPOSITORY                   TAG         IMAGE ID      CREATED        SIZE
localhost/secret_img         latest      a6524b1eb359  9 seconds ago  191 MB
docker.io/library/almalinux  latest      8109fa501eaf  6 weeks ago    191 MB

シークレットイメージ(secret_img)でコンテナを起動します。

[user1@server ~]$ podman run -dit --name test2 secret_img

コンテナでbashを実行します。

[user1@server ~]$ podman exec -it test2 bash
[root@0b2d003707e0 /]#

コンテナを起動したイメージにシークレットが含まれないので、/run/secrets 配下にシークレットが存在しないことが確認できます。

[root@0b2d003707e0 /]# ls /run/secrets/*
ls: cannot access '/run/secrets/*': No such file or directory

コンテナからぬけます。

[root@0b2d003707e0 /]# exit
exit

次の検証のため、コンテナとイメージを削除します。

[user1@server ~]$ podman rm -f $(podman ps -aq)
[user1@server ~]$ podman rmi -f $(podman images -q)

6.2 シークレットを環境変数でコンテナに渡す方法

前回の検証でalmalinuxのイメージを削除したので、あたらめてalmalinuxイメージをダウンロードします。

[user1@server ~]$ podman pull docker.io/library/almalinux

シークレットは前回作成したものを使います。

[user1@server ~]$ podman secret ls
ID                         NAME        DRIVER      CREATED         UPDATED
40e84374a2b5845bf8409aa92  my_id       file        57 minutes ago  57 minutes ago
7e2ee29c41b71ad99f1ae6ff8  my_pass     file        57 minutes ago  57 minutes ago

イメージからコンテナを起動します。このとき、コンテナにシークレットを環境変数(type=env)として渡します。

[user1@server ~]$ podman run -dit --secret my_id,type=env --secret my_pass,type=env --name test1 almalinux

コンテナでbashを実行します。

[user1@server ~]$ podman exec -it test1 bash

コンテナで環境変数my_id、my_passの値を確認すると、環境変数に値が設定されていることが確認できます。

[root@53262a122865 /]# echo $my_id
My_ID
[root@53262a122865 /]# echo $my_pass
My_PASS
[root@53262a122865 /]#

コンテナからぬけます。

[root@53262a122865 /]# exit
exit

commit コマンドを実行して、コンテナをイメージ(secret_img)に保存します。

[user1@server ~]$ podman commit test1 secret_img

イメージを確認します。

[user1@server ~]$ podman images
REPOSITORY                   TAG         IMAGE ID      CREATED         SIZE
localhost/secret_img         latest      9a6defa8a539  42 seconds ago  191 MB
docker.io/library/almalinux  latest      8109fa501eaf  6 weeks ago     191 MB

シークレットイメージ(secret_img)でコンテナを起動します。

[user1@server ~]$ podman run -dit --name test2 secret_img

コンテナでbashを実行します。

[user1@server ~]$ podman exec -it test2 bash

コンテナを起動したイメージにシークレットが含まれないので、環境変数には値が何も設定されていないことが確認できます。

[root@eb48fee287cc /]# echo $my_id

[root@eb48fee287cc /]# echo $my_pass

[root@eb48fee287cc /]#

コンテナからぬけます。

[root@eb48fee287cc /]# exit
exit

Y 参考図書

今回の記事執筆にあたり参考にした図書は以下のものです。

単行本


Docker実践ガイド 第3版 (impress top gear)

電子書籍



Software Design (ソフトウェアデザイン) 2023年11月号 [雑誌]


Docker実践ガイド 第3版 impress top gearシリーズ