From 929a41065c44da8980fd1819097abe3544d064c9 Mon Sep 17 00:00:00 2001 From: = Date: Fri, 21 Feb 2025 16:45:43 +0530 Subject: [PATCH] feat: first doc for gateway --- .../platform/gateways/overview.mdx | 79 ++++++++++++++++++ .../gateways/create-identity-for-gateway.png | Bin 0 -> 383861 bytes .../platform/gateways/dynamic-secret.png | Bin 0 -> 393478 bytes .../images/platform/gateways/gateway-list.png | Bin 0 -> 443518 bytes docs/mint.json | 4 + 5 files changed, 83 insertions(+) create mode 100644 docs/documentation/platform/gateways/overview.mdx create mode 100644 docs/images/platform/gateways/create-identity-for-gateway.png create mode 100644 docs/images/platform/gateways/dynamic-secret.png create mode 100644 docs/images/platform/gateways/gateway-list.png diff --git a/docs/documentation/platform/gateways/overview.mdx b/docs/documentation/platform/gateways/overview.mdx new file mode 100644 index 000000000..304fb87db --- /dev/null +++ b/docs/documentation/platform/gateways/overview.mdx @@ -0,0 +1,79 @@ +--- +title: "Gateway" +sidebarTitle: "Overview" +description: "Learn how to provide access on private resources to Infisical." +--- + + + Note that Gateway is a paid feature. + + If you're using Infisical Cloud, then it is available under the **Enterprise Tier** + If you're self-hosting Infisical, then you should contact sales@infisical.com to purchase an enterprise license to use it. + + + +## Introduction + +Gateway is Infisical's solution for providing secure access to your private resources without exposing them to the internet. + +By "without exposing," we mean that your resources remain completely closed to inbound connections - no SSH ports, no TCP ports are open. +This level of security ensures that even port scanning cannot detect your resources. + +## How It Works + +A gateway is a simple server that acts as a bridge for direct communication between the Infisical server and your private, closed resources (such as databases). + +When deployed, the gateway establishes a connection with the relay server. Infisical then communicates with your gateway through these relays. +All communication between Infisical and the gateway is end-to-end encrypted, ensuring that only the platform and your gateway can decrypt the transmitted information. + +## Deployment + +You can easily deploy a gateway using the Infisical CLI by following these steps: + + + + 1. Navigate to your **Organization Access Control**. + 2. Create a dedicated identity for the gateway. + 3. Best practice: Use one unique identity per gateway. + ![create-gateway](../../../images/platform/gateways/create-identity-for-gateway.png) + + + + Set up authentication by following the [Identity Auth Method Configuration](../identities/universal-auth) guide. + + + + 1. Deploy the gateway using Infisical CLI with this command: + ```bash + INFISICAL_TOKEN=$(infisical login ...) infisical gateway + ``` + + Verify that the deployed gateway has access to your private resources + + + + + 1. Check the gateway log to have **Gateway started successfully** + + 2. Navigate to **Gateways** list page in Org Access Control + ![list-gateway](../../../images/platform/gateways/gateway-list.png) + + + +## Using Your Gateway + +### Configuring Dynamic Secrets + +To use your gateway with dynamic secrets: + +1. Navigate to your dynamic secret provider settings +2. Under **Gateway** options, switch from **Internet Gateway** to your deployed gateway + ![dynamic-secret-gateway](../../../images/platform/gateways/dynamic-secret.png) + +### Supported Providers + +Currently, gateways are supported for the following dynamic secret providers: + +- SQL Database Providers (MySQL, PostgreSQL, etc.) + +Additional provider support will be added in future updates. diff --git a/docs/images/platform/gateways/create-identity-for-gateway.png b/docs/images/platform/gateways/create-identity-for-gateway.png new file mode 100644 index 0000000000000000000000000000000000000000..d7ef6b02aee9177ccabaf38a099bfc866df82539 GIT binary patch literal 383861 zcmbTec|26_`#(NJge;Y0Czb57??kAq#TfgNeV1+QLy^i>*^)IS%rLf)eJf;5jBOZX zANw+vVP<}(_wxCCzW@9luj28TIdkTobKmE>uKQY_*Lh*6uYI0|jRph)oxgYY&O_iW z5(J`3q&^FrIi&KF0N%*_9%`$DkOLg6zz0J|(|b;OdLTjIm>NV*b^&ze_YmM86zdA2 z_}4KAbOU$?fzITS{qMJVn%r(cg|I$kW5iPa#P8>c2)P0LQ;ii(TdU*ARbq<*TN8hCCYH zzK%RHqT-_BS5;_uczBe29h?*%-qHHc&w)?MS6%%5eH6sRpirnNR8rL2*IDeAyu7@a zxP+L5ga|M~#4p&(-!4eR%a8Bh7y0jX?l}6{`?~u0yLx-^{JyT;Bkurz<*QeJPxL>3 z|6ZrRtJD9^nw1qDl|%B|3fwv8dmE$DiBBwbnnh>;~=v2X{sP&FurRieV^tW zh5A<0%lt3*sTv+ZA>W!0YOs@vwl<+>dg}!bUKYXBE|t^Xw0ecH;Nd;Dx&a$Ff9P~0 z<9pvV$?w@2TfsTvwK<^!%ldETf;YvylM}P+O`eOD=I{E<=#z za*_y;mQP*Bs45b6YTKI30%&n+vHMc6R5(k{zFf(Dgmw+JBE*0aND`-A^3=#L1k)l|YvwUDw;;>AbAiCL|Cih{*uJXTFJhcHCxo!0nG>PH)n6GHV?<+LW zZc7eqLZ9#O{;4GV=e~H9W(Ex97|7XtRL%c`6^ z;sVV_g&np6q_s2HrrB<$$Aorudx|h_Zwt&c)HIXm=>J&4e)DhJr1cQ=wpQ8C(vX@$ zDU$IL4PE6eN_C?0UFyPHGuD>uWVPg6u!HTUwb4Y*zhT{va&n4Rw$V()Z-Ulb*uL_l z0_DO=_qUXo<7YG`6MsT8cX$?uj#oDJooiZ@byZMrZ6W7sh7v+=g=qYbSpM05YmFek z%?zsI=H^r9(WRiCi~gSA^zQtB2z)+Vr;h8d);tR(JE3e1GMy&qb#^wL4}D_JGt2un zZ`5v^nuqZwS(0k#Q4{;k5d2?g2oM=J#X1XU&u;sDP*GRxkjCSmednSKS;~W-N9QWO zC!TeP_#2J^d}GxpQ<(X}9|INbC?=gR&E`i0sXc<9!wKoa8k!snL zC

=@bn5~WE3e))^{ZE(J5$b;I&=dIR_mroNl(|& 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