IAM 인증 RDS, 비 VPC 람바다, API Gateway, CloudFront, WAF를 통해 연결원 IP 제한이 있는 API 제작

11083 단어 AWS
주로 다음과 같은 두 가지 예에 정보를 첨가한 문장이다.
  • IAM 인증 기반 RDS 접속 시도
  • [전세계 기대] IAM 인증(+SSL)을 통해 램바다 파이톤을 퍼블릭 엑세스에 안전하게 연결하는 RDS
  • API Gateway의 가방을 VPC 람바다로 설정하면 API임에도 오랜 시간이 걸리는 질문일 가능성이 있다.그래서
  • 비 VPC Lambda에서 Public Access sible에 안전하게 연결하려는 RDS
  • 및 API Gateway에 대한 연결 소스 IP 제한
  • 이것은 내가 하고 싶은 일이다.

    RDS 연결 인증에서 IAM 사용 가능

  • AWS IAM에서 MySQL 및 Amazon Aurora 데이터베이스에 대한 RDS for 관리
  • IAM Database Authentication for MySQL and Amazon Aurora
  • 집필할 때 정식 일본어 문서가 없다.

    이게 어떻게 된 일입니까?


    MySQL의 인증 플러그인을 만들어 RDS 이미지에 미리 넣었다고 한다.
    select * from plugin;
    +-------------------------+-------------+
    | name                    | dl          |
    +-------------------------+-------------+
    | AWSAuthenticationPlugin | aws_auth.so |
    +-------------------------+-------------+
    1 row in set (0.01 sec)
    
    같은 물건을 PostgreSQL로 만들 수 있다면 PostgreSQL도 IAM 인증을 사용할 수 있죠?(알 수 없는 희망)

    너는 그 무엇을 좋아하니?


    MySQL의 user/password 인증은 AWS입니다.ACCESS_KEY_ID 및 AWSACCESS_SECRET_케이로 바뀐 것 같아.
    ...그렇다면'그건 이런'사건이지만 특정 IAM 캐릭터만 보유한 비VPC 람바다의 방문을 허용하는 RDS MySQL을 만들 수 있게 돼 기쁜 점이다.
    MySQL에 내장된 인증 기관보다 안전한 방법을 사용하면 RDS를 Public Access sible로 만들 수 있다는 말도 있다.RDS가 Public Access sible이면 Lambda도 비 VPC를 사용할 수 있습니다.그리고 그 람보도 특정 IAM 캐릭터를 가진 것에 한정돼 있어요.마음 놓으세요.

    하고 싶은 일

    RDS (IAM & SSL) | AWS Lambda (IAM) | API Gateway (https) | CloudFront (https) | Web Application Firewall
    

    의 구성.사내 API 같은 거죠?등장인물은 많지만 다음과 같은 경우도 있다
  • 소스 IP 제한을 설정하고 싶지만 API Gateway 자체에 소스 IP 제한 기능이 없음
  • WAF에서 WAF는 ALB 또는 CloudFront
  • 에만 사용 가능
    그러므로
  • API Gateway의 전면 레벨에 CloudFront를 배치
  • CloudFront의 전면 레벨에 WAF 배치
  • 액세스를 제어할 수 있습니다.
    API Gateway 자체와 관련해서는 방문을 제한하기 위해 API Token이 필요하다.물론 클라우드 프론트에 접근할 수 없기 때문에 오리진 설정에서 API Token을 헤더에 추가해야 합니다.귀찮아.
    그나저나 API Gateway의 인증도 IAM으로 설정할 수 있지만, 이렇게 되면 API 사용자는 AWS v4 Signature Auth를 실현할 수 있어 마음이 괴롭다.
  • Authenticating Requests (AWS Signature Version 4)
  • 참고 AWS REST 요청에 대한 서명
  • 귀찮아.

    해보자.


    RDS 만들기


    IAM Database Authentication for MySQL and Amazon Aurora
    IAM 인증은 db입니다.m1.smill보다 큰 실례에서만 사용할 수 있음을 주의하십시오.사용자의 제작 방법도 문서에서 유지
    CREATE USER jane_doe IDENTIFIED WITH AWSAuthenticationPlugin as 'RDS' REQUIRE SSL;
    
    DB와 람바다 사이에 SSL이 필요하기 때문에REQUIRE SSL 추가 옵션은 SSL을 강제로 적용합니다.
    제작Lambdaのレンジ:3306된 In Allow의 SecGroup, Lambda의 범위가 넓은 것 같다고?
    https://docs.aws.amazon.com/ja_jp/general/latest/gr/aws-ip-ranges.html

    람바다 만들기.


    시작 람다는...
    from __future__ import print_function
    
    import os
    
    import boto3
    import mysql.connector
    
    def lambda_handler(event, context):
        print(event, context)
        token = boto3.client('rds').generate_db_auth_token(
            DBHostname=os.environ['RDS_HOST'],
            Port=3306,
            DBUsername=os.environ['RDS_USER']
        )
        conn = mysql.connector.connect(
            host=os.environ['RDS_HOST'],
            user=os.environ['RDS_USER'],
            password=token,
            database=os.environ['RDS_DATABASE'],
            ssl_verify_cert=True,
            ssl_ca='rds-combined-ca-bundle.pem'
        )
        cursor = conn.cursor()
        cursor.execute('SELECT user FROM mysql.user')
        rows = cursor.fetchall()
        result = [str(x[0]) for x in rows]
        return {'users': result}
    
    DB의 사용자SELECT만 반환하면 됩니다.
    Lambda를 실행하려면 IAM 역할에 IAM Database Auth 정책이 필요합니다.
    Attaching an IAM Policy Account to an IAM User or Role
    arn:aws:rds-db:region:account-id:dbuser:dbi-resource-id/database-user-name
    
    여기, 나는 MySQL의GRANTON를 지정한 것 같다고 생각한다.
    Lambda를 실행하는 다른 IAM 역할을 추가해 DB 연결 오류가 성공적으로 발생했습니다.

    zip으로 람바다 정리하기.


    제작TOzip을 생성한 Nau는 젊은이들에게 가장 앞선 멋쟁이다.디버그 중에 비VPC를 선택합니다.
    FROM amazonlinux
    
    RUN yum install -y python27-devel python27-pip zip
    RUN pip install --upgrade pip
    RUN mkdir /opt/rds-iam-auth /opt/build
    COPY ./ /opt/rds-iam-auth/
    WORKDIR /opt/rds-iam-auth
    RUN pip install wheel
    RUN pip install -r requirements.txt -t .
    RUN zip -r rds-iam-auth.zip *
    
    CMD cp rds-iam-auth.zip /opt/build
    
    안타깝게도 람다에 들어온 아마존 linux의 보토3은 IAM RDS auth와 대응하지 않아Dockerfile 메모했다.요즘 AMI도 업데이트되죠.

    하다


    콘솔에서 째깍째깍 하는 일이 많다.여기에 특별히 추기할 것은 없기 때문에 이전 사람들의 보도를 참고하고 싶다.
  • Cloud Front를 API Gateway에 연결하여 WAF에서 IP 제한을 시도합니다.
  • AWS WAF에서 CloudFront를 통한 액세스에 대한 IP 주소 제한 설정
  • Amazon Cloud Front를 이용해서 API Gateway가 간지러운 곳으로 손을 보내주세요.
  • 참고 사항 요약
  • API Token이 API 엔드포인트를 직접 사용하지 않도록 해야 합니다.
  • WAF가 글로벌 영역을 사용하지 않으면 클라우드 Front의 컨트롤러에서 선택할 수 없습니다.
  • 클라우드 프론트의 오리진 설정 시 헤드 전송 설정requirement.txt을 추가한다.
  • 클라우드 프론트의 설정 반영은 시간이 걸려 매운 커피만 마실 수 있다.
  • 시험해 보다


    WAF는 사내 글로벌 IP 접속만 허용한다.
    $ curl https://hoge.cloudfront.net/
    {"users": ["helloworld", "iamuser1", "mysql.sys", "rdsadmin"]}
    
    WiFi를 바꾸고 Global IP를 바꾸면
    $ curl https://hoge.cloudfront.net/
    <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
    <HTML><HEAD><META HTTP-EQUIV="Content-Type" CONTENT="text/html; charset=iso-8859-1">
    <TITLE>ERROR: The request could not be satisfied</TITLE>
    </HEAD><BODY>
    <H1>ERROR</H1>
    <H2>The request could not be satisfied.</H2>
    <HR noshade size="1px">
    Request blocked.
    <BR clear="all">
    <HR noshade size="1px">
    <PRE>
    Generated by cloudfront (CloudFront)
    Request ID: jIG5TSJUn9rPZYI0JwUr9wZHFHFa_LRyVmwGC302sHjBgv0sLoPubA==
    </PRE>
    <ADDRESS>
    </ADDRESS>
    </BODY></HTML>
    
    Forbidden에게

    총결산


    AWS 잘하네.

    좋은 웹페이지 즐겨찾기