一覧SP-17-3 · CWPP:ワークロードの保護

コンテナの再作成とデータ・ログの保持

イメージ、動いている実体、ファイルとログの保存場所を対応付けて確認します。

説明

ワークロードを停止・再作成すると、古い実体にしかない一時データが失われる場合があります。同じイメージや同じ名前で作り直しても、元の実体と同一ではありません。

一時領域に公開ファイルを作り、終了前のログを取得します。その後同じイメージから再作成し、識別子、ファイル、起動ログを比較します。

イメージ、動いている実体、ファイルとログの保存場所を対応付けて確認します。

1最初のコンテナを作成する

新しいコンテナIDを履歴へ残します。

docker run最初のコンテナを作成する -d --name lbox-workload-sample --network none --read-only --tmpfs /tmp:rw,noexec,nosuid,size=1m sha256:5291449c3df73caf6ed85e649dec1b9e818b39a5d8c871e97afc13e9cd5e8fa8 sh -c 'echo public-start; sleep 600'

このIDを後で再作成したIDと比較します。同じ名前を使うだけでは実体の連続性を保証できません。

2一時領域に内容を保存する

6バイトの公開文字列を作り、ハッシュを取得します。

docker exec lbox-workload-sample sh -c 'printf public > /tmp/lesson-public; sha256sum一時領域に内容を保存する /tmp/lesson-public'

ファイルはこのコンテナのtmpfs上にあります。イメージ自体へ書き戻されたものではありません。

3終了前に起動ログを取得する

PID 1の標準出力に残った記録を開きます。

docker logs終了前に起動ログを取得する lbox-workload-sample

public-startです。前段のdocker execで表示した全コマンド出力が、PID 1のログへ自動で集約されるわけではありません。

4元のコンテナを停止して削除する

検証用コンテナだけを終了・削除します。

docker stop -t 1 lbox-workload-sample docker rm元のコンテナを停止して削除する lbox-workload-sample

元の実体のtmpfsは保持対象から外れます。調査で必要なファイルやログは、この操作より前に保存する必要があります。

5同じイメージから作り直す

名前とイメージ指定は最初と同じです。

docker run同じイメージから作り直す -d --name lbox-workload-sample --network none --read-only --tmpfs /tmp:rw,noexec,nosuid,size=1m sha256:5291449c3df73caf6ed85e649dec1b9e818b39a5d8c871e97afc13e9cd5e8fa8 sh -c 'echo public-start; sleep 600'

返るIDは最初と異なります。オーケストレーターによる置換でも、新しい実体を古いプロセスと取り違えないよう識別子を確認します。

6古い一時ファイルの有無を調べる

再作成したコンテナで同じパスを検索します。

docker exec lbox-workload-sample sh -c 'if test -e古い一時ファイルの有無を調べる /tmp/lesson-public; then echo present; else echo absent; fi'

absentです。一時領域の内容は引き継がれていません。永続ボリュームを使う構成では、別に保存範囲を確認します。

7同じイメージと新しい起動記録を照合する

イメージIDと新しい実体のログを開きます。

docker inspect --format '{{.Image}}同じイメージと新しい起動記録を照合する' lbox-workload-sample docker logs lbox-workload-sample

イメージは同じでも起動処理は再び実行されています。復旧を確認するときは、元の脅威要因がイメージや外部ボリュームに残っていないかも調べます。

まとめ

名前やイメージが同じでも再作成後は別の実体です。

終了前に必要な証跡を保存します。

一時領域と永続領域を分けて復旧を確認します。

操作履歴と解説を振り返れます。

Docker / Alpine 3.22 / ネットワークなし・読取り専用コンテナ

1
docker run -d --name lbox-workload-sample --network none --read-only --tmpfs /tmp:rw,noexec,nosuid,size=1m sha256:5291449c3df73caf6ed85e649dec1b9e818b39a5d8c871e97afc13e9cd5e8fa8 sh -c 'echo public-start; sleep 600'
2961bcfd1a7e58480461a966bf377381be391f206867d4695407d5af8885406a
2
docker exec lbox-workload-sample sh -c 'printf public > /tmp/lesson-public; sha256sum /tmp/lesson-public'
efa1f375d76194fa51a3556a97e641e61685f914d446979da50a551a4333ffd7  /tmp/lesson-public
3
docker logs lbox-workload-sample
public-start
4
docker stop -t 1 lbox-workload-sample docker rm lbox-workload-sample
lbox-workload-sample
lbox-workload-sample
5
docker run -d --name lbox-workload-sample --network none --read-only --tmpfs /tmp:rw,noexec,nosuid,size=1m sha256:5291449c3df73caf6ed85e649dec1b9e818b39a5d8c871e97afc13e9cd5e8fa8 sh -c 'echo public-start; sleep 600'
db6efce5bf6b5c846167e1692edd96250f9f019db173177925a480edb84355b0
6
docker exec lbox-workload-sample sh -c 'if test -e /tmp/lesson-public; then echo present; else echo absent; fi'
absent
7
docker inspect --format '{{.Image}}' lbox-workload-sample docker logs lbox-workload-sample
sha256:5291449c3df73caf6ed85e649dec1b9e818b39a5d8c871e97afc13e9cd5e8fa8
public-start

演習完了