最後の実行ユーザーが root の Dockerfile

root が必要なビルド処理を終えた後は、アプリケーションの既定の実行ユーザーを非 root アカウントに変更してください。

説明

最終イメージで USER root を維持すると、ランタイムで上書きしない限りコンテナープロセスは root として実行されます。ビルド時に root が必要でも、アプリケーションの実行まで同じ権限を維持すると侵害時の被害が広がる可能性があります。

コンテナー内の root が、そのままホストへの無制限なアクセスを意味するわけではありません。影響は capability、マウント、ランタイムの隔離設定にも依存します。

想定される影響

  • 侵害されたアプリケーションが、コンテナー内のより広い範囲のファイルやプロセスにアクセスできる場合があります。
  • 機密性の高いホストマウントや過剰な権限があると、ホストのリソースへも影響する可能性があります。

対処方法

  • パッケージのインストールやアカウント作成など、root が必要な処理を先に済ませてから一般ユーザーへ切り替えてください。
  • 最終実行ステージに必要な非 root アカウントを用意し、USER で指定してください。必要なファイルとディレクトリだけに権限を付与してください。
  • イメージの既定ユーザーとデプロイ時の上書きを確認し、変更後のアプリケーションをテストしてください。

例

アカウント作成と既定の実行ユーザーを比較する抜粋です。アプリケーションファイルと起動コマンドは別途用意してください。

変更前

dockerfile
FROM alpine:3.22
USER root
RUN adduser -D appuser

appuser を作成しても実行ユーザーは切り替わらず、最後の指定は root のままです。

変更後

dockerfile
FROM alpine:3.22
USER root
RUN adduser -D appuser
USER appuser

アカウント作成後に USER appuser で既定のユーザーを切り替えています。ファイル権限とランタイム設定も確認してください。

参考資料