コンテナアプリケーションの脆弱性を減らす
セキュリティ侵害を防ぐには、まずアプリケーションの弱点である攻撃対象領域(アタックサーフェス)を減らすことが重要です。
安全なイメージの作成
よくベースイメージとして利用されるLinuxディストリビューションはカーネルを除く基本的な設定ファイルやパッケージ、ビルドツールなどが一通り含まれます。これらの中には本番環境には必要のないファイルが多数含まれています。
この不要なファイルを削除し、アプリケーションの実行に必要な最小限のファイルのみを含んだコンテナイメージのことをdistrolessイメージと呼びます。
例えば、Goで開発したアプリケーションの場合、実行可能なバイナリを作成するにはGoコンパイラが必要ですが、バイナリを実行するコンテナは、Goコンパイラは不要です。マルチステージビルドに分割することで、最初のステージでコンパイルを実行してバイナリを作成し、次のステージではバイナリのみを含む軽量なイメージを作成します。この本番環境用のイメージのベースイメージにはdistrolessイメージである「gcr.io/distroless/static」を使います。
dockerfile
FROM golang:1.17 as build-env
WORKDIR /go/src/app
COPY *.go .
RUN go mod init
RUN go get -d -v ./...
RUN go vet -v
RUN go test -v
RUN CGO_ENABLED=0 go build -o /go/bin/app
FROM gcr.io/distroless/static
COPY --from=build-env /go/bin/app /
CMD ["/app"]
なお、パブリックリポジトリからダウンロードしたイメージはマルウェアや悪意のあるコードが含まれている可能性があります。そのため必ず信頼できるイメージを使用しましょう。
例えば、Azureが提供するコンテナレジストリサービスであるAzure Container Registryを使うとイメージに署名をつけることができます。イメージの利用者は、該当のイメージが作成者本人によって署名され改変されていないことが確認できます。
$ docker push myregistry.azurecr.io/myimage:v1
...
The push refers to repository [myregistry.azurecr.io/myimage]
ee83fc5847cb: Pushed
v1: digest: sha256:aca41a608e5eb015f1ec6755f490f3be26b48010b178e78c00eac21ffbe246f1 size: 524
Signing and pushing trust metadata
You are about to create a new root signing key passphrase. This passphrase
will be used to protect the most sensitive key in your signing system. Please
choose a long, complex passphrase and be careful to keep the password and the
key file itself secure and backed up. It is highly recommended that you use a
password manager to generate the passphrase and keep it safe. There will be no
way to recover this key. You can find the key in your config directory.
Enter passphrase for new root key with ID 4c6c56a:
Repeat passphrase for new root key with ID 4c6c56a:
Enter passphrase for new repository key with ID bcd6d98:
Repeat passphrase for new repository key with ID bcd6d98:
Finished initializing "myregistry.azurecr.io/myimage"
Successfully signed myregistry.azurecr.io/myimage:v1
詳細な手順は、公式ドキュメントAzure Container Registry におけるコンテンツの信頼を参考にしてください。