香港と安全なマイクロサービス


マイクロサービスアーキテクチャは最近ではバックエンドの開発にほとんど標準である.APIゲートウェイは、ユーザーにアクセス可能な単一のAPIにマイクロサービスのグループを接続する優れた方法です.APIゲートウェイはAWS/Azure/Google Cloud PlatformやCloudFlareなどのクラウドプロバイダから入手できます.は、オープンソース上に構築されたスケーラブルなAPIゲートウェイであり、システムが特定のベンダーにロックされたくない場合には、優れた代替手段である.
このチュートリアルでは、Sun APIゲートウェイを使用した例を示します.
Ory Kratos , and Ory Oathkeeper .
以下の図は、このGUIDでビルドする最終的なアーキテクチャを示しています

このチュートリアルの完全なソースコードは
github

What we will use


  • Kong ゲートウェイは
    あなたが任意のベンダーLockinを望まないなら
    あなたのアプリケーションのクラウドAPIゲートウェイ.香港用途
    OpenResty とルアー.Openrestyはnginxを拡張する
    NGAXのイベントモデルを非ブロッキングI/Oに使用するスクリプト
    クライアントとリモートバックエンドのようなPostgreSQL、memcached、およびredis.露店
    NGNXフォークではなく、香港はOpenrestyフォークではありません.香港はopenresty
    有効にする
    API gateway features .

  • Oathkeeper アイデンティティとアクセスのような行為
    マイクロサービスの代理これは、プロキシにのみ認証された要求
    我々のマイクロサービス、そして、我々はチェックするミドルウェアを実装する必要はありません
    認証.また、例えば、変換セッション
    バックエンドサービスのためのJWTにAuth.

  • Kratos 認証プロバイダーですかit
    すべての最初のパーティ認証フロー
    パスワード、mfa/2 faand more . It
    また、例えば、「Githubによるログイン」のためのOIDC/Socialログイン機能を提供します.
  • 簡単なマイクロサービスの構築


    つのマイクロサービスがあるとしましょう.hello and world . 彼らは非常にシンプルであり、APIゲートウェイをテストするためだけに役立つが、より複雑なコンポーネントのためにそれらを切り替えることができます.
    「世界」マイクロサービスが公開する/world APIエンドポイントと単純なJSONメッセージを返す
    package main
    
    import (
        "encoding/json"
        "log"
        "net/http"
    )
    
    type Response struct {
        Message string `json:"message"`
    }
    
    func helloJSON(w http.ResponseWriter, r *http.Request) {
        response := Response{Message: "World microservice"}
        w.Header().Set("Content-type", "application/json")
        w.WriteHeader(http.StatusOK)
        json.NewEncoder(w).Encode(response)
    }
    func main() {
        http.HandleFunc("/world", helloJSON)
        log.Fatal(http.ListenAndServe(":8090", nil))
    
    }
    
    「hello」マイクロサービスが公開する/hello APIエンドポイントと単純なJSONメッセージを返す
    package main
    
    import (
        "encoding/json"
        "log"
        "net/http"
    )
    
    type Response struct {
        Message string `json:"message"`
    }
    
    func helloJSON(w http.ResponseWriter, r *http.Request) {
        response := Response{Message: "Hello microservice"}
        w.Header().Set("Content-type", "application/json")
        w.WriteHeader(http.StatusOK)
        json.NewEncoder(w).Encode(response)
    }
    func main() {
        http.HandleFunc("/hello", helloJSON)
        log.Fatal(http.ListenAndServe(":8090", nil))
    
    }
    
    我々は今、これらのマイクロサービスへのアクセスを確保し、認証されたユーザーだけをこれらのエンドポイントにアクセスさせたい.

    わかりました.ハッキングを始めましょう.

    リーKratosセットアップ


    フォローするQuickstart ガイドは、KO Kratosを設定します.このチュートリアルでは、次の構成でDocker構成ファイルを必要とします
      postgres-kratos:
        image: postgres:9.6
        ports:
          - "5432:5432"
        environment:
          - POSTGRES_USER=kratos
          - POSTGRES_PASSWORD=secret
          - POSTGRES_DB=kratos
        networks:
          - intranet
    
      kratos-migrate:
        image: oryd/kratos:v0.8.0-alpha.3
        links:
          - postgres-kratos:postgres-kratos
        environment:
          - DSN=postgres://kratos:secret@postgres-kratos:5432/kratos?sslmode=disable&max_conns=20&max_idle_conns=4
        networks:
          - intranet
        volumes:
          - type: bind
            source: ./kratos
            target: /etc/config/kratos
        command: -c /etc/config/kratos/kratos.yml migrate sql -e --yes
    
      kratos:
        image: oryd/kratos:v0.8.0-alpha.3
        links:
          - postgres-kratos:postgres-kratos
        environment:
          - DSN=postgres://kratos:secret@postgres-kratos:5432/kratos?sslmode=disable&max_conns=20&max_idle_conns=4
        ports:
          - '4433:4433'
          - '4434:4434'
        volumes:
          - type: bind
            source: ./kratos
            target: /etc/config/kratos
        networks:
          - intranet
        command: serve -c /etc/config/kratos/kratos.yml --dev --watch-courier
    
      kratos-selfservice-ui-node:
        image: oryd/kratos-selfservice-ui-node:v0.8.0-alpha.3
        environment:
          - KRATOS_PUBLIC_URL=http://kratos:4433/
          - KRATOS_BROWSER_URL=http://127.0.0.1:4433/
        networks:
          - intranet
        ports:
          - "4455:3000"
        restart: on-failure
    
    
      mailslurper:
        image: oryd/mailslurper:latest-smtps
        ports:
          - '4436:4436'
          - '4437:4437'
        networks:
          - intranet
    
    ネットワークアーキテクチャについて
  • HTTP:4433 and :4434 パブリックとアドミンAPIは、Key Kratosのです.
  • HTTP:4436 MailSurper -モック電子メールサーバー.あなたは活性化を得ることができます
    アクセスでリンクhttp://127.0.0.1:4436 .
  • HTTP:4455 UIインターフェイスのための1つを開始することができます
    サインアップ/ログイン/回復フロー.
  • アフターランニングdocker-compose up あなたは開くことができますhttp://127.0.0.1:4455/welcome 設定をテストします.

    OOキーパーの設定


    この例ではゲートウェイの設定を開始できます.香港はネットワークトラフィックのエントリポイントです.Oory Oathkeeperはこの場合のみ内部ネットワークからアクセスできます.のアーキテクチャ図をレビューしましょう
    以前

    OathKeeperは我々のMicroServiceにセッションとプロキシ交通をチェックします.我々も、設定することができますRound-Robin DNS 当社のサービスのためのより堅牢な設定をするには.ここでは、Oyキーパーのアクセス規則を設定します.
    -
      id: "api:hello-protected"
      upstream:
        preserve_host: true
        url: "http://hello:8090"
      match:
        url: "http://oathkeeper:4455/hello"
        methods:
          - GET
      authenticators:
        -
          handler: cookie_session
      mutators:
        - handler: noop
      authorizer:
        handler: allow
      errors:
        - handler: redirect
          config:
            to: http://127.0.0.1:4455/login
    -
      id: "api:world-protected"
      upstream:
        preserve_host: true
        url: "http://world:8090"
      match:
        url: "http://oathkeeper:4455/world"
        methods:
          - GET
      authenticators:
        -
          handler: cookie_session
      mutators:
        - handler: noop
      authorizer:
        handler: allow
      errors:
        - handler: redirect
          config:
            to: http://127.0.0.1:4455/login
    
    Oyキーパー設定
    log:
      level: debug
      format: json
    
    serve:
      proxy:
        cors:
          enabled: true
          allowed_origins:
            - "*"
          allowed_methods:
            - POST
            - GET
            - PUT
            - PATCH
            - DELETE
          allowed_headers:
            - Authorization
            - Content-Type
          exposed_headers:
            - Content-Type
          allow_credentials: true
          debug: true
    
    errors:
      fallback:
        - json
    
      handlers:
        redirect:
          enabled: true
          config:
            to: http://127.0.0.1:4455/login
            when:
              -
                error:
                  - unauthorized
                  - forbidden
                request:
                  header:
                    accept:
                      - text/html
        json:
          enabled: true
          config:
            verbose: true
    
    access_rules:
      matching_strategy: glob
      repositories:
        - file:///etc/config/oathkeeper/access-rules.yml
    
    authenticators:
      anonymous:
        enabled: true
        config:
          subject: guest
    
      cookie_session:
        enabled: true
        config:
          check_session_url: http://kratos:4433/sessions/whoami
          preserve_path: true
          extra_from: "@this"
          subject_from: "identity.id"
          only:
            - ory_kratos_session
    
      noop:
        enabled: true
    
    authorizers:
      allow:
        enabled: true
    
    mutators:
      noop:
        enabled: true
    
    Oory Oathkeeperはリクエストクッキーの有効なセッションを調べます.ない場合はログインUIにリダイレクトしますory_kratos_session クッキー利用可能.

    追加香港


    今必要なのは、香港を設定することです.
    services:
      kong-migrations:
        image: "kong:latest"
        command: kong migrations bootstrap
        depends_on:
          - db
        environment:
          <<: *kong-env
        networks:
          - intranet
        restart: on-failure
    
      kong:
        platform: linux/arm64
        image: "kong:latest"
        environment:
          <<: *kong-env
          KONG_ADMIN_ACCESS_LOG: /dev/stdout
          KONG_ADMIN_ERROR_LOG: /dev/stderr
          KONG_PROXY_LISTEN: "${KONG_PROXY_LISTEN:-0.0.0.0:8000}"
          KONG_ADMIN_LISTEN: "${KONG_ADMIN_LISTEN:-0.0.0.0:8001}"
          KONG_PROXY_ACCESS_LOG: /dev/stdout
          KONG_PROXY_ERROR_LOG: /dev/stderr
          KONG_PREFIX: ${KONG_PREFIX:-/var/run/kong}
          KONG_DECLARATIVE_CONFIG: "/opt/kong/kong.yaml"
        networks:
          - intranet
        ports:
          # The following two environment variables default to an insecure value (0.0.0.0)
          # according to the CIS Security test.
          - "${KONG_INBOUND_PROXY_LISTEN:-0.0.0.0}:8000:8000/tcp"
          - "${KONG_INBOUND_SSL_PROXY_LISTEN:-0.0.0.0}:8443:8443/tcp"
          - "127.0.0.1:8001:8001/tcp"
          - "127.0.0.1:8444:8444/tcp"
        healthcheck:
          test: ["CMD", "kong", "health"]
          interval: 10s
          timeout: 10s
          retries: 10
        restart: on-failure:5
        read_only: true
        volumes:
          - kong_prefix_vol:${KONG_PREFIX:-/var/run/kong}
          - kong_tmp_vol:/tmp
          - ./config:/opt/kong
        security_opt:
          - no-new-privileges
    
      db:
        image: postgres:9.6
        environment:
          POSTGRES_DB: kong
          POSTGRES_USER: kong
          POSTGRES_PASSWORD: kong
        healthcheck:
          test: ["CMD", "pg_isready", "-U", "kong"]
          interval: 30s
          timeout: 30s
          retries: 3
        restart: on-failure
        networks:
          - intranet
    
      hello:
    
    Dockerは3つのコンテナを作成する
  • DBコンテナのPostgreSQLデータベースの設定を格納する
    APIゲートウェイのサービス/ルート.
  • 香港はデータベースに対して移動を移行する.
  • 露出するコンテナー8000 ポートをトラフィックと8001 ポート
    管理APIで.
  • 最後のステップとして、我々は、香港のサービスを作成し、ルートを設定する必要があります.
    #!/bin/bash
    
    # Creates an secure-api service
    # and proxies network traffic to oathkeeper
    curl -i -X POST \
      --url http://localhost:8001/services/ \
      --data 'name=secure-api' \
      --data 'url=http://oathkeeper:4455'
    
    # Creates routes for secure-api service
    curl -i -X POST \
      --url http://localhost:8001/services/secure-api/routes \
      --data 'paths[]=/'\
    

    Testing


    あなたは開くことができますhttp://127.0.0.1:8000/hello or zttp://127.0.0.1:8000/worldブラウザに2つのシナリオがあります.
  • あなたが受け取る{"message": "Hello microservice"} (or "World microservice" ).
  • ブラウザをリダイレクトするhttp://127.0.0.1:4455/login .
  • 更なるステップ


  • Configure id_token あなたのためにJWTトークンとしてアクセス可能なアイデンティティを持つMutator
    マイクロサービス

  • Configure the
    あなたのユースケースに合わせてパスワードポリシー.

  • Add two-factor authentication .
  • 使用を検討するauthentication based on subrequest result 代わりにネットワーク内の追加の逆プロキシを持つ

  • Kong auth request のための意思決定APIとしてOathkeeperを使用する優れたプラグインをすることができます