たぶんこれは奇妙な質問です(私はマイクロサービスを初めて使用します)。しかし、私はこれをどのように進めるかについてのいくつかの情報を探しています。 Spring固有である必要はありませんが、それが現在使用しているフレームワークです。
例:2つのマイクロサービスがあるとしましょう
a) http://myurlfortesting.com:8085/api/rest/serviceone
b) http://myurlfortesting.com:8090/api/rest/servicetwo
そして、着信呼び出しを転送する次のルールを使用してSpring Zuul(APIゲートウェイとして機能)をセットアップしました。
/ rest/one-> http://myurlfortesting.com:8085/api/rest/serviceone
/ rest/two-> http://myurlfortesting.com:8090/api/rest/servicetwo
質問...ユーザーがAおよびBに記載されているサービスに直接アクセスするのを防ぐ方法はありますか(APIゲートウェイを介して提供されるサービスのみを許可します)?
これは、Springs Zuul(APIゲートウェイとして機能)でいくつかの追加フィルターを設定することで実行できますか、それともマイクロサービスエンドポイントで設定しますか?
APIGateway経由ではないマイクロサービスエンドポイントでの直接呼び出しを処理しない方法があるかどうかさえ知りたいです。
たぶん、これはサーバー固有のルールで解決され、Springとは何の関係もありませんか?
どうもありがとう、
/ D
ファイアウォールが設置されていると仮定すると、サーバーへのインバウンドトラフィックを、Zuulエンドポイントが公開されているポートに制限し、マイクロサービスのポートに直接アクセスすることを禁止できます。
ファイアウォールルートを使用しないようにする場合は、リクエストを転送する前に、エンドポイントに特定のHTTPヘッダーまたはZuulによって設定されたものをチェックさせることができますが、これはハッキーで簡単に回避できます。私の過去の経験に基づくと、「正しい」方法はファイアウォールを介してこれを行うことです。アプリはリクエストの処理を担当する必要があります。ファイアウォールは、特定のエンドポイントにヒットできるユーザーを決定する責任があります。
通常、このような状況は、適切なOAuthサーバーを実装することで処理されます。APIゲートウェイのみがトークンの検証を処理します。マイクロサービスへの直接呼び出しでは適切なトークン交換が行われないため、リクエストは中止されます。 。
マイクロサービスを任意のクラウドにデプロイした場合は、APIゲートウェイのみにルートを公開することでこれを実現できます。はい、ファイアウォールブロッキング、IPホワイトリストは、マイクロサービスへのアクセスを制限する他の方法のいくつかです。
同じ目的でjHipster-Gatewayを使用しています:
より詳細なアーキテクチャについては、 [〜#〜] here [〜#〜] を参照してください。
AWS API Gatewayでこれを行う正しい方法は、最近リリースされた「VPC Link」統合を使用することです。これにより、APIGatewayとVPC内のバックエンド間の接続が保護されます。
やっと、マイクロサービスアーキテクチャを使用して、API Gatewayからのリクエストを受け入れるソリューションを見つけました。フィルターを作成し、Zuulのようにプロキシとして機能し、ヘッダー「X-Forwarded-Host」をチェックします。ゲートウェイサービスと一致してから、不正な例外を返します。
public class CustomGatewayFilter extends GenericFilterBean {
@Override
public void doFilter(ServletRequest req, ServletResponse resp, FilterChain chain)
throws IOException, ServletException {
HttpServletRequest request = (HttpServletRequest) req;
HttpServletResponse response = (HttpServletResponse) resp;
String proxyForwardedHostHeader = request.getHeader("X-Forwarded-Host");
if (proxyForwardedHostHeader == null || !proxyForwardedHostHeader.equals(GatewayConstant.getGatewayURL())) {
UnauthorisedException unauthorisedException = new UnauthorisedException("Unauthorized Access",
"Unauthorized Access, you should pass through the API gateway");
byte[] responseToSend = restResponseBytes(unauthorisedException.getErrorResponse());
((HttpServletResponse) response).setHeader("Content-Type", "application/json");
((HttpServletResponse) response).setStatus(401);
response.getOutputStream().write(responseToSend);
return;
}
chain.doFilter(request, response);
}
private byte[] restResponseBytes(ErrorResponse errorResponse) throws IOException {
String serialized = new ObjectMapper().writeValueAsString(errorResponse);
return serialized.getBytes();
}
}
springSecurity構成にカスタムフィルターを追加することを忘れないでください
.and().addFilterBefore(new CustomGatewayFilter(), ConcurrentSessionFilter.class);