質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

ただいまの
回答率

87.60%

s3 basic認証 何度もbasic認証を尋ねられる

解決済

回答 1

投稿

  • 評価
  • クリップ 0
  • VIEW 3,195

score 165

現在、s3でwebサーバーのような状態を作り出しているのですが、
前任者が設計して現状だれもさわることができず細かいことがわからないのですが、
IE,edgeなどでたまに(出る場合と出ない場合あり・・)basic認証が読み込まれているファイル(js,img,cssなど)すべてに対して、
聞かれてしまう状態になり全部ipassを入れないとページが見れない状態になります。
改善する方法はありますでしょうか?
下記が現状の流れになります。

s3:を使用。
CloudFront:Basic認証用のフィルターとして
lambda:CloudFrontへのアクセスをトリガーにしてBasic認証を実装
route53:サブドメインの設定
cloudFormation:上記のサービスをyamlファイルで一括設定

下記がそのyamlファイルになります。

AWSTemplateFormatVersion: '2013-03-03'
Description: Static contents distribution using S3 and CloudFront with basic authentication by lambda@Edge
Parameters:
  AuthUser:
    Description: ID for basic authentication
    Type: String
    Default: user
  AuthPass:
    Description: Password for basic authentication
    Type: String
    Default: password
  CloudFrontAliase:
    Description: CloudFront Alternate Domain Names (CNAMEs)
    Type: String
    Default: .test.com

  SelectLambdaDeployment:
    Description: Select blue / green deployment
    Type: String
    Default: blue
    AllowedValues:
      - blue
      - green

Conditions:
  CloudFrontAliaseEnable: !Not [!Equals [!Ref 'CloudFrontAliase', 'none']]
  LambdaVersionIsBlue: !Equals [!Ref 'SelectLambdaDeployment', 'blue']
  LambdaVersionIsGreen: !Equals [!Ref 'SelectLambdaDeployment', 'green']

Resources:
  S3Bucket:
    Type: AWS::S3::Bucket
    DeletionPolicy: Retain
    Properties:
      BucketName: !Sub '${AWS::StackName}.test.com'
      AccessControl: PublicRead
      WebsiteConfiguration:
        IndexDocument: index.html
        ErrorDocument: error.html

      VersioningConfiguration:
        Status: Enabled

  S3BucketPolicy:
    Type: AWS::S3::BucketPolicy
    Properties:
      Bucket: !Ref 'S3Bucket'
      PolicyDocument:
        Statement:
          - Action: s3:GetObject
            Effect: Allow
            Resource: !Sub 'arn:aws:s3:::${S3Bucket}/*'
            Principal:
              AWS: !Sub 'arn:aws:iam::cloudfront:user/CloudFront Origin Access Identity
                ${CloudFrontOriginAccessIdentity}'

  S3BucketCloudFrontLog:
    Type: AWS::S3::Bucket
    DeletionPolicy: Retain
    Properties:
      BucketName: !Sub 'cloudfrontlog-${AWS::StackName}.test.com'
      LifecycleConfiguration:
        Rules:
        - Id: AutoDelete
          Status: Enabled
          ExpirationInDays: 15

  CloudFrontDistribution:
    Type: AWS::CloudFront::Distribution
    Properties:
      DistributionConfig:
        Origins:
          - Id: S3Origin
            DomainName: !GetAtt 'S3Bucket.DomainName'
            S3OriginConfig:
              OriginAccessIdentity: !Sub 'origin-access-identity/cloudfront/${CloudFrontOriginAccessIdentity}'
        Enabled: true
        DefaultRootObject: index.html
        Comment: !Sub '${AWS::StackName} distribution'
        Logging:
          IncludeCookies: 'false'
          Bucket: !GetAtt 'S3BucketCloudFrontLog.DomainName'
          Prefix: !Sub '${AWS::StackName}/${SelectLambdaDeployment}'
        Aliases:
          - !If
            - CloudFrontAliaseEnable
            - !Ref 'CloudFrontAliase'
            - !Ref 'AWS::NoValue'
        DefaultCacheBehavior:
          TargetOriginId: S3Origin
          ForwardedValues:
            QueryString: true
            Headers:
              - If-Modified-Since
              - If-None-Match
              - Upgrade-Insecure-Requests
              - User-Agent
            Cookies:
              Forward: all
          ViewerProtocolPolicy: allow-all
          DefaultTTL: '0'
          MaxTTL: '0'
          MinTTL: '0'
          LambdaFunctionAssociations:
            - EventType: viewer-request
              LambdaFunctionARN: !If
                - LambdaVersionIsBlue
                - !Ref 'LambdaFunctionVersionBlue'
                - !Ref 'LambdaFunctionVersionGreen'
        CacheBehaviors:
          - AllowedMethods:
              - GET
              - HEAD
            TargetOriginId: S3Origin
            ForwardedValues:
              QueryString: false
            PathPattern: '/favicon.ico'
            ViewerProtocolPolicy: allow-all
            DefaultTTL: '86400'
            MaxTTL: '86400'
            MinTTL: '86400'

  CloudFrontOriginAccessIdentity:
    Type: AWS::CloudFront::CloudFrontOriginAccessIdentity
    Properties:
      CloudFrontOriginAccessIdentityConfig:
        Comment: !Ref 'AWS::StackName'

  Route53DNSRecord:
    Type: AWS::Route53::RecordSet
    Properties:
      HostedZoneName: test.com
.
      Name: !Sub '${AWS::StackName}.test.com
.'
      Type: A
      AliasTarget:
        HostedZoneId: Z2FDTNDATAQYW2
        DNSName: !GetAtt 'CloudFrontDistribution.DomainName'

  LogGroupLambda:
    Type: AWS::Logs::LogGroup
    Properties:
      LogGroupName: !Sub '/aws/lambda/${LambdaFunction}'
      RetentionInDays: 7

  LambdaRole:
    Type: AWS::IAM::Role
    Properties:
      AssumeRolePolicyDocument:
        Version: '2012-10-17'
        Statement:
          - Effect: Allow
            Principal:
              Service:
                - lambda.amazonaws.com
                - edgelambda.amazonaws.com
            Action:
              - sts:AssumeRole
      Path: /service-role/
      Policies:
        - PolicyName: root
          PolicyDocument:
            Version: '2012-10-17'
            Statement:
              - Effect: Allow
                Action:
                  - logs:CreateLogGroup
                  - logs:CreateLogStream
                  - logs:PutLogEvents
                Resource: arn:aws:logs:*:*:*

  LambdaFunction:
    Type: AWS::Lambda::Function
    Properties:
      Handler: index.handler
      Role: !GetAtt 'LambdaRole.Arn'
      Code:
        ZipFile: !Sub |
          'use strict';
          exports.handler = (event, context, callback) => {

            // Get request and request headers
            const request = event.Records[0].cf.request;
            const headers = request.headers;

            // Configure authentication
            const authUser = '${AuthUser}';
            const authPass = '${AuthPass}';

            // Construct the Basic Auth string
            const authString = 'Basic ' + new Buffer(authUser + ':' + authPass).toString('base64');

            // Require Basic authentication
            if (typeof headers.authorization == 'undefined' || headers.authorization[0].value != authString) {
              const body = 'Unauthorized';
              const response = {
                status: '401',
                statusDescription: 'Unauthorized',
                body: body,
                headers: {
                  'www-authenticate': [{key: 'WWW-Authenticate', value:'Basic'}]
                },
              };
              // Debug log
              console.log("request: " + JSON.stringify(request));

              callback(null, response);
            }

            // Instead of index document processing
            var olduri = request.uri;
            var newuri = olduri.replace(/\/$/, '\/index.html');
            if ( olduri != newuri ) {
              console.log("Old URI: " + olduri);
              console.log("New URI: " + newuri);
            }
            request.uri = newuri;

            // Continue request processing if authentication passed
            callback(null, request);
          };
      Runtime: nodejs6.10
      MemorySize: 128
      Timeout: 1
      Description: Basic authentication with Lambda@Edge
      Tags:
        - Key: CloudformationArn
          Value: !Ref 'AWS::StackId'

  LambdaFunctionVersionBlue:
    Type: AWS::Lambda::Version
    Condition: LambdaVersionIsBlue
    Properties:
      FunctionName: !Ref 'LambdaFunction'

  LambdaFunctionVersionGreen:
    Type: AWS::Lambda::Version
    Condition: LambdaVersionIsGreen
    Properties:
      FunctionName: !Ref 'LambdaFunction'

  IamGroup:
    Type: AWS::IAM::Group
    Properties:
      GroupName: !Sub 'iam-group-s3-access-${S3Bucket}'
      Policies:
      - PolicyName: PolicieAllow
        PolicyDocument:
          Version: '2012-10-17'
          Statement:
          - Effect: Allow
            Action:
            - s3:List*
            - s3:GetBucketLocation
            Resource:
            - arn:aws:s3:::*
          - Effect: Allow
            Action:
            - s3:*
            Resource:
            - !Sub 'arn:aws:s3:::${S3Bucket}/*'
          - Effect: Deny
            Action:
            - s3:PutBucket*
            - s3:PutObjectAcl
            - s3:PutObjectVersionAcl
            Resource:
            - arn:aws:s3:::*

  IamUser:
    Type: AWS::IAM::User
    Properties:
      UserName: !Sub 'iam-user-s3-access-${S3Bucket}'
      Groups:
      - !Ref 'IamGroup'

Outputs:
  URL:
    Value: !Sub 'http://${CloudFrontDistribution.DomainName}'
  IamUser:
    Value: !Ref 'IamUser'
  • 気になる質問をクリップする

    クリップした質問は、後からいつでもマイページで確認できます。

    またクリップした質問に回答があった際、通知やメールを受け取ることができます。

    クリップを取り消します

  • 良い質問の評価を上げる

    以下のような質問は評価を上げましょう

    • 質問内容が明確
    • 自分も答えを知りたい
    • 質問者以外のユーザにも役立つ

    評価が高い質問は、TOPページの「注目」タブのフィードに表示されやすくなります。

    質問の評価を上げたことを取り消します

  • 評価を下げられる数の上限に達しました

    評価を下げることができません

    • 1日5回まで評価を下げられます
    • 1日に1ユーザに対して2回まで評価を下げられます

    質問の評価を下げる

    teratailでは下記のような質問を「具体的に困っていることがない質問」、「サイトポリシーに違反する質問」と定義し、推奨していません。

    • プログラミングに関係のない質問
    • やってほしいことだけを記載した丸投げの質問
    • 問題・課題が含まれていない質問
    • 意図的に内容が抹消された質問
    • 過去に投稿した質問と同じ内容の質問
    • 広告と受け取られるような投稿

    評価が下がると、TOPページの「アクティブ」「注目」タブのフィードに表示されにくくなります。

    質問の評価を下げたことを取り消します

    この機能は開放されていません

    評価を下げる条件を満たしてません

    評価を下げる理由を選択してください

    詳細な説明はこちら

    上記に当てはまらず、質問内容が明確になっていない質問には「情報の追加・修正依頼」機能からコメントをしてください。

    質問の評価を下げる機能の利用条件

    この機能を利用するためには、以下の事項を行う必要があります。

回答 1

checkベストアンサー

+1

わたしも同じ悩みを抱えており、調べておりました。下記のように修正したら解決しました。IE/Edgeは、realm が重要なんですかね。。値は何でも良いかと思います。

Before
'www-authenticate': [{key: 'WWW-Authenticate', value:'Basic'}]

After
'www-authenticate': [{ key: 'WWW-Authenticate', value: 'Basic realm="Please Enter Your Password"' }]

投稿

編集

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

  • 2019/11/28 17:20

    ありがとうございました!!!

    キャンセル

15分調べてもわからないことは、teratailで質問しよう!

  • ただいまの回答率 87.60%
  • 質問をまとめることで、思考を整理して素早く解決
  • テンプレート機能で、簡単に質問をまとめられる

関連した質問

同じタグがついた質問を見る