ECRはイミュータブルにしておくと安全
レバテック開発部の松浪です。
現在、私はレバテックの認証基盤(レバテックID)の開発・保守を担当しているのですが、セキュリティ強化や一貫性の保証の観点からECRに置くコンテナイメージをイミュータブルとなるように設定を変更しました。
イミュータブルにすることでなぜセキュリティの強化に繋がるのか?一貫性が保証できるのか?
簡単にですが説明したいと思います。
そもそもECRって何?
ECRはAWSが提供するコンテナイメージのレジストリサービスです。
ECRを利用するとコンテナイメージの保存や管理、デプロイに使用したりできます。
イミュータブルにすると、一度保存したコンテナイメージを後から変更(上書き)することができなくなります。
※ Amazon Elastic Container Registry
GitHubActionsを利用したECSのデプロイ
認証基盤の機能のデプロイにはGitHub Actionsを利用しています。
図にするとこのような感じです。
GitHub上でリリースタグを切るとデプロイ用のworkflowを起動し、コンテナイメージとそれを利用するタスク定義を生成します。
その後、ECSの新しいサービスを起動させて本番環境に資材が反映されます。
ミュータブルなコンテナイメージの弊害
では、ミュータブルなコンテナイメージで運用している場合、どのような弊害があるのでしょうか?
大きく2つの弊害があります。
知らぬ間に書き変えられるリスクがある
ミュータブルなコンテナイメージは後から上書きすることが可能です。
攻撃者が既存のイメージを上書きしてマルウェアを挿入するリスクが考えられます。また、開発者が意図せずイメージを書き変えてしまう可能性もあります。
前回のイメージに切り戻せない場合がある
ミュータブルであればイメージタグを「latest」などの固定値で運用できてしまいます。
そのような運用方法では、最新のイメージで何らかの不具合を検知し切り戻したくても、1つ前のイメージは上書きされて既に存在しないので切り戻せなくなります。
イミュータブルにするメリット
イミュータブルなコンテナイメージであれば、上記2点の弊害を回避できます。
悪意のある変更から保護できる
イミュータブルにすると作成されたイメージタグは後から変更できません。結果として、悪意のある変更や意図しない変更から保護できます。
安全に切り戻しができる
イミュータブルであれば必然的に「latest」のような固定のイメージタグを使いまわせなくなります。
結果としてイメージの内容とタグの対応は一貫性が保証されるので、安全に前のバージョンに切り戻すことができます。
イミュータブルにする方法
IaCから設定する場合
IaCにterraformを使用しているのであれば、 image_tag_mutability
という属性でリポジトリをイミュータブルに指定することができます。
デフォルトでは MUTABLE
となっているので、 IMMUTABLE
にしておきましょう。
resource "aws_ecr_repository" "foo" {
name = "bar"
image_tag_mutability = "IMMUTABLE"
}
※ Terraform: Resource: aws_ecr_repository
AWS CDKを使用しているのであれば、ecr.Repositoryを生成する際に、オプションとして imageTagMutability
で指定します。
new ecr.Repository(this, 'Repo', { imageTagMutability: ecr.TagMutability.IMMUTABLE });
※ aws-cdk-lib.aws_ecr module: Image tag immutability
AWSコンソールから設定する場合
既存のリポジトリを選択して「編集」、もしくはリポジトリを新規作成する際に、イメージタグのミュータビリティを選択できます。
まとめ
イミュータブルなECRだと、
- 意図しないイメージの変更を防止できることからセキュリティ強化に繋がる
- イメージの内容とタグの一貫性が保証されることから安全に切り戻しできる
というメリットが得られることがわかります。
まだミュータブルなイメージを使用している方はぜひ今日から取り入れてみてください。
Discussion