S3のパブリックアクセスを自動でブロックする方法

S3のパブリックアクセスを自動でブロックする方法
この記事をシェアする


こんにちは。スカイアーチHRソリューションズのMiyahiraです!

今回はS3のパブリックアクセスがブロックされているか確認するAWS Configルールの作成と、設定変更されて無効になってしまった場合に自動で元に戻すAWS Configの修復アクションを設定したいと思います。
また、一発でサクッと設定したいという方のためにCloudFormationのコードも最後の方に載せているので、飛ばして見て頂いて大丈夫です!

公開しているS3バケットがない、これから公開する気もないよって方は設定しておくといいでしょう。

ブロックパブリックアクセスとは?

S3バケットを公開するかしないかの設定です。この設定を無効(パブリックアクセスをブロックしない)とした場合、誰でもS3にアクセスできてしまいます。
ウェブサイトで静的ファイルを保存して公開している場合はこれでいいのですが、機密情報などを含んでいたり外部からアクセスされたくないのであれば、有効にしてブロックしておきましょう。

この設定は、バケット単位とアカウントレベルで設定できます。アカウントレベルで設定することによって、既存のバケットからこれから作成するバケットまで、すべてでパブリックアクセスをブロックできます。

今回は、アカウントレベルでブロックパブリックアクセスを有効にします。

さっそくやってみよう!

ブロックパブリックアクセスを確認する

S3のコンソールを開き、「このアカウントのブロックパブリックアクセス設定」を確認します。現在はすべて「オフ」の状態になっており、誰でもアクセスできる状態になっています。

基本、「オン」になっている状態かと思うので、編集を押して「オフ」に変更しておいてください。
※公開したくないS3バケットがある場合は、バケットの方のパブリックアクセスは有効化しておいてください。

AWS Configルールを設定する

次に、Configのコンソールを開きルールの追加をします。
今回は、マネージドルールの「s3-account-level-public-access-blocks」を使用します。これは、必要なパブリックアクセスブロック設定がアカウントレベルから設定されているかどうかを確認するルールです。

その他、名前や変更範囲、パラメータはデフォルトのままで大丈夫です。

作成完了後に数分待ってルールを開くと、下の方に検知した情報が記載されます。
今回は、ブロックパブリックアクセスを無効にしているので「非準拠」となっています。

修復アクションを設定する

次に、修復アクションの設定を行います。これを設定することにより、ブロックパブリックアクセスを強制的に自動で有効にすることができます。

IAMポリシーの作成

Configから修復アクションを実行するための権限と、S3のブロックパブリックアクセスを有効にするための権限を追加します。

  • ssm:StartAutomationExecution
  • ssm:GetAutomationExecution
  • s3:GetAccountPublicAccessBlock
  • s3:PutAccountPublicAccessBlock

IAMロールの作成

先ほど作成したポリシーをアタッチしたロールを作成し、SSMがAssumeRoleできるように信頼します。

修復アクションの作成

作成したConfigルールを選択し、アクションから「修復の管理」から修復アクションをクリックし、下記を設定します。

  • 修復方法:自動修復
  • 修復アクション:AWSConfigRemediation-ConfigureS3PublicAccessBlock
  • リソースIDパラメータ:AccountId
  • パラメータ:
    AccountId > RESOURCE_ID ※リソースIDパラメータでAccountIdを選択すると自動で入力される
    AutomationAssumeRole > 作成したIAMロールのARN
    RestrictPublicBuckets  > True
    BlockPublicAcls > True
    IgnorePublicAcls > True
    BlockPublicPolicy > True
  • その他の項目はデフォルトのままでOK

設定完了後、今回は確認のために即時修復させたいので、「修復」をクリックして手動で修復します

数分後にページを更新すると準拠になり、S3のコンソールでも ブロックパブリックアクセス がオンになっていることが確認できます。

これまでの設定を一発でやっちゃう方法!

AWSマネジメントコンソールでポチポチ設定するのもいいですが、もっと時間を短縮してパパっと構築したい!と思う方も多くいらっしゃるんじゃないでしょうか?

そんな方のためにCloudformationテンプレートを用意しました!
下記のコードをそのままコピペして.ymlでファイルを作成しCloudformationでデプロイするだけで、これまで行った設定が一発で出来ちゃいます。

Description: Config rule & RemediationConfiguration
Resources:

  # Config rule
  ConfigRuleS3AccountLebelPublicAccessBlocks:
    Type: AWS::Config::ConfigRule
    Properties:
      ConfigRuleName: s3-account-level-public-access-blocks
      Scope:
        ComplianceResourceTypes:
          - AWS::S3::AccountPublicAccessBlock
      Source:
        Owner: AWS
        SourceIdentifier: S3_ACCOUNT_LEVEL_PUBLIC_ACCESS_BLOCKS

  # IAM Policy
  PolicySsmDocument:
    Type: AWS::IAM::ManagedPolicy
    Properties:
      PolicyDocument:
        Version: "2012-10-17"
        Statement:
          - Effect: Allow
            Action:
              - ssm:StartAutomationExecution
              - ssm:GetAutomationExecution
              - s3:GetAccountPublicAccessBlock
              - s3:PutAccountPublicAccessBlock
            Resource:
              - "*"
      Description: ""
      ManagedPolicyName: AWSConfigRemediation-ConfigureS3PublicAccessBlock-Policy

  # IAM Role
  RoleSsmDocument:
    Type: AWS::IAM::Role
    Properties:
      AssumeRolePolicyDocument:
        Version: "2012-10-17"
        Statement:
          - Effect: Allow
            Principal:
              Service:
                - ssm.amazonaws.com
            Action: sts:AssumeRole
      ManagedPolicyArns: 
        - Ref: PolicySsmDocument
      RoleName: AWSConfigRemediation-ConfigureS3PublicAccessBlock-Role

  # Config rule RemediationConfiguration
  AWSConfigRemediationConfigureS3PublicAccessBlock:
    Type: AWS::Config::RemediationConfiguration
    Properties: 
      Automatic: True
      ConfigRuleName: s3-account-level-public-access-blocks
      MaximumAutomaticAttempts: 5
      Parameters: 
        AccountId: 
          ResourceValue:
            Value: RESOURCE_ID
        AutomationAssumeRole:
          StaticValue:
            Values: 
              - Fn::GetAtt:
                  - RoleSsmDocument
                  - Arn
        IgnorePublicAcls: 
          StaticValue:
            Values: 
              - True
        BlockPublicPolicy:
          StaticValue:
            Values: 
              - True
        BlockPublicAcls: 
          StaticValue:
            Values: 
              - True
        RestrictPublicBuckets:
          StaticValue:
            Values: 
              - True
      RetryAttemptSeconds: 60
      TargetId: AWSConfigRemediation-ConfigureS3PublicAccessBlock
      TargetType: SSM_DOCUMENT

まとめ

今回は、S3のブロックパブリックアクセスを有効化し自動で修復する方法について、マネージメントコンソールでポチポチ設定する方法と、Cloudformationで設定する方法を記事にしてみました!

ウェブサイトで静的ファイルを保存して公開している場合などを除いて、基本的にパブリックアクセスはブロックしておくと思うので、ぜひこの設定をしておきましょう!
どなたかの参考になれば幸いです。

この記事をシェアする
著者:miyahira
沖縄出身で仙台在住。2000年生まれのAWS歴2年目エンジニア。趣味は野球、ゴルフ、サウナ。