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 参考図書
今回の記事執筆にあたり参考にした図書は以下のものです。