4

私は OPA (Open Policy Agent) に関するいくつかのビデオとチュートリアルを見ていましたが、複数のサービス / API にまたがる認証と承認を実装するためにそれを使用するのは本当にクールだと思いました。ただし、Windowsにインストールし、ASP.NetコアWeb APIと統合して認証と承認を実装する方法についての洞察を得ることができません。誰でもこれで私を助けることができますか?

ありがとう、

アミット・アナンド

4

2 に答える 2

4

上記のTim Hinrichsの答えは的を射ています。ただし、ここに追加するのは、いくつかの具体的な解決策です。以下の 2 つのソリューションのうち、REST API と ASP.NET ミドルウェアを使用することをお勧めします。また、OPA は理論的には認証ツールとして使用できますが、使用しないことをお勧めします。その目的は承認です。

ASP.NET 承認ミドルウェアを使用する

まず、OPA は独自のサービスとして、k8 のサイドカーとして、または Docker コンテナーで実行されます。OPA のドキュメントは、それを実装する方法の例を示す良い仕事をしているので、詳細には触れません。

ここでは、 OPA の Rest APIを照会する .NET サービスを作成します。

  • 完全な例はこちら
  • ミドルウェアの使用に関する Microsoft のドキュメントは次のとおりです

これがミドルウェアの外観です。

using System.Net;
using System.Threading.Tasks;
using Microsoft.AspNetCore.Http;

namespace Authz.Opa
{
    public class OpaAuthzMiddleware
    {
        private const string ForbiddenMessage = "Forbidden";

        private readonly RequestDelegate _next;
        private readonly IOpaService _opaService;

        public OpaAuthzMiddleware(RequestDelegate next, IOpaService service)
        {
            _next = next;
            _opaService= service;
        }

        public async Task InvokeAsync(HttpContext context)
        {
            var enforceResult = await _opaService.RunAuthorizationAsync(context);

            if (!enforceResult)
            {
                context.Response.StatusCode = (int)HttpStatusCode.Forbidden;
                await context.Response.WriteAsync(ForbiddenMessage);
                return;
            }

            await _next(context);
        }
    }
}

このようにスタートアップに実装します

using Microsoft.AspNetCore.Builder;
using Microsoft.AspNetCore.Hosting;
using Microsoft.Extensions.DependencyInjection;
using Microsoft.Extensions.Hosting;

namespace Sample
{
    public class Startup
    {

        public void ConfigureServices(IServiceCollection services)
        {
            services.AddControllers();
            services.AddRouting();

            services.AddSingleton<IOpaService, OpaService>();
        }


        public void Configure(IApplicationBuilder app, IWebHostEnvironment env)
        {
            if (env.IsDevelopment())
            {
                app.UseDeveloperExceptionPage();
            }

            app.UseRouting();

            app.UseMiddleware<OpaAuthzMiddleware>();

            app.UseEndpoints(endpoints =>
            {
                endpoints.MapControllers();
            });
        }
    }
}

OPA の Wasm コンパイルを使用する

OPA には、Rego ポリシーを実行可能な Wasm モジュールにコンパイルできるツールがあります。ここでドキュメントを提供しています。現在開発中ですが、これを .NET で使用する例がここにあります。そのレポの問題セクションの下の議論を見ると、彼らはまだいくつかのことを解決しているようです。コンパイルされた Wasm ファイルを読み取るには、利用可能な .NET ライブラリのいずれかを使用する必要がありますが、これは OPA が提供する最速の評価方法であると考えられています。

于 2021-02-07T00:01:38.277 に答える
4

ユースケースや実行しているプラ​​ットフォームについて詳しく知らなくても、一般的なアドバイスを以下に示します。

  1. 建築。OPA をサイドカーとして実行するか、スタンドアロン サービスとして実行するかを決定します。これは、レイテンシ、パフォーマンス、およびポリシーに必要なデータに依存するアーキテクチャ上の問題です。OPA はサイドカーとして設計されたビルディング ブロックですが、複数のコピーをスピンアップし、それらの間で負荷を分散し、永続化レイヤーを追加するなどして、OPA を中心にサービスを構築できます。

  2. 管理ポリシーをロード/更新し、意思決定を OPA に記録する方法を決定し、該当する場合は、データを OPA にロードする方法を決定します。

  3. サービス統合。サービス (Envoy、Linkerd、Kong など) に向かうすべてのネットワーク トラフィックをインターセプトするネットワーク プロキシを使用している場合は、.Net サービスを変更せずに OPA を呼び出すようにネットワーク プロキシを構成できます。ネットワーク プロキシを使用していない場合は、個々のサービスへの影響を最小限に抑えるために、可能であればライブラリを使用して、サービスでポリシーの決定が必要なときにHTTP コールアウトを行うように .Net サービスを変更します。統合ページには、Java Spring と PHP の方法が示されています。

于 2020-01-28T21:33:40.957 に答える