香港と安全なマイクロサービス
31930 ワード
マイクロサービスアーキテクチャは最近ではバックエンドの開発にほとんど標準である.APIゲートウェイは、ユーザーにアクセス可能な単一のAPIにマイクロサービスのグループを接続する優れた方法です.APIゲートウェイはAWS/Azure/Google Cloud PlatformやCloudFlareなどのクラウドプロバイダから入手できます.は、オープンソース上に構築されたスケーラブルなAPIゲートウェイであり、システムが特定のベンダーにロックされたくない場合には、優れた代替手段である.
このチュートリアルでは、Sun APIゲートウェイを使用した例を示します.
Ory Kratos , and Ory Oathkeeper .
以下の図は、このGUIDでビルドする最終的なアーキテクチャを示しています
このチュートリアルの完全なソースコードは
github
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ログイン機能を提供します.
つのマイクロサービスがあるとしましょう.
「世界」マイクロサービスが公開する
わかりました.ハッキングを始めましょう.
フォローするQuickstart ガイドは、KO Kratosを設定します.このチュートリアルでは、次の構成でDocker構成ファイルを必要とします
HTTP HTTP
アクセスでリンクhttp://127.0.0.1:4436 . HTTP
サインアップ/ログイン/回復フロー. アフターランニング
この例ではゲートウェイの設定を開始できます.香港はネットワークトラフィックのエントリポイントです.Oory Oathkeeperはこの場合のみ内部ネットワークからアクセスできます.のアーキテクチャ図をレビューしましょう
以前
OathKeeperは我々のMicroServiceにセッションとプロキシ交通をチェックします.我々も、設定することができますRound-Robin DNS 当社のサービスのためのより堅牢な設定をするには.ここでは、Oyキーパーのアクセス規則を設定します.
今必要なのは、香港を設定することです.
DBコンテナのPostgreSQLデータベースの設定を格納する
APIゲートウェイのサービス/ルート. 香港はデータベースに対して移動を移行する. 露出するコンテナー
管理APIで. 最後のステップとして、我々は、香港のサービスを作成し、ルートを設定する必要があります.
あなたは開くことができますhttp://127.0.0.1:8000/hello or zttp://127.0.0.1:8000/worldブラウザに2つのシナリオがあります. あなたが受け取る ブラウザをリダイレクトするhttp://127.0.0.1:4455/login .
Configure
マイクロサービス
Configure the
あなたのユースケースに合わせてパスワードポリシー.
Add two-factor authentication . 使用を検討するauthentication based on subrequest result 代わりにネットワーク内の追加の逆プロキシを持つ
Kong auth request のための意思決定APIとしてOathkeeperを使用する優れたプラグインをすることができます
このチュートリアルでは、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
ネットワークアーキテクチャについて:4433
and :4434
パブリックとアドミンAPIは、Key Kratosのです.:4436
MailSurper -モック電子メールサーバー.あなたは活性化を得ることができますアクセスでリンクhttp://127.0.0.1:4436 .
: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つのコンテナを作成する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"
). 更なるステップ
Configure
id_token
あなたのためにJWTトークンとしてアクセス可能なアイデンティティを持つMutatorマイクロサービス
Configure the
あなたのユースケースに合わせてパスワードポリシー.
Add two-factor authentication .
Kong auth request のための意思決定APIとしてOathkeeperを使用する優れたプラグインをすることができます
Reference
この問題について(香港と安全なマイクロサービス), 我々は、より多くの情報をここで見つけました https://dev.to/gen1us2k/secure-microservices-with-kong-and-ory-3j8lテキストは自由に共有またはコピーできます。ただし、このドキュメントのURLは参考URLとして残しておいてください。
Collection and Share based on the CC Protocol