こんにちは、尾谷です。
今日は仕事ではなく、プライベートで参加している JAWS-UG 初心者支部のイベント用に作成した CloudFormation テンプレートを Orca Security の Infrastructure as Code Security 機能を利用して、セキュリティ強化した話を紹介させてください。
先月の 5 月 27 日に JAWS-UG 初心者支部#56 Systems Manager 入門ハンズオン というイベントを開催しました。
Systems Manager の入門ハンズオンということで、CloudFormation で環境をデプロイし、その後手動で操作を体験していくという趣旨の手順を作りました。
イベントで利用した CloudFormation テンプレートは こちら からダウンロードできます。
本ブログで利用したスキャン前のテンプレートと比較をされたい方は こちら からダウンロードできます。
以前、こちらの記事でコンテナイメージをデプロイ前にスキャンする方法をご紹介しましたが、CloudFormation スタックをデプロイ前にスキャンできる Infrastructure as Code Security 機能のご紹介も兼ねています。
Cloud9 のデプロイ
まず、CloudFormation テンプレートをスキャンするため、Cloud9 を作ります。
東京リージョンの Cloud9 コンソールを開き、[Create environment] ボタンをクリックします。
インスタンスファミリーは t3.small
を選択しました。
デフォルト VPC のまま [Create] ボタンをクリックしました。
Cloud9 が操作できる状態になったので、JAWS-UG 初心者支部のイベント用に作成した CloudFormation テンプレートをダウンロードしました。
~/environment $ wget https://d3pivyjogqfrq3.cloudfront.net/Material/vpc-and-ec2.yaml --2023-05-21 13:24:15-- https://d3pivyjogqfrq3.cloudfront.net/Material/vpc-and-ec2.yaml Resolving d3pivyjogqfrq3.cloudfront.net (d3pivyjogqfrq3.cloudfront.net)... 18.65.214.178, 18.65.214.74, 18.65.214.18, ... Connecting to d3pivyjogqfrq3.cloudfront.net (d3pivyjogqfrq3.cloudfront.net)|18.65.214.178|:443... connected. HTTP request sent, awaiting response... 200 OK Length: 3503 (3.4K) [application/x-yaml] Saving to: ‘vpc-and-ec2.yaml’ 100%[======================================================================================================>] 3,503 --.-K/s in 0s 2023-05-21 13:24:15 (407 MB/s) - ‘vpc-and-ec2.yaml’ saved [3503/3503] ~/environment $
Orca CLI をインストール
スキャンを行うため、Orca CLI をインストールしました。
~/environment $ curl -sfL 'https://raw.githubusercontent.com/orcasecurity/orca-cli/main/install.sh' | bash info Discovered os: linux info Discovered architecture: amd64 info Platform check: Platform linux/amd64 is supported info Checking GitHub for latest tag. info github_release: the extracted version 1.18.1 info The desired version to download: 1.18.1 for 1.18.1/linux/amd64 info Installed /usr/local/bin/orca-cli ~/environment $
Settings → Modules → Integrations から [SHIFT LEFT SECURITY] の [INTEGRATE] ボタンをクリックし、
開いたダイヤログにて、Scan Type を Infrastructure as Code Security に変更して、CREATE API TOKEN をクリックしました。
名前をつけて、トークンの期限を設定して、[CREATE API TOKEN] ボタンをクリックして発行しました。ここでは、orca-cli Docker を利用したスキャンではなく、ドキュメントに記載された orca-cli にてスキャンを行いました。
指摘が 9 件ありました
スキャンした結果、SCAN FAILED となり、指摘が 9 件出力されました。
ひとつひとつチェックしながら、変更を検討していきました。
EC2 インスタンス起動時にパブリック IP をアタッチしてはいけない
パブリック IP アドレスをアタッチするのは非推奨とのこと。そこで、Elastic IP アドレスを払い出して、EC2 インスタンスにアタッチする構成にコードを変更することにしました。
コードとしては、以下を追加しました。
# ************************************************** # Elastic IP Address # ************************************************** ElasticIP: Type: "AWS::EC2::EIP" Properties: Domain: !Ref VPC Tags: - Key: Name Value: jawsug-bgnr-handson-ElaticIP ElasticIPAssociate: Type: AWS::EC2::EIPAssociation Properties: AllocationId: !GetAtt ElasticIP.AllocationId InstanceId: !Ref EC2Instance
パブリックサブネットに EC2 インスタンスを起動しない × 2 件
警告文とは若干異なりますが、要は、EC2 インスタンスをパブリックサブネットにむき出しにするのではなく、プライベートサブネットに起動して、パブリックサブネットには NATゲートウェイを起動することを推奨する、といった内容でした。
今回のイベントでは、NAT ゲートウェイを利用すると料金が発生するので残念ですが、採用しないことにしました。
EC2 インスタンスに IAM ロールがアタッチされていない
EC2 インスタンスに IAM ロールをアタッチしていないことを指摘されました。今回のイベントでは、手動で IAM インスタンスプロフィールロールをアタッチする操作を体験していただくため、本推奨も採用しないことにしました。
EC2 インスタンスが VPC 配下で構成されていない
これは、指摘文が若干適切でないようですが、ネットワークインターフェースを作成してアタッチすることを推奨しているのかと考えました。こちらも採用しないことにしました。
アウトバウンドが世界に公開されている
今回は、Systems Manager を利用するため、443 ポート 0.0.0.0/0 で開放していますが、指摘がありました。確かに NAT Gateway があると解決すると感じましたが、スルーすることにしました。
VPC に AWS Network Firewall を関連付けるべき
これも本番環境では是非検討したい指摘ですが、費用面との兼ね合いで今回のハンズオンイベントではスルーすることにしました。
IAM Access Analyzer が設定されていない
これは本番環境だと非常にありがたい指摘だと感じました。ハンズオンでは、解説に時間が取れないのと趣旨に反するため、非常に残念ですが、割愛することにしました。
EBS Optimized が有効でない
EBS Optimized の指定ができていませんでした。t2 ファミリーだとエラーになりますが、本ハンズオンでは t4g ファミリーを利用するため有効にしました。
具体的には以下のコードを追加しました。
EbsOptimized: true
再スキャン
ということで、上記の指摘を受けて、2 件修正を行なった yaml ファイルを再スキャンしました。
2 件減って、以下の 1 件が増えました。
High がなくなって、SCAN FAILED から SCAN PASSED に変わりました。
AWS Shield Advances が有効になっていない
うーん、これは有効にすると高額請求が発生するのでハンズオンでは難しそうですね。スルーします。
修正した CloudFormation スタックを流し直しました。
~/environment $ aws cloudformation deploy --template-file ./vpc-and-ec2.yaml --stack-name jawsug-bgnr-deploy Waiting for changeset to be created.. Waiting for stack create/update to complete Successfully created/updated stack - jawsug-bgnr-deploy ~/environment $
所感
今回は本番環境で利用する IaC ではなかったため、すべての指摘を適用することはできませんでしたが、EIP をアタッチする形に変更できましたし、EBS 最適化を有効できたことも非常に良かったです。
また、Medium 以下のアラートは指摘と言いつつ、優先度が低いものであることが改めて分かりました。
何よりもイベント用に作成した CloudFormation テンプレートに不備があったら大変なので、スキャンして安心して提供できる状態にできたことで、安心できました。
最後までお読みくださりありがとうございました。