2017-06-05 18 views
0

私は静的なウェブサイトをS3にホストしています。すべてのファイルを公開するように設定しました。 また、リバースプロキシとして動作するnginxのEC2インスタンスがあり、静的なWebサイトにアクセスできるため、S3が元の役割を果たします。S3の静的ウェブサイトにEC2インスタンスがアクセスできるようにする

私が今したいことは、S3のすべてのファイルを非公開にして、ウェブサイトがnginx(EC2)からのトラフィックによってのみアクセスできるようにすることです。

これまでのところ、私は以下のことを試しました。私が作成し、パーミッションの付与

ポリシーでEC2インスタンスに新しいポリシーの役割を添付していますAmazonS3ReadOnlyAccess

そして、EC2インスタンスを再起動しました。私はEC2インスタンスの役割を作成したとき、私が得たARNを設定しているプリンシパルとして

私はその後、私のS3バケットコンソールでポリシーを作成した>権限>バケツポリシー

{ 
    "Version": "xxxxx", 
    "Id": "xxxxxxx", 
    "Statement": [ 
     { 
      "Sid": "xxxxxxx", 
      "Effect": "Allow", 
      "Principal": { 
       "AWS": "arn:aws:iam::XXXXXXXXXX:role/MyROLE" 
      }, 
      "Action": "s3:GetObject", 
      "Resource": "arn:aws:s3:::XXX-bucket/*" 
     } 
    ] 
} 

"Principal": { 
       "AWS": "arn:aws:iam::XXXXXXXXXX:role/MyROLE" 
      }, 

ただし、これは機能しません。ご了承ください。アマゾンS3で

答えて

3

nginxのでAmazon EC2インスタンスは、単にアマゾンS3への一般的なWeb要求を行っている場合は、質問他のすべてのリクエストを拒否しながら、nginxからのリクエストを '許可'として識別する方法になります。

VPC Endpoint for S3を使用する方法の1つは、VPCからAmazon S3への直接通信(インターネットゲートウェイを経由するのではなく)です。

バケットポリシーは、それが唯一そのエンドポイントを介してアクセスすることができるようなバケットへのアクセスを制限することができます。ここ

Example Bucket Policies for VPC Endpoints for Amazon S3からバケットポリシー:

以下だけID vpce-1a2b3c4dとVPCエンドポイントから、特定のバケット、examplebucketへのアクセスを可能にするS3バケットポリシーの例です。ポリシーでは、aws:sourceVpce条件キーを使用して、指定されたVPCエンドポイントへのアクセスを制限します。

{ 
    "Version": "2012-10-17", 
    "Id": "Policy", 
    "Statement": [ 
    { 
     "Sid": "Access-to-specific-VPCE-only", 
     "Action": "s3:*", 
     "Effect": "Allow", 
     "Resource": ["arn:aws:s3:::examplebucket", 
        "arn:aws:s3:::examplebucket/*"], 
     "Condition": { 
     "StringEquals": { 
      "aws:sourceVpce": "vpce-1a2b3c4d" 
     } 
     }, 
     "Principal": "*" 
    } 
    ] 
} 

ので、完全な設計は次のようになります。

  • オブジェクトのACL:
  • (任意の現在の公開権限を削除)のみのプライベートバケットポリシー:
  • IAM役割上記のよう:ありません必要なもの
  • VPCエンドポイント用に設定されたルートテーブル
+0

正当なものと思われます。 VPCエンドポイントとエンドポイントをホスティングしているWebサイトとの間のやりとりをテストしていませんが、これは使用されていると仮定しても動作するはずです。 –

1

権限は、いくつかの方法で付与することができます。

に適用されます バケットポリシー(経由(アクセス制御リストまたはACLとして知られている) オブジェクト
  • に直接
    • 全体のバケツ、またはディレクトリ)
    • IAMユーザー/グループ/ロールに

    上記のいずれかがアクセス権を与えると、そのオブジェクトに公開アクセスできます。各オブジェクトのACLがない許可パブリックアクセス

  • がポリシーで許可を割り当てる必要がありなしバケットポリシー
  • がなければならないはずです

    • あなたのシナリオでは、次の設定が必要です添付のIAMのロール

    ユーザー/グループ/役割に関する権限を持つ場合は常に、バケットではなくIAMにアクセス許可を割り当てる方が良いでしょう。バケットポリシーを使用して、すべてのユーザーにアクセスします。役割に関する

    ポリシーは次のようになります。

    { 
        "Version": "2012-10-17", 
        "Statement": [ 
         { 
          "Sid": "AllowBucketAccess", 
          "Effect": "Allow", 
          "Action": [ 
           "s3:GetObject" 
          ], 
          "Resource": [ 
           "arn:aws:s3:::my-bucket/*" 
          ] 
         } 
        ] 
    } 
    

    このポリシー

    は直接IAMのロールに適用されるので、principalフィールドは必要ありません。

    は、このポリシーが唯一のGetObjectことができますので、ご注意ください - それはあなたはまた、「私は公共のようにすべてのファイルを設定している」ことを言及

    など、オブジェクトをアップロードし、バケットのリストを許可していません。個々のオブジェクトを一般に公開することでこれを行うと、誰でもオブジェクトにアクセスできます。これを防ぐには、各オブジェクトから権限を削除する方法と、アクセスを停止する役割を許可する拒否ステートメントを持つバケットポリシーを作成する方法の2つがあります。

    これは少し面倒でメンテナンスが難しくなっているので、各オブジェクトから権限を削除することをおすすめします。インプレースこのファイルをコピー

    aws s3 cp s3://my-bucket s3://my-bucket --recursive --acl private 
    

    が、アクセス設定を変更します。これは、各オブジェクトのアクセス許可を編集することにより、またはのようなコマンドを使用してAWS Command-Line Interface (CLI)を使用して管理コンソールを介して行うことができます。

    (私は--acl private--acl bucket-owner-full-controlを使用するので、少し周りを再生するかどうかを100%確実ではないです。)

  • +0

    この問題は[静的なWebサイトのエンドポイントでIAM認証をサポートしていない](http://docs.aws.amazon.com/AmazonS3/latest/dev/WebsiteEndpoints.html)です。しかしバケツポリシーの他の側面を尊重しているので、オブジェクトをプライベートとしてアップロードし、EIPをインスタンスに割り当て、バケットポリシーでそのIPからのアクセスを許可するという解決策があります。 '' Condition ":{" IpAddress ":{" aws:SourceIp ":[" 203.0.113.200/32 "]}}'(EIPが203.0.113.200であると仮定します)。これはS3 VPCエンドポイント(aws:SourceIp条件をサポートしていない)を使用していない限り、期待通りに機能します。 –

    +0

    また、OPがインスタンス上のIAMロールを期待しているようで、NginxがIAMロールを持つインスタンス上で実行されているという事実を単純に考えて、Nginxが魔法のようにオブジェクトをバケットからフェッチできるようにするインスタンスメタデータから一時的な資格情報をフェッチし、それらを使用してリクエストの署名と認証を行う必要があります。これはRESTエンドポイントでは機能しますが、ウェブサイトのエンドポイントでは機能しません。 –

    +0

    ああ!はい、Amazon EC2インスタンスがAmazon S3からどのようにデータを取得していたかは考慮しませんでした。上記の推奨は、APIリクエストを介してフェッチしている場合にのみ機能しますが、単にWebリクエストを行っている場合は機能しません。 –

    関連する問題