# Infisical > ## Documentation Index --- # Source: https://infisical.com/docs/integrations/secret-syncs/1password.md # Source: https://infisical.com/docs/integrations/app-connections/1password.md > ## Documentation Index > Fetch the complete documentation index at: https://infisical.com/docs/llms.txt > Use this file to discover all available pages before exploring further. # 1Password Connection > Learn how to configure a 1Password Connection for Infisical. Infisical supports the use of [Service Accounts](https://developer.1password.com/docs/service-accounts) to connect with 1Password. ## Setup 1Password Connect Server If you already have a Connect Server for your vault you may skip this step. Developer Page Click Connect Server 1. Input a name for your Connect Server 2. Click "Choose Vaults" and select the vaults you want to connect 3. For each selected vault, click **Edit Access** and **Enable All** 4. Click "Add Environment" Configure Connect Server 1. Input a name and expiration for the token 2. Click "Choose Vaults" and select the vaults you want to connect 3. For each selected vault, click **Edit Access** and **Enable All** 4. Click "Issue Token" Set Up Access Token Download the Credentials File and set up your Connect Server. Follow [this guide](https://developer.1password.com/docs/connect/get-started#step-2-deploy-1password-connect-server) to deploy a Connect Server. Make sure to save the **Access Token** for later use. Deploy Server ## Create 1Password Connection in Infisical In your Infisical dashboard, navigate to the **Integrations** tab in the desired project, then select **App Connections**. App Connections Tab Click the **+ Add Connection** button and select the **1Password Connection** option from the available integrations. Select 1Password Connection Complete the 1Password Connection form by entering: * A descriptive name for the connection * An optional description for future reference * The URL at which your 1Password Connect Server instance is hosted * The Access Token from earlier steps 1Password Connection Modal After clicking Create, your **1Password Connection** is established and ready to use with your Infisical project. 1Password Connection Created To create an 1Password Connection, make an API request to the [Create 1Password Connection](/api-reference/endpoints/app-connections/1password/create) API endpoint. ### Sample request ```bash Request theme={"dark"} curl --request POST \ --url https://app.infisical.com/api/v1/app-connections/1password \ --header 'Content-Type: application/json' \ --data '{ "name": "my-1password-connection", "method": "api-token", "projectId": "7ffbb072-2575-495a-b5b0-127f88caef78", "credentials": { "instanceUrl": "https://1pass.example.com", "apiToken": "" } }' ``` ### Sample response ```bash Response theme={"dark"} { "appConnection": { "id": "e5d18aca-86f7-4026-a95e-efb8aeb0d8e6", "name": "my-1password-connection", "projectId": "7ffbb072-2575-495a-b5b0-127f88caef78", "description": null, "version": 1, "orgId": "6f03caa1-a5de-43ce-b127-95a145d3464c", "createdAt": "2025-04-23T19:46:34.831Z", "updatedAt": "2025-04-23T19:46:34.831Z", "isPlatformManagedCredentials": false, "credentialsHash": "7c2d371dec195f82a6a0d5b41c970a229cfcaf88e894a5b6395e2dbd0280661f", "app": "1password", "method": "api-token", "credentials": { "instanceUrl": "https://1pass.example.com" } } } ``` --- # Source: https://infisical.com/docs/integrations/frameworks/ab-initio.md > ## Documentation Index > Fetch the complete documentation index at: https://infisical.com/docs/llms.txt > Use this file to discover all available pages before exploring further. # AB Initio > How to use Infisical secrets in AB Initio. ## Prerequisites * Set up and add envars to [Infisical](https://app.infisical.com). * Install the [Infisical CLI](https://infisical.com/docs/cli/overview) to your server. ## Setup Create a [machine identity](https://infisical.com/docs/documentation/platform/identities/machine-identities#machine-identities) in Infisical and give it the appropriate read permissions for the desired project and secret paths. Update your AB Initio workflows to use Infisical CLI to inject Infisical secrets as environment variables. ```bash theme={"dark"} # Login using the machine identity. Modify this accordingly based on the authentication method used. export INFISICAL_TOKEN=$(infisical login --method=universal-auth --client-id=$INFISICAL_CLIENT_ID --client-secret=$INFISICAL_CLIENT_SECRET --silent --plain) # Fetch secrets from Infisical infisical export --projectId="<>" --env="prod" > infisical.env # Inject secrets as environment variables source infisical.env ``` --- # Source: https://infisical.com/docs/documentation/platform/secrets-mgmt/concepts/access-control.md > ## Documentation Index > Fetch the complete documentation index at: https://infisical.com/docs/llms.txt > Use this file to discover all available pages before exploring further. # Scoping Secrets > Learn how access to secrets is controlled in Infisical. ## Secret Hierarchy Every secret in Infisical is scoped to an environment and a path. * An environment separates where secrets are used, such as `development`, `staging`, or `production`. * A path is an (optional) namespace within an environment that groups related secrets such as `/postgres`, `/redis`, or per-service paths like `/service-a`. This structure makes it easy to organize secrets by team, service, or environment, and sets the foundation for controlling who can access what. ## Access Control Access control determines who (or what) can access a secret and under what conditions. Without clear policies, even securely stored secrets can be misused or exposed. To control access to secrets, you configure role-based permissions at the project level. These permissions determine which environments and paths a user or machine identity with that role can access. For example, an engineer might have a role that allows them to read secrets in the `development` environment but not those in the `production` environment. This model follows the [principle of least privilege](https://en.wikipedia.org/wiki/Principle_of_least_privilege) such that each user or machine identity has access only to the secrets it needs — and nothing more. ## Advanced Capabilities Beyond basic role assignments, Infisical includes additional access control mechanisms for more advanced use cases: * Access approvals: Users can request access to specific environments or paths. Access can be temporary and reviewed before it is granted, reducing long-term exposure. * Secret change approvals: Updates to sensitive secrets can require approval before taking effect. This adds control in environments where unreviewed changes pose risk. * Attribute-based access control (ABAC): Permissions can be matched against metadata on a user or machine identity — such as team, service, or environment — enabling dynamic access rules without manual role changes. All access and approval actions are logged, so it’s always possible to trace who accessed what, when, and under what conditions. --- # Source: https://infisical.com/docs/documentation/platform/access-controls/access-requests.md > ## Documentation Index > Fetch the complete documentation index at: https://infisical.com/docs/llms.txt > Use this file to discover all available pages before exploring further. # Access Requests > Learn how to request access to sensitive resources in Infisical. In certain situations, developers need to expand their access to a certain new project or a sensitive environment. For those use cases, it is helpful to utilize Infisical's **Access Requests** functionality. This functionality works in the following way: 1. A project administrator sets up an access policy that assigns access managers (also known as eligible approvers) to a certain sensitive folder or environment. Create Access Request Policy Modal A step policy enables a sequential approval workflow in which approvals must follow the designated chain. Access Request Policies 2. When a developer requests access to one of such sensitive resources, the request is visible in the dashboard, and the corresponding eligible approvers get an email notification about it. Access Request Create Access Request Dashboard 3. An eligible approver can approve or reject the access request. Access Request Bypass Optionally, approvers can edit the duration of an access request to reduce how long access will be granted by clicking the **Edit** icon next to the duration. Edit Access Request If the access request matches with a policy that allows break-glass approval bypasses, the requester may bypass the policy and get access to the resource without full approval. 5. As soon as the request is approved, developer is able to access the sought resources. --- # Source: https://infisical.com/docs/documentation/platform/pam/getting-started/accounts.md > ## Documentation Index > Fetch the complete documentation index at: https://infisical.com/docs/llms.txt > Use this file to discover all available pages before exploring further. # PAM Account > Learn how to create and manage accounts in PAM to control access to resources like databases and servers. An **Account** contains the credentials (such as a username and password) used to connect to a [Resource](/documentation/platform/pam/getting-started/resources). ## Relationship to Resources Accounts belong to Resources. A single Resource can have multiple Accounts associated with it, each with different permission levels. For example, your database would normally have multiple accounts. You might have a superuser account for admins, a standard read/write account for applications, and a read-only account for reporting. In PAM, these are represented as: * **Resource**: `Production Database` (PostgreSQL) * **Account 1**: `postgres` (Superuser) * **Account 2**: `app_user` (Read/Write) * **Account 3**: `analytics` (Read-only) When a user requests access in PAM, they request access to a specific **Account** on a **Resource**. ## Creating an Account **Prerequisite**: You must have at least one [Resource](/documentation/platform/pam/getting-started/resources) created before adding accounts. To add an account, navigate to the **Accounts** tab in your PAM project and click **Add Account**. Add Account Button Next, select the **Resource** that this account belongs to. Select Resource After selecting a resource, provide the credentials (username, password, etc.) for this account. The required fields vary depending on the resource type. For example, for a Linux server, you would enter the username and the corresponding password or SSH key. Create Account Clicking **Create Account** will trigger a validation check. Infisical will attempt to connect to the resource using the provided credentials to verify they are valid. ## Automated Credential Rotation Infisical supports automated credential rotation for some accounts on select resources, allowing you to automatically change passwords at set intervals to enhance security. To learn more about how to configure this, please refer to the [Credential Rotation guide](/documentation/platform/pam/product-reference/credential-rotation). --- # Source: https://infisical.com/docs/documentation/platform/pki/ca/acme-ca.md > ## Documentation Index > Fetch the complete documentation index at: https://infisical.com/docs/llms.txt > Use this file to discover all available pages before exploring further. # ACME-compatible CA > Learn how to connect Infisical to an ACME-compatible CA to issue certificates. ## Concept Infisical can connect to any upstream ACME-compatible CA (e.g. Lets's Encrypt, DigiCert, etc.) supporting the [ACME protocol](https://en.wikipedia.org/wiki/Automatic_Certificate_Management_Environment) to issue certificates back to your end-entities. This integration uses the [DNS-01 challenge](https://letsencrypt.org/docs/challenge-types/#dns-01-challenge) method as part of the ACME domain validation challenge workflow for a requested certificate. The upstream ACME-compatible CA integration lets you connect Infisical to providers by specifying their **ACME Directory URL** such as: * [Let's Encrypt](/documentation/platform/pki/ca/lets-encrypt): `https://acme-v02.api.letsencrypt.org/directory`. * [DigiCert](/documentation/platform/pki/ca/digicert): `https://acme.digicert.com/v2/acme/directory`. * Google GTS: `https://dv.acme-v02.api.pki.goog/directory`. * Buypass: `https://api.buypass.com/acme/directory`. * ZeroSSL: `https://acme.zerossl.com/v2/DV90`. * SSL.com: `https://acme.ssl.com/sslcom-dv-rsa`. When Infisical requests a certificate from an ACME-compatible CA, it creates a TXT record at `_acme-challenge.{your-domain}` in your configured DNS provider (e.g. Route53, Cloudflare, DNS Made Easy, etc.); this TXT record contains the challenge token issued by the ACME-compatible CA to validate domain control for the requested certificate. The ACME provider checks for the existence of this TXT record to verify domain control before issuing the certificate back to Infisical. After validation completes successfully, Infisical automatically removes the TXT record from your DNS provider.
```mermaid theme={"dark"} graph TD A[ACME-compatible CA] <-->|ACME v2 Protocol| B[Infisical] B -->|Creates TXT Records
via DNS Provider| C[DNS Validation] B -->|Manages Certificates| D[End-Entities] ```
We recommend reading about [ACME protocol](https://tools.ietf.org/html/rfc8555) and [DNS-01 challenges](https://letsencrypt.org/docs/challenge-types/#dns-01-challenge) for a fuller understanding of the underlying workflow. ## Workflow A typical workflow for using Infisical with an external ACME-compatible CA consists of the following steps: 1. Setting up your DNS provider (e.g. Route53, Cloudflare, etc.) with appropriate DNS permissions. 2. Creating an [App Connection](/integrations/app-connections/overview) in Infisical to store credentials for Infisical to connect to your DNS provider and create/remove DNS records as part of the DNS-01 challenge. 3. Registering an [External CA](/documentation/platform/pki/ca/external-ca) in Infisical with the ACME type and inputting required configuration including the **ACME Directory URL** of the upstream ACME-compatible CA and the **App Connection** for your DNS provider. Once this is complete, you can create a [certificate profile](/documentation/platform/pki/certificates/profiles) linked to the External CA proceed to request a certificate against it. ## Guide to Connecting Infisical to an ACME-compatible CA In the following steps, we explore how to connect Infisical to an ACME-compatible CA. Before registering an ACME-compatible CA with Infisical, you need to set up an [App Connection](/integrations/app-connections/overview) with the appropriate permissions for Infisical to perform the DNS-01 challenge with your DNS provider. If you don’t see a specific DNS provider listed below or need a dedicated one, please reach out to [sales@infisical.com](mailto:sales@infisical.com) and we’ll help get that enabled for you. 1. Navigate to your Certificate Management Project > App Connections and create a new AWS connection. 2. Ensure your AWS connection has the following minimum permissions for Route53 DNS validation: ```json theme={"dark"} { "Version": "2012-10-17", "Statement": [ { "Effect": "Allow", "Action": "route53:GetChange", "Resource": "arn:aws:route53:::change/*" }, { "Effect": "Allow", "Action": "route53:ListHostedZonesByName", "Resource": "*" }, { "Effect": "Allow", "Action": [ "route53:ListResourceRecordSets" ], "Resource": [ "arn:aws:route53:::hostedzone/YOUR_HOSTED_ZONE_ID" ] }, { "Effect": "Allow", "Action": [ "route53:ChangeResourceRecordSets" ], "Resource": [ "arn:aws:route53:::hostedzone/YOUR_HOSTED_ZONE_ID" ], "Condition": { "ForAllValues:StringEquals": { "route53:ChangeResourceRecordSetsRecordTypes": [ "TXT" ] } } } ] } ``` Replace `YOUR_HOSTED_ZONE_ID` with your actual Route53 hosted zone ID. For detailed instructions on setting up an AWS connection, see the [AWS Connection](/integrations/app-connections/aws) documentation. 1. Navigate to your Certificate Management Project > App Connections and create a new Cloudflare connection. 2. Ensure your Cloudflare token has the following minimum permissions for DNS validation: ``` Account:Account Settings:Read Zone:DNS:Edit ``` For detailed instructions on setting up a Cloudflare connection, see the [Cloudflare Connection](/integrations/app-connections/cloudflare) documentation. Navigate to your Certificate Management Project > App Connections and create a new DNS Made Easy connection. For detailed instructions on setting up a DNS Made Easy connection, see the [DNS Made Easy Connection](/integrations/app-connections/dns-made-easy) documentation. To register an ACME-compatible CA, head to your Certificate Management Project > Certificate Authorities > External Certificate Authorities and press **Create CA**. pki register external ca Here, set the **CA Type** to **ACME** and fill out details for it. pki register external ca details Here's some guidance for each field: * Name: A slug-friendly name for the ACME-compatible CA such as `lets-encrypt-production`. * DNS App Connection: The App Connection from Step 1 used for Infisical to connect to your DNS provider and create/remove DNS records as part of the DNS-01 challenge in ACME. * Zone / Zone ID: Enter the Zone / Zone ID for the domain(s) you'll be requesting certificates for. * Directory URL: Enter the **ACME Directory URL** for your desired upstream ACME-compatible CA such as `https://acme-v02.api.letsencrypt.org/directory` for Let's Encrypt. * Account Email: The email address to associate with your ACME account. This email will receive important notifications about your certificates. * EAB Key Identifier (KID): (Optional) The Key Identifier (KID) provided by your ACME CA for External Account Binding (EAB). This is required by some ACME providers (e.g., ZeroSSL, DigiCert) to link your ACME account to an external account you've pre-registered with them. * EAB HMAC Key: (Optional) The HMAC Key provided by your ACME CA for External Account Binding (EAB). This key is used in conjunction with the KID to prove ownership of the external account during ACME account registration. Finally, press **Create** to register the ACME-compatible CA with Infisical. Great! You’ve successfully registered an external ACME-compatible CA with Infisical. Now check out the [Certificates](/documentation/platform/pki/certificates/overview) section to learn more about how to issue X.509 certificates using the ACME-compatible CA. To register an ACME CA with Infisical using the API, make a request to the [Create External CA](https://infisical.com/docs/api-reference/endpoints/certificate-authorities/acme/create) endpoint: ### Sample request ```bash Request theme={"dark"} curl 'https://app.infisical.com/api/v1/cert-manager/ca/acme' \ -H 'Authorization: Bearer ' \ -H 'Content-Type: application/json' \ --data-raw '{ "projectId": "0fccb6ee-1381-4ff1-8d5f-0cb93c6cc4d6", "name": "lets-encrypt-production", "type": "acme", "status": "active", "enableDirectIssuance": true, "configuration": { "dnsAppConnection": { "id": "1e5f8c0d-09d2-492c-9b28-469acd8e841b", "name": "acme-dns-test-connection" }, "dnsProviderConfig": { "provider": "route53", "hostedZoneId": "Z040441124N1GOOMCQYX1" }, "directoryUrl": "https://acme-v02.api.letsencrypt.org/directory", "accountEmail": "admin@example.com", "dnsAppConnectionId": "1e5f8c0d-09d2-492c-9b28-469acd8e841b" } }' ``` ### Sample response ```bash Response theme={"dark"} { "id": "c48b701e-a20c-4a9a-8119-68f54e5fbb05", "name": "lets-encrypt-production", "type": "acme", "status": "active", "projectId": "0fccb6ee-1381-4ff1-8d5f-0cb93c6cc4d6", "enableDirectIssuance": true, "configuration": { "accountEmail": "admin@example.com", "directoryUrl": "https://acme-v02.api.letsencrypt.org/directory", "dnsAppConnection": { "id": "1e5f8c0d-09d2-492c-9b28-469acd8e841b", "name": "acme-dns-test-connection" }, "dnsAppConnectionId": "1e5f8c0d-09d2-492c-9b28-469acd8e841b", "dnsProviderConfig": { "provider": "route53", "hostedZoneId": "Z040441124N1GOOMCQYX1" } } } ``` ## FAQ Currently, Infisical supports DNS-01 validation through AWS Route53 or Cloudflare. The DNS-01 challenge method is preferred for ACME integrations because it: * Works with wildcard certificates * Doesn't require your servers to be publicly accessible * Can be fully automated without manual intervention Support for additional DNS providers is planned for future releases. Yes! ACME CAs like Let's Encrypt support wildcard certificates (e.g., `*.example.com`) when using DNS-01 validation. Simply specify the wildcard domain in your subscriber configuration. Note that wildcard certificates still require DNS-01 validation - HTTP-01 validation cannot be used for wildcard certificates. Most ACME providers issue certificates with 90-day validity periods. This shorter validity period is designed to: * Encourage automation of certificate management * Reduce the impact of compromised certificates * Ensure systems stay up-to-date with certificate management practices Yes. You can register multiple ACME CAs in the same project. --- # Source: https://infisical.com/docs/documentation/platform/pki/enrollment-methods/acme.md > ## Documentation Index > Fetch the complete documentation index at: https://infisical.com/docs/llms.txt > Use this file to discover all available pages before exploring further. # Certificate Enrollment via ACME ## Concept The ACME enrollment method allows Infisical to act as an ACME server. It lets you request and manage certificates against a specific [certificate profile](/documentation/platform/pki/certificates/profiles) using the [ACME protocol](https://en.wikipedia.org/wiki/Automatic_Certificate_Management_Environment). This method is suitable for web servers, load balancers, and other general-purpose servers that can run an [ACME client](https://letsencrypt.org/docs/client-options/) for automated certificate management; it can also be used with [cert-manager](https://cert-manager.io/) to issue and renew certificates for Kubernetes workloads through the [ACME issuer type](https://cert-manager.io/docs/configuration/acme/). Infisical's ACME enrollment method is based on [RFC 8555](https://datatracker.ietf.org/doc/html/rfc8555/). ## Prerequisites Install an [ACME client](https://letsencrypt.org/docs/client-options/) onto your server. This client will handle [ACME challenges](https://letsencrypt.org/docs/challenge-types/) and request/renew certificates from Infisical. ## Guide to Certificate Enrollment via ACME In the following steps, we explore how to issue a X.509 certificate using the ACME enrollment method. Create a [certificate profile](/documentation/platform/pki/certificates/profiles) with **ACME** selected as the enrollment method. pki acme config By default, when the ACME client requests a certificate against the certificate profile for a particular domain, Infisical will verify domain ownership using the [HTTP-01 challenge](https://letsencrypt.org/docs/challenge-types/#http-01-challenge) method prior to issuing a certificate back to the client. If you want Infisical to skip domain ownership validation entirely, you can enable the **Skip DNS Ownership Validation** checkbox. Note that skipping domain ownership validation for the ACME enrollment method is **not the same** as skipping validation for an [External ACME CA integration](/documentation/platform/pki/ca/acme-ca). When using the ACME enrollment, the domain ownership check occurring between the ACME client and Infisical can be skipped. In contrast, External ACME CA integrations always require domain ownership validation, as Infisical must complete a DNS-01 challenge with the upstream ACME-compatible CA. Once you've created the certificate profile, you can obtain its ACME configuration details by clicking the **Reveal ACME EAB** option on the profile. pki acme eab config From the ACME configuration, gather the following values: * ACME Directory URL: The URL that the ACME client will use to communicate with Infisical's ACME server. * EAB Key Identifier (KID): A unique identifier that tells Infisical which ACME account is making the request. * EAB Secret: A secret key that authenticates your ACME client with Infisical. Provide the **ACME Directory URL**, **EAB KID**, and **EAB Secret** from Step 2 to your ACME client to authenticate with Infisical and request a certificate. For example, if using [Certbot](https://certbot.eff.org/) as an ACME client, you can configure and start requesting certificates with the following command: ```bash theme={"dark"} sudo certbot certonly \ --standalone \ --server "https://your-infisical-instance.com/api/v1/cert-manager/certificate-profiles/{profile-id}/acme/directory" \ --eab-kid "your-eab-kid" \ --eab-hmac-key "your-eab-secret" \ -d example.infisical.com \ --email admin@example.com \ --agree-tos \ --non-interactive ``` Certbot stores the private key and resulting leaf certificate and full certificate chain in `/etc/letsencrypt/live/{domain-name}/`. For client-specific setup and usage instructions, refer to the documentation for your ACME client. --- # Source: https://infisical.com/docs/documentation/platform/agent-sentinel/activity-logs.md > ## Documentation Index > Fetch the complete documentation index at: https://infisical.com/docs/llms.txt > Use this file to discover all available pages before exploring further. # Activity Logs > Monitor and audit AI tool usage with detailed activity logs. ## Concept Activity Logs provide complete visibility into how AI agents are using tools through your MCP endpoints. Every tool invocation is logged with detailed information including timestamps, the endpoint used, which tool was called, who initiated the request, and the full request/response payloads. Identify unusual patterns of tool usage, verify authorized access, and detect potential data exfiltration attempts. Meet SOC 2 requirements, support internal security reviews, and enable incident investigation with complete audit trails. Examine request payloads, review response errors, and trace the sequence of tool calls when issues arise. Identify frequently used tools, track usage trends over time, and measure active users per endpoint. ## What Gets Logged Every tool invocation through an MCP endpoint creates a log entry containing: | Field | Description | | ------------- | ----------------------------------------- | | **Timestamp** | When the tool was invoked | | **Endpoint** | The MCP endpoint used | | **Tool** | The name of the tool that was called | | **User** | The user who initiated the request | | **Request** | The full request payload sent to the tool | | **Response** | The full response returned by the tool | ## Viewing Activity Logs Head to your Agent Sentinel project and select **Activity Logs** from the sidebar. activity logs Use the time range selector to filter logs. You can also adjust the timezone using the timezone dropdown. Click **Filter** to apply additional filters: * **Endpoint**: Filter by specific MCP endpoint * **Tool**: Filter by specific tool * **User**: Filter by specific user * **Server**: Filter by specific MCP server Click on any log entry to expand it and view the full details: * **Request**: The JSON payload sent to the tool * **Response**: The JSON response returned by the tool activity log details ## FAQ Yes, activity logs can be exported for external analysis or long-term storage. Enterprise plans include log streaming to external SIEM systems. Infisical supports PII filtering to automatically detect and mask sensitive data in request and response payloads. When enabled on an MCP endpoint, the following PII types can be redacted: * **Email addresses** → `[REDACTED_EMAIL]` * **Phone numbers** → `[REDACTED_PHONE]` * **Social Security Numbers** → `[REDACTED_SSN]` * **Credit card numbers** → `[REDACTED_CREDIT_CARD]` * **IP addresses (IPv4 and IPv6)** → `[REDACTED_IP]` You can configure PII filtering separately for requests and responses, and select which PII types to detect. See [MCP Endpoints - PII Filtering](/documentation/platform/agent-sentinel/mcp-endpoints#pii-filtering) for configuration details. Yes, all tool invocations are logged regardless of success or failure. Failed invocations include error details in the response payload. --- # Source: https://infisical.com/docs/api-reference/endpoints/pki/syncs/add-certificates.md > ## Documentation Index > Fetch the complete documentation index at: https://infisical.com/docs/llms.txt > Use this file to discover all available pages before exploring further. # Add Certificates to Sync > Add certificates to a PKI Sync. ## OpenAPI ````yaml POST /api/v1/cert-manager/syncs/{pkiSyncId}/certificates openapi: 3.0.3 info: title: Infisical API description: List of all available APIs that can be consumed version: 0.0.1 servers: - url: https://us.infisical.com description: Production server (US) - url: https://eu.infisical.com description: Production server (EU) - url: http://localhost:8080 description: Local server security: [] paths: /api/v1/cert-manager/syncs/{pkiSyncId}/certificates: post: tags: - PKI Syncs description: Add certificates to a PKI Sync. operationId: addCertificatesToPkiSync parameters: - schema: type: string format: uuid in: path name: pkiSyncId required: true requestBody: content: application/json: schema: type: object properties: certificateIds: type: array items: type: string format: uuid minItems: 1 required: - certificateIds additionalProperties: false required: true responses: '200': description: Default Response content: application/json: schema: type: object properties: addedCertificates: type: array items: type: object properties: id: type: string format: uuid pkiSyncId: type: string format: uuid certificateId: type: string format: uuid syncStatus: type: string default: pending nullable: true lastSyncMessage: type: string nullable: true lastSyncedAt: type: string format: date-time nullable: true createdAt: type: string format: date-time updatedAt: type: string format: date-time required: - id - pkiSyncId - certificateId - createdAt - updatedAt additionalProperties: false required: - addedCertificates additionalProperties: false '400': description: Default Response content: application/json: schema: type: object properties: reqId: type: string statusCode: type: number enum: - 400 message: type: string error: type: string details: {} required: - reqId - statusCode - message - error additionalProperties: false '401': description: Default Response content: application/json: schema: type: object properties: reqId: type: string statusCode: type: number enum: - 401 message: type: string error: type: string required: - reqId - statusCode - message - error additionalProperties: false '403': description: Default Response content: application/json: schema: type: object properties: reqId: type: string statusCode: type: number enum: - 403 message: type: string details: {} error: type: string required: - reqId - statusCode - message - error additionalProperties: false '404': description: Default Response content: application/json: schema: type: object properties: reqId: type: string statusCode: type: number enum: - 404 message: type: string error: type: string required: - reqId - statusCode - message - error additionalProperties: false '422': description: Default Response content: application/json: schema: type: object properties: reqId: type: string statusCode: type: number enum: - 422 message: {} error: type: string required: - reqId - statusCode - error additionalProperties: false '500': description: Default Response content: application/json: schema: type: object properties: reqId: type: string statusCode: type: number enum: - 500 message: type: string error: type: string required: - reqId - statusCode - message - error additionalProperties: false ```` --- # Source: https://infisical.com/docs/api-reference/endpoints/groups/add-group-machine-identity.md > ## Documentation Index > Fetch the complete documentation index at: https://infisical.com/docs/llms.txt > Use this file to discover all available pages before exploring further. # Add Machine Identity to Group ## OpenAPI ````yaml POST /api/v1/groups/{id}/machine-identities/{machineIdentityId} openapi: 3.0.3 info: title: Infisical API description: List of all available APIs that can be consumed version: 0.0.1 servers: - url: https://us.infisical.com description: Production server (US) - url: https://eu.infisical.com description: Production server (EU) - url: http://localhost:8080 description: Local server security: [] paths: /api/v1/groups/{id}/machine-identities/{machineIdentityId}: post: tags: - Groups operationId: addMachineIdentityToGroup parameters: - schema: type: string in: path name: id required: true description: The ID of the group to add the machine identity to. - schema: type: string in: path name: machineIdentityId required: true description: The ID of the machine identity to add to the group. responses: '200': description: Default Response content: application/json: schema: type: object properties: id: type: string required: - id additionalProperties: false '400': description: Default Response content: application/json: schema: type: object properties: reqId: type: string statusCode: type: number enum: - 400 message: type: string error: type: string details: {} required: - reqId - statusCode - message - error additionalProperties: false '401': description: Default Response content: application/json: schema: type: object properties: reqId: type: string statusCode: type: number enum: - 401 message: type: string error: type: string required: - reqId - statusCode - message - error additionalProperties: false '403': description: Default Response content: application/json: schema: type: object properties: reqId: type: string statusCode: type: number enum: - 403 message: type: string details: {} error: type: string required: - reqId - statusCode - message - error additionalProperties: false '404': description: Default Response content: application/json: schema: type: object properties: reqId: type: string statusCode: type: number enum: - 404 message: type: string error: type: string required: - reqId - statusCode - message - error additionalProperties: false '422': description: Default Response content: application/json: schema: type: object properties: reqId: type: string statusCode: type: number enum: - 422 message: {} error: type: string required: - reqId - statusCode - error additionalProperties: false '500': description: Default Response content: application/json: schema: type: object properties: reqId: type: string statusCode: type: number enum: - 500 message: type: string error: type: string required: - reqId - statusCode - message - error additionalProperties: false ```` --- # Source: https://infisical.com/docs/api-reference/endpoints/groups/add-group-user.md > ## Documentation Index > Fetch the complete documentation index at: https://infisical.com/docs/llms.txt > Use this file to discover all available pages before exploring further. # Add Group User ## OpenAPI ````yaml POST /api/v1/groups/{id}/users/{username} openapi: 3.0.3 info: title: Infisical API description: List of all available APIs that can be consumed version: 0.0.1 servers: - url: https://us.infisical.com description: Production server (US) - url: https://eu.infisical.com description: Production server (EU) - url: http://localhost:8080 description: Local server security: [] paths: /api/v1/groups/{id}/users/{username}: post: tags: - Groups operationId: addUserToGroup parameters: - schema: type: string in: path name: id required: true description: The ID of the group to add the user to. - schema: type: string in: path name: username required: true description: The username of the user to add to the group. responses: '200': description: Default Response content: application/json: schema: type: object properties: email: type: string nullable: true username: type: string firstName: type: string nullable: true lastName: type: string nullable: true id: type: string format: uuid required: - username - id additionalProperties: false '400': description: Default Response content: application/json: schema: type: object properties: reqId: type: string statusCode: type: number enum: - 400 message: type: string error: type: string details: {} required: - reqId - statusCode - message - error additionalProperties: false '401': description: Default Response content: application/json: schema: type: object properties: reqId: type: string statusCode: type: number enum: - 401 message: type: string error: type: string required: - reqId - statusCode - message - error additionalProperties: false '403': description: Default Response content: application/json: schema: type: object properties: reqId: type: string statusCode: type: number enum: - 403 message: type: string details: {} error: type: string required: - reqId - statusCode - message - error additionalProperties: false '404': description: Default Response content: application/json: schema: type: object properties: reqId: type: string statusCode: type: number enum: - 404 message: type: string error: type: string required: - reqId - statusCode - message - error additionalProperties: false '422': description: Default Response content: application/json: schema: type: object properties: reqId: type: string statusCode: type: number enum: - 422 message: {} error: type: string required: - reqId - statusCode - error additionalProperties: false '500': description: Default Response content: application/json: schema: type: object properties: reqId: type: string statusCode: type: number enum: - 500 message: type: string error: type: string required: - reqId - statusCode - message - error additionalProperties: false ```` --- # Source: https://infisical.com/docs/api-reference/endpoints/ssh/groups/add-host.md # Add Host > Add an SSH Host to a Host Group ## OpenAPI ````yaml POST /api/v1/ssh/host-groups/{sshHostGroupId}/hosts/{hostId} paths: path: /api/v1/ssh/host-groups/{sshHostGroupId}/hosts/{hostId} method: post servers: - url: https://us.infisical.com description: Production server (US) - url: https://eu.infisical.com description: Production server (EU) - url: http://localhost:8080 description: Local server request: security: [] parameters: path: sshHostGroupId: schema: - type: string required: true description: The ID of the SSH host group to add the host to. hostId: schema: - type: string required: true description: The ID of the SSH host to add to the SSH host group. query: {} header: {} cookie: {} body: {} response: '200': application/json: schemaArray: - type: object properties: id: allOf: - type: string format: uuid projectId: allOf: - type: string hostname: allOf: - type: string alias: allOf: - type: string nullable: true userCertTtl: allOf: - type: string hostCertTtl: allOf: - type: string userSshCaId: allOf: - type: string format: uuid hostSshCaId: allOf: - type: string format: uuid loginMappings: allOf: - type: array items: type: object properties: loginUser: type: string allowedPrincipals: type: object properties: usernames: type: array items: type: string groups: type: array items: type: string additionalProperties: false required: - loginUser - allowedPrincipals additionalProperties: false requiredProperties: - id - projectId - hostname - userCertTtl - hostCertTtl - userSshCaId - hostSshCaId - loginMappings additionalProperties: false examples: example: value: id: 3c90c3cc-0d44-4b50-8888-8dd25736052a projectId: hostname: alias: userCertTtl: hostCertTtl: userSshCaId: 3c90c3cc-0d44-4b50-8888-8dd25736052a hostSshCaId: 3c90c3cc-0d44-4b50-8888-8dd25736052a loginMappings: - loginUser: allowedPrincipals: usernames: - groups: - description: Default Response '400': application/json: schemaArray: - type: object properties: reqId: allOf: - type: string statusCode: allOf: - type: number enum: - 400 message: allOf: - type: string error: allOf: - type: string requiredProperties: - reqId - statusCode - message - error additionalProperties: false examples: example: value: reqId: statusCode: 400 message: error: description: Default Response '401': application/json: schemaArray: - type: object properties: reqId: allOf: - type: string statusCode: allOf: - type: number enum: - 401 message: allOf: - type: string error: allOf: - type: string requiredProperties: - reqId - statusCode - message - error additionalProperties: false examples: example: value: reqId: statusCode: 401 message: error: description: Default Response '403': application/json: schemaArray: - type: object properties: reqId: allOf: - type: string statusCode: allOf: - type: number enum: - 403 message: allOf: - type: string details: allOf: - {} error: allOf: - type: string requiredProperties: - reqId - statusCode - message - error additionalProperties: false examples: example: value: reqId: statusCode: 403 message: details: error: description: Default Response '404': application/json: schemaArray: - type: object properties: reqId: allOf: - type: string statusCode: allOf: - type: number enum: - 404 message: allOf: - type: string error: allOf: - type: string requiredProperties: - reqId - statusCode - message - error additionalProperties: false examples: example: value: reqId: statusCode: 404 message: error: description: Default Response '422': application/json: schemaArray: - type: object properties: reqId: allOf: - type: string statusCode: allOf: - type: number enum: - 422 message: allOf: - {} error: allOf: - type: string requiredProperties: - reqId - statusCode - error additionalProperties: false examples: example: value: reqId: statusCode: 422 message: error: description: Default Response '500': application/json: schemaArray: - type: object properties: reqId: allOf: - type: string statusCode: allOf: - type: number enum: - 500 message: allOf: - type: string error: allOf: - type: string requiredProperties: - reqId - statusCode - message - error additionalProperties: false examples: example: value: reqId: statusCode: 500 message: error: description: Default Response deprecated: false type: path components: schemas: {} ```` --- # Source: https://infisical.com/docs/api-reference/endpoints/project-identities-membership/add-identity-membership.md # Source: https://infisical.com/docs/api-reference/endpoints/deprecated/project-identities-v2/add-identity-membership.md > ## Documentation Index > Fetch the complete documentation index at: https://infisical.com/docs/llms.txt > Use this file to discover all available pages before exploring further. # Create Identity Membership > Create project identity membership ## OpenAPI ````yaml POST /api/v1/projects/{projectId}/identity-memberships/{identityId} openapi: 3.0.3 info: title: Infisical API description: List of all available APIs that can be consumed version: 0.0.1 servers: - url: https://us.infisical.com description: Production server (US) - url: https://eu.infisical.com description: Production server (EU) - url: http://localhost:8080 description: Local server security: [] paths: /api/v1/projects/{projectId}/identity-memberships/{identityId}: post: tags: - Project Identities description: Create project identity membership parameters: - schema: type: string in: path name: projectId required: true - schema: type: string in: path name: identityId required: true requestBody: content: application/json: schema: type: object properties: role: type: string default: no-access roles: type: array items: anyOf: - type: object properties: role: type: string description: >- The role slug to assign to the newly created identity project membership. isTemporary: type: boolean enum: - false default: false description: >- The role slug to assign to the newly created identity project membership. required: - role additionalProperties: false - type: object properties: role: type: string description: >- The role slug to assign to the newly created identity project membership. isTemporary: type: boolean enum: - true description: >- The role slug to assign to the newly created identity project membership. temporaryMode: type: string enum: - relative description: >- The role slug to assign to the newly created identity project membership. temporaryRange: type: string description: >- The role slug to assign to the newly created identity project membership. temporaryAccessStartTime: type: string format: date-time description: >- The role slug to assign to the newly created identity project membership. required: - role - isTemporary - temporaryMode - temporaryRange - temporaryAccessStartTime additionalProperties: false description: >- A list of role slugs to assign to the newly created identity project membership. additionalProperties: false responses: '200': description: Default Response content: application/json: schema: type: object properties: identityMembership: type: object properties: id: type: string format: uuid projectId: type: string identityId: type: string format: uuid createdAt: type: string format: date-time updatedAt: type: string format: date-time required: - id - projectId - identityId - createdAt - updatedAt additionalProperties: false required: - identityMembership additionalProperties: false '400': description: Default Response content: application/json: schema: type: object properties: reqId: type: string statusCode: type: number enum: - 400 message: type: string error: type: string details: {} required: - reqId - statusCode - message - error additionalProperties: false '401': description: Default Response content: application/json: schema: type: object properties: reqId: type: string statusCode: type: number enum: - 401 message: type: string error: type: string required: - reqId - statusCode - message - error additionalProperties: false '403': description: Default Response content: application/json: schema: type: object properties: reqId: type: string statusCode: type: number enum: - 403 message: type: string details: {} error: type: string required: - reqId - statusCode - message - error additionalProperties: false '404': description: Default Response content: application/json: schema: type: object properties: reqId: type: string statusCode: type: number enum: - 404 message: type: string error: type: string required: - reqId - statusCode - message - error additionalProperties: false '422': description: Default Response content: application/json: schema: type: object properties: reqId: type: string statusCode: type: number enum: - 422 message: {} error: type: string required: - reqId - statusCode - error additionalProperties: false '500': description: Default Response content: application/json: schema: type: object properties: reqId: type: string statusCode: type: number enum: - 500 message: type: string error: type: string required: - reqId - statusCode - message - error additionalProperties: false security: - bearerAuth: [] components: securitySchemes: bearerAuth: type: http scheme: bearer bearerFormat: JWT description: An access token in Infisical ```` --- # Source: https://infisical.com/docs/api-reference/endpoints/project-identities/add-identity.md > ## Documentation Index > Fetch the complete documentation index at: https://infisical.com/docs/llms.txt > Use this file to discover all available pages before exploring further. # Create Identity > Create an identity in a project ## OpenAPI ````yaml POST /api/v1/projects/{projectId}/identities openapi: 3.0.3 info: title: Infisical API description: List of all available APIs that can be consumed version: 0.0.1 servers: - url: https://us.infisical.com description: Production server (US) - url: https://eu.infisical.com description: Production server (EU) - url: http://localhost:8080 description: Local server security: [] paths: /api/v1/projects/{projectId}/identities: post: tags: - Identities description: Create an identity in a project operationId: createProjectMachineIdentity parameters: - schema: type: string in: path name: projectId required: true description: The ID of the project to create the identity in requestBody: content: application/json: schema: type: object properties: name: type: string minLength: 1 description: The name of the identity to create. hasDeleteProtection: type: boolean default: false description: Prevents deletion of the identity when enabled. metadata: type: array items: type: object properties: key: type: string minLength: 1 value: type: string minLength: 1 required: - key - value additionalProperties: false description: >- An optional array of key-value pairs to attach to the identity. required: - name additionalProperties: false required: true responses: '200': description: Default Response content: application/json: schema: type: object properties: identity: type: object properties: id: type: string format: uuid name: type: string orgId: type: string format: uuid projectId: type: string nullable: true createdAt: type: string format: date-time updatedAt: type: string format: date-time hasDeleteProtection: type: boolean default: false activeLockoutAuthMethods: type: array items: type: string authMethods: type: array items: type: string metadata: type: array items: type: object properties: key: type: string value: type: string id: type: string required: - key - value - id additionalProperties: false required: - id - name - orgId - createdAt - updatedAt additionalProperties: false required: - identity additionalProperties: false '400': description: Default Response content: application/json: schema: type: object properties: reqId: type: string statusCode: type: number enum: - 400 message: type: string error: type: string details: {} required: - reqId - statusCode - message - error additionalProperties: false '401': description: Default Response content: application/json: schema: type: object properties: reqId: type: string statusCode: type: number enum: - 401 message: type: string error: type: string required: - reqId - statusCode - message - error additionalProperties: false '403': description: Default Response content: application/json: schema: type: object properties: reqId: type: string statusCode: type: number enum: - 403 message: type: string details: {} error: type: string required: - reqId - statusCode - message - error additionalProperties: false '404': description: Default Response content: application/json: schema: type: object properties: reqId: type: string statusCode: type: number enum: - 404 message: type: string error: type: string required: - reqId - statusCode - message - error additionalProperties: false '422': description: Default Response content: application/json: schema: type: object properties: reqId: type: string statusCode: type: number enum: - 422 message: {} error: type: string required: - reqId - statusCode - error additionalProperties: false '500': description: Default Response content: application/json: schema: type: object properties: reqId: type: string statusCode: type: number enum: - 500 message: type: string error: type: string required: - reqId - statusCode - message - error additionalProperties: false security: - bearerAuth: [] components: securitySchemes: bearerAuth: type: http scheme: bearer bearerFormat: JWT description: An access token in Infisical ```` --- # Source: https://infisical.com/docs/api-reference/endpoints/pki-collections/add-item.md # Add Collection Item > Add item to PKI collection ## OpenAPI ````yaml POST /api/v1/pki/collections/{collectionId}/items paths: path: /api/v1/pki/collections/{collectionId}/items method: post servers: - url: https://us.infisical.com description: Production server (US) - url: https://eu.infisical.com description: Production server (EU) - url: http://localhost:8080 description: Local server request: security: [] parameters: path: collectionId: schema: - type: string required: true description: The ID of the PKI collection to add the item to. query: {} header: {} cookie: {} body: application/json: schemaArray: - type: object properties: type: allOf: - type: string enum: - certificate - ca description: The type of the PKI collection item to add. itemId: allOf: - type: string description: The resource ID of the PKI collection item to add. required: true requiredProperties: - type - itemId additionalProperties: false examples: example: value: type: certificate itemId: response: '200': application/json: schemaArray: - type: object properties: id: allOf: - type: string format: uuid createdAt: allOf: - type: string format: date-time updatedAt: allOf: - type: string format: date-time pkiCollectionId: allOf: - type: string format: uuid type: allOf: - type: string enum: - certificate - ca description: The type of the PKI collection item to add. itemId: allOf: - type: string description: The resource ID of the PKI collection item to add. requiredProperties: - id - createdAt - updatedAt - pkiCollectionId - type - itemId additionalProperties: false examples: example: value: id: 3c90c3cc-0d44-4b50-8888-8dd25736052a createdAt: '2023-11-07T05:31:56Z' updatedAt: '2023-11-07T05:31:56Z' pkiCollectionId: 3c90c3cc-0d44-4b50-8888-8dd25736052a type: certificate itemId: description: Default Response '400': application/json: schemaArray: - type: object properties: reqId: allOf: - type: string statusCode: allOf: - type: number enum: - 400 message: allOf: - type: string error: allOf: - type: string requiredProperties: - reqId - statusCode - message - error additionalProperties: false examples: example: value: reqId: statusCode: 400 message: error: description: Default Response '401': application/json: schemaArray: - type: object properties: reqId: allOf: - type: string statusCode: allOf: - type: number enum: - 401 message: allOf: - type: string error: allOf: - type: string requiredProperties: - reqId - statusCode - message - error additionalProperties: false examples: example: value: reqId: statusCode: 401 message: error: description: Default Response '403': application/json: schemaArray: - type: object properties: reqId: allOf: - type: string statusCode: allOf: - type: number enum: - 403 message: allOf: - type: string details: allOf: - {} error: allOf: - type: string requiredProperties: - reqId - statusCode - message - error additionalProperties: false examples: example: value: reqId: statusCode: 403 message: details: error: description: Default Response '404': application/json: schemaArray: - type: object properties: reqId: allOf: - type: string statusCode: allOf: - type: number enum: - 404 message: allOf: - type: string error: allOf: - type: string requiredProperties: - reqId - statusCode - message - error additionalProperties: false examples: example: value: reqId: statusCode: 404 message: error: description: Default Response '422': application/json: schemaArray: - type: object properties: reqId: allOf: - type: string statusCode: allOf: - type: number enum: - 422 message: allOf: - {} error: allOf: - type: string requiredProperties: - reqId - statusCode - error additionalProperties: false examples: example: value: reqId: statusCode: 422 message: error: description: Default Response '500': application/json: schemaArray: - type: object properties: reqId: allOf: - type: string statusCode: allOf: - type: number enum: - 500 message: allOf: - type: string error: allOf: - type: string requiredProperties: - reqId - statusCode - message - error additionalProperties: false examples: example: value: reqId: statusCode: 500 message: error: description: Default Response deprecated: false type: path components: schemas: {} ```` --- # Source: https://infisical.com/docs/documentation/platform/access-controls/additional-privileges.md > ## Documentation Index > Fetch the complete documentation index at: https://infisical.com/docs/llms.txt > Use this file to discover all available pages before exploring further. # Additional Privileges > Learn how to add specific privileges on top of predefined roles. Even though Infisical supports full-fledged [role-base access controls](./role-based-access-controls) with ability to set predefined permissions for user and machine identities, it is sometimes desired to set additional privileges for specific user or machine identities on top of their roles. Infisical **Additional Privileges** functionality enables specific permissions with access to sensitive secrets/folders by identities within certain projects. It is possible to set up additional privileges through Web UI or API. To provision specific privileges through Web UI: 1. Click on the `Edit` button next to the set of roles for user or identities. Edit User Role 2. Click `Add Additional Privileges` in the corresponding section of the permission management modal. Add Specific Privilege 3. Fill out the necessary parameters in the privilege entry that appears. It is possible to specify the `Environment` and `Secret Path` to which you want to enable access. It is also possible to define the range of permissions (`View`, `Create`, `Modify`, `Delete`) as well as how long the access should last (e.g., permanent or timed). Additional privileges 4. Click the `Save` button to enable the additional privilege. Confirm Specific Privilege --- # Source: https://infisical.com/docs/documentation/platform/pki/alerting.md > ## Documentation Index > Fetch the complete documentation index at: https://infisical.com/docs/llms.txt > Use this file to discover all available pages before exploring further. # Alerting > Learn how to set up alerting for expiring certificates with Infisical ## Concept In order to ensure that your certificates are always up-to-date and not expired, you can set up alerting in Infisical for expiring CA and leaf certificates based on customizable filters. ## Guide to Creating an Alert To create an alert, head to your Certificate Management Project > Alerting and press **Create Certificate Alert**. pki alerting pki alerting modal Here's some guidance for each field in the alert configuration sequence: * Alert Type: The type of alert to create such as **Certificate Expiration**. * Alert Name: A slug-friendly name for the alert such as `tls-expiry-alert`. * Description: An optional description for the alert. * Alert Before: The time before certificate expiration to trigger the alert such as 30 days denoted by `30d`. * Filters: A list of filters that determine which certificates the alert applies to. Each row includes a **Field**, **Operator**, and **Value** to match against. For example, you can filter for certificates with a common name containing `example.com` by setting the field to **Common Name**, the operator to **Contains**, and the value to `example.com`. * Channels / Email Recipients: A list of email addresses to notify when the alert triggers. --- # Source: https://infisical.com/docs/documentation/platform/identities/alicloud-auth.md > ## Documentation Index > Fetch the complete documentation index at: https://infisical.com/docs/llms.txt > Use this file to discover all available pages before exploring further. # Alibaba Cloud Auth > Learn how to authenticate with Infisical using Alibaba Cloud user accounts. **Alibaba Cloud Auth** is an authentication method that verifies Alibaba Cloud users through signature validation, allowing secure access to Infisical resources. ## Diagram The following sequence diagram illustrates the Alibaba Cloud Auth workflow for authenticating Alibaba Cloud users with Infisical. ```mermaid theme={"dark"} sequenceDiagram participant Client participant Infisical participant Alibaba Cloud Note over Client,Client: Step 1: Sign user identity request Note over Client,Infisical: Step 2: Login Operation Client->>Infisical: Send signed request details to /api/v1/auth/alicloud-auth/login Note over Infisical,Alibaba Cloud: Step 3: Request verification Infisical->>Alibaba Cloud: Forward signed request Alibaba Cloud-->>Infisical: Return user details Note over Infisical: Step 4: Identity property validation Infisical->>Client: Return short-lived access token Note over Client,Infisical: Step 5: Access Infisical API with token Client->>Infisical: Make authenticated requests using the short-lived access token ``` ## Concept At a high level, Infisical authenticates an Alibaba Cloud user by verifying its identity and checking that it meets specific requirements (e.g., its ARN is whitelisted) at the `/api/v1/auth/alicloud-auth/login` endpoint. If successful, then Infisical returns a short-lived access token that can be used to make authenticated requests to the Infisical API. To be more specific: 1. The client signs a `GetCallerIdentity` request using an Alibaba Cloud user's access key secret; this is done using an HMAC sha1 algorithm. 2. The client sends the signed request information alongside the signature to Infisical at the `/api/v1/auth/alicloud-auth/login` endpoint. 3. Infisical reconstructs the request and sends it to Alibaba Cloud for verification and obtains the identity associated with the Alibaba Cloud user. 4. Infisical checks the user's properties against set criteria such as **Allowed ARNs**. 5. If all checks pass, Infisical returns a short-lived access token that the client can use to make authenticated requests to the Infisical API. ## Prerequisite In order to sign requests, you must have an Alibaba Cloud user with credentials such as access key ID and secret. If you're unaware of how to create a user and obtain the needed credentials, expand the menu below. Visit [https://ram.console.aliyun.com/users](https://ram.console.aliyun.com/users) to get to the Users page and click **Create User**. Users Page Fill out the username and display name with values of your choice and click **OK**. User Info After a user has been created, click on its row to see user information. User Info Click **Create AccessKey** and select the most relevant option for your use-case. Then click **Continue**. User Info Save the displayed credentials for later steps. User Info ## Guide In the following steps, we explore how to create and use identities for your workloads and applications on Alibaba Cloud to access the Infisical API using request signing. ### Creating an identity To create an identity, head to your Organization Settings > Access Control > [Identities](https://app.infisical.com/organization/access-management?selectedTab=identities) and press **Create identity**. identities organization When creating an identity, you specify an organization-level [role](/documentation/platform/access-controls/role-based-access-controls) for it to assume; you can configure roles in Organization Settings > Access Control > [Organization Roles](https://app.infisical.com/organization/access-management?selectedTab=roles). identities organization create Input some details for your new identity: * **Name (required):** A friendly name for the identity. * **Role (required):** A role from the [**Organization Roles**](https://app.infisical.com/organization/access-management?selectedTab=roles) tab for the identity to assume. The organization role assigned will determine what organization-level resources this identity can have access to. Once you've created an identity, you'll be redirected to a page where you can manage the identity. identities page Since the identity has been configured with [Universal Auth](https://infisical.com/docs/documentation/platform/identities/universal-auth) by default, you should reconfigure it to use Alibaba Cloud Auth instead. To do this, click the cog next to **Universal Auth** and then select **Delete** in the options dropdown. identities press cog identities page remove default auth Now create a new Alibaba Cloud Auth Method. identities create alicloud auth method Here's some information about each field: * **Allowed ARNs:** A comma-separated list of trusted Alibaba Cloud ARNs that are allowed to authenticate with Infisical. * **Access Token TTL (default is `2592000` equivalent to 30 days):** The lifetime for an access token in seconds. This value will be referenced at renewal time. * **Access Token Max TTL (default is `2592000` equivalent to 30 days):** The maximum lifetime for an access token in seconds. This value will be referenced at renewal time. * **Access Token Max Number of Uses (default is `0`):** The maximum number of times that an access token can be used; a value of `0` implies an infinite number of uses. * **Access Token Trusted IPs:** The IPs or CIDR ranges that access tokens can be used from. By default, each token is given the `0.0.0.0/0`, allowing usage from any network address. ### Adding an identity to a project In order to allow an identity to access project-level resources such as secrets, you must add it to the relevant projects. To do this, head over to the project you want to add the identity to and navigate to Project Settings > Access Control > Machine Identities and press **Add Identity**. identities project Select the identity you want to add to the project and the project-level role you want it to assume. The project role given to the identity will determine what project-level resources this identity can access. identities project create ### Accessing the Infisical API with the identity To access the Infisical API as the identity, you need to construct a signed `GetCallerIdentity` request and then make a request to the `/api/v1/auth/alicloud-auth/login` endpoint passing the signed data and signature. Below is an example of how you can authenticate with Infisical using NodeJS. ```ts theme={"dark"} import crypto from "crypto"; // We highly recommend using environment variables instead of hardcoding these values const ALICLOUD_ACCESS_KEY_ID = "..."; const ALICLOUD_ACCESS_KEY_SECRET = "..."; const params: { [key: string]: string } = { Action: "GetCallerIdentity", Format: "JSON", Version: "2015-04-01", AccessKeyId: ALICLOUD_ACCESS_KEY_ID, SignatureMethod: "HMAC-SHA1", Timestamp: new Date().toISOString(), SignatureVersion: "1.0", SignatureNonce: crypto.randomBytes(16).toString("hex"), }; const canonicalizedQueryString = Object.keys(params) .sort() .map((key) => `${encodeURIComponent(key)}=${encodeURIComponent(params[key])}`) .join("&"); const stringToSign = `GET&%2F&${encodeURIComponent(canonicalizedQueryString)}`; const signature = crypto .createHmac("sha1", `${ALICLOUD_ACCESS_KEY_SECRET}&`) .update(stringToSign) .digest("base64"); const res = await fetch( "https://app.infisical.com/api/v1/auth/alicloud-auth/login", { method: "POST", headers: { "Content-Type": "application/json", }, body: JSON.stringify({ identityId: "...", // Replace with your identity ID Signature: signature, ...params, }), }, ); const json = await res.json(); console.log("Infisical Response:", JSON.stringify(json)); ``` Each identity access token has a time-to-live (TTL) which you can infer from the response of the login operation; the default TTL is `7200` seconds, which can be adjusted. If an identity access token expires, it can no longer access the Infisical API. A new access token should be obtained by performing another login operation. --- # Source: https://infisical.com/docs/integrations/platforms/ansible.md > ## Documentation Index > Fetch the complete documentation index at: https://infisical.com/docs/llms.txt > Use this file to discover all available pages before exploring further. # Ansible > Learn how to use Infisical for secret management in Ansible. You can find the Infisical Ansible collection on [Ansible Galaxy](https://galaxy.ansible.com/ui/repo/published/infisical/vault/). This Ansible Infisical collection includes a variety of Ansible content to help automate the management of Infisical services. This collection is maintained by the Infisical team. ## Ansible version compatibility Tested with the Ansible Core >= 2.12.0 versions, and the current development version of Ansible. Ansible Core versions prior to 2.12.0 have not been tested. ## Python version compatibility This collection depends on the Infisical SDK for Python. Requires Python 3.7 or greater. ## Installing this collection You can install the Infisical collection with the Ansible Galaxy CLI: ```bash theme={"dark"} ansible-galaxy collection install infisical.vault ``` The python module dependencies are not installed by ansible-galaxy. They can be manually installed using pip: ```bash theme={"dark"} pip install infisicalsdk ``` ## Using this collection You can either call modules by their Fully Qualified Collection Name (FQCN), such as `infisical.vault.read_secrets`, or you can call modules by their short name if you list the `infisical.vault` collection in the playbook's collections keyword. ## Authentication The Infisical Ansible Collection supports [Universal Auth](/documentation/platform/identities/universal-auth), [OIDC Auth](/documentation/platform/identities/oidc-auth/general), and [Token Auth](/documentation/platform/identities/token-auth) for authenticating against Infisical. ### Login Module (Recommended) The recommended approach is to use the `login` module to authenticate once and reuse the credentials across multiple tasks. This reduces authentication overhead and makes playbooks cleaner. Alternatively, you can still pass credentials directly to each plugin/module if preferred. ```yaml theme={"dark"} - name: Login to Infisical infisical.vault.login: url: "https://app.infisical.com" auth_method: universal_auth universal_auth_client_id: "{{ client_id }}" universal_auth_client_secret: "{{ client_secret }}" register: infisical_login - name: Read secrets using cached login infisical.vault.read_secrets: login_data: "{{ infisical_login.login_data }}" project_id: "{{ project_id }}" env_slug: "dev" path: "/" as_dict: true register: secrets - name: Use the secrets debug: msg: "Database URL is {{ secrets.secrets.DATABASE_URL }}" ``` Using Universal Auth for authentication is the most straight-forward way to get started with using the Ansible collection. To use Universal Auth, you need to provide the Client ID and Client Secret of your Infisical Machine Identity. ```yaml theme={"dark"} - name: Login with Universal Auth infisical.vault.login: url: "https://app.infisical.com" auth_method: universal_auth universal_auth_client_id: "" universal_auth_client_secret: "" register: infisical_login ``` You can also provide the `auth_method`, `universal_auth_client_id`, and `universal_auth_client_secret` parameters through environment variables: | Parameter Name | Environment Variable Name | | ------------------------------ | ---------------------------------------- | | `auth_method` | `INFISICAL_AUTH_METHOD` | | `universal_auth_client_id` | `INFISICAL_UNIVERSAL_AUTH_CLIENT_ID` | | `universal_auth_client_secret` | `INFISICAL_UNIVERSAL_AUTH_CLIENT_SECRET` | To use OIDC Auth, you'll need to provide the ID of your machine identity, and the OIDC JWT to be used for authentication. Please note that in order to use OIDC Auth, you must have `1.0.10` or newer of the `infisicalsdk` package installed. ```yaml theme={"dark"} - name: Login with OIDC Auth infisical.vault.login: url: "https://app.infisical.com" auth_method: oidc_auth identity_id: "" jwt: "" register: infisical_login ``` You can also provide the `auth_method`, `identity_id`, and `jwt` parameters through environment variables: | Parameter Name | Environment Variable Name | | -------------- | ------------------------- | | auth\_method | `INFISICAL_AUTH_METHOD` | | identity\_id | `INFISICAL_IDENTITY_ID` | | jwt | `INFISICAL_JWT` | Token Auth is the simplest authentication method that allows you to authenticate directly with an access token. This can be either a [Machine Identity Token Auth](/documentation/platform/identities/token-auth) token or a User JWT token. Please note that in order to use Token Auth, you must have `1.0.13` or newer of the `infisicalsdk` package installed. ```yaml theme={"dark"} - name: Login with Token Auth infisical.vault.login: url: "https://app.infisical.com" auth_method: token_auth token: "" register: infisical_login ``` You can also provide the `auth_method` and `token` parameters through environment variables: | Parameter Name | Environment Variable Name | | -------------- | ------------------------- | | auth\_method | `INFISICAL_AUTH_METHOD` | | token | `INFISICAL_TOKEN` | ## Available Plugins and Modules ### Lookup Plugins * `infisical.vault.login` - Authenticate and return reusable login data * `infisical.vault.read_secrets` - Read secrets from Infisical ### Modules **Authentication:** * `infisical.vault.login` - Authenticate and return reusable login data **Static Secrets:** * `infisical.vault.read_secrets` - Read secrets from Infisical * `infisical.vault.create_secret` - Create a new secret * `infisical.vault.update_secret` - Update an existing secret * `infisical.vault.delete_secret` - Delete a secret **Dynamic Secrets:** * `infisical.vault.create_dynamic_secret` - Create a dynamic secret configuration * `infisical.vault.get_dynamic_secret` - Get a dynamic secret by name * `infisical.vault.update_dynamic_secret` - Update a dynamic secret * `infisical.vault.delete_dynamic_secret` - Delete a dynamic secret **Dynamic Secret Leases:** * `infisical.vault.create_dynamic_secret_lease` - Create a lease (generates credentials) * `infisical.vault.get_dynamic_secret_lease` - Get lease details * `infisical.vault.renew_dynamic_secret_lease` - Renew an existing lease * `infisical.vault.delete_dynamic_secret_lease` - Delete/revoke a lease ## Examples ### Reading Secrets ```yaml theme={"dark"} --- - name: Read secrets from Infisical hosts: localhost gather_facts: false tasks: - name: Login to Infisical infisical.vault.login: url: "https://app.infisical.com" auth_method: universal_auth universal_auth_client_id: "{{ lookup('env', 'INFISICAL_CLIENT_ID') }}" universal_auth_client_secret: "{{ lookup('env', 'INFISICAL_CLIENT_SECRET') }}" register: infisical_login - name: Read all secrets as dictionary infisical.vault.read_secrets: login_data: "{{ infisical_login.login_data }}" project_id: "your-project-id" env_slug: "dev" path: "/" as_dict: true register: secrets - name: Use the secrets debug: msg: "Database: {{ secrets.secrets.DATABASE_URL }}" ``` #### Reading secrets with full metadata Use the `raw` option to retrieve complete secret metadata including version, creation time, tags, and more: ```yaml theme={"dark"} - name: Read all secrets with full metadata infisical.vault.read_secrets: login_data: "{{ infisical_login.login_data }}" project_id: "your-project-id" env_slug: "dev" path: "/" raw: true register: raw_secrets # Returns: [{"id": "...", "secretKey": "HOST", "secretValue": "google.com", "version": 1, "type": "shared", ...}, ...] - name: Read all secrets with full metadata as dict infisical.vault.read_secrets: login_data: "{{ infisical_login.login_data }}" project_id: "your-project-id" env_slug: "dev" path: "/" raw: true as_dict: true register: raw_secrets_dict # Returns: {"HOST": {"id": "...", "secretKey": "HOST", "secretValue": "google.com", "version": 1, ...}, ...} ``` #### Using the Lookup Plugin The `read_secrets` lookup plugin allows for inline secret retrieval. Unlike modules that run on target hosts, lookup plugins run on the Ansible controller during playbook parsing. This is useful for retrieving secrets to use in variable definitions: ```yaml theme={"dark"} vars: read_all_secrets_within_scope: "{{ lookup('infisical.vault.read_secrets', universal_auth_client_id='<>', universal_auth_client_secret='<>', project_id='<>', path='/', env_slug='dev', url='https://app.infisical.com') }}" # [{ "key": "HOST", "value": "google.com" }, { "key": "SMTP", "value": "gmail.smtp.edu" }] read_all_secrets_as_dict: "{{ lookup('infisical.vault.read_secrets', as_dict=True, universal_auth_client_id='<>', universal_auth_client_secret='<>', project_id='<>', path='/', env_slug='dev', url='https://app.infisical.com') }}" # { "SECRET_KEY_1": "secret-value-1", "SECRET_KEY_2": "secret-value-2" } -> Can be accessed as secrets.SECRET_KEY_1 read_secret_by_name_within_scope: "{{ lookup('infisical.vault.read_secrets', universal_auth_client_id='<>', universal_auth_client_secret='<>', project_id='<>', path='/', env_slug='dev', secret_name='HOST', url='https://app.infisical.com') }}" # { "key": "HOST", "value": "google.com" } ``` ### Managing Secrets (CRUD) Create, update, and delete secrets programmatically: ```yaml theme={"dark"} - name: Create a secret infisical.vault.create_secret: login_data: "{{ infisical_login.login_data }}" project_id: "{{ project_id }}" env_slug: "dev" path: "/" secret_name: "API_KEY" secret_value: "my-api-key" secret_comment: "API key for external service" register: created_secret - name: Update a secret infisical.vault.update_secret: login_data: "{{ infisical_login.login_data }}" project_id: "{{ project_id }}" env_slug: "dev" path: "/" secret_name: "API_KEY" secret_value: "new-api-key" register: updated_secret - name: Rename a secret infisical.vault.update_secret: login_data: "{{ infisical_login.login_data }}" project_id: "{{ project_id }}" env_slug: "dev" path: "/" secret_name: "OLD_SECRET_NAME" new_secret_name: "NEW_SECRET_NAME" register: renamed_secret - name: Delete a secret infisical.vault.delete_secret: login_data: "{{ infisical_login.login_data }}" project_id: "{{ project_id }}" env_slug: "dev" path: "/" secret_name: "API_KEY" register: deleted_secret ``` ### Dynamic Secrets Dynamic secrets generate credentials on-demand with automatic expiration. They support various providers like SQL databases, AWS, GCP, Azure, and more. For the full list of supported providers and their configuration options, see the [Dynamic Secrets documentation](/documentation/platform/dynamic-secrets/overview). #### Creating a Dynamic Secret ```yaml theme={"dark"} # Create a dynamic secret for PostgreSQL - name: Create a PostgreSQL dynamic secret infisical.vault.create_dynamic_secret: login_data: "{{ infisical_login.login_data }}" project_slug: "my-project" env_slug: "dev" path: "/" name: "postgres-dev" provider_type: "sql-database" inputs: client: "postgres" host: "localhost" port: 5432 database: "mydb" username: "admin" password: "admin-password" creationStatement: "CREATE USER \"{{username}}\" WITH PASSWORD '{{password}}';" revocationStatement: "DROP USER \"{{username}}\";" default_ttl: "1h" max_ttl: "24h" register: dynamic_secret ``` For the full list of supported provider types and their input configurations, see the [Dynamic Secrets API Documentation](https://infisical.com/docs/api-reference/endpoints/dynamic-secrets/create#body-provider). #### Getting and Using Dynamic Secret Credentials To use a dynamic secret, you need to create a **lease** which generates the actual credentials: ```yaml theme={"dark"} # Create a lease to get database credentials - name: Get database credentials infisical.vault.create_dynamic_secret_lease: login_data: "{{ infisical_login.login_data }}" project_slug: "my-project" env_slug: "dev" path: "/" dynamic_secret_name: "postgres-dev" ttl: "30m" register: lease # Use the generated credentials - name: Connect to database community.postgresql.postgresql_query: login_host: localhost login_user: "{{ lease.data.DB_USERNAME }}" login_password: "{{ lease.data.DB_PASSWORD }}" db: mydb query: "SELECT version();" ``` #### Managing Leases ```yaml theme={"dark"} # Get lease details - name: Get lease information infisical.vault.get_dynamic_secret_lease: login_data: "{{ infisical_login.login_data }}" project_slug: "my-project" env_slug: "dev" path: "/" lease_id: "{{ lease.lease.id }}" register: lease_details # Renew a lease before it expires - name: Renew a lease for 2 more hours infisical.vault.renew_dynamic_secret_lease: login_data: "{{ infisical_login.login_data }}" project_slug: "my-project" env_slug: "dev" path: "/" lease_id: "{{ lease.lease.id }}" ttl: "2h" register: renewed_lease # Revoke the credentials when done - name: Delete the lease infisical.vault.delete_dynamic_secret_lease: login_data: "{{ infisical_login.login_data }}" project_slug: "my-project" env_slug: "dev" path: "/" lease_id: "{{ lease.lease.id }}" ``` #### Updating and Deleting Dynamic Secrets ```yaml theme={"dark"} # Update a dynamic secret's TTL - name: Update dynamic secret TTL infisical.vault.update_dynamic_secret: login_data: "{{ infisical_login.login_data }}" project_slug: "my-project" env_slug: "dev" path: "/" name: "postgres-dev" default_ttl: "2h" max_ttl: "48h" register: updated_secret # Delete a dynamic secret (also revokes all active leases) - name: Delete a dynamic secret infisical.vault.delete_dynamic_secret: login_data: "{{ infisical_login.login_data }}" project_slug: "my-project" env_slug: "dev" path: "/" name: "postgres-dev" register: deleted_secret ``` ## Troubleshoot If you get this Python error when you running the lookup plugin: ``` objc[72832]: +[__NSCFConstantString initialize] may have been in progress in another thread when fork() was called. We cannot safely call it or ignore it in the fork() child process. Crashing instead. Set a breakpoint on objc_initializeAfterForkError to debug. Fatal Python error: Aborted ``` You will need to add this to your shell environment or ansible wrapper script: ``` export OBJC_DISABLE_INITIALIZE_FORK_SAFETY=YES ``` --- # Source: https://infisical.com/docs/documentation/platform/pki/integration-guides/apache-certbot.md > ## Documentation Index > Fetch the complete documentation index at: https://infisical.com/docs/llms.txt > Use this file to discover all available pages before exploring further. # Apache Server > Learn how to issue TLS certificates from Infisical using ACME enrollment on Apache Server with Certbot This guide demonstrates how to use Infisical to issue TLS certificates for your [Apache HTTP Server](https://httpd.apache.org/). It uses [Certbot](https://certbot.eff.org/), an installable [ACME](https://en.wikipedia.org/wiki/Automatic_Certificate_Management_Environment) client, to request and renew certificates from Infisical using the [ACME enrollment method](/documentation/platform/pki/enrollment-methods/acme) configured on a [certificate profile](/documentation/platform/pki/certificates/profiles). Apache benefits from excellent Certbot integration, allowing both certificate-only mode and automatic SSL configuration. ## Prerequisites Before you begin, make sure you have: * An [Apache HTTP Server](https://httpd.apache.org/) running on a Linux system with administrative access. * A [certificate profile](/documentation/platform/pki/certificates/profiles) configured with the [ACME enrollment method](/documentation/platform/pki/enrollment-methods/acme) in Infisical. * Network connectivity from your Apache server to Infisical. * Port 80 open and reachable for ACME [HTTP-01](https://letsencrypt.org/docs/challenge-types/#http-01-challenge) validation. ## Guide Navigate to your certificate management project in Infisical and locate your [certificate profile](/documentation/platform/pki/certificates/profiles) configured with the [ACME enrollment method](/documentation/platform/pki/enrollment-methods/acme). Certificate profile with ACME enrollment option Click the **Reveal ACME EAB** option to view the ACME configuration details. ACME configuration modal showing directory URL and EAB credentials From the ACME configuration, gather the following values: * ACME Directory URL: The URL that Certbot will use to communicate with Infisical's ACME server. This takes the form `https://your-infisical-instance.com/api/v1/cert-manager/certificate-profiles/{profile-id}/acme/directory`. * EAB Key Identifier (KID): A unique identifier that tells Infisical which ACME account is making the request. * EAB Secret: A secret key that authenticates your ACME client with Infisical. Keep your EAB credentials secure as they authenticate your ACME client with Infisical PKI. These credentials are unique to each [certificate profile](/documentation/platform/pki/certificates/profiles) and should not be shared. Install Certbot with the Apache plugin on the server where Apache is running by following the official Certbot [installation guide](https://certbot.eff.org/instructions). The installation guide provides up-to-date instructions for various Linux distributions and package managers, ensuring you get the most current version and proper Apache plugin integration. After installation, you can verify that Certbot has been installed correctly by running: ```bash theme={"dark"} certbot --version ``` Run the following command to request a certificate from Infisical: ```bash theme={"dark"} sudo certbot certonly \ --apache \ --server "https://your-infisical-instance.com/api/v1/cert-manager/certificate-profiles/{profile-id}/acme/directory" \ --eab-kid "your-eab-key-identifier" \ --eab-hmac-key "your-eab-secret" \ -d example.infisical.com \ --email admin@example.com \ --agree-tos \ --non-interactive ``` For guidance on each parameter: * `certonly`: Instructs Certbot to request a certificate without modifying your Apache configuration files; this mode is recommended if you prefer to manage your Apache SSL configuration manually or have a complex setup. * `--apache`: Specifies the Apache plugin so Certbot can solve the [HTTP-01](https://letsencrypt.org/docs/challenge-types/#http-01-challenge) challenge by creating temporary files served by Apache. * `--server`: The Infisical ACME directory URL from Step 1. This instructs Certbot to communicate with Infisical's ACME server instead of Let's Encrypt. * `--eab-kid`: Your External Account Binding (EAB) Key Identifier from Step 1. * `--eab-hmac-key`: The EAB secret associated with the KID from Step 1. * `-d`: Specifies the domain name for which the certificate is being requested. * `--email`: The contact email for expiration notices and account recovery. * `--agree-tos`: Accepts the ACME server's Terms of Service. * `--non-interactive`: Runs Certbot without prompting for user input (recommended for automation). The Certbot command generates a private key on your server, creates a Certificate Signing Request (CSR) using that key, and sends the CSR to Infisical for certificate issuance. Certbot stores the private key and resulting leaf certificate and full certificate chain in `/etc/letsencrypt/live/{domain-name}/`. If `--certonly` is used: Certbot does **not** modify your Apache configuration, so you must manually update your Apache virtual host to reference the new certificate files and reload the server to apply the changes. Here's an example SSL virtual host configuration for Apache: ```apache theme={"dark"} ServerName example.infisical.com DocumentRoot /var/www/html SSLEngine on SSLCertificateFile /etc/letsencrypt/live/example.infisical.com/cert.pem SSLCertificateKeyFile /etc/letsencrypt/live/example.infisical.com/privkey.pem SSLCertificateChainFile /etc/letsencrypt/live/example.infisical.com/chain.pem # Your existing configuration... ``` After updating the virtual host configuration, test and reload Apache to apply the changes: ```bash theme={"dark"} sudo apache2ctl configtest sudo systemctl reload apache2 ``` If `--certonly` was **not** used: Certbot uses installer mode, which attempts to automatically configure HTTPS by updating your Apache virtual host configuration and reloading the server if needed. At this point, your Apache server should be successfully serving HTTPS using the certificate issued by Infisical. After configuring Apache SSL, verify that your certificate was issued correctly and Apache is serving it properly. Check that the certificate files were created by Certbot: ```bash theme={"dark"} sudo ls -la /etc/letsencrypt/live/example.infisical.com/ ``` You should see files like: * `cert.pem` (your certificate) * `chain.pem` (certificate chain) * `fullchain.pem` (certificate + chain) * `privkey.pem` (private key) Certbot automatically installs a `systemd` timer during installation. This timer runs twice per day and checks whether any certificates are due for renewal. Because Certbot stores the ACME server URL and EAB credentials from your initial request, renewal will automatically use the same Infisical ACME configuration—no additional settings are required. Note that Certbot automatically renews certificates when they are within 30 days of expiration; renewal settings can be adjusted in `/etc/letsencrypt/renewal/{domain-name}.conf`. ```ini theme={"dark"} # ... your existing configuration ... renew_before_expiry = 30 days ``` To test the renewal process, run the following command: ```bash theme={"dark"} sudo certbot renew --dry-run ``` This command simulates the full renewal process without modifying your active certificate. If the dry run succeeds, automatic renewal will work as expected. To trigger an actual renewal immediately, run the following command: ```bash theme={"dark"} sudo certbot renew --force-renewal ``` Note that after a certificate is renewed, Apache must be reloaded so it can begin using the new certificate. To do this, run the following command: ```bash theme={"dark"} sudo systemctl reload apache2 ``` To automate the process of renewing a certificate and reloading Apache, you can create a simple deploy hook that Certbot will run after every successful renewal. Inside `/etc/letsencrypt/renewal-hooks/deploy/reload-apache.sh`, add the following: ```bash theme={"dark"} #!/bin/sh systemctl reload apache2 ``` Then make the hook executable: ```bash theme={"dark"} sudo chmod +x /etc/letsencrypt/renewal-hooks/deploy/reload-apache.sh ``` Alternatively, you can use the `--post-hook` option when manually renewing: ```bash theme={"dark"} sudo certbot renew --post-hook "systemctl reload apache2" ``` Certbot automatically renews certificates when they are within 30 days of expiration using its built-in systemd timer. The deploy hook above will run after each successful renewal, handling the Apache reload automatically. Apache has native Certbot plugin integration, so no additional configuration is typically needed. --- # Source: https://infisical.com/docs/documentation/platform/pki/enrollment-methods/api.md > ## Documentation Index > Fetch the complete documentation index at: https://infisical.com/docs/llms.txt > Use this file to discover all available pages before exploring further. # Certificate Enrollment via API ## Concept The API enrollment method allows you to issue certificates against a specific [certificate profile](/documentation/platform/pki/certificates/profiles) over Web UI or by making an API request to Infisical. ## Guide to Certificate Enrollment via API In the following steps, we explore how to issue a X.509 certificate using the API enrollment method. Create a [certificate profile](/documentation/platform/pki/certificates/profiles) with **API** selected as the enrollment method. Notice that the API enrollment method supports an option called **Enable Auto-Renewal By Default**. If selected, *eligible* certificates are automatically considered for server-side auto-renewal based on a specified renewal days before expiration threshold at the time of issuance; for more information about server-side auto-renewal, refer to the documentation [here](/documentation/platform/pki/certificates/certificates#guide-to-renewing-certificates). To create a certificate, head to your Project > Certificates > Certificate Requests and press **Request**. pki certificates Here, select the certificate profile from step 1 that will be used to issue the certificate and fill out the rest of the details for the certificate to be issued. pki certificate issue modal Once you have created the certificate from step 1, you'll be presented with the certificate details including the **Certificate Body**, **Certificate Chain**, and **Private Key**. pki certificate body Make sure to download and store the **Private Key** in a secure location as it will only be displayed once at the time of certificate issuance. The **Certificate Body** and **Certificate Chain** will remain accessible and can be copied at any time. To create a certificate [profile](/documentation/platform/pki/certificates/profiles), make an API request to the [Create Certificate Profile](/api-reference/endpoints/certificate-profiles/create) API endpoint. ### Sample request ```bash Request theme={"dark"} curl --location --request POST 'https://app.infisical.com/api/v1/cert-manager/certificate-profiles' \ --header 'Authorization: Bearer ' \ --header 'Content-Type: application/json' \ --data-raw '{ "projectId": "", "caId": "", "certificatePolicyId": "", "slug": "my-api-profile", "description": "Certificate profile for API enrollment", "enrollmentType": "API", "apiConfig": { "autoRenew": true, "renewBeforeDays": 7 } }' ``` ### Sample response ```bash Response theme={"dark"} { "certificateProfile": { "id": "550e8400-e29b-41d4-a716-446655440000", "projectId": "65f0a4b0-c123-4567-8901-23456789abcd", "caId": "550e8400-e29b-41d4-a716-446655440000", "certificatePolicyId": "660f1234-e29b-41d4-a716-446655440001", "slug": "my-api-profile", "description": "Certificate profile for API enrollment", "enrollmentType": "API", "apiConfigId": "770g2345-e29b-41d4-a716-446655440002", "createdAt": "2023-01-19T09:44:36.267Z", "updatedAt": "2023-01-19T09:44:36.267Z" } } ``` To issue a certificate against the certificate profile, make an API request to the [Issue Certificate](/api-reference/endpoints/certificates/create-certificate) API endpoint. ### Sample request ```bash Request theme={"dark"} curl --location --request POST 'https://app.infisical.com/api/v1/cert-manager/certificates' \ --header 'Authorization: Bearer ' \ --header 'Content-Type: application/json' \ --data-raw '{ "profileId": "", "attributes": { "commonName": "service.acme.com", "ttl": "1y", "signatureAlgorithm": "RSA-SHA256", "keyAlgorithm": "RSA_2048", "keyUsages": ["digital_signature", "key_encipherment"], "extendedKeyUsages": ["server_auth"], "altNames": [ { "type": "DNS", "value": "service.acme.com" }, { "type": "DNS", "value": "www.service.acme.com" } ] } }' ``` ### Sample response ```bash Response theme={"dark"} { "certificate": { "certificate": "-----BEGIN CERTIFICATE-----\nMIIEpDCCAowCCQD...\n-----END CERTIFICATE-----", "certificateChain": "-----BEGIN CERTIFICATE-----\nMIIEpDCCAowCCQD...\n-----END CERTIFICATE-----", "issuingCaCertificate": "-----BEGIN CERTIFICATE-----\nMIIEpDCCAowCCQD...\n-----END CERTIFICATE-----", "privateKey": "-----BEGIN PRIVATE KEY-----\nMIIEvQIBADANBgkqhkiG9w0BAQEFAASCBKcwggSjAgEAAoIBAQC...\n-----END PRIVATE KEY-----", "serialNumber": "123456789012345678", "certificateId": "880h3456-e29b-41d4-a716-446655440003" }, "certificateRequestId": "..." } ``` Note: If the certificate is available to be issued immediately, the `certificate` field in the response will contain the certificate data. If issuance is delayed (for example, due to pending approval or additional processing), the `certificate` field will be `null` and you can use the `certificateRequestId` to poll for status or retrieve the certificate when it is ready using the [Get Certificate Request](/api-reference/endpoints/certificates/certificate-request) API endpoint. If you have an external private key, you can also issue a certificate by making an API request containing a pem-encoded CSR (Certificate Signing Request) to the same [Issue Certificate](/api-reference/endpoints/certificates/create-certificate) API endpoint. ### Sample request ```bash Request theme={"dark"} curl --location --request POST 'https://app.infisical.com/api/v1/cert-manager/certificates' \ --header 'Authorization: Bearer ' \ --header 'Content-Type: application/json' \ --data-raw '{ "profileId": "", "csr": "-----BEGIN CERTIFICATE REQUEST-----\nMIICvDCCAaQCAQAwdzELMAkGA1UEBhMCVVMxDTALBgNVBAgMBE9oaW8...\n-----END CERTIFICATE REQUEST-----", "attributes": { "ttl": "1y" } }' ``` ### Sample response ```bash Response theme={"dark"} { "certificate": { "certificate": "-----BEGIN CERTIFICATE-----\nMIIEpDCCAowCCQD...\n-----END CERTIFICATE-----", "certificateChain": "-----BEGIN CERTIFICATE-----\nMIIEpDCCAowCCQD...\n-----END CERTIFICATE-----", "issuingCaCertificate": "-----BEGIN CERTIFICATE-----\nMIIEpDCCAowCCQD...\n-----END CERTIFICATE-----", "serialNumber": "123456789012345679", "certificateId": "990i4567-e29b-41d4-a716-446655440004" }, "certificateRequestId": "..." } ``` --- # Source: https://infisical.com/docs/integrations/app-connections.md > ## Documentation Index > Fetch the complete documentation index at: https://infisical.com/docs/llms.txt > Use this file to discover all available pages before exploring further. > Browse and search through all available app connections for Infisical. # null export const AppConnectionsBrowser = () => { const [searchTerm, setSearchTerm] = useState(""); const [selectedCategory, setSelectedCategory] = useState("All"); const categories = ["All", "AI & LLM", "Cloud Providers", "Databases", "CI/CD", "Monitoring", "Directory Services", "Identity & Auth", "Data Analytics", "Hosting", "DevOps Tools", "Security", "Networking & DNS"]; const connections = [{ name: "AWS", slug: "aws", path: "/integrations/app-connections/aws", description: "Learn how to connect your AWS applications to pull secrets from Infisical.", category: "Cloud Providers" }, { name: "Azure Key Vault", slug: "azure-key-vault", path: "/integrations/app-connections/azure-key-vault", description: "Learn how to connect your Azure Key Vault to pull secrets from Infisical.", category: "Cloud Providers" }, { name: "Azure App Configuration", slug: "azure-app-configuration", path: "/integrations/app-connections/azure-app-configuration", description: "Learn how to connect your Azure App Configuration to pull secrets from Infisical.", category: "Cloud Providers" }, { name: "Azure Client Secrets", slug: "azure-client-secrets", path: "/integrations/app-connections/azure-client-secrets", description: "Learn how to connect your Azure Client Secrets to pull secrets from Infisical.", category: "Cloud Providers" }, { name: "Azure DevOps", slug: "azure-devops", path: "/integrations/app-connections/azure-devops", description: "Learn how to connect your Azure DevOps to pull secrets from Infisical.", category: "CI/CD" }, { name: "Azure ADCS", slug: "azure-adcs", path: "/integrations/app-connections/azure-adcs", description: "Learn how to connect your Azure ADCS to pull secrets from Infisical.", category: "Cloud Providers" }, { name: "SSH", slug: "ssh", path: "/integrations/app-connections/ssh", description: "Learn how to connect your machine using SSH.", category: "Networking & DNS" }, { name: "GCP", slug: "gcp", path: "/integrations/app-connections/gcp", description: "Learn how to connect your GCP applications to pull secrets from Infisical.", category: "Cloud Providers" }, { name: "HashiCorp Vault", slug: "hashicorp-vault", path: "/integrations/app-connections/hashicorp-vault", description: "Learn how to connect your HashiCorp Vault to pull secrets from Infisical.", category: "Security" }, { name: "1Password", slug: "1password", path: "/integrations/app-connections/1password", description: "Learn how to connect your 1Password to pull secrets from Infisical.", category: "Security" }, { name: "Vercel", slug: "vercel", path: "/integrations/app-connections/vercel", description: "Learn how to connect your Vercel application to pull secrets from Infisical.", category: "Hosting" }, { name: "Netlify", slug: "netlify", path: "/integrations/app-connections/netlify", description: "Learn how to connect your Netlify application to pull secrets from Infisical.", category: "Hosting" }, { name: "Railway", slug: "railway", path: "/integrations/app-connections/railway", description: "Learn how to connect your Railway application to pull secrets from Infisical.", category: "Hosting" }, { name: "Fly.io", slug: "flyio", path: "/integrations/app-connections/flyio", description: "Learn how to connect your Fly.io application to pull secrets from Infisical.", category: "Hosting" }, { name: "Render", slug: "render", path: "/integrations/app-connections/render", description: "Learn how to connect your Render application to pull secrets from Infisical.", category: "Hosting" }, { name: "Heroku", slug: "heroku", path: "/integrations/app-connections/heroku", description: "Learn how to connect your Heroku application to pull secrets from Infisical.", category: "Hosting" }, { name: "DigitalOcean", slug: "digital-ocean", path: "/integrations/app-connections/digital-ocean", description: "Learn how to connect your DigitalOcean application to pull secrets from Infisical.", category: "Hosting" }, { name: "Supabase", slug: "supabase", path: "/integrations/app-connections/supabase", description: "Learn how to connect your Supabase application to pull secrets from Infisical.", category: "Databases" }, { name: "Checkly", slug: "checkly", path: "/integrations/app-connections/checkly", description: "Learn how to connect your Checkly application to pull secrets from Infisical.", category: "Monitoring" }, { name: "GitHub", slug: "github", path: "/integrations/app-connections/github", description: "Learn how to connect your GitHub application to pull secrets from Infisical.", category: "CI/CD" }, { name: "GitHub Radar", slug: "github-radar", path: "/integrations/app-connections/github-radar", description: "Learn how to connect your GitHub Radar to pull secrets from Infisical.", category: "CI/CD" }, { name: "GitLab", slug: "gitlab", path: "/integrations/app-connections/gitlab", description: "Learn how to connect your GitLab application to pull secrets from Infisical.", category: "CI/CD" }, { name: "TeamCity", slug: "teamcity", path: "/integrations/app-connections/teamcity", description: "Learn how to connect your TeamCity to pull secrets from Infisical.", category: "CI/CD" }, { name: "Bitbucket", slug: "bitbucket", path: "/integrations/app-connections/bitbucket", description: "Learn how to connect your Bitbucket to pull secrets from Infisical.", category: "CI/CD" }, { name: "Terraform Cloud", slug: "terraform-cloud", path: "/integrations/app-connections/terraform-cloud", description: "Learn how to connect your Terraform Cloud to pull secrets from Infisical.", category: "DevOps Tools" }, { name: "Cloudflare", slug: "cloudflare", path: "/integrations/app-connections/cloudflare", description: "Learn how to connect your Cloudflare application to pull secrets from Infisical.", category: "Cloud Providers" }, { name: "CircleCI", slug: "circleci", path: "/integrations/app-connections/circleci", description: "Learn how to connect your CircleCI application to pull secrets from Infisical.", category: "CI/CD" }, { name: "Databricks", slug: "databricks", path: "/integrations/app-connections/databricks", description: "Learn how to connect your Databricks to pull secrets from Infisical.", category: "Data Analytics" }, { name: "DNS Made Easy", slug: "dns-made-easy", path: "/integrations/app-connections/dns-made-easy", description: "Learn how to connect Infisical to DNS Made Easy.", category: "Networking & DNS" }, { name: "Windmill", slug: "windmill", path: "/integrations/app-connections/windmill", description: "Learn how to connect your Windmill to pull secrets from Infisical.", category: "DevOps Tools" }, { name: "Camunda", slug: "camunda", path: "/integrations/app-connections/camunda", description: "Learn how to connect your Camunda to pull secrets from Infisical.", category: "DevOps Tools" }, { name: "Humanitec", slug: "humanitec", path: "/integrations/app-connections/humanitec", description: "Learn how to connect your Humanitec to pull secrets from Infisical.", category: "DevOps Tools" }, { name: "OCI", slug: "oci", path: "/integrations/app-connections/oci", description: "Learn how to connect your OCI applications to pull secrets from Infisical.", category: "Cloud Providers" }, { name: "Zabbix", slug: "zabbix", path: "/integrations/app-connections/zabbix", description: "Learn how to connect your Zabbix to pull secrets from Infisical.", category: "Monitoring" }, { name: "MySQL", slug: "mysql", path: "/integrations/app-connections/mysql", description: "Learn how to connect your MySQL database to pull secrets from Infisical.", category: "Databases" }, { name: "PostgreSQL", slug: "postgres", path: "/integrations/app-connections/postgres", description: "Learn how to connect your PostgreSQL database to pull secrets from Infisical.", category: "Databases" }, { name: "Microsoft SQL Server", slug: "mssql", path: "/integrations/app-connections/mssql", description: "Learn how to connect your SQL Server database to pull secrets from Infisical.", category: "Databases" }, { name: "Oracle Database", slug: "oracledb", path: "/integrations/app-connections/oracledb", description: "Learn how to connect your Oracle database to pull secrets from Infisical.", category: "Databases" }, { name: "Redis", slug: "redis", path: "/integrations/app-connections/redis", description: "Learn how to connect Redis to pull secrets from Infisical.", category: "Databases" }, { name: "LDAP", slug: "ldap", path: "/integrations/app-connections/ldap", description: "Learn how to connect your LDAP to pull secrets from Infisical.", category: "Directory Services" }, { name: "Auth0", slug: "auth0", path: "/integrations/app-connections/auth0", description: "Learn how to connect your Auth0 to pull secrets from Infisical.", category: "Identity & Auth" }, { name: "Okta", slug: "okta", path: "/integrations/app-connections/okta", description: "Learn how to connect your Okta to pull secrets from Infisical.", category: "Identity & Auth" }, { name: "OpenRouter", slug: "openrouter", path: "/integrations/app-connections/openrouter", description: "Learn how to connect OpenRouter (unified LLM router) to manage and rotate API keys with Infisical.", category: "AI & LLM" }, { name: "Laravel Forge", slug: "laravel-forge", path: "/integrations/app-connections/laravel-forge", description: "Learn how to connect your Laravel Forge to pull secrets from Infisical.", category: "Hosting" }, { name: "Chef", slug: "chef", path: "/integrations/app-connections/chef", description: "Learn how to connect your Chef to pull secrets from Infisical.", category: "DevOps Tools" }, { name: "Northflank", slug: "northflank", path: "/integrations/app-connections/northflank", description: "Learn how to connect your Northflank projects to pull secrets from Infisical.", category: "Hosting" }, { name: "MongoDB", slug: "mongodb", path: "/integrations/app-connections/mongodb", description: "Learn how to connect your MongoDB to pull secrets from Infisical.", category: "Databases" }, { name: "Octopus Deploy", slug: "octopus-deploy", path: "/integrations/app-connections/octopus-deploy", description: "Learn how to connect your Octopus Deploy to pull secrets from Infisical.", category: "DevOps Tools" }, { name: "SMB", slug: "smb", path: "/integrations/app-connections/smb", description: "Learn how to connect to Windows servers via SMB.", category: "Networking & DNS" }].sort(function (a, b) { return a.name.toLowerCase().localeCompare(b.name.toLowerCase()); }); const filteredConnections = useMemo(() => { let filtered = connections; if (selectedCategory !== "All") { filtered = filtered.filter(connection => connection.category === selectedCategory); } if (searchTerm) { filtered = filtered.filter(connection => connection.name.toLowerCase().includes(searchTerm.toLowerCase()) || connection.description.toLowerCase().includes(searchTerm.toLowerCase()) || connection.category.toLowerCase().includes(searchTerm.toLowerCase())); } return filtered; }, [searchTerm, selectedCategory]); return
{}
setSearchTerm(e.target.value)} />
{}
{categories.map(category => )}
{}

{filteredConnections.length} app connection {filteredConnections.length !== 1 ? "s" : ""} found {selectedCategory !== "All" && ` in ${selectedCategory}`} {searchTerm && ` for "${searchTerm}"`}

{} {filteredConnections.length > 0 ?
{filteredConnections.map((connection, index) =>

{connection.name}

{connection.category}

{connection.description}

)}
:

No app connections found matching your criteria

{searchTerm &&

Try adjusting your search terms or filters

}
}
; }; --- # Source: https://infisical.com/docs/documentation/platform/pki/approvals.md > ## Documentation Index > Fetch the complete documentation index at: https://infisical.com/docs/llms.txt > Use this file to discover all available pages before exploring further. # Approval Policies & Requests > Learn how to configure approval workflows for certificate issuance. Certificate approval workflows add a human review step before certificates are issued, helping organizations enforce security controls and compliance requirements. ## When to Use Approval Workflows Approval workflows are recommended when: * **Separation of duties is required**: Your organization requires different people to request and approve certificate issuance. * **Sensitive certificate issuance needs oversight**: Certificates for production environments, customer-facing services, or internal PKI require additional review. * **Compliance mandates review**: Regulatory frameworks or internal policies require documented approval before certificate issuance. * **Preventing unauthorized issuance**: You want to ensure certificates are only issued after proper validation of the request. If your use case involves fully automated certificate management for workloads (e.g., using [Infisical Agent](/documentation/platform/pki/guides/request-cert-agent)), you may want to enable the machine identity bypass option instead of requiring approval. ## Approval Policies An approval policy defines the workflow that must be completed before certificates can be issued from specific [certificate profiles](/documentation/platform/pki/certificates/profiles). When a certificate request is made against a profile with an approval policy, the request is placed in a pending state until the required approvers review and approve it. Key features of approval policies include: * **Multi-step workflows**: Configure sequential approval steps where each step must be completed before the next begins. * **Flexible approvers**: Assign individual users or groups as eligible approvers for each step. * **Required approval count**: Specify how many approvals are needed per step (e.g., require 2 out of 5 eligible approvers). * **Machine identity bypass**: Allow [machine identities](/documentation/platform/identities/machine-identities) to issue certificates without approval for automated workloads. * **Request expiration**: Set a maximum time-to-live (TTL) for pending requests. ### Guide to Creating an Approval Policy To create an approval policy, head to your Certificate Management Project > Certificate Manager > Approvals > Policies and press **Create Policy**. pki approval policies Configure the basic policy settings: * **Policy Name**: A descriptive name for the policy such as `production-cert-approval`. * **Max. Request TTL**: The maximum time a request can remain pending before it expires (optional). * **Certificate Profiles**: Select one or more certificate profiles that this policy applies to. Any certificate request made against these profiles will require approval. * **Bypass approval for machine identities**: When enabled, machine identities can issue certificates from the selected profiles without requiring approval. This is useful for automated workloads that need certificates without human intervention. pki approval policy configuration Configure the approval steps. Each step defines who can approve and how many approvals are required: * **Step Name**: An optional name for the step such as `Security Team Review`. * **Approvers**: Select individual users or groups who are eligible to approve this step. Multiple approvers can be selected. * **Required Approvals**: The number of approvals needed to complete this step. For example, if you select 5 approvers and require 2 approvals, any 2 of the 5 can approve to complete the step. * **Notify Approvers**: When enabled, eligible approvers receive a notification when their approval is required. You can add multiple steps to create a sequential approval workflow. For example: 1. **Team Lead Review**: Requires 1 approval from the team leads group 2. **Security Review**: Requires 2 approvals from the security team Each step must be completed in order before the certificate is issued. pki approval policy sequence Review your policy configuration and click **Create** to save the policy. pki approval policy review pki approval policy created ## Approval Requests When a certificate request is made against a profile with an approval policy, an approval request is created. Approvers can then review and approve or reject the request. ### Viewing Requests Navigate to your Certificate Management Project > Certificate Manager > Approvals > Requests to view all approval requests. You can filter requests by status: pki approval requests * **Open Requests**: Requests currently pending approval * **Approved**: Requests that have been approved and certificates issued * **Rejected**: Requests that were rejected by an approver * **Cancelled**: Requests cancelled by the requester * **Expired**: Requests that exceeded their maximum TTL ### Approving a Request Click on a pending request to view its details. pki approval request open Review the certificate request information including: * Requester name and email * Certificate profile * Common name and subject alternative names (SANs) * Key usages and extended key usages * Validity period * Basic Constraints pki approval request detail If you are an eligible approver for the current step, click **Approve** to approve the request. pki approval request approve modal pki approval request approved Once all required approvals for all steps are obtained, the certificate is automatically issued. ### Rejecting a Request Click on a pending request to view its details. pki approval request open Review the certificate request information. pki approval request detail If you are an eligible approver for the current step, click **Reject** to reject the request. Optionally add a comment explaining the rejection. pki approval request rejected When a request is rejected, the workflow ends and no certificate is issued. ## FAQ If the approval policy has multiple steps, your approval may have completed only one step. The certificate is issued only after all approval steps are completed. Check the request details to see which step is currently pending and ensure all required approvers have approved. The Approve button only appears if you are an eligible approver for the current step. Verify that: * You are listed as an approver (either directly or through a group) for the current approval step * The request is still in a pending state and hasn't expired * A previous step hasn't already been rejected Approval policies can be configured on profiles using any enrollment method, including [API](/documentation/platform/pki/enrollment-methods/api), [ACME](/documentation/platform/pki/enrollment-methods/acme), and [EST](/documentation/platform/pki/enrollment-methods/est). However, automated clients like Certbot typically cannot wait for human approval. When a pending request exceeds the maximum TTL configured in the approval policy, it automatically moves to an **Expired** status. No certificate is issued for expired requests. The requester will need to submit a new certificate request. By default, an approver can approve their own requests if they are listed as an eligible approver. If your organization requires separation of duties where requesters cannot approve their own requests, configure the approval policy with approver groups that exclude potential requesters. --- # Source: https://infisical.com/docs/documentation/platform/pam/architecture.md > ## Documentation Index > Fetch the complete documentation index at: https://infisical.com/docs/llms.txt > Use this file to discover all available pages before exploring further. # Architecture > Learn about the architecture, components, and security model of Infisical PAM. Infisical PAM utilizes a secure, proxy-based architecture designed to provide access to private resources without exposing them directly to the internet. This system relies on a combination of the Infisical CLI, a Relay server, and a self-hosted Gateway. For more information on Gateways, refer to the [Gateway Overview](/documentation/platform/gateways/overview). ## Core Components The architecture consists of three main components working in unison: The client-side interface used to initiate access requests. It creates a local listener that forwards traffic securely to the Gateway. A lightweight service deployed within your private network (e.g., VPC, on-prem). It acts as a proxy, intercepting traffic to enforce policies and record sessions before forwarding requests to the target resource. The actual infrastructure being accessed, such as a PostgreSQL database, a Linux server, or a web application. ## Access Flow ```mermaid theme={"dark"} graph LR subgraph Client ["User Environment"] CLI["Infisical CLI"] end Relay["Relay Server"] subgraph Network ["Private Network (VPC)"] Gateway["Infisical Gateway"] DB[("Target Resource (Database/Server)")] end CLI <-->|Encrypted Tunnel| Relay Relay <-->|Reverse Tunnel| Gateway Gateway <-->|Native Protocol| DB ``` When a user accesses a resource (e.g., via `infisical access`), the following workflow occurs: 1. **Connection Initiation**: The Infisical CLI initiates a connection to the Relay server. 2. **Tunnel Establishment**: The Relay facilitates an end-to-end encrypted tunnel between the CLI and the Gateway. 3. **Proxy & Credential Injection**: The Gateway authenticates the request and connects to the target resource on the user's behalf. It automatically injects the necessary credentials (e.g., database passwords, SSH keys), ensuring the user never directly handles sensitive secrets. 4. **Traffic Forwarding**: Traffic flows securely from the user's machine, through the Relay, to the Gateway, and finally to the resource. ## Session Recording & Auditing Session Logging A key feature of the Gateway is its ability to act as a "middleman" for all session traffic. * **Interception**: Because the Gateway sits between the secure tunnel and the target resource, it intercepts all data flowing through the connection. * **Logging**: This traffic is logged as part of [Session Recording](/documentation/platform/pam/product-reference/session-recording). The Gateway temporarily stores encrypted session logs locally. * **Upload**: Once the session concludes, the logs are securely uploaded to the Infisical platform for storage and review. ## Security Architecture The PAM security model allows you to maintain a zero-trust environment while enabling convenient access. ### End-to-End Encryption The connection between the Infisical CLI (client) and the Gateway is end-to-end encrypted. The Relay server acts solely as a router for encrypted packets and **cannot decrypt or inspect** the traffic passing through it. ### Network Security The Gateway uses **SSH reverse tunnels** to connect to the Relay. This design offers significant security benefits: * **No Inbound Ports**: You do not need to open any inbound firewall ports (like 22 or 5432) to the internet. * **Outbound-Only**: The Gateway only requires outbound connectivity to the Relay server and Infisical API. For a deep dive into the underlying cryptography, certificate management, and isolation guarantees, refer to the [Gateway Security Architecture](/documentation/platform/gateways/security). ### Deployment For instructions on setting up the necessary infrastructure, see the [Gateway Deployment Guide](/documentation/platform/gateways/gateway-deployment). --- # Source: https://infisical.com/docs/documentation/platform/access-controls/assume-privilege.md > ## Documentation Index > Fetch the complete documentation index at: https://infisical.com/docs/llms.txt > Use this file to discover all available pages before exploring further. # Assume Privileges > Learn how to temporarily assume the privileges of a user or machine identity within a project. This feature allows authorized users to temporarily take on the permissions of another user or identity. It helps administrators and access managers test and verify permissions before granting access, ensuring everything is set up correctly. It also reduces back-and-forth with end users when troubleshooting permission-related issues. ## How It Works When an authorized user activates assume privileges mode, they temporarily inherit the target user or identity’s permissions for up to one hour.\ During this time, they can perform actions within the system with the same level of access as the target user. * **Permission-based**: Only permissions are inherited, not the full identity * **Time-limited**: Access automatically expires after one hour * **Audited**: All actions are logged under the original user's account. This means any action taken during the session will be recorded under the entity assuming the privileges, not the target entity. * **Authorization required**: Only users with the specific **assume privilege** permission can use this feature * **Scoped to a single project**: You can only assume privileges for one project at a time ## How to Assume Privileges Click on the user or identity you want to assume. Access control page Click **Assume Privilege**, then type `assume` to confirm and start your session. Access control detail page You will see a yellow banner indicating that your assume privilege session is active. You can exit at any time by clicking **Exit**. session start --- # Source: https://infisical.com/docs/api-reference/endpoints/deprecated/secrets/attach-tags.md > ## Documentation Index > Fetch the complete documentation index at: https://infisical.com/docs/llms.txt > Use this file to discover all available pages before exploring further. # Attach tags > Attach tags to a secret ## OpenAPI ````yaml POST /api/v3/secrets/tags/{secretName} openapi: 3.0.3 info: title: Infisical API description: List of all available APIs that can be consumed version: 0.0.1 servers: - url: https://us.infisical.com description: Production server (US) - url: https://eu.infisical.com description: Production server (EU) - url: http://localhost:8080 description: Local server security: [] paths: /api/v3/secrets/tags/{secretName}: post: tags: - Secrets description: Attach tags to a secret parameters: - schema: type: string minLength: 1 in: path name: secretName required: true description: The name of the secret to attach tags to. requestBody: content: application/json: schema: type: object properties: projectSlug: type: string description: The slug of the project where the secret is located. environment: type: string description: The slug of the environment where the secret is located secretPath: type: string default: / description: The path of the secret to attach tags to. type: type: string enum: - shared - personal default: shared description: The type of the secret to attach tags to. (shared/personal) tagSlugs: type: array items: type: string minItems: 1 description: An array of existing tag slugs to attach to the secret. required: - projectSlug - environment - tagSlugs additionalProperties: false required: true responses: '200': description: Default Response content: application/json: schema: type: object properties: secret: type: object properties: id: type: string format: uuid version: type: number default: 1 type: type: string default: shared secretKeyCiphertext: type: string secretKeyIV: type: string secretKeyTag: type: string secretValueCiphertext: type: string secretValueIV: type: string secretValueTag: type: string secretCommentCiphertext: type: string nullable: true secretCommentIV: type: string nullable: true secretCommentTag: type: string nullable: true secretReminderNote: type: string nullable: true secretReminderRepeatDays: type: number nullable: true skipMultilineEncoding: type: boolean default: false nullable: true algorithm: type: string default: aes-256-gcm keyEncoding: type: string default: utf8 metadata: nullable: true userId: type: string format: uuid nullable: true folderId: type: string format: uuid createdAt: type: string format: date-time updatedAt: type: string format: date-time tags: type: array items: type: object properties: id: type: string format: uuid slug: type: string color: type: string nullable: true name: type: string required: - id - slug - name additionalProperties: false required: - id - secretKeyCiphertext - secretKeyIV - secretKeyTag - secretValueCiphertext - secretValueIV - secretValueTag - folderId - createdAt - updatedAt - tags additionalProperties: false required: - secret additionalProperties: false '400': description: Default Response content: application/json: schema: type: object properties: reqId: type: string statusCode: type: number enum: - 400 message: type: string error: type: string details: {} required: - reqId - statusCode - message - error additionalProperties: false '401': description: Default Response content: application/json: schema: type: object properties: reqId: type: string statusCode: type: number enum: - 401 message: type: string error: type: string required: - reqId - statusCode - message - error additionalProperties: false '403': description: Default Response content: application/json: schema: type: object properties: reqId: type: string statusCode: type: number enum: - 403 message: type: string details: {} error: type: string required: - reqId - statusCode - message - error additionalProperties: false '404': description: Default Response content: application/json: schema: type: object properties: reqId: type: string statusCode: type: number enum: - 404 message: type: string error: type: string required: - reqId - statusCode - message - error additionalProperties: false '422': description: Default Response content: application/json: schema: type: object properties: reqId: type: string statusCode: type: number enum: - 422 message: {} error: type: string required: - reqId - statusCode - error additionalProperties: false '500': description: Default Response content: application/json: schema: type: object properties: reqId: type: string statusCode: type: number enum: - 500 message: type: string error: type: string required: - reqId - statusCode - message - error additionalProperties: false security: - bearerAuth: [] components: securitySchemes: bearerAuth: type: http scheme: bearer bearerFormat: JWT description: An access token in Infisical ```` --- # Source: https://infisical.com/docs/api-reference/endpoints/universal-auth/attach.md # Source: https://infisical.com/docs/api-reference/endpoints/token-auth/attach.md # Source: https://infisical.com/docs/api-reference/endpoints/tls-cert-auth/attach.md # Source: https://infisical.com/docs/api-reference/endpoints/oidc-auth/attach.md # Source: https://infisical.com/docs/api-reference/endpoints/oci-auth/attach.md # Source: https://infisical.com/docs/api-reference/endpoints/ldap-auth/attach.md # Source: https://infisical.com/docs/api-reference/endpoints/kubernetes-auth/attach.md # Source: https://infisical.com/docs/api-reference/endpoints/jwt-auth/attach.md # Source: https://infisical.com/docs/api-reference/endpoints/gcp-auth/attach.md # Source: https://infisical.com/docs/api-reference/endpoints/azure-auth/attach.md # Source: https://infisical.com/docs/api-reference/endpoints/aws-auth/attach.md # Source: https://infisical.com/docs/api-reference/endpoints/alicloud-auth/attach.md > ## Documentation Index > Fetch the complete documentation index at: https://infisical.com/docs/llms.txt > Use this file to discover all available pages before exploring further. # Attach > Attach Alibaba Cloud Auth configuration onto machine identity ## OpenAPI ````yaml POST /api/v1/auth/alicloud-auth/identities/{identityId} openapi: 3.0.3 info: title: Infisical API description: List of all available APIs that can be consumed version: 0.0.1 servers: - url: https://us.infisical.com description: Production server (US) - url: https://eu.infisical.com description: Production server (EU) - url: http://localhost:8080 description: Local server security: [] paths: /api/v1/auth/alicloud-auth/identities/{identityId}: post: tags: - Alibaba Cloud Auth description: Attach Alibaba Cloud Auth configuration onto machine identity operationId: attachAlicloudAuth parameters: - schema: type: string in: path name: identityId required: true description: The ID of the machine identity to attach the configuration onto. requestBody: content: application/json: schema: type: object properties: allowedArns: type: string minLength: 1 maxLength: 500 description: >- The comma-separated list of trusted ARNs that are allowed to authenticate with Infisical. accessTokenTrustedIps: type: array items: type: object properties: ipAddress: type: string required: - ipAddress additionalProperties: false minItems: 1 default: - ipAddress: 0.0.0.0/0 - ipAddress: '::/0' description: The IPs or CIDR ranges that access tokens can be used from. accessTokenTTL: type: integer minimum: 0 maximum: 315360000 default: 2592000 description: The lifetime for an access token in seconds. accessTokenMaxTTL: type: integer minimum: 1 maximum: 315360000 default: 2592000 description: The maximum lifetime for an access token in seconds. accessTokenNumUsesLimit: type: integer minimum: 0 default: 0 description: >- The maximum number of times that an access token can be used. required: - allowedArns additionalProperties: false required: true responses: '200': description: Default Response content: application/json: schema: type: object properties: identityAliCloudAuth: type: object properties: id: type: string format: uuid accessTokenTTL: type: number default: 7200 accessTokenMaxTTL: type: number default: 7200 accessTokenNumUsesLimit: type: number default: 0 accessTokenTrustedIps: {} createdAt: type: string format: date-time updatedAt: type: string format: date-time identityId: type: string format: uuid type: type: string allowedArns: type: string required: - id - createdAt - updatedAt - identityId - type - allowedArns additionalProperties: false required: - identityAliCloudAuth additionalProperties: false '400': description: Default Response content: application/json: schema: type: object properties: reqId: type: string statusCode: type: number enum: - 400 message: type: string error: type: string details: {} required: - reqId - statusCode - message - error additionalProperties: false '401': description: Default Response content: application/json: schema: type: object properties: reqId: type: string statusCode: type: number enum: - 401 message: type: string error: type: string required: - reqId - statusCode - message - error additionalProperties: false '403': description: Default Response content: application/json: schema: type: object properties: reqId: type: string statusCode: type: number enum: - 403 message: type: string details: {} error: type: string required: - reqId - statusCode - message - error additionalProperties: false '404': description: Default Response content: application/json: schema: type: object properties: reqId: type: string statusCode: type: number enum: - 404 message: type: string error: type: string required: - reqId - statusCode - message - error additionalProperties: false '422': description: Default Response content: application/json: schema: type: object properties: reqId: type: string statusCode: type: number enum: - 422 message: {} error: type: string required: - reqId - statusCode - error additionalProperties: false '500': description: Default Response content: application/json: schema: type: object properties: reqId: type: string statusCode: type: number enum: - 500 message: type: string error: type: string required: - reqId - statusCode - message - error additionalProperties: false security: - bearerAuth: [] components: securitySchemes: bearerAuth: type: http scheme: bearer bearerFormat: JWT description: An access token in Infisical ```` --- # Source: https://infisical.com/docs/documentation/platform/audit-log-streams/audit-log-streams-with-fluentbit.md > ## Documentation Index > Fetch the complete documentation index at: https://infisical.com/docs/llms.txt > Use this file to discover all available pages before exploring further. # Stream to Non-HTTP providers > How to stream Infisical Audit Logs to Non-HTTP log providers Audit log streams 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 [team@infisical.com](mailto:team@infisical.com) to purchase an enterprise license to use it. This guide will demonstrate how you can send Infisical Audit log streams to storage solutions that do not support direct HTTP-based ingestion, such as AWS S3. To achieve this, you will learn how you can use a log collector like Fluent Bit to capture and forward logs from Infisical to non-HTTP storage options. In this pattern, Fluent Bit acts as an intermediary, accepting HTTP log streams from Infisical and transforming them into a format that can be sent to your desired storage provider. ## Overview Log collectors are tools used to collect, analyze, transform, and send logs to storage. For the purposes of this guide, we will use [Fluent Bit](https://fluentbit.io) as our log collector and send logs from Infisical to AWS S3. However, this is just a example and you can use any log collector of your choice. ## Deploy Fluent Bit You can deploy Fluent Bit in one of two ways: 1. As a sidecar to your self-hosted Infisical instance 2. As a standalone service in any deployment/compute service (e.g., AWS EC2, ECS, or GCP Compute Engine) To view all deployment methods, visit the [Fluent Bit Getting Started guide](https://docs.fluentbit.io/manual/installation/getting-started-with-fluent-bit). ## Configure Fluent Bit To set up Fluent Bit, you'll need to provide a configuration file that establishes an HTTP listener and configures an output to send JSON data to your chosen storage solution. The following Fluent Bit configuration sets up an HTTP listener on port `8888` and sends logs to AWS S3: ```ini theme={"dark"} [SERVICE] Flush 1 Log_Level info Daemon off [INPUT] Name http Listen 0.0.0.0 Port 8888 [OUTPUT] Name s3 Match * bucket my-bucket region us-west-2 total_file_size 50M use_put_object Off compression gzip s3_key_format /$TAG/%Y/%m/%d/%H_%M_%S.gz ``` ### Connecting Infisical Audit Log Stream Once Fluent Bit is set up and configured, you can point the Infisical [audit log stream](/documentation/platform/audit-log-streams/audit-log-streams) to Fluent Bit's HTTP listener, which will then forward the logs to your chosen provider. Using this pattern, you are able to send Infisical Audit logs to various providers that do not support HTTP based log ingestion by default. --- # Source: https://infisical.com/docs/documentation/platform/audit-log-streams/audit-log-streams.md > ## Documentation Index > Fetch the complete documentation index at: https://infisical.com/docs/llms.txt > Use this file to discover all available pages before exploring further. # Audit Log Streams > Learn how to stream Infisical Audit Logs to external logging providers. Audit log streams 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 [team@infisical.com](mailto:team@infisical.com) to purchase an enterprise license to use it. Infisical Audit Log Streaming enables you to transmit your organization's audit logs to external logging providers for monitoring and analysis. ## Overview 1. Navigate to **Organization Settings** 2. Select the **Audit Log Streams** tab 3. Click **Add Log Stream** stream create If your log provider is included in this list, select it. Otherwise click on **Custom** to input your own Endpoint URL and headers. select provider Depending on your chosen provider, you'll be asked to input different credentials. For **Custom**, you need to input an endpoint URL and headers. custom provider Once you're finished, click **Create Log Stream**. Your audit logs are now ready to be streamed. stream list ## Example Providers Infisical offers a dedicated **Azure** provider to stream your audit logs, enabling seamless integration with services like Microsoft Sentinel. After setting up all Azure resources, it may take 10-20 minutes for logs to begin streaming. Navigate to [Data Collection Endpoints](https://portal.azure.com/#view/HubsExtension/BrowseResource.ReactView/resourceType/microsoft.insights%2Fdatacollectionendpoints) and click **Create**. azure create dce Configure your Data Collection Endpoint by providing an **Endpoint Name**, **Subscription**, and a **Resource group**. Then click **Review + Create**. azure configure dce After creation, it may take a few minutes for the Data Collection Endpoint to appear. Once visible, click on it and copy the **Logs Ingestion** URL. You will need this URL in later steps. azure dce url If you already have a Log Analytics Workspace, you may skip this step. Navigate to [Log Analytics Workspaces](https://portal.azure.com/#browse/Microsoft.OperationalInsights%2Fworkspaces) and click **Create**. azure create law Configure your Log Analytics Workspace by providing a **Subscription**, **Resource group**, and a **Name**. Then click **Review + Create**. azure configure law Once the workspace is deployed, click **Go to resource** to access it. azure go to resource Within your Log Analytics Workspace, navigate to **Tables** and click **Create**. Select **New custom log (DCR-based)** from the dropdown. azure new table Configure the Custom Log Table: Provide a **Table name** (e.g., `InfisicalLogs`), select the **Data collection endpoint** created in Step 1, and create a new **Data collection rule** as illustrated in the image below. Then, click **Next**. azure configure table On the **Schema and transformation** page, you'll be prompted to upload a **Log Sample**. Create a `.json` file with the following content and upload it: ```json theme={"dark"} { "id": "00000000-0000-0000-0000-000000000000", "actor": "user", "actorMetadata": { "email": "user@example.com", "userId": "00000000-0000-0000-0000-000000000000", "username": "user@example.com" }, "ipAddress": "0.0.0.0", "userAgent": "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/139.0.0.0 Safari/537.36", "userAgentType": "web", "eventType": "get-secrets", "eventMetadata": {}, "projectName": "MyProject", "orgId": "00000000-0000-0000-0000-000000000000", "projectId": "00000000-0000-0000-0000-000000000000", "TimeGenerated": "2025-01-01T00:00:00.000Z" } ``` Optionally, you can add **Transformations** to further destructure the data. For example, to extract actor email and userId: ``` source | extend ActorEmail = tostring(actorMetadata.email), ActorUserId = tostring(actorMetadata.userId) ``` On the final step, click **Create**. It may take a few minutes for your Custom Log Table to be created and appear under Tables. After creating your Data Collection Rule, you'll need its **Immutable ID**. Navigate to [Data collection rules](https://portal.azure.com/#view/HubsExtension/BrowseResource.ReactView/resourceType/microsoft.insights%2Fdatacollectionrules). Click on your newly created DCR and copy its **Immutable ID** for the next step. azure dcr In Infisical, create a new audit log stream and select the **Azure** provider. Input the following details: * **Tenant ID**: Your Tenant ID * **Client ID**: The Client ID of an App Registration * **Client Secret**: The Client Secret of an App Registration * **Data Collection Endpoint URL**: Obtained from Step 1 * **Data Collection Rule Immutable ID**: Obtained from Step 4 * **Custom Log Table Name**: Defined in Step 3 azure create als The App Registration used for authentication must have the **Monitoring Metrics Publisher** role assigned on the **Data Collection Rule** created in Step 3. [See Microsoft Guide](https://learn.microsoft.com/en-us/azure/azure-monitor/logs/tutorial-logs-ingestion-portal#assign-permissions-to-the-dcr). You can stream to Better Stack using a **Custom** log stream. On Better Stack, select **Connect Source** and click **Create source** after providing a name. better stack connect source Once your source is created, take note of the **endpoint** and **Source token** for the next step. better stack connect On Infisical, create a new audit log stream and select the **Custom** option. select custom 1. Fill in the endpoint URL with your Better Stack source endpoint 2. Create a new header with key `Authorization` and set the value as `Bearer ` custom provider Once you're finished, click **Create Log Stream**. Stream Infisical audit logs to Cribl Stream for centralized processing and routing. Infisical supports Cribl as a provider for seamless integration. In Cribl Stream, navigate to **Worker Groups** and select your Worker Group. Take note of the **Ingress Address** for later steps. cribl ingress address Within your Worker Group, navigate to **Data > Sources > HTTP** and click **Add Source**. cribl add source Configure the **Input ID**, **Port**, and **Cribl HTTP event API** path (e.g., `/infisical`). Then, generate an **Auth Token**. You can optionally configure TLS in the **TLS Settings** tab and add a pipeline in the **Pre-Processing** tab. Ensure that you're using a port that's open on your instance. cribl general settings Once you've configured the Data Source, click **Save** and deploy your changes. On Infisical, create a new audit log stream and select the **Cribl** provider option. Input the following credentials: * **Cribl Stream URL**: Your HTTP source endpoint composed of `http://://_bulk` * **Cribl Stream Token**: The authentication token from Step 1 If you configured TLS for your Data Source, use the `https://` protocol. cribl details Once you're finished, click **Create Log Stream**. You can stream to Datadog using the **Datadog** provider log stream. api key create api key form api key form On Infisical, create a new audit log stream and select the **Datadog** provider option. Input your **Datadog Region** and the **Token** obtained from step 2. datadog details Once you're finished, click **Create Log Stream**. You can stream to Splunk using the **Splunk** provider log stream. Navigate to **Settings** > **Data Inputs**. splunk data inputs Click on **HTTP Event Collector**. splunk http collector Click on **New Token** in the top left. splunk new token Provide a name and click **Next**. splunk name On the next page, click **Review** and then **Submit** at the top. On the final page you'll see your token. Copy the **Token Value** and your Splunk hostname from the URL to be used for later. splunk credentials On Infisical, create a new audit log stream and select the **Splunk** provider option. Input your **Splunk Hostname** and the **Token** obtained from step 1. splunk details Once you're finished, click **Create Log Stream**. ### Example Log Entry ```created-secret.json theme={"dark"} { "id": "7dc1713b-d787-4147-9e21-770be01cc992", "actor": "user", "actorMetadata": { "email": "example@infisical.com", "userId": "7383b701-d83f-45c0-acb4-04e138b987ab", "username": "example@infisical.com" }, "ipAddress": "127.0.0.1", "eventType": "create-secret", "eventMetadata": { "secretId": "3e5c796e-6599-4181-8dca-51133bb3acd0", "secretKey": "TEST-SECRET", "secretPath": "/", "environment": "dev", "secretVersion": 1 }, "userAgent": "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/131.0.0.0 Safari/537.36", "userAgentType": "web", "expiresAt": "2025-01-18T01:11:25.552Z", "createdAt": "2025-01-15T01:11:25.552Z", "updatedAt": "2025-01-15T01:11:25.552Z", "orgId": "785649f1-ff4b-4ef9-a40a-9b9878e46e57", "projectId": "09bfcc01-0917-4bea-9c7a-2d320584d5b1", "projectName": "example-project" } ``` ### Audit Logs Structure Streamed audit log structure **varies based on provider**, but they all share the audit log fields shown below. The unique identifier for the log entry. The entity responsible for performing or causing the event; this can be a user or service. The metadata associated with the actor. This varies based on the actor type. This metadata is present when the `actor` field is set to `user`. The unique identifier for the actor. The email address of the actor. The username of the actor. This metadata is present when the `actor` field is set to `identity`. The unique identifier for the identity. The name of the identity. This metadata is present when the `actor` field is set to `service`. The unique identifier for the service. The name of the service. If the `actor` field is set to `platform`, `scimClient`, or `unknownUser`, the `actorMetadata` field will be an empty object. The IP address of the actor. The type of event that occurred. Below you can see a list of possible event types. More event types will be added in the future as we expand our audit logs further. `get-secrets`, `delete-secrets`, `get-secret`, `create-secret`, `update-secret`, `delete-secret`, `get-workspace-key`, `authorize-integration`, `update-integration-auth`, `unauthorize-integration`, `create-integration`, `delete-integration`, `add-trusted-ip`, `update-trusted-ip`, `delete-trusted-ip`, `create-service-token`, `delete-service-token`, `create-identity`, `update-identity`, `delete-identity`, `login-identity-universal-auth`, `add-identity-universal-auth`, `update-identity-universal-auth`, `get-identity-universal-auth`, `create-identity-universal-auth-client-secret`, `revoke-identity-universal-auth-client-secret`, `get-identity-universal-auth-client-secret`, `create-environment`, `update-environment`, `delete-environment`, `add-workspace-member`, `remove-workspace-member`, `create-folder`, `update-folder`, `delete-folder`, `create-webhook`, `update-webhook-status`, `delete-webhook`, `webhook-triggered`, `get-secret-imports`, `create-secret-import`, `update-secret-import`, `delete-secret-import`, `update-user-workspace-role`, `update-user-workspace-denied-permissions`, `create-certificate-authority`, `get-certificate-authority`, `update-certificate-authority`, `delete-certificate-authority`, `get-certificate-authority-csr`, `get-certificate-authority-cert`, `sign-intermediate`, `import-certificate-authority-cert`, `get-certificate-authority-crl`, `issue-cert`, `get-cert`, `delete-cert`, `revoke-cert`, `get-cert-body`, `create-pki-alert`, `get-pki-alert`, `update-pki-alert`, `delete-pki-alert`, `create-pki-collection`, `get-pki-collection`, `update-pki-collection`, `delete-pki-collection`, `get-pki-collection-items`, `add-pki-collection-item`, `delete-pki-collection-item`, `org-admin-accessed-project`, `create-certificate-template`, `update-certificate-template`, `delete-certificate-template`, `get-certificate-template`, `create-certificate-template-est-config`, `update-certificate-template-est-config`, `get-certificate-template-est-config`, `update-project-slack-config`, `get-project-slack-config`, `integration-synced`, `create-shared-secret`, `delete-shared-secret`, `read-shared-secret`. The metadata associated with the event. This varies based on the event type. The user agent of the actor, if applicable. The type of user agent. The expiration date of the log entry. When this date is reached, the log entry will be deleted from Infisical. The creation date of the log entry. The last update date of the log entry. This is unlikely to be out of sync with the `createdAt` field, as we do not update log entries after they've been created. The unique identifier for the organization where the event occurred. The unique identifier for the project where the event occurred. The `projectId` field will only be present if the event occurred at the project level, not the organization level. The name of the project where the event occurred. The `projectName` field will only be present if the event occurred at the project level, not the organization level. --- # Source: https://infisical.com/docs/documentation/platform/audit-logs.md # Source: https://infisical.com/docs/documentation/getting-started/concepts/audit-logs.md > ## Documentation Index > Fetch the complete documentation index at: https://infisical.com/docs/llms.txt > Use this file to discover all available pages before exploring further. # Audit Logs > Understand how Infisical logs activity and supports external audit streaming. Infisical records a detailed audit trail of actions across the platform — providing deep visibility into access, changes, and usage for security and compliance purposes. Every interaction with Infisical resources generates an audit event. These events are immutable and include metadata such as the actor, event type, affected resources, timestamp, IP address, and client source. Audit logs enable teams to: * Monitor access and changes to secrets, certificates, and infrastructure. * Investigate incidents with full context around who did what, when, and how. * Meet compliance and governance requirements with structured activity records. To learn more, refer to the [audit logs documentation](/documentation/platform/audit-logs). ## Log Coverage Infisical tracks dozens of event types across the platform — including secret access, permission changes, certificate issuance, SSH session activity, and identity management. Each audit entry includes structured fields that make it easy to search, filter, and correlate across systems. For example: * Event Type: Action that occurred (e.g., `create-secret`, `issue-ssh-cert`). * Actor: Who performed the action (user or machine identity). * Resource: What was affected (e.g., project, secret, certificate). * Context: IP address, user agent, permissions, and more. ## External Log Streaming For centralized monitoring and long-term retention, Infisical supports [audit log streaming](/documentation/platform/audit-log-streams/audit-log-streams) to external systems. You can forward logs to SIEM platforms, storage buckets, or observability stacks using JSON-based collectors. Infisical integrates well with tools like [Fluent Bit](/documentation/platform/audit-log-streams/audit-log-streams-with-fluentbit#deploy-fluent-bit), enabling teams to route logs to destinations such as: * AWS S3 * Elasticsearch * Splunk * Datadog * Cloud-native log pipelines --- # Source: https://infisical.com/docs/documentation/platform/pam/product-reference/auditing.md > ## Documentation Index > Fetch the complete documentation index at: https://infisical.com/docs/llms.txt > Use this file to discover all available pages before exploring further. # Auditing > Learn how Infisical audits all actions across your PAM project. ## What's Audited Infisical logs a wide range of actions to provide a complete audit trail for your PAM project. These actions include: * Session Start and End * Fetching session credentials * Creating, updating, or deleting resources, accounts, folders, and sessions Please note: Audit logs track metadata about sessions (e.g., start/end times), but not the specific commands executed *within* them. For detailed in-session activity, check out [Session Recording](/documentation/platform/pam/product-reference/session-recording). ## Viewing Audit Logs You can view, search, and filter all events from the **Audit Logs** page within your PAM project. Audit Logs --- # Source: https://infisical.com/docs/documentation/platform/identities/auth-templates.md > ## Documentation Index > Fetch the complete documentation index at: https://infisical.com/docs/llms.txt > Use this file to discover all available pages before exploring further. # Machine Identity Auth Templates > Learn how to use auth templates to standardize authentication configurations for machine identities. ## Concept Machine Identity Auth Templates allow you to create reusable authentication configurations that can be applied across multiple machine identities. This feature helps standardize authentication setups, reduces configuration drift, and simplifies identity management at scale. Instead of manually configuring authentication settings for each identity, you can create templates with predefined authentication parameters and apply them to multiple identities. This ensures consistency and reduces the likelihood of configuration errors. Key Benefits: * **Standardization**: Ensure consistent authentication configurations across identities * **Efficiency**: Reduce time spent configuring individual identities * **Governance**: Centrally manage and update authentication parameters * **Scalability**: Easily apply proven configurations to new identities ## Managing Auth Templates Auth templates are managed in **Organization Settings > Access Control > Identities** under the **Identity Auth Templates** section. Identity Auth Templates Section ### Creating a Template In your organization settings, go to **Access Control > Identities** and scroll down to the **Identity Auth Templates** section. Click **Create Template** to open the template creation modal. Create Template Button Select the authentication method you want to create a template for (currently supports LDAP Auth). Fill in the template configuration based on your chosen authentication method. **For LDAP Auth templates**, configure the following fields: LDAP Auth Template * **Template Name**: A descriptive name for your template * **URL**: The LDAP server to connect to such as `ldap://ldap.your-org.com`, `ldaps://ldap.myorg.com:636` *(for connection over SSL/TLS)*, etc. * **Bind DN**: The DN to bind to the LDAP server with. * **Bind Pass**: The password to bind to the LDAP server with. * **Search Base / DN**: Base DN under which to perform user search such as `ou=Users,dc=acme,dc=com`. * **CA Certificate**: The CA certificate to use when verifying the LDAP server certificate. This field is optional but recommended. You can read more about LDAP Auth configuration in the [LDAP Auth documentation](/documentation/platform/identities/ldap-auth/general). ### Using Templates Once created, templates can be applied when configuring authentication methods for machine identities. When adding an auth method to an identity, you'll have the option to select from available templates or configure manually. Attach Template Attach Template Form ### Managing Template Usage You can view which identities are using a specific template by clicking **View Usages** in the template's dropdown menu. Template Usages Template Usages Modal ## FAQ Yes, you can edit existing templates. After editing a template, changes to templates will automatically update identities that are already using them. If you delete a template that's currently being used by identities, those identities will continue to function with their existing configuration. However, the link to the template will be broken, and you won't be able to use the template for new identities. Yes, click **View Usages** in the template's dropdown menu to see all identities currently using that template. Currently, auth templates support LDAP Auth. Support for additional authentication methods will be added in future releases. --- # Source: https://infisical.com/docs/documentation/platform/secret-rotation/auth0-client-secret.md > ## Documentation Index > Fetch the complete documentation index at: https://infisical.com/docs/llms.txt > Use this file to discover all available pages before exploring further. # Auth0 Client Secret Rotation > Learn how to automatically rotate Auth0 Client Secrets. Due to how Auth0 client secrets are rotated, retired credentials will not be able to authenticate with Auth0 during their [inactive period](./overview#how-rotation-works). This is a limitation of the Auth0 platform and cannot be rectified by Infisical. ## Prerequisites * Create an [Auth0 Connection](/integrations/app-connections/auth0) with the required **Secret Rotation** audience and permissions ## Create an Auth0 Client Secret Rotation in Infisical 1. Navigate to your Secret Manager Project's Dashboard and select **Add Secret Rotation** from the actions dropdown. Secret Manager Dashboard 2. Select the **Auth0 Client Secret** option. Select Auth0 Client Secret 3. Select the **Auth0 Connection** to use and configure the rotation behavior. Then click **Next**. Rotation Configuration * **Auth0 Connection** - the connection that will perform the rotation of the specified application's Client Secret. * **Rotation Interval** - the interval, in days, that once elapsed will trigger a rotation. * **Rotate At** - the local time of day when rotation should occur once the interval has elapsed. * **Auto-Rotation Enabled** - whether secrets should automatically be rotated once the rotation interval has elapsed. Disable this option to manually rotate secrets or pause secret rotation. Due to Auth0 Client Secret Rotations rotating a single credential set, auto-rotation may result in service interruptions. If you need to ensure service continuity, we recommend disabling this option. 4. Select the Auth0 application whose Client Secret you want to rotate. Then click **Next**. Rotation Parameters 5. Specify the secret names that the client credentials should be mapped to. Then click **Next**. Rotation Secrets Mapping * **Client ID** - the name of the secret that the application Client ID will be mapped to. * **Client Secret** - the name of the secret that the rotated Client Secret will be mapped to. 6. Give your rotation a name and description (optional). Then click **Next**. Rotation Details * **Name** - the name of the secret rotation configuration. Must be slug-friendly. * **Description** (optional) - a description of this rotation configuration. 7. Review your configuration, then click **Create Secret Rotation**. Rotation Review 8. Your **Auth0 Client Secret** credentials are now available for use via the mapped secrets. Rotation Created To create an Auth0 Client Secret Rotation, make an API request to the [Create Auth0 Client Secret Rotation](/api-reference/endpoints/secret-rotations/auth0-client-secret/create) API endpoint. You will first need the **Client ID** of the Auth0 application you want to rotate the secret for. This can be obtained from the Applications dashboard. Auth0 Client ID ### Sample request ```bash Request theme={"dark"} curl --request POST \ --url https://us.infisical.com/api/v2/secret-rotations/auth0-client-secret \ --header 'Content-Type: application/json' \ --data '{ "name": "my-auth0-rotation", "projectId": "3c90c3cc-0d44-4b50-8888-8dd25736052a", "description": "my client secret rotation", "connectionId": "3c90c3cc-0d44-4b50-8888-8dd25736052a", "environment": "dev", "secretPath": "/", "isAutoRotationEnabled": true, "rotationInterval": 30, "rotateAtUtc": { "hours": 0, "minutes": 0 }, "parameters": { "clientId": "...", }, "secretsMapping": { "clientId": "AUTH0_CLIENT_ID", "clientSecret": "AUTH0_CLIENT_SECRET" } }' ``` Due to Auth0 Client Secret Rotations rotating a single credential set, auto-rotation may result in service interruptions. If you need to ensure service continuity, we recommend disabling this option. ### Sample response ```bash Response theme={"dark"} { "secretRotation": { "id": "3c90c3cc-0d44-4b50-8888-8dd25736052a", "name": "my-auth0-rotation", "description": "my client secret rotation", "secretsMapping": { "clientId": "AUTH0_CLIENT_ID", "clientSecret": "AUTH0_CLIENT_SECRET" }, "isAutoRotationEnabled": true, "activeIndex": 0, "folderId": "3c90c3cc-0d44-4b50-8888-8dd25736052a", "connectionId": "3c90c3cc-0d44-4b50-8888-8dd25736052a", "createdAt": "2023-11-07T05:31:56Z", "updatedAt": "2023-11-07T05:31:56Z", "rotationInterval": 30, "rotationStatus": "success", "lastRotationAttemptedAt": "2023-11-07T05:31:56Z", "lastRotatedAt": "2023-11-07T05:31:56Z", "lastRotationJobId": "3c90c3cc-0d44-4b50-8888-8dd25736052a", "nextRotationAt": "2023-11-07T05:31:56Z", "connection": { "app": "auth0", "name": "my-auth0-connection", "id": "3c90c3cc-0d44-4b50-8888-8dd25736052a" }, "environment": { "slug": "dev", "name": "Development", "id": "3c90c3cc-0d44-4b50-8888-8dd25736052a" }, "projectId": "3c90c3cc-0d44-4b50-8888-8dd25736052a", "folder": { "id": "3c90c3cc-0d44-4b50-8888-8dd25736052a", "path": "/" }, "rotateAtUtc": { "hours": 0, "minutes": 0 }, "lastRotationMessage": null, "type": "auth0-client-secret", "parameters": { "clientId": "...", } } } ``` --- # Source: https://infisical.com/docs/documentation/platform/sso/auth0-oidc.md > ## Documentation Index > Fetch the complete documentation index at: https://infisical.com/docs/llms.txt > Use this file to discover all available pages before exploring further. # Auth0 OIDC > Learn how to configure Auth0 OIDC for Infisical SSO. Auth0 OIDC SSO is a paid feature. If you're using Infisical Cloud, then it is available under the **Pro Tier**. If you're self-hosting Infisical, then you should contact [sales@infisical.com](mailto:sales@infisical.com) to purchase a self-hosted license to use it. 1.1. From the Application's Page, navigate to the settings tab of the Auth0 application you want to integrate with Infisical. OIDC auth0 list of applications 1.2. In the Application URIs section, set the **Application Login URI** and **Allowed Web Origins** fields to `https://app.infisical.com` and the **Allowed Callback URL** field to `https://app.infisical.com/api/v1/sso/oidc/callback`. OIDC auth0 create application uris OIDC auth0 create application origin If you’re self-hosting Infisical, then you will want to replace [https://app.infisical.com](https://app.infisical.com) with your own domain. Once done, click **Save Changes**. 1.3. Proceed to the Connections Tab and enable desired connections. OIDC auth0 application connections 2.1. From the application settings page, retrieve the **Client ID** and **Client Secret** OIDC auth0 application credential 2.2. In the advanced settings (bottom-most section), retrieve the **OpenID Configuration URL** from the Endpoints tab. OIDC auth0 application oidc url Keep these values handy as we will need them in the next steps. 3.1. Back in Infisical, head to the **Single Sign-On (SSO)** page and select the **General** tab. Click **Connect** for **OIDC**. OIDC SSO Connect 3.2. For configuration type, select **Discovery URL**. Then, set **Discovery Document URL**, **JWT Signature Algorithm**, **Client ID**, and **Client Secret** from step 2.1 and 2.2. OIDC auth0 paste values into Infisical Currently, the following JWT signature algorithms are supported: RS256, RS512, HS256, and EdDSA Once you've done that, press **Update** to complete the required configuration. Enabling OIDC allows members in your organization to log into Infisical via Auth0. OIDC auth0 enable OIDC Enforcing OIDC SSO ensures that members in your organization can only access Infisical by logging into the organization via Auth0. To enforce OIDC SSO, you're required to test out the OpenID connection by successfully authenticating at least one Auth0 user with Infisical. Once you've completed this requirement, you can toggle the **Enforce OIDC SSO** button to enforce OIDC SSO. We recommend ensuring that your account is provisioned using the application in Auth0 prior to enforcing OIDC SSO to prevent any unintended issues. In case of a lockout, an organization admin can use the [Admin Login Portal](https://infisical.com/docs/documentation/platform/sso/overview#admin-login-portal) in the `/login/admin` path e.g. [https://app.infisical.com/login/admin](https://app.infisical.com/login/admin). If you are only using one organization on your Infisical instance, you can configure a default organization in the [Server Admin Console](../admin-panel/server-admin#default-organization) to expedite OIDC login. If you're configuring OIDC SSO on a self-hosted instance of Infisical, make sure to set the `AUTH_SECRET` and `SITE_URL` environment variable for it to work:
* `AUTH_SECRET`: A secret key used for signing and verifying JWT. This can be a random 32-byte base64 string generated with `openssl rand -base64 32`.
* `SITE_URL`: The absolute URL of your self-hosted instance of Infisical including the protocol (e.g. [https://app.infisical.com](https://app.infisical.com)) --- # Source: https://infisical.com/docs/documentation/platform/sso/auth0-saml.md > ## Documentation Index > Fetch the complete documentation index at: https://infisical.com/docs/llms.txt > Use this file to discover all available pages before exploring further. # Auth0 SAML > Learn how to configure Auth0 SAML for Infisical SSO. Auth0 SAML SSO feature is a paid feature. If you're using Infisical Cloud, then it is available under the **Pro Tier**. If you're self-hosting Infisical, then you should contact [sales@infisical.com](mailto:sales@infisical.com) to purchase an enterprise license to use it. In Infisical, head to the **Single Sign-On (SSO)** page and select the **General** tab. Click **Connect** for **SAML** under the Connect to an Identity Provider section. Select **Auth0**, then click **Connect** again. SSO connect section Next, note the **Application Callback URL** and **Audience** to use when configuring the Auth0 SAML application. Auth0 SAML initial configuration 2.1. In your Auth0 account, head to Applications and create an application. Auth0 SAML app creation Select **Regular Web Application** and press **Create**. Auth0 SAML app creation 2.2. In the Application head to Settings > Application URIs and add the **Application Callback URL** from step 1 into the **Allowed Callback URLs** field. Auth0 SAML allowed callback URLs 2.3. In the Application head to Addons > SAML2 Web App and copy the **Issuer**, **Identity Provider Login URL**, and **Identity Provider Certificate** from the **Usage** tab. Auth0 SAML config 2.4. Back in Infisical, set **Issuer**, **Identity Provider Login URL**, and **Certificate** to the corresponding items from step 2.3. Auth0 SAML Infisical config 2.5. Back in Auth0, in the **Settings** tab, set the **Application Callback URL** to the **Application Callback URL** from step 1 and update the **Settings** field with the JSON under the picture below (replacing `` with the **Audience** from step 1). Auth0 SAML config ```json theme={"dark"} { "audience": "", "mappings": { "email": "http://schemas.xmlsoap.org/ws/2005/05/identity/claims/email", "given_name": "http://schemas.xmlsoap.org/ws/2005/05/identity/claims/firstName", "family_name": "http://schemas.xmlsoap.org/ws/2005/05/identity/claims/lastName" }, "signatureAlgorithm": "rsa-sha256", "digestAlgorithm": "sha256", "signResponse": true } ``` Click **Save**. Make sure the `firstName` claim is mapped to a valid field of your Auth0 users. If your users don't have a `"given_name"` field available, you can replace it with `"name"` or another field that exists in your user profile on the left side of the mapping. Enabling SAML SSO allows members in your organization to log into Infisical via Auth0. Auth0 SAML enable Enforcing SAML SSO ensures that members in your organization can only access Infisical by logging into the organization via Auth0. To enforce SAML SSO, you're required to test out the SAML connection by successfully authenticating at least one Auth0 user with Infisical; Once you've completed this requirement, you can toggle the **Enforce SAML SSO** button to enforce SAML SSO. In case of a lockout, an organization admin can use the [Admin Login Portal](https://infisical.com/docs/documentation/platform/sso/overview#admin-login-portal) in the `/login/admin` path e.g. [https://app.infisical.com/login/admin](https://app.infisical.com/login/admin). If you are only using one organization on your Infisical instance, you can configure a default organization in the [Server Admin Console](../admin-panel/server-admin#default-organization) to expedite SAML login. If you're configuring SAML SSO on a self-hosted instance of Infisical, make sure to set the `AUTH_SECRET` and `SITE_URL` environment variable for it to work:
* `AUTH_SECRET`: A secret key used for signing and verifying JWT. This can be a random 32-byte base64 string generated with `openssl rand -base64 32`.
* `SITE_URL`: The absolute URL of your self-hosted instance of Infisical including the protocol (e.g. [https://app.infisical.com](https://app.infisical.com)) --- # Source: https://infisical.com/docs/integrations/app-connections/auth0.md > ## Documentation Index > Fetch the complete documentation index at: https://infisical.com/docs/llms.txt > Use this file to discover all available pages before exploring further. # Auth0 Connection > Learn how to configure an Auth0 Connection for Infisical. Infisical supports the use of [Client Credentials](https://auth0.com/docs/get-started/authentication-and-authorization-flow/client-credentials-flow) to connect with your Auth0 applications. ## Configure a Machine-to-Machine Application in Auth0 Navigate to the **Applications** page in Auth0 via the sidebar and click **Create Application**. Applications Page Give your application a name and select **Machine-to-Machine** for the application type. Create Machine-to-Machine Application Depending on your connection use case, authorize your application for the applicable API and grant the relevant permissions. Once done, click **Authorize**. Select the **Auth0 Management API** option from the dropdown and grant the `update:client_keys` and `read:clients` permission. Secret Rotation Authorization On your application page, select the **Settings** tab and copy the **Domain**, **Client ID** and **Client Secret** for later. Client Credentials Next, select the **APIs** tab and copy the **API Identifier**. Application Audience ## Setup Auth0 Connection in Infisical 1. Navigate to the **Integrations** tab in the desired project, then select **App Connections**. App Connections Tab 2. Select the **Auth0 Connection** option. Select Auth0 Connection 3. Select the **Client Credentials** method option and provide the details obtained from the previous section and press **Connect to Auth0**. Create Auth0 Connection 4. Your **Auth0 Connection** is now available for use. Assume Role Auth0 Connection To create a Auth0 Connection, make an API request to the [Create Auth0 Connection](/api-reference/endpoints/app-connections/auth0/create) API endpoint. ### Sample request ```bash Request theme={"dark"} curl --request POST \ --url https://app.infisical.com/api/v1/app-connections/auth0 \ --header 'Content-Type: application/json' \ --data '{ "name": "my-auth0-connection", "method": "client-credentials", "projectId": "7ffbb072-2575-495a-b5b0-127f88caef78", "credentials": { "domain": "xxx-xxxxxxxxx.us.auth0.com", "clientId": "...", "clientSecret": "...", "audience": "https://xxx-xxxxxxxxx.us.auth0.com/api/v2/" } }' ``` ### Sample response ```bash Response theme={"dark"} { "appConnection": { "id": "3c90c3cc-0d44-4b50-8888-8dd25736052a", "name": "my-auth0-connection", "projectId": "7ffbb072-2575-495a-b5b0-127f88caef78", "version": 1, "orgId": "3c90c3cc-0d44-4b50-8888-8dd25736052a", "createdAt": "2023-11-07T05:31:56Z", "updatedAt": "2023-11-07T05:31:56Z", "app": "auth0", "method": "client-credentials", "credentials": { "domain": "xxx-xxxxxxxxx.us.auth0.com", "clientId": "...", "audience": "https://xxx-xxxxxxxxx.us.auth0.com/api/v2/" } } } ``` --- # Source: https://infisical.com/docs/api-reference/overview/authentication.md > ## Documentation Index > Fetch the complete documentation index at: https://infisical.com/docs/llms.txt > Use this file to discover all available pages before exploring further. # Authentication > Learn how to authenticate with the Infisical Public API. You can authenticate with the Infisical API using [Identities](/documentation/platform/identities/machine-identities) paired with authentication modes such as [Universal Auth](/documentation/platform/identities/universal-auth). To interact with the Infisical API, you will need to obtain an access token. Follow the step by [step guide](/documentation/platform/identities/universal-auth) to get an access token via Universal Auth. **FAQ** There are a few reasons for why this might happen: * You have insufficient organization permissions to create, read, update, delete identities. * The identity you are trying to read, update, or delete is more privileged than yourself. * The role you are trying to create an identity for or update an identity to is more privileged than yours. There are a few reasons for why this might happen: * The client secret or access token has expired. * The identity is insufficiently permissioned to interact with the resources you wish to access. * You are attempting to access a `/raw` secrets endpoint that requires your project to disable E2EE. * The client secret/access token is being used from an untrusted IP. --- # Source: https://infisical.com/docs/self-hosting/guides/automated-bootstrapping.md > ## Documentation Index > Fetch the complete documentation index at: https://infisical.com/docs/llms.txt > Use this file to discover all available pages before exploring further. # Programmatic Provisioning > Learn how to provision and configure Infisical instances programmatically without UI interaction Infisical's Automated Bootstrapping feature enables you to provision and configure an Infisical instance without using the UI, allowing for complete automation through static configuration files, API calls, or CLI commands. This is especially valuable for enterprise environments where automated deployment and infrastructure-as-code practices are essential. The bootstrapping workflow automates creating an admin user account, initializing an organization for the entire instance, establishing an **instance admin machine identity** with full administrative permissions, and returning the machine identity credentials for further automation. ## Prerequisites * An Infisical instance launched with all required configuration variables * Access to the Infisical CLI or the ability to make API calls to the instance * Network connectivity to the Infisical instance ## Key Concepts * **Instance Initialization**: Infisical requires [configuration variables](/self-hosting/configuration/envars) to be set during launch, after which the bootstrap process can be triggered. * **Instance Admin Machine Identity**: The bootstrapping process creates a machine identity with instance-level admin privileges, which can be used to programmatically manage all aspects of the Infisical instance. Instance Admin Identity * **Token Auth**: The instance admin machine identity uses [Token Auth](/documentation/platform/identities/token-auth), providing a JWT token that can be used directly to make authenticated requests to the Infisical API. ## Bootstrap Methods You can bootstrap an Infisical instance using the API, CLI, or Helm chart. Make a POST request to the bootstrap endpoint: ``` POST: http://your-infisical-instance.com/api/v1/admin/bootstrap { "email": "admin@example.com", "password": "your-secure-password", "organization": "your-org-name" } ``` Example using curl: ```bash theme={"dark"} curl -X POST \ -H "Content-Type: application/json" \ -d '{"email":"admin@example.com","password":"your-secure-password","organization":"your-org-name"}' \ http://your-infisical-instance.com/api/v1/admin/bootstrap ``` ### API Response Structure The bootstrap process returns a JSON response with details about the created user, organization, and machine identity: ```json theme={"dark"} { "identity": { "credentials": { "token": "eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJpZGVudGl0eUlkIjoiZGIyMjQ3OTItZWQxOC00Mjc3LTlkYWUtNTdlNzUyMzE1ODU0IiwiaWRlbnRpdHlBY2Nlc3NUb2tlbklkIjoiZmVkZmZmMGEtYmU3Yy00NjViLWEwZWEtZjM5OTNjMTg4OGRlIiwiYXV0aFRva2VuVHlwZSI6ImlkZW50aXR5QWNjZXNzVG9rZW4iLCJpYXQiOjE3NDIzMjI0ODl9.mqcZZqIFqER1e9ubrQXp8FbzGYi8nqqZwfMvz09g-8Y" }, "id": "db224792-ed18-4277-9dae-57e752315854", "name": "Instance Admin Identity" }, "message": "Successfully bootstrapped instance", "organization": { "id": "b56bece0-42f5-4262-b25e-be7bf5f84957", "name": "dog", "slug": "dog-v-e5l" }, "user": { "email": "admin@example.com", "firstName": "Admin", "id": "a418f355-c8da-453c-bbc8-6c07208eeb3c", "lastName": "User", "superAdmin": true, "username": "admin@example.com" } } ``` Use the [Infisical CLI](/cli/commands/bootstrap) to bootstrap the instance and extract the token for immediate use in automation: ```bash theme={"dark"} infisical bootstrap --domain="http://localhost:8080" --email="admin@example.com" --password="your-secure-password" --organization="your-org-name" | jq ".identity.credentials.token" ``` This example command pipes the output through `jq` to extract only the machine identity token, making it easy to capture and use directly in automation scripts or export as an environment variable for tools like Terraform. ### API Response Structure The bootstrap process returns a JSON response with details about the created user, organization, and machine identity: ```json theme={"dark"} { "identity": { "credentials": { "token": "eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJpZGVudGl0eUlkIjoiZGIyMjQ3OTItZWQxOC00Mjc3LTlkYWUtNTdlNzUyMzE1ODU0IiwiaWRlbnRpdHlBY2Nlc3NUb2tlbklkIjoiZmVkZmZmMGEtYmU3Yy00NjViLWEwZWEtZjM5OTNjMTg4OGRlIiwiYXV0aFRva2VuVHlwZSI6ImlkZW50aXR5QWNjZXNzVG9rZW4iLCJpYXQiOjE3NDIzMjI0ODl9.mqcZZqIFqER1e9ubrQXp8FbzGYi8nqqZwfMvz09g-8Y" }, "id": "db224792-ed18-4277-9dae-57e752315854", "name": "Instance Admin Identity" }, "message": "Successfully bootstrapped instance", "organization": { "id": "b56bece0-42f5-4262-b25e-be7bf5f84957", "name": "dog", "slug": "dog-v-e5l" }, "user": { "email": "admin@example.com", "firstName": "Admin", "id": "a418f355-c8da-453c-bbc8-6c07208eeb3c", "lastName": "User", "superAdmin": true, "username": "admin@example.com" } } ``` When deploying Infisical using the official [Helm chart](/self-hosting/deployment-options/kubernetes-helm#kubernetes-via-helm-chart), you can enable automatic bootstrapping that runs as part of the deployment process. This eliminates the need to manually bootstrap the instance after deployment. The bootstrapping process automatically generates a Kubernetes secret containing the instance admin token, which can then be referenced by Crossplane providers, Terraform operators, or other automation systems for further infrastructure provisioning and configuration. ### Configuration Enable auto bootstrapping in your Helm values by setting `autoBootstrap.enabled: true` and providing the necessary configuration: ```yaml theme={"dark"} autoBootstrap: enabled: true organization: "My Organization" secretTemplate: '{"data":{"token":"{{.Identity.Credentials.Token}}"}}' secretDestination: name: "infisical-bootstrap-secret" namespace: "default" # defaults to release namespace if not specified credentialSecret: name: "infisical-bootstrap-credentials" ``` You'll also need to create a secret containing the bootstrap credentials before deployment. The secret must contain `INFISICAL_ADMIN_EMAIL` and `INFISICAL_ADMIN_PASSWORD` keys: ```bash theme={"dark"} kubectl create secret generic infisical-bootstrap-credentials \ --from-literal=INFISICAL_ADMIN_EMAIL="admin@example.com" \ --from-literal=INFISICAL_ADMIN_PASSWORD="your-secure-password" \ --namespace=release-namespace ``` ### How It Works The Helm chart auto bootstrap feature: 1. **Post-Install Hook**: Runs automatically after the main Infisical deployment is complete 2. **Readiness Check**: Uses an init container with curl to wait for Infisical to be ready by polling the `/api/status` endpoint 3. **Bootstrap Execution**: Uses the Infisical CLI to bootstrap the instance 4. **Kubernetes Secret Creation**: Creates a Kubernetes secret directly via the Kubernetes API using the rendered template 5. **RBAC**: Automatically configures the necessary permissions (`get`, `create`, `update` on secrets) for the bootstrap job ### Template System The `secretTemplate` field allows you to customize the data section of the created Kubernetes secret. The template has access to the full bootstrap response with the following available data fields: * `{{ .Identity.Credentials.Token }}`: The admin machine identity token * `{{ .Identity.ID }}`: The identity ID * `{{ .Identity.Name }}`: The identity name * `{{ .Organization.ID }}`: The organization ID * `{{ .Organization.Name }}`: The organization name * `{{ .Organization.Slug }}`: The organization slug * `{{ .User.Email }}`: The admin user email * `{{ .User.ID }}`: The admin user ID * `{{ .User.FirstName }}`: The admin user first name * `{{ .User.LastName }}`: The admin user last name The template also supports the `encodeBase64` function for base64 encoding values. Example template for storing multiple values: ```yaml theme={"dark"} secretTemplate: | { "data": { "infisical_token": "{{ .Identity.Credentials.Token }}", "admin_email": "{{ .User.Email }}", "organization": "{{ .Organization.Name }}" } } ``` ### Benefits * **Zero-Touch Deployment**: Complete Infisical setup without manual intervention * **Infrastructure as Code**: Bootstrap configuration is versioned with your Helm values * **Secure Token Storage**: Admin identity credentials are immediately stored in Kubernetes secrets * **Integration Ready**: The created secret can be referenced by other applications or automation tools ### Security Considerations * The bootstrap job requires permissions to create secrets in the specified namespace * Bootstrap credentials should be stored securely and rotated regularly * The generated admin token has full instance privileges and should be protected accordingly * Consider using Kubernetes RBAC to restrict access to the generated secret ## Using the Instance Admin Machine Identity Token The bootstrap process automatically creates a machine identity with Token Auth configured. The returned token has instance-level admin privileges (the highest level of access) and should be treated with the same security considerations as a root credential. The token enables full programmatic control of your Infisical instance and can be used in the following ways: ### 1. Infrastructure Automation Store the token securely for use with infrastructure automation tools. Due to the sensitive nature of this token, ensure it's protected using appropriate secret management practices: #### Kubernetes Secret (with appropriate RBAC restrictions) ```yaml theme={"dark"} apiVersion: v1 kind: Secret metadata: name: infisical-admin-credentials type: Opaque data: token: ``` #### Environment Variable for Terraform ```bash theme={"dark"} export INFISICAL_TOKEN=your-access-token terraform apply ``` ### 2. Programmatic Resource Management Use the token to authenticate API calls for creating and managing Infisical resources. The token works exactly like any other Token Auth access token in the Infisical API: ```bash theme={"dark"} curl -X POST \ -H "Authorization: Bearer ${INFISICAL_TOKEN}" \ -H "Content-Type: application/json" \ -d '{ "projectName": "New Project", "projectDescription": "A project created via API", "slug": "new-project-slug", "template": "default", "type": "secret-manager" }' \ https://your-infisical-instance.com/api/v1/projects ``` ## Important Notes * **Security Warning**: The instance admin machine identity has the highest level of privileges in your Infisical deployment. The token should be treated with the utmost security and handled like a root credential. Unauthorized access to this token could compromise your entire Infisical instance. * Security controls prevent privilege escalation: instance admin identities cannot be managed by non-instance admin users and identities * The instance admin permission of the generated identity can be revoked later in the server admin panel if needed * The generated admin user account can still be used for UI access if needed, or can be removed if you prefer to manage everything through the machine identity * This process is designed to work with future Crossplane providers and the existing Terraform provider for full infrastructure-as-code capabilities * All necessary configuration variables should be set during the initial launch of the Infisical instance --- # Source: https://infisical.com/docs/api-reference/endpoints/app-connections/zabbix/available.md # Source: https://infisical.com/docs/api-reference/endpoints/app-connections/windmill/available.md # Source: https://infisical.com/docs/api-reference/endpoints/app-connections/vercel/available.md # Source: https://infisical.com/docs/api-reference/endpoints/app-connections/terraform-cloud/available.md # Source: https://infisical.com/docs/api-reference/endpoints/app-connections/teamcity/available.md # Source: https://infisical.com/docs/api-reference/endpoints/app-connections/supabase/available.md # Source: https://infisical.com/docs/api-reference/endpoints/app-connections/ssh/available.md # Source: https://infisical.com/docs/api-reference/endpoints/app-connections/smb/available.md # Source: https://infisical.com/docs/api-reference/endpoints/app-connections/render/available.md # Source: https://infisical.com/docs/api-reference/endpoints/app-connections/redis/available.md # Source: https://infisical.com/docs/api-reference/endpoints/app-connections/railway/available.md # Source: https://infisical.com/docs/api-reference/endpoints/app-connections/postgres/available.md # Source: https://infisical.com/docs/api-reference/endpoints/app-connections/oracledb/available.md # Source: https://infisical.com/docs/api-reference/endpoints/app-connections/openrouter/available.md # Source: https://infisical.com/docs/api-reference/endpoints/app-connections/okta/available.md # Source: https://infisical.com/docs/api-reference/endpoints/app-connections/octopus-deploy/available.md # Source: https://infisical.com/docs/api-reference/endpoints/app-connections/oci/available.md # Source: https://infisical.com/docs/api-reference/endpoints/app-connections/northflank/available.md # Source: https://infisical.com/docs/api-reference/endpoints/app-connections/netlify/available.md # Source: https://infisical.com/docs/api-reference/endpoints/app-connections/mysql/available.md # Source: https://infisical.com/docs/api-reference/endpoints/app-connections/mssql/available.md # Source: https://infisical.com/docs/api-reference/endpoints/app-connections/mongodb/available.md # Source: https://infisical.com/docs/api-reference/endpoints/app-connections/ldap/available.md # Source: https://infisical.com/docs/api-reference/endpoints/app-connections/laravel-forge/available.md # Source: https://infisical.com/docs/api-reference/endpoints/app-connections/humanitec/available.md # Source: https://infisical.com/docs/api-reference/endpoints/app-connections/heroku/available.md # Source: https://infisical.com/docs/api-reference/endpoints/app-connections/hashicorp-vault/available.md # Source: https://infisical.com/docs/api-reference/endpoints/app-connections/gitlab/available.md # Source: https://infisical.com/docs/api-reference/endpoints/app-connections/github/available.md # Source: https://infisical.com/docs/api-reference/endpoints/app-connections/github-radar/available.md # Source: https://infisical.com/docs/api-reference/endpoints/app-connections/gcp/available.md # Source: https://infisical.com/docs/api-reference/endpoints/app-connections/flyio/available.md # Source: https://infisical.com/docs/api-reference/endpoints/app-connections/digital-ocean/available.md # Source: https://infisical.com/docs/api-reference/endpoints/app-connections/databricks/available.md # Source: https://infisical.com/docs/api-reference/endpoints/app-connections/cloudflare/available.md # Source: https://infisical.com/docs/api-reference/endpoints/app-connections/chef/available.md # Source: https://infisical.com/docs/api-reference/endpoints/app-connections/camunda/available.md # Source: https://infisical.com/docs/api-reference/endpoints/app-connections/bitbucket/available.md # Source: https://infisical.com/docs/api-reference/endpoints/app-connections/azure-key-vault/available.md # Source: https://infisical.com/docs/api-reference/endpoints/app-connections/azure-devops/available.md # Source: https://infisical.com/docs/api-reference/endpoints/app-connections/azure-client-secret/available.md # Source: https://infisical.com/docs/api-reference/endpoints/app-connections/azure-app-configuration/available.md # Source: https://infisical.com/docs/api-reference/endpoints/app-connections/azure-adcs/available.md # Source: https://infisical.com/docs/api-reference/endpoints/app-connections/aws/available.md # Source: https://infisical.com/docs/api-reference/endpoints/app-connections/auth0/available.md # Source: https://infisical.com/docs/api-reference/endpoints/app-connections/1password/available.md > ## Documentation Index > Fetch the complete documentation index at: https://infisical.com/docs/llms.txt > Use this file to discover all available pages before exploring further. # Available > List the 1Password Connections the current user has permission to establish connections within this project. ## OpenAPI ````yaml GET /api/v1/app-connections/1password/available openapi: 3.0.3 info: title: Infisical API description: List of all available APIs that can be consumed version: 0.0.1 servers: - url: https://us.infisical.com description: Production server (US) - url: https://eu.infisical.com description: Production server (EU) - url: http://localhost:8080 description: Local server security: [] paths: /api/v1/app-connections/1password/available: get: tags: - App Connections description: >- List the 1Password Connections the current user has permission to establish connections within this project. operationId: listOnePasswordAvailableAppConnections parameters: - schema: type: string in: query name: projectId required: false description: The ID of the project to list 1Password Connections from. responses: '200': description: Default Response content: application/json: schema: type: object properties: appConnections: type: array items: type: object properties: app: type: string enum: - 1password name: type: string id: type: string format: uuid projectId: type: string nullable: true orgId: type: string required: - app - name - id - orgId additionalProperties: false required: - appConnections additionalProperties: false '400': description: Default Response content: application/json: schema: type: object properties: reqId: type: string statusCode: type: number enum: - 400 message: type: string error: type: string details: {} required: - reqId - statusCode - message - error additionalProperties: false '401': description: Default Response content: application/json: schema: type: object properties: reqId: type: string statusCode: type: number enum: - 401 message: type: string error: type: string required: - reqId - statusCode - message - error additionalProperties: false '403': description: Default Response content: application/json: schema: type: object properties: reqId: type: string statusCode: type: number enum: - 403 message: type: string details: {} error: type: string required: - reqId - statusCode - message - error additionalProperties: false '404': description: Default Response content: application/json: schema: type: object properties: reqId: type: string statusCode: type: number enum: - 404 message: type: string error: type: string required: - reqId - statusCode - message - error additionalProperties: false '422': description: Default Response content: application/json: schema: type: object properties: reqId: type: string statusCode: type: number enum: - 422 message: {} error: type: string required: - reqId - statusCode - error additionalProperties: false '500': description: Default Response content: application/json: schema: type: object properties: reqId: type: string statusCode: type: number enum: - 500 message: type: string error: type: string required: - reqId - statusCode - message - error additionalProperties: false ```` --- # Source: https://infisical.com/docs/integrations/cicd/aws-amplify.md > ## Documentation Index > Fetch the complete documentation index at: https://infisical.com/docs/llms.txt > Use this file to discover all available pages before exploring further. # AWS Amplify > Learn how to sync secrets from Infisical to AWS Amplify. Prerequisites: * Infisical Cloud account * Add the secrets you wish to sync to Amplify to [Infisical Cloud](https://app.infisical.com) There are many approaches to sync secrets stored within Infisical to AWS Amplify. This guide describes two such approaches below. ## Access Infisical secrets at Amplify build time This approach enables you to fetch secrets from Infisical during Amplify build time. Create a machine identity and connect it to your Infisical project. You can read more about how to use machine identities [here](/documentation/platform/identities/machine-identities). The machine identity will allow you to authenticate and fetch secrets from Infisical. aws amplify env console 1. In the Amplify console, choose App Settings, and then select Environment variables. 2. In the Environment variables section, select Manage variables. 3. Under the first Variable enter `INFISICAL_MACHINE_IDENTITY_CLIENT_ID`, and for the value, enter the client ID of the machine identity you created in the previous step. 4. Under the second Variable enter `INFISICAL_MACHINE_IDENTITY_CLIENT_SECRET`, and for the value, enter the client secret of the machine identity you created in the previous step. 5. Click save. In the prebuild phase, add the command in AWS Amplify to install the Infisical CLI. ```yaml theme={"dark"} build: phases: preBuild: commands: - sudo curl -1sLf 'https://dl.cloudsmith.io/public/infisical/infisical-cli/setup.rpm.sh' | sudo -E bash - sudo yum -y install infisical ``` You can now pull secrets from Infisical using the CLI and save them as a `.env` file. To do this, modify the build commands. ```yaml theme={"dark"} build: phases: build: commands: - INFISICAL_TOKEN=$(infisical login --method=universal-auth --client-id=${INFISICAL_MACHINE_IDENTITY_CLIENT_ID} --client-secret=${INFISICAL_MACHINE_IDENTITY_CLIENT_SECRET} --silent --plain) - infisical export --format=dotenv > .env - ``` Go to your project settings in the Infisical dashboard to generate a [service token](/documentation/platform/token). This service token will allow you to authenticate and fetch secrets from Infisical. Once you have created a service token with the required permissions, you’ll need to provide the token to the CLI installed in your Docker container. aws amplify env console 1. In the Amplify console, choose App Settings, and then select Environment variables. 2. In the Environment variables section, select Manage variables. 3. Under Variable, enter the key **INFISICAL\_TOKEN**. For the value, enter the generated service token from the previous step. 4. Click save. In the prebuild phase, add the command in AWS Amplify to install the Infisical CLI. ```yaml theme={"dark"} build: phases: preBuild: commands: - sudo curl -1sLf 'https://dl.cloudsmith.io/public/infisical/infisical-cli/setup.rpm.sh' | sudo -E bash - sudo yum -y install infisical ``` You can now pull secrets from Infisical using the CLI and save them as a `.env` file. To do this, modify the build commands. ```yaml theme={"dark"} build: phases: build: commands: - INFISICAL_TOKEN=${INFISICAL_TOKEN} - infisical export --format=dotenv > .env - ``` ## Sync Secrets Using AWS SSM Parameter Store Another approach to use secrets from Infisical in AWS Amplify is to utilize AWS Parameter Store. At high level, you begin by using Infisical's AWS SSM Parameter Store integration to sync secrets from Infisical to AWS SSM Parameter Store. You then instruct AWS Amplify to consume those secrets from AWS SSM Parameter Store as [environment secrets](https://docs.aws.amazon.com/amplify/latest/userguide/environment-variables.html#environment-secrets). Follow the [Infisical AWS SSM Parameter Store Secret Syncs Guide](../secret-syncs/aws-parameter-store) to set up the integration. Pause once you reach the step where it asks you to select the path you would like to sync. amplify app id 1. Open your AWS Amplify App console. 2. Go to **Actions >> View App Settings** 3. The App ID will be the last part of the App ARN field after the slash. You need to set the path in the format `/amplify/[amplify_app_id]/[your-amplify-environment-name]` as the path option in AWS SSM Parameter Infisical Integration. Accessing an environment secret during a build is similar to accessing environment variables, except that environment secrets are stored in `process.env.secrets` as a JSON string. --- # Source: https://infisical.com/docs/documentation/platform/identities/aws-auth.md > ## Documentation Index > Fetch the complete documentation index at: https://infisical.com/docs/llms.txt > Use this file to discover all available pages before exploring further. # AWS Auth > Learn how to authenticate with Infisical for EC2 instances, Lambda functions, and other IAM principals. **AWS Auth** is an AWS-native authentication method for IAM principals like EC2 instances or Lambda functions to access Infisical. ## Diagram The following sequence diagram illustrates the AWS Auth workflow for authenticating AWS IAM principals with Infisical. ```mermaid theme={"dark"} sequenceDiagram participant Client as Client participant Infis as Infisical participant AWS as AWS STS Note over Client,Client: Step 1: Sign GetCallerIdentityQuery Note over Client,Infis: Step 2: Login Operation Client->>Infis: Send signed query details /api/v1/auth/aws-auth/login Note over Infis,AWS: Step 3: Query verification Infis->>AWS: Forward signed GetCallerIdentity query AWS-->>Infis: Return IAM user/role details Note over Infis: Step 4: Identity Property Validation Infis->>Client: Return short-lived access token Note over Client,Infis: Step 5: Access Infisical API with Token Client->>Infis: Make authenticated requests using the short-lived access token ``` ## Concept At a high-level, Infisical authenticates an IAM principal by verifying its identity and checking that it meets specific requirements (e.g. it is an allowed IAM principal ARN) at the `/api/v1/auth/aws-auth/login` endpoint. If successful, then Infisical returns a short-lived access token that can be used to make authenticated requests to the Infisical API. To be more specific: 1. The client IAM principal signs a `GetCallerIdentity` query using the [AWS Signature v4 algorithm](https://docs.aws.amazon.com/IAM/latest/UserGuide/create-signed-request.html); this is done using the credentials from the AWS environment where the IAM principal is running. 2. The client sends the signed query data to Infisical including the request method, request body, and request headers at the `/api/v1/auth/aws-auth/login` endpoint. 3. Infisical reconstructs the query and sends it to AWS STS API via the [sts:GetCallerIdentity](https://docs.aws.amazon.com/STS/latest/APIReference/API_GetCallerIdentity.html) method for verification and obtains the identity associated with the IAM principal. 4. Infisical checks the identity's properties against set criteria such **Allowed Principal ARNs**. 5. If all is well, Infisical returns a short-lived access token that the IAM principal can use to make authenticated requests to the Infisical API. We recommend using one of Infisical's clients like SDKs or the Infisical Agent to authenticate with Infisical using AWS Auth as they handle the authentication process including the signed `GetCallerIdentity` query construction for you. Also, note that Infisical needs network-level access to send requests to the AWS STS API as part of the AWS Auth workflow. ## Guide In the following steps, we explore how to create and use identities for your workloads and applications on AWS to access the Infisical API using the AWS Auth authentication method. To create an identity, head to your Organization Settings > Access Control > Identities and press **Create identity**. identities organization When creating an identity, you specify an organization level [role](/documentation/platform/access-controls/role-based-access-controls) for it to assume; you can configure roles in Organization Settings > Access Control > Organization Roles. identities organization create Now input a few details for your new identity. Here's some guidance for each field: * Name (required): A friendly name for the identity. * Role (required): A role from the **Organization Roles** tab for the identity to assume. The organization role assigned will determine what organization level resources this identity can have access to. Once you've created an identity, you'll be redirected to a page where you can manage the identity. identities page Since the identity has been configured with Universal Auth by default, you should re-configure it to use AWS Auth instead. To do this, press to edit the **Authentication** section, remove the existing Universal Auth configuration, and add a new AWS Auth configuration onto the identity. identities page remove default auth identities create aws auth method Here's some more guidance on each field: * Allowed Principal ARNs: A comma-separated list of trusted IAM principal ARNs that are allowed to authenticate with Infisical. The values should take one of three forms: `arn:aws:iam::123456789012:user/MyUserName`, `arn:aws:iam::123456789012:role/MyRoleName`, or `arn:aws:iam::123456789012:*`. Using a wildcard in this case allows any IAM principal in the account `123456789012` to authenticate with Infisical under the identity. * Allowed Account IDs: A comma-separated list of trusted AWS account IDs that are allowed to authenticate with Infisical. * STS Endpoint (default is `https://sts.amazonaws.com/`): The endpoint URL for the AWS STS API. This value should be adjusted based on the AWS region you are operating in (e.g. `https://sts.us-east-1.amazonaws.com/`); refer to the list of regional STS endpoints [here](https://docs.aws.amazon.com/general/latest/gr/sts.html). * Access Token TTL (default is `2592000` equivalent to 30 days): The lifetime for an acccess token in seconds. This value will be referenced at renewal time. * Access Token Max TTL (default is `2592000` equivalent to 30 days): The maximum lifetime for an acccess token in seconds. This value will be referenced at renewal time. * Access Token Max Number of Uses (default is `0`): The maximum number of times that an access token can be used; a value of `0` implies infinite number of uses. * Access Token Trusted IPs: The IPs or CIDR ranges that access tokens can be used from. By default, each token is given the `0.0.0.0/0`, allowing usage from any network address. To enable the identity to access project-level resources such as secrets within a specific project, you should add it to that project. To do this, head over to the project you want to add the identity to and go to Project Settings > Access Control > Machine Identities and press **Add identity**. Next, select the identity you want to add to the project and the project level role you want to allow it to assume. The project role assigned will determine what project level resources this identity can have access to. identities project identities project create To access the Infisical API as the identity, you need to construct a signed `GetCallerIdentity` query using the [AWS Signature v4 algorithm](https://docs.aws.amazon.com/IAM/latest/UserGuide/create-signed-request.html) and make a request to the `/api/v1/auth/aws-auth/login` endpoint containing the query data in exchange for an access token. We provide a few code examples below of how you can authenticate with Infisical from inside a Lambda function, EC2 instance, etc. and obtain an access token to access the [Infisical API](/api-reference/overview/introduction). The following query construction is an example of how you can authenticate with Infisical from inside a Lambda function. The shown example uses Node.js but you can use other languages supported by AWS Lambda. ```javascript theme={"dark"} import AWS from "aws-sdk"; import axios from "axios"; export const handler = async (event, context) => { try { const region = process.env.AWS_REGION; AWS.config.update({ region }); const iamRequestURL = `https://sts.${region}.amazonaws.com/`; const iamRequestBody = "Action=GetCallerIdentity&Version=2011-06-15"; const iamRequestHeaders = { "Content-Type": "application/x-www-form-urlencoded; charset=utf-8", Host: `sts.${region}.amazonaws.com`, }; // Create the request const request = new AWS.HttpRequest(iamRequestURL, region); request.method = "POST"; request.headers = iamRequestHeaders; request.headers["X-Amz-Date"] = AWS.util.date .iso8601(new Date()) .replace(/[:-]|\.\d{3}/g, ""); request.body = iamRequestBody; request.headers["Content-Length"] = Buffer.byteLength(iamRequestBody).toString(); // Sign the request const signer = new AWS.Signers.V4(request, "sts"); signer.addAuthorization(AWS.config.credentials, new Date()); const infisicalUrl = "https://app.infisical.com"; // or your self-hosted Infisical URL const identityId = ""; const { data } = await axios.post( `${infisicalUrl}/api/v1/auth/aws-auth/login`, { identityId, iamHttpRequestMethod: "POST", iamRequestUrl: Buffer.from(iamRequestURL).toString("base64"), iamRequestBody: Buffer.from(iamRequestBody).toString("base64"), iamRequestHeaders: Buffer.from( JSON.stringify(iamRequestHeaders) ).toString("base64"), } ); console.log("result data: ", data); // access token here } catch (err) { console.error(err); } }; ``` The following query construction is an example of how you can authenticate with Infisical from inside a EC2 instance. The shown example uses Node.js but you can use other language you wish. ```javascript theme={"dark"} import AWS from "aws-sdk"; import axios from "axios"; const main = async () => { try { // obtain region from EC2 instance metadata const tokenResponse = await axios.put("http://169.254.169.254/latest/api/token", null, { headers: { "X-aws-ec2-metadata-token-ttl-seconds": "21600" } }); const url = "http://169.254.169.254/latest/dynamic/instance-identity/document"; const response = await axios.get(url, { headers: { "X-aws-ec2-metadata-token": tokenResponse.data } }); const region = response.data.region; AWS.config.update({ region }); const iamRequestURL = `https://sts.${region}.amazonaws.com/`; const iamRequestBody = "Action=GetCallerIdentity&Version=2011-06-15"; const iamRequestHeaders = { "Content-Type": "application/x-www-form-urlencoded; charset=utf-8", Host: `sts.${region}.amazonaws.com` }; const request = new AWS.HttpRequest(new AWS.Endpoint(iamRequestURL), AWS.config.region); request.method = "POST"; request.headers = iamRequestHeaders; request.headers["X-Amz-Date"] = AWS.util.date.iso8601(new Date()).replace(/[:-]|\.\d{3}/g, ""); request.body = iamRequestBody; request.headers["Content-Length"] = Buffer.byteLength(iamRequestBody); const signer = new AWS.Signers.V4(request, "sts"); signer.addAuthorization(AWS.config.credentials, new Date()); const infisicalUrl = "https://app.infisical.com"; // or your self-hosted Infisical URL const identityId = ""; const { data } = await axios.post(`${infisicalUrl}/api/v1/auth/aws-auth/login`, { identityId, iamHttpRequestMethod: "POST", iamRequestUrl: Buffer.from(iamRequestURL).toString("base64"), iamRequestBody: Buffer.from(iamRequestBody).toString("base64"), iamRequestHeaders: Buffer.from(JSON.stringify(iamRequestHeaders)).toString("base64") }); console.log("result data: ", data); // access token here } catch (err) { console.error(err); } } main(); ``` The following query construction provides a generic example of how you can construct a signed `GetCallerIdentity` query and obtain the required payload components. The shown example uses Node.js but you can use any language you wish. ```javascript theme={"dark"} const AWS = require("aws-sdk"); const region = ""; const infisicalUrl = "https://app.infisical.com"; // or your self-hosted Infisical URL const iamRequestURL = `https://sts.${region}.amazonaws.com/`; const iamRequestBody = "Action=GetCallerIdentity&Version=2011-06-15"; const iamRequestHeaders = { "Content-Type": "application/x-www-form-urlencoded; charset=utf-8", Host: `sts.${region}.amazonaws.com` }; const request = new AWS.HttpRequest(new AWS.Endpoint(iamRequestURL), region); request.method = "POST"; request.headers = iamRequestHeaders; request.headers["X-Amz-Date"] = AWS.util.date.iso8601(new Date()).replace(/[:-]|\.\d{3}/g, ""); request.body = iamRequestBody; request.headers["Content-Length"] = Buffer.byteLength(iamRequestBody); const signer = new AWS.Signers.V4(request, "sts"); signer.addAuthorization(AWS.config.credentials, new Date()); ``` #### Sample request ```bash Request theme={"dark"} curl --location --request POST 'https://app.infisical.com/api/v1/auth/aws-auth/login' \ --header 'Content-Type: application/x-www-form-urlencoded' \ --data-urlencode 'identityId=...' \ --data-urlencode 'iamHttpRequestMethod=...' \ --data-urlencode 'iamRequestBody=...' \ --data-urlencode 'iamRequestHeaders=...' ``` Note that you should replace `` with the ID of the identity you created in step 1. #### Sample response ```bash Response theme={"dark"} { "accessToken": "...", "expiresIn": 7200, "accessTokenMaxTTL": 43244 "tokenType": "Bearer" } ``` Next, you can use the access token to access the [Infisical API](/api-reference/overview/introduction) The following query construction is an example of how you can authenticate with Infisical from inside an EKS pod. The shown example uses Node.js Typescript but you can use any language you wish. ```javascript theme={"dark"} import axios from "axios"; import { Sha256 } from "@aws-crypto/sha256-js"; import { fromNodeProviderChain } from "@aws-sdk/credential-providers"; import { HttpRequest } from "@aws-sdk/protocol-http"; import { SignatureV4 } from "@aws-sdk/signature-v4"; const main = async () => { try { const tokenRes = await axios.put("http://169.254.169.254/latest/api/token", undefined, { headers: { "X-aws-ec2-metadata-token-ttl-seconds": "21600" } }); const { data: { region } } = await axios.get<{ region: string }>("http://169.254.169.254/latest/dynamic/instance-identity/document", { headers: { "X-aws-ec2-metadata-token": tokenRes.data, Accept: "application/json" } }); const credentials = await fromNodeProviderChain()(); if (!credentials.accessKeyId || !credentials.secretAccessKey) { throw new Error("Credentials not found"); } const iamRequestURL = `https://sts.${region}.amazonaws.com/`; const iamRequestBody = "Action=GetCallerIdentity&Version=2011-06-15"; const iamRequestHeaders = { "Content-Type": "application/x-www-form-urlencoded; charset=utf-8", Host: `sts.${region}.amazonaws.com` }; const request = new HttpRequest({ protocol: "https:", hostname: `sts.${region}.amazonaws.com`, path: "/", method: "POST", headers: { ...iamRequestHeaders, "Content-Length": String(Buffer.byteLength(iamRequestBody)) }, body: iamRequestBody }); const signer = new SignatureV4({ credentials, region, service: "sts", sha256: Sha256 }); const signedRequest = await signer.sign(request); const headers: Record = {}; Object.entries(signedRequest.headers).forEach(([key, value]) => { if (typeof value === "string") headers[key] = value; }); const iamRequest = { iamHttpRequestMethod: "POST", iamRequestUrl: iamRequestURL, iamRequestBody: iamRequestBody, iamRequestHeaders: headers }; const { data: { accessToken } } = await axios.post<{ accessToken: string }>("https://app.infisical.com/api/v1/auth/aws-auth/login", { ...iamRequest, identityId: "" }); console.log(`Infisical Access Token: ${accessToken}`); } catch (e) { console.error("Failed to do AWS auth", e); } }; ``` We recommend using one of Infisical's clients like SDKs or the Infisical Agent to authenticate with Infisical using AWS Auth as they handle the authentication process including the signed `GetCallerIdentity` query construction for you. Each identity access token has a time-to-live (TTL) which you can infer from the response of the login operation; the default TTL is `7200` seconds which can be adjusted. If an identity access token expires, it can no longer authenticate with the Infisical API. In this case, a new access token should be obtained by performing another login operation. --- # Source: https://infisical.com/docs/documentation/platform/pki/certificate-syncs/aws-certificate-manager.md > ## Documentation Index > Fetch the complete documentation index at: https://infisical.com/docs/llms.txt > Use this file to discover all available pages before exploring further. # AWS Certificate Manager > Learn how to configure an AWS Certificate Manager Certificate Sync for Infisical PKI. **Prerequisites:** * Create an [AWS Connection](/integrations/app-connections/aws) The AWS Certificate Manager Certificate Sync requires the following ACM permissions to be set on the IAM user/role for Infisical to sync certificates to AWS Certificate Manager: `acm:ListCertificates`, `acm:DescribeCertificate`, `acm:ImportCertificate`, `acm:DeleteCertificate`, and `acm:ListTagsForCertificate`. These permissions allow Infisical to list, import, tag, and manage certificates in your AWS Certificate Manager service. Certificates synced to AWS Certificate Manager will be stored as imported certificates, preserving both the certificate and private key components. 1. Navigate to **Project** > **Integrations** > **Certificate Syncs** and press **Add Sync**. Certificate Syncs Tab 2. Select the **AWS Certificate Manager** option. Select ACM 3. Configure the **Destination** to where certificates should be deployed, then click **Next**. Configure Destination * **AWS Connection**: The AWS Connection to authenticate with. * **AWS Region**: The AWS region where certificates should be stored. 4. Configure the **Sync Options** to specify how certificates should be synced, then click **Next**. Configure Options * **Enable Removal of Expired/Revoked Certificates**: If enabled, Infisical will remove certificates from the destination if they are no longer active in Infisical. * **Preserve ARN on Renewal**: If enabled, Infisical will sync renewed certificates to the destination under the same ARN as the original synced certificate instead of creating a new certificate with a new ARN. * **Include Root CA**: If enabled, the Root CA certificate will be included in the certificate chain when syncing to AWS Certificate Manager. If disabled, only intermediate certificates will be included. * **Certificate Name Schema** (Optional): Customize how certificate tags are generated in AWS Certificate Manager. Must include `{{certificateId}}` as a placeholder for the certificate ID to ensure proper certificate identification and management. If not specified, defaults to `Infisical-{{certificateId}}`. * **Auto-Sync Enabled**: If enabled, certificates will automatically be synced when changes occur. Disable to enforce manual syncing only. 5. Configure the **Details** of your AWS Certificate Manager Certificate Sync, then click **Next**. Configure Details * **Name**: The name of your sync. Must be slug-friendly. * **Description**: An optional description for your sync. 6. Select which certificates should be synced to AWS Certificate Manager. Select Certificates 7. Review your AWS Certificate Manager Certificate Sync configuration, then click **Create Sync**. Confirm Configuration 8. If enabled, your AWS Certificate Manager Certificate Sync will begin syncing your certificates to the destination endpoint. Sync Certificates To create an **AWS Certificate Manager Certificate Sync**, make an API request to the [Create AWS Certificate Manager Certificate Sync](/api-reference/endpoints/pki/syncs/aws-certificate-manager/create) API endpoint. ### Sample request You can optionally specify `certificateIds` during sync creation to immediately add certificates to the sync. If not provided, you can add certificates later using the certificate management endpoints. ```bash Request theme={"dark"} curl --request POST \ --url https://app.infisical.com/api/v1/cert-manager/syncs/aws-certificate-manager \ --header 'Authorization: Bearer ' \ --header 'Content-Type: application/json' \ --data '{ "name": "my-acm-cert-sync", "projectId": "3c90c3cc-0d44-4b50-8888-8dd25736052a", "description": "an example certificate sync", "connectionId": "3c90c3cc-0d44-4b50-8888-8dd25736052a", "destination": "aws-certificate-manager", "isAutoSyncEnabled": true, "certificateIds": [ "550e8400-e29b-41d4-a716-446655440000", "660f1234-e29b-41d4-a716-446655440001" ], "syncOptions": { "canRemoveCertificates": true, "preserveArnOnRenewal": true, "includeRootCa": false, "certificateNameSchema": "myapp-{{certificateId}}" }, "destinationConfig": { "region": "us-east-1" } }' ``` ### Sample response ```json Response theme={"dark"} { "pkiSync": { "id": "3c90c3cc-0d44-4b50-8888-8dd25736052a", "name": "my-acm-cert-sync", "description": "an example certificate sync", "destination": "aws-certificate-manager", "isAutoSyncEnabled": true, "destinationConfig": { "region": "us-east-1" }, "syncOptions": { "canRemoveCertificates": true, "preserveArnOnRenewal": true, "includeRootCa": false, "certificateNameSchema": "myapp-{{certificateId}}" }, "projectId": "3c90c3cc-0d44-4b50-8888-8dd25736052a", "connectionId": "3c90c3cc-0d44-4b50-8888-8dd25736052a", "createdAt": "2023-01-01T00:00:00.000Z", "updatedAt": "2023-01-01T00:00:00.000Z" } } ``` ## Certificate Management Your AWS Certificate Manager Certificate Sync will: * **Automatic Deployment**: Deploy certificates in Infisical to AWS Certificate Manager. * **Certificate Updates**: Update certificates in AWS Certificate Manager when renewals occur. * **Expiration Handling**: Optionally remove expired certificates from AWS Certificate Manager (if enabled). * **Tagging**: Automatically tag certificates with an InfisicalCertificate tag for easy identification and management AWS Certificate Manager Certificate Syncs support both automatic and manual synchronization modes. When auto-sync is enabled, certificates are automatically deployed as they are issued or renewed. ## Manual Certificate Sync You can manually trigger certificate synchronization to AWS Certificate Manager using the sync certificates functionality. This is useful for: * Initial setup when you have existing certificates to deploy * One-time sync of specific certificates * Testing certificate sync configurations * Force sync after making changes To manually sync certificates, use the [Sync Certificates](/api-reference/endpoints/pki/syncs/aws-certificate-manager/sync-certificates) API endpoint or the manual sync option in the Infisical UI. AWS Certificate Manager does not support importing certificates back into Infisical due to security limitations where private keys cannot be extracted from AWS Certificate Manager. Only certificates imported into ACM (not AWS-issued certificates) can be managed by the sync. --- # Source: https://infisical.com/docs/self-hosting/reference-architectures/aws-ecs.md > ## Documentation Index > Fetch the complete documentation index at: https://infisical.com/docs/llms.txt > Use this file to discover all available pages before exploring further. # AWS ECS (HA) > Reference architecture for self-hosting Infisical on AWS ECS This guide will provide high-level architecture design for deploying the Infisical on AWS ECS and give insights into the core components, high availability strategies, and secure credential management for Infisical's root secrets. ## Overview In this guide, we'll focus on running Infisical on AWS Elastic Container Service (ECS) across multiple Availability Zones (AZs), ensuring high availability and resilience. The architecture utilizes Amazon Relational Database Service (RDS) for persistent storage, ElastiCache for Redis as an in-memory data store for caching, and Amazon Simple Email Service (SES) to handle email based communications from Infisical. AWS ECS architecture ### Core Components * **ECS Fargate:** In this architecture, Infisical is deployed on ECS using Fargate launch type. The ECS services are deployed across multiple Availability Zones to ensure high availability. * **Amazon RDS:** Infisical uses Postgres as it's persistent layer. As such, RDS for PostgreSQL is used as the database engine. The setup includes a primary instance in one AZ and a read replica in another AZ. This ensures that if there is a failure in one availability zone, the working replica will become the primary and continue processing workloads. * **Amazon ElastiCache for Redis:** To enhance performance, Infisical requires Redis. In this architecture, Redis is set up with a primary and standby replication group across two AZs to increase availability. * **Amazon Simple Email Service (SES):** Infisical requires email service to facilitate outbound communication. AWS SES is integrated into the architecture to handle such communication. ### Network Setup * **Public Subnets:** Each Availability Zone contains a public subnet. There are two main reasons you might need internet access. First, if you intend to use Infisical to communicate with external secrets managers not located within your virtual private network, enabling internet access is necessary. Second, downloading the Docker image from Docker Hub requires internet access, though this can be avoided by utilizing AWS ECR with VPC Endpoints through AWS Private Link. * **NAT Gateway:** This is used to route outbound requests from Infisical to the internet and is only used to communicate with external secrets manager and or downloading container images. ### Securing Infisical's root credential * **Parameter Store:** To secure Infisical's root credentials (database connection string, encryption key, etc), we highly recommend that you use AWS Parameter Store and only allow the tasks running Infisical to access them. * **AWS Secrets Manager:** We strongly advise securing the master credentials for RDS by utilizing the latest AWS RDS integration with AWS Secrets Manager. This integration automatically stores the master database user's credentials in AWS Secrets Manager, thereby reducing the risk of misplacing the root RDS credential. ### High Availability (HA) and Scalability * **Multi-AZ Deployment:** By spreading resources across multiple Availability Zones, we ensure that if one AZ experiences issues, traffic can be redirected to the remaining healthy AZ without service interruption. * **Auto Scaling:** AWS Auto Scaling is in place to adjust capacity to maintain steady and predictable performance at the lowest possible cost. * **Cross-Region Deployment:** For even greater high availability, you may deploy Infisical across multiple regions. This extends the HA capabilities of the architecture and protects against regional service disruptions. ### Frequently asked questions Yes, Infisical can function in an air-gapped environment. To do so, update your ECS task to use the publicly available AWS Elastic Container Registry (ECR) image instead of the default Docker Hub image. Additionally, it's necessary to configure VPC endpoints, which allows your system to access AWS ECR via a private network route instead of the internet, ensuring all connectivity remains within the secure, private network. --- # Source: https://infisical.com/docs/documentation/platform/dynamic-secrets/aws-elasticache.md > ## Documentation Index > Fetch the complete documentation index at: https://infisical.com/docs/llms.txt > Use this file to discover all available pages before exploring further. # AWS ElastiCache > Learn how to dynamically generate AWS ElastiCache user credentials. The Infisical AWS ElastiCache dynamic secret allows you to generate AWS ElastiCache credentials on demand based on configured role. ## Prerequisites 2. Create an AWS IAM user with the following permissions: ```json theme={"dark"} { "Version": "2012-10-17", "Statement": [ { "Sid": "", "Effect": "Allow", "Action": [ "elasticache:DescribeUsers", "elasticache:ModifyUser", "elasticache:CreateUser", "elasticache:CreateUserGroup", "elasticache:DeleteUser", "elasticache:DescribeReplicationGroups", "elasticache:DescribeUserGroups", "elasticache:ModifyReplicationGroup", "elasticache:ModifyUserGroup" ], "Resource": "arn:aws:elasticache:::user:*" } ] } ``` 3. Create an access key ID and secret access key for the user you created in the previous step. You will need these to configure the Infisical dynamic secret. New leases may take up-to a couple of minutes before ElastiCache has the chance to complete their configuration. It is recommended to use a retry strategy when establishing new ElastiCache connections. This may prevent errors when trying to use a password that isn't yet live on the targeted ElastiCache cluster. While a leasing is being created, you will be unable to create new leases for the same dynamic secret. Please ensure that your ElastiCache cluster has transit encryption enabled and set to required. This is required for the dynamic secret to work. ## Set up Dynamic Secrets with AWS ElastiCache Open the Secret Overview dashboard and select the environment in which you would like to add a dynamic secret. Add Dynamic Secret Button Dynamic Secret Modal Name by which you want the secret to be referenced Default time-to-live for a generated secret (it is possible to modify this value after a secret is generated) Maximum time-to-live for a generated secret. The region that the ElastiCache cluster is located in. *(e.g. us-east-1)* This is the access key ID of the AWS IAM user you created in the prerequisites. This will be used to provision and manage the dynamic secret leases. This is the secret access key of the AWS IAM user you created in the prerequisites. This will be used to provision and manage the dynamic secret leases. A CA may be required if your DB requires it for incoming connections. This is often the case when connecting to a managed service. Modify ElastiCache Statements Modal Specifies a template for generating usernames. This field allows customization of how usernames are automatically created. Allowed template variables are: * `{{randomUsername}}`: Random username string. * `{{unixTimestamp}}`: Current Unix timestamp at the time of lease creation. * `{{identity.name}}`: Name of the identity that is generating the lease. * `{{dynamicSecret.name}}`: Name of the associated dynamic secret. * `{{dynamicSecret.type}}`: Type of the associated dynamic secret. * `{{random N}}`: Random string of N characters. Allowed template functions are: * `truncate`: Truncates a string to a specified length. * `replace`: Replaces a substring with another value. * `uppercase`: Converts a string to uppercase. * `lowercase`: Converts a string to lowercase. Examples: ```yaml theme={"dark"} {{ randomUsername }} // 3POnzeFyK9gW2nioK0q2gMjr6CZqsRiX {{ unixTimestamp }} // 17490641580 {{ identity.name }} // {{ random 5 }} // x9K2m {{ truncate identity.name 4 }} // test {{ replace identity.name '' 'new-value' }} // new-value ``` If you want to provide specific privileges for the generated dynamic credentials, you can modify the ElastiCache statement to your needs. This is useful if you want to only give access to a specific resource. After submitting the form, you will see a dynamic secret created in the dashboard. If this step fails, you may have to add the CA certificate. Once you've successfully configured the dynamic secret, you're ready to generate on-demand credentials. To do this, simply click on the 'Generate' button which appears when hovering over the dynamic secret item. Alternatively, you can initiate the creation of a new lease by selecting 'New Lease' from the dynamic secret lease list section. Dynamic Secret Dynamic Secret When generating these secrets, it's important to specify a Time-to-Live (TTL) duration. This will dictate how long the credentials are valid for. Provision Lease Ensure that the TTL for the lease falls within the maximum TTL defined when configuring the dynamic secret. Once you click the `Submit` button, a new secret lease will be generated and the credentials from it will be shown to you. Provision Lease ## Audit or Revoke Leases Once you have created one or more leases, you will be able to access them by clicking on the respective dynamic secret item on the dashboard. This will allow you to see the expiration time of the lease or delete a lease before it's set time to live. Provision Lease ## Renew Leases To extend the life of the generated dynamic secret leases past its initial time to live, simply click on the **Renew** button as illustrated below. Provision Lease Lease renewals cannot exceed the maximum TTL set when configuring the dynamic secret --- # Source: https://infisical.com/docs/documentation/platform/kms-configuration/aws-hsm.md > ## Documentation Index > Fetch the complete documentation index at: https://infisical.com/docs/llms.txt > Use this file to discover all available pages before exploring further. # AWS CloudHSM > Learn how to manage encryption using AWS CloudHSM This guide provides instructions on securing Infisical project secrets using AWS CloudHSM. Integration with AWS CloudHSM is achieved by configuring it as a custom key store for AWS KMS. Follow the steps below to set up AWS KMS with AWS CloudHSM as the custom key store. ## Prepare AWS CloudHSM Cluster Before you get started, you'll need to configure a AWS CloudHSM cluster which meets the following criteria: * The cluster must be active. * The cluster must not be associated with any other AWS KMS custom key store. * The cluster must be configured with private subnets in at least two Availability Zones in the Region. * The security group for the cluster must include inbound and outbound rules that allow TCP traffic on ports 2223-2225. * The cluster must contain at least two active HSMs in different Availability Zones. For more details on setting up your cluster, refer to the following [AWS documentation](https://docs.aws.amazon.com/kms/latest/developerguide/create-keystore.html#before-keystore). ## Set Up AWS KMS Custom Key Store To set up an AWS KMS custom key store with AWS CloudHSM, you will need the following: * The trust anchor certificate of your AWS CloudHSM cluster. * A `kmsuser` user in the AWS CloudHSM cluster with the crypto-user role. In the AWS console, head over to `AWS KMS` > `AWS CloudHSM key stores` and click **Create key store**. Input the custom key store name. Set key store name Select the AWS CloudHSM cluster. You should be able to select the cluster if it meets the required criteria mentioned above. Set key store cluster Upload your CloudHSM's cluster trust anchor certificate file. Set key store cert Input the password of the `kmsuser` crypto-user in your cluster. Set key store password Proceed with creating the AWS CloudHSM key store. For more details, refer to the following [AWS documentation](https://docs.aws.amazon.com/kms/latest/developerguide/create-keystore.html#create-keystore-console). ## Create AWS KMS Key Next, you'll need to create a AWS KMS key where you will set the key store you created previously. In your AWS console, proceed to `AWS KMS` > `Customer managed keys` and click **Create**. Set Key type to `Symmetric` and Key usage to `Encrypt and decrypt`. Set key options 1 In the advanced options, for the Key material origin field, select `AWS CloudHSM key store`. Then, click next. Set key options 2 Select the AWS CloudHSM key store you created earlier. Select HSM 1 Proceed with creating the AWS KMS Key. ## Connect Infisical to AWS KMS Key You should now have an AWS KMS that has a custom key store set to AWS CloudHSM. To secure project resources, you will need to add this AWS KMS to your Infisical organization. To learn how, refer to the documentation [here](./aws-kms). --- # Source: https://infisical.com/docs/documentation/platform/secret-rotation/aws-iam-user-secret.md > ## Documentation Index > Fetch the complete documentation index at: https://infisical.com/docs/llms.txt > Use this file to discover all available pages before exploring further. # AWS IAM User > Learn how to automatically rotate Access Key Id and Secret Key of AWS IAM Users. Infisical's AWS IAM User secret rotation capability lets you update the **Access key** and **Secret access key** credentials of a target IAM user from within Infisical at a specified interval or on-demand. ## Prerequisites * Create an [AWS Connection](/integrations/app-connections/aws) with the required **Secret Rotation** permissions * Make sure to add the following permissions to your IAM Role/IAM User Permission policy set used by your AWS Connection: ```json theme={"dark"} { "Version": "2012-10-17", "Statement": [ { "Effect": "Allow", "Action": [ "iam:ListAccessKeys", "iam:CreateAccessKey", "iam:UpdateAccessKey", "iam:DeleteAccessKey", "iam:ListUsers" ], "Resource": "*" } ] } ``` ## Workflow The typical workflow for using the AWS IAM User rotation strategy consists of four steps: 1. Creating the target IAM user whose credentials you wish to rotate. 2. Configuring the rotation strategy in Infisical with the credentials of the managing IAM user. 3. Pressing the **Rotate** button in the Infisical dashboard to trigger the rotation of the target IAM user's credentials. The strategy can also be configured to rotate the credentials automatically at a specified interval. In the following steps, we explore the end-to-end workflow for setting up this strategy in Infisical. To begin, create an IAM user whose credentials you wish to rotate. If you already have an IAM user, then you can skip this step. 1. Navigate to your Secret Manager Project's Dashboard and select **Add Secret Rotation** from the actions dropdown. Secret Manager Dashboard 2. Select the **AWS IAM User Secret** option. Select AWS IAM User Secret 3. Select the **AWS Connection** to use and configure the rotation behavior. Then click **Next**. Rotation Configuration * **AWS Connection** - the connection that will perform the rotation of the specified application's Client Secret. * **Rotation Interval** - the interval, in days, that once elapsed will trigger a rotation. * **Rotate At** - the local time of day when rotation should occur once the interval has elapsed. * **Auto-Rotation Enabled** - whether secrets should automatically be rotated once the rotation interval has elapsed. Disable this option to manually rotate secrets or pause secret rotation. 4. Select the AWS IAM user and the region of the user whose credentials you want to rotate. Then click **Next**. Rotation Parameters 5. Specify the secret names that the AWS IAM access key credentials should be mapped to. Then click **Next**. Rotation Secrets Mapping * **Access Key ID** - the name of the secret that the AWS access key ID will be mapped to. * **Secret Access Key** - the name of the secret that the rotated secret access key will be mapped to. 6. Give your rotation a name and description (optional). Then click **Next**. Rotation Details * **Name** - the name of the secret rotation configuration. Must be slug-friendly. * **Description** (optional) - a description of this rotation configuration. 7. Review your configuration, then click **Create Secret Rotation**. Rotation Review 8. Your **AWS IAM User** credentials are now available for use via the mapped secrets. Rotation Created To create an AWS IAM User Rotation, make an API request to the [Create AWS IAM User Rotation](/api-reference/endpoints/secret-rotations/aws-iam-user-secret/create) API endpoint. You will first need the **User Name** of the AWS IAM user you want to rotate the secret for. This can be obtained from the IAM console, on Users tab. Users ### Sample request ```bash Request theme={"dark"} curl --request POST \ --url https://us.infisical.com/api/v2/secret-rotations/aws-iam-user-secret \ --header 'Content-Type: application/json' \ --data '{ "name": "my-aws-rotation", "projectId": "9602cfc5-20b9-4c35-a056-dd7372db0f25", "description": "My rotation strategy description", "connectionId": "3c90c3cc-0d44-4b50-8888-8dd25736052a", "environment": "dev", "secretPath": "/", "isAutoRotationEnabled": true, "rotationInterval": 2, "rotateAtUtc": { "hours": 11.5, "minutes": 29.5 }, "parameters": { "userName": "testUser", "region": "us-east-1" }, "secretsMapping": { "accessKeyId": "AWS_ACCESS_KEY_ID", "secretAccessKey": "AWS_SECRET_ACCESS_KEY" } }' ``` ### Sample response ```bash Response theme={"dark"} { "secretRotation": { "id": "3c90c3cc-0d44-4b50-8888-8dd25736052a", "name": "my-aws-rotation", "description": "My rotation strategy description", "secretsMapping": { "accessKeyId": "AWS_ACCESS_KEY_ID", "secretAccessKey": "AWS_SECRET_ACCESS_KEY" }, "isAutoRotationEnabled": true, "activeIndex": 0, "folderId": "3c90c3cc-0d44-4b50-8888-8dd25736052a", "connectionId": "3c90c3cc-0d44-4b50-8888-8dd25736052a", "createdAt": "2023-11-07T05:31:56Z", "updatedAt": "2023-11-07T05:31:56Z", "rotationInterval": 123, "rotationStatus": "success", "lastRotationAttemptedAt": "2023-11-07T05:31:56Z", "lastRotatedAt": "2023-11-07T05:31:56Z", "lastRotationJobId": null, "nextRotationAt": "2023-11-07T05:31:56Z", "isLastRotationManual": true, "connection": { "app": "aws", "name": "my-aws-connection", "id": "3c90c3cc-0d44-4b50-8888-8dd25736052a" }, "environment": { "slug": "dev", "name": "Development", "id": "3c90c3cc-0d44-4b50-8888-8dd25736052a" }, "projectId": "9602cfc5-20b9-4c35-a056-dd7372db0f25", "folder": { "id": "3c90c3cc-0d44-4b50-8888-8dd25736052a", "path": "/" }, "rotateAtUtc": { "hours": 11.5, "minutes": 29.5 }, "lastRotationMessage": null, "type": "aws-iam-user-secret", "parameters": { "userName": "testUser", "region": "us-east-1" } } } ``` **FAQ** There are a few reasons for why this might happen: * The strategy configuration is invalid (e.g. the managing IAM user's credentials are incorrect, the target AWS region is incorrect, etc.) * The managing IAM user is insufficiently permissioned to rotate the credentials of the target IAM user. For instance, you may have setup [paths](https://aws.amazon.com/blogs/security/optimize-aws-administration-with-iam-paths/) for the managing IAM user and the policy does not have the necessary permissions to rotate the credentials. --- # Source: https://infisical.com/docs/documentation/platform/pam/getting-started/resources/aws-iam.md # Source: https://infisical.com/docs/documentation/platform/dynamic-secrets/aws-iam.md > ## Documentation Index > Fetch the complete documentation index at: https://infisical.com/docs/llms.txt > Use this file to discover all available pages before exploring further. # AWS IAM > Learn how to dynamically generate AWS IAM Users. The Infisical AWS IAM dynamic secret allows you to generate AWS IAM Users and temporary credentials on demand based on a configured AWS policy. Infisical supports several authentication methods to connect to your AWS account, including assuming an IAM Role, using IAM Roles for Service Accounts (IRSA) on EKS, or static Access Keys. ## AWS STS Duration Limits When using **Temporary Credentials**, AWS STS has specific maximum duration limits: * **AssumeRole operations**: Maximum 1 hour (3600 seconds) when using temporary credentials * **GetSessionToken operations** (Access Key & IRSA): Maximum 12 hours (43200 seconds) **Automatic Duration Adjustment**: If you specify a TTL that exceeds these AWS limits, Infisical will automatically use the maximum allowed duration instead of failing the operation. This ensures your dynamic secrets work reliably within AWS constraints. ## Prerequisite Infisical needs an AWS IAM principal (a user or a role) with the required permissions to create and manage other IAM users and temporary credentials. This principal will be responsible for the lifecycle of the dynamically generated users and temporary credentials. Required permissions for creating temporary IAM users: ```json theme={"dark"} { "Version": "2012-10-17", "Statement": [ { "Effect": "Allow", "Action": [ "iam:AttachUserPolicy", "iam:CreateAccessKey", "iam:CreateUser", "iam:DeleteAccessKey", "iam:DeleteUser", "iam:DeleteUserPolicy", "iam:DetachUserPolicy", "iam:GetUser", "iam:ListAccessKeys", "iam:ListAttachedUserPolicies", "iam:ListGroupsForUser", "iam:ListUserPolicies", "iam:PutUserPolicy", "iam:AddUserToGroup", "iam:RemoveUserFromGroup", "iam:TagUser" ], "Resource": ["*"] } ] } ``` To minimize managing user access you can attach a resource in format > arn:aws:iam::\:user/\ Replace **\** with your AWS account id and **\** with a path to minimize managing user access. Required permissions for Access Key and Assume Role methods: ```json theme={"dark"} { "Version": "2012-10-17", "Statement": [ { "Effect": "Allow", "Action": [ "sts:GetSessionToken", "sts:AssumeRole" ], "Resource": ["*"] } ] } ``` To minimize managing user access you can attach a resource in format > arn:aws:iam::\:user/\ Replace **\** with your AWS account id and **\** with a path to minimize managing user access. ## Set up Dynamic Secrets with AWS IAM Infisical will assume the provided role in your AWS account securely, without the need to share any credentials. To connect your self-hosted Infisical instance with AWS, you need to set up an AWS IAM User account that can assume the configured AWS IAM Role. If your instance is deployed on AWS, the aws-sdk will automatically retrieve the credentials. Ensure that you assign the provided permission policy to your deployed instance, such as ECS or EC2. The following steps are for instances not deployed on AWS: Navigate to [Create IAM User](https://console.aws.amazon.com/iamv2/home#/users/create) in your AWS Console. Attach the following inline permission policy to the IAM User to allow it to assume any IAM Roles: ```json theme={"dark"} { "Version": "2012-10-17", "Statement": [ { "Sid": "AllowAssumeAnyRole", "Effect": "Allow", "Action": "sts:AssumeRole", "Resource": "arn:aws:iam::*:role/*" } ] } ``` Obtain the AWS access key ID and secret access key for your IAM User by navigating to **IAM > Users > \[Your User] > Security credentials > Access keys**. Access Key Step 1 Access Key Step 2 Access Key Step 3 1. Set the access key as **DYNAMIC\_SECRET\_AWS\_ACCESS\_KEY\_ID**. 2. Set the secret key as **DYNAMIC\_SECRET\_AWS\_SECRET\_ACCESS\_KEY**. 1. Navigate to the [Create IAM Role](https://console.aws.amazon.com/iamv2/home#/roles/create?step=selectEntities) page in your AWS Console. IAM Role Creation 2. Select **AWS Account** as the **Trusted Entity Type**. 3. Select **Another AWS Account** and provide the appropriate Infisical AWS Account ID: use **381492033652** for the **US region**, and **345594589636** for the **EU region**. This restricts the role to be assumed only by Infisical. If self-hosting, provide your AWS account number instead. **For Dedicated Instances**: Your AWS account ID differs from the one provided above. Please reach out to Infisical support to obtain your AWS account ID. 4. (Recommended) Enable "Require external ID" and input your **Project ID** to strengthen security and mitigate the [confused deputy problem](https://docs.aws.amazon.com/IAM/latest/UserGuide/confused-deputy.html). 5. Assign permission as shared in prerequisite. When configuring an IAM Role that Infisical will assume, it’s highly recommended to enable the **"Require external ID"** option and specify your **Project ID**. This precaution helps protect your AWS account against the [confused deputy problem](https://docs.aws.amazon.com/IAM/latest/UserGuide/confused-deputy.html), a potential security vulnerability where Infisical could be tricked into performing actions on your behalf by an unauthorized actor. Always enable "Require external ID" and use your Project ID when setting up the IAM Role. Copy IAM Role ARN Navigate to the Secret Overview dashboard and select the environment in which you would like to add a dynamic secret to. Add Dynamic Secret Button Dynamic Secret Modal Dynamic Secret Setup Modal Name by which you want the secret to be referenced Default time-to-live for a generated secret (it is possible to modify this value after a secret is generated) Maximum time-to-live for a generated secret Specifies a template for generating usernames. This field allows customization of how usernames are automatically created. Allowed template variables are: * `{{randomUsername}}`: Random username string. * `{{unixTimestamp}}`: Current Unix timestamp at the time of lease creation. * `{{identity.name}}`: Name of the identity that is generating the lease. * `{{dynamicSecret.name}}`: Name of the associated dynamic secret. * `{{dynamicSecret.type}}`: Type of the associated dynamic secret. * `{{random N}}`: Random string of N characters. Allowed template functions are: * `truncate`: Truncates a string to a specified length. * `replace`: Replaces a substring with another value. * `uppercase`: Converts a string to uppercase. * `lowercase`: Converts a string to lowercase. Examples: ```yaml theme={"dark"} {{ randomUsername }} // 3POnzeFyK9gW2nioK0q2gMjr6CZqsRiX {{ unixTimestamp }} // 17490641580 {{ identity.name }} // {{ random 5 }} // x9K2m {{ truncate identity.name 4 }} // test {{ replace identity.name '' 'new-value' }} // new-value ``` Tags to be added to the created IAM User resource. Select *Assume Role* method. Choose the credential generation approach: * **IAM User (Default)**: Creates new temporary IAM users in your AWS account * **Temporary Credentials**: Generates temporary credentials from your role connection The ARN of the AWS Role to assume. The AWS data center region. [IAM AWS Path](https://aws.amazon.com/blogs/security/optimize-aws-administration-with-iam-paths/) to scope created IAM User resource access. The IAM Policy ARN of the [AWS Permissions Boundary](https://docs.aws.amazon.com/IAM/latest/UserGuide/access_policies_boundaries.html) to attach to IAM users created in the role. The AWS IAM groups that should be assigned to the created users. Multiple values can be provided by separating them with commas. The AWS IAM managed policies that should be attached to the created users. Multiple values can be provided by separating them with commas. The AWS IAM inline policy that should be attached to the created users. Multiple values can be provided by separating them with commas. Specifies a template for generating usernames. This field allows customization of how usernames are automatically created. Allowed template variables are: * `{{randomUsername}}`: Random username string. * `{{unixTimestamp}}`: Current Unix timestamp at the time of lease creation. * `{{identity.name}}`: Name of the identity that is generating the lease. * `{{dynamicSecret.name}}`: Name of the associated dynamic secret. * `{{dynamicSecret.type}}`: Type of the associated dynamic secret. * `{{random N}}`: Random string of N characters. Allowed template functions are: * `truncate`: Truncates a string to a specified length. * `replace`: Replaces a substring with another value. * `uppercase`: Converts a string to uppercase. * `lowercase`: Converts a string to lowercase. Examples: ```yaml theme={"dark"} {{ randomUsername }} // 3POnzeFyK9gW2nioK0q2gMjr6CZqsRiX {{ unixTimestamp }} // 17490641580 {{ identity.name }} // {{ random 5 }} // x9K2m {{ truncate identity.name 4 }} // test {{ replace identity.name '' 'new-value' }} // new-value ``` Tags to be added to the created IAM User resource. When **Credential Type** is set to **Temporary Credentials**: No additional configuration parameters are required. The generated credentials will: * Inherit the permissions of the assumed role * Include an AWS Session Token * Be valid for the duration specified in Default TTL **Duration Limit**: AssumeRole temporary credentials are limited to 1 hour maximum by AWS. TTL values exceeding this limit will be automatically adjusted to 1 hour. After submitting the form, you will see a dynamic secret created in the dashboard. Dynamic Secret Once you've successfully configured the dynamic secret, you're ready to generate on-demand credentials. To do this, simply click on the 'Generate' button which appears when hovering over the dynamic secret item. Alternatively, you can initiate the creation of a new lease by selecting 'New Lease' from the dynamic secret lease list section. Dynamic Secret Dynamic Secret When generating these secrets, it's important to specify a Time-to-Live (TTL) duration. This will dictate how long the credentials are valid for. Provision Lease Ensure that the TTL for the lease falls within the maximum TTL defined when configuring the dynamic secret in step 4. Once you click the `Submit` button, a new secret lease will be generated and the credentials for it will be shown to you. **Credentials format depends on your chosen credential type:** **IAM User credential type:** * AWS Username * AWS Access Key ID * AWS Secret Access Key **Temporary Credentials credential type:** * AWS Access Key ID * AWS Secret Access Key * AWS Session Token Provision Lease This method is recommended for self-hosted Infisical instances running on AWS EKS. It uses [IAM Roles for Service Accounts (IRSA)](https://docs.aws.amazon.com/eks/latest/userguide/iam-roles-for-service-accounts.html) to securely grant permissions to the Infisical pods without managing static credentials. In order to use IRSA, the `KUBERNETES_AUTO_FETCH_SERVICE_ACCOUNT_TOKEN` environment variable must be set to `true` for your self-hosted Infisical instance. If you don't already have one, you need to create an IAM OIDC provider for your EKS cluster. This allows IAM to trust authentication tokens from your Kubernetes cluster. 1. Find your cluster's OIDC provider URL from the EKS console or by using the AWS CLI: `aws eks describe-cluster --name --query "cluster.identity.oidc.issuer" --output text` 2. Navigate to the [IAM Identity Providers](https://console.aws.amazon.com/iam/home#/providers) page in your AWS Console and create a new OpenID Connect provider with the URL and `sts.amazonaws.com` as the audience. Create OIDC Provider Placeholder 1. Navigate to the [Create IAM Role](https://console.aws.amazon.com/iamv2/home#/roles/create?step=selectEntities) page in your AWS Console. 2. Select **Web identity** as the **Trusted Entity Type**. 3. Choose the OIDC provider you created in the previous step. 4. For the **Audience**, select `sts.amazonaws.com`. IAM Role Creation for IRSA 5. Attach the permission policy detailed in the **Prerequisite** section at the top of this page. 6. After creating the role, edit its **Trust relationship** to specify the service account Infisical is using in your cluster. This ensures only the Infisical pod can assume this role. ```json theme={"dark"} { "Version": "2012-10-17", "Statement": [ { "Effect": "Allow", "Principal": { "Federated": "arn:aws:iam:::oidc-provider/oidc.eks..amazonaws.com/id/" }, "Action": "sts:AssumeRoleWithWebIdentity", "Condition": { "StringEquals": { "oidc.eks..amazonaws.com/id/:sub": "system:serviceaccount::", "oidc.eks..amazonaws.com/id/:aud": "sts.amazonaws.com" } } } ] } ``` Replace ``, ``, ``, ``, and `` with your specific values. For the IRSA mechanism to work, the Infisical service account in your Kubernetes cluster must be annotated with the ARN of the IAM role you just created. Run the following command, replacing the placeholders with your values: ```bash theme={"dark"} kubectl annotate serviceaccount -n \ eks.amazonaws.com/role-arn=arn:aws:iam:::role/ ``` This annotation tells the EKS Pod Identity Webhook to inject the necessary environment variables and tokens into the Infisical pod, allowing it to assume the specified IAM role. Navigate to the Secret Overview dashboard and select the environment in which you would like to add a dynamic secret to. Add Dynamic Secret Button Dynamic Secret Modal Dynamic Secret Setup Modal for IRSA Name by which you want the secret to be referenced Default time-to-live for a generated secret (it is possible to modify this value after a secret is generated) Maximum time-to-live for a generated secret Specifies a template for generating usernames. This field allows customization of how usernames are automatically created. Allowed template variables are: * `{{randomUsername}}`: Random username string. * `{{unixTimestamp}}`: Current Unix timestamp at the time of lease creation. * `{{identity.name}}`: Name of the identity that is generating the lease. * `{{dynamicSecret.name}}`: Name of the associated dynamic secret. * `{{dynamicSecret.type}}`: Type of the associated dynamic secret. * `{{random N}}`: Random string of N characters. Allowed template functions are: * `truncate`: Truncates a string to a specified length. * `replace`: Replaces a substring with another value. * `uppercase`: Converts a string to uppercase. * `lowercase`: Converts a string to lowercase. Examples: ```yaml theme={"dark"} {{ randomUsername }} // 3POnzeFyK9gW2nioK0q2gMjr6CZqsRiX {{ unixTimestamp }} // 17490641580 {{ identity.name }} // {{ random 5 }} // x9K2m {{ truncate identity.name 4 }} // test {{ replace identity.name '' 'new-value' }} // new-value ``` Tags to be added to the created IAM User resource. Select *IRSA* method. Choose the credential generation approach: * **IAM User**: Creates new temporary IAM users in your AWS account * **Temporary Credentials**: Generates temporary credentials from your IRSA role connection The ARN of the AWS IAM Role for the service account to assume. The AWS data center region. [IAM AWS Path](https://aws.amazon.com/blogs/security/optimize-aws-administration-with-iam-paths/) to scope created IAM User resource access. The IAM Policy ARN of the [AWS Permissions Boundary](https://docs.aws.amazon.com/IAM/latest/UserGuide/access_policies_boundaries.html) to attach to IAM users created in the role. The AWS IAM groups that should be assigned to the created users. Multiple values can be provided by separating them with commas. The AWS IAM managed policies that should be attached to the created users. Multiple values can be provided by separating them with commas. The AWS IAM inline policy that should be attached to the created users. Multiple values can be provided by separating them with commas. Specifies a template for generating usernames. This field allows customization of how usernames are automatically created. Allowed template variables are: * `{{randomUsername}}`: Random username string. * `{{unixTimestamp}}`: Current Unix timestamp at the time of lease creation. * `{{identity.name}}`: Name of the identity that is generating the lease. * `{{dynamicSecret.name}}`: Name of the associated dynamic secret. * `{{dynamicSecret.type}}`: Type of the associated dynamic secret. * `{{random N}}`: Random string of N characters. Allowed template functions are: * `truncate`: Truncates a string to a specified length. * `replace`: Replaces a substring with another value. * `uppercase`: Converts a string to uppercase. * `lowercase`: Converts a string to lowercase. Examples: ```yaml theme={"dark"} {{ randomUsername }} // 3POnzeFyK9gW2nioK0q2gMjr6CZqsRiX {{ unixTimestamp }} // 17490641580 {{ identity.name }} // {{ random 5 }} // x9K2m {{ truncate identity.name 4 }} // test {{ replace identity.name '' 'new-value' }} // new-value ``` Tags to be added to the created IAM User resource. When **Credential Type** is set to **Temporary Credentials**: No additional configuration parameters are required. The generated credentials will: * Inherit the permissions of the assumed IRSA role * Include an AWS Session Token * Be valid for the duration specified in Default TTL **Duration Limit**: IRSA temporary credentials support up to 12 hours maximum via GetSessionToken. TTL values exceeding this limit will be automatically adjusted. After submitting the form, you will see a dynamic secret created in the dashboard. Dynamic Secret Once you've successfully configured the dynamic secret, you're ready to generate on-demand credentials. To do this, simply click on the 'Generate' button which appears when hovering over the dynamic secret item. Alternatively, you can initiate the creation of a new lease by selecting 'New Lease' from the dynamic secret lease list section. Dynamic Secret Dynamic Secret When generating these secrets, it's important to specify a Time-to-Live (TTL) duration. This will dictate how long the credentials are valid for. Provision Lease Ensure that the TTL for the lease falls within the maximum TTL defined when configuring the dynamic secret in step 4. Once you click the `Submit` button, a new secret lease will be generated and the credentials for it will be shown to you. Provision Lease Infisical will use the provided **Access Key ID** and **Secret Key** to connect to your AWS instance. Navigate to the Secret Overview dashboard and select the environment in which you would like to add a dynamic secret to. Add Dynamic Secret Button Dynamic Secret Modal Dynamic Secret Setup Modal Name by which you want the secret to be referenced Default time-to-live for a generated secret (it is possible to modify this value after a secret is generated) Maximum time-to-live for a generated secret Select *Access Key* method. Choose the credential generation approach: * **IAM User**: Creates new temporary IAM users in your AWS account * **Temporary Credentials**: Generates temporary credentials from your access key connection The managing AWS IAM User Access Key The managing AWS IAM User Secret Key The AWS data center region. [IAM AWS Path](https://aws.amazon.com/blogs/security/optimize-aws-administration-with-iam-paths/) to scope created IAM User resource access. The IAM Policy ARN of the [AWS Permissions Boundary](https://docs.aws.amazon.com/IAM/latest/UserGuide/access_policies_boundaries.html) to attach to IAM users created in the role. The AWS IAM groups that should be assigned to the created users. Multiple values can be provided by separating them with commas. The AWS IAM managed policies that should be attached to the created users. Multiple values can be provided by separating them with commas. The AWS IAM inline policy that should be attached to the created users. Multiple values can be provided by separating them with commas. Specifies a template for generating usernames. This field allows customization of how usernames are automatically created. Allowed template variables are: * `{{randomUsername}}`: Random username string. * `{{unixTimestamp}}`: Current Unix timestamp at the time of lease creation. * `{{identity.name}}`: Name of the identity that is generating the lease. * `{{dynamicSecret.name}}`: Name of the associated dynamic secret. * `{{dynamicSecret.type}}`: Type of the associated dynamic secret. * `{{random N}}`: Random string of N characters. Allowed template functions are: * `truncate`: Truncates a string to a specified length. * `replace`: Replaces a substring with another value. * `uppercase`: Converts a string to uppercase. * `lowercase`: Converts a string to lowercase. Examples: ```yaml theme={"dark"} {{ randomUsername }} // 3POnzeFyK9gW2nioK0q2gMjr6CZqsRiX {{ unixTimestamp }} // 17490641580 {{ identity.name }} // {{ random 5 }} // x9K2m {{ truncate identity.name 4 }} // test {{ replace identity.name '' 'new-value' }} // new-value ``` Tags to be added to the created IAM User resource. When **Credential Type** is set to **Temporary Credentials**: No additional configuration parameters are required. The generated credentials will: * Inherit the permissions of your access key connection * Include an AWS Session Token * Be valid for the duration specified in Default TTL **Duration Limit**: Access Key temporary credentials support up to 12 hours maximum via GetSessionToken. TTL values exceeding this limit will be automatically adjusted. After submitting the form, you will see a dynamic secret created in the dashboard. Dynamic Secret Once you've successfully configured the dynamic secret, you're ready to generate on-demand credentials. To do this, simply click on the 'Generate' button which appears when hovering over the dynamic secret item. Alternatively, you can initiate the creation of a new lease by selecting 'New Lease' from the dynamic secret lease list section. Dynamic Secret Dynamic Secret When generating these secrets, it's important to specify a Time-to-Live (TTL) duration. This will dictate how long the credentials are valid for. Provision Lease Ensure that the TTL for the lease falls within the maximum TTL defined when configuring the dynamic secret in step 4. Once you click the `Submit` button, a new secret lease will be generated and the credentials for it will be shown to you. **Credentials format depends on your chosen credential type:** **IAM User credential type:** * AWS Username * AWS Access Key ID * AWS Secret Access Key **Temporary Credentials credential type:** * AWS Access Key ID * AWS Secret Access Key * AWS Session Token Provision Lease ## Audit or Revoke Leases Once you have created one or more leases, you will be able to access them by clicking on the respective dynamic secret item on the dashboard. This will allow you to see the lease details and delete the lease ahead of its expiration time. Provision Lease ## Renew Leases To extend the life of the generated dynamic secret lease past its initial time to live, simply click on the **Renew** button as illustrated below. Provision Lease Lease renewals cannot exceed the maximum TTL set when configuring the dynamic secret --- # Source: https://infisical.com/docs/documentation/platform/kms-configuration/aws-kms.md > ## Documentation Index > Fetch the complete documentation index at: https://infisical.com/docs/llms.txt > Use this file to discover all available pages before exploring further. # AWS Key Management Service > Learn how to manage encryption using AWS KMS To enhance the security of your Infisical projects, you can now encrypt your secrets using an external Key Management Service (KMS). When external KMS is configured for your project, all encryption and decryption operations will be handled by the chosen KMS. This guide will walk you through the steps needed to configure external KMS support with AWS KMS. ## Prerequisites * An AWS KMS Key configured as a `Symmetric` key and with `Encrypt and Decrypt` key usage. Create AWS KMS Key Before you begin, you'll first need to choose a method of authentication with AWS from below. 1. Navigate to the [Create IAM Role](https://console.aws.amazon.com/iamv2/home#/roles/create?step=selectEntities) page in your AWS Console. IAM Role Creation 2. Select **AWS Account** as the **Trusted Entity Type**. 3. Select **Another AWS Account** and provide the appropriate Infisical AWS Account ID: use **381492033652** for the **US region**, and **345594589636** for the **EU region**. This restricts the role to be assumed only by Infisical. If you are self-hosting, provide the AWS account number where Infisical is hosted. **For Dedicated Instances**: Your AWS account ID differs from the one provided above. Please reach out to Infisical support to obtain your AWS account ID. 4. Optionally, enable **Require external ID** and enter your Infisical **project ID** to further enhance security. Use the following custom policy to grant the minimum permissions required by Infisical to integrate with AWS KMS ```json theme={"dark"} { "Version": "2012-10-17", "Statement": [ { "Sid": "AllowKMSAccess", "Effect": "Allow", "Action": [ "kms:Decrypt", "kms:Encrypt", "kms:DescribeKey" ], "Resource": "*" } ] } ``` Navigate to your IAM user and add a policy to grant the following permissions: ```json theme={"dark"} { "Version": "2012-10-17", "Statement": [ { "Sid": "AllowKMSAccess", "Effect": "Allow", "Action": [ "kms:Decrypt", "kms:Encrypt", "kms:DescribeKey" ], "Resource": "*" } ] } ``` ## Setup AWS KMS in the Organization Settings Next, you will need to follow the steps listed below to add AWS KMS for your organization. Open encryption org settings Add encryption org settings Click the 'Add' button to begin adding a new external KMS. Select Encryption Provider Choose 'AWS KMS' from the list of encryption providers. Selecting AWS as the provider will require you input the following fields. Name for referencing the AWS KMS key within the organization. Short description of the AWS KMS key. Authentication mode for AWS, either "AWS Assume Role" or "Access Key". ARN of the AWS role to assume for providing Infisical access to the AWS KMS Key (required if Authentication Mode is "AWS Assume Role") Custom identifier for additional validation during role assumption. AWS IAM Access Key ID for authentication (required if Authentication Mode is "Access Key"). AWS IAM Secret Access Key for authentication (required if Authentication Mode is "Access Key"). AWS region where the AWS KMS Key is located. Key ID of the AWS KMS Key. If left blank, Infisical will generate and use a new AWS KMS Key in the specified region. AWS KMS key ID Save your configuration to apply the settings. You now have an AWS KMS Key configured at the organization level. You can assign these AWS KMS keys to existing Infisical projects by visiting the 'Project Settings' page. ## Assign AWS KMS Key to an Existing Project To assign the AWS KMS key you added to your organization, follow the steps below. Open encryption project
    settings Select encryption project
    settings Choose the AWS KMS key you configured earlier. Once you have selected the KMS of choice, click save. --- # Source: https://infisical.com/docs/integrations/secret-syncs/aws-parameter-store.md > ## Documentation Index > Fetch the complete documentation index at: https://infisical.com/docs/llms.txt > Use this file to discover all available pages before exploring further. # AWS Parameter Store Sync > Learn how to configure an AWS Parameter Store Sync for Infisical. **Prerequisites:** * Set up and add secrets to [Infisical Cloud](https://app.infisical.com) * Create an [AWS Connection](/integrations/app-connections/aws) with the required **Secret Sync** permissions * Ensure your network security policies allow incoming requests from Infisical to this secret sync provider, if network restrictions apply. For workflows involving large amounts of secrets or frequent syncs, we recommend increasing your [AWS Parameter Store throughput quota](https://docs.aws.amazon.com/systems-manager/latest/userguide/parameter-store-throughput.html) to avoid rate limiting. 1. Navigate to **Project** > **Integrations** and select the **Secret Syncs** tab. Click on the **Add Sync** button. Secret Syncs Tab 2. Select the **AWS Parameter Store** option. Select AWS Parameter Store 3. Configure the **Source** from where secrets should be retrieved, then click **Next**. Configure Source * **Environment**: The project environment to retrieve secrets from. * **Secret Path**: The folder path to retrieve secrets from. If you need to sync secrets from multiple folder locations, check out [secret imports](/documentation/platform/secret-reference#secret-imports). 4. Configure the **Destination** to where secrets should be deployed, then click **Next**. Configure Destination * **AWS Connection**: The AWS Connection to authenticate with. * **Region**: The AWS region to deploy secrets to. * **Path**: The AWS Parameter Store path to deploy secrets to. 5. Configure the **Sync Options** to specify how secrets should be synced, then click **Next**. Configure Options * **Initial Sync Behavior**: Determines how Infisical should resolve the initial sync. * **Overwrite Destination Secrets**: Removes any secrets at the destination endpoint not present in Infisical. * **Import Secrets (Prioritize Infisical)**: Imports secrets from the destination endpoint before syncing, prioritizing values from Infisical over Parameter Store when keys conflict. * **Import Secrets (Prioritize AWS Parameter Store)**: Imports secrets from the destination endpoint before syncing, prioritizing values from Parameter Store over Infisical when keys conflict. * **Key Schema**: Template that determines how secret names are transformed when syncing, using `{{secretKey}}` as a placeholder for the original secret name and `{{environment}}` for the environment. We highly recommend using a Key Schema to ensure that Infisical only manages the specific keys you intend, keeping everything else untouched. * **KMS Key**: The AWS KMS key ID or alias to encrypt parameters with. * **Tags**: Optional resource tags to add to parameters synced by Infisical. * **Sync Secret Metadata as Resource Tags**: If enabled, metadata attached to secrets will be added as resource tags to parameters synced by Infisical. Manually configured tags from the **Tags** field will take precedence over secret metadata when tag keys conflict. * **Auto-Sync Enabled**: If enabled, secrets will automatically be synced from the source location when changes occur. Disable to enforce manual syncing only. * **Disable Secret Deletion**: If enabled, Infisical will not remove secrets from the sync destination. Enable this option if you intend to manage some secrets manually outside of Infisical. 6. Configure the **Details** of your Parameter Store Sync, then click **Next**. Configure Details * **Name**: The name of your sync. Must be slug-friendly. * **Description**: An optional description for your sync. 7. Review your Parameter Store Sync configuration, then click **Create Sync**. Confirm Configuration 8. If enabled, your Parameter Store Sync will begin syncing your secrets to the destination endpoint. Sync Secrets To create an **AWS Parameter Store Sync**, make an API request to the [Create AWS Parameter Store Sync](/api-reference/endpoints/secret-syncs/aws-parameter-store/create) API endpoint. ### Sample request ```bash Request theme={"dark"} curl --request POST \ --url https://app.infisical.com/api/v1/secret-syncs/aws-parameter-store \ --header 'Content-Type: application/json' \ --data '{ "name": "my-parameter-store-sync", "projectId": "3c90c3cc-0d44-4b50-8888-8dd25736052a", "description": "an example sync", "connectionId": "3c90c3cc-0d44-4b50-8888-8dd25736052a", "environment": "dev", "secretPath": "/my-secrets", "isEnabled": true, "syncOptions": { "initialSyncBehavior": "overwrite-destination" }, "destinationConfig": { "region": "us-east-1", "path": "/my-aws/path/" } }' ``` ### Sample response ```bash Response theme={"dark"} { "secretSync": { "id": "3c90c3cc-0d44-4b50-8888-8dd25736052a", "name": "my-parameter-store-sync", "description": "an example sync", "isEnabled": true, "version": 1, "folderId": "3c90c3cc-0d44-4b50-8888-8dd25736052a", "connectionId": "3c90c3cc-0d44-4b50-8888-8dd25736052a", "createdAt": "2023-11-07T05:31:56Z", "updatedAt": "2023-11-07T05:31:56Z", "syncStatus": "succeeded", "lastSyncJobId": "123", "lastSyncMessage": null, "lastSyncedAt": "2023-11-07T05:31:56Z", "importStatus": null, "lastImportJobId": null, "lastImportMessage": null, "lastImportedAt": null, "removeStatus": null, "lastRemoveJobId": null, "lastRemoveMessage": null, "lastRemovedAt": null, "syncOptions": { "initialSyncBehavior": "overwrite-destination" }, "projectId": "3c90c3cc-0d44-4b50-8888-8dd25736052a", "connection": { "app": "aws", "name": "my-aws-connection", "id": "3c90c3cc-0d44-4b50-8888-8dd25736052a" }, "environment": { "slug": "dev", "name": "Development", "id": "3c90c3cc-0d44-4b50-8888-8dd25736052a" }, "folder": { "id": "3c90c3cc-0d44-4b50-8888-8dd25736052a", "path": "/my-secrets" }, "destination": "aws-parameter-store", "destinationConfig": { "region": "us-east-1", "path": "/my-aws/path/" } } } ``` ## FAQ The path is required and will be prepended to the key schema. For example, if you have a path of `/demo/path/` and a key schema of `INFISICAL_{{secretKey}}`, then the result will be `/demo/path/INFISICAL_{{secretKey}}`. --- # Source: https://infisical.com/docs/integrations/cloud/aws-secret-manager.md # AWS Secrets Manager > Learn how to sync secrets from Infisical to AWS Secrets Manager. The AWS Secrets Manager Native Integration will be deprecated in 2026. Please migrate to our new [AWS Secrets Manager Sync](../secret-syncs/aws-secrets-manager). --- # Source: https://infisical.com/docs/integrations/secret-syncs/aws-secrets-manager.md # Source: https://infisical.com/docs/documentation/platform/pki/certificate-syncs/aws-secrets-manager.md > ## Documentation Index > Fetch the complete documentation index at: https://infisical.com/docs/llms.txt > Use this file to discover all available pages before exploring further. # AWS Secrets Manager > Learn how to configure an AWS Secrets Manager Certificate Sync for Infisical PKI. **Prerequisites:** * Create an [AWS Connection](/integrations/app-connections/aws) * Ensure your network security policies allow incoming requests from Infisical to this certificate sync provider, if network restrictions apply. The AWS Secrets Manager Certificate Sync requires the following permissions to be set on the AWS IAM user for Infisical to sync certificates to AWS Secrets Manager: `secretsmanager:CreateSecret`, `secretsmanager:UpdateSecret`, `secretsmanager:GetSecretValue`, `secretsmanager:DeleteSecret`, `secretsmanager:ListSecrets`. Any role with these permissions would work such as a custom policy with **SecretsManager** permissions. Certificates synced to AWS Secrets Manager will be stored as JSON secrets, preserving both the certificate and private key components as separate fields within the secret value. 1. Navigate to **Project** > **Integrations** > **Certificate Syncs** and press **Add Sync**. Certificate Syncs Tab 2. Select the **AWS Secrets Manager** option. Select AWS Secrets Manager 3. Configure the **Destination** to where certificates should be deployed, then click **Next**. Configure Destination * **AWS Connection**: The AWS Connection to authenticate with. * **Region**: The AWS region where secrets will be stored. 4. Configure the **Sync Options** to specify how certificates should be synced, then click **Next**. Configure Options * **Enable Removal of Expired/Revoked Certificates**: If enabled, Infisical will remove certificates from the destination if they are no longer active in Infisical. * **Preserve Secret on Renewal**: Only applies to certificate renewals. When a certificate is renewed in Infisical, this option controls how the renewed certificate is handled. If enabled, the renewed certificate will update the existing secret, preserving the same secret name. If disabled, the renewed certificate will be created as a new secret with a new name. * **Include Root CA**: If enabled, the Root CA certificate will be included in the certificate chain when syncing to AWS Secrets Manager. If disabled, only intermediate certificates will be included. * **Certificate Name Schema** (Optional): Customize how secret names are generated in AWS Secrets Manager. Use `{{certificateId}}` as a placeholder for the certificate ID. * **Auto-Sync Enabled**: If enabled, certificates will automatically be synced when changes occur. Disable to enforce manual syncing only. 5. Configure the **Field Mappings** to customize how certificate data is stored in AWS Secrets Manager secrets, then click **Next**. Configure Field Mappings * **Certificate Field**: The field name where the certificate will be stored in the secret value (default: `certificate`) * **Private Key Field**: The field name where the private key will be stored in the secret value (default: `private_key`) * **Certificate Chain Field**: The field name where the full certificate chain excluding the root CA certificate will be stored (default: `certificate_chain`) * **CA Certificate Field**: The field name where the root CA certificate will be stored (default: `ca_certificate`) **AWS Secrets Manager Secret Structure**: Certificates are stored in AWS Secrets Manager as JSON secrets with the following structure (field names can be customized via field mappings): ```json theme={"dark"} { "certificate": "-----BEGIN CERTIFICATE-----\n...", "private_key": "-----BEGIN PRIVATE KEY-----\n...", "certificate_chain": "-----BEGIN CERTIFICATE-----\n...", "ca_certificate": "-----BEGIN CERTIFICATE-----\n..." } ``` **Example with Custom Field Mappings**: ```json theme={"dark"} { "ssl_cert": "-----BEGIN CERTIFICATE-----\n...", "ssl_key": "-----BEGIN PRIVATE KEY-----\n...", "ssl_chain": "-----BEGIN CERTIFICATE-----\n...", "ssl_ca": "-----BEGIN CERTIFICATE-----\n..." } ``` 6. Configure the **Details** of your AWS Secrets Manager Certificate Sync, then click **Next**. Configure Details * **Name**: The name of your sync. Must be slug-friendly. * **Description**: An optional description for your sync. 7. Select which certificates should be synced to AWS Secrets Manager. Select Certificates 8. Review your AWS Secrets Manager Certificate Sync configuration, then click **Create Sync**. Confirm Configuration 9. If enabled, your AWS Secrets Manager Certificate Sync will begin syncing your certificates to the destination endpoint. Sync Certificates To create an **AWS Secrets Manager Certificate Sync**, make an API request to the [Create AWS Secrets Manager Certificate Sync](/api-reference/endpoints/pki/syncs/aws-secrets-manager/create) API endpoint. ### Sample request You can optionally specify `certificateIds` during sync creation to immediately add certificates to the sync. If not provided, you can add certificates later using the certificate management endpoints. ```bash Request theme={"dark"} curl --request POST \ --url https://app.infisical.com/api/v1/cert-manager/syncs/aws-secrets-manager \ --header 'Authorization: Bearer ' \ --header 'Content-Type: application/json' \ --data '{ "name": "my-aws-secrets-manager-cert-sync", "projectId": "3c90c3cc-0d44-4b50-8888-8dd25736052a", "description": "an example certificate sync", "connectionId": "3c90c3cc-0d44-4b50-8888-8dd25736052a", "destination": "aws-secrets-manager", "isAutoSyncEnabled": true, "certificateIds": [ "550e8400-e29b-41d4-a716-446655440000", "660f1234-e29b-41d4-a716-446655440001" ], "syncOptions": { "canRemoveCertificates": true, "preserveSecretOnRenewal": true, "canImportCertificates": false, "includeRootCa": false, "certificateNameSchema": "myapp-{{certificateId}}", "fieldMappings": { "certificate": "ssl_cert", "privateKey": "ssl_key", "certificateChain": "ssl_chain", "caCertificate": "ssl_ca" } }, "destinationConfig": { "region": "us-east-1", "keyId": "alias/my-kms-key" } }' ``` ### Example with Default Field Mappings ```bash Request theme={"dark"} curl --request POST \ --url https://app.infisical.com/api/v1/cert-manager/syncs/aws-secrets-manager \ --header 'Authorization: Bearer ' \ --header 'Content-Type: application/json' \ --data '{ "name": "my-aws-secrets-manager-cert-sync-default", "projectId": "3c90c3cc-0d44-4b50-8888-8dd25736052a", "description": "AWS Secrets Manager sync with default field mappings", "connectionId": "3c90c3cc-0d44-4b50-8888-8dd25736052a", "destination": "aws-secrets-manager", "isAutoSyncEnabled": true, "syncOptions": { "canRemoveCertificates": true, "preserveSecretOnRenewal": true, "canImportCertificates": false, "includeRootCa": false, "certificateNameSchema": "infisical-{{certificateId}}", "fieldMappings": { "certificate": "certificate", "privateKey": "private_key", "certificateChain": "certificate_chain", "caCertificate": "ca_certificate" } }, "destinationConfig": { "region": "us-west-2" } }' ``` ### Sample response ```json Response theme={"dark"} { "pkiSync": { "id": "3c90c3cc-0d44-4b50-8888-8dd25736052a", "name": "my-aws-secrets-manager-cert-sync", "description": "an example certificate sync", "destination": "aws-secrets-manager", "isAutoSyncEnabled": true, "destinationConfig": { "region": "us-east-1", "keyId": "alias/my-kms-key" }, "syncOptions": { "canRemoveCertificates": true, "preserveSecretOnRenewal": true, "canImportCertificates": false, "includeRootCa": false, "certificateNameSchema": "myapp-{{certificateId}}", "fieldMappings": { "certificate": "ssl_cert", "privateKey": "ssl_key", "certificateChain": "ssl_chain", "caCertificate": "ssl_ca" } }, "projectId": "3c90c3cc-0d44-4b50-8888-8dd25736052a", "connectionId": "3c90c3cc-0d44-4b50-8888-8dd25736052a", "createdAt": "2023-01-01T00:00:00.000Z", "updatedAt": "2023-01-01T00:00:00.000Z" } } ``` ## Certificate Management Your AWS Secrets Manager Certificate Sync will: * **Automatic Deployment**: Deploy certificates in Infisical to AWS Secrets Manager as JSON secrets with customizable field names * **Certificate Updates**: Update certificates in AWS Secrets Manager when renewals occur * **Expiration Handling**: Optionally remove expired certificates from AWS Secrets Manager (if enabled) * **Format Preservation**: Maintain certificate format during sync operations * **Field Customization**: Map certificate data to custom field names that match your application requirements * **CA Certificate Support**: Include CA certificates in secrets for complete certificate chain management * **KMS Encryption**: Optionally use custom KMS keys for secret encryption * **Regional Deployment**: Deploy secrets to specific AWS regions AWS Secrets Manager Certificate Syncs support both automatic and manual synchronization modes. When auto-sync is enabled, certificates are automatically deployed as they are issued or renewed. ## Manual Certificate Sync You can manually trigger certificate synchronization to AWS Secrets Manager using the sync certificates functionality. This is useful for: * Initial setup when you have existing certificates to deploy * One-time sync of specific certificates * Testing certificate sync configurations * Force sync after making changes To manually sync certificates, use the [Sync Certificates](/api-reference/endpoints/pki/syncs/aws-secrets-manager/sync-certificates) API endpoint or the manual sync option in the Infisical UI. AWS Secrets Manager does not support importing certificates back into Infisical due to the nature of AWS Secrets Manager where certificates are stored as JSON secrets rather than managed certificate objects. ## Secret Naming Constraints AWS Secrets Manager has specific naming requirements for secrets: * **Allowed Characters**: Letters, numbers, hyphens (-), and underscores (\_) only * **Length**: 1-512 characters --- # Source: https://infisical.com/docs/integrations/app-connections/aws.md > ## Documentation Index > Fetch the complete documentation index at: https://infisical.com/docs/llms.txt > Use this file to discover all available pages before exploring further. # AWS Connection > Learn how to configure an AWS Connection for Infisical. Infisical supports two methods for connecting to AWS. Infisical will assume the provided role in your AWS account securely, without the need to share any credentials. To connect your self-hosted Infisical instance with AWS, you need to set up an AWS IAM User account that can assume the configured AWS IAM Role. If your instance is deployed on AWS, the aws-sdk will automatically retrieve the credentials. Ensure that you assign the provided permission policy to your deployed instance, such as ECS or EC2. The following steps are for instances not deployed on AWS: Navigate to [Create IAM User](https://console.aws.amazon.com/iamv2/home#/users/create) in your AWS Console. Attach the following inline permission policy to the IAM User to allow it to assume any IAM Roles: ```json theme={"dark"} { "Version": "2012-10-17", "Statement": [ { "Sid": "AllowAssumeAnyRole", "Effect": "Allow", "Action": "sts:AssumeRole", "Resource": "arn:aws:iam::*:role/*" } ] } ``` Obtain the AWS access key ID and secret access key for your IAM User by navigating to **IAM > Users > \[Your User] > Security credentials > Access keys**. Access Key Step 1 Access Key Step 2 Access Key Step 3 1. Set the access key as **INF\_APP\_CONNECTION\_AWS\_ACCESS\_KEY\_ID**. 2. Set the secret key as **INF\_APP\_CONNECTION\_AWS\_SECRET\_ACCESS\_KEY**. 1. Navigate to the [Create IAM Role](https://console.aws.amazon.com/iamv2/home#/roles/create?step=selectEntities) page in your AWS Console. IAM Role Creation 2. Select **AWS Account** as the **Trusted Entity Type**. 3. Select **Another AWS Account** and provide the appropriate Infisical AWS Account ID: use **381492033652** for the **US region**, and **345594589636** for the **EU region**. This restricts the role to be assumed only by Infisical. If self-hosting, provide your AWS account number instead. **For Dedicated Instances**: Your AWS account ID differs from the one provided above. Please reach out to Infisical support to obtain your AWS account ID. 4. (Recommended) Enable "Require external ID" and input your **Organization ID** to strengthen security and mitigate the [confused deputy problem](https://docs.aws.amazon.com/IAM/latest/UserGuide/confused-deputy.html). When configuring an IAM Role that Infisical will assume, it’s highly recommended to enable the **"Require external ID"** option and specify your **Organization ID**. This precaution helps protect your AWS account against the [confused deputy problem](https://docs.aws.amazon.com/IAM/latest/UserGuide/confused-deputy.html), a potential security vulnerability where Infisical could be tricked into performing actions on your behalf by an unauthorized actor. Always enable "Require external ID" and use your Organization ID when setting up the IAM Role. Navigate to your IAM role permissions and click **Create Inline Policy**. IAM Role Create Policy Depending on your use case, add one or more of the following policies to your IAM Role: Use the following custom policy to grant the minimum permissions required by Infisical to sync secrets to AWS Secrets Manager: IAM Role Secrets Manager Permissions ```json theme={"dark"} { "Version": "2012-10-17", "Statement": [ { "Sid": "AllowSecretsManagerAccess", "Effect": "Allow", "Action": [ "secretsmanager:ListSecrets", "secretsmanager:GetSecretValue", "secretsmanager:BatchGetSecretValue", "secretsmanager:CreateSecret", "secretsmanager:UpdateSecret", "secretsmanager:DeleteSecret", "secretsmanager:DescribeSecret", "secretsmanager:TagResource", "secretsmanager:UntagResource", "kms:ListAliases", // if you need to specify the KMS key "kms:Encrypt", // if you need to specify the KMS key "kms:Decrypt", // if you need to specify the KMS key "kms:DescribeKey" // if you need to specify the KMS key ], "Resource": "*" } ] } ``` If using a custom KMS key, be sure to add the IAM user or role as a key user. KMS Key IAM Role User Use the following custom policy to grant the minimum permissions required by Infisical to sync secrets to AWS Parameter Store: IAM Role Secrets Manager Permissions ```json theme={"dark"} { "Version": "2012-10-17", "Statement": [ { "Sid": "AllowSSMAccess", "Effect": "Allow", "Action": [ "ssm:PutParameter", "ssm:GetParameters", "ssm:GetParametersByPath", "ssm:DescribeParameters", "ssm:DeleteParameters", "ssm:ListTagsForResource", // if you need to add tags to secrets "ssm:AddTagsToResource", // if you need to add tags to secrets "ssm:RemoveTagsFromResource", // if you need to add tags to secrets "kms:ListAliases", // if you need to specify the KMS key "kms:Encrypt", // if you need to specify the KMS key "kms:Decrypt", // if you need to specify the KMS key "kms:DescribeKey" // if you need to specify the KMS key ], "Resource": "*" } ] } ``` If using a custom KMS key, be sure to add the IAM user or role as a key user. KMS Key IAM Role User Use the following custom policy to grant the minimum permissions required by Infisical to rotate secrets to AWS Access Keys: IAM Role Secret Rotation Permissions ```json theme={"dark"} { "Version": "2012-10-17", "Statement": [ { "Effect": "Allow", "Action": [ "iam:ListAccessKeys", "iam:CreateAccessKey", "iam:UpdateAccessKey", "iam:DeleteAccessKey", "iam:ListUsers" ], "Resource": "*" } ] } ``` Use the following custom policy to grant the minimum permissions required by Infisical to sync certificates to AWS Certificate Manager: ```json theme={"dark"} { "Version": "2012-10-17", "Statement": [ { "Sid": "AllowCertificateManagerAccess", "Effect": "Allow", "Action": [ "acm:ListCertificates", "acm:DescribeCertificate", "acm:GetCertificate", "acm:ImportCertificate", "acm:ExportCertificate", "acm:DeleteCertificate", "acm:AddTagsToCertificate", "acm:RemoveTagsFromCertificate", "acm:ListTagsForCertificate" ], "Resource": "*" } ] } ``` * **ListCertificates**: Lists all certificates in the account * **ImportCertificate**: Imports certificates from Infisical into AWS Certificate Manager * **ExportCertificate**: Exports certificates for synchronization * **DeleteCertificate**: Removes certificates that are no longer managed by Infisical * **DescribeCertificate** and **GetCertificate**: Retrieves certificate details for comparison during sync * Tag-related permissions: Manages certificate tags for identification and organization Copy IAM Role ARN 1. Navigate to the **Integrations** tab in the desired project, then select **App Connections**. App Connections Tab 2. Select the **AWS Connection** option. Select AWS Connection 3. Select the **Assume Role** method option and provide the **AWS IAM Role ARN** obtained from the previous step and press **Connect to AWS**. Create AWS Connection 4. Your **AWS Connection** is now available for use. Assume Role AWS Connection To create an AWS Connection, make an API request to the [Create AWS Connection](/api-reference/endpoints/app-connections/aws/create) API endpoint. ### Sample request ```bash Request theme={"dark"} curl --request POST \ --url https://app.infisical.com/api/v1/app-connections/aws \ --header 'Content-Type: application/json' \ --data '{ "name": "my-aws-connection", "method": "assume-role", "projectId": "7ffbb072-2575-495a-b5b0-127f88caef78", "credentials": { "roleArn": "...", } }' ``` ### Sample response ```bash Response theme={"dark"} { "appConnection": { "id": "3c90c3cc-0d44-4b50-8888-8dd25736052a", "name": "my-aws-connection", "projectId": "7ffbb072-2575-495a-b5b0-127f88caef78", "version": 123, "orgId": "3c90c3cc-0d44-4b50-8888-8dd25736052a", "createdAt": "2023-11-07T05:31:56Z", "updatedAt": "2023-11-07T05:31:56Z", "app": "aws", "method": "assume-role", "credentials": {} } } ``` Infisical will use the provided **Access Key ID** and **Secret Key** to connect to your AWS instance. Navigate to your IAM user permissions and click **Create Inline Policy**. User IAM Create Policy Depending on your use case, add one or more of the following policies to your user: Use the following custom policy to grant the minimum permissions required by Infisical to sync secrets to AWS Secrets Manager: IAM Role Secrets Manager Permissions ```json theme={"dark"} { "Version": "2012-10-17", "Statement": [ { "Sid": "AllowSecretsManagerAccess", "Effect": "Allow", "Action": [ "secretsmanager:ListSecrets", "secretsmanager:GetSecretValue", "secretsmanager:BatchGetSecretValue", "secretsmanager:CreateSecret", "secretsmanager:UpdateSecret", "secretsmanager:DeleteSecret", "secretsmanager:DescribeSecret", "secretsmanager:TagResource", "secretsmanager:UntagResource", "kms:ListAliases", // if you need to specify the KMS key "kms:Encrypt", // if you need to specify the KMS key "kms:Decrypt", // if you need to specify the KMS key "kms:DescribeKey" // if you need to specify the KMS key ], "Resource": "*" } ] } ``` If using a custom KMS key, be sure to add the IAM user or role as a key user. KMS Key IAM Role User Use the following custom policy to grant the minimum permissions required by Infisical to sync secrets to AWS Parameter Store: IAM Role Secrets Manager Permissions ```json theme={"dark"} { "Version": "2012-10-17", "Statement": [ { "Sid": "AllowSSMAccess", "Effect": "Allow", "Action": [ "ssm:PutParameter", "ssm:GetParameters", "ssm:GetParametersByPath", "ssm:DescribeParameters", "ssm:DeleteParameters", "ssm:ListTagsForResource", // if you need to add tags to secrets "ssm:AddTagsToResource", // if you need to add tags to secrets "ssm:RemoveTagsFromResource", // if you need to add tags to secrets "kms:ListAliases", // if you need to specify the KMS key "kms:Encrypt", // if you need to specify the KMS key "kms:Decrypt", // if you need to specify the KMS key "kms:DescribeKey" // if you need to specify the KMS key ], "Resource": "*" } ] } ``` If using a custom KMS key, be sure to add the IAM user or role as a key user. KMS Key IAM Role User Use the following custom policy to grant the minimum permissions required by Infisical to rotate secrets to AWS Access Keys: IAM Role Secret Rotation Permissions ```json theme={"dark"} { "Version": "2012-10-17", "Statement": [ { "Effect": "Allow", "Action": [ "iam:ListAccessKeys", "iam:CreateAccessKey", "iam:UpdateAccessKey", "iam:DeleteAccessKey", "iam:ListUsers" ], "Resource": "*" } ] } ``` Use the following custom policy to grant the minimum permissions required by Infisical to sync certificates to AWS Certificate Manager: ```json theme={"dark"} { "Version": "2012-10-17", "Statement": [ { "Sid": "AllowCertificateManagerAccess", "Effect": "Allow", "Action": [ "acm:ListCertificates", "acm:DescribeCertificate", "acm:GetCertificate", "acm:ImportCertificate", "acm:ExportCertificate", "acm:DeleteCertificate", "acm:AddTagsToCertificate", "acm:RemoveTagsFromCertificate", "acm:ListTagsForCertificate" ], "Resource": "*" } ] } ``` * **ListCertificates**: Lists all certificates in the account * **ImportCertificate**: Imports certificates from Infisical into AWS Certificate Manager * **ExportCertificate**: Exports certificates for synchronization * **DeleteCertificate**: Removes certificates that are no longer managed by Infisical * **DescribeCertificate** and **GetCertificate**: Retrieves certificate details for comparison during sync * Tag-related permissions: Manages certificate tags for identification and organization Retrieve an AWS **Access Key ID** and a **Secret Key** for your IAM user in **IAM > Users > User > Security credentials > Access keys**. access key 1 access key 2 access key 3 1. Navigate to the **Integrations** tab in the desired project, then select **App Connections**. App Connections Tab 2. Select the **AWS Connection** option. Select AWS Connection 3. Select the **Access Key** method option and provide the **Access Key ID** and **Secret Key** obtained from the previous step and press **Connect to AWS**. Create AWS Connection 4. Your **AWS Connection** is now available for use. Assume Role AWS Connection To create an AWS Connection, make an API request to the [Create AWS Connection](/api-reference/endpoints/app-connections/aws/create) API endpoint. ### Sample request ```bash Request theme={"dark"} curl --request POST \ --url https://app.infisical.com/api/v1/app-connections/aws \ --header 'Content-Type: application/json' \ --data '{ "name": "my-aws-connection", "method": "access-key", "projectId": "7ffbb072-2575-495a-b5b0-127f88caef78", "credentials": { "accessKeyId": "...", "secretKey": "..." } }' ``` ### Sample response ```bash Response theme={"dark"} { "appConnection": { "id": "3c90c3cc-0d44-4b50-8888-8dd25736052a", "name": "my-aws-connection", "projectId": "7ffbb072-2575-495a-b5b0-127f88caef78", "version": 123, "orgId": "3c90c3cc-0d44-4b50-8888-8dd25736052a", "createdAt": "2023-11-07T05:31:56Z", "updatedAt": "2023-11-07T05:31:56Z", "app": "aws", "method": "access-key", "credentials": { "accessKeyId": "..." } } } ``` --- # Source: https://infisical.com/docs/integrations/app-connections/azure-adcs.md # Source: https://infisical.com/docs/documentation/platform/pki/ca/azure-adcs.md > ## Documentation Index > Fetch the complete documentation index at: https://infisical.com/docs/llms.txt > Use this file to discover all available pages before exploring further. # Microsoft AD CS > Learn how to issue and manage certificates using Microsoft Active Directory Certificate Services (ADCS) with Infisical. Issue and manage certificates using Microsoft Active Directory Certificate Services (ADCS) for enterprise-grade certificate management integrated with your existing Windows infrastructure. ## Prerequisites Before setting up ADCS integration, ensure you have: * Microsoft Active Directory Certificate Services (ADCS) server running and accessible * Domain administrator account with certificate management permissions * ADCS web enrollment enabled on your server * Network connectivity from Infisical to the ADCS server * **IP whitelisting**: Your ADCS server must allow connections from Infisical's IP addresses * For Infisical Cloud instances, see [Networking Configuration](/documentation/setup/networking) for the list of IPs to whitelist * For self-hosted instances, whitelist your Infisical server's IP address * Azure ADCS app connection configured (see [Azure ADCS Connection](/integrations/app-connections/azure-adcs)) ## Complete Workflow: From Setup to Certificate Issuance This section walks you through the complete end-to-end process of setting up Azure ADCS integration and issuing your first certificate. In your Infisical project, go to your **Certificate Project** → **Certificate Authority** to access the external CAs page. External CA
    Page Click **Create CA** and configure: - **Type**: Choose **Active Directory Certificate Services (AD CS)** - **Name**: Friendly name for this CA (e.g., "Production ADCS CA") - **App Connection**: Choose your ADCS connection from the dropdown External CA
    Form Once created, your Azure ADCS Certificate Authority will appear in the list and be ready for use. External CA
    Created Go to **Subscribers** to access the subscribers page. Subscribers
    Page Click **Add Subscriber** and configure: - **Name**: Unique subscriber name (e.g., "web-server-certs") - **Certificate Authority**: Select your ADCS CA - **Common Name**: Certificate CN (e.g., "api.example.com") - **Certificate Template**: Select from dynamically loaded ADCS templates - **Subject Alternative Names**: DNS names, IP addresses, or email addresses - **TTL**: Certificate validity period (e.g., "1y" for 1 year) - **Additional Subject Fields**: Organization, OU, locality, state, country, email (if required by template) Subscribers
    Form Your subscriber is now created and ready to issue certificates. Subscriber
    Created Click into your subscriber and click **Order Certificate** to generate a new certificate using your ADCS template. Issue New
    Certificate Your certificate has been successfully issued by the ADCS server and is ready for use. Certificate
    Created Navigate to **Certificates** to view detailed information about all issued certificates, including expiration dates, serial numbers, and certificate chains. Certificates
    Page ## Certificate Templates Infisical automatically retrieves available certificate templates from your ADCS server, ensuring you can only select templates that are properly configured and accessible. The system dynamically discovers templates during the certificate authority setup and certificate issuance process. ### Common Template Types ADCS templates you might see include: * **Web Server**: For SSL/TLS certificates with server authentication * **Computer**: For machine authentication certificates * **User**: For client authentication certificates * **Basic EFS**: For Encrypting File System certificates * **EFS Recovery Agent**: For EFS data recovery * **Administrator**: For administrative certificates * **Subordinate Certification Authority**: For issuing CA certificates ### Template Requirements Ensure your ADCS templates are configured with: * **Enroll permissions** for your connection account * **Auto-enroll permissions** if using automated workflows * **Subject name requirements** matching your certificate requests * **Key usage extensions** appropriate for your use case **Dynamic Template Discovery**: Infisical queries your ADCS server in real-time to populate available templates. Only templates you have permission to use will be displayed during certificate issuance. ## Certificate Issuance Limitations ### Immediate Issuance Only **Manual Approval Not Supported**: Infisical currently supports only **immediate certificate issuance**. Certificates that require manual approval or are held by ADCS policies cannot be issued through Infisical yet. For successful certificate issuance, ensure your ADCS templates and policies are configured to: * **Auto-approve** certificate requests without manual intervention * **Not require** administrator approval for the templates you plan to use * **Allow** the connection account to request and receive certificates immediately ### What Happens with Manual Approval If a certificate request requires manual approval: 1. The request will be submitted to ADCS successfully 2. Infisical will attempt to retrieve the certificate with exponential backoff (up to 5 retries over \~1 minute) 3. If the certificate is not approved within this timeframe, the request will **fail** 4. **No background polling**: Currently, Infisical does not check for certificates that might be approved hours or days later **Future Enhancement**: Background polling for delayed certificate approvals is planned for future releases. ### Certificate Revocation Certificate revocation is **not supported** by the Azure ADCS connector due to security and complexity considerations. ## Advanced Configuration ### Custom Validity Periods Enable custom certificate validity periods on your ADCS server: ```cmd theme={"dark"} # Run on ADCS server as Administrator certutil -setreg policy\EditFlags +EDITF_ATTRIBUTEENDDATE net stop certsvc net start certsvc ``` This allows Infisical to control certificate expiration dates directly. ## Troubleshooting ### Common Issues **Certificate Request Denied** * Verify ADCS template permissions for your connection account * Check template subject name requirements * Ensure template allows the requested key algorithm and size **Revocation Service Unavailable** * Verify IIS is running and the revocation endpoint is accessible * Check IIS application pool permissions * Test endpoint connectivity from Infisical **Template Not Found** * Verify template exists on ADCS server and is published * Check that your connection account has enrollment permissions for the template * Ensure the template is properly configured and available in the ADCS web enrollment interface * Templates are dynamically loaded - refresh the PKI Subscriber form if templates don't appear **Certificate Request Pending/Timeout** * Check if your ADCS template requires manual approval - Infisical only supports immediate issuance * Verify the certificate template is configured for auto-approval * Ensure your connection account has sufficient permissions to request certificates without approval * Review ADCS server policies that might be holding the certificate request **Network Connectivity Issues** * Verify your ADCS server's firewall allows connections from Infisical * For Infisical Cloud: Ensure Infisical's IP addresses are whitelisted (see [Networking Configuration](/documentation/setup/networking)) * For self-hosted: Whitelist your Infisical server's IP address on the ADCS server * Test HTTPS connectivity to the ADCS web enrollment endpoint * Check for any network security appliances blocking the connection **Authentication Failures** * Verify ADCS connection credentials * Check domain account permissions * Ensure network connectivity to ADCS server **SSL/TLS Certificate Errors** * For ADCS servers with self-signed or private certificates: disable "Reject Unauthorized" in the SSL tab of your Azure ADCS app connection, or provide the certificate in PEM format * Common SSL errors: `UNABLE_TO_VERIFY_LEAF_SIGNATURE`, `SELF_SIGNED_CERT_IN_CHAIN`, `CERT_HAS_EXPIRED` * The SSL configuration applies to all HTTPS communications between Infisical and your ADCS server * Only HTTPS URLs are supported - HTTP connections are not allowed for security reasons --- # Source: https://infisical.com/docs/integrations/secret-syncs/azure-app-configuration.md # Source: https://infisical.com/docs/integrations/app-connections/azure-app-configuration.md > ## Documentation Index > Fetch the complete documentation index at: https://infisical.com/docs/llms.txt > Use this file to discover all available pages before exploring further. # Azure App Configuration Connection > Learn how to configure a Azure App Configuration Connection for Infisical. Infisical currently only supports two methods for connecting to Azure, which are OAuth and Client Secrets. Using the Azure App Configuration connection on a self-hosted instance of Infisical requires configuring an application in Azure and registering your instance with it. **Prerequisites:** * Set up Azure and have an existing App Configuration instance. Navigate to Azure Active Directory > App registrations to create a new application. Azure Active Directory is now Microsoft Entra ID. Azure app config Azure app config Create the application. As part of the form, set the **Redirect URI** to `https://your-domain.com/organization/app-connections/azure/oauth/callback`. The domain you defined in the Redirect URI should be equivalent to the `SITE_URL` configured in your Infisical instance. Azure app config For the Azure Connection to work with App Configuration, you need to assign multiple permissions to the application. #### Azure App Configuration permissions Set the API permissions of the Azure application to include the following Azure App Configuration permissions: `KeyValue.Delete`, `KeyValue.Read`, and `KeyValue.Write`. Azure app config Obtain the **Application (Client) ID** in Overview and generate a **Client Secret** in Certificate & secrets for your Azure application. Azure app config Azure app config Azure app config Back in your Infisical instance, add two new environment variables for the credentials of your Azure application. * `INF_APP_CONNECTION_AZURE_APP_CONFIGURATION_CLIENT_ID`: The **Application (Client) ID** of your Azure application. * `INF_APP_CONNECTION_AZURE_APP_CONFIGURATION_CLIENT_SECRET`: The **Client Secret** of your Azure application. Once added, restart your Infisical instance and use the Azure App Configuration connection. To use client secret authentication, ensure your Azure Service Principal has the required permissions and is connected to the Azure App Configuration resources you want to use. **Prerequisites:** * Set up Azure and have an existing App Configuration instance. * The service principal must be connected to your target Azure App Configuration resource(s) Configure the required API permissions for your App Registration to interact with Azure App Configuration: #### Azure App Configuration permissions Set the API permissions of your Azure service principal to include the following Azure App Configuration permissions: `KeyValue.Delete`, `KeyValue.Read`, and `KeyValue.Write`. Azure app config ## Setup Azure Connection in Infisical Navigate to the **Integrations** tab in the desired project, then select **App Connections**. App Connections
    Tab Select the **Azure Connection** option from the connection options modal. Select Azure Connection You can optionally authenticate against a specific tenant by providing the Azure Tenant or Directory ID. Now select the **OAuth** method and click **Connect to Azure**. Connect via Azure OAUth You will then be redirected to Azure to grant Infisical access to your Azure account. Once granted, you will redirect you back to Infisical's App Connections page. Azure App Configuration
          Authorization Fill in the **Tenant ID**, **Client ID** and **Client Secret** fields with the Directory (Tenant) ID, Application (Client) ID and Client Secret you obtained in the previous step. Connect via Azure OAUth Your **Azure App Configuration Connection** is now available for use. Assume Role AWS Connection --- # Source: https://infisical.com/docs/documentation/platform/identities/azure-auth.md > ## Documentation Index > Fetch the complete documentation index at: https://infisical.com/docs/llms.txt > Use this file to discover all available pages before exploring further. # Azure Auth > Learn how to authenticate with Infisical for services on Azure **Azure Auth** is an Azure-native authentication method for Azure resources like Azure VMs, Azure App Services, Azure Functions, Azure Kubernetes Service, etc. to access Infisical. ## Diagram The following sequence diagram illustrates the Azure Auth workflow for authenticating Azure [service principals](https://learn.microsoft.com/en-us/entra/identity-platform/app-objects-and-service-principals?tabs=browser) with Infisical. ```mermaid theme={"dark"} sequenceDiagram participant Client as Client participant Infis as Infisical participant Azure as Azure AD OpenID Note over Client,Azure: Step 1: Instance Identity Token Retrieval Client->>Azure: Request managed identity access token Azure-->>Client: Return managed identity access token Note over Client,Infis: Step 2: Identity Token Login Operation Client->>Infis: Send managed identity access token to /api/v1/auth/azure-auth/login Infis->>Azure: Request public key Azure-->>Infis: Return public key Note over Infis: Step 3: Identity Token Verification Note over Infis: Step 4: Identity Property Validation Infis->>Client: Return short-lived access token Note over Client,Infis: Step 4: Access Infisical API with Token Client->>Infis: Make authenticated requests using the short-lived access token ``` ## Concept At a high-level, Infisical authenticates an Azure service by verifying its identity and checking that it meets specific requirements (e.g. it is bound to an allowed service principal) at the `/api/v1/auth/azure-auth/login` endpoint. If successful, then Infisical returns a short-lived access token that can be used to make authenticated requests to the Infisical API. To be more specific: 1. The client running on an Azure service obtains an [access token](https://learn.microsoft.com/en-us/entra/identity/managed-identities-azure-resources/how-to-use-vm-token#get-a-token-using-http) that is a JWT token representing the managed identity for the Azure resource such as a Virtual Machine; the managed identity is associated with a service principal in Azure AD. 2. The client sends the access token to Infisical. 3. Infisical verifies the token against the corresponding public key at the [public Azure AD OpenID configuration endpoint](https://learn.microsoft.com/en-us/answers/questions/793793/azure-ad-validate-access-token). 4. Infisical checks if the entity behind the access token is allowed to authenticate with Infisical based on set criteria such as **Allowed Service Principal IDs**. 5. If all is well, Infisical returns a short-lived access token that the client can use to make authenticated requests to the Infisical API. We recommend using one of Infisical's clients like SDKs or the Infisical Agent to authenticate with Infisical using Azure Auth as they handle the authentication process including generating the client access token for you. Also, note that Infisical needs network-level access to send requests to the Google Cloud API as part of the Azure Auth workflow. ## Guide In the following steps, we explore how to create and use identities for your applications in Azure to access the Infisical API using the Azure Auth authentication method. To create an identity, head to your Organization Settings > Access Control > Identities and press **Create identity**. identities organization When creating an identity, you specify an organization level [role](/documentation/platform/access-controls/role-based-access-controls) for it to assume; you can configure roles in Organization Settings > Access Control > Organization Roles. identities organization create Now input a few details for your new identity. Here's some guidance for each field: * Name (required): A friendly name for the identity. * Role (required): A role from the **Organization Roles** tab for the identity to assume. The organization role assigned will determine what organization level resources this identity can have access to. Once you've created an identity, you'll be redirected to a page where you can manage the identity. identities page Since the identity has been configured with Universal Auth by default, you should re-configure it to use Azure Auth instead. To do this, press to edit the **Authentication** section, remove the existing Universal Auth configuration, and add a new Azure Auth configuration onto the identity. identities page remove default auth identities create azure auth method Here's some more guidance on each field: * Tenant ID: The [tenant ID](https://learn.microsoft.com/en-us/entra/fundamentals/how-to-find-tenant) for the Azure AD organization. * Resource / Audience: The resource URL for the application registered in Azure AD. The value is expected to match the `aud` claim of the access token JWT later used in the login operation against Infisical. See the [resource](https://learn.microsoft.com/en-us/entra/identity/managed-identities-azure-resources/how-to-use-vm-token#get-a-token-using-http) parameter for how the audience is set when requesting a JWT access token from the Azure Instance Metadata Service (IMDS) endpoint. In most cases, this value should be `https://management.azure.com/` which is the default. * Allowed Service Principal IDs: A comma-separated list of Azure AD service principal IDs that are allowed to authenticate with Infisical. * Access Token TTL (default is `2592000` equivalent to 30 days): The lifetime for an acccess token in seconds. This value will be referenced at renewal time. * Access Token Max TTL (default is `2592000` equivalent to 30 days): The maximum lifetime for an acccess token in seconds. This value will be referenced at renewal time. * Access Token Max Number of Uses (default is `0`): The maximum number of times that an access token can be used; a value of `0` implies infinite number of uses. * Access Token Trusted IPs: The IPs or CIDR ranges that access tokens can be used from. By default, each token is given the `0.0.0.0/0`, allowing usage from any network address. To enable the identity to access project-level resources such as secrets within a specific project, you should add it to that project. To do this, head over to the project you want to add the identity to and go to Project Settings > Access Control > Machine Identities and press **Add identity**. Next, select the identity you want to add to the project and the project level role you want to allow it to assume. The project role assigned will determine what project level resources this identity can have access to. identities project identities project create To access the Infisical API as the identity, you need to generate a managed identity [access token](https://learn.microsoft.com/en-us/entra/identity/managed-identities-azure-resources/how-to-use-vm-token#get-a-token-using-http) that is a JWT token representing the managed identity for the Azure resource such as a Virtual Machine. The client token must be sent to the `/api/v1/auth/azure-auth/login` endpoint in exchange for a separate access token to access the Infisical API. We provide a few code examples below of how you can authenticate with Infisical to access the [Infisical API](/api-reference/overview/introduction). Start by making a request from your Azure client such as Virtual Machine to obtain a managed identity access token. For more examples of how to obtain the managed identity access token, refer to the [official documentation](https://learn.microsoft.com/en-us/entra/identity/managed-identities-azure-resources/how-to-use-vm-token#get-a-token-using-http). #### Sample request ```bash curl theme={"dark"} curl 'http://169.254.169.254/metadata/identity/oauth2/token?api-version=2018-02-01&resource=https%3A%2F%2Fmanagement.azure.com%2F' -H Metadata:true -s ``` #### Sample response ```bash theme={"dark"} { "access_token": "eyJ0eXAi...", "refresh_token": "", "expires_in": "3599", "expires_on": "1506484173", "not_before": "1506480273", "resource": "https://management.azure.com/", "token_type": "Bearer" } ``` Next use send the obtained managed identity access token (i.e. the token from the `access_token` field above) to authenticate with Infisical and obtain a separate access token. #### Sample request ```bash Request theme={"dark"} curl --location --request POST 'https://app.infisical.com/api/v1/auth/gcp-auth/login' \ --header 'Content-Type: application/x-www-form-urlencoded' \ --data-urlencode 'identityId=...' \ --data-urlencode 'jwt=...' ``` Note that you should replace `` with the ID of the identity you created in step 1. #### Sample response ```bash Response theme={"dark"} { "accessToken": "...", "expiresIn": 7200, "accessTokenMaxTTL": 43244 "tokenType": "Bearer" } ``` Next, you can use this access token to access the [Infisical API](/api-reference/overview/introduction) We recommend using one of Infisical's clients like SDKs or the Infisical Agent to authenticate with Infisical using Azure Auth as they handle the authentication process including retrieving the client access token. Each identity access token has a time-to-live (TTL) which you can infer from the response of the login operation; the default TTL is `7200` seconds which can be adjusted. If an identity access token expires, it can no longer authenticate with the Infisical API. In this case, a new access token should be obtained by performing another login operation. --- # Source: https://infisical.com/docs/documentation/platform/secret-rotation/azure-client-secret.md > ## Documentation Index > Fetch the complete documentation index at: https://infisical.com/docs/llms.txt > Use this file to discover all available pages before exploring further. # Azure Client Secret > Learn how to automatically rotate Azure Client Secrets. ## Prerequisites * Create an [Azure Client Secret Connection](/integrations/app-connections/azure-client-secrets). * Ensure your network security policies allow incoming requests from Infisical to this rotation provider, if network restrictions apply. ## Create an Azure Client Secret Rotation in Infisical 1. Navigate to your Secret Manager Project's Dashboard and select **Add Secret Rotation** from the actions dropdown. Secret Manager Dashboard 2. Select the **Azure Client Secret** option. Select Azure Client Secret 3. Select the **Azure Connection** to use and configure the rotation behavior. Then click **Next**. Rotation Configuration * **Azure Connection** - the connection that will perform the rotation of the specified application's Client Secret. * **Rotation Interval** - the interval, in days, that once elapsed will trigger a rotation. * **Rotate At** - the local time of day when rotation should occur once the interval has elapsed. * **Auto-Rotation Enabled** - whether secrets should automatically be rotated once the rotation interval has elapsed. Disable this option to manually rotate secrets or pause secret rotation. 4. Select the Azure application whose Client Secret you want to rotate. Then click **Next**. Rotation Parameters 5. Specify the secret names that the client credentials should be mapped to. Then click **Next**. Rotation Secrets Mapping * **Client ID** - the name of the secret that the application Client ID will be mapped to. * **Client Secret** - the name of the secret that the rotated Client Secret will be mapped to. 6. Give your rotation a name and description (optional). Then click **Next**. Rotation Details * **Name** - the name of the secret rotation configuration. Must be slug-friendly. * **Description** (optional) - a description of this rotation configuration. 7. Review your configuration, then click **Create Secret Rotation**. Rotation Review 8. Your **Azure Client Secret** credentials are now available for use via the mapped secrets. Rotation Created To create an Azure Client Secret Rotation, make an API request to the [Create Azure Client Secret Rotation](/api-reference/endpoints/secret-rotations/azure-client-secret/create) API endpoint. You will first need the **Client ID** and **Object ID** of the Azure application you want to rotate the secret for. This can be obtained from the Applications dashboard. Azure Client ID ### Sample request ```bash Request theme={"dark"} curl --request POST \ --url https://us.infisical.com/api/v2/secret-rotations/azure-client-secret \ --header 'Content-Type: application/json' \ --data '{ "name": "my-azure-rotation", "projectId": "3c90c3cc-0d44-4b50-8888-8dd25736052a", "description": "my client secret rotation", "connectionId": "3c90c3cc-0d44-4b50-8888-8dd25736052a", "environment": "dev", "secretPath": "/", "isAutoRotationEnabled": true, "rotationInterval": 30, "rotateAtUtc": { "hours": 0, "minutes": 0 }, "parameters": { "objectId": "...", "clientId": "...", "appName": "..." }, "secretsMapping": { "clientId": "AZURE_CLIENT_ID", "clientSecret": "AZURE_CLIENT_SECRET" } }' ``` ### Sample response ```bash Response theme={"dark"} { "secretRotation": { "id": "3c90c3cc-0d44-4b50-8888-8dd25736052a", "name": "my-azure-rotation", "description": "my client secret rotation", "secretsMapping": { "clientId": "AZURE_CLIENT_ID", "clientSecret": "AZURE_CLIENT_SECRET" }, "isAutoRotationEnabled": true, "activeIndex": 0, "folderId": "3c90c3cc-0d44-4b50-8888-8dd25736052a", "connectionId": "3c90c3cc-0d44-4b50-8888-8dd25736052a", "createdAt": "2023-11-07T05:31:56Z", "updatedAt": "2023-11-07T05:31:56Z", "rotationInterval": 30, "rotationStatus": "success", "lastRotationAttemptedAt": "2023-11-07T05:31:56Z", "lastRotatedAt": "2023-11-07T05:31:56Z", "lastRotationJobId": "3c90c3cc-0d44-4b50-8888-8dd25736052a", "nextRotationAt": "2023-11-07T05:31:56Z", "connection": { "app": "azure", "name": "my-azure-connection", "id": "3c90c3cc-0d44-4b50-8888-8dd25736052a" }, "environment": { "slug": "dev", "name": "Development", "id": "3c90c3cc-0d44-4b50-8888-8dd25736052a" }, "projectId": "3c90c3cc-0d44-4b50-8888-8dd25736052a", "folder": { "id": "3c90c3cc-0d44-4b50-8888-8dd25736052a", "path": "/" }, "rotateAtUtc": { "hours": 0, "minutes": 0 }, "lastRotationMessage": null, "type": "azure-client-secret", "parameters": { "objectId": "...", "appName": "...", "clientId": "..." } } } ``` --- # Source: https://infisical.com/docs/integrations/app-connections/azure-client-secrets.md > ## Documentation Index > Fetch the complete documentation index at: https://infisical.com/docs/llms.txt > Use this file to discover all available pages before exploring further. # Azure Client Secrets Connection > Learn how to configure an Azure Client Secrets Connection for Infisical. Infisical currently only supports two methods for connecting to Azure, which are OAuth and Client Secrets. Using the Azure Client Secrets connection on a self-hosted instance of Infisical requires configuring an application in Azure and registering your instance with it. **Prerequisites:** * Set up Azure. Navigate to Azure Active Directory > App registrations to create a new application. Azure Active Directory is now Microsoft Entra ID. Azure client secrets Azure client secrets Create the application. As part of the form, set the **Redirect URI** to `https://your-domain.com/organization/app-connections/azure/oauth/callback`. The domain you defined in the Redirect URI should be equivalent to the `SITE_URL` configured in your Infisical instance. Azure client secrets For the Azure Connection to work with Client Secrets, you need to assign the following permission to the application. #### Azure Client Secrets permissions Set the API permissions of the Azure application to include the following permissions: * Microsoft Graph * `Application.ReadWrite.All` * `Application.ReadWrite.OwnedBy` * `Application.ReadWrite.All` (Delegated) * `Directory.ReadWrite.All` (Delegated) * `User.Read` (Delegated) Azure client secrets Obtain the **Application (Client) ID** and **Directory (Tenant) ID** (this will be used later in the Infisical connection) in Overview and generate a **Client Secret** in Certificate & secrets for your Azure application. Azure client secrets Azure client secrets Azure client secrets Back in your Infisical instance, add two new environment variables for the credentials of your Azure application. * `INF_APP_CONNECTION_AZURE_CLIENT_SECRETS_CLIENT_ID`: The **Application (Client) ID** of your Azure application. * `INF_APP_CONNECTION_AZURE_CLIENT_SECRETS_CLIENT_SECRET`: The **Client Secret** of your Azure application. Once added, restart your Infisical instance and use the Azure Client Secrets connection. Ensure your Azure application has the required permissions that Infisical needs for the Azure Client Secrets connection to work. **Prerequisites:** * An active Azure setup. For the Azure Client Secrets connection to work, assign the following permissions to your Azure application: #### Required API Permissions **Microsoft Graph** * `Application.ReadWrite.All` * `Application.ReadWrite.OwnedBy` * `Application.ReadWrite.All` (Delegated) * `Directory.ReadWrite.All` (Delegated) * `User.Read` (Delegated) Azure client secrets Ensure your Azure application has the required permissions that Infisical needs for the Azure Client Secrets connection to work. **Prerequisites:** * An active Azure setup. For the Azure Client Secrets connection to work, assign the following permissions to your Azure application: #### Required API Permissions **Microsoft Graph** * `Application.ReadWrite.All` * `Application.ReadWrite.OwnedBy` * `Application.ReadWrite.All` (Delegated) * `Directory.ReadWrite.All` (Delegated) * `User.Read` (Delegated) Azure client secrets Navigate to the **Certificates & secrets** section of your Azure App Registration, and press the **Upload certificate** button. Select the **Upload** button and upload your certificate. Upload certificate Keep in mind that both the certificate and its private key are required to configure the Azure Client Secrets connection in Infisical. ## Setup Azure Connection in Infisical Navigate to the **Integrations** tab in the desired project, then select **App Connections**. App Connections
    Tab Select the **Azure Connection** option from the connection options modal. Select Azure Connection Fill in the **Tenant ID** field with the Directory (Tenant) ID you obtained in the previous step. Now select the **OAuth** method and click **Connect to Azure**. Connect via Azure OAUth You will then be redirected to Azure to grant Infisical access to your Azure account. Once granted, you will be redirected back to Infisical's App Connections page. Azure Client Secrets
          Authorization Fill in the **Tenant ID**, **Client ID** and **Client Secret** fields with the Directory (Tenant) ID, Application (Client) ID and Client Secret you obtained in the previous step. Connect via Azure OAUth Fill in the **Tenant ID**, **Client ID**, **Certificate (PEM format)**, and **Private Key** fields with the Directory (Tenant) ID, Application (Client) ID, Certificate and Private Key you obtained in the [previous step](#certificate-authentication). The private key is never transmitted to Azure, and it is only used to sign the client assertion used to authenticate with Azure. Connect via Azure Certificate Your **Azure Client Secrets Connection** is now available for use. Azure Client Secrets --- # Source: https://infisical.com/docs/integrations/secret-syncs/azure-devops.md # Source: https://infisical.com/docs/integrations/app-connections/azure-devops.md > ## Documentation Index > Fetch the complete documentation index at: https://infisical.com/docs/llms.txt > Use this file to discover all available pages before exploring further. # Azure DevOps Connection > Learn how to configure an Azure DevOps Connection for Infisical. Infisical currently supports three methods for connecting to Azure DevOps, which are OAuth, Azure DevOps Personal Access Token and Client Secrets. Using the Azure DevOps OAuth connection on a self-hosted instance of Infisical requires configuring an application in Azure and registering your instance with it. **Prerequisites:** * Set up Azure. Navigate to Azure Active Directory > App registrations to create a new application. Azure Active Directory is now Microsoft Entra ID. Azure devops Azure devops Create the application. As part of the form, set the **Redirect URI** to `https://your-domain.com/organization/app-connections/azure/oauth/callback`. The domain you defined in the Redirect URI should be equivalent to the `SITE_URL` configured in your Infisical instance. Azure devops For the Azure Connection to work with DevOps Pipelines, you need to assign the following permission to the application. #### Azure DevOps permissions Set the API permissions of the Azure application to include the following permissions: * Azure DevOps * `user_impersonation` * `vso.project_write` * `vso.variablegroups_manage` * `vso.variablegroups_write` Azure devops Obtain the **Application (Client) ID** and **Directory (Tenant) ID** (this will be used later in the Infisical connection) in Overview and generate a **Client Secret** in Certificate & secrets for your Azure application. Azure devops Azure devops Azure devops Back in your Infisical instance, add two new environment variables for the credentials of your Azure application. * `INF_APP_CONNECTION_AZURE_DEVOPS_CLIENT_ID`: The **Application (Client) ID** of your Azure application. * `INF_APP_CONNECTION_AZURE_DEVOPS_CLIENT_SECRET`: The **Client Secret** of your Azure application. Once added, restart your Infisical instance and use the Azure Client Secrets connection. #### Create a new Azure DevOps personal access token (PAT) When using the Azure DevOps Access Token connection you'll need to create a new personal access token (PAT) in order to authenticate Infisical with Azure DevOps. integrations Make sure the newly created token has Read/Write access to the Release scope. integrations Please make sure that the token has access to the following scopes: Variable Groups *(read, create, & manage)*, Release *(read/write)*, Project and Team *(read)*, Service Connections *(read & query)* Copy the newly created token as this will be used to authenticate Infisical with Azure DevOps. integrations To use client secret authentication, ensure your Azure Service Principal has the required permissions and is connected to the Azure DevOps organization and projects you want to use. **Prerequisites:** * Set up Azure and have an existing Azure DevOps organization. * The service principal must be connected to your target Azure DevOps organization and project(s) Configure the required API permissions for your App Registration to interact with Azure DevOps: #### Azure DevOps permissions Set the API permissions of your Azure service principal to include the following Azure DevOps permissions: * Azure DevOps * `user_impersonation` * `vso.project_write` * `vso.variablegroups_manage` * `vso.variablegroups_write` Azure devops ## Setup Azure Connection in Infisical Navigate to the **Integrations** tab in the desired project, then select **App Connections**. App Connections
    Tab Select the **Azure Connection** option from the connection options modal. Select Azure Connection Fill in the **Tenant ID** field with the Directory (Tenant) ID you obtained in the previous [step](#azure-oauth-on-a-self-hosted-instance). Also fill in the organization name of the Azure DevOps organization you want to connect to. Fill in Connection Details You can find the **Organization Name** on [https://dev.azure.com/](https://dev.azure.com/) You will then be redirected to Azure to grant Infisical access to your Azure account. Once granted, you will be redirected back to Infisical's App Connections page. Azure Client Secrets
            Authorization Fill in the **Access Token** field with the Access Token you obtained in the previous step. And the organization name of the Azure DevOps organization you want to connect to. Fill in Connection Details You can find the **Organization Name** on [https://dev.azure.com/](https://dev.azure.com/) Fill in the **Tenant ID**, **Client ID**, **Client Secret** and **Organization Name** fields with the Directory (Tenant) ID, Application (Client) ID, Client Secret and the organization name you obtained in the previous step. You can find the **Organization Name** on [https://dev.azure.com/](https://dev.azure.com/) Connect via Azure OAUth Your **Azure DevOps Connection** is now available for use. Azure DevOps --- # Source: https://infisical.com/docs/documentation/platform/dynamic-secrets/azure-entra-id.md > ## Documentation Index > Fetch the complete documentation index at: https://infisical.com/docs/llms.txt > Use this file to discover all available pages before exploring further. # Azure Entra Id > Learn how to dynamically generate Azure Entra Id user credentials. The Infisical Azure Entra Id dynamic secret allows you to generate Azure Entra Id credentials on demand based on configured role. ## Prerequisites Login to [Microsoft Entra ID](https://entra.microsoft.com/) Go to Overview, Copy and store `Tenant Id` Copy Tenant Id Go to Applications > App registrations. Click on New Registration. Copy Tenant Id Enter an application name. Click Register. Copy and store `Application Id`. Copy Application Id Go to Clients and Secrets. Click on New Client Secret. Enter a description, select expiry and click Add. Copy and store `Client Secret` value. Copy client Secret Go to API Permissions. Click on Add a permission. Click add a permission Click on Microsoft Graph. Click Microsoft Graph Click on Application Permissions. Search and select `User.ReadWrite.All` and click Add permissions. Add User.Read.All Click on Grant admin consent for app. Click yes to confirm. Grant admin consent Go to Dashboard. Click on show more. Show more Click on Roles & admins. Search for User Administrator and click on it. User Administrator Click on Add assignments. Search for the application name you created and select it. Click on Add. Add assignments ## Set up Dynamic Secrets with Azure Entra ID Open the Secret Overview dashboard and select the environment in which you would like to add a dynamic secret. Add Dynamic Secret Button Dynamic Secret Modal Prefix for the secrets to be created Default time-to-live for a generated secret (it is possible to modify this value after a secret is generated) Maximum time-to-live for a generated secret. The Tenant ID of your Azure Entra ID account. The Application ID of the application you created in Azure Entra ID. The Client Secret of the application you created in Azure Entra ID. Multi select list of users to generate secrets for. After submitting the form, you will see a dynamic secret for each user created in the dashboard. Once you've successfully configured the dynamic secret, you're ready to generate on-demand credentials. To do this, simply click on the 'Generate' button which appears when hovering over the dynamic secret item. Alternatively, you can initiate the creation of a new lease by selecting 'New Lease' from the dynamic secret lease list section. Dynamic Secret Dynamic Secret When generating these secrets, it's important to specify a Time-to-Live (TTL) duration. This will dictate how long the credentials are valid for. Provision Lease Ensure that the TTL for the lease falls within the maximum TTL defined when configuring the dynamic secret. Once you click the `Submit` button, a new secret lease will be generated and the credentials from it will be shown to you. Provision Lease ## Audit or Revoke Leases Once you have created one or more leases, you will be able to access them by clicking on the respective dynamic secret item on the dashboard. This will allow you to see the expiration time of the lease or delete a lease before its set time to live. Provision Lease ## Renew Leases To extend the life of the generated dynamic secret leases past its initial time to live, simply click on the **Renew** button as illustrated below. Provision Lease Lease renewals cannot exceed the maximum TTL set when configuring the dynamic secret --- # Source: https://infisical.com/docs/integrations/secret-syncs/azure-key-vault.md # Source: https://infisical.com/docs/integrations/app-connections/azure-key-vault.md # Source: https://infisical.com/docs/documentation/platform/pki/certificate-syncs/azure-key-vault.md > ## Documentation Index > Fetch the complete documentation index at: https://infisical.com/docs/llms.txt > Use this file to discover all available pages before exploring further. # Azure Key Vault > Learn how to configure an Azure Key Vault Certificate Sync for Infisical PKI. **Prerequisites:** * Create an [Azure Key Vault Connection](/integrations/app-connections/azure-key-vault) * Ensure your network security policies allow incoming requests from Infisical to this certificate sync provider, if network restrictions apply. The Azure Key Vault Certificate Sync requires the following certificate permissions to be set on the user / service principal for Infisical to sync certificates to Azure Key Vault: `certificates/list`, `certificates/get`, `certificates/import`, `certificates/delete`. Any role with these permissions would work such as the **Key Vault Certificates Officer** role. Certificates synced to Azure Key Vault will be stored as certificate objects, preserving both the certificate and private key components. 1. Navigate to **Project** > **Integrations** > **Certificate Syncs** and press **Add Sync**. Certificate Syncs Tab 2. Select the **Azure Key Vault** option. Select Key Vault 3. Configure the **Destination** to where certificates should be deployed, then click **Next**. Configure Destination * **Azure Connection**: The Azure Connection to authenticate with. * **Vault Base URL**: The URL of your Azure Key Vault. 4. Configure the **Sync Options** to specify how certificates should be synced, then click **Next**. Configure Options * **Enable Removal of Expired/Revoked Certificates**: If enabled, Infisical will remove certificates from the destination if they are no longer active in Infisical. * **Enable Versioning on Renewal**: If enabled, Infisical will sync renewed certificates to the destination under a new version of the original synced certificate instead of creating a new certificate. * **Include Root CA**: If enabled, the Root CA certificate will be included in the certificate chain when syncing to Azure Key Vault. If disabled, only intermediate certificates will be included. * **Certificate Name Schema** (Optional): Customize how certificate names are generated in Azure Key Vault. Use `{{certificateId}}` as a placeholder for the certificate ID. If not specified, defaults to `Infisical-{{certificateId}}`. * **Auto-Sync Enabled**: If enabled, certificates will automatically be synced when changes occur. Disable to enforce manual syncing only. **Azure Key Vault Soft Delete**: When certificates are removed from Azure Key Vault, they are placed in a soft-deleted state rather than being permanently deleted. This means: * Subsequent syncs will not re-add these soft-deleted certificates automatically * To resync removed certificates, you must either manually **purge** them from Azure Key Vault or **recover** them through the Azure portal/CLI 5. Configure the **Details** of your Azure Key Vault Certificate Sync, then click **Next**. Configure Details * **Name**: The name of your sync. Must be slug-friendly. * **Description**: An optional description for your sync. 6. Select which certificates should be synced to Azure Key Vault. Select Certificates 7. Review your Azure Key Vault Certificate Sync configuration, then click **Create Sync**. Confirm Configuration 8. If enabled, your Azure Key Vault Certificate Sync will begin syncing your certificates to the destination endpoint. Sync Certificates To create an **Azure Key Vault Certificate Sync**, make an API request to the [Create Azure Key Vault Certificate Sync](/api-reference/endpoints/pki/syncs/azure-key-vault/create) API endpoint. ### Sample request You can optionally specify `certificateIds` during sync creation to immediately add certificates to the sync. If not provided, you can add certificates later using the certificate management endpoints. ```bash Request theme={"dark"} curl --request POST \ --url https://app.infisical.com/api/v1/cert-manager/syncs/azure-key-vault \ --header 'Authorization: Bearer ' \ --header 'Content-Type: application/json' \ --data '{ "name": "my-key-vault-cert-sync", "projectId": "3c90c3cc-0d44-4b50-8888-8dd25736052a", "description": "an example certificate sync", "connectionId": "3c90c3cc-0d44-4b50-8888-8dd25736052a", "destination": "azure-key-vault", "isAutoSyncEnabled": true, "certificateIds": [ "550e8400-e29b-41d4-a716-446655440000", "660f1234-e29b-41d4-a716-446655440001" ], "syncOptions": { "canRemoveCertificates": true, "enableVersioningOnRenewal": true, "includeRootCa": false, "certificateNameSchema": "myapp-{{certificateId}}" }, "destinationConfig": { "vaultBaseUrl": "https://my-key-vault.vault.azure.net" } }' ``` ### Sample response ```json Response theme={"dark"} { "pkiSync": { "id": "3c90c3cc-0d44-4b50-8888-8dd25736052a", "name": "my-key-vault-cert-sync", "description": "an example certificate sync", "destination": "azure-key-vault", "isAutoSyncEnabled": true, "destinationConfig": { "vaultBaseUrl": "https://my-key-vault.vault.azure.net" }, "syncOptions": { "canRemoveCertificates": true, "enableVersioningOnRenewal": true, "includeRootCa": false, "certificateNameSchema": "myapp-{{certificateId}}" }, "projectId": "3c90c3cc-0d44-4b50-8888-8dd25736052a", "connectionId": "3c90c3cc-0d44-4b50-8888-8dd25736052a", "createdAt": "2023-01-01T00:00:00.000Z", "updatedAt": "2023-01-01T00:00:00.000Z" } } ``` ## Certificate Management Your Azure Key Vault Certificate Sync will: * **Automatic Deployment**: Deploy certificates in Infisical to Azure Key Vault. * **Certificate Updates**: Update certificates in Azure Key Vault when renewals occur * **Expiration Handling**: Optionally remove expired certificates from Azure Key Vault (if enabled) * **Format Preservation**: Maintain certificate format and metadata during sync operations Azure Key Vault Certificate Syncs support both automatic and manual synchronization modes. When auto-sync is enabled, certificates are automatically deployed as they are issued or renewed. ## Manual Certificate Sync You can manually trigger certificate synchronization to Azure Key Vault using the sync certificates functionality. This is useful for: * Initial setup when you have existing certificates to deploy * One-time sync of specific certificates * Testing certificate sync configurations * Force sync after making changes To manually sync certificates, use the [Sync Certificates](/api-reference/endpoints/pki/syncs/azure-key-vault/sync-certificates) API endpoint or the manual sync option in the Infisical UI. Azure Key Vault does not support importing certificates back into Infisical due to security limitations where private keys cannot be extracted from Azure Key Vault. --- # Source: https://infisical.com/docs/documentation/platform/dynamic-secrets/azure-sql-database.md > ## Documentation Index > Fetch the complete documentation index at: https://infisical.com/docs/llms.txt > Use this file to discover all available pages before exploring further. # Azure SQL Database > Learn how to dynamically generate Azure SQL Database user credentials. The Infisical Azure SQL Database dynamic secret allows you to generate Azure SQL Database user credentials on demand based on configured roles. ## How Azure SQL Database Authentication Works Azure SQL Database uses a two-tier authentication system that differs from traditional SQL Server: 1. **Master Database**: Contains server-level logins that can authenticate to the Azure SQL Database server 2. **User Databases**: Individual databases that contain database users mapped to server logins When creating dynamic credentials for Azure SQL Database, Infisical performs a two-step process: 1. **Create Login in Master Database**: Creates a server-level login with the specified password 2. **Create User in Target Database**: Creates a database user mapped to the login and grants the necessary permissions This architecture ensures proper security isolation and follows Azure SQL Database best practices. ## Prerequisite Create a user with the required permissions in your Azure SQL Database instance. This user will be used to create new accounts on-demand. The user needs: * `loginmanager` role in the master database (to create logins) * `db_owner` role in the target database (to create users and grant permissions) ## Set up Dynamic Secrets with Azure SQL Database Open the Secret Overview dashboard and select the environment in which you would like to add a dynamic secret. Add Dynamic Secret Button Dynamic Secret Modal Name by which you want the secret to be referenced Default time-to-live for a generated secret (it is possible to modify this value after a secret is generated) Maximum time-to-live for a generated secret List of key/value metadata pairs Azure SQL Database server hostname (e.g., myserver.database.windows.net) Database port (typically 1433 for Azure SQL Database) Username that will be used to create dynamic secrets (must have loginmanager role in master and db\_owner in target database) Password that will be used to create dynamic secrets Name of the target database where users will be created and granted permissions Enable SSL encryption for the database connection (recommended for Azure SQL Database) SSL certificate authority certificate. For Azure SQL Database, this is typically not required as Azure manages the certificates. Dynamic Secret Setup Modal Modify SQL Statements Modal Azure SQL Database dynamic secrets use predefined SQL statements that follow Azure's security best practices: SQL statement executed in the master database to create a server-level login. This login allows authentication to the Azure SQL Database server. SQL statement executed in the target database to create a database user and grant permissions. The user is mapped to the login created in the master database. SQL statements executed when a lease expires or is manually revoked. The system intelligently routes DROP USER commands to the target database and DROP LOGIN commands to the master database for proper cleanup. Specifies a template for generating usernames. This field allows customization of how usernames are automatically created. Allowed template variables are: * `{{randomUsername}}`: Random username string. * `{{unixTimestamp}}`: Current Unix timestamp at the time of lease creation. * `{{identity.name}}`: Name of the identity that is generating the lease. * `{{dynamicSecret.name}}`: Name of the associated dynamic secret. * `{{dynamicSecret.type}}`: Type of the associated dynamic secret. * `{{random N}}`: Random string of N characters. Allowed template functions are: * `truncate`: Truncates a string to a specified length. * `replace`: Replaces a substring with another value. * `uppercase`: Converts a string to uppercase. * `lowercase`: Converts a string to lowercase. Examples: ```yaml theme={"dark"} {{ randomUsername }} // 3POnzeFyK9gW2nioK0q2gMjr6CZqsRiX {{ unixTimestamp }} // 17490641580 {{ identity.name }} // {{ random 5 }} // x9K2m {{ truncate identity.name 4 }} // test {{ replace identity.name '' 'new-value' }} // new-value ``` After submitting the form, you will see a dynamic secret created in the dashboard. If this step fails, ensure your user has the proper permissions in both the master database (`loginmanager` role) and target database (`db_owner` role). Dynamic Secret Once you've successfully configured the dynamic secret, you're ready to generate on-demand credentials. To do this, simply click on the 'Generate' button which appears when hovering over the dynamic secret item. Alternatively, you can initiate the creation of a new lease by selecting 'New Lease' from the dynamic secret lease list section. Dynamic Secret Dynamic Secret When generating these secrets, it's important to specify a Time-to-Live (TTL) duration. This will dictate how long the credentials are valid for. Provision Lease Ensure that the TTL for the lease falls within the maximum TTL defined when configuring the dynamic secret. Once you click the `Submit` button, a new secret lease will be generated and the credentials for it will be shown to you. Provision Lease ## Audit or Revoke Leases Once you have created one or more leases, you will be able to access them by clicking on the respective dynamic secret item on the dashboard. This will allow you to see the expiration time of the lease or delete the lease before its set time to live. When a lease is revoked or expires, Infisical automatically: 1. **Drops the user** from the target database 2. **Drops the login** from the master database This ensures complete cleanup and prevents orphaned credentials. Provision Lease ## Renew Leases To extend the life of the generated dynamic secret leases past its initial time to live, simply click on the **Renew** button as illustrated below. Provision Lease Lease renewals cannot exceed the maximum TTL set when configuring the dynamic secret --- # Source: https://infisical.com/docs/documentation/platform/sso/azure.md # Source: https://infisical.com/docs/documentation/platform/scim/azure.md # Source: https://infisical.com/docs/documentation/platform/identities/oidc-auth/azure.md > ## Documentation Index > Fetch the complete documentation index at: https://infisical.com/docs/llms.txt > Use this file to discover all available pages before exploring further. # Azure > Learn how to authenticate Azure pipelines with Infisical using OpenID Connect (OIDC). **OIDC Auth** is a platform-agnostic JWT-based authentication method that can be used to authenticate from any platform or environment using an identity provider with OpenID Connect. ## Diagram The following sequence diagram illustrates the OIDC Auth workflow for authenticating Azure pipelines with Infisical. ```mermaid theme={"dark"} sequenceDiagram participant Client as Azure Pipeline participant Idp as Identity Provider participant Infis as Infisical Client->>Idp: Step 1: Request identity token Idp-->>Client: Return JWT with verifiable claims Note over Client,Infis: Step 2: Login Operation Client->>Infis: Send signed JWT to /api/v1/auth/oidc-auth/login Note over Infis,Idp: Step 3: Query verification Infis->>Idp: Request JWT public key using OIDC Discovery Idp-->>Infis: Return public key Note over Infis: Step 4: JWT validation Infis->>Client: Return short-lived access token Note over Client,Infis: Step 5: Access Infisical API with Token Client->>Infis: Make authenticated requests using the short-lived access token ``` ## Concept At a high-level, Infisical authenticates a client by verifying the JWT and checking that it meets specific requirements (e.g. it is issued by a trusted identity provider) at the `/api/v1/auth/oidc-auth/login` endpoint. If successful, then Infisical returns a short-lived access token that can be used to make authenticated requests to the Infisical API. To be more specific: 1. The Azure pipeline requests an identity token from Azure's identity provider. 2. The fetched identity token is sent to Infisical at the `/api/v1/auth/oidc-auth/login` endpoint. 3. Infisical fetches the public key that was used to sign the identity token from Azure's identity provider using OIDC Discovery. 4. Infisical validates the JWT using the public key provided by the identity provider and checks that the subject, audience, and claims of the token matches with the set criteria. 5. If all is well, Infisical returns a short-lived access token that the Azure pipeline can use to make authenticated requests to the Infisical API. Infisical needs network-level access to Azure's identity provider endpoints. ## Guide In the following steps, we explore how to create and use identities to access the Infisical API using the OIDC Auth authentication method. To create an identity, head to your Organization Settings > Access Control > Identities and press **Create identity**. identities organization When creating an identity, you specify an organization level [role](/documentation/platform/access-controls/role-based-access-controls) for it to assume; you can configure roles in Organization Settings > Access Control > Organization Roles. identities organization create Now input a few details for your new identity. Here's some guidance for each field: * Name (required): A friendly name for the identity. * Role (required): A role from the **Organization Roles** tab for the identity to assume. The organization role assigned will determine what organization level resources this identity can have access to. Once you've created an identity, you'll be redirected to a page where you can manage the identity. identities page Since the identity has been configured with Universal Auth by default, you should re-configure it to use OIDC Auth instead. To do this, press to edit the **Authentication** section, remove the existing Universal Auth configuration, and add a new OIDC Auth configuration onto the identity. identities page remove default auth identities create oidc auth method Restrict access by configuring the Subject, Audiences, and Claims fields Here's some more guidance on each field: *
**OIDC Discovery URL**: The URL used to retrieve the OpenID Connect configuration from the identity provider. This is used to fetch the public keys needed to verify the JWT. For Azure, set this to `https://login.microsoftonline.com/{tenant-id}/v2.0` (replace `{tenant-id}` with your Azure AD tenant ID).
*
**Issuer**: The value of the `iss` claim that the token must match. For Azure, this should be `https://login.microsoftonline.com/{tenant-id}/v2.0`.
* **Subject**: This must match the `sub` claim in the JWT. * **Audiences**: Values that must match the `aud` claim. * **Claims**: Additional claims that must be present. Refer to [Azure DevOps docs](https://learn.microsoft.com/en-us/azure/devops/pipelines/library/connect-to-azure?view=azure-devops#workload-identity-federation) for available claims. * **Access Token TTL**: Lifetime of the issued token (in seconds), e.g., `2592000` (30 days) * **Access Token Max TTL**: Maximum allowed lifetime of the token * **Access Token Max Number of Uses**: Max times the token can be used (`0` = unlimited) * **Access Token Trusted IPs**: List of allowed IP ranges (defaults to `0.0.0.0/0`) If you are unsure about what to configure for the subject, audience, and claims fields, you can inspect the JWT token from your Azure DevOps pipeline by adding a debug step that outputs the token claims. The `subject`, `audiences`, and `claims` fields support glob pattern matching; however, we highly recommend using hardcoded values whenever possible.
To enable the identity to access project-level resources such as secrets within a specific project, you should add it to that project. To do this, head over to the project you want to add the identity to and go to Project Settings > Access Control > Machine Identities and press **Add identity**. Next, select the identity you want to add to the project and the project level role you want to allow it to assume. The project role assigned will determine what project level resources this identity can have access to. identities project identities project create In Azure DevOps, to authenticate with Infisical using OIDC, you must configure a service connection that enables workload identity federation. Once set up, the OIDC token can be fetched automatically within the pipeline job context. Here's an example: ```yaml theme={"dark"} trigger: - main pool: vmImage: ubuntu-latest steps: - task: AzureCLI@2 displayName: 'Retrieve secrets from Infisical using OIDC' inputs: azureSubscription: 'your-azure-service-connection-name' scriptType: 'bash' scriptLocation: 'inlineScript' addSpnToEnvironment: true inlineScript: | # Get OIDC access token OIDC_TOKEN=$(az account get-access-token --resource "api://AzureADTokenExchange" --query accessToken -o tsv) [ -z "$OIDC_TOKEN" ] && { echo "Failed to get access token"; exit 1; } # Exchange for Infisical access token ACCESS_TOKEN=$(curl -s -X POST "/api/v1/auth/oidc-auth/login" \ -H "Content-Type: application/json" \ -d "{\"identityId\":\"{your-identity-id}\",\"jwt\":\"$OIDC_TOKEN\"}" \ | jq -r '.accessToken') # Fetch secrets curl -s -H "Authorization: Bearer $ACCESS_TOKEN" \ "/api/v3/secrets/raw?environment={your-environment-slug}&workspaceSlug={your-workspace-slug}" ``` Make sure the service connection is properly configured for workload identity federation and linked to your Azure AD app registration with appropriate claims. Each identity access token has a time-to-live (TTL) which you can infer from the response of the login operation; the default TTL is `7200` seconds which can be adjusted. If an identity access token expires, it can no longer authenticate with the Infisical API. In this case, a new access token should be obtained by performing another login operation.
--- # Source: https://infisical.com/docs/integrations/external/backstage.md > ## Documentation Index > Fetch the complete documentation index at: https://infisical.com/docs/llms.txt > Use this file to discover all available pages before exploring further. # Backstage Infisical Plugin > A powerful plugin that integrates Infisical secrets management into your Backstage developer portal. Integrate secrets management into your developer portal with the Backstage Infisical plugin suite. This plugin provides a seamless interface to manage your [Infisical](https://infisical.com) secrets directly within Backstage, including full support for environments and folder structure. ## Features * **Secrets Management**: View, create, update, and delete secrets from Infisical * **Folder Navigation**: Explore the full folder structure of your Infisical projects * **Multi-Environment Support**: Easily switch between and manage different environments * **Entity Linking**: Map Backstage entities to specific Infisical projects via annotations *** ## Installation ### Frontend Plugin ```bash theme={"dark"} # From your Backstage root directory yarn --cwd packages/app add @infisical/backstage-plugin-infisical ``` ### Backend Plugin ```bash theme={"dark"} # From your Backstage root directory yarn --cwd packages/backend add @infisical/backstage-backend-plugin-infisical ``` ## Configuration ### Backend Update your `app-config.yaml`: ```yaml theme={"dark"} infisical: baseUrl: https://app.infisical.com authentication: # Option 1: API Token Authentication auth_token: token: ${INFISICAL_API_TOKEN} # Option 2: Client Credentials Authentication universalAuth: clientId: ${INFISICAL_CLIENT_ID} clientSecret: ${INFISICAL_CLIENT_SECRET} ``` If you have not created a machine identity yet, you can do so in [Identities](/documentation/platform/identities/machine-identities) Register the plugin in `packages/backend/src/index.ts`: ```ts theme={"dark"} import { createBackend } from '@backstage/backend-defaults'; const backend = createBackend(); backend.add(import('@infisical/backstage-backend-plugin-infisical')); backend.start(); ``` ### Frontend Update `packages/app/src/App.tsx` to include the plugin: ```tsx theme={"dark"} import { infisicalPlugin } from '@infisical/backstage-plugin-infisical'; const app = createApp({ plugins: [ infisicalPlugin, // ...other plugins ], }); ``` Modify `packages/app/src/components/catalog/EntityPage.tsx`: ```tsx theme={"dark"} import { EntityInfisicalContent } from '@infisical/backstage-plugin-infisical'; const serviceEntityPage = ( {/* ...other tabs */} ); ``` ### Entity Annotation Add the Infisical project ID to your entity yaml settings: ```yaml theme={"dark"} apiVersion: backstage.io/v1alpha1 kind: Component metadata: name: example-service annotations: infisical/projectId: ``` > Replace `` with the actual project ID from Infisical. ## Usage Once installed and configured, you can: 1. **View and manage secrets** in Infisical from within Backstage 2. **Create, update, and delete** secrets using the Infisical tab in entity pages 3. **Navigate environments and folders** 4. **Search and filter** secrets by key, value, or comments Backstage Plugin Table --- # Source: https://infisical.com/docs/integrations/secret-syncs/bitbucket.md # Source: https://infisical.com/docs/integrations/cicd/bitbucket.md # Source: https://infisical.com/docs/integrations/app-connections/bitbucket.md # Source: https://infisical.com/docs/documentation/platform/secret-scanning/bitbucket.md > ## Documentation Index > Fetch the complete documentation index at: https://infisical.com/docs/llms.txt > Use this file to discover all available pages before exploring further. # Bitbucket Secret Scanning > Learn how to configure secret scanning for Bitbucket. ## Prerequisites * Create a [Bitbucket Connection](/integrations/app-connections/bitbucket) with Secret Scanning permissions ## Create a Bitbucket Data Source in Infisical 1. Navigate to your Secret Scanning Project's Dashboard and click the **Add Data Source** button. Secret Scanning Dashboard 2. Select the **Bitbucket** option. Select Bitbucket 3. Configure which workspace and repositories you would like to scan. Then click **Next**. Data Source Configuration * **Bitbucket Connection** - the connection that has access to the repositories you want to scan. * **Workspace** - the Bitbucket workspace to scan secrets in. * **Scan Repositories** - select which repositories you would like to scan. * **All Repositories** - Infisical will scan all repositories associated with your connection. * **Select Repositories** - Infisical will scan the selected repositories. * **Auto-Scan Enabled** - whether Infisical should automatically perform a scan when a push is made to configured repositories. 4. Give your data source a name and description (optional). Then click **Next**. Data Source Details * **Name** - the name of the data source. Must be slug-friendly. * **Description** (optional) - a description of this data source. 5. Review your data source, then click **Create Data Source**. Data Source Review 6. Your **Bitbucket Data Source** is now available and will begin a full scan if **Auto-Scan** is enabled. Data Source Created 7. You can view repositories and scan results by clicking on your data source. Data Source Page 8. In addition, you can review any findings from the **Findings Page**. Findings Page To create a Bitbucket Data Source, make an API request to the [Create Bitbucket Data Source](/api-reference/endpoints/secret-scanning/data-sources/bitbucket/create) API endpoint. ### Sample request ```bash Request theme={"dark"} curl --request POST \ --url https://us.infisical.com/api/v2/secret-scanning/data-sources/bitbucket \ --header 'Content-Type: application/json' \ --data '{ "name": "my-bitbucket-source", "projectId": "3c90c3cc-0d44-4b50-8888-8dd25736052a", "description": "my bitbucket data source", "connectionId": "3c90c3cc-0d44-4b50-8888-8dd25736052a", "isAutoScanEnabled": true, "config": { "workspaceSlug": "my-workspace", "includeRepos": ["*"] } }' ``` ### Sample response ```bash Response theme={"dark"} { "dataSource": { "id": "3c90c3cc-0d44-4b50-8888-8dd25736052a", "externalId": "1234567890", "name": "my-bitbucket-source", "description": "my bitbucket data source", "isAutoScanEnabled": true, "projectId": "3c90c3cc-0d44-4b50-8888-8dd25736052a", "createdAt": "2023-11-07T05:31:56Z", "updatedAt": "2023-11-07T05:31:56Z", "type": "bitbucket", "connectionId": "3c90c3cc-0d44-4b50-8888-8dd25736052a", "connection": { "app": "bitbucket", "name": "my-bitbucket-app", "id": "3c90c3cc-0d44-4b50-8888-8dd25736052a" }, "config": { "workspaceSlug": "my-workspace", "includeRepos": ["*"] } } } ``` --- # Source: https://infisical.com/docs/api-reference/endpoints/admin/bootstrap-instance.md > ## Documentation Index > Fetch the complete documentation index at: https://infisical.com/docs/llms.txt > Use this file to discover all available pages before exploring further. # Bootstrap Instance For guidance, check out the docs for [Programmatic Provisioning](/self-hosting/guides/automated-bootstrapping). ## OpenAPI ````yaml POST /api/v1/admin/bootstrap openapi: 3.0.3 info: title: Infisical API description: List of all available APIs that can be consumed version: 0.0.1 servers: - url: https://us.infisical.com description: Production server (US) - url: https://eu.infisical.com description: Production server (EU) - url: http://localhost:8080 description: Local server security: [] paths: /api/v1/admin/bootstrap: post: requestBody: content: application/json: schema: type: object properties: email: type: string format: email minLength: 1 password: type: string minLength: 1 organization: type: string minLength: 1 required: - email - password - organization additionalProperties: false required: true responses: '200': description: Default Response content: application/json: schema: type: object properties: message: type: string user: type: object properties: username: type: string firstName: type: string nullable: true lastName: type: string nullable: true email: type: string nullable: true id: type: string format: uuid superAdmin: type: boolean default: false nullable: true required: - username - id additionalProperties: false organization: type: object properties: id: type: string format: uuid name: type: string slug: type: string required: - id - name - slug additionalProperties: false identity: type: object properties: id: type: string format: uuid name: type: string credentials: type: object properties: token: type: string required: - token additionalProperties: false required: - id - name - credentials additionalProperties: false required: - message - user - organization - identity additionalProperties: false '400': description: Default Response content: application/json: schema: type: object properties: reqId: type: string statusCode: type: number enum: - 400 message: type: string error: type: string details: {} required: - reqId - statusCode - message - error additionalProperties: false '401': description: Default Response content: application/json: schema: type: object properties: reqId: type: string statusCode: type: number enum: - 401 message: type: string error: type: string required: - reqId - statusCode - message - error additionalProperties: false '403': description: Default Response content: application/json: schema: type: object properties: reqId: type: string statusCode: type: number enum: - 403 message: type: string details: {} error: type: string required: - reqId - statusCode - message - error additionalProperties: false '404': description: Default Response content: application/json: schema: type: object properties: reqId: type: string statusCode: type: number enum: - 404 message: type: string error: type: string required: - reqId - statusCode - message - error additionalProperties: false '422': description: Default Response content: application/json: schema: type: object properties: reqId: type: string statusCode: type: number enum: - 422 message: {} error: type: string required: - reqId - statusCode - error additionalProperties: false '500': description: Default Response content: application/json: schema: type: object properties: reqId: type: string statusCode: type: number enum: - 500 message: type: string error: type: string required: - reqId - statusCode - message - error additionalProperties: false ```` --- # Source: https://infisical.com/docs/cli/commands/bootstrap.md > ## Documentation Index > Fetch the complete documentation index at: https://infisical.com/docs/llms.txt > Use this file to discover all available pages before exploring further. # infisical bootstrap > Automate the initial setup of a new Infisical instance for headless deployment and infrastructure-as-code workflows ```bash theme={"dark"} infisical bootstrap --domain= --email= --password= --organization= ``` ## Description The `infisical bootstrap` command is used when deploying Infisical in automated environments where manual UI setup is not feasible. It's ideal for: * Containerized deployments in Kubernetes or Docker environments * Infrastructure-as-code pipelines with Terraform or similar tools * Continuous deployment workflows * DevOps automation scenarios The command initializes a fresh Infisical instance by creating an admin user, organization, and instance admin machine identity, enabling subsequent programmatic configuration without human intervention. This command creates an instance admin machine identity with the highest level of privileges. The returned token should be treated with the utmost security, similar to a root credential. Unauthorized access to this token could compromise your entire Infisical instance. ## Flags The URL of your Infisical instance. This can be set using the `INFISICAL_API_URL` environment variable. ```bash theme={"dark"} # Example infisical bootstrap --domain=https://your-infisical-instance.com ``` This flag is required. Email address for the admin user account that will be created. This can be set using the `INFISICAL_ADMIN_EMAIL` environment variable. ```bash theme={"dark"} # Example infisical bootstrap --email=admin@example.com ``` This flag is required. Password for the admin user account. This can be set using the `INFISICAL_ADMIN_PASSWORD` environment variable. ```bash theme={"dark"} # Example infisical bootstrap --password=your-secure-password ``` This flag is required. Name of the organization that will be created within the instance. This can be set using the `INFISICAL_ADMIN_ORGANIZATION` environment variable. ```bash theme={"dark"} # Example infisical bootstrap --organization=your-org-name ``` This flag is required. Whether to continue without error if the instance has already been bootstrapped. Useful for idempotent automation scripts. ```bash theme={"dark"} # Example infisical bootstrap --ignore-if-bootstrapped ``` This flag is optional and defaults to `false`. The type of output format for the bootstrap command. Supports `k8-secret` for Kubernetes secret integration. This flag is optional and defaults to "". ```bash theme={"dark"} # Kubernetes secret output infisical bootstrap --output=k8-secret --k8-secret-template='{"data":{"token":"{{.Identity.Credentials.Token}}"}}' --k8-secret-name=infisical-bootstrap --k8-secret-namespace=default ``` When using `k8-secret`, the command will create or update a Kubernetes secret directly in your cluster. Note that this option requires the command to be executed from within a Kubernetes pod with appropriate service account permissions. The template to use for rendering the Kubernetes secret data/stringData section. Required when using `--output=k8-secret`. The template uses Go template syntax and has access to the bootstrap response data. ```bash theme={"dark"} # Example template that stores the token infisical bootstrap --k8-secret-template='{"data":{"token":"{{.Identity.Credentials.Token}}"}}' # Example template with multiple fields infisical bootstrap --k8-secret-template='{"stringData":{"token":"{{.Identity.Credentials.Token}}","org-id":"{{.Organization.ID}}","user-email":"{{.User.Email}}"}}' ``` Available template functions: * `encodeBase64`: Base64 encode a string Available data fields: * `.Identity.Credentials.Token`: The machine identity token * `.Identity.ID`: The identity ID * `.Identity.Name`: The identity name * `.Organization.ID`: The organization ID * `.Organization.Name`: The organization name * `.Organization.Slug`: The organization slug * `.User.Email`: The admin user email * `.User.ID`: The admin user ID * `.User.FirstName`: The admin user first name * `.User.LastName`: The admin user last name This flag is required when using `k8-secret` output. The name of the Kubernetes secret to create or update. Required when using `--output=k8-secret`. ```bash theme={"dark"} # Example infisical bootstrap --k8-secret-name=infisical-bootstrap-credentials ``` This flag is required when using `k8-secret` output. The namespace where the Kubernetes secret should be created or updated. Required when using `--output=k8-secret`. ```bash theme={"dark"} # Example infisical bootstrap --k8-secret-namespace=infisical-system ``` This flag is required when using `k8-secret` output. ## Response ### JSON Output (Default) The command returns a JSON response with details about the created user, organization, and machine identity: ```json theme={"dark"} { "identity": { "credentials": { "token": "eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJpZGVudGl0eUlkIjoiZGIyMjQ3OTItZWQxOC00Mjc3LTlkYWUtNTdlNzUyMzE1ODU0IiwiaWRlbnRpdHlBY2Nlc3NUb2tlbklkIjoiZmVkZmZmMGEtYmU3Yy00NjViLWEwZWEtZjM5OTNjMTg4OGRlIiwiYXV0aFRva2VuVHlwZSI6ImlkZW50aXR5QWNjZXNzVG9rZW4iLCJpYXQiOjE3NDIzMjI0ODl9.mqcZZqIFqER1e9ubrQXp8FbzGYi8nqqZwfMvz09g-8Y" }, "id": "db224792-ed18-4277-9dae-57e752315854", "name": "Instance Admin Identity" }, "message": "Successfully bootstrapped instance", "organization": { "id": "b56bece0-42f5-4262-b25e-be7bf5f84957", "name": "dog", "slug": "dog-v-e5l" }, "user": { "email": "admin@example.com", "firstName": "Admin", "id": "a418f355-c8da-453c-bbc8-6c07208eeb3c", "lastName": "User", "superAdmin": true, "username": "admin@example.com" } } ``` ### Kubernetes Secret Output When using `--output=k8-secret`, the command creates or updates a Kubernetes secret in your cluster and logs the operation result. This is particularly useful for automated bootstrapping scenarios such as Kubernetes Jobs, GitOps workflows, or when you need to immediately store the admin credentials for use by other applications in your cluster. ## Kubernetes Integration ### Prerequisites for k8-secret Output When running with `--output=k8-secret`, the command must be executed from within a Kubernetes pod with proper service account permissions. The command automatically: 1. Reads the service account token from `/var/run/secrets/kubernetes.io/serviceaccount/token` 2. Reads the CA certificate from `/var/run/secrets/kubernetes.io/serviceaccount/ca.crt` 3. Gets the Kubernetes API server URL from environment variables (`KUBERNETES_SERVICE_HOST` and `KUBERNETES_SERVICE_PORT_HTTPS`) ### Required RBAC Permissions Your service account needs the following permissions: ```yaml theme={"dark"} apiVersion: rbac.authorization.k8s.io/v1 kind: Role metadata: name: infisical-bootstrap rules: - apiGroups: [""] resources: ["secrets"] verbs: ["get", "create", "update"] --- apiVersion: rbac.authorization.k8s.io/v1 kind: RoleBinding metadata: name: infisical-bootstrap subjects: - kind: ServiceAccount name: your-service-account roleRef: kind: Role name: infisical-bootstrap apiGroup: rbac.authorization.k8s.io ``` ## Usage with Automation For automation purposes, you can extract just the machine identity token from the response: ```bash theme={"dark"} infisical bootstrap --domain=https://your-infisical-instance.com --email=admin@example.com --password=your-secure-password --organization=your-org-name | jq ".identity.credentials.token" ``` This extracts only the token, which can be captured in a variable or piped to other commands. ## Example: Capture Token in a Variable ```bash theme={"dark"} TOKEN=$(infisical bootstrap --domain=https://your-infisical-instance.com --email=admin@example.com --password=your-secure-password --organization=your-org-name | jq -r ".identity.credentials.token") # Now use the token for further automation echo "Token has been captured and can be used for authentication" ``` ## Notes * The bootstrap process can only be performed once on a fresh Infisical instance * All core flags (domain, email, password, organization) are required for the bootstrap process to complete successfully * Security controls prevent privilege escalation: instance admin identities cannot be managed by non-instance admin users and identities * The generated admin user account can be used to log in via the UI if needed * When using `k8-secret` output, the command must run within a Kubernetes pod with proper service account permissions * The `--ignore-if-bootstrapped` flag is useful for making bootstrap scripts idempotent --- # Source: https://infisical.com/docs/api-reference/endpoints/organizations/bulk-delete-memberships.md > ## Documentation Index > Fetch the complete documentation index at: https://infisical.com/docs/llms.txt > Use this file to discover all available pages before exploring further. # Bulk Delete User Memberships > Bulk delete organization user memberships ## OpenAPI ````yaml DELETE /api/v2/organizations/{organizationId}/memberships openapi: 3.0.3 info: title: Infisical API description: List of all available APIs that can be consumed version: 0.0.1 servers: - url: https://us.infisical.com description: Production server (US) - url: https://eu.infisical.com description: Production server (EU) - url: http://localhost:8080 description: Local server security: [] paths: /api/v2/organizations/{organizationId}/memberships: delete: tags: - Organizations description: Bulk delete organization user memberships operationId: bulkDeleteOrgMemberships parameters: - schema: type: string in: path name: organizationId required: true description: The ID of the organization to delete the memberships from. requestBody: content: application/json: schema: type: object properties: membershipIds: type: array items: type: string description: The IDs of the memberships to delete. required: - membershipIds additionalProperties: false required: true responses: '200': description: Default Response content: application/json: schema: type: object properties: memberships: type: array items: type: object properties: id: type: string format: uuid role: type: string status: type: string default: invited inviteEmail: type: string nullable: true createdAt: type: string format: date-time updatedAt: type: string format: date-time userId: type: string format: uuid nullable: true orgId: type: string format: uuid roleId: type: string format: uuid nullable: true projectFavorites: type: array items: type: string nullable: true isActive: type: boolean default: true lastInvitedAt: type: string format: date-time nullable: true lastLoginAuthMethod: type: string nullable: true lastLoginTime: type: string format: date-time nullable: true required: - id - role - createdAt - updatedAt - orgId additionalProperties: false required: - memberships additionalProperties: false '400': description: Default Response content: application/json: schema: type: object properties: reqId: type: string statusCode: type: number enum: - 400 message: type: string error: type: string details: {} required: - reqId - statusCode - message - error additionalProperties: false '401': description: Default Response content: application/json: schema: type: object properties: reqId: type: string statusCode: type: number enum: - 401 message: type: string error: type: string required: - reqId - statusCode - message - error additionalProperties: false '403': description: Default Response content: application/json: schema: type: object properties: reqId: type: string statusCode: type: number enum: - 403 message: type: string details: {} error: type: string required: - reqId - statusCode - message - error additionalProperties: false '404': description: Default Response content: application/json: schema: type: object properties: reqId: type: string statusCode: type: number enum: - 404 message: type: string error: type: string required: - reqId - statusCode - message - error additionalProperties: false '422': description: Default Response content: application/json: schema: type: object properties: reqId: type: string statusCode: type: number enum: - 422 message: {} error: type: string required: - reqId - statusCode - error additionalProperties: false '500': description: Default Response content: application/json: schema: type: object properties: reqId: type: string statusCode: type: number enum: - 500 message: type: string error: type: string required: - reqId - statusCode - message - error additionalProperties: false security: - bearerAuth: [] components: securitySchemes: bearerAuth: type: http scheme: bearer bearerFormat: JWT description: An access token in Infisical ```` --- # Source: https://infisical.com/docs/api-reference/endpoints/certificates/bundle.md > ## Documentation Index > Fetch the complete documentation index at: https://infisical.com/docs/llms.txt > Use this file to discover all available pages before exploring further. # Get Certificate Bundle > Get certificate bundle including the certificate, chain, and private key. You must have the certificate `read-private-key` permission in order to call this endpoint. ## OpenAPI ````yaml GET /api/v1/cert-manager/certificates/{id}/bundle openapi: 3.0.3 info: title: Infisical API description: List of all available APIs that can be consumed version: 0.0.1 servers: - url: https://us.infisical.com description: Production server (US) - url: https://eu.infisical.com description: Production server (EU) - url: http://localhost:8080 description: Local server security: [] paths: /api/v1/cert-manager/certificates/{id}/bundle: get: tags: - PKI Certificates description: >- Get certificate bundle including the certificate, chain, and private key. operationId: getCertificateBundle parameters: - schema: type: string in: path name: id required: true description: >- The ID of the certificate to get the certificate body and certificate chain for. responses: '200': description: Default Response content: application/json: schema: type: object properties: certificate: type: string description: The certificate body of the certificate. certificateChain: type: string nullable: true description: The certificate chain of the certificate. privateKey: type: string nullable: true description: The private key of the certificate. serialNumber: type: string description: The serial number of the certificate. required: - certificate - certificateChain - privateKey - serialNumber additionalProperties: false '400': description: Default Response content: application/json: schema: type: object properties: reqId: type: string statusCode: type: number enum: - 400 message: type: string error: type: string details: {} required: - reqId - statusCode - message - error additionalProperties: false '401': description: Default Response content: application/json: schema: type: object properties: reqId: type: string statusCode: type: number enum: - 401 message: type: string error: type: string required: - reqId - statusCode - message - error additionalProperties: false '403': description: Default Response content: application/json: schema: type: object properties: reqId: type: string statusCode: type: number enum: - 403 message: type: string details: {} error: type: string required: - reqId - statusCode - message - error additionalProperties: false '404': description: Default Response content: application/json: schema: type: object properties: reqId: type: string statusCode: type: number enum: - 404 message: type: string error: type: string required: - reqId - statusCode - message - error additionalProperties: false '422': description: Default Response content: application/json: schema: type: object properties: reqId: type: string statusCode: type: number enum: - 422 message: {} error: type: string required: - reqId - statusCode - error additionalProperties: false '500': description: Default Response content: application/json: schema: type: object properties: reqId: type: string statusCode: type: number enum: - 500 message: type: string error: type: string required: - reqId - statusCode - message - error additionalProperties: false ```` --- # Source: https://infisical.com/docs/integrations/secret-syncs/camunda.md # Source: https://infisical.com/docs/integrations/app-connections/camunda.md > ## Documentation Index > Fetch the complete documentation index at: https://infisical.com/docs/llms.txt > Use this file to discover all available pages before exploring further. # Camunda Connection > Learn how to configure a Camunda Connection for Infisical. Infisical supports connecting to Camunda APIs using [client credentials](https://docs.camunda.io/docs/apis-tools/administration-api/authentication/#client-credentials-and-scopes). ## Configure Client Credentials for Infisical In your Camunda Cloud Console, navigate to the **Organization** tab in the top navigation menu. Organization Management From the Organization Management tabs, click on **Administration API** to manage your API credentials and click the **Create client credentials** button. Create Client Credentials Enter a recognizable name for your client, such as "my-infisical-client". The name can contain letters, dashes, underscores, and digits. In the "Create new client credentials" modal, select the following permissions required for secret syncs: * **Cluster**: Enable read access (Get) * **Connector secrets**: Enable all operations (Get, Create, Update, Delete) These specific permissions are required for Infisical to properly sync and manage your Camunda secrets. Set Permissions Set Permissions 2 Click the **Create** button to generate your client credentials. After creation, you'll be shown your client credentials. For the Infisical connection, you'll need: * **Client ID** (`CAMUNDA_CONSOLE_CLIENT_ID`) * **Client Secret** (`CAMUNDA_CONSOLE_CLIENT_SECRET`) **IMPORTANT**: Make sure to securely save the Client Secret, as it will not be shown again after you close this dialog. You can download these credentials or copy them to use in the next section. Client Credentials ## Setup Camunda Connection in Infisical Navigate to the **Integrations** tab in the desired project, then select **App Connections**. App Connections
    Tab Select the **Camunda Connection** option from the connection options modal. Select Camunda
    Connection Select the **Client Credentials** method and enter the Camunda client credentials you created: * **Client ID**: Your `CAMUNDA_CONSOLE_CLIENT_ID` value * **Client Secret**: Your `CAMUNDA_CONSOLE_CLIENT_SECRET` value Infisical will automatically configure the connection using these credentials to access the Camunda API. Click **Connect to Camunda** to establish the connection. Connect to Camunda Your **Camunda Connection** is now available for use in your Infisical projects. Camunda Connection
    Created --- # Source: https://infisical.com/docs/documentation/platform/dynamic-secrets/cassandra.md > ## Documentation Index > Fetch the complete documentation index at: https://infisical.com/docs/llms.txt > Use this file to discover all available pages before exploring further. # Cassandra > Learn how to dynamically generate Cassandra database user credentials The Infisical Cassandra dynamic secret allows you to generate Cassandra database credentials on demand based on configured role. ## Prerequisite Infisical requires a Cassandra user in your instance with the necessary permissions. This user will facilitate the creation of new accounts as needed. Ensure the user possesses privileges for creating, dropping, and granting permissions to roles for it to be able to create dynamic secrets. In your Cassandra configuration file `cassandra.yaml`, make sure you have the following settings: ```yaml theme={"dark"} authenticator: PasswordAuthenticator authorizer: CassandraAuthorizer ``` The above configuration allows user creation and granting permissions. ## Set up Dynamic Secrets with Cassandra Open the Secret Overview dashboard and select the environment in which you would like to add a dynamic secret. Add Dynamic Secret Button Dynamic Secret Modal Name by which you want the secret to be referenced Default time-to-live for a generated secret (it is possible to modify this value after a secret is generated) Maximum time-to-live for a generated secret Cassandra Host. You can specify multiple Cassandra hosts by separating them with commas. Cassandra port Username that will be used to create dynamic secrets Password that will be used to create dynamic secrets Specify the local data center in Cassandra that you want to use. This choice should align with your Cassandra cluster setup. Keyspace name where you want to create dynamic secrets. This ensures that the user is limited to that keyspace. A CA may be required if your cassandra requires it for incoming connections. Dynamic Secret Setup Modal Modify CQL Statements Modal Specifies a template for generating usernames. This field allows customization of how usernames are automatically created. Allowed template variables are: * `{{randomUsername}}`: Random username string. * `{{unixTimestamp}}`: Current Unix timestamp at the time of lease creation. * `{{identity.name}}`: Name of the identity that is generating the lease. * `{{dynamicSecret.name}}`: Name of the associated dynamic secret. * `{{dynamicSecret.type}}`: Type of the associated dynamic secret. * `{{random N}}`: Random string of N characters. Allowed template functions are: * `truncate`: Truncates a string to a specified length. * `replace`: Replaces a substring with another value. * `uppercase`: Converts a string to uppercase. * `lowercase`: Converts a string to lowercase. Examples: ```yaml theme={"dark"} {{ randomUsername }} // 3POnzeFyK9gW2nioK0q2gMjr6CZqsRiX {{ unixTimestamp }} // 17490641580 {{ identity.name }} // {{ random 5 }} // x9K2m {{ truncate identity.name 4 }} // test {{ replace identity.name '' 'new-value' }} // new-value ``` If you want to provide specific privileges for the generated dynamic credentials, you can modify the CQL statement to your needs. This is useful if you want to only give access to a specific key-space(s). After submitting the form, you will see a dynamic secret created in the dashboard. If this step fails, you may have to add the CA certificate. Dynamic Secret Once you've successfully configured the dynamic secret, you're ready to generate on-demand credentials. To do this, simply click on the 'Generate' button which appears when hovering over the dynamic secret item. Alternatively, you can initiate the creation of a new lease by selecting 'New Lease' from the dynamic secret lease list section. Dynamic Secret Dynamic Secret When generating these secrets, it's important to specify a Time-to-Live (TTL) duration. This will dictate how long the credentials are valid for. Provision Lease Ensure that the TTL for the lease falls within the maximum TTL defined when configuring the dynamic secret in step 4. Once you click the `Submit` button, a new secret lease will be generated and the credentials for it will be shown to you. Provision Lease ## Audit or Revoke Leases Once you have created one or more leases, you will be able to access them by clicking on the respective dynamic secret item on the dashboard. This will allow you to see the lease details and delete the lease ahead of its expiration time. Provision Lease ## Renew Leases To extend the life of the generated dynamic secret lease past its initial time to live, simply click on the **Renew** button as illustrated below. Provision Lease Lease renewals cannot exceed the maximum TTL set when configuring the dynamic secret --- # Source: https://infisical.com/docs/api-reference/endpoints/certificates/cert-body.md > ## Documentation Index > Fetch the complete documentation index at: https://infisical.com/docs/llms.txt > Use this file to discover all available pages before exploring further. # Get Certificate Body / Chain > Get certificate body of certificate ## OpenAPI ````yaml GET /api/v1/cert-manager/certificates/{id}/certificate openapi: 3.0.3 info: title: Infisical API description: List of all available APIs that can be consumed version: 0.0.1 servers: - url: https://us.infisical.com description: Production server (US) - url: https://eu.infisical.com description: Production server (EU) - url: http://localhost:8080 description: Local server security: [] paths: /api/v1/cert-manager/certificates/{id}/certificate: get: tags: - PKI Certificates description: Get certificate body of certificate operationId: getCertificateBody parameters: - schema: type: string in: path name: id required: true description: >- The ID of the certificate to get the certificate body and certificate chain for. responses: '200': description: Default Response content: application/json: schema: type: object properties: certificate: type: string description: The certificate body of the certificate. certificateChain: type: string nullable: true description: The certificate chain of the certificate. serialNumber: type: string description: The serial number of the certificate. required: - certificate - certificateChain - serialNumber additionalProperties: false '400': description: Default Response content: application/json: schema: type: object properties: reqId: type: string statusCode: type: number enum: - 400 message: type: string error: type: string details: {} required: - reqId - statusCode - message - error additionalProperties: false '401': description: Default Response content: application/json: schema: type: object properties: reqId: type: string statusCode: type: number enum: - 401 message: type: string error: type: string required: - reqId - statusCode - message - error additionalProperties: false '403': description: Default Response content: application/json: schema: type: object properties: reqId: type: string statusCode: type: number enum: - 403 message: type: string details: {} error: type: string required: - reqId - statusCode - message - error additionalProperties: false '404': description: Default Response content: application/json: schema: type: object properties: reqId: type: string statusCode: type: number enum: - 404 message: type: string error: type: string required: - reqId - statusCode - message - error additionalProperties: false '422': description: Default Response content: application/json: schema: type: object properties: reqId: type: string statusCode: type: number enum: - 422 message: {} error: type: string required: - reqId - statusCode - error additionalProperties: false '500': description: Default Response content: application/json: schema: type: object properties: reqId: type: string statusCode: type: number enum: - 500 message: type: string error: type: string required: - reqId - statusCode - message - error additionalProperties: false ```` --- # Source: https://infisical.com/docs/api-reference/endpoints/certificate-authorities/internal/cert.md > ## Documentation Index > Fetch the complete documentation index at: https://infisical.com/docs/llms.txt > Use this file to discover all available pages before exploring further. # Retrieve certificate / chain > Get current CA cert and cert chain of a CA ## OpenAPI ````yaml GET /api/v1/cert-manager/ca/internal/{caId}/certificate openapi: 3.0.3 info: title: Infisical API description: List of all available APIs that can be consumed version: 0.0.1 servers: - url: https://us.infisical.com description: Production server (US) - url: https://eu.infisical.com description: Production server (EU) - url: http://localhost:8080 description: Local server security: [] paths: /api/v1/cert-manager/ca/internal/{caId}/certificate: get: tags: - PKI Certificate Authorities description: Get current CA cert and cert chain of a CA operationId: getCaCertificate parameters: - schema: type: string in: path name: caId required: true description: >- The ID of the CA to get the certificate body and certificate chain from. responses: '200': description: Default Response content: application/json: schema: type: object properties: certificate: type: string description: The certificate body of the CA. certificateChain: type: string description: The certificate chain of the CA. serialNumber: type: string description: The serial number of the CA certificate. certId: type: string description: Certificate ID required: - certificate - certificateChain - serialNumber - certId additionalProperties: false '400': description: Default Response content: application/json: schema: type: object properties: reqId: type: string statusCode: type: number enum: - 400 message: type: string error: type: string details: {} required: - reqId - statusCode - message - error additionalProperties: false '401': description: Default Response content: application/json: schema: type: object properties: reqId: type: string statusCode: type: number enum: - 401 message: type: string error: type: string required: - reqId - statusCode - message - error additionalProperties: false '403': description: Default Response content: application/json: schema: type: object properties: reqId: type: string statusCode: type: number enum: - 403 message: type: string details: {} error: type: string required: - reqId - statusCode - message - error additionalProperties: false '404': description: Default Response content: application/json: schema: type: object properties: reqId: type: string statusCode: type: number enum: - 404 message: type: string error: type: string required: - reqId - statusCode - message - error additionalProperties: false '422': description: Default Response content: application/json: schema: type: object properties: reqId: type: string statusCode: type: number enum: - 422 message: {} error: type: string required: - reqId - statusCode - error additionalProperties: false '500': description: Default Response content: application/json: schema: type: object properties: reqId: type: string statusCode: type: number enum: - 500 message: type: string error: type: string required: - reqId - statusCode - message - error additionalProperties: false ```` --- # Source: https://infisical.com/docs/integrations/platforms/certificate-agent.md > ## Documentation Index > Fetch the complete documentation index at: https://infisical.com/docs/llms.txt > Use this file to discover all available pages before exploring further. # Infisical Agent > Learn how to use Infisical CLI Agent to manage certificates automatically. ## Concept The Infisical Agent is a client daemon that is packaged into the [Infisical CLI](/cli/overview). It can be used to request a certificate from Infisical using the [API enrollment method](/documentation/platform/pki/enrollment-methods/api) configured on a [certificate profile](/documentation/platform/pki/certificates/profiles), persist it to a specified path on the filesystem, and automatically monitor and renew it before expiration. The Infisical Agent is notable: * Automating certificate management: The agent can request, persist, monitor, and renew certificates from Infisical automatically without manual intervention. It also supports post-event hooks to execute custom commands after certificate issuance, renewal, or failure events. * Leveraging workload identity: The agent can authenticate with Infisical as a [machine identity](/documentation/platform/identities/machine-identities) using an infrastructure-native authentication method such as [AWS Auth](/docs/documentation/platform/identities/aws-auth), [Azure Auth](/docs/documentation/platform/identities/azure-auth), [GCP Auth](/docs/documentation/platform/identities/gcp-auth), [Kubernetes Auth](/docs/documentation/platform/identities/kubernetes-auth), etc. The typical workflow for using the agent involves installing the Infisical CLI on the target machine, creating a configuration file defining the certificate to request and how it should be managed, and then starting the agent with that configuration so it can request, persist, monitor, and renew the certificate before it expires. This follows a [client-driven approach](/documentation/platform/pki/certificates/certificates#client-driven-certificate-renewal) to certificate renewal. ## Workflow A typical workflow for using the Infisical Agent to request certificates from Infisical consists of the following steps: 1. Create a [certificate profile](/documentation/platform/pki/certificates/profiles) in Infisical with the [API enrollment method](/documentation/platform/pki/enrollment-methods/api) configured on it. 2. Install the [Infisical CLI](/cli/overview) on the target machine. 3. Create an agent [configuration file](/integrations/platforms/certificate-agent#agent-configuration) containing details about the certificate to request and how it should be managed such as renewal thresholds, post-event hooks, etc. 4. Start the agent with that configuration so it can request, persist, monitor, and going forward automatically renew the certificate before it expires on the target machine. ## Operating the Agent This section describes how to use the Infisical Agent to request certificates from Infisical. It covers how the agent authenticates with Infisical, and how to configure it to start requesting certificates from Infisical. ### Authentication The Infisical Agent can authenticate with Infisical as a [machine identity](/documentation/platform/identities/machine-identities) using one of its supported authentication methods. Upon successful authentication, the agent receives a short-lived access token that it uses to make subsequent authenticated requests to obtain and renew certificates from Infisical; the agent automatically handles token renewal as documented [here](/integrations/platforms/infisical-agent#token-renewal). The Universal Auth method uses a client ID and secret for authentication. To create a universal auth machine identity, follow the step by step guide outlined [here](/documentation/platform/identities/universal-auth). Update the agent configuration file with the auth method and credentials: ```yaml theme={"dark"} auth: type: "universal-auth" config: client-id: "./client-id" # Path to file containing client ID client-secret: "./client-secret" # Path to file containing client secret remove-client-secret-on-read: false # Optional: remove secret file after reading ``` You can also provide credentials directly: ```yaml theme={"dark"} auth: type: "universal-auth" config: client-id: "your-client-id" client-secret: "your-client-secret" ``` The Kubernetes Auth method is used when running the agent in a Kubernetes environment. To create a Kubernetes machine identity, follow the step by step guide outlined [here](/documentation/platform/identities/kubernetes-auth). Configure the agent to use Kubernetes service account authentication: ```yaml theme={"dark"} auth: type: "kubernetes-auth" config: identity-id: "your-kubernetes-identity-id" service-account-token-path: "/var/run/secrets/kubernetes.io/serviceaccount/token" ``` The Azure Auth method is used when running the agent in an Azure environment. To create an Azure machine identity, follow the step by step guide outlined [here](/documentation/platform/identities/azure-auth). Configure the agent to use Azure managed identity authentication: ```yaml theme={"dark"} auth: type: "azure-auth" config: identity-id: "your-azure-identity-id" ``` The Native GCP ID Token method is used to authenticate with Infisical when running in a GCP environment. To create a GCP machine identity, follow the step by step guide outlined [here](/documentation/platform/identities/gcp-auth). Update the agent configuration file with the specified auth method and identity ID: ```yaml theme={"dark"} auth: type: "gcp-id-token" config: identity-id: "your-gcp-identity-id" ``` The GCP IAM method is used to authenticate with Infisical with a GCP service account key. To create a GCP machine identity, follow the step by step guide outlined [here](/documentation/platform/identities/gcp-auth). Update the agent configuration file with the specified auth method, identity ID, and service account key: ```yaml theme={"dark"} auth: type: "gcp-iam" config: identity-id: "your-gcp-identity-id" service-account-key: "/path/to/service-account-key.json" ``` The AWS IAM method is used to authenticate with Infisical with an AWS IAM role while running in an AWS environment. To create an AWS machine identity, follow the step by step guide outlined [here](/documentation/platform/identities/aws-auth). Update the agent configuration file with the specified auth method and identity ID: ```yaml theme={"dark"} auth: type: "aws-iam" config: identity-id: "your-aws-identity-id" ``` ### Agent Configuration The Infisical Agent relies on a YAML configuration file to define its behavior, including how it should authenticate with Infisical, the certificate it should request, and how that certificate should be managed including auto-renewal. The code snippet below shows an example configuration file that instructs the agent to request and continuously renew a certificate from Infisical. Note that not all configuration options in this file are required but this example includes all of the available options. ```yaml example-cert-agent-config.yaml theme={"dark"} version: v1 # Infisical server configuration infisical: address: "https://app.infisical.com" # The URL of the Infisical instance (e.g. https://app.infisical.com, https://eu.infisical.com, https://your-self-hosted-instance.com) retry-strategy: max-retries: 3 max-delay: "5s" base-delay: "200ms" # Infisical authentication configuration auth: type: "universal-auth" # The authentication method to use (e.g. universal-auth, kubernetes-auth, azure-auth, gcp-id-token, gcp-iam, aws-iam) config: client-id: "your-client-id" client-secret: "your-client-secret" # Certificate configuration certificates: - profile-name: "prof-web-server-12345" project-slug: "my-project-slug" attributes: common-name: "api.example.com" alt-names: ["api.example.com", "api-v2.example.com"] ttl: "90d" key-algorithm: "RSA_2048" signature-algorithm: "RSA-SHA256" key-usages: - "digital_signature" - "key_encipherment" extended-key-usages: - "server_auth" # Enable automatic certificate renewal lifecycle: renew-before-expiry: "30d" status-check-interval: "6h" # Configure where to store the issued certificate and its associated private key and certificate chain file-output: private-key: path: "/etc/ssl/private/web.key" permission: "0600" # Read/write for owner only certificate: path: "/etc/ssl/certs/web.crt" permission: "0644" # Read for all, write for owner chain: path: "/etc/ssl/certs/web-chain.crt" permission: "0644" # Read for all, write for owner omit-root: true # Exclude the root CA certificate in chain # Configure custom commands to execute after certificate issuance, renewal, or failure events post-hooks: on-issuance: command: | echo "Certificate issued for ${CERT_COMMON_NAME}" systemctl reload nginx timeout: 30 on-renewal: command: | echo "Certificate renewed for ${CERT_COMMON_NAME}" systemctl reload nginx timeout: 30 on-failure: command: | echo "Certificate operation failed: ${ERROR_MESSAGE}" mail -s "Certificate Alert" admin@company.com < /dev/null timeout: 30 ``` To be more specific, the configuration file instructs the agent to: * Authenticate with Infisical using the [Universal Auth](/integrations/platforms/certificate-agent#universal-auth) authentication method. * Request a 90-day certificate against the [certificate profile](/documentation/platform/pki/certificates/profiles) named `prof-web-server-12345` with the common name `web.company.com` and the subject alternative names `web.company.com` and `www.company.com`. * Automatically renew the certificate 30 days before expiration by checking the certificate status every 6 hours and retrying up to 3 times with a base delay of 200ms and a maximum delay of 5s if the certificate status check fails. * Store the certificate and its associated private key and certificate chain (excluding the root CA certificate) in the filesystem at the specified paths with the specified permissions. * Execute custom commands after certificate issuance, renewal, or failure events such as reloading an `nginx` service or sending an email notification. ### Agent Execution After creating the configuration file, you can run the command below with the `--config` flag pointing to the path where the agent configuration file is located. ```bash theme={"dark"} infisical cert-manager agent --config /path/to/your/agent-config.yaml ``` This will start the agent as a daemon process, continuously monitoring and managing certificates according to your configuration. You can also run it in the foreground for debugging: ```bash theme={"dark"} infisical cert-manager agent --config /path/to/your/agent-config.yaml --verbose ``` For production deployments, you may consider running the agent as a system service to ensure it starts automatically and runs continuously. ### Agent Certificate Configuration Parameters The table below provides a complete list of parameters that can be configured in the **certificate configuration** section of the agent configuration file: | Parameter | Required | Description | | ------------------------------------ | ------------------------------------------------------ | ---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | | `profile-name` | Yes | The name of the [certificate profile](/documentation/platform/pki/certificates/profiles) to request a certificate against (e.g., `web-server-12345`) | | `project-slug` | Yes | The slug of the project to request a certificate against (e.g., `my-project-slug`) | | `common-name` | Optional | The common name for the certificate (e.g. `www.example.com`) | | `alt-names` | Optional | The list of subject alternative names for the certificate (e.g., `["www.example.com", "api.example.com"]`) | | `ttl` | Optional (uses profile default if not specified) | The time-to-live duration for the certificate, specified as a duration string (e.g. `72h`, `90d`, `1y`, etc.) | | `key-algorithm` | Optional | The algorithm for the certificate key pair. One of: `RSA_2048`, `RSA_3072`, `RSA_4096`, `EC_prime256v1`, `EC_secp384r1`, `EC_secp521r1`. | | `signature-algorithm` | Optional | The algorithm used to sign the certificate. One of: `RSA-SHA256`, `RSA-SHA384`, `RSA-SHA512`, `ECDSA-SHA256`, `ECDSA-SHA384`, `ECDSA-SHA512`. | | `key-usages` | Optional | The list of key usage values for the certificate. One or more of: `digital_signature`, `key_encipherment`, `non_repudiation`, `data_encipherment`, `key_agreement`, `key_cert_sign`, `crl_sign`, `encipher_only`, `decipher_only`. | | `extended-key-usages` | Optional | The list of extended key usage values for the certificate. One or more of: `server_auth`, `client_auth`, `code_signing`, `email_protection`, `timestamping`, `ocsp_signing`. | | `csr-path` | Conditional | The path to a certificate signing request (CSR) file (e.g., `./csr/webserver.csr`, `/etc/ssl/csr.pem`). This is required if using a pre-generated CSR. | | `file-output.private-key.path` | Optional (required if the `csr-path` is not specified) | The path to store the private key (required if not using a CSR) | | `file-output.private-key.permission` | Optional (defaults to `0600`) | The octal file permissions for the private key file (e.g. `0600`) | | `file-output.certificate.path` | Yes | The path to store the issued certificate in the filesystem | | `file-output.certificate.permission` | Optional (defaults to `0600`) | The octal file permissions for the certificate file (e.g. `0644`) | | `file-output.chain.path` | Optional | The path to store the certificate chain in the filesystem. | | `file-output.chain.permission` | Optional (defaults to `0600`) | The octal permissions for the chain file (e.g. `0644`) | | `file-output.chain.omit-root` | Optional (defaults to `true`) | Whether to exclude the root CA certificate from the returned certificate chain | | `lifecycle.renew-before-expiry` | Optional (auto-renewal is disabled if not set) | Duration before certificate expiration when renewal checks should begin, specified as a duration string (e.g. `72h`, `90d`, `1y`, etc.) | | `lifecycle.status-check-interval` | Optional (defaults to `10s`) | How frequently the agent checks certificate status and renewal needs, specified as a duration string (e.g. `10s`, `30m`, `1d`, etc.) | | `post-hooks.on-issuance.command` | Optional | The shell command to execute after a certificate is successfully issued for the first time (e.g., `systemctl reload nginx`, `/usr/local/bin/reload-service.sh`) | | `post-hooks.on-issuance.timeout` | Optional (defaults to `30`) | Maximum execution time in seconds for the on-issuance post-hook command before it is terminated (e.g., `30`, `60`, `120`) | | `post-hooks.on-renewal.command` | Optional | The shell command to execute after a certificate is successfully renewed (e.g., `systemctl reload nginx`, `docker restart web-server`) | | `post-hooks.on-renewal.timeout` | Optional (defaults to `30`) | Maximum execution time in seconds for the on-renewal post-hook command before it is terminated (e.g., `30`, `60`, `120`) | | `post-hooks.on-failure.command` | Optional | The shell command to execute when certificate issuance or renewal fails (e.g., `logger 'Certificate renewal failed'`, `/usr/local/bin/alert.sh`) | | `post-hooks.on-failure.timeout` | Optional (defaults to `30`) | Maximum execution time in seconds for the on-failure post-hook command before it is terminated (e.g., `10`, `30`, `60`) | ### Post-Event Hooks The Infisical Agent supports running custom commands in response to certificate lifecycle events such as issuance, renewal, and failure through the `post-hooks` configuration in the agent configuration file. Runs when a new certificate is successfully issued: ```yaml theme={"dark"} post-hooks: on-issuance: command: | echo "New certificate issued for ${CERT_COMMON_NAME}" chown nginx:nginx ${CERT_FILE_PATH} chmod 644 ${CERT_FILE_PATH} systemctl reload nginx timeout: 30 ``` Runs when a certificate is successfully renewed: ```yaml theme={"dark"} post-hooks: on-renewal: command: | echo "Certificate renewed for ${CERT_COMMON_NAME}" # Reload services that use the certificate systemctl reload nginx systemctl reload haproxy # Send notification curl -X POST https://hooks.slack.com/... \ -d "{'text': 'Certificate for ${CERT_COMMON_NAME} renewed successfully'}" timeout: 60 ``` Runs when certificate operations fail: ```yaml theme={"dark"} post-hooks: on-failure: command: | echo "Certificate operation failed for ${CERT_COMMON_NAME}: ${ERROR_MESSAGE}" # Send alert mail -s "Certificate Failure Alert" admin@company.com < /dev/null # Log to syslog logger -p daemon.error "Certificate agent failure: ${ERROR_MESSAGE}" timeout: 30 ``` ### Retrying mechanism The Infisical Agent will automatically attempt to retry any failed API requests including authentication, certificate issuance, and renewal operations. By default, the agent will retry up to 3 times with a base delay of 200ms and a maximum delay of 5s. You can configure the retrying mechanism through the agent configuration file: ```yaml theme={"dark"} infisical: address: "https://app.infisical.com" retry-strategy: max-retries: 3 max-delay: "5s" base-delay: "200ms" # ... rest of the agent configuration file ``` ## Example Agent Configuration Files Since there are several ways you might want to use the Infisical Agent to request certificates from Infisical, we provide a few example configuration files for common use cases below to help you get started. ### One-Time Certificate Issuance The code snippet below shows a configuration file that instructs the agent to request a certificate from Infisical once without performing any subsequent auto-renewal. ```yaml theme={"dark"} version: v1 # Infisical server configuration infisical: address: "https://app.infisical.com" # The URL of the Infisical instance (e.g. https://app.infisical.com, https://eu.infisical.com, https://your-self-hosted-instance.com) retry-strategy: max-retries: 3 max-delay: "5s" base-delay: "200ms" # Infisical authentication configuration auth: type: "universal-auth" # The authentication method to use (e.g. universal-auth, kubernetes-auth, azure-auth, gcp-id-token, gcp-iam, aws-iam) config: client-id: "your-client-id" client-secret: "your-client-secret" # Certificate configuration certificates: - profile-name: "prof-web-server-12345" project-slug: "my-project-slug" attributes: common-name: "api.example.com" alt-names: - "api.example.com" - "api-v2.example.com" key-algorithm: "RSA_2048" signature-algorithm: "RSA-SHA256" key-usages: - "digital_signature" - "key_encipherment" extended-key-usages: - "server_auth" ttl: "30d" file-output: private-key: path: "/etc/ssl/private/api.example.com.key" permission: "0600" certificate: path: "/etc/ssl/certs/api.example.com.crt" permission: "0644" chain: path: "/etc/ssl/certs/api.example.com.chain.crt" permission: "0644" omit-root: true ``` ### One-Time Certificate Issuance using a Pre-Generated CSR The code snippet below shows a configuration file that instructs the agent to request a certificate from Infisical once using a pre-generated CSR. Note that when `csr-path` is specified: * The `private-key` is omitted from the configuration file because we assume that it is pre-generated and managed externally, with only the CSR being submitted to Infisical for signing. * The agent will not be able to perform any auto-renewal operations, as it is assumed to not have access to the private key required to generate a new CSR. ```yaml theme={"dark"} version: v1 # Infisical server configuration infisical: address: "https://app.infisical.com" # The URL of the Infisical instance (e.g. https://app.infisical.com, https://eu.infisical.com, https://your-self-hosted-instance.com) retry-strategy: max-retries: 3 max-delay: "5s" base-delay: "200ms" # Infisical authentication configuration auth: type: "universal-auth" # The authentication method to use (e.g. universal-auth, kubernetes-auth, azure-auth, gcp-id-token, gcp-iam, aws-iam) config: client-id: "your-client-id" client-secret: "your-client-secret" # Certificate configuration certificates: - profile-name: "prof-web-server-12345" project-slug: "my-project-slug" csr-path: "/etc/ssl/requests/api.csr" file-output: certificate: path: "/etc/ssl/certs/api.example.com.crt" permission: "0644" chain: path: "/etc/ssl/certs/api.example.com.chain.crt" permission: "0644" omit-root: true ``` ### Certificate Issuance with Automatic Renewal The code snippet below shows a configuration file that instructs the agent to request a certificate from Infisical and continuously renew it 14 days before expiration, checking the certificate status every 6 hours. ```yaml theme={"dark"} version: v1 # Infisical server configuration infisical: address: "https://app.infisical.com" # The URL of the Infisical instance (e.g. https://app.infisical.com, https://eu.infisical.com, https://your-self-hosted-instance.com) retry-strategy: max-retries: 3 max-delay: "5s" base-delay: "200ms" # Infisical authentication configuration auth: type: "universal-auth" # The authentication method to use (e.g. universal-auth, kubernetes-auth, azure-auth, gcp-id-token, gcp-iam, aws-iam) config: client-id: "your-client-id" client-secret: "your-client-secret" # Certificate configuration certificates: - profile-name: "prof-web-server-12345" project-slug: "my-project-slug" attributes: common-name: "api.example.com" alt-names: - "api.example.com" - "api-v2.example.com" key-algorithm: "RSA_2048" signature-algorithm: "RSA-SHA256" key-usages: - "digital_signature" - "key_encipherment" extended-key-usages: - "server_auth" ttl: "30d" lifecycle: renew-before-expiry: "14d" # Renew 14 days before expiration status-check-interval: "6h" # Check certificate status every 6 hours file-output: private-key: path: "/etc/ssl/private/api.example.com.key" permission: "0600" certificate: path: "/etc/ssl/certs/api.example.com.crt" permission: "0644" chain: path: "/etc/ssl/certs/api.example.com.chain.crt" permission: "0644" post-hooks: on-issuance: command: "systemctl reload nginx" timeout: 30 on-renewal: command: "systemctl reload nginx && logger 'Certificate renewed'" timeout: 30 ``` --- # Source: https://infisical.com/docs/documentation/platform/pki/guides/certificate-approvals.md > ## Documentation Index > Fetch the complete documentation index at: https://infisical.com/docs/llms.txt > Use this file to discover all available pages before exploring further. # Set Up Certificate Approvals > Step-by-step guide to configuring certificate approval workflows. This guide walks through setting up [approval workflows](/documentation/platform/pki/approvals) for certificate issuance. Approval workflows add a human review step before certificates are issued, helping enforce separation of duties and meet compliance requirements. ## Diagram The following sequence diagram illustrates the certificate issuance workflow when an approval policy is configured. ```mermaid theme={"dark"} sequenceDiagram autonumber participant Client as Client participant Infis as Infisical participant Approver as Approver(s) participant CA as CA (Internal or External) Client->>Infis: Request Certificate
(Subject, SANs, Duration) Infis->>Infis: Validate Profile & Policy alt Approval Policy Found Infis-->>Client: Return Request ID
(Status: PENDING_APPROVAL) Infis->>Approver: Notify Approvers loop For Each Approval Step Approver->>Infis: Review and Approve Infis->>Infis: Check if step complete end Infis->>Infis: All steps approved end Note over Infis, CA: Issuance Phase Infis->>CA: Submit Certificate Signing Request (CSR) CA-->>Infis: Return Signed Certificate
(+ Chain) Infis-->>Client: Certificate Available
(Poll ID or Webhook) ``` ## Guide In the following steps, we set up an approval workflow for certificate issuance. First, follow the guide to create a [certificate authority](/documentation/platform/pki/ca/overview) to issue certificates from. Next, create a [certificate policy](/documentation/platform/pki/certificates/policies) that defines permitted certificate attributes. See the [guide to creating a certificate policy](/documentation/platform/pki/certificates/policies#guide-to-creating-a-certificate-policy) for detailed instructions. Create a [certificate profile](/documentation/platform/pki/certificates/profiles) that references your CA and certificate policy. See the [guide to creating a certificate profile](/documentation/platform/pki/certificates/profiles#guide-to-creating-a-certificate-profile) for detailed instructions. Select an [enrollment method](/documentation/platform/pki/enrollment-methods/overview) (API, ACME, or EST) based on how certificates will be requested. Navigate to your Certificate Management Project > Certificate Manager > Approvals > Policies and click **Create Policy**. See the [guide to creating an approval policy](/documentation/platform/pki/approvals#guide-to-creating-an-approval-policy) for detailed instructions. Configure the policy: 1. **Configuration Step**: * Enter a descriptive policy name (e.g., `production-cert-approval`) * Optionally set a maximum request TTL (e.g., `7d` for requests to expire after 7 days) * Select the certificate profile(s) that require approval * Optionally enable bypass for [machine identities](/documentation/platform/identities/machine-identities) if automated workloads need to issue certificates without approval 2. **Approval Sequence Step**: * Add one or more approval steps * For each step, select the users or groups who can approve * Set the required number of approvals per step * Enable notifications to alert approvers when their review is needed 3. **Review Step**: * Review your configuration and click **Create** Request a certificate using your chosen enrollment method: * **[API](/documentation/platform/pki/enrollment-methods/api)**: Make a request to the [Issue Certificate](/api-reference/endpoints/certificates/create-certificate) endpoint * **[ACME](/documentation/platform/pki/enrollment-methods/acme)**: Use an ACME client to request a certificate * **[EST](/documentation/platform/pki/enrollment-methods/est)**: Use an EST client to enroll for a certificate Since an approval policy is configured, the request will be placed in a `PENDING_APPROVAL` status. ### Sample API Request ```bash theme={"dark"} curl --location --request POST 'https://app.infisical.com/api/v1/cert-manager/certificates' \ --header 'Authorization: Bearer ' \ --header 'Content-Type: application/json' \ --data-raw '{ "profileId": "", "attributes": { "commonName": "example.com", "altNames": [ { "type": "DNS", "value": "www.example.com" } ], "ttl": "365d" } }' ``` ### Sample Response (Pending Approval) ```json theme={"dark"} { "status": "PENDING_APPROVAL", "certificateRequestId": "", "message": "Certificate request requires approval", "projectId": "" } ``` Navigate to your Certificate Management Project > Certificate Manager > Approvals > Requests. 1. Find the pending request in the list 2. Click on it to view the details 3. Review the certificate request information: * Requester identity * Common name and SANs * Key usages and validity period 4. Click **Approve** to approve the request (or **Reject** to deny it) If the policy has multiple approval steps, the request advances to the next step after each approval. Once all approval steps are complete, the certificate is automatically issued. After approval, retrieve the certificate using the certificate request ID or by fetching the latest certificate from the profile: ### Get Certificate by Request ID ```bash theme={"dark"} curl --location --request GET 'https://app.infisical.com/api/v3/cert-manager/certificate-requests/' \ --header 'Authorization: Bearer ' ``` --- # Source: https://infisical.com/docs/documentation/platform/pki/concepts/certificate-components.md > ## Documentation Index > Fetch the complete documentation index at: https://infisical.com/docs/llms.txt > Use this file to discover all available pages before exploring further. # Certificate Components > Learn the main components for managing certificates with Infisical. ## Core Components The following resources define how certificates are issued, shaped, and governed in Infisical: * [Certificate Authority (CA)](/documentation/platform/pki/ca/overview): The trusted entity that issues X.509 certificates. This can be an [Internal CA](/documentation/platform/pki/ca/private-ca) or an [External CA](/documentation/platform/pki/ca/external-ca) in Infisical. The former represents a fully managed CA hierarchy within Infisical, while the latter represents an external CA (e.g. [DigiCert](/documentation/platform/pki/ca/digicert), [Let's Encrypt](/documentation/platform/pki/ca/lets-encrypt), [Microsoft AD CS](/documentation/platform/pki/ca/azure-adcs), etc.) that can be integrated with Infisical. * [Certificate Policy](/documentation/platform/pki/certificates/policies): A policy structure specifying permitted attributes for requested certificates. This includes constraints around subject naming conventions, SAN fields, key usages, and extended key usages. * [Certificate Profile](/documentation/platform/pki/certificates/profiles): A configuration set specifying how leaf certificates should be issued for a group of end-entities including the issuing CA, a certificate policy, and the enrollment method (e.g. [ACME](/documentation/platform/pki/enrollment-methods/acme), [EST](/documentation/platform/pki/enrollment-methods/est), [API](/documentation/platform/pki/enrollment-methods/api), etc.) used to enroll certificates. * [Certificate](/documentation/platform/pki/certificates/certificates): The actual X.509 certificate issued for a profile. Once created, it is tracked in Infisical’s certificate inventory for management, renewal, and lifecycle operations. ## Access Control Access control defines who (or what) can manage certificate resources and who can issue certificates within a project. Without clear boundaries, [certificate authorities](/documentation/platform/pki/ca/overview) and issuance workflows can be misconfigured or misused. To manage access to certificates, you assign role-based permissions at the project level. These permissions determine which certificate authorities, certificate policies, certificate profiles, and other related resources a user or machine identity can act on. For example, you may want to: * Have specific teams(s) manage your internal CA hierarchy or external CA integration configuration and have separate team(s) configure certificate profiles for requested certificates. * Limit which teams can manage certificate policies. * Have specific end-entities (e.g. servers, devices, users) request certificates from specific certificate profiles. This model follows the [principle of least privilege](https://en.wikipedia.org/wiki/Principle_of_least_privilege) so that each user or machine identity can manage or issue only the certificate resources it is responsible for and nothing more. --- # Source: https://infisical.com/docs/documentation/platform/pki/concepts/certificate-lifecycle.md > ## Documentation Index > Fetch the complete documentation index at: https://infisical.com/docs/llms.txt > Use this file to discover all available pages before exploring further. # Certificate Lifecycle > Learn what is the certificate lifecycle and how it works. ## Certificate Lifecycle Typically, a certificate goes through a series of stages during its lifetime from creation to retirement. This is called the certificate lifecycle. The exact names of these stages may vary from vendor to vendor, but they typically include [discovery](/documentation/platform/pki/concepts/certificate-lifecycle#discovery), [enrollment](/documentation/platform/pki/concepts/certificate-lifecycle#enrollment), [deployment](/documentation/platform/pki/concepts/certificate-lifecycle#deployment), [renewal](/documentation/platform/pki/concepts/certificate-lifecycle#renewal), [revocation](/documentation/platform/pki/concepts/certificate-lifecycle#revocation), and [retirement](/documentation/platform/pki/concepts/certificate-lifecycle#retirement). Note that not every stage is needed. For instance: * You are not required to discover certificates in order to start issuing and managing them. * You may not need to revoke a certificate explicitly if it expires naturally and is replaced during routine renewal. ## Discovery Certificate discovery is the process of identifying all active and inactive certificates across an environment, including those found on web servers, load balancers, services, and devices. A complete inventory prevents outages from forgotten certificates and creates the foundation for automation and monitoring. ## Enrollment (Request / Issuance) Certificate enrollment is the process of requesting a certificate from a CA and can follow different approaches depending on the system or protocol in use. Common approaches to certificate enrollment include: * CSR-based enrollment: The client generates a key pair locally and submits a Certificate Signing Request (CSR) to a CA for certificate issuance. * CSR-less enrollment: The client requests a certificate directly from a CA which may handle key generation internally and return the key pair in the response. Enrollment can be manually completed via API or fully automated using protocols like EST or ACME. The choice of enrollment method depends on security requirements, operational constraints, and integration context. ## Approval Certificate approval is an optional workflow that adds a human review step before certificates are issued. When an [approval policy](/documentation/platform/pki/approvals) is configured for a [certificate profile](/documentation/platform/pki/certificates/profiles), certificate requests are placed in a pending state until the required approvers review and approve them. Approval workflows help organizations: * Enforce separation of duties between certificate requesters and approvers * Add oversight for certificates issued to sensitive domains or systems * Meet compliance requirements that mandate review before certificate issuance * Prevent unauthorized certificate issuance Approval policies can be configured with multiple sequential steps, each requiring a specified number of approvals from designated users or groups. [Machine identities](/documentation/platform/identities/machine-identities) can optionally bypass approval when automated certificate issuance is required for workloads. Once all approval steps are completed, the certificate is automatically issued and made available to the requester. If rejected, the request is closed and no certificate is issued. ## Deployment Certificate deployment involves installing the issued certificate on the appropriate systems and services, such as web servers, load balancers, or internal endpoints. It can also include distributing or [synchronizing certificates](/documentation/platform/pki/certificate-syncs/overview) to external systems like cloud key stores (e.g., AWS Secrets Manager, Google Secret Manager, Azure Key Vault) so they can be securely consumed by workloads running in the cloud. Deployment can happen manually or through automated mechanisms such as configuration pipelines, agents, or webhook integrations. ## Renewal Certificate renewal is the process of requesting a new certificate from a CA before it expires to maintain trust and availability; this process can involve reusing the same key pair or rotating to a new one. The renewal process can be server-driven or client-driven: * Server-driven: Infisical automatically renews the certificate on your behalf. The renewed certificate is stored in the platform and can be synchronized to external systems such as cloud key stores. * Client-driven: An external client, such as an agent or workload, initiates the renewal against Infisical. This is useful when key material needs to remain under client control or when rotation is tied to application-specific logic. This flexibility allows certificates to be renewed in a way that aligns with different security, automation, and infrastructure models. ## Revocation Certificate revocation is the process of invalidating a certificate to prevent it from being used. This is required when a certificate is compromised, misconfigured, or no longer needed. The CA signals this status to clients through CRLs or OCSP. A new certificate can be issued and deployed if needed. ## Retirement Certificate retirement is the process of removing a certificate from the system. This is typically done when a certificate is no longer needed or has expired. --- # Source: https://infisical.com/docs/documentation/platform/pki/concepts/certificate-mgmt.md > ## Documentation Index > Fetch the complete documentation index at: https://infisical.com/docs/llms.txt > Use this file to discover all available pages before exploring further. # Certificate Management > Learn what is certificate management and why it matters for building secure systems. ## What is a Certificate? A (digital) *certificate* is a file that is tied to a cryptographic key pair and is used to verify the identity of a website, user, device, or service. It helps establish trust and secure, encrypted communication between systems. For example, when you visit a website over HTTPS, your browser checks the TLS certificate deployed on the web server or load balancer to make sure it’s really the site it claims to be. If the certificate is valid, your browser establishes an encrypted connection with the server. Certificates contain information about the subject (who it identifies), the public key, and a digital signature from the Certificate Authority (CA) that issued the certificate. They also include additional fields such as key usages, validity periods, and extensions that define how and where the certificate can be used. When a certificate expires, the service presenting it is no longer trusted, and clients won't be able to establish a secure connection to the service. ## What is Certificate Management? As infrastructure scales and systems become more distributed, certificates sprawl. Without proper visibility and automation in place, certificates scatter across IT infrastructure, creating blind spots that can lead to service outages when certificates aren't renewed in time. To solve certificate sprawl and avoid outages, organizations rely on certificate management: the practice of centralizing and automating the certificate lifecycle from issuance through renewal and revocation. A consistent approach makes it easier to keep certificates valid and trusted, reduce operational risk, and maintain secure communication across environments. --- # Source: https://infisical.com/docs/api-reference/endpoints/certificates/certificate-request.md > ## Documentation Index > Fetch the complete documentation index at: https://infisical.com/docs/llms.txt > Use this file to discover all available pages before exploring further. # Get Certificate Request ## OpenAPI ````yaml GET /api/v1/cert-manager/certificates/certificate-requests/{requestId} openapi: 3.0.3 info: title: Infisical API description: List of all available APIs that can be consumed version: 0.0.1 servers: - url: https://us.infisical.com description: Production server (US) - url: https://eu.infisical.com description: Production server (EU) - url: http://localhost:8080 description: Local server security: [] paths: /api/v1/cert-manager/certificates/certificate-requests/{requestId}: get: tags: - PKI Certificates operationId: getCertificateRequest parameters: - schema: type: string format: uuid in: path name: requestId required: true responses: '200': description: Default Response content: application/json: schema: type: object properties: status: type: string enum: - pending_approval - pending - issued - failed - rejected certificate: type: string nullable: true certificateId: type: string nullable: true privateKey: type: string nullable: true serialNumber: type: string nullable: true errorMessage: type: string nullable: true commonName: type: string nullable: true organization: type: string nullable: true organizationalUnit: type: string nullable: true country: type: string nullable: true state: type: string nullable: true locality: type: string nullable: true basicConstraints: type: object properties: isCA: type: boolean pathLength: type: number required: - isCA additionalProperties: false nullable: true createdAt: type: string format: date-time updatedAt: type: string format: date-time required: - status - certificate - certificateId - privateKey - serialNumber - errorMessage - createdAt - updatedAt additionalProperties: false '400': description: Default Response content: application/json: schema: type: object properties: reqId: type: string statusCode: type: number enum: - 400 message: type: string error: type: string details: {} required: - reqId - statusCode - message - error additionalProperties: false '401': description: Default Response content: application/json: schema: type: object properties: reqId: type: string statusCode: type: number enum: - 401 message: type: string error: type: string required: - reqId - statusCode - message - error additionalProperties: false '403': description: Default Response content: application/json: schema: type: object properties: reqId: type: string statusCode: type: number enum: - 403 message: type: string details: {} error: type: string required: - reqId - statusCode - message - error additionalProperties: false '404': description: Default Response content: application/json: schema: type: object properties: reqId: type: string statusCode: type: number enum: - 404 message: type: string error: type: string required: - reqId - statusCode - message - error additionalProperties: false '422': description: Default Response content: application/json: schema: type: object properties: reqId: type: string statusCode: type: number enum: - 422 message: {} error: type: string required: - reqId - statusCode - error additionalProperties: false '500': description: Default Response content: application/json: schema: type: object properties: reqId: type: string statusCode: type: number enum: - 500 message: type: string error: type: string required: - reqId - statusCode - message - error additionalProperties: false ```` --- # Source: https://infisical.com/docs/documentation/platform/pki/certificates/certificates.md > ## Documentation Index > Fetch the complete documentation index at: https://infisical.com/docs/llms.txt > Use this file to discover all available pages before exploring further. # Certificates PKI architecture is a complex topic and there are many ways to orchestrate certificate management including renewal operations. For specific guidance and access to enterprise features, we recommend reaching out to [sales@infisical.com](mailto:sales@infisical.com) to schedule a demo. ## Concept A certificate is the (X.509) leaf certificate issued for a certificate profile. Once issued, a certificate is kept track of in the certificate inventory where you can manage various aspects of its lifecycle including deployment to cloud key stores, server-side auto-renewal behavior, revocation, and more. ## Guide to Viewing Certificate Details You can view comprehensive details for any certificate by clicking on it in the certificates table. This opens the certificate details page where you can see all certificate information and perform management actions. pki certificate details page ### Certificate Information The details page displays: * **Overview**: Common name, friendly name, status badge, serial number, and validity period. Dates are shown in UTC with local time available on hover. * **Issuance**: The issuing Certificate Authority (with link to CA details), certificate profile used, and renewal chain showing if the certificate was renewed from or has been renewed by another certificate. * **Subject Attributes**: Full distinguished name components including Organization, Organizational Unit, Country, State, Locality, and Subject Alternative Names. * **Extensions**: Basic constraints (CA flag and path length), Key Usage flags, and Extended Key Usage purposes. * **Cryptographic Info**: Key algorithm, signature algorithm, and certificate fingerprints (SHA-256 and SHA-1). ### Managing Certificates From the certificate details page, you can perform various actions using the **Options** dropdown menu: * **Export Certificate**: Download the certificate in PEM or PKCS12 format * **Enable/Manage Auto-Renewal**: Configure server-driven certificate renewal (available for API-enrolled certificates with server-generated keys) * **Renew Now**: Manually trigger certificate renewal * **Manage PKI Syncs**: Configure destinations to sync the certificate to cloud key stores * **Revoke Certificate**: Revoke the certificate with a specified reason * **Delete Certificate**: Permanently remove the certificate from the inventory ## Guide to Issuing Certificates To [issue a certificate](/documentation/platform/pki/concepts/certificate-lifecycle#enrollment-request-%2F-issuance), you must first create a [certificate profile](/documentation/platform/pki/certificates/profiles) and a [certificate policy](/documentation/platform/pki/certificates/policies) to go along with it. * Self-Signed Certificates: To issue a [self-signed certificate](https://en.wikipedia.org/wiki/Self-signed_certificate), you must configure the certificate profile to use the `Self-Signed` issuer type. You can then use the [API enrollment method](/documentation/platform/pki/enrollment-methods/api) to request a self-signed certificate against it. * CA-Issued Certificates: To issue a certificate from a certificate authority, you must configure the certificate profile to use the `Certificate Authority` issuer type and select the [issuing CA](/documentation/platform/pki/ca/overview) to use. You can then use one of the [enrollment methods](/documentation/platform/pki/enrollment-methods/overview) to request a certificate against it. To issue a certificate, navigate to your Project > Certificates > Certificate Requests and click **Request**. pki certificates Select the certificate profile and choose the **Request Method**: * **Managed**: Infisical generates and manages the private key for you. Fill out the subject attributes, SANs, algorithms, and other certificate details. * **CSR (Certificate Signing Request)**: Provide your own CSR when you need to manage your private key externally. The certificate will be issued using the subject information and public key contained in your CSR. See [Issue a Certificate with CSR](/documentation/platform/pki/guides/request-cert-csr) for more details. pki certificate issue modal When using the **CSR** method, paste your PEM-encoded Certificate Signing Request into the text area and specify the TTL: pki certificate issue modal csr When using a CSR, the subject attributes, subject alternative names, and key algorithm are extracted from your CSR. You only need to specify the TTL for the certificate. The CSR must be a valid PEM-encoded PKCS#10 request. To issue certificates via API, refer to the [API enrollment method](/documentation/platform/pki/enrollment-methods/api) documentation. ## Guide to Renewing Certificates To [renew a certificate](/documentation/platform/pki/concepts/certificate-lifecycle#renewal), you can either request a new certificate from a certificate profile or have the platform automatically request a new one for you to be delivered downstream to a target destination. Whether you pursue a client-driven or server-driven approach is totally dependent on the enrollment method configured on your certificate profile as well as your infrastructure use-case. ### Client-Driven Certificate Renewal Client-driven certificate renewal is when renewal is initiated client-side by the end-entity consuming the certificate. More specifically, the client (e.g. [Infisical Agent](/integrations/platforms/certificate-agent), [ACME client](https://letsencrypt.org/docs/client-options/), etc.) monitors the certificate and makes a request for Infisical to issue a new certificate back to it when the existing certificate is nearing expiration. This is the most common approach to certificate renewal and is suitable for most use-cases. ### Server-Driven Certificate Renewal Server-driven certificate renewal is when renewal is initiated server-side by Infisical rather than by the end-entity consuming the certificate. When a certificate considered for auto-renewal meets a specified *renewal days before expiration* threshold, Infisical reaches out to the issuing CA bound to the [certificate profile](/documentation/platform/pki/certificates/profiles) of the expiring certificate to request for a new one. The resulting renewed certificate is stored in the platform and made available to be fetched back or pushed downstream to end-entities or external systems such as cloud key stores. Note that server-driven certificate renewal is only available for certificates issued via the [API enrollment method](/documentation/platform/pki/enrollment-methods/api) where key pairs are generated server-side. A certificate can be considered for auto-renewal at time of issuance if the **Enable Auto-Renewal By Default** option is selected on its [certificate profile](/documentation/platform/pki/certificates/profiles) or after issuance by toggling this option manually. For server-driven certificate renewal workflows, you can programmatically fetch the latest active certificate bundle for a certificate profile using the [Get Latest Active Certificate Bundle](/api-reference/endpoints/certificate-profiles/get-latest-active-bundle) API endpoint. This ensures you always retrieve the most current valid certificate, including any that have been automatically renewed, making it particularly useful for deployment pipelines and automation workflows where you don't want to track individual serial numbers. The following examples demonstrate different approaches to certificate renewal: * Using the [ACME enrollment method](/documentation/platform/pki/enrollment-methods/acme), you may connect an ACME client like [certbot](https://certbot.eff.org/) to fetch back and renew certificates for [Apache](/documentation/platform/pki/integration-guides/apache-certbot), [Nginx](/documentation/platform/pki/integration-guides/nginx-certbot), or other server. The ACME client will pursue a client-driven approach and submit certificate requests upon certificate expiration for you, saving renewed certificates back to the server's configuration. * Using the [ACME enrollment method](/documentation/platform/pki/enrollment-methods/acme), you may use [cert-manager](https://cert-manager.io/) with Infisical to issue and renew certificates for Kubernetes workloads; cert-manager will pursue a client-driven approach and submit certificate requests upon certificate expiration for you, saving renewed certificates back to Kubernetes secrets. * Using the [API enrollment method](/documentation/platform/pki/enrollment-methods/api), you may push and auto-renew certificates to AWS and Azure using [certificate syncs](/documentation/platform/pki/certificate-syncs/overview). Certificates issued over the API enrollment method, where key pairs are generated server-side, are also eligible for server-side auto-renewal; once renewed, certificates are automatically pushed back to their sync destination. ## Guide to Downloading Certificates In the following steps, we explore different options for exporting already-issued certificates from Infisical in different formats for use in your applications and infrastructure. ### Download Latest Profile Certificate You can download the latest certificate issued against a [certificate profile](/documentation/platform/pki/certificates/profiles) using the [latest certificate bundle](/api-reference/endpoints/certificate-profiles/get-latest-active-bundle) endpoint. ### Download Specific Certificate To export a specific certificate, first navigate to your project's certificate inventory and locate the certificate you want to export. Click on the **Export Certificate** option from the certificate's action menu. pki export certificate option In the export modal, choose **PEM** as the format and click **Export**. pki export certificate pem The PEM export modal will display the certificate details including: * **Serial Number**: The unique identifier for the certificate * **Certificate Body**: The X.509 certificate in PEM format * **Certificate Chain**: The intermediate and root CA certificates * **Private Key**: The private key associated with the certificate (if available) pki export certificate pem modal You can copy each component individually or use the **Copy All** button to copy the complete certificate bundle. PEM format certificates can be used directly with most web servers and applications: * **Apache HTTP Server**: Configure SSL certificates in your virtual host * **Nginx**: Use the certificate and private key files in your server configuration * **Docker containers**: Mount certificate files for TLS-enabled applications * **Load balancers**: Upload PEM certificates to AWS ALB, Azure Application Gateway, etc. Example Nginx configuration: ```nginx theme={"dark"} server { listen 443 ssl; server_name example.com; ssl_certificate /path/to/certificate.pem; ssl_certificate_key /path/to/private-key.pem; } ``` In the export modal, choose **PKCS12** as the format and provide the required configuration: pki export certificate pkcs12 * **Password**: A secure password to protect the PKCS12 keystore * **Alias**: A friendly name for the certificate within the keystore Click **Export** to generate and download the `.p12` file containing the certificate, certificate chain, and private key. PKCS12 files (`.p12` extension) are binary keystore files that contain the certificate, certificate chain, and private key in a single encrypted file: * **Java applications**: Import directly into Java KeyStore (JKS) or use with SSL/TLS * **Windows IIS**: Import the PKCS12 file for web server SSL configuration * **Browser certificates**: Install client certificates for authentication * **Mobile applications**: Deploy certificates to iOS and Android applications To verify the contents of a PKCS12 file: ```bash theme={"dark"} openssl pkcs12 -in certificate.p12 -nokeys -clcerts ``` To extract the private key: ```bash theme={"dark"} openssl pkcs12 -in certificate.p12 -nocerts -out private-key.pem ``` If you need to convert the PKCS12 file to Java KeyStore (JKS) format for applications running on Java 8 or earlier, use the following keytool command: ```bash theme={"dark"} keytool -importkeystore \ -srckeystore certificate.p12 \ -srcstoretype PKCS12 \ -srcstorepass \ -destkeystore certificate.jks \ -deststoretype JKS \ -deststorepass ``` Replace `` with the password you used when exporting the PKCS12 file, and `` with your desired JKS keystore password. The resulting `.jks` file can then be used with Java applications that require JKS format keystores. ## Guide to Revoking Certificates In the following steps, we explore how to revoke a X.509 certificate and obtain a Certificate Revocation List (CRL) for a CA. Assuming that you've issued a certificate under a CA, you can revoke it by selecting the **Revoke Certificate** option for it and specifying the reason for revocation. pki revoke certificate pki revoke certificate modal In order to check the revocation status of a certificate, you can check it against the CRL of a CA by heading to its Issuing CA and downloading the CRL. pki view crl To verify a certificate against the downloaded CRL with OpenSSL, you can use the following command: ```bash theme={"dark"} openssl verify -crl_check -CAfile chain.pem -CRLfile crl.pem cert.pem ``` Note that you can also obtain the CRL from the certificate itself by referencing the CRL distribution point extension on the certificate. To check a certificate against the CRL distribution point specified within it with OpenSSL, you can use the following command: ```bash theme={"dark"} openssl verify -verbose -crl_check -crl_download -CAfile chain.pem cert.pem ``` Assuming that you've issued a certificate under a CA, you can revoke it by making an API request to the [Revoke Certificate](/api-reference/endpoints/certificates/revoke) API endpoint, specifying the serial number of the certificate and the reason for revocation. ### Sample request ```bash Request theme={"dark"} curl --location --request POST 'https://app.infisical.com/api/v1/cert-manager/certificates//revoke' \ --header 'Authorization: Bearer ' \ --header 'Content-Type: application/json' \ --data-raw '{ "revocationReason": "UNSPECIFIED" }' ``` ### Sample response ```bash Response theme={"dark"} { message: "Successfully revoked certificate", serialNumber: "...", revokedAt: "..." } ``` In order to check the revocation status of a certificate, you can check it against the CRL of the issuing CA. To obtain the CRLs of the CA, make an API request to the [List CRLs](/api-reference/endpoints/certificate-authorities/crl) API endpoint. ### Sample request ```bash Request theme={"dark"} curl --location --request GET 'https://app.infisical.com/api/v1/cert-manager/ca/internal//crls' \ --header 'Authorization: Bearer ' ``` ### Sample response ```bash Response theme={"dark"} [ { id: "...", crl: "..." }, ... ] ``` To verify a certificate against the CRL with OpenSSL, you can use the following command: ```bash theme={"dark"} openssl verify -crl_check -CAfile chain.pem -CRLfile crl.pem cert.pem ``` --- # Source: https://infisical.com/docs/integrations/secret-syncs/checkly.md # Source: https://infisical.com/docs/integrations/app-connections/checkly.md > ## Documentation Index > Fetch the complete documentation index at: https://infisical.com/docs/llms.txt > Use this file to discover all available pages before exploring further. # Checkly Connection > Learn how to configure a Checkly Connection for Infisical. Infisical supports the use of [API Keys](https://app.checklyhq.com/settings/user/api-keys) to connect with Checkly. Checkly requires the account user to have Read/Write or Admin permissions ## Create a Checkly API Token Dashboard Page User Settings Page Api Keys Page Provide a descriptive name for the token. Enter Name Create Token ## Create a Checkly Connection in Infisical In your Infisical dashboard, navigate to the **Integrations** tab in the desired project, then select **App Connections**. App Connections Tab Click **+ Add Connection** and choose **Checkly Connection** from the list of integrations. Select Checkly Connection Complete the form by providing: * A descriptive name for the connection * An optional description * The API Key value from the previous step Checkly Connection Modal After submitting the form, your **Checkly Connection** will be successfully created and ready to use with your Infisical project. Checkly Connection Created To create a Checkly Connection via API, send a request to the [Create Checkly Connection](/api-reference/endpoints/app-connections/checkly/create) endpoint. ### Sample request ```bash Request theme={"dark"} curl --request POST \ --url https://app.infisical.com/api/v1/app-connections/checkly \ --header 'Content-Type: application/json' \ --data '{ "name": "my-checkly-connection", "method": "api-key", "projectId": "7ffbb072-2575-495a-b5b0-127f88caef78", "credentials": { "apiKey": "[API KEY]" } }' ``` ### Sample response ```bash Response theme={"dark"} { "appConnection": { "id": "e5d18aca-86f7-4026-a95e-efb8aeb0d8e6", "name": "my-checkly-connection", "projectId": "7ffbb072-2575-495a-b5b0-127f88caef78", "description": null, "version": 1, "orgId": "6f03caa1-a5de-43ce-b127-95a145d3464c", "createdAt": "2025-04-23T19:46:34.831Z", "updatedAt": "2025-04-23T19:46:34.831Z", "isPlatformManagedCredentials": false, "credentialsHash": "7c2d371dec195f82a6a0d5b41c970a229cfcaf88e894a5b6395e2dbd0280661f", "app": "checkly", "method": "api-key", "credentials": {} } } ``` --- # Source: https://infisical.com/docs/integrations/secret-syncs/chef.md # Source: https://infisical.com/docs/integrations/app-connections/chef.md # Source: https://infisical.com/docs/documentation/platform/pki/certificate-syncs/chef.md > ## Documentation Index > Fetch the complete documentation index at: https://infisical.com/docs/llms.txt > Use this file to discover all available pages before exploring further. # Chef > Learn how to configure a Chef Certificate Sync for Infisical PKI. **Prerequisites:** * Create a [Chef Connection](/integrations/app-connections/chef) * Ensure your network security policies allow incoming requests from Infisical to this certificate sync provider, if network restrictions apply. The Chef Certificate Sync requires the following permissions to be set on the Chef user for Infisical to sync certificates to Chef: `data bag read`, `data bag create`, `data bag update`, `data bag delete`. Any role with these permissions would work such as a custom role with **Data Bag** permissions. Certificates synced to Chef will be stored as data bag items within the specified data bag, preserving both the certificate and private key components as separate fields. 1. Navigate to **Project** > **Integrations** > **Certificate Syncs** and press **Add Sync**. Certificate Syncs Tab 2. Select the **Chef** option. Select Chef 3. Configure the **Destination** to where certificates should be deployed, then click **Next**. Configure Destination * **Chef Connection**: The Chef Connection to authenticate with. * **Data Bag Name**: The name of the Chef data bag where certificates will be stored. 4. Configure the **Sync Options** to specify how certificates should be synced, then click **Next**. Configure Options * **Enable Removal of Expired/Revoked Certificates**: If enabled, Infisical will remove certificates from the destination if they are no longer active in Infisical. * **Preserve Data Bag Item on Renewal**: Only applies to certificate renewals. When a certificate is renewed in Infisical, this option controls how the renewed certificate is handled. If enabled, the renewed certificate will update the existing data bag item, preserving the same item name. If disabled, the renewed certificate will be created as a new data bag item with a new name. * **Include Root CA**: If enabled, the Root CA certificate will be included in the certificate chain when syncing to Chef data bags. If disabled, only intermediate certificates will be included. * **Certificate Name Schema** (Optional): Customize how certificate item names are generated in Chef data bags. Use `{{certificateId}}` as a placeholder for the certificate ID. * **Auto-Sync Enabled**: If enabled, certificates will automatically be synced when changes occur. Disable to enforce manual syncing only. 5. Configure the **Field Mappings** to customize how certificate data is stored in Chef data bag items, then click **Next**. Configure Field Mappings * **Certificate Field**: The field name where the certificate will be stored in the data bag item (default: `certificate`) * **Private Key Field**: The field name where the private key will be stored in the data bag item (default: `private_key`) * **Certificate Chain Field**: The field name where the full certificate chain excluding the root CA certificate will be stored (default: `certificate_chain`) * **CA Certificate Field**: The field name where the root CA certificate will be stored (default: `ca_certificate`) **Chef Data Bag Item Structure**: Certificates are stored in Chef data bags as items with the following structure (field names can be customized via field mappings): ```json theme={"dark"} { "id": "certificate-item-name", "certificate": "-----BEGIN CERTIFICATE-----\n...", "private_key": "-----BEGIN PRIVATE KEY-----\n...", "certificate_chain": "-----BEGIN CERTIFICATE-----\n...", "ca_certificate": "-----BEGIN CERTIFICATE-----\n..." } ``` **Example with Custom Field Mappings**: ```json theme={"dark"} { "id": "certificate-item-name", "ssl_cert": "-----BEGIN CERTIFICATE-----\n...", "ssl_key": "-----BEGIN PRIVATE KEY-----\n...", "ssl_chain": "-----BEGIN CERTIFICATE-----\n...", "ssl_ca": "-----BEGIN CERTIFICATE-----\n..." } ``` 6. Configure the **Details** of your Chef Certificate Sync, then click **Next**. Configure Details * **Name**: The name of your sync. Must be slug-friendly. * **Description**: An optional description for your sync. 7. Select which certificates should be synced to Chef. Select Certificates 8. Review your Chef Certificate Sync configuration, then click **Create Sync**. Confirm Configuration 9. If enabled, your Chef Certificate Sync will begin syncing your certificates to the destination endpoint. Sync Certificates To create a **Chef Certificate Sync**, make an API request to the [Create Chef Certificate Sync](/api-reference/endpoints/pki/syncs/chef/create) API endpoint. ### Sample request You can optionally specify `certificateIds` during sync creation to immediately add certificates to the sync. If not provided, you can add certificates later using the certificate management endpoints. ```bash Request theme={"dark"} curl --request POST \ --url https://app.infisical.com/api/v1/cert-manager/syncs/chef \ --header 'Authorization: Bearer ' \ --header 'Content-Type: application/json' \ --data '{ "name": "my-chef-cert-sync", "projectId": "3c90c3cc-0d44-4b50-8888-8dd25736052a", "description": "an example certificate sync", "connectionId": "3c90c3cc-0d44-4b50-8888-8dd25736052a", "destination": "chef", "isAutoSyncEnabled": true, "certificateIds": [ "550e8400-e29b-41d4-a716-446655440000", "660f1234-e29b-41d4-a716-446655440001" ], "syncOptions": { "canRemoveCertificates": true, "preserveSecretOnRenewal": true, "canImportCertificates": false, "includeRootCa": false, "certificateNameSchema": "myapp-{{certificateId}}", "fieldMappings": { "certificate": "ssl_cert", "privateKey": "ssl_key", "certificateChain": "ssl_chain", "caCertificate": "ssl_ca" } }, "destinationConfig": { "dataBagName": "ssl_certificates" } }' ``` ### Example with Default Field Mappings ```bash Request theme={"dark"} curl --request POST \ --url https://app.infisical.com/api/v1/cert-manager/syncs/chef \ --header 'Authorization: Bearer ' \ --header 'Content-Type: application/json' \ --data '{ "name": "my-chef-cert-sync-default", "projectId": "3c90c3cc-0d44-4b50-8888-8dd25736052a", "description": "Chef sync with default field mappings", "connectionId": "3c90c3cc-0d44-4b50-8888-8dd25736052a", "destination": "chef", "isAutoSyncEnabled": true, "syncOptions": { "canRemoveCertificates": true, "preserveSecretOnRenewal": true, "canImportCertificates": false, "includeRootCa": false, "certificateNameSchema": "{{commonName}}-{{certificateId}}", "fieldMappings": { "certificate": "certificate", "privateKey": "private_key", "certificateChain": "certificate_chain", "caCertificate": "ca_certificate" } }, "destinationConfig": { "dataBagName": "certificates" } }' ``` ### Sample response ```json Response theme={"dark"} { "pkiSync": { "id": "3c90c3cc-0d44-4b50-8888-8dd25736052a", "name": "my-chef-cert-sync", "description": "an example certificate sync", "destination": "chef", "isAutoSyncEnabled": true, "destinationConfig": { "dataBagName": "ssl_certificates" }, "syncOptions": { "canRemoveCertificates": true, "preserveSecretOnRenewal": true, "canImportCertificates": false, "includeRootCa": false, "certificateNameSchema": "myapp-{{certificateId}}", "fieldMappings": { "certificate": "ssl_cert", "privateKey": "ssl_key", "certificateChain": "ssl_chain", "caCertificate": "ssl_ca" } }, "projectId": "3c90c3cc-0d44-4b50-8888-8dd25736052a", "connectionId": "3c90c3cc-0d44-4b50-8888-8dd25736052a", "createdAt": "2023-01-01T00:00:00.000Z", "updatedAt": "2023-01-01T00:00:00.000Z" } } ``` ## Certificate Management Your Chef Certificate Sync will: * **Automatic Deployment**: Deploy certificates in Infisical to Chef data bags with customizable field names * **Certificate Updates**: Update certificates in Chef data bags when renewals occur * **Expiration Handling**: Optionally remove expired certificates from Chef data bags (if enabled) * **Format Preservation**: Maintain certificate format during sync operations * **Field Customization**: Map certificate data to custom field names that match your Chef cookbook requirements * **CA Certificate Support**: Include CA certificates in data bag items for complete certificate chain management Chef Certificate Syncs support both automatic and manual synchronization modes. When auto-sync is enabled, certificates are automatically deployed as they are issued or renewed. ## Manual Certificate Sync You can manually trigger certificate synchronization to Chef using the sync certificates functionality. This is useful for: * Initial setup when you have existing certificates to deploy * One-time sync of specific certificates * Testing certificate sync configurations * Force sync after making changes To manually sync certificates, use the [Sync Certificates](/api-reference/endpoints/pki/syncs/chef/sync-certificates) API endpoint or the manual sync option in the Infisical UI. Chef does not support importing certificates back into Infisical due to the nature of Chef data bags where certificates are stored as data rather than managed certificate objects. --- # Source: https://infisical.com/docs/integrations/secret-syncs/circleci.md # Source: https://infisical.com/docs/integrations/app-connections/circleci.md # Source: https://infisical.com/docs/documentation/platform/identities/oidc-auth/circleci.md > ## Documentation Index > Fetch the complete documentation index at: https://infisical.com/docs/llms.txt > Use this file to discover all available pages before exploring further. # CircleCI > Learn how to authenticate CircleCI jobs with Infisical using OpenID Connect (OIDC). **OIDC Auth** is a platform-agnostic JWT-based authentication method that can be used to authenticate from any platform or environment using an identity provider with OpenID Connect. ## Diagram The following sequence diagram illustrates the OIDC Auth workflow for authenticating CircleCI jobs with Infisical. ```mermaid theme={"dark"} sequenceDiagram participant Client as CircleCI Job participant Idp as CircleCI Identity Provider participant Infis as Infisical Idp->>Client: Step 1: Inject JWT with verifiable claims Note over Client,Infis: Step 2: Login Operation Client->>Infis: Send signed JWT to /api/v1/auth/oidc-auth/login Note over Infis,Idp: Step 3: Query verification Infis->>Idp: Request JWT public key using OIDC Discovery Idp-->>Infis: Return public key Note over Infis: Step 4: JWT validation Infis->>Client: Return short-lived access token Note over Client,Infis: Step 5: Access Infisical API with Token Client->>Infis: Make authenticated requests using the short-lived access token ``` ## Concept At a high-level, Infisical authenticates a client by verifying the JWT and checking that it meets specific requirements (e.g. it is issued by a trusted identity provider) at the `/api/v1/auth/oidc-auth/login` endpoint. If successful, then Infisical returns a short-lived access token that can be used to make authenticated requests to the Infisical API. To be more specific: 1. CircleCI provides the running job with a valid OIDC token specific to the execution. 2. The CircleCI OIDC token is sent to Infisical at the `/api/v1/auth/oidc-auth/login` endpoint. 3. Infisical fetches the public key that was used to sign the identity token provided by CircleCI. 4. Infisical validates the JWT using the public key provided by the identity provider and checks that the subject, audience, and claims of the token matches with the set criteria. 5. If all is well, Infisical returns a short-lived access token that CircleCI jobs can use to make authenticated requests to the Infisical API. Infisical needs network-level access to the CircleCI servers. ## Guide In the following steps, we explore how to create and use identities to access the Infisical API using the OIDC Auth authentication method. To create an identity, head to your Organization Settings > Access Control > Identities and press **Create identity**. identities organization When creating an identity, you specify an organization level [role](/documentation/platform/access-controls/role-based-access-controls) for it to assume; you can configure roles in Organization Settings > Access Control > Organization Roles. identities organization create Now input a few details for your new identity. Here's some guidance for each field: * Name (required): A friendly name for the identity. * Role (required): A role from the **Organization Roles** tab for the identity to assume. The organization role assigned will determine what organization level resources this identity can have access to. Once you've created an identity, you'll be redirected to a page where you can manage the identity. identities page Since the identity has been configured with Universal Auth by default, you should re-configure it to use OIDC Auth instead. To do this, press to edit the **Authentication** section, remove the existing Universal Auth configuration, and add a new OIDC Auth configuration onto the identity. identities page remove default auth identities create oidc auth method Restrict access by configuring the Subject, Audiences, and Claims fields Here's some more guidance on each field: * OIDC Discovery URL: The URL used to retrieve the OpenID Connect configuration from the identity provider. This will be used to fetch the public key needed for verifying the provided JWT. This should be set to `https://oidc.circleci.com/org/` where `organization_id` refers to the CircleCI organization where the job is being run. * Issuer: The unique identifier of the identity provider issuing the JWT. This value is used to verify the iss (issuer) claim in the JWT to ensure the token is issued by a trusted provider. This should be set to `https://oidc.circleci.com/org/` as well. * CA Certificate: The PEM-encoded CA cert for establishing secure communication with the Identity Provider endpoints. This can be left as blank. * Subject: The expected principal that is the subject of the JWT. The format of the sub field for CircleCI OIDC tokens is `org//project//user/` where organization\_id, project\_id, and user\_id are UUIDs that identify the CircleCI organization, project, and user, respectively. The user is the CircleCI user that caused this job to run. * Audiences: A list of intended recipients. This value is checked against the aud (audience) claim in the token. Set this to the CircleCI `organization_id` corresponding to where the job is running. * Claims: Additional information or attributes that should be present in the JWT for it to be valid. Refer to CircleCI's [documentation](https://circleci.com/docs/openid-connect-tokens) for the complete list of supported claims. * Access Token TTL (default is `2592000` equivalent to 30 days): The lifetime for an acccess token in seconds. This value will be referenced at renewal time. * Access Token Max TTL (default is `2592000` equivalent to 30 days): The maximum lifetime for an acccess token in seconds. This value will be referenced at renewal time. * Access Token Max Number of Uses (default is `0`): The maximum number of times that an access token can be used; a value of `0` implies infinite number of uses. * Access Token Trusted IPs: The IPs or CIDR ranges that access tokens can be used from. By default, each token is given the `0.0.0.0/0`, allowing usage from any network address. For more details on the appropriate values for the OIDC fields, refer to CircleCI's [documentation](https://circleci.com/docs/openid-connect-tokens). The `subject`, `audiences`, and `claims` fields support glob pattern matching; however, we highly recommend using hardcoded values whenever possible. To enable the identity to access project-level resources such as secrets within a specific project, you should add it to that project. To do this, head over to the project you want to add the identity to and go to Project Settings > Access Control > Machine Identities and press **Add identity**. Next, select the identity you want to add to the project and the project level role you want to allow it to assume. The project role assigned will determine what project level resources this identity can have access to. identities project identities project create The following is an example of how to use the `$CIRCLE_OIDC_TOKEN` with the Infisical [terraform provider](https://registry.terraform.io/providers/Infisical/infisical/latest/docs) to manage resources in a CircleCI pipeline. ```yml config.yml theme={"dark"} version: 2.1 jobs: terraform-apply: docker: - image: hashicorp/terraform:latest steps: - checkout - run: command: | export INFISICAL_AUTH_JWT="$CIRCLE_OIDC_TOKEN" terraform init terraform apply -auto-approve workflows: version: 2 build-and-test: jobs: - terraform-apply ``` The Infisical terraform provider expects the `INFISICAL_AUTH_JWT` environment variable to be set to the CircleCI OIDC token. ```hcl main.tf theme={"dark"} terraform { required_providers { infisical = { source = "infisical/infisical" } } } provider "infisical" { host = "https://app.infisical.com" auth = { oidc = { identity_id = "f2f5ee4c-6223-461a-87c3-406a6b481462" } } } resource "infisical_access_approval_policy" "prod-access-approval" { project_id = "09eda1f8-85a3-47a9-8a6f-e27f133b2a36" name = "my-approval-policy" environment_slug = "prod" secret_path = "/" approvers = [ { type = "user" username = "sheen+200@infisical.com" }, ] required_approvals = 1 enforcement_level = "soft" } ``` Each identity access token has a time-to-live (TTL) which you can infer from the response of the login operation; the default TTL is `7200` seconds which can be adjusted. If an identity access token expires, it can no longer authenticate with the Infisical API. In this case, a new access token should be obtained by performing another login operation. --- # Source: https://infisical.com/docs/documentation/getting-started/concepts/client-integrations.md > ## Documentation Index > Fetch the complete documentation index at: https://infisical.com/docs/llms.txt > Use this file to discover all available pages before exploring further. # Client Ecosystem > Get an overview of the CLI, SDKs, agents, APIs, and integrations that interact with Infisical. Infisical provides a flexible interface for integrating into development workflows and infrastructure. Around it is a rich ecosystem of clients and integrations that allow users and systems to interact with Infisical across any environment. These clients enable access to secrets, certificates, and other resources from wherever they’re needed—whether that’s a developer’s terminal, a CI/CD pipeline, or a running Kubernetes workload. ## Available Clients and Interfaces Infisical offers a non-exhaustive set of clients and interfaces to support a wide range of use cases: * [CLI](/cli/overview): A powerful command-line interface for developers and operators to interact with Infisical from local or automated environments. Commonly used for secret access, SSH credential issuance, and more. * [SDKs](/sdks/overview): Official client libraries for languages like Go, Node.js, and Python make it easy to integrate Infisical directly into applications and internal tooling. * [HTTP API](/api-reference/overview/introduction): A fully documented RESTful API powers all core functionality and enables advanced or custom integrations. * [Agents](/integrations/platforms/infisical-agent): Lightweight background processes that can fetch and sync secrets or credentials into local environments, containers, or file systems. * [Kubernetes Operator](/integrations/platforms/kubernetes/overview): A native controller that syncs Infisical secrets into Kubernetes as native Secrets, and supports secure workload integration. * [External Secrets Operator (ESO)](https://external-secrets.io/latest/provider/infisical): Allows Infisical to act as a backend provider for syncing secrets into Kubernetes `Secret` objects using the widely adopted External Secrets Operator. * [Kubernetes cert-manager](/documentation/platform/pki/k8s-cert-manager): A controller that issues X.509 certificates from Infisical using the [ACME enrollment method](/documentation/platform/pki/enrollment-methods/acme) configured on a [certificate profile](/documentation/platform/pki/certificates/profiles) using the cert-manager Issuer and Certificate CRDs. * [Secret Syncs](/integrations/secret-syncs/overview): Native integrations to forward secrets to services like GitHub, GitLab, AWS Secrets Manager, Vercel, and more. This modular ecosystem lets teams use Infisical alongside their existing stack—without requiring opinionated workflows or lock-in. --- # Source: https://infisical.com/docs/integrations/cloud/cloud-66.md # Cloud 66 > How to sync secrets from Infisical to Cloud 66 Prerequisites: * Set up and add envars to [Infisical Cloud](https://app.infisical.com) ## Navigate to your project's integrations tab integrations ## Enter your Cloud 66 Access Token In Cloud 66 Dashboard, click on the top right icon > Account Settings > Access Token integrations cloud 66 dashboard integrations cloud 66 access token Create new Personal Access Token. integrations cloud 66 personal access token Name it **infisical** and check **Public** and **Admin**. Then click "Create Token" integrations cloud 66 personal access token setup Copy and save your token. integrations cloud 66 copy API token ### Go to Infisical Integration Page Click on the Cloud 66 tile and enter your API token to grant Infisical access to your Cloud 66 account. integrations cloud 66 tile in infisical dashboard Enter your Cloud 66 Personal Access Token here. Then click "Connect to Cloud 66". integrations cloud 66 tile in infisical dashboard ## Start integration Select which Infisical environment secrets you want to sync to which Cloud 66 stacks and press create integration to start syncing secrets to Cloud 66. integrations laravel forge Any existing environment variables in Cloud 66 will be deleted when you start syncing. Make sure to add all the secrets into the Infisical dashboard first before doing any integrations. Done! integrations laravel forge --- # Source: https://infisical.com/docs/internals/architecture/cloud.md > ## Documentation Index > Fetch the complete documentation index at: https://infisical.com/docs/llms.txt > Use this file to discover all available pages before exploring further. # Infisical Cloud > Architecture overview of Infisical's US and EU cloud deployments This document provides an overview of Infisical's cloud architecture for our US and EU deployments, detailing the core components and how they interact to provide security and infrastructure services. ## Overview Infisical Cloud operates on AWS infrastructure using containerized services deployed via Amazon ECS (Elastic Container Service). Our US and EU deployments use identical architectural patterns to ensure consistency and reliability across regions. Infisical Cloud Architecture ## Components A typical Infisical Cloud deployment consists of the following components: ### Application Services * **Infisical Core**: Main application server running the Infisical backend API * **License API**: Dedicated API service for license management with separate RDS instance (shared between US/EU) * **Application Load Balancer**: Routes incoming traffic to application containers with SSL termination and host-based routing ### Data Layer * **Amazon RDS (PostgreSQL)**: * **Main RDS Instance**: Primary database for secrets, users, and metadata (Multi-AZ, encryption enabled) * **License API RDS Instance**: Dedicated database for license management services * **Amazon ElastiCache (Redis)**: * **Main Redis Cluster**: Multi-AZ replication group for core application caching and queuing * **License API Redis**: Dedicated cache for license services * Redis 7 engine with CloudWatch logging and snapshot backups ### Infrastructure * **ECS Fargate**: Serverless container platform running application services * **AWS Global Accelerator**: Global traffic routing and performance optimization * **Cloudflare**: DNS management and routing * **AWS SSM Parameter Store**: Stores application configuration and secrets * **CloudWatch**: Centralized logging and monitoring ## System Layout ### Service Architecture The Infisical application runs as multiple containerized services on ECS: * **Main Server**: Auto-scaling containerized application services * **License API**: Dedicated service with separate infrastructure (shared globally) * **Monitoring**: AWS OTel Collector and Datadog Agent sidecars Container images are pulled from Docker Hub and managed via GitHub Actions for deployments. ### Network Configuration Services are deployed in private subnets with the following connectivity: * External traffic → Application Load Balancer → ECS Services * Main server exposes port 8080 * License API exposes port 4000 (portal.infisical.com, license.infisical.com) * Service-to-service communication via AWS Service Connect ### Data Flow 1. **DNS resolution** via Cloudflare routes traffic to AWS Global Accelerator 2. **Global Accelerator** optimizes routing to the nearest AWS region 3. **Client requests** are routed through the Application Load Balancer to ECS containers 4. **Application logic** processes requests in the Infisical Core service 5. **Data persistence** occurs via encrypted connections to RDS 6. **Caching** utilizes ElastiCache for performance optimization 7. **Configuration** is retrieved from AWS SSM Parameter Store ## Regional Deployments Each region operates in a separate AWS account, providing strong isolation boundaries for security, compliance, and operational independence. ### US Cloud (us.infisical.com or app.infisical.com) * **AWS Account**: Dedicated US AWS account * **Infrastructure**: ECS-based containerized deployment * **Monitoring**: Integrated with Datadog for observability and security monitoring ### EU Cloud (eu.infisical.com) * **AWS Account**: Dedicated EU AWS account * **Infrastructure**: ECS-based containerized deployment * **Monitoring**: Integrated with Datadog for observability and security monitoring ## Configuration Management Application configuration and secrets are managed through AWS SSM Parameter Store, with deployment automation handled via GitHub Actions. ## Monitoring and Observability ### Logging * **CloudWatch**: 365-day retention for application logs * **Health Checks**: HTTP endpoint monitoring for service health ### Metrics * **AWS OTel Collector**: Prometheus metrics collection * **Datadog Agent**: Application performance monitoring and infrastructure metrics ## Container Management * **Images**: `infisical/staging_infisical` and `infisical/license-api` from Docker Hub * **Deployment**: Automated via GitHub Actions updating SSM parameter for image tags * **Registry Access**: Docker Hub credentials stored in AWS Secrets Manager * **Platform**: ECS Fargate serverless container platform ## Security Overview ### Data Protection * **Encryption**: All secrets encrypted at rest and in transit * **Network Isolation**: Services deployed in private subnets with controlled access * **Authentication**: API tokens and service accounts for secure access * **Audit Logging**: Comprehensive audit trails for all secret operations ### Network Architecture * **VPC Design**: Dedicated VPC with public and private subnets across multiple Availability Zones * **NAT Gateway**: Controlled outbound connectivity from private subnets * **Load Balancing**: Application Load Balancer with SSL termination and health checks * **Security Groups**: Restrictive firewall rules and controlled network access * **High Availability**: Multi-AZ deployment with automatic failover * **Network Monitoring**: VPC Flow Logs with 365-day retention for traffic analysis --- # Source: https://infisical.com/docs/integrations/secret-syncs/cloudflare-pages.md > ## Documentation Index > Fetch the complete documentation index at: https://infisical.com/docs/llms.txt > Use this file to discover all available pages before exploring further. # Cloudflare Pages Sync > Learn how to configure a Cloudflare Pages Sync for Infisical. **Prerequisites:** * Set up and add secrets to [Infisical Cloud](https://app.infisical.com) * Create a [Cloudflare Connection](/integrations/app-connections/cloudflare) 1. Navigate to **Project** > **Integrations** and select the **Secret Syncs** tab. Click on the **Add Sync** button. Secret Syncs Tab 2. Select the **Cloudflare Pages** option. Select Cloudflare Pages 3. Configure the **Source** from where secrets should be retrieved, then click **Next**. Configure Source * **Environment**: The project environment to retrieve secrets from. * **Secret Path**: The folder path to retrieve secrets from. If you need to sync secrets from multiple folder locations, check out [secret imports](/documentation/platform/secret-reference#secret-imports). 4. Configure the **Destination** to where secrets should be deployed, then click **Next**. Configure Destination * **Cloudflare Connection**: The Cloudflare Connection to authenticate with. * **Cloudflare Pages Project**: Choose the Cloudflare Pages project you want to sync secrets to. * **Environment**: Select the deployment environment (preview or production). 5. Configure the **Sync Options** to specify how secrets should be synced, then click **Next**. Configure Options * **Initial Sync Behavior**: Determines how Infisical should resolve the initial sync. * **Overwrite Destination Secrets**: Removes any secrets at the destination endpoint not present in Infisical. * **Key Schema**: Template that determines how secret names are transformed when syncing, using `{{secretKey}}` as a placeholder for the original secret name and `{{environment}}` for the environment. * **Auto-Sync Enabled**: If enabled, secrets will automatically be synced from the source location when changes occur. Disable to enforce manual syncing only. * **Disable Secret Deletion**: If enabled, Infisical will not remove secrets from the sync destination. Enable this option if you intend to manage some secrets manually outside of Infisical. 6. Configure the **Details** of your Cloudflare Pages Sync, then click **Next**. Configure Details * **Name**: The name of your sync. Must be slug-friendly. * **Description**: An optional description for your sync. 7. Review your Cloudflare Pages Sync configuration, then click **Create Sync**. Confirm Configuration 8. If enabled, your Cloudflare Pages Sync will begin syncing your secrets to the destination endpoint. Sync Secrets To create a **Cloudflare Pages Sync**, make an API request to the [Create Cloudflare Pages Sync](/api-reference/endpoints/secret-syncs/cloudflare-pages/create) API endpoint. ### Sample request ```bash Request theme={"dark"} curl --request POST \ --url https://app.infisical.com/api/v1/secret-syncs/cloudflare-pages \ --header 'Content-Type: application/json' \ --data '{ "name": "my-cloudflare-pages-sync", "projectId": "your-project-id", "description": "an example sync", "connectionId": "your-cloudflare-connection-id", "environment": "production", "secretPath": "/my-secrets", "isEnabled": true, "syncOptions": { "initialSyncBehavior": "overwrite-destination" }, "destinationConfig": { "projectId": "your-cloudflare-pages-project-id", "projectName": "my-pages-project", "environment": "production" } }' ``` ### Sample response ```bash Response theme={"dark"} { "secretSync": { "id": "your-sync-id", "name": "my-cloudflare-pages-sync", "description": "an example sync", "isEnabled": true, "version": 1, "folderId": "your-folder-id", "connectionId": "your-cloudflare-connection-id", "createdAt": "2024-05-01T12:00:00Z", "updatedAt": "2024-05-01T12:00:00Z", "syncStatus": "succeeded", "lastSyncJobId": "123", "lastSyncMessage": null, "lastSyncedAt": "2024-05-01T12:00:00Z", "syncOptions": { "initialSyncBehavior": "overwrite-destination" }, "projectId": "your-project-id", "connection": { "app": "cloudflare", "name": "my-cloudflare-connection", "id": "your-cloudflare-connection-id" }, "environment": { "slug": "production", "name": "Production", "id": "your-env-id" }, "folder": { "id": "your-folder-id", "path": "/my-secrets" }, "destination": "cloudflare-pages", "destinationConfig": { "projectId": "your-cloudflare-pages-project-id", "projectName": "my-pages-project", "environment": "production" } } } ``` --- # Source: https://infisical.com/docs/integrations/secret-syncs/cloudflare-workers.md > ## Documentation Index > Fetch the complete documentation index at: https://infisical.com/docs/llms.txt > Use this file to discover all available pages before exploring further. # Cloudflare Workers Sync > Learn how to configure a Cloudflare Workers Sync for Infisical. **Prerequisites:** * Set up and add secrets to [Infisical Cloud](https://app.infisical.com) * Create a [Cloudflare Connection](/integrations/app-connections/cloudflare) 1. Navigate to **Project** > **Integrations** and select the **Secret Syncs** tab. Click on the **Add Sync** button. Secret Syncs Tab 2. Select the **Cloudflare Workers** option. Select Cloudflare Workers 3. Configure the **Source** from where secrets should be retrieved, then click **Next**. Configure Source * **Environment**: The project environment to retrieve secrets from. * **Secret Path**: The folder path to retrieve secrets from. If you need to sync secrets from multiple folder locations, check out [secret imports](/documentation/platform/secret-reference#secret-imports). 4. Configure the **Destination** to where secrets should be deployed, then click **Next**. Configure Destination * **Cloudflare Connection**: The Cloudflare Connection to authenticate with. * **Cloudflare Workers Script**: Choose the Cloudflare Workers script you want to sync secrets to. 5. Configure the **Sync Options** to specify how secrets should be synced, then click **Next**. Configure Options * **Initial Sync Behavior**: Determines how Infisical should resolve the initial sync. * **Overwrite Destination Secrets**: Removes any secrets at the destination endpoint not present in Infisical. * **Key Schema**: Template that determines how secret names are transformed when syncing, using `{{secretKey}}` as a placeholder for the original secret name and `{{environment}}` for the environment. * **Auto-Sync Enabled**: If enabled, secrets will automatically be synced from the source location when changes occur. Disable to enforce manual syncing only. * **Disable Secret Deletion**: If enabled, Infisical will not remove secrets from the sync destination. Enable this option if you intend to manage some secrets manually outside of Infisical. 6. Configure the **Details** of your Cloudflare Workers Sync, then click **Next**. Configure Details * **Name**: The name of your sync. Must be slug-friendly. * **Description**: An optional description for your sync. 7. Review your Cloudflare Workers Sync configuration, then click **Create Sync**. Confirm Configuration 8. If enabled, your Cloudflare Workers Sync will begin syncing your secrets to the destination endpoint. Sync Secrets To create a **Cloudflare Workers Sync**, make an API request to the [Create Cloudflare Workers Sync](/api-reference/endpoints/secret-syncs/cloudflare-workers/create) API endpoint. ### Sample request ```bash Request theme={"dark"} curl --request POST \ --url https://app.infisical.com/api/v1/secret-syncs/cloudflare-workers \ --header 'Content-Type: application/json' \ --data '{ "name": "my-cloudflare-workers-sync", "projectId": "your-project-id", "description": "an example sync", "connectionId": "your-cloudflare-connection-id", "environment": "production", "secretPath": "/my-secrets", "isEnabled": true, "syncOptions": { "initialSyncBehavior": "overwrite-destination" }, "destinationConfig": { "scriptId": "my-workers-script" } }' ``` ### Sample response ```bash Response theme={"dark"} { "secretSync": { "id": "your-sync-id", "name": "my-cloudflare-workers-sync", "description": "an example sync", "isEnabled": true, "version": 1, "folderId": "your-folder-id", "connectionId": "your-cloudflare-connection-id", "createdAt": "2024-05-01T12:00:00Z", "updatedAt": "2024-05-01T12:00:00Z", "syncStatus": "succeeded", "lastSyncJobId": "123", "lastSyncMessage": null, "lastSyncedAt": "2024-05-01T12:00:00Z", "syncOptions": { "initialSyncBehavior": "overwrite-destination" }, "projectId": "your-project-id", "connection": { "app": "cloudflare", "name": "my-cloudflare-connection", "id": "your-cloudflare-connection-id" }, "environment": { "slug": "production", "name": "Production", "id": "your-env-id" }, "folder": { "id": "your-folder-id", "path": "/my-secrets" }, "destination": "cloudflare-workers", "destinationConfig": { "scriptId": "my-workers-script" } } } ``` --- # Source: https://infisical.com/docs/integrations/app-connections/cloudflare.md > ## Documentation Index > Fetch the complete documentation index at: https://infisical.com/docs/llms.txt > Use this file to discover all available pages before exploring further. # Cloudflare Connection > Learn how to configure a Cloudflare Connection for Infisical. Infisical supports connecting to Cloudflare using API tokens and Account ID for secure access to your Cloudflare services. ## Configure API Token and Account ID for Infisical Navigate to your Cloudflare dashboard and go to **Profile**. Navigate Cloudflare Profile Click **API Tokens > Create Token** to generate a new API token. Create API Token Configure your API token with the necessary permissions for your Cloudflare services. Depending on your use case, add one or more of the following permission sets to your API token: Use the following permissions to grant Infisical access to sync secrets to Cloudflare Pages: Configure Token **Required Permissions:** * **Account** - **Cloudflare Pages** - **Edit** * **Account** - **Account Settings** - **Read** Add these permissions to your API token and click **Continue to summary**, then **Create Token** to generate your API token. Use the following permissions to grant Infisical access to sync secrets to Cloudflare Workers: Configure Token **Required Permissions:** * **Account** - **Workers Scripts** - **Edit** * **Account** - **Account Settings** - **Read** Add these permissions to your API token and click **Continue to summary**, then **Create Token** to generate your API token. Use the following permissions to grant Infisical access to verify certificates using DNS TXT records with ACME: Configure Token **Required Permissions:** * **Account** - **Account Settings** - **Read** * **Zone** - **DNS** - **Edit** Add these permissions to your API token and click **Continue to summary**, then **Create Token** to generate your API token. After creation, copy and securely store your API token as it will not be shown again. Generated API Token Keep your API token secure and do not share it. Anyone with access to this token can manage your Cloudflare resources based on the permissions granted. From your Cloudflare Account Home page, click on the account information dropdown and select **Copy account ID**. Account ID Save your Account ID for use in the next step. ## Setup Cloudflare Connection in Infisical Navigate to the **Integrations** tab in the desired project, then select **App Connections**. App Connections
    Tab Select the **Cloudflare Connection** option from the connection options modal. Select Cloudflare
    Connection Enter your Cloudflare API token and Account ID in the provided fields and click **Connect to Cloudflare** to establish the connection. Connect to
    Cloudflare Your **Cloudflare Connection** is now available for use in your Infisical projects. Cloudflare Connection
    Created API token connections require manual token rotation when your Cloudflare API token expires or is regenerated. Monitor your connection status and update the token as needed. --- # Source: https://infisical.com/docs/contributing/getting-started/code-of-conduct.md > ## Documentation Index > Fetch the complete documentation index at: https://infisical.com/docs/llms.txt > Use this file to discover all available pages before exploring further. # Code of Conduct > What you should know before contributing to Infisical? ## Our Pledge We as members, contributors, and leaders pledge to make participation in our community a harassment-free experience for everyone, regardless of age, body size, visible or invisible disability, ethnicity, sex characteristics, gender identity and expression, level of experience, education, socio-economic status, nationality, personal appearance, race, caste, color, religion, or sexual identity and orientation. We pledge to act and interact in ways that contribute to an open, welcoming, diverse, inclusive, and healthy community. ## Our Standards Examples of behavior that contributes to a positive environment for our community include: * Demonstrating empathy and kindness toward other people * Being respectful of differing opinions, viewpoints, and experiences * Giving and gracefully accepting constructive feedback * Accepting responsibility and apologizing to those affected by our mistakes, and learning from the experience * Focusing on what is best not just for us as individuals, but for the overall community Examples of unacceptable behavior include: * The use of sexualized language or imagery, and sexual attention or advances of any kind * Trolling, insulting or derogatory comments, and personal or political attacks * Public or private harassment * Publishing others' private information, such as a physical or email address, without their explicit permission * Other conduct which could reasonably be considered inappropriate in a professional setting ## Enforcement Responsibilities Community leaders are responsible for clarifying and enforcing our standards of acceptable behavior and will take appropriate and fair corrective action in response to any behavior that they deem inappropriate, threatening, offensive, or harmful. Community leaders have the right and responsibility to remove, edit, or reject comments, commits, code, wiki edits, issues, and other contributions that are not aligned to this Code of Conduct, and will communicate reasons for moderation decisions when appropriate. ## Scope This Code of Conduct applies within all community spaces, and also applies when an individual is officially representing the community in public spaces. Examples of representing our community include using an official e-mail address, posting via an official social media account, or acting as an appointed representative at an online or offline event. ## Enforcement Instances of abusive, harassing, or otherwise unacceptable behavior may be reported to the community leaders responsible for enforcement at [team@infisical.com](mailto:team@infisical.com). All complaints will be reviewed and investigated promptly and fairly. All community leaders are obligated to respect the privacy and security of the reporter of any incident. ## Enforcement Guidelines Community leaders will follow these Community Impact Guidelines in determining the consequences for any action they deem in violation of this Code of Conduct: ### 1. Correction **Community Impact**: Use of inappropriate language or other behavior deemed unprofessional or unwelcome in the community. **Consequence**: A private, written warning from community leaders, providing clarity around the nature of the violation and an explanation of why the behavior was inappropriate. A public apology may be requested. ### 2. Warning **Community Impact**: A violation through a single incident or series of actions. **Consequence**: A warning with consequences for continued behavior. No interaction with the people involved, including unsolicited interaction with those enforcing the Code of Conduct, for a specified period of time. This includes avoiding interactions in community spaces as well as external channels like social media. Violating these terms may lead to a temporary or permanent ban. ### 3. Temporary Ban **Community Impact**: A serious violation of community standards, including sustained inappropriate behavior. **Consequence**: A temporary ban from any sort of interaction or public communication with the community for a specified period of time. No public or private interaction with the people involved, including unsolicited interaction with those enforcing the Code of Conduct, is allowed during this period. Violating these terms may lead to a permanent ban. ### 4. Permanent Ban **Community Impact**: Demonstrating a pattern of violation of community standards, including sustained inappropriate behavior, harassment of an individual, or aggression toward or disparagement of classes of individuals. **Consequence**: A permanent ban from any sort of public interaction within the community. ## Attribution This Code of Conduct is adapted from the [Contributor Covenant][homepage], version 2.1, available at [https://www.contributor-covenant.org/version/2/1/code\_of\_conduct.html][v2.1]. Community Impact Guidelines were inspired by [Mozilla's code of conduct enforcement ladder][mozilla coc]. For answers to common questions about this code of conduct, see the FAQ at [https://www.contributor-covenant.org/faq][faq]. Translations are available at [https://www.contributor-covenant.org/translations][translations]. [homepage]: https://www.contributor-covenant.org [v2.1]: https://www.contributor-covenant.org/version/2/1/code_of_conduct.html [mozilla coc]: https://github.com/mozilla/diversity [faq]: https://www.contributor-covenant.org/faq [translations]: https://www.contributor-covenant.org/translations --- # Source: https://infisical.com/docs/integrations/cicd/codefresh.md # Codefresh > How to sync secrets from Infisical to Codefresh Prerequisites: * Set up and add envars to [Infisical Cloud](https://app.infisical.com) Obtain an API key in User Settings > API Keys integrations codefresh dashboard integrations codefresh token Navigate to your project's integrations tab in Infisical. integrations Press on the Codefresh tile and input your Codefresh API key to grant Infisical access to your Codefresh account. integrations codefresh authorization Select which Infisical environment secrets you want to sync to which Codefresh service and press create integration to start syncing secrets to Codefresh. create integration codefresh integrations codefresh --- # Source: https://infisical.com/docs/self-hosting/deployment-options/native/linux-package/commands-configuration.md > ## Documentation Index > Fetch the complete documentation index at: https://infisical.com/docs/llms.txt > Use this file to discover all available pages before exploring further. # Configurations > Learn how to configure and manage the Infisical Linux package ## Configuration Overview All configuration for the Infisical Linux package is managed through a single file called `infisical.rb`, located in the `/etc/infisical` directory. This file defines all necessary settings, including encryption keys, database connections, and environment-specific settings. After making any changes to the `infisical.rb` file, always run `infisical-ctl reconfigure` to apply them. ### Example Configuration ```ruby infisical.rb theme={"dark"} # Important: Replace these values with secure keys in production infisical_core['ENCRYPTION_KEY'] = '6c1fe4e407b8911c104518103505b218' infisical_core['AUTH_SECRET'] = '5lrMXKKWCVocS/uerPsl7V+TX/aaUaI7iDkgl3tSmLE=' # Database connection strings infisical_core['DB_CONNECTION_URI'] = 'postgres://:@:5432/' infisical_core['REDIS_URL'] = 'redis://:6379' ``` For a full list of supported configuration variables, refer to the [configuration variables documentation](/self-hosting/configuration/envars). ## All `infisical-ctl` Commands The Infisical Linux package includes the `infisical-ctl` command-line tool, which allows you to manage your deployment. The available commands are listed below. | Command | Description | | --------------------------- | ------------------------------------------------------------------------ | | `infisical-ctl reconfigure` | Applies changes from `infisical.rb` and restarts the Infisical services. | | `infisical-ctl start` | Starts the Infisical services. | | `infisical-ctl stop` | Stops all running Infisical services. | | `infisical-ctl status` | Displays the current status of the Infisical services. | | `infisical-ctl tail` | Streams real-time logs from the Infisical application. | --- # Source: https://infisical.com/docs/internals/architecture/components.md > ## Documentation Index > Fetch the complete documentation index at: https://infisical.com/docs/llms.txt > Use this file to discover all available pages before exploring further. # Components > Understand Infisical's core architectural components and how they work together. ## Overview Infisical is architected around several key components that work in concert to provide a secure and streamlined secret management experience. These components span the client, API, and storage layers, ensuring that secrets are protected at every stage of their lifecycle. ## 1. API (Backend) Infisical exposes a well-documented [REST API](https://infisical.com/docs/api-reference/overview/introduction) that enables programmatic interaction with the platform, enabling a wide range of use cases. ## 2. Storage Backend Infisical relies on a robust storage backend to durably store secrets, users, and other platform data. Infisical's storage backend is [PostgreSQL](https://www.postgresql.org/). ## 3. Caching Layer Infisical uses [Redis](https://redis.com) to enable more complex workflows including a queuing system to manage long-running asynchronous tasks, cron jobs, as well as reliable cache for frequently used resources. ## 4. Clients Clients are interfaces through which users and applications interact with the Infisical API: * **Web UI**: A browser-based portal providing a user-friendly interface for managing secrets, configurations, and performing administrative tasks. * [**CLI**](https://infisical.com/docs/cli): A terminal-based tool for interacting with the Infisical API, enabling automation, scripting, and integration into CI/CD pipelines. * **SDKs (Software Development Kits)**: Platform-specific libraries with method abstractions for working with secrets. Supported languages include [Node.js](https://infisical.com/docs/sdks/languages/node), [Python](https://infisical.com/docs/sdks/languages/python), [Java](https://infisical.com/docs/sdks/languages/java), [Golang](https://infisical.com/docs/sdks/languages/go), [Ruby](https://infisical.com/docs/sdks/languages/ruby) and [.NET](https://infisical.com/docs/sdks/languages/csharp). * [**Kubernetes Operator**](https://infisical.com/docs/integrations/platforms/kubernetes): A Kubernetes-native component that facilitates the secure retrieval and management of secrets within a Kubernetes cluster. The operator supports multiple custom resource definitions (CRDs) for syncing secrets. * [**Infisical Agent**](https://infisical.com/docs/integrations/platforms/infisical-agent): Daemon that automatically fetches and manages access tokens and secrets to be used in various client resources. --- # Source: https://infisical.com/docs/documentation/platform/dynamic-secrets/couchbase.md > ## Documentation Index > Fetch the complete documentation index at: https://infisical.com/docs/llms.txt > Use this file to discover all available pages before exploring further. # Couchbase > Learn how to dynamically generate Couchbase Database user credentials. The Infisical Couchbase dynamic secret allows you to generate Couchbase Cloud Database user credentials on demand based on configured roles and bucket access permissions. ## Prerequisite Create an API Key in your Couchbase Cloud following the [official documentation](https://docs.couchbase.com/cloud/get-started/create-account.html#create-api-key). The API Key must have permission to manage database users in your Couchbase Cloud organization and project. ## Set up Dynamic Secrets with Couchbase Open the Secret Overview dashboard and select the environment in which you would like to add a dynamic secret. Add Dynamic Secret Button Dynamic Secret Modal Name by which you want the secret to be referenced Default time-to-live for a generated secret (it is possible to modify this value after a secret is generated) Maximum time-to-live for a generated secret The Couchbase Cloud API URL Your Couchbase Cloud organization ID Your Couchbase Cloud project ID Your Couchbase Cloud cluster ID where users will be created Database credential roles to assign to the generated user. Available options: * **read**: Read access to bucket data (alias for data\_reader) * **write**: Read and write access to bucket data (alias for data\_writer) Specify bucket access configuration: * Use `*` for access to all buckets * Use comma-separated bucket names (e.g., `bucket1,bucket2,bucket3`) for specific buckets * Use Advanced Bucket Configuration for granular scope and collection access Your Couchbase Cloud API Key for authentication Dynamic Secret Setup Modal Advanced Configuration Modal Enable advanced bucket configuration to specify granular access to buckets, scopes, and collections When Advanced Bucket Configuration is enabled, you can configure: List of buckets with optional scope and collection specifications: * **Bucket Name**: Name of the bucket (e.g., travel-sample) * **Scopes**: Optional array of scopes within the bucket * **Scope Name**: Name of the scope (e.g., inventory, \_default) * **Collections**: Optional array of collection names within the scope Specifies a template for generating usernames. This field allows customization of how usernames are automatically created. Allowed template variables are: * `{{randomUsername}}`: Random username string. * `{{unixTimestamp}}`: Current Unix timestamp at the time of lease creation. * `{{identity.name}}`: Name of the identity that is generating the lease. * `{{dynamicSecret.name}}`: Name of the associated dynamic secret. * `{{dynamicSecret.type}}`: Type of the associated dynamic secret. * `{{random N}}`: Random string of N characters. Allowed template functions are: * `truncate`: Truncates a string to a specified length. * `replace`: Replaces a substring with another value. * `uppercase`: Converts a string to uppercase. * `lowercase`: Converts a string to lowercase. Examples: ```yaml theme={"dark"} {{ randomUsername }} // 3POnzeFyK9gW2nioK0q2gMjr6CZqsRiX {{ unixTimestamp }} // 17490641580 {{ identity.name }} // {{ random 5 }} // x9K2m {{ truncate identity.name 4 }} // test {{ replace identity.name '' 'new-value' }} // new-value ``` Optional password generation requirements for Couchbase users: Length of the generated password Minimum required character counts: * **Lowercase Count**: Minimum lowercase letters (default: 1) * **Uppercase Count**: Minimum uppercase letters (default: 1) * **Digit Count**: Minimum digits (default: 1) * **Symbol Count**: Minimum special characters (default: 1) Special characters allowed in passwords. Cannot contain: `< > ; . * & | £` Couchbase password requirements: minimum 8 characters, maximum 128 characters, at least 1 uppercase, 1 lowercase, 1 digit, and 1 special character. Cannot contain: `< > ; . * & | £` After submitting the form, you will see a dynamic secret created in the dashboard. If this step fails, you may need to verify your Couchbase Cloud API key permissions and organization/project/cluster IDs. Dynamic Secret Once you've successfully configured the dynamic secret, you're ready to generate on-demand credentials. To do this, simply click on the 'Generate' button which appears when hovering over the dynamic secret item. Alternatively, you can initiate the creation of a new lease by selecting 'New Lease' from the dynamic secret lease list section. Dynamic Secret Dynamic Secret When generating these secrets, it's important to specify a Time-to-Live (TTL) duration. This will dictate how long the credentials are valid for. Provision Lease Ensure that the TTL for the lease falls within the maximum TTL defined when configuring the dynamic secret. Once you click the `Submit` button, a new secret lease will be generated and the credentials for it will be shown to you. Provision Lease ## Advanced Bucket Configuration Examples The advanced bucket configuration allows you to specify granular access control: ### Example 1: Specific Bucket Access ```json theme={"dark"} [ { "name": "travel-sample" } ] ``` ### Example 2: Bucket with Specific Scopes ```json theme={"dark"} [ { "name": "travel-sample", "scopes": [ { "name": "inventory" }, { "name": "_default" } ] } ] ``` ### Example 3: Bucket with Scopes and Collections ```json theme={"dark"} [ { "name": "travel-sample", "scopes": [ { "name": "inventory", "collections": ["airport", "airline"] }, { "name": "_default", "collections": ["users"] } ] } ] ``` ## Audit or Revoke Leases Once you have created one or more leases, you will be able to access them by clicking on the respective dynamic secret item on the dashboard. This will allow you to see the expiration time of the lease or delete a lease before its set time to live. Provision Lease ## Renew Leases To extend the life of the generated dynamic secret leases past its initial time to live, simply click on the **Renew** button as illustrated below. Provision Lease Lease renewals cannot exceed the maximum TTL set when configuring the dynamic secret ## Couchbase Roles and Permissions The Couchbase dynamic secret integration supports the following database credential roles: * **read**: Provides read-only access to bucket data * **write**: Provides read and write access to bucket data These roles are specifically for database credentials and are different from Couchbase's administrative roles. They provide data-level access to buckets, scopes, and collections based on your configuration. ## Troubleshooting ### Common Issues 1. **Invalid API Key**: Ensure your Couchbase Cloud API key has the necessary permissions to manage database users 2. **Invalid Organization/Project/Cluster IDs**: Verify that the provided IDs exist and are accessible with your API key 3. **Role Permission Errors**: Make sure you're using only the supported database credential roles (read, write) 4. **Bucket Access Issues**: Ensure the specified buckets exist in your cluster and are accessible --- # Source: https://infisical.com/docs/sdks/languages/cpp.md > ## Documentation Index > Fetch the complete documentation index at: https://infisical.com/docs/llms.txt > Use this file to discover all available pages before exploring further. # Infisical C++ SDK If you're working with C++, the official Infisical C++ SDK package is the easiest way to fetch and work with secrets for your application. ## Compatible with C++ 17 and later The Infisical C++ SDK is compatible with C++ 17 capable compilers. This implies GCC 8 or newer, and clang 3.8 or newer. Earlier versions of C++ are unsupported. ## Dependencies * `cURL`: Used internally for crafting HTTP requests. ## CMake Installation ```bash theme={"dark"} cmake_minimum_required(VERSION 3.14) project(InfisicalTest) set(CMAKE_CXX_STANDARD 17) set(CMAKE_CXX_STANDARD_REQUIRED ON) set(CMAKE_PREFIX_PATH ${CMAKE_BINARY_DIR}) find_package(OpenSSL REQUIRED) include(FetchContent) FetchContent_Declare( infisical GIT_REPOSITORY https://github.com/Infisical/infisical-cpp-sdk.git GIT_TAG 1.0.0 # Replace with the desired version ) FetchContent_MakeAvailable(infisical) FetchContent_GetProperties(infisical) # Example usage. This will differ based on your project structure. add_executable(my_app src/main.cpp) target_link_libraries(my_app PRIVATE infisical OpenSSL::SSL OpenSSL::Crypto) target_include_directories(my_app PRIVATE ${infisical_SOURCE_DIR}/include) ``` ## Manual Installation If you're unable to use the recommended CMake installation approach, you can choose to manually build the library and use it in your project. ```bash theme={"dark"} mkdir build cd build cmake .. make ``` ## Quick-Start Example Below you'll find an example that uses the Infisical SDK to fetch a secret with the key `API_KEY` using [Machine Identity Universal Auth](https://infisical.com/docs/documentation/platform/identities/universal-auth) More examples can be found in the [/examples](https://github.com/Infisical/infisical-cpp-sdk/tree/main/examples) folder. ```cpp theme={"dark"} #include #include int main() { try { Infisical::InfisicalClient client( Infisical::ConfigBuilder() .withHostUrl("https://app.infisical.com") // Optionally change this to your custom Infisical instance URL. .withAuthentication( Infisical::AuthenticationBuilder() .withUniversalAuth("", "") .build()) .build()); const auto getSecretOptions = Infisical::Input::GetSecretOptionsBuilder() .withEnvironment("") // dev, staging, prod, etc .withProjectId("") .withSecretKey("API_KEY") .build(); const auto apiKeySecret = client.secrets().getSecret(getSecretOptions); printf("Secret retrieved, [key=%s] [value=%s]\n", apiKeySecret.getSecretKey().c_str(), apiKeySecret.getSecretValue().c_str()); } catch (const Infisical::InfisicalError &e) { std::cerr << "Error: " << e.what() << std::endl; return 1; } return 0; } ``` ## JSON Serialization The SDK uses [nlohmann/json](https://github.com/nlohmann/json) internally to serialize/deserialize JSON data. This SDK makes no assumptions about which JSON library you use in your project, and you aren't constrained to `nlohmann/json` in any way. Data returned by the SDK is returned as a class, which exposes Getter methods for getting fields such as the secret value or secret key. ## Documentation The Infisical C++ SDK follows a builder pattern for all types of input. Below is a detailed documentation of our currently support methods. Everything related to the Infisical SDK lives inside the `Infisical` namespace. ### InfisicalClient Class `InfisicalClient(Config &config)` ```cpp theme={"dark"} Infisical::InfisicalClient client( Infisical::ConfigBuilder() .withHostUrl("https://app.infisical.com") .withAuthentication( Infisical::AuthenticationBuilder() .withUniversalAuth(clientId, clientSecret) .build()) .build()); ``` Config is created through the `ConfigBuilder` class. See below for more details ### Config Class `Config` defines the configuration of the Infisical Client itself, such as authentication. ```cpp theme={"dark"} Infisical::Config config = Infisical::ConfigBuilder() .withHostUrl("https://app.infisical.com") .withAuthentication( Infisical::AuthenticationBuilder() .withUniversalAuth(clientId, clientSecret) .build()) .build(); Infisical::InfisicalClient client(config); ``` * `withHostUrl(string)` *(optional)*: Specify a custom Infisical host URL, pointing to your Infisical instance. Defaults to `https://app.infisical.com` * `withAuthentication(Infisical::Authentication)`: Configure the authentication that will be used by the SDK. See [Authentication Class](#authentication-class) for more details. * `build()`: Returns the `Config` object with the options you configured. ### Authentication Class ```cpp theme={"dark"} Infisical::Authentication auth = Infisical::AuthenticationBuilder() .withUniversalAuth(clientId, clientSecret) .build(); Infisical::Config config = Infisical::ConfigBuilder() .withAuthentication(std::move(auth)) // Or use inline declaration .build(); ``` * `withUniversalAuth(string, string)`: Specify the Universal Auth Client ID and Client Secret that will be used for authentication. * `build()`: Returns the `Authentication` object with the options you specified. ### TSecret Class The `TSecret` class is the class that's returned by all secret methods (get/list/delete/update/create). It can come in the form of a `std::vector` or a single instance. **Available getter methods:** * `getId(): std::string`: Returns the ID of the secret. * `getWorkspace(): std::string`: Returns the project ID of the secret. * `getEnvironment(): std::string`: Returns the environment slug of the secret. * `getVersion(): unsigned int`: Gets the version of the secret. By default this will always be the latest version unless specified otherwise with `withVersion()` * `getType(): std::string`: Returns the type of the secret. Can only be `shared` or `personal`. Shared secrets are available to everyone with access to the secret. Personal secrets are personal overwrites of the secret, mainly intended for local development purposes. * `getSecretKey(): std::string`: Returns the secret key. * `getSecretValue(): std::string` Returns the secret value. * `getRotationId(): std::string`: If the secret is a rotation secret, this will return the rotation ID of the secret. If it's a regular secret, this will return an empty string. * `getSecretPath(): std::string`: Returns the secret path of the secret. * `getSkipMultilineEncoding(): bool`: Returns whether or not skip multiline encoding is enabled for the secret or not. `getIsRotatedSecret(): bool`: Returns wether or not the secret is a rotated secret. If `true`, then `getRotationId()` returns the ID of the rotation. ### Secrets #### Create Secret ```cpp theme={"dark"} const auto createSecretOptions = Infisical::Input::CreateSecretOptionsBuilder() .withEnvironment("") .withProjectId("") .withSecretKey("SECRET_KEY_TO_CREATE") .withSecretValue("VALUE_TO_CREATE") .withSecretComment("Secret comment to attach") // Optional .withSecretPath("/path/where/to/create/secret") // Optional, defaults to / .withTagIds({"tag-id-1", "tag-id-2"}) // Optional .build(); const auto secret = client.secrets().createSecret(createSecretOptions); ``` **Parameters**: * `withEnvironment(string)`: Specify the slug of the environment to create the secret in. * `withProjectId(string)`: Specify the ID of the project to create the secret in. * `withSecretPath(string)`: Specify the secret path to create the secret in. Defaults to `/` * `withSecretKey(string)`: The secret key to be created. * `withSecretValue(string)`: The value of the secret to create. * `withSecretComment(string)` *(optional)*: Optionally add a comment to the secret. * `withTagIds(std::vector>)` *(optional)*: A list of ID's of tags to attach to the secret. * `build()`: Returns the `CreateSecretOptions` class that can be passed into the `createSecret()` method. **Returns**: * Returns the created secret as a `TSecret` class. Read more in the [TSecret Class](#tsecret-class) documentation. #### Update Secret ```cpp theme={"dark"} const auto updateSecretOptions = Infisical::Input::UpdateSecretOptionsBuilder() .withEnvironment("") .withProjectId("") .withSecretKey("") .withNewSecretKey("") // Optional .withSecretValue("") // Optional .withSecretComment("Updated comment") // Optional .withSecretReminderNote("Updated reminder note") // Optional .withSecretReminderRepeatDays(1) // Optional .withType("shared") // Optional .withTagIds({"tag-id-3", "tag-id-4"}) // Optional .build(); const auto updatedSecret = client.secrets().updateSecret(updateSecretOptions); ``` **Parameters**: * `withEnvironment(string)`: Specify the slug of the environment where the secret lives in. * `withProjectId(string)`: Specify the ID of the project where the secret to update lives in. * `withSecretPath(string)`: Specify the secret path of the secret to update. Defaults to `/`. * `withType("shared" | "personal")`: *(optional)*: The type of secret to update. Defaults to `shared`. * `withSecretKey(string)`: The key of the secret you wish to update. * `withNewSecretKey(string)` *(optional)*: The new key of the secret you wish to update. * `withSecretValue(string)` *(optional)*: The new value of the secret. * `withSecretReminderNote(string)` *(optional)*: Update the secret reminder note attached to the secret. * `withSecretReminderRepeatDays(unsigned int)` *(optional)*: Update the secret reminder repeat days attached to the secret. * `withTagIds(std::vector>)` *(optional)*: A list of ID's of tags to attach to the secret. * `build()`: Returns the `UpdateSecretOptions` class that can be passed into the `updateSecret()` method. **Returns**: * Returns the updated secret as a `TSecret` class. Read more in the [TSecret Class](#tsecret-class) documentation. #### Get Secret ```cpp theme={"dark"} const auto getSecretOptions = Infisical::Input::GetSecretOptionsBuilder() .withEnvironment("") .withProjectId("") .withSecretKey("") .withType("shared") .withVersion(2) .withExpandSecretReferences(true) .build(); const auto secret = client.secrets().getSecret(getSecretOptions); ``` **Parameters**: * `withEnvironment(string)`: Specify the slug of the environment where the secret lives in. * `withProjectId(string)`: Specify the ID of the project where the secret lives in. * `withSecretPath(string)`: Specify the secret path of the secret to get. Defaults to `/` * `withType("shared" | "personal")`: *(optional)*: The type of secret to get. Defaults to `shared`. * `withSecretKey(string)`: The key of the secret to get. * `withExpandSecretReferences(bool)` *(optional)*: Whether or not to expand secret references automatically. Defaults to `true`. * `withVersion(unsigned int)` *(optional)*: Optionally fetch a specific version of the secret. If not defined, the latest version of the secret is returned. * `build()`: Returns the `GetSecretOptions` class that can be passed into the `getSecret()` method. **Returns**: * Returns the secret as a `TSecret` class. Read more in the [TSecret Class](#tsecret-class) documentation. #### Delete Secret ```cpp theme={"dark"} const auto deleteSecretOptions = Infisical::Input::DeleteSecretOptionsBuilder() .withEnvironment("") .withProjectId("") .withSecretKey("") .withType("shared") .withSecretPath("") .build(); const auto deletedSecret = client.secrets().deleteSecret(deleteSecretOptions); ``` **Parameters**: * `withEnvironment(string)`: Specify the slug of the environment where the secret to delete lives in. * `withProjectId(string)`: Specify the ID of the project where the secret to delete lives in. * `withSecretPath(string)`: Specify the secret path of the secret to delete. Defaults to `/` * `withType("shared" | "personal")`: *(optional)*: The type of secret to delete. Defaults to `shared`. * `withSecretKey(string)`: The key of the secret to delete. * `build()` Returns the `DeleteSecretOptions` class that can be passed into the `deleteSecret()` method. **Returns**: * Returns the deleted secret as a `TSecret` class. Read more in the [TSecret Class](#tsecret-class) documentation. #### List Secrets ```cpp theme={"dark"} const auto listSecretsOptions = Infisical::Input::ListSecretOptionsBuilder() .withProjectId(projectId) .withEnvironment(environment) .withSecretPath("/") .withRecursive(false) .withAddSecretsToEnvironmentVariables(false) .build(); const auto secrets = client.secrets().listSecrets(listSecretsOptions); ``` **Parameters**: * `withEnvironment(string)`: Specify the slug of the environment to list secrets from. * `withProjectId(string)`: Specify the ID of the project to fetch secrets from. * `withSecretPath(string)`: Specify the secret path to fetch secrets from. Defaults to `/` * `withExpandSecretReferences(bool)` *(optional)*: Whether or not to expand secret references automatically. Defaults to `true`. * `withRecursive(bool)` *(optional)*: Wether or not to recursively fetch secrets from sub-folders. If set to true, all secrets from the secret path specified with `withSecretPath()` and downwards will be fetched. * `withAddSecretsToEnvironmentVariables(bool)` *(optional)*: If set to true, the fetched secrets will be automatically set as environment variables, making them accessible with `std::getenv` or equivalent by secret key. * `build()`: Returns the `ListSecretsOptions` class that can be passed into the `listSecrets()` method. **Returns**: * Returns the listed secrets as `std::vector`. Read more in the [TSecret Class](#tsecret-class) documentation. --- # Source: https://infisical.com/docs/api-reference/endpoints/integrations/create-auth.md # Create Auth > Create the integration authentication object required for syncing secrets. ## OpenAPI ````yaml POST /api/v1/integration-auth/access-token paths: path: /api/v1/integration-auth/access-token method: post servers: - url: https://us.infisical.com description: Production server (US) - url: https://eu.infisical.com description: Production server (EU) - url: http://localhost:8080 description: Local server request: security: - title: bearerAuth parameters: query: {} header: Authorization: type: http scheme: bearer description: An access token in Infisical cookie: {} parameters: path: {} query: {} header: {} cookie: {} body: application/json: schemaArray: - type: object properties: workspaceId: allOf: - type: string description: The ID of the project to create the integration auth for. integration: allOf: - type: string description: The slug of integration for the auth object. accessId: allOf: - type: string description: >- The unique authorized access ID of the external integration provider. accessToken: allOf: - type: string description: >- The unique authorized access token of the external integration provider. awsAssumeIamRoleArn: allOf: - type: string format: uri description: The AWS IAM Role to be assumed by Infisical. url: allOf: - type: string format: uri namespace: allOf: - type: string refreshToken: allOf: - type: string description: The refresh token for integration authorization. required: true requiredProperties: - workspaceId - integration additionalProperties: false examples: example: value: workspaceId: integration: accessId: accessToken: awsAssumeIamRoleArn: url: namespace: refreshToken: response: '200': application/json: schemaArray: - type: object properties: integrationAuth: allOf: - type: object properties: id: type: string format: uuid projectId: type: string integration: type: string teamId: type: string nullable: true url: type: string nullable: true namespace: type: string nullable: true accountId: type: string nullable: true metadata: nullable: true createdAt: type: string format: date-time updatedAt: type: string format: date-time required: - id - projectId - integration - createdAt - updatedAt additionalProperties: false requiredProperties: - integrationAuth additionalProperties: false examples: example: value: integrationAuth: id: 3c90c3cc-0d44-4b50-8888-8dd25736052a projectId: integration: teamId: url: namespace: accountId: metadata: createdAt: '2023-11-07T05:31:56Z' updatedAt: '2023-11-07T05:31:56Z' description: Default Response '400': application/json: schemaArray: - type: object properties: reqId: allOf: - type: string statusCode: allOf: - type: number enum: - 400 message: allOf: - type: string error: allOf: - type: string requiredProperties: - reqId - statusCode - message - error additionalProperties: false examples: example: value: reqId: statusCode: 400 message: error: description: Default Response '401': application/json: schemaArray: - type: object properties: reqId: allOf: - type: string statusCode: allOf: - type: number enum: - 401 message: allOf: - type: string error: allOf: - type: string requiredProperties: - reqId - statusCode - message - error additionalProperties: false examples: example: value: reqId: statusCode: 401 message: error: description: Default Response '403': application/json: schemaArray: - type: object properties: reqId: allOf: - type: string statusCode: allOf: - type: number enum: - 403 message: allOf: - type: string details: allOf: - {} error: allOf: - type: string requiredProperties: - reqId - statusCode - message - error additionalProperties: false examples: example: value: reqId: statusCode: 403 message: details: error: description: Default Response '404': application/json: schemaArray: - type: object properties: reqId: allOf: - type: string statusCode: allOf: - type: number enum: - 404 message: allOf: - type: string error: allOf: - type: string requiredProperties: - reqId - statusCode - message - error additionalProperties: false examples: example: value: reqId: statusCode: 404 message: error: description: Default Response '422': application/json: schemaArray: - type: object properties: reqId: allOf: - type: string statusCode: allOf: - type: number enum: - 422 message: allOf: - {} error: allOf: - type: string requiredProperties: - reqId - statusCode - error additionalProperties: false examples: example: value: reqId: statusCode: 422 message: error: description: Default Response '500': application/json: schemaArray: - type: object properties: reqId: allOf: - type: string statusCode: allOf: - type: number enum: - 500 message: allOf: - type: string error: allOf: - type: string requiredProperties: - reqId - statusCode - message - error additionalProperties: false examples: example: value: reqId: statusCode: 500 message: error: description: Default Response deprecated: false type: path components: schemas: {} ```` --- # Source: https://infisical.com/docs/api-reference/endpoints/certificates/create-certificate.md > ## Documentation Index > Fetch the complete documentation index at: https://infisical.com/docs/llms.txt > Use this file to discover all available pages before exploring further. # Issue Certificate ## OpenAPI ````yaml POST /api/v1/cert-manager/certificates openapi: 3.0.3 info: title: Infisical API description: List of all available APIs that can be consumed version: 0.0.1 servers: - url: https://us.infisical.com description: Production server (US) - url: https://eu.infisical.com description: Production server (EU) - url: http://localhost:8080 description: Local server security: [] paths: /api/v1/cert-manager/certificates: post: tags: - PKI Certificates operationId: createCertificate requestBody: content: application/json: schema: type: object properties: profileId: type: string format: uuid csr: type: string minLength: 1 maxLength: 4096 attributes: type: object properties: commonName: type: string minLength: 1 maxLength: 100 organization: type: string minLength: 1 maxLength: 100 organizationalUnit: type: string minLength: 1 maxLength: 100 country: type: string minLength: 1 maxLength: 100 state: type: string minLength: 1 maxLength: 100 locality: type: string minLength: 1 maxLength: 100 keyUsages: type: array items: type: string enum: - digital_signature - key_encipherment - non_repudiation - data_encipherment - key_agreement - key_cert_sign - crl_sign - encipher_only - decipher_only extendedKeyUsages: type: array items: type: string enum: - client_auth - server_auth - code_signing - email_protection - ocsp_signing - time_stamping altNames: type: array items: type: object properties: type: type: string enum: - dns_name - ip_address - email - uri value: type: string minLength: 1 required: - type - value additionalProperties: false signatureAlgorithm: type: string enum: - RSA-SHA256 - RSA-SHA384 - RSA-SHA512 - ECDSA-SHA256 - ECDSA-SHA384 - ECDSA-SHA512 keyAlgorithm: type: string enum: - RSA_2048 - RSA_3072 - RSA_4096 - EC_prime256v1 - EC_secp384r1 - EC_secp521r1 ttl: type: string notBefore: type: string notAfter: type: string basicConstraints: type: object properties: isCA: type: boolean pathLength: type: integer minimum: 0 required: - isCA additionalProperties: false additionalProperties: false removeRootsFromChain: anyOf: - type: boolean - type: string default: false required: - profileId additionalProperties: false required: true responses: '200': description: Default Response content: application/json: schema: type: object properties: certificate: type: object properties: certificate: type: string issuingCaCertificate: type: string certificateChain: type: string privateKey: type: string serialNumber: type: string certificateId: type: string required: - certificate - issuingCaCertificate - certificateChain - serialNumber - certificateId additionalProperties: false nullable: true certificateRequestId: type: string status: type: string enum: - pending_approval - pending - issued - failed - rejected message: type: string required: - certificate - certificateRequestId additionalProperties: false '400': description: Default Response content: application/json: schema: type: object properties: reqId: type: string statusCode: type: number enum: - 400 message: type: string error: type: string details: {} required: - reqId - statusCode - message - error additionalProperties: false '401': description: Default Response content: application/json: schema: type: object properties: reqId: type: string statusCode: type: number enum: - 401 message: type: string error: type: string required: - reqId - statusCode - message - error additionalProperties: false '403': description: Default Response content: application/json: schema: type: object properties: reqId: type: string statusCode: type: number enum: - 403 message: type: string details: {} error: type: string required: - reqId - statusCode - message - error additionalProperties: false '404': description: Default Response content: application/json: schema: type: object properties: reqId: type: string statusCode: type: number enum: - 404 message: type: string error: type: string required: - reqId - statusCode - message - error additionalProperties: false '422': description: Default Response content: application/json: schema: type: object properties: reqId: type: string statusCode: type: number enum: - 422 message: {} error: type: string required: - reqId - statusCode - error additionalProperties: false '500': description: Default Response content: application/json: schema: type: object properties: reqId: type: string statusCode: type: number enum: - 500 message: type: string error: type: string required: - reqId - statusCode - message - error additionalProperties: false ```` --- # Source: https://infisical.com/docs/api-reference/endpoints/universal-auth/create-client-secret.md > ## Documentation Index > Fetch the complete documentation index at: https://infisical.com/docs/llms.txt > Use this file to discover all available pages before exploring further. # Create Client Secret > Create Universal Auth Client Secret for machine identity ## OpenAPI ````yaml POST /api/v1/auth/universal-auth/identities/{identityId}/client-secrets openapi: 3.0.3 info: title: Infisical API description: List of all available APIs that can be consumed version: 0.0.1 servers: - url: https://us.infisical.com description: Production server (US) - url: https://eu.infisical.com description: Production server (EU) - url: http://localhost:8080 description: Local server security: [] paths: /api/v1/auth/universal-auth/identities/{identityId}/client-secrets: post: tags: - Universal Auth description: Create Universal Auth Client Secret for machine identity operationId: createUniversalAuthClientSecret parameters: - schema: type: string in: path name: identityId required: true description: The ID of the machine identity to create a client secret for. requestBody: content: application/json: schema: type: object properties: description: type: string default: '' description: The description of the client secret. numUsesLimit: type: number minimum: 0 default: 0 description: >- The maximum number of times that the client secret can be used; a value of 0 implies infinite number of uses. ttl: type: number minimum: 0 maximum: 315360000 default: 0 description: The lifetime for the client secret in seconds. additionalProperties: false responses: '200': description: Default Response content: application/json: schema: type: object properties: clientSecret: type: string clientSecretData: type: object properties: id: type: string createdAt: type: string format: date-time updatedAt: type: string format: date-time description: type: string clientSecretPrefix: type: string clientSecretNumUses: type: number default: 0 clientSecretNumUsesLimit: type: number default: 0 clientSecretTTL: type: number default: 0 identityUAId: type: string format: uuid isClientSecretRevoked: type: boolean default: false required: - id - createdAt - updatedAt - description - clientSecretPrefix - identityUAId additionalProperties: false required: - clientSecret - clientSecretData additionalProperties: false '400': description: Default Response content: application/json: schema: type: object properties: reqId: type: string statusCode: type: number enum: - 400 message: type: string error: type: string details: {} required: - reqId - statusCode - message - error additionalProperties: false '401': description: Default Response content: application/json: schema: type: object properties: reqId: type: string statusCode: type: number enum: - 401 message: type: string error: type: string required: - reqId - statusCode - message - error additionalProperties: false '403': description: Default Response content: application/json: schema: type: object properties: reqId: type: string statusCode: type: number enum: - 403 message: type: string details: {} error: type: string required: - reqId - statusCode - message - error additionalProperties: false '404': description: Default Response content: application/json: schema: type: object properties: reqId: type: string statusCode: type: number enum: - 404 message: type: string error: type: string required: - reqId - statusCode - message - error additionalProperties: false '422': description: Default Response content: application/json: schema: type: object properties: reqId: type: string statusCode: type: number enum: - 422 message: {} error: type: string required: - reqId - statusCode - error additionalProperties: false '500': description: Default Response content: application/json: schema: type: object properties: reqId: type: string statusCode: type: number enum: - 500 message: type: string error: type: string required: - reqId - statusCode - message - error additionalProperties: false security: - bearerAuth: [] components: securitySchemes: bearerAuth: type: http scheme: bearer bearerFormat: JWT description: An access token in Infisical ```` --- # Source: https://infisical.com/docs/api-reference/endpoints/organizations/ldap-sso/create-ldap-config.md > ## Documentation Index > Fetch the complete documentation index at: https://infisical.com/docs/llms.txt > Use this file to discover all available pages before exploring further. # Create LDAP SSO Config > Create LDAP config ## OpenAPI ````yaml POST /api/v1/ldap/config openapi: 3.0.3 info: title: Infisical API description: List of all available APIs that can be consumed version: 0.0.1 servers: - url: https://us.infisical.com description: Production server (US) - url: https://eu.infisical.com description: Production server (EU) - url: http://localhost:8080 description: Local server security: [] paths: /api/v1/ldap/config: post: tags: - LDAP SSO description: Create LDAP config requestBody: content: application/json: schema: type: object properties: organizationId: type: string description: The ID of the organization to create the LDAP config for. isActive: type: boolean description: Whether to enable or disable this LDAP configuration. url: type: string description: >- The LDAP server to connect to such as `ldap://ldap.your-org.com`, `ldaps://ldap.myorg.com:636` (for connection over SSL/TLS), etc. bindDN: type: string description: >- The distinguished name of the object to bind when performing the user search such as `cn=infisical,ou=Users,dc=acme,dc=com` bindPass: type: string description: >- The password to use along with Bind DN when performing the user search. uniqueUserAttribute: type: string default: uidNumber description: >- The attribute to use as the unique identifier of LDAP users such as `sAMAccountName`, `cn`, `uid`, `objectGUID`. If left blank, defaults to uidNumber searchBase: type: string description: >- The base DN to use for the user search such as `ou=Users,dc=acme,dc=com` searchFilter: type: string default: (uid={{username}}) description: >- The template used to construct the LDAP user search filter such as `(uid={{username}})` uses literal `{{username}}` to have the given username used in the search. The default is `(uid={{username}})` which is compatible with several common directory schemas. groupSearchBase: type: string description: >- LDAP search base to use for group membership search such as `ou=Groups,dc=acme,dc=com` groupSearchFilter: type: string default: >- (|(memberUid={{.Username}})(member={{.UserDN}})(uniqueMember={{.UserDN}})) description: >- The template used when constructing the group membership query such as `(&(objectClass=posixGroup)(memberUid={{.Username}}))`. The template can access the following context variables: `[UserDN, UserName]`. The default is `(|(memberUid={{.Username}})(member={{.UserDN}})(uniqueMember={{.UserDN}}))` which is compatible with several common directory schemas. caCert: type: string default: '' description: >- The CA certificate to use when verifying the LDAP server certificate. required: - organizationId - isActive - url - bindDN - bindPass - searchBase - groupSearchBase additionalProperties: false required: true responses: '200': description: Default Response content: application/json: schema: type: object properties: updatedAt: type: string format: date-time createdAt: type: string format: date-time isActive: type: boolean orgId: type: string format: uuid id: type: string format: uuid url: type: string searchBase: type: string searchFilter: type: string default: '' groupSearchBase: type: string default: '' uniqueUserAttribute: type: string default: '' groupSearchFilter: type: string default: '' required: - updatedAt - createdAt - isActive - orgId - id - url - searchBase additionalProperties: false '400': description: Default Response content: application/json: schema: type: object properties: reqId: type: string statusCode: type: number enum: - 400 message: type: string error: type: string details: {} required: - reqId - statusCode - message - error additionalProperties: false '401': description: Default Response content: application/json: schema: type: object properties: reqId: type: string statusCode: type: number enum: - 401 message: type: string error: type: string required: - reqId - statusCode - message - error additionalProperties: false '403': description: Default Response content: application/json: schema: type: object properties: reqId: type: string statusCode: type: number enum: - 403 message: type: string details: {} error: type: string required: - reqId - statusCode - message - error additionalProperties: false '404': description: Default Response content: application/json: schema: type: object properties: reqId: type: string statusCode: type: number enum: - 404 message: type: string error: type: string required: - reqId - statusCode - message - error additionalProperties: false '422': description: Default Response content: application/json: schema: type: object properties: reqId: type: string statusCode: type: number enum: - 422 message: {} error: type: string required: - reqId - statusCode - error additionalProperties: false '500': description: Default Response content: application/json: schema: type: object properties: reqId: type: string statusCode: type: number enum: - 500 message: type: string error: type: string required: - reqId - statusCode - message - error additionalProperties: false security: - bearerAuth: [] components: securitySchemes: bearerAuth: type: http scheme: bearer bearerFormat: JWT description: An access token in Infisical ```` --- # Source: https://infisical.com/docs/api-reference/endpoints/dynamic-secrets/kubernetes/create-lease.md # Source: https://infisical.com/docs/api-reference/endpoints/dynamic-secrets/create-lease.md > ## Documentation Index > Fetch the complete documentation index at: https://infisical.com/docs/llms.txt > Use this file to discover all available pages before exploring further. # Create Lease ## OpenAPI ````yaml POST /api/v1/dynamic-secrets/leases openapi: 3.0.3 info: title: Infisical API description: List of all available APIs that can be consumed version: 0.0.1 servers: - url: https://us.infisical.com description: Production server (US) - url: https://eu.infisical.com description: Production server (EU) - url: http://localhost:8080 description: Local server security: [] paths: /api/v1/dynamic-secrets/leases: post: tags: - Dynamic Secrets requestBody: content: application/json: schema: type: object properties: dynamicSecretName: type: string minLength: 1 description: The name of the dynamic secret. projectSlug: type: string minLength: 1 description: The slug of the project of the dynamic secret in. ttl: type: string description: >- The lease lifetime TTL. If not provided the default TTL of dynamic secret will be used. path: type: string default: / description: The path of the dynamic secret in. environmentSlug: type: string minLength: 1 description: The slug of the environment of the dynamic secret in. config: {} required: - dynamicSecretName - projectSlug - environmentSlug additionalProperties: false required: true responses: '200': description: Default Response content: application/json: schema: type: object properties: lease: type: object properties: id: type: string format: uuid version: type: number externalEntityId: type: string expireAt: type: string format: date-time status: type: string nullable: true statusDetails: type: string nullable: true dynamicSecretId: type: string format: uuid createdAt: type: string format: date-time updatedAt: type: string format: date-time config: nullable: true required: - id - version - externalEntityId - expireAt - dynamicSecretId - createdAt - updatedAt additionalProperties: false dynamicSecret: type: object properties: id: type: string format: uuid name: type: string version: type: number type: type: string defaultTTL: type: string maxTTL: type: string nullable: true folderId: type: string format: uuid status: type: string nullable: true statusDetails: type: string nullable: true createdAt: type: string format: date-time updatedAt: type: string format: date-time projectGatewayId: type: string format: uuid nullable: true gatewayId: type: string format: uuid nullable: true usernameTemplate: type: string nullable: true gatewayV2Id: type: string format: uuid nullable: true metadata: type: array items: type: object properties: key: type: string minLength: 1 value: type: string default: '' required: - key additionalProperties: false required: - id - name - version - type - defaultTTL - folderId - createdAt - updatedAt additionalProperties: false data: {} required: - lease - dynamicSecret additionalProperties: false '400': description: Default Response content: application/json: schema: type: object properties: reqId: type: string statusCode: type: number enum: - 400 message: type: string error: type: string details: {} required: - reqId - statusCode - message - error additionalProperties: false '401': description: Default Response content: application/json: schema: type: object properties: reqId: type: string statusCode: type: number enum: - 401 message: type: string error: type: string required: - reqId - statusCode - message - error additionalProperties: false '403': description: Default Response content: application/json: schema: type: object properties: reqId: type: string statusCode: type: number enum: - 403 message: type: string details: {} error: type: string required: - reqId - statusCode - message - error additionalProperties: false '404': description: Default Response content: application/json: schema: type: object properties: reqId: type: string statusCode: type: number enum: - 404 message: type: string error: type: string required: - reqId - statusCode - message - error additionalProperties: false '422': description: Default Response content: application/json: schema: type: object properties: reqId: type: string statusCode: type: number enum: - 422 message: {} error: type: string required: - reqId - statusCode - error additionalProperties: false '500': description: Default Response content: application/json: schema: type: object properties: reqId: type: string statusCode: type: number enum: - 500 message: type: string error: type: string required: - reqId - statusCode - message - error additionalProperties: false ```` --- # Source: https://infisical.com/docs/api-reference/endpoints/secrets/create-many.md # Source: https://infisical.com/docs/api-reference/endpoints/deprecated/secrets/create-many.md > ## Documentation Index > Fetch the complete documentation index at: https://infisical.com/docs/llms.txt > Use this file to discover all available pages before exploring further. # Bulk Create > Create many secrets ## OpenAPI ````yaml POST /api/v3/secrets/batch/raw openapi: 3.0.3 info: title: Infisical API description: List of all available APIs that can be consumed version: 0.0.1 servers: - url: https://us.infisical.com description: Production server (US) - url: https://eu.infisical.com description: Production server (EU) - url: http://localhost:8080 description: Local server security: [] paths: /api/v3/secrets/batch/raw: post: tags: - Secrets description: Create many secrets requestBody: content: application/json: schema: type: object properties: projectSlug: type: string description: The slug of the project to update the secret in. workspaceId: type: string description: The ID of the project to update the secret in. environment: type: string description: The slug of the environment to create the secret in. secretPath: type: string default: / description: The path to create the secret in. secrets: type: array items: type: object properties: secretKey: type: string minLength: 1 description: The name of the secret to create. secretValue: type: string description: The value of the secret to create. secretComment: type: string default: '' description: Attach a comment to the secret. skipMultilineEncoding: type: boolean description: Skip multiline encoding for the secret value. metadata: type: object additionalProperties: type: string secretMetadata: type: array items: type: object properties: key: type: string minLength: 1 value: type: string default: '' isEncrypted: type: boolean default: false required: - key additionalProperties: false tagIds: type: array items: type: string description: >- The ID of the tags to be attached to the created secret. required: - secretKey - secretValue additionalProperties: false minItems: 1 required: - environment - secrets additionalProperties: false required: true responses: '200': description: Default Response content: application/json: schema: anyOf: - type: object properties: secrets: type: array items: type: object properties: id: type: string _id: type: string workspace: type: string environment: type: string version: type: number type: type: string secretKey: type: string secretValue: type: string secretComment: type: string secretReminderNote: type: string nullable: true secretReminderRepeatDays: type: number nullable: true skipMultilineEncoding: type: boolean default: false nullable: true createdAt: type: string format: date-time updatedAt: type: string format: date-time actor: type: object properties: actorId: type: string nullable: true actorType: type: string nullable: true name: type: string nullable: true membershipId: type: string nullable: true groupId: type: string nullable: true additionalProperties: false nullable: true isRotatedSecret: type: boolean rotationId: type: string format: uuid nullable: true required: - id - _id - workspace - environment - version - type - secretKey - secretValue - secretComment - createdAt - updatedAt additionalProperties: false required: - secrets additionalProperties: false - type: object properties: approval: type: object properties: id: type: string format: uuid policyId: type: string format: uuid hasMerged: type: boolean default: false status: type: string default: open conflicts: nullable: true slug: type: string folderId: type: string format: uuid createdAt: type: string format: date-time updatedAt: type: string format: date-time isReplicated: type: boolean nullable: true committerUserId: type: string format: uuid nullable: true statusChangedByUserId: type: string format: uuid nullable: true bypassReason: type: string nullable: true required: - id - policyId - slug - folderId - createdAt - updatedAt additionalProperties: false required: - approval additionalProperties: false description: When secret protection policy is enabled '400': description: Default Response content: application/json: schema: type: object properties: reqId: type: string statusCode: type: number enum: - 400 message: type: string error: type: string details: {} required: - reqId - statusCode - message - error additionalProperties: false '401': description: Default Response content: application/json: schema: type: object properties: reqId: type: string statusCode: type: number enum: - 401 message: type: string error: type: string required: - reqId - statusCode - message - error additionalProperties: false '403': description: Default Response content: application/json: schema: type: object properties: reqId: type: string statusCode: type: number enum: - 403 message: type: string details: {} error: type: string required: - reqId - statusCode - message - error additionalProperties: false '404': description: Default Response content: application/json: schema: type: object properties: reqId: type: string statusCode: type: number enum: - 404 message: type: string error: type: string required: - reqId - statusCode - message - error additionalProperties: false '422': description: Default Response content: application/json: schema: type: object properties: reqId: type: string statusCode: type: number enum: - 422 message: {} error: type: string required: - reqId - statusCode - error additionalProperties: false '500': description: Default Response content: application/json: schema: type: object properties: reqId: type: string statusCode: type: number enum: - 500 message: type: string error: type: string required: - reqId - statusCode - message - error additionalProperties: false security: - bearerAuth: [] components: securitySchemes: bearerAuth: type: http scheme: bearer bearerFormat: JWT description: An access token in Infisical ```` --- # Source: https://infisical.com/docs/api-reference/endpoints/organizations/oidc-sso/create-oidc-config.md > ## Documentation Index > Fetch the complete documentation index at: https://infisical.com/docs/llms.txt > Use this file to discover all available pages before exploring further. # Create OIDC Config > Create OIDC config ## OpenAPI ````yaml POST /api/v1/sso/oidc/config openapi: 3.0.3 info: title: Infisical API description: List of all available APIs that can be consumed version: 0.0.1 servers: - url: https://us.infisical.com description: Production server (US) - url: https://eu.infisical.com description: Production server (EU) - url: http://localhost:8080 description: Local server security: [] paths: /api/v1/sso/oidc/config: post: tags: - OIDC SSO description: Create OIDC config requestBody: content: application/json: schema: type: object properties: allowedEmailDomains: type: string default: '' description: >- A list of allowed email domains that users can use to authenticate with. This field is comma separated. configurationType: type: string enum: - custom - discoveryURL description: The configuration type to use for the OIDC configuration. issuer: type: string default: '' description: >- The issuer for the OIDC configuration. This is only supported when the OIDC configuration type is set to 'custom'. discoveryURL: type: string default: '' description: The URL of the OIDC discovery endpoint. authorizationEndpoint: type: string default: '' description: >- The authorization endpoint to use for OIDC authorization. This is only supported when the OIDC configuration type is set to 'custom'. jwksUri: type: string default: '' description: The URL of the OIDC JWKS endpoint. tokenEndpoint: type: string default: '' description: The token endpoint to use for OIDC token exchange. userinfoEndpoint: type: string default: '' description: >- The userinfo endpoint to get user information from the OIDC provider. clientId: type: string description: The client ID to use for OIDC authentication. clientSecret: type: string description: The client secret to use for OIDC authentication. isActive: type: boolean description: Whether to enable or disable this OIDC configuration. organizationId: type: string description: The ID of the organization to create the OIDC config for. manageGroupMemberships: type: boolean default: false description: >- Whether to manage group memberships for the OIDC configuration. If enabled, users will automatically be assigned groups when they sign in, based on which groups they are a member of in the OIDC provider. jwtSignatureAlgorithm: type: string enum: - RS256 - HS256 - RS512 - EdDSA default: RS256 description: The algorithm to use for JWT signature verification. required: - configurationType - clientId - clientSecret - isActive - organizationId additionalProperties: false required: true responses: '200': description: Default Response content: application/json: schema: type: object properties: id: type: string format: uuid issuer: type: string nullable: true authorizationEndpoint: type: string nullable: true configurationType: type: string discoveryURL: type: string nullable: true jwksUri: type: string nullable: true tokenEndpoint: type: string nullable: true userinfoEndpoint: type: string nullable: true orgId: type: string format: uuid isActive: type: boolean allowedEmailDomains: type: string nullable: true manageGroupMemberships: type: boolean default: false jwtSignatureAlgorithm: type: string default: RS256 required: - id - configurationType - orgId - isActive additionalProperties: false '400': description: Default Response content: application/json: schema: type: object properties: reqId: type: string statusCode: type: number enum: - 400 message: type: string error: type: string details: {} required: - reqId - statusCode - message - error additionalProperties: false '401': description: Default Response content: application/json: schema: type: object properties: reqId: type: string statusCode: type: number enum: - 401 message: type: string error: type: string required: - reqId - statusCode - message - error additionalProperties: false '403': description: Default Response content: application/json: schema: type: object properties: reqId: type: string statusCode: type: number enum: - 403 message: type: string details: {} error: type: string required: - reqId - statusCode - message - error additionalProperties: false '404': description: Default Response content: application/json: schema: type: object properties: reqId: type: string statusCode: type: number enum: - 404 message: type: string error: type: string required: - reqId - statusCode - message - error additionalProperties: false '422': description: Default Response content: application/json: schema: type: object properties: reqId: type: string statusCode: type: number enum: - 422 message: {} error: type: string required: - reqId - statusCode - error additionalProperties: false '500': description: Default Response content: application/json: schema: type: object properties: reqId: type: string statusCode: type: number enum: - 500 message: type: string error: type: string required: - reqId - statusCode - message - error additionalProperties: false security: - bearerAuth: [] components: securitySchemes: bearerAuth: type: http scheme: bearer bearerFormat: JWT description: An access token in Infisical ```` --- # Source: https://infisical.com/docs/api-reference/endpoints/identity-specific-privilege/v1/create-permanent.md > ## Documentation Index > Fetch the complete documentation index at: https://infisical.com/docs/llms.txt > Use this file to discover all available pages before exploring further. # Create Permanent > Create a permanent or a non expiry specific privilege for identity. ## OpenAPI ````yaml POST /api/v1/additional-privilege/identity/permanent openapi: 3.0.3 info: title: Infisical API description: List of all available APIs that can be consumed version: 0.0.1 servers: - url: https://us.infisical.com description: Production server (US) - url: https://eu.infisical.com description: Production server (EU) - url: http://localhost:8080 description: Local server security: [] paths: /api/v1/additional-privilege/identity/permanent: post: tags: - Identity Specific Privileges description: Create a permanent or a non expiry specific privilege for identity. requestBody: content: application/json: schema: type: object properties: identityId: type: string minLength: 1 description: The ID of the machine identity to create. projectSlug: type: string minLength: 1 description: The slug of the project of the identity in. slug: type: string minLength: 1 maxLength: 60 description: The slug of the privilege to create. permissions: type: array items: type: object properties: action: type: string enum: - read - create - edit - delete description: >- Describe what action an entity can take. Possible actions: create, edit, delete, and read subject: type: string enum: - role - member - groups - settings - integrations - webhooks - service-tokens - environments - tags - audit-logs - ip-allowlist - workspace - secrets - secret-folders - secret-imports - dynamic-secrets - secret-rollback - secret-approval - secret-rotation - commits - identity - certificate-authorities - certificates - certificate-templates - ssh-certificate-authorities - ssh-certificates - ssh-certificate-templates - ssh-hosts - ssh-host-groups - pki-subscribers - pki-alerts - pki-collections - kms - cmek - secret-syncs - pki-syncs - kmip - secret-scanning-data-sources - secret-scanning-findings - secret-scanning-configs - secret-event-subscriptions - app-connections - pam-folders - pam-resources - pam-accounts - pam-sessions - certificate-profiles - certificate-policies - approval-requests - approval-request-grants - mcp-endpoints - mcp-servers - mcp-activity-logs description: >- The entity this permission pertains to. Possible options: secrets, environments conditions: type: object properties: environment: type: string description: The environment slug this permission should allow. secretPath: type: object properties: $glob: type: string minLength: 1 description: >- The secret path this permission should allow. Can be a glob pattern such as /folder-name/*/** required: - $glob additionalProperties: false additionalProperties: false description: >- When specified, only matching conditions will be allowed to access given resource. required: - action - subject additionalProperties: false description: > @deprecated - use privilegePermission The permission object for the privilege. - Read secrets ``` { "permissions": [{"action": "read", "subject": "secrets"]} ``` - Read and Write secrets ``` { "permissions": [{"action": "read", "subject": "secrets"], {"action": "write", "subject": "secrets"]} ``` - Read secrets scoped to an environment and secret path ``` - { "permissions": [{"action": "read", "subject": "secrets", "conditions": { "environment": "dev", "secretPath": { "$glob": "/" } }}] } ``` privilegePermission: type: object properties: actions: type: array items: type: string enum: - read - create - edit - delete description: >- Describe what action an entity can take. Possible actions: create, edit, delete, and read minItems: 1 subject: type: string enum: - secrets description: >- The entity this permission pertains to. Possible options: secrets, environments conditions: type: object properties: environment: type: string description: The environment slug this permission should allow. secretPath: type: object properties: $glob: type: string minLength: 1 description: >- The secret path this permission should allow. Can be a glob pattern such as /folder-name/*/** required: - $glob additionalProperties: false required: - environment additionalProperties: false description: >- When specified, only matching conditions will be allowed to access given resource. required: - actions - subject - conditions additionalProperties: false description: The permission object for the privilege. required: - identityId - projectSlug additionalProperties: false required: true responses: '200': description: Default Response content: application/json: schema: type: object properties: privilege: type: object properties: id: type: string format: uuid slug: type: string projectMembershipId: type: string format: uuid isTemporary: type: boolean default: false temporaryMode: type: string nullable: true temporaryRange: type: string nullable: true temporaryAccessStartTime: type: string format: date-time nullable: true temporaryAccessEndTime: type: string format: date-time nullable: true permissions: type: array items: type: object properties: subject: anyOf: - type: string minLength: 1 - type: array items: type: string action: anyOf: - type: string minLength: 1 - type: array items: type: string conditions: {} inverted: type: boolean required: - action additionalProperties: false createdAt: type: string format: date-time updatedAt: type: string format: date-time required: - id - slug - projectMembershipId - permissions - createdAt - updatedAt additionalProperties: false required: - privilege additionalProperties: false '400': description: Default Response content: application/json: schema: type: object properties: reqId: type: string statusCode: type: number enum: - 400 message: type: string error: type: string details: {} required: - reqId - statusCode - message - error additionalProperties: false '401': description: Default Response content: application/json: schema: type: object properties: reqId: type: string statusCode: type: number enum: - 401 message: type: string error: type: string required: - reqId - statusCode - message - error additionalProperties: false '403': description: Default Response content: application/json: schema: type: object properties: reqId: type: string statusCode: type: number enum: - 403 message: type: string details: {} error: type: string required: - reqId - statusCode - message - error additionalProperties: false '404': description: Default Response content: application/json: schema: type: object properties: reqId: type: string statusCode: type: number enum: - 404 message: type: string error: type: string required: - reqId - statusCode - message - error additionalProperties: false '422': description: Default Response content: application/json: schema: type: object properties: reqId: type: string statusCode: type: number enum: - 422 message: {} error: type: string required: - reqId - statusCode - error additionalProperties: false '500': description: Default Response content: application/json: schema: type: object properties: reqId: type: string statusCode: type: number enum: - 500 message: type: string error: type: string required: - reqId - statusCode - message - error additionalProperties: false security: - bearerAuth: [] components: securitySchemes: bearerAuth: type: http scheme: bearer bearerFormat: JWT description: An access token in Infisical ```` --- # Source: https://infisical.com/docs/api-reference/endpoints/projects/create-project.md # Source: https://infisical.com/docs/api-reference/endpoints/deprecated/projects/create-project.md > ## Documentation Index > Fetch the complete documentation index at: https://infisical.com/docs/llms.txt > Use this file to discover all available pages before exploring further. # Create Project > Create a new project ## OpenAPI ````yaml POST /api/v2/workspace openapi: 3.0.3 info: title: Infisical API description: List of all available APIs that can be consumed version: 0.0.1 servers: - url: https://us.infisical.com description: Production server (US) - url: https://eu.infisical.com description: Production server (EU) - url: http://localhost:8080 description: Local server security: [] paths: /api/v2/workspace: post: tags: - Projects description: Create a new project requestBody: content: application/json: schema: type: object properties: projectName: type: string description: The name of the project to create. projectDescription: type: string description: An optional description label for the project. slug: type: string minLength: 5 maxLength: 36 description: An optional slug for the project. kmsKeyId: type: string template: type: string minLength: 1 maxLength: 64 default: default description: >- The name of the project template, if specified, to apply to this project. type: type: string enum: - secret-manager - cert-manager - kms - ssh - secret-scanning - pam - ai default: secret-manager shouldCreateDefaultEnvs: type: boolean default: true hasDeleteProtection: type: boolean default: false required: - projectName additionalProperties: false required: true responses: '200': description: Default Response content: application/json: schema: type: object properties: project: type: object properties: id: type: string name: type: string description: type: string nullable: true type: type: string defaultProduct: type: string nullable: true slug: type: string autoCapitalization: type: boolean default: false nullable: true orgId: type: string format: uuid createdAt: type: string format: date-time updatedAt: type: string format: date-time version: type: number default: 1 upgradeStatus: type: string nullable: true pitVersionLimit: type: number default: 10 kmsCertificateKeyId: type: string format: uuid nullable: true auditLogsRetentionDays: type: number nullable: true hasDeleteProtection: type: boolean default: false nullable: true secretSharing: type: boolean default: true showSnapshotsLegacy: type: boolean default: false secretDetectionIgnoreValues: type: array items: type: string nullable: true enforceEncryptedSecretManagerSecretMetadata: type: boolean nullable: true _id: type: string environments: type: array items: type: object properties: name: type: string slug: type: string id: type: string required: - name - slug - id additionalProperties: false kmsSecretManagerKeyId: type: string nullable: true required: - id - name - type - slug - orgId - createdAt - updatedAt - _id - environments additionalProperties: false required: - project additionalProperties: false '400': description: Default Response content: application/json: schema: type: object properties: reqId: type: string statusCode: type: number enum: - 400 message: type: string error: type: string details: {} required: - reqId - statusCode - message - error additionalProperties: false '401': description: Default Response content: application/json: schema: type: object properties: reqId: type: string statusCode: type: number enum: - 401 message: type: string error: type: string required: - reqId - statusCode - message - error additionalProperties: false '403': description: Default Response content: application/json: schema: type: object properties: reqId: type: string statusCode: type: number enum: - 403 message: type: string details: {} error: type: string required: - reqId - statusCode - message - error additionalProperties: false '404': description: Default Response content: application/json: schema: type: object properties: reqId: type: string statusCode: type: number enum: - 404 message: type: string error: type: string required: - reqId - statusCode - message - error additionalProperties: false '422': description: Default Response content: application/json: schema: type: object properties: reqId: type: string statusCode: type: number enum: - 422 message: {} error: type: string required: - reqId - statusCode - error additionalProperties: false '500': description: Default Response content: application/json: schema: type: object properties: reqId: type: string statusCode: type: number enum: - 500 message: type: string error: type: string required: - reqId - statusCode - message - error additionalProperties: false security: - bearerAuth: [] components: securitySchemes: bearerAuth: type: http scheme: bearer bearerFormat: JWT description: An access token in Infisical ```` --- # Source: https://infisical.com/docs/api-reference/endpoints/organizations/saml-sso/create-saml-config.md > ## Documentation Index > Fetch the complete documentation index at: https://infisical.com/docs/llms.txt > Use this file to discover all available pages before exploring further. # Create SAML SSO Config > Create SAML config ## OpenAPI ````yaml POST /api/v1/sso/config openapi: 3.0.3 info: title: Infisical API description: List of all available APIs that can be consumed version: 0.0.1 servers: - url: https://us.infisical.com description: Production server (US) - url: https://eu.infisical.com description: Production server (EU) - url: http://localhost:8080 description: Local server security: [] paths: /api/v1/sso/config: post: tags: - SAML SSO description: Create SAML config requestBody: content: application/json: schema: type: object properties: organizationId: type: string description: The ID of the organization to create the SAML config for. authProvider: type: string enum: - okta-saml - azure-saml - jumpcloud-saml - google-saml - keycloak-saml - auth0-saml description: Authentication provider to use for SAML authentication. isActive: type: boolean description: Whether to enable or disable this SAML configuration. entryPoint: type: string description: >- The entry point for the SAML authentication. This is the URL that the user will be redirected to after they have authenticated with the SAML provider. issuer: type: string description: The SAML provider issuer URL or entity ID. cert: type: string description: The certificate to use for SAML authentication. enableGroupSync: type: boolean description: >- Whether to enable automatic synchronization of group memberships from the SAML provider to Infisical groups. required: - organizationId - authProvider - isActive - entryPoint - issuer - cert additionalProperties: false required: true responses: '200': description: Default Response content: application/json: schema: type: object properties: id: type: string format: uuid orgId: type: string format: uuid isActive: type: boolean lastUsed: type: string format: date-time nullable: true createdAt: type: string format: date-time updatedAt: type: string format: date-time authProvider: type: string required: - id - orgId - isActive - createdAt - updatedAt - authProvider additionalProperties: false '400': description: Default Response content: application/json: schema: type: object properties: reqId: type: string statusCode: type: number enum: - 400 message: type: string error: type: string details: {} required: - reqId - statusCode - message - error additionalProperties: false '401': description: Default Response content: application/json: schema: type: object properties: reqId: type: string statusCode: type: number enum: - 401 message: type: string error: type: string required: - reqId - statusCode - message - error additionalProperties: false '403': description: Default Response content: application/json: schema: type: object properties: reqId: type: string statusCode: type: number enum: - 403 message: type: string details: {} error: type: string required: - reqId - statusCode - message - error additionalProperties: false '404': description: Default Response content: application/json: schema: type: object properties: reqId: type: string statusCode: type: number enum: - 404 message: type: string error: type: string required: - reqId - statusCode - message - error additionalProperties: false '422': description: Default Response content: application/json: schema: type: object properties: reqId: type: string statusCode: type: number enum: - 422 message: {} error: type: string required: - reqId - statusCode - error additionalProperties: false '500': description: Default Response content: application/json: schema: type: object properties: reqId: type: string statusCode: type: number enum: - 500 message: type: string error: type: string required: - reqId - statusCode - message - error additionalProperties: false security: - bearerAuth: [] components: securitySchemes: bearerAuth: type: http scheme: bearer bearerFormat: JWT description: An access token in Infisical ```` --- # Source: https://infisical.com/docs/api-reference/endpoints/identity-specific-privilege/v1/create-temporary.md > ## Documentation Index > Fetch the complete documentation index at: https://infisical.com/docs/llms.txt > Use this file to discover all available pages before exploring further. # Create Temporary > Create a temporary or a expiring specific privilege for identity. ## OpenAPI ````yaml POST /api/v1/additional-privilege/identity/temporary openapi: 3.0.3 info: title: Infisical API description: List of all available APIs that can be consumed version: 0.0.1 servers: - url: https://us.infisical.com description: Production server (US) - url: https://eu.infisical.com description: Production server (EU) - url: http://localhost:8080 description: Local server security: [] paths: /api/v1/additional-privilege/identity/temporary: post: tags: - Identity Specific Privileges description: Create a temporary or a expiring specific privilege for identity. requestBody: content: application/json: schema: type: object properties: identityId: type: string minLength: 1 description: The ID of the machine identity to create. projectSlug: type: string minLength: 1 description: The slug of the project of the identity in. slug: type: string minLength: 1 maxLength: 60 description: The slug of the privilege to create. permissions: type: array items: type: object properties: action: type: string enum: - read - create - edit - delete description: >- Describe what action an entity can take. Possible actions: create, edit, delete, and read subject: type: string enum: - role - member - groups - settings - integrations - webhooks - service-tokens - environments - tags - audit-logs - ip-allowlist - workspace - secrets - secret-folders - secret-imports - dynamic-secrets - secret-rollback - secret-approval - secret-rotation - commits - identity - certificate-authorities - certificates - certificate-templates - ssh-certificate-authorities - ssh-certificates - ssh-certificate-templates - ssh-hosts - ssh-host-groups - pki-subscribers - pki-alerts - pki-collections - kms - cmek - secret-syncs - pki-syncs - kmip - secret-scanning-data-sources - secret-scanning-findings - secret-scanning-configs - secret-event-subscriptions - app-connections - pam-folders - pam-resources - pam-accounts - pam-sessions - certificate-profiles - certificate-policies - approval-requests - approval-request-grants - mcp-endpoints - mcp-servers - mcp-activity-logs description: >- The entity this permission pertains to. Possible options: secrets, environments conditions: type: object properties: environment: type: string description: The environment slug this permission should allow. secretPath: type: object properties: $glob: type: string minLength: 1 description: >- The secret path this permission should allow. Can be a glob pattern such as /folder-name/*/** required: - $glob additionalProperties: false additionalProperties: false description: >- When specified, only matching conditions will be allowed to access given resource. required: - action - subject additionalProperties: false description: > @deprecated - use privilegePermission The permission object for the privilege. - Read secrets ``` { "permissions": [{"action": "read", "subject": "secrets"]} ``` - Read and Write secrets ``` { "permissions": [{"action": "read", "subject": "secrets"], {"action": "write", "subject": "secrets"]} ``` - Read secrets scoped to an environment and secret path ``` - { "permissions": [{"action": "read", "subject": "secrets", "conditions": { "environment": "dev", "secretPath": { "$glob": "/" } }}] } ``` privilegePermission: type: object properties: actions: type: array items: type: string enum: - read - create - edit - delete description: >- Describe what action an entity can take. Possible actions: create, edit, delete, and read minItems: 1 subject: type: string enum: - secrets description: >- The entity this permission pertains to. Possible options: secrets, environments conditions: type: object properties: environment: type: string description: The environment slug this permission should allow. secretPath: type: object properties: $glob: type: string minLength: 1 description: >- The secret path this permission should allow. Can be a glob pattern such as /folder-name/*/** required: - $glob additionalProperties: false required: - environment additionalProperties: false description: >- When specified, only matching conditions will be allowed to access given resource. required: - actions - subject - conditions additionalProperties: false description: The permission object for the privilege. temporaryMode: type: string enum: - relative description: 'Type of temporary access given. Types: relative.' temporaryRange: type: string description: 'TTL for the temporary time. Eg: 1m, 1h, 1d.' temporaryAccessStartTime: type: string format: date-time description: ISO time for which temporary access should begin. required: - identityId - projectSlug - temporaryMode - temporaryRange - temporaryAccessStartTime additionalProperties: false required: true responses: '200': description: Default Response content: application/json: schema: type: object properties: privilege: type: object properties: id: type: string format: uuid slug: type: string projectMembershipId: type: string format: uuid isTemporary: type: boolean default: false temporaryMode: type: string nullable: true temporaryRange: type: string nullable: true temporaryAccessStartTime: type: string format: date-time nullable: true temporaryAccessEndTime: type: string format: date-time nullable: true permissions: type: array items: type: object properties: subject: anyOf: - type: string minLength: 1 - type: array items: type: string action: anyOf: - type: string minLength: 1 - type: array items: type: string conditions: {} inverted: type: boolean required: - action additionalProperties: false createdAt: type: string format: date-time updatedAt: type: string format: date-time required: - id - slug - projectMembershipId - permissions - createdAt - updatedAt additionalProperties: false required: - privilege additionalProperties: false '400': description: Default Response content: application/json: schema: type: object properties: reqId: type: string statusCode: type: number enum: - 400 message: type: string error: type: string details: {} required: - reqId - statusCode - message - error additionalProperties: false '401': description: Default Response content: application/json: schema: type: object properties: reqId: type: string statusCode: type: number enum: - 401 message: type: string error: type: string required: - reqId - statusCode - message - error additionalProperties: false '403': description: Default Response content: application/json: schema: type: object properties: reqId: type: string statusCode: type: number enum: - 403 message: type: string details: {} error: type: string required: - reqId - statusCode - message - error additionalProperties: false '404': description: Default Response content: application/json: schema: type: object properties: reqId: type: string statusCode: type: number enum: - 404 message: type: string error: type: string required: - reqId - statusCode - message - error additionalProperties: false '422': description: Default Response content: application/json: schema: type: object properties: reqId: type: string statusCode: type: number enum: - 422 message: {} error: type: string required: - reqId - statusCode - error additionalProperties: false '500': description: Default Response content: application/json: schema: type: object properties: reqId: type: string statusCode: type: number enum: - 500 message: type: string error: type: string required: - reqId - statusCode - message - error additionalProperties: false security: - bearerAuth: [] components: securitySchemes: bearerAuth: type: http scheme: bearer bearerFormat: JWT description: An access token in Infisical ```` --- # Source: https://infisical.com/docs/api-reference/endpoints/token-auth/create-token.md > ## Documentation Index > Fetch the complete documentation index at: https://infisical.com/docs/llms.txt > Use this file to discover all available pages before exploring further. # Create Token > Create token for machine identity with Token Auth ## OpenAPI ````yaml POST /api/v1/auth/token-auth/identities/{identityId}/tokens openapi: 3.0.3 info: title: Infisical API description: List of all available APIs that can be consumed version: 0.0.1 servers: - url: https://us.infisical.com description: Production server (US) - url: https://eu.infisical.com description: Production server (EU) - url: http://localhost:8080 description: Local server security: [] paths: /api/v1/auth/token-auth/identities/{identityId}/tokens: post: tags: - Token Auth description: Create token for machine identity with Token Auth operationId: createTokenAuthToken parameters: - schema: type: string in: path name: identityId required: true description: The ID of the machine identity to create the token for. requestBody: content: application/json: schema: type: object properties: name: type: string description: The name of the token to create. organizationSlug: type: string minLength: 1 maxLength: 64 description: The sub organization name to scope the token to. additionalProperties: false responses: '200': description: Default Response content: application/json: schema: type: object properties: accessToken: type: string expiresIn: type: number accessTokenMaxTTL: type: number tokenType: type: string enum: - Bearer tokenData: type: object properties: id: type: string accessTokenTTL: type: number default: 2592000 accessTokenMaxTTL: type: number default: 2592000 accessTokenNumUses: type: number default: 0 accessTokenNumUsesLimit: type: number default: 0 accessTokenLastUsedAt: type: string format: date-time nullable: true accessTokenLastRenewedAt: type: string format: date-time nullable: true isAccessTokenRevoked: type: boolean default: false identityUAClientSecretId: type: string nullable: true identityId: type: string format: uuid createdAt: type: string format: date-time updatedAt: type: string format: date-time name: type: string nullable: true authMethod: type: string accessTokenPeriod: type: number default: 0 subOrganizationId: type: string format: uuid nullable: true required: - id - identityId - createdAt - updatedAt - authMethod additionalProperties: false required: - accessToken - expiresIn - accessTokenMaxTTL - tokenType - tokenData additionalProperties: false '400': description: Default Response content: application/json: schema: type: object properties: reqId: type: string statusCode: type: number enum: - 400 message: type: string error: type: string details: {} required: - reqId - statusCode - message - error additionalProperties: false '401': description: Default Response content: application/json: schema: type: object properties: reqId: type: string statusCode: type: number enum: - 401 message: type: string error: type: string required: - reqId - statusCode - message - error additionalProperties: false '403': description: Default Response content: application/json: schema: type: object properties: reqId: type: string statusCode: type: number enum: - 403 message: type: string details: {} error: type: string required: - reqId - statusCode - message - error additionalProperties: false '404': description: Default Response content: application/json: schema: type: object properties: reqId: type: string statusCode: type: number enum: - 404 message: type: string error: type: string required: - reqId - statusCode - message - error additionalProperties: false '422': description: Default Response content: application/json: schema: type: object properties: reqId: type: string statusCode: type: number enum: - 422 message: {} error: type: string required: - reqId - statusCode - error additionalProperties: false '500': description: Default Response content: application/json: schema: type: object properties: reqId: type: string statusCode: type: number enum: - 500 message: type: string error: type: string required: - reqId - statusCode - message - error additionalProperties: false security: - bearerAuth: [] components: securitySchemes: bearerAuth: type: http scheme: bearer bearerFormat: JWT description: An access token in Infisical ```` --- # Source: https://infisical.com/docs/api-reference/endpoints/secrets/create.md # Source: https://infisical.com/docs/api-reference/endpoints/secret-tags/create.md # Source: https://infisical.com/docs/api-reference/endpoints/secret-syncs/zabbix/create.md # Source: https://infisical.com/docs/api-reference/endpoints/secret-syncs/windmill/create.md # Source: https://infisical.com/docs/api-reference/endpoints/secret-syncs/vercel/create.md # Source: https://infisical.com/docs/api-reference/endpoints/secret-syncs/terraform-cloud/create.md # Source: https://infisical.com/docs/api-reference/endpoints/secret-syncs/teamcity/create.md # Source: https://infisical.com/docs/api-reference/endpoints/secret-syncs/supabase/create.md # Source: https://infisical.com/docs/api-reference/endpoints/secret-syncs/render/create.md # Source: https://infisical.com/docs/api-reference/endpoints/secret-syncs/railway/create.md # Source: https://infisical.com/docs/api-reference/endpoints/secret-syncs/octopus-deploy/create.md # Source: https://infisical.com/docs/api-reference/endpoints/secret-syncs/oci-vault/create.md # Source: https://infisical.com/docs/api-reference/endpoints/secret-syncs/northflank/create.md # Source: https://infisical.com/docs/api-reference/endpoints/secret-syncs/netlify/create.md # Source: https://infisical.com/docs/api-reference/endpoints/secret-syncs/laravel-forge/create.md # Source: https://infisical.com/docs/api-reference/endpoints/secret-syncs/humanitec/create.md # Source: https://infisical.com/docs/api-reference/endpoints/secret-syncs/heroku/create.md # Source: https://infisical.com/docs/api-reference/endpoints/secret-syncs/hashicorp-vault/create.md # Source: https://infisical.com/docs/api-reference/endpoints/secret-syncs/gitlab/create.md # Source: https://infisical.com/docs/api-reference/endpoints/secret-syncs/github/create.md # Source: https://infisical.com/docs/api-reference/endpoints/secret-syncs/gcp-secret-manager/create.md # Source: https://infisical.com/docs/api-reference/endpoints/secret-syncs/flyio/create.md # Source: https://infisical.com/docs/api-reference/endpoints/secret-syncs/digital-ocean-app-platform/create.md # Source: https://infisical.com/docs/api-reference/endpoints/secret-syncs/databricks/create.md # Source: https://infisical.com/docs/api-reference/endpoints/secret-syncs/cloudflare-workers/create.md # Source: https://infisical.com/docs/api-reference/endpoints/secret-syncs/cloudflare-pages/create.md # Source: https://infisical.com/docs/api-reference/endpoints/secret-syncs/circleci/create.md # Source: https://infisical.com/docs/api-reference/endpoints/secret-syncs/chef/create.md # Source: https://infisical.com/docs/api-reference/endpoints/secret-syncs/checkly/create.md # Source: https://infisical.com/docs/api-reference/endpoints/secret-syncs/camunda/create.md # Source: https://infisical.com/docs/api-reference/endpoints/secret-syncs/bitbucket/create.md # Source: https://infisical.com/docs/api-reference/endpoints/secret-syncs/azure-key-vault/create.md # Source: https://infisical.com/docs/api-reference/endpoints/secret-syncs/azure-devops/create.md # Source: https://infisical.com/docs/api-reference/endpoints/secret-syncs/azure-app-configuration/create.md # Source: https://infisical.com/docs/api-reference/endpoints/secret-syncs/aws-secrets-manager/create.md # Source: https://infisical.com/docs/api-reference/endpoints/secret-syncs/aws-parameter-store/create.md # Source: https://infisical.com/docs/api-reference/endpoints/secret-syncs/1password/create.md # Source: https://infisical.com/docs/api-reference/endpoints/secret-scanning/data-sources/gitlab/create.md # Source: https://infisical.com/docs/api-reference/endpoints/secret-scanning/data-sources/github/create.md # Source: https://infisical.com/docs/api-reference/endpoints/secret-scanning/data-sources/bitbucket/create.md # Source: https://infisical.com/docs/api-reference/endpoints/secret-rotations/windows-local-account/create.md # Source: https://infisical.com/docs/api-reference/endpoints/secret-rotations/unix-linux-local-account/create.md # Source: https://infisical.com/docs/api-reference/endpoints/secret-rotations/redis-credentials/create.md # Source: https://infisical.com/docs/api-reference/endpoints/secret-rotations/postgres-credentials/create.md # Source: https://infisical.com/docs/api-reference/endpoints/secret-rotations/oracledb-credentials/create.md # Source: https://infisical.com/docs/api-reference/endpoints/secret-rotations/okta-client-secret/create.md # Source: https://infisical.com/docs/api-reference/endpoints/secret-rotations/mysql-credentials/create.md # Source: https://infisical.com/docs/api-reference/endpoints/secret-rotations/mssql-credentials/create.md # Source: https://infisical.com/docs/api-reference/endpoints/secret-rotations/mongodb-credentials/create.md # Source: https://infisical.com/docs/api-reference/endpoints/secret-rotations/ldap-password/create.md # Source: https://infisical.com/docs/api-reference/endpoints/secret-rotations/databricks-service-principal-secret/create.md # Source: https://infisical.com/docs/api-reference/endpoints/secret-rotations/azure-client-secret/create.md # Source: https://infisical.com/docs/api-reference/endpoints/secret-rotations/aws-iam-user-secret/create.md # Source: https://infisical.com/docs/api-reference/endpoints/secret-rotations/auth0-client-secret/create.md # Source: https://infisical.com/docs/api-reference/endpoints/secret-imports/create.md # Source: https://infisical.com/docs/api-reference/endpoints/project-templates/create.md # Source: https://infisical.com/docs/api-reference/endpoints/project-roles/create.md # Source: https://infisical.com/docs/api-reference/endpoints/project-groups/create.md # Source: https://infisical.com/docs/api-reference/endpoints/pki/syncs/chef/create.md # Source: https://infisical.com/docs/api-reference/endpoints/pki/syncs/azure-key-vault/create.md # Source: https://infisical.com/docs/api-reference/endpoints/pki/syncs/aws-secrets-manager/create.md # Source: https://infisical.com/docs/api-reference/endpoints/pki/syncs/aws-certificate-manager/create.md # Source: https://infisical.com/docs/api-reference/endpoints/pki-alerts/create.md # Source: https://infisical.com/docs/api-reference/endpoints/organization-roles/create.md # Source: https://infisical.com/docs/api-reference/endpoints/kms/keys/create.md # Source: https://infisical.com/docs/api-reference/endpoints/identity-specific-privilege/v2/create.md # Source: https://infisical.com/docs/api-reference/endpoints/identities/create.md # Source: https://infisical.com/docs/api-reference/endpoints/groups/create.md # Source: https://infisical.com/docs/api-reference/endpoints/folders/create.md # Source: https://infisical.com/docs/api-reference/endpoints/environments/create.md # Source: https://infisical.com/docs/api-reference/endpoints/dynamic-secrets/create.md # Source: https://infisical.com/docs/api-reference/endpoints/deprecated/secrets/create.md # Source: https://infisical.com/docs/api-reference/endpoints/deprecated/secret-tags/create.md # Source: https://infisical.com/docs/api-reference/endpoints/deprecated/secret-imports/create.md # Source: https://infisical.com/docs/api-reference/endpoints/deprecated/project-roles/create.md # Source: https://infisical.com/docs/api-reference/endpoints/deprecated/project-groups/create.md # Source: https://infisical.com/docs/api-reference/endpoints/deprecated/folders/create.md # Source: https://infisical.com/docs/api-reference/endpoints/deprecated/environments/create.md # Source: https://infisical.com/docs/api-reference/endpoints/certificate-profiles/create.md # Source: https://infisical.com/docs/api-reference/endpoints/certificate-policies/create.md # Source: https://infisical.com/docs/api-reference/endpoints/certificate-authorities/internal/create.md # Source: https://infisical.com/docs/api-reference/endpoints/certificate-authorities/acme/create.md # Source: https://infisical.com/docs/api-reference/endpoints/app-connections/zabbix/create.md # Source: https://infisical.com/docs/api-reference/endpoints/app-connections/windmill/create.md # Source: https://infisical.com/docs/api-reference/endpoints/app-connections/vercel/create.md # Source: https://infisical.com/docs/api-reference/endpoints/app-connections/terraform-cloud/create.md # Source: https://infisical.com/docs/api-reference/endpoints/app-connections/teamcity/create.md # Source: https://infisical.com/docs/api-reference/endpoints/app-connections/supabase/create.md # Source: https://infisical.com/docs/api-reference/endpoints/app-connections/ssh/create.md # Source: https://infisical.com/docs/api-reference/endpoints/app-connections/smb/create.md # Source: https://infisical.com/docs/api-reference/endpoints/app-connections/render/create.md # Source: https://infisical.com/docs/api-reference/endpoints/app-connections/redis/create.md # Source: https://infisical.com/docs/api-reference/endpoints/app-connections/railway/create.md # Source: https://infisical.com/docs/api-reference/endpoints/app-connections/postgres/create.md # Source: https://infisical.com/docs/api-reference/endpoints/app-connections/oracledb/create.md # Source: https://infisical.com/docs/api-reference/endpoints/app-connections/openrouter/create.md # Source: https://infisical.com/docs/api-reference/endpoints/app-connections/okta/create.md # Source: https://infisical.com/docs/api-reference/endpoints/app-connections/octopus-deploy/create.md # Source: https://infisical.com/docs/api-reference/endpoints/app-connections/oci/create.md # Source: https://infisical.com/docs/api-reference/endpoints/app-connections/northflank/create.md # Source: https://infisical.com/docs/api-reference/endpoints/app-connections/netlify/create.md # Source: https://infisical.com/docs/api-reference/endpoints/app-connections/mysql/create.md # Source: https://infisical.com/docs/api-reference/endpoints/app-connections/mssql/create.md # Source: https://infisical.com/docs/api-reference/endpoints/app-connections/mongodb/create.md # Source: https://infisical.com/docs/api-reference/endpoints/app-connections/ldap/create.md # Source: https://infisical.com/docs/api-reference/endpoints/app-connections/laravel-forge/create.md # Source: https://infisical.com/docs/api-reference/endpoints/app-connections/humanitec/create.md # Source: https://infisical.com/docs/api-reference/endpoints/app-connections/heroku/create.md # Source: https://infisical.com/docs/api-reference/endpoints/app-connections/hashicorp-vault/create.md # Source: https://infisical.com/docs/api-reference/endpoints/app-connections/gitlab/create.md # Source: https://infisical.com/docs/api-reference/endpoints/app-connections/github/create.md # Source: https://infisical.com/docs/api-reference/endpoints/app-connections/github-radar/create.md # Source: https://infisical.com/docs/api-reference/endpoints/app-connections/gcp/create.md # Source: https://infisical.com/docs/api-reference/endpoints/app-connections/flyio/create.md # Source: https://infisical.com/docs/api-reference/endpoints/app-connections/digital-ocean/create.md # Source: https://infisical.com/docs/api-reference/endpoints/app-connections/databricks/create.md # Source: https://infisical.com/docs/api-reference/endpoints/app-connections/cloudflare/create.md # Source: https://infisical.com/docs/api-reference/endpoints/app-connections/circleci/create.md # Source: https://infisical.com/docs/api-reference/endpoints/app-connections/chef/create.md # Source: https://infisical.com/docs/api-reference/endpoints/app-connections/checkly/create.md # Source: https://infisical.com/docs/api-reference/endpoints/app-connections/camunda/create.md # Source: https://infisical.com/docs/api-reference/endpoints/app-connections/bitbucket/create.md # Source: https://infisical.com/docs/api-reference/endpoints/app-connections/azure-key-vault/create.md # Source: https://infisical.com/docs/api-reference/endpoints/app-connections/azure-devops/create.md # Source: https://infisical.com/docs/api-reference/endpoints/app-connections/azure-client-secret/create.md # Source: https://infisical.com/docs/api-reference/endpoints/app-connections/azure-app-configuration/create.md # Source: https://infisical.com/docs/api-reference/endpoints/app-connections/azure-adcs/create.md # Source: https://infisical.com/docs/api-reference/endpoints/app-connections/aws/create.md # Source: https://infisical.com/docs/api-reference/endpoints/app-connections/auth0/create.md # Source: https://infisical.com/docs/api-reference/endpoints/app-connections/1password/create.md > ## Documentation Index > Fetch the complete documentation index at: https://infisical.com/docs/llms.txt > Use this file to discover all available pages before exploring further. # Create > Create a 1Password Connection. Check out the configuration docs for [1Password Connections](/integrations/app-connections/1password) to learn how to obtain the required credentials. ## OpenAPI ````yaml POST /api/v1/app-connections/1password openapi: 3.0.3 info: title: Infisical API description: List of all available APIs that can be consumed version: 0.0.1 servers: - url: https://us.infisical.com description: Production server (US) - url: https://eu.infisical.com description: Production server (EU) - url: http://localhost:8080 description: Local server security: [] paths: /api/v1/app-connections/1password: post: tags: - App Connections description: Create a 1Password Connection. operationId: createOnePasswordAppConnection requestBody: content: application/json: schema: allOf: - anyOf: - type: object properties: method: type: string enum: - api-token description: The method used to authenticate with 1Password. credentials: type: object properties: apiToken: type: string minLength: 1 description: >- The API token used to access the 1Password Connect Server. instanceUrl: type: string format: uri minLength: 1 description: >- The URL of the 1Password Connect Server instance to authenticate with. required: - apiToken - instanceUrl additionalProperties: false description: The credentials used to connect with 1Password. required: - method - credentials additionalProperties: false - type: object properties: name: type: string minLength: 1 maxLength: 64 description: >- The name of the 1Password Connection to create. Must be slug-friendly. description: type: string maxLength: 256 nullable: true description: An optional description for the 1Password Connection. projectId: type: string description: >- The ID of the project to create the 1Password Connection in. isPlatformManagedCredentials: type: boolean enum: - false description: Not supported for 1Password Connections. gatewayId: anyOf: - not: {} - enum: - 'null' nullable: true description: Not supported for 1Password Connections. required: - name responses: '200': description: Default Response content: application/json: schema: type: object properties: appConnection: anyOf: - type: object properties: id: type: string format: uuid name: type: string description: type: string nullable: true version: type: number default: 1 orgId: type: string format: uuid createdAt: type: string format: date-time updatedAt: type: string format: date-time isPlatformManagedCredentials: type: boolean default: false nullable: true gatewayId: type: string format: uuid nullable: true projectId: type: string nullable: true credentialsHash: type: string project: type: object properties: name: type: string id: type: string type: type: string slug: type: string required: - name - id - type - slug additionalProperties: false nullable: true app: type: string enum: - 1password method: type: string enum: - api-token credentials: type: object properties: instanceUrl: type: string format: uri minLength: 1 description: >- The URL of the 1Password Connect Server instance to authenticate with. required: - instanceUrl additionalProperties: false required: - id - name - orgId - createdAt - updatedAt - app - method - credentials additionalProperties: false title: 1Password (API Token) required: - appConnection additionalProperties: false '400': description: Default Response content: application/json: schema: type: object properties: reqId: type: string statusCode: type: number enum: - 400 message: type: string error: type: string details: {} required: - reqId - statusCode - message - error additionalProperties: false '401': description: Default Response content: application/json: schema: type: object properties: reqId: type: string statusCode: type: number enum: - 401 message: type: string error: type: string required: - reqId - statusCode - message - error additionalProperties: false '403': description: Default Response content: application/json: schema: type: object properties: reqId: type: string statusCode: type: number enum: - 403 message: type: string details: {} error: type: string required: - reqId - statusCode - message - error additionalProperties: false '404': description: Default Response content: application/json: schema: type: object properties: reqId: type: string statusCode: type: number enum: - 404 message: type: string error: type: string required: - reqId - statusCode - message - error additionalProperties: false '422': description: Default Response content: application/json: schema: type: object properties: reqId: type: string statusCode: type: number enum: - 422 message: {} error: type: string required: - reqId - statusCode - error additionalProperties: false '500': description: Default Response content: application/json: schema: type: object properties: reqId: type: string statusCode: type: number enum: - 500 message: type: string error: type: string required: - reqId - statusCode - message - error additionalProperties: false ```` --- # Source: https://infisical.com/docs/documentation/platform/pam/product-reference/credential-rotation.md > ## Documentation Index > Fetch the complete documentation index at: https://infisical.com/docs/llms.txt > Use this file to discover all available pages before exploring further. # Credential Rotation > Learn how to automate credential rotation for your PAM resources. Automated Credential Rotation enhances your security posture by automatically changing the passwords of your accounts at set intervals. This minimizes the risk of compromised credentials by ensuring that even if a password is leaked, it remains valid only for a short period. ## How it Works When rotation is enabled, Infisical's Gateway connects to the target resource using a privileged "Rotation Account". It then executes the necessary commands to change the password for the target user account to a new, cryptographically secure random value. ## Configuration Setting up automated rotation requires a two-step configuration: first at the Resource level, and then at the individual Account level. A **Rotation Account** is a master or privileged account that has the necessary permissions to change the passwords of other users on the target system. When creating or editing a [Resource](/documentation/platform/pam/getting-started/resources), you must provide the credentials for this privileged account. *Example: For a PostgreSQL database, this would typically be the `postgres` superuser or another role with `ALTER ROLE` privileges.* Credential Rotation Account Once the resource has a rotation account configured, you can enable rotation for individual [Accounts](/documentation/platform/pam/getting-started/accounts) that belong to that resource. In the account settings: 1. Toggle **Enable Rotation**. 2. Set the **Rotation Interval** (e.g., every 7 days, 30 days). Rotate Credentials Account ## Supported Resources Automated rotation is currently supported for the following resource types: * **PostgreSQL**: Requires a user with `ALTER ROLE` permissions. We are constantly adding support for more resource types. --- # Source: https://infisical.com/docs/api-reference/endpoints/certificate-authorities/internal/crl.md > ## Documentation Index > Fetch the complete documentation index at: https://infisical.com/docs/llms.txt > Use this file to discover all available pages before exploring further. # List CRLs > Get list of CRLs of the CA ## OpenAPI ````yaml GET /api/v1/cert-manager/ca/internal/{caId}/crls openapi: 3.0.3 info: title: Infisical API description: List of all available APIs that can be consumed version: 0.0.1 servers: - url: https://us.infisical.com description: Production server (US) - url: https://eu.infisical.com description: Production server (EU) - url: http://localhost:8080 description: Local server security: [] paths: /api/v1/cert-manager/ca/internal/{caId}/crls: get: tags: - PKI Certificate Authorities description: Get list of CRLs of the CA operationId: getCaCrls parameters: - schema: type: string in: path name: caId required: true description: The ID of the CA to get the certificate revocation lists (CRLs) for. responses: '200': description: Default Response content: application/json: schema: type: array items: type: object properties: id: type: string description: The ID of certificate revocation list (CRL). crl: type: string description: The certificate revocation list (CRL). required: - id - crl additionalProperties: false '400': description: Default Response content: application/json: schema: type: object properties: reqId: type: string statusCode: type: number enum: - 400 message: type: string error: type: string details: {} required: - reqId - statusCode - message - error additionalProperties: false '401': description: Default Response content: application/json: schema: type: object properties: reqId: type: string statusCode: type: number enum: - 401 message: type: string error: type: string required: - reqId - statusCode - message - error additionalProperties: false '403': description: Default Response content: application/json: schema: type: object properties: reqId: type: string statusCode: type: number enum: - 403 message: type: string details: {} error: type: string required: - reqId - statusCode - message - error additionalProperties: false '404': description: Default Response content: application/json: schema: type: object properties: reqId: type: string statusCode: type: number enum: - 404 message: type: string error: type: string required: - reqId - statusCode - message - error additionalProperties: false '422': description: Default Response content: application/json: schema: type: object properties: reqId: type: string statusCode: type: number enum: - 422 message: {} error: type: string required: - reqId - statusCode - error additionalProperties: false '500': description: Default Response content: application/json: schema: type: object properties: reqId: type: string statusCode: type: number enum: - 500 message: type: string error: type: string required: - reqId - statusCode - message - error additionalProperties: false ```` --- # Source: https://infisical.com/docs/api-reference/endpoints/certificate-authorities/internal/csr.md > ## Documentation Index > Fetch the complete documentation index at: https://infisical.com/docs/llms.txt > Use this file to discover all available pages before exploring further. # Get CSR > Get CA CSR ## OpenAPI ````yaml GET /api/v1/cert-manager/ca/internal/{caId}/csr openapi: 3.0.3 info: title: Infisical API description: List of all available APIs that can be consumed version: 0.0.1 servers: - url: https://us.infisical.com description: Production server (US) - url: https://eu.infisical.com description: Production server (EU) - url: http://localhost:8080 description: Local server security: [] paths: /api/v1/cert-manager/ca/internal/{caId}/csr: get: tags: - PKI Certificate Authorities description: Get CA CSR operationId: getCaCsr parameters: - schema: type: string in: path name: caId required: true description: The ID of the CA to generate CSR from. responses: '200': description: Default Response content: application/json: schema: type: object properties: csr: type: string description: The generated CSR from the CA. required: - csr additionalProperties: false '400': description: Default Response content: application/json: schema: type: object properties: reqId: type: string statusCode: type: number enum: - 400 message: type: string error: type: string details: {} required: - reqId - statusCode - message - error additionalProperties: false '401': description: Default Response content: application/json: schema: type: object properties: reqId: type: string statusCode: type: number enum: - 401 message: type: string error: type: string required: - reqId - statusCode - message - error additionalProperties: false '403': description: Default Response content: application/json: schema: type: object properties: reqId: type: string statusCode: type: number enum: - 403 message: type: string details: {} error: type: string required: - reqId - statusCode - message - error additionalProperties: false '404': description: Default Response content: application/json: schema: type: object properties: reqId: type: string statusCode: type: number enum: - 404 message: type: string error: type: string required: - reqId - statusCode - message - error additionalProperties: false '422': description: Default Response content: application/json: schema: type: object properties: reqId: type: string statusCode: type: number enum: - 422 message: {} error: type: string required: - reqId - statusCode - error additionalProperties: false '500': description: Default Response content: application/json: schema: type: object properties: reqId: type: string statusCode: type: number enum: - 500 message: type: string error: type: string required: - reqId - statusCode - message - error additionalProperties: false ```` --- # Source: https://infisical.com/docs/self-hosting/guides/custom-certificates.md > ## Documentation Index > Fetch the complete documentation index at: https://infisical.com/docs/llms.txt > Use this file to discover all available pages before exploring further. # Adding Custom Certificates > Learn how to configure Infisical with custom certificates By default, the Infisical Docker image includes certificates from well-known public certificate authorities. However, some integrations with Infisical may need to communicate with your internal services that use private certificate authorities. To configure trust for custom certificates, follow these steps. This is particularly useful for connecting Infisical with self-hosted services like GitLab. ## Prerequisites * Docker * Standalone [Infisical image](https://hub.docker.com/r/infisical/infisical) * Certificate public key `.crt` files ## Setup 1. Place all your public key `.crt` files into a single directory. 2. Mount the directory containing the `.crt` files to the `/usr/local/share/ca-certificates/` path in the Infisical container. 3. Set the following environment variable on your Infisical container: ``` NODE_EXTRA_CA_CERTS=/etc/ssl/certs/ca-certificates.crt ``` 4. Start the Infisical container. By following these steps, your Infisical container will trust the specified certificates, allowing you to securely connect Infisical to your internal services. --- # Source: https://infisical.com/docs/documentation/platform/secret-rotation/databricks-service-principal-secret.md > ## Documentation Index > Fetch the complete documentation index at: https://infisical.com/docs/llms.txt > Use this file to discover all available pages before exploring further. # Databricks Service Principal Secret > Learn how to automatically rotate Databricks Service Principal OAuth Secrets. ## Prerequisites * Ensure you've configured the service principal for rotation. See [Configure Permissions for Secret Rotation](/integrations/app-connections/databricks#configure-permissions-for-secret-rotation). * Ensure your network security policies allow incoming requests from Infisical to this rotation provider, if network restrictions apply. ## Create a Databricks Service Principal Secret Rotation in Infisical 1. Navigate to your Secret Manager Project's Dashboard and select **Add Secret Rotation** from the actions dropdown. Secret Manager Dashboard 2. Select the **Databricks Service Principal Secret** option. Select Databricks Service Principal Secret 3. Select the **Databricks Connection** to use and configure the rotation behavior. Then click **Next**. Rotation Configuration * **Databricks Connection** - the connection that will perform the rotation of the specified service principal's OAuth secret. * **Rotation Interval** - the interval, in days, that once elapsed will trigger a rotation. * **Rotate At** - the local time of day when rotation should occur once the interval has elapsed. * **Auto-Rotation Enabled** - whether secrets should automatically be rotated once the rotation interval has elapsed. Disable this option to manually rotate secrets or pause secret rotation. 4. Select the Databricks service principal whose OAuth secret you want to rotate. Then click **Next**. Rotation Parameters 5. Specify the secret names that the client credentials should be mapped to. Then click **Next**. Rotation Secrets Mapping * **Client ID** - the name of the secret that the service principal Client ID will be mapped to. * **Client Secret** - the name of the secret that the rotated OAuth Client Secret will be mapped to. 6. Give your rotation a name and description (optional). Then click **Next**. Rotation Details * **Name** - the name of the secret rotation configuration. Must be slug-friendly. * **Description** (optional) - a description of this rotation configuration. 7. Review your configuration, then click **Create Secret Rotation**. Rotation Review 8. Your **Databricks Service Principal Secret** credentials are now available for use via the mapped secrets. Rotation Created To create a Databricks Service Principal Secret Rotation, make an API request to the [Create Databricks Service Principal Secret Rotation](/api-reference/endpoints/secret-rotations/databricks-service-principal-secret/create) API endpoint. ### Sample request ```bash Request theme={"dark"} curl --request POST \ --url https://us.infisical.com/api/v2/secret-rotations/databricks-service-principal-secret \ --header 'Content-Type: application/json' \ --data '{ "name": "my-databricks-rotation", "projectId": "3c90c3cc-0d44-4b50-8888-8dd25736052a", "description": "my service principal secret rotation", "connectionId": "3c90c3cc-0d44-4b50-8888-8dd25736052a", "environment": "dev", "secretPath": "/", "isAutoRotationEnabled": true, "rotationInterval": 30, "rotateAtUtc": { "hours": 0, "minutes": 0 }, "parameters": { "servicePrincipalId": "76997828332531", "servicePrincipalName": "my-service-principal", "clientId": "..." }, "secretsMapping": { "clientId": "DATABRICKS_CLIENT_ID", "clientSecret": "DATABRICKS_CLIENT_SECRET" } }' ``` ### Sample response ```bash Response theme={"dark"} { "secretRotation": { "id": "3c90c3cc-0d44-4b50-8888-8dd25736052a", "name": "my-databricks-rotation", "description": "my service principal secret rotation", "secretsMapping": { "clientId": "DATABRICKS_CLIENT_ID", "clientSecret": "DATABRICKS_CLIENT_SECRET" }, "isAutoRotationEnabled": true, "activeIndex": 0, "folderId": "3c90c3cc-0d44-4b50-8888-8dd25736052a", "connectionId": "3c90c3cc-0d44-4b50-8888-8dd25736052a", "createdAt": "2023-11-07T05:31:56Z", "updatedAt": "2023-11-07T05:31:56Z", "rotationInterval": 30, "rotationStatus": "success", "lastRotationAttemptedAt": "2023-11-07T05:31:56Z", "lastRotatedAt": "2023-11-07T05:31:56Z", "lastRotationJobId": "3c90c3cc-0d44-4b50-8888-8dd25736052a", "nextRotationAt": "2023-11-07T05:31:56Z", "connection": { "app": "databricks", "name": "my-databricks-connection", "id": "3c90c3cc-0d44-4b50-8888-8dd25736052a" }, "environment": { "slug": "dev", "name": "Development", "id": "3c90c3cc-0d44-4b50-8888-8dd25736052a" }, "projectId": "3c90c3cc-0d44-4b50-8888-8dd25736052a", "folder": { "id": "3c90c3cc-0d44-4b50-8888-8dd25736052a", "path": "/" }, "rotateAtUtc": { "hours": 0, "minutes": 0 }, "lastRotationMessage": null, "type": "databricks-service-principal-secret", "parameters": { "servicePrincipalId": "76997828332531", "servicePrincipalName": "my-service-principal", "clientId": "..." } } } ``` --- # Source: https://infisical.com/docs/integrations/secret-syncs/databricks.md # Source: https://infisical.com/docs/integrations/app-connections/databricks.md > ## Documentation Index > Fetch the complete documentation index at: https://infisical.com/docs/llms.txt > Use this file to discover all available pages before exploring further. # Databricks Connection > Learn how to configure a Databricks Connection for Infisical. Infisical supports the use of [service principals](https://docs.databricks.com/en/admin/users-groups/service-principals.html) to connect with your Databricks workspaces. ## Configure a Service Principal for Infisical Navigate to your Databricks Workspace **Settings** via the dropdown in the top right. Workspace Settings Page Under the **Identity & Access** tab, click the **Manage** button in the **Service Principals** section. Manage Service Principals Click the **Add Service Principal** button. Add Service Principal Select the **Add New** option and create a service principal for Infisical. Create Service Principal Click on your new service principal, select the **Secrets** tab and click the **Generate Secret** button. Generate Secret Copy your service principal **Secret** and **Client ID** for use in the following steps. Generate Secret Navigate to **Settings** > **Identity & Access** > **Groups** and select the admin group (typically named "admins" or "workspace-admins"). Admin Group Click **Add** and select the service principal you created for Infisical to add it to the admin group. Add to Admin Group Add to Admin Group Modal For each service principal whose secrets you want to rotate, navigate to **Settings** > **Identity & Access** > **Service Principals** and select the target service principal. Select Target Service Principal Click on the **Permissions** tab for the selected service principal. And then click the **Grant access** button to open the permission modal Permissions Tab In the **User, Group or Service Principal** field, select the service principal you created for Infisical. In the **Permission** field, select **Manage** to allow the Infisical service principal to manage credentials and secrets for this service principal. Click **Save** to apply the permissions. Repeat these steps for each service principal whose secrets you want to rotate. Assign Manage Permission ## Setup Databricks Connection in Infisical Navigate to the **Integrations** tab in the desired project, then select **App Connections**. App Connections
    Tab Select the **Databricks Connection** option from the connection options modal. Select Databricks
    Connection Select the **Service Principal** method, add your **workspace URL** and **service principal credentials**, then click **Connect to Databricks**. Connect via Databricks
    service principal Your **Databricks Connection** is now available for use. Databricks Service Principal
    Connection --- # Source: https://infisical.com/docs/api-reference/endpoints/kms/encryption/decrypt.md > ## Documentation Index > Fetch the complete documentation index at: https://infisical.com/docs/llms.txt > Use this file to discover all available pages before exploring further. # Decrypt Data > Decrypt data with KMS key ## OpenAPI ````yaml POST /api/v1/kms/keys/{keyId}/decrypt openapi: 3.0.3 info: title: Infisical API description: List of all available APIs that can be consumed version: 0.0.1 servers: - url: https://us.infisical.com description: Production server (US) - url: https://eu.infisical.com description: Production server (EU) - url: http://localhost:8080 description: Local server security: [] paths: /api/v1/kms/keys/{keyId}/decrypt: post: tags: - KMS Encryption description: Decrypt data with KMS key operationId: decryptWithKmsKey parameters: - schema: type: string format: uuid in: path name: keyId required: true description: The ID of the key to decrypt the data with. requestBody: content: application/json: schema: type: object properties: ciphertext: type: string description: The ciphertext to be decrypted (base64 encoded). required: - ciphertext additionalProperties: false required: true responses: '200': description: Default Response content: application/json: schema: type: object properties: plaintext: type: string required: - plaintext additionalProperties: false '400': description: Default Response content: application/json: schema: type: object properties: reqId: type: string statusCode: type: number enum: - 400 message: type: string error: type: string details: {} required: - reqId - statusCode - message - error additionalProperties: false '401': description: Default Response content: application/json: schema: type: object properties: reqId: type: string statusCode: type: number enum: - 401 message: type: string error: type: string required: - reqId - statusCode - message - error additionalProperties: false '403': description: Default Response content: application/json: schema: type: object properties: reqId: type: string statusCode: type: number enum: - 403 message: type: string details: {} error: type: string required: - reqId - statusCode - message - error additionalProperties: false '404': description: Default Response content: application/json: schema: type: object properties: reqId: type: string statusCode: type: number enum: - 404 message: type: string error: type: string required: - reqId - statusCode - message - error additionalProperties: false '422': description: Default Response content: application/json: schema: type: object properties: reqId: type: string statusCode: type: number enum: - 422 message: {} error: type: string required: - reqId - statusCode - error additionalProperties: false '500': description: Default Response content: application/json: schema: type: object properties: reqId: type: string statusCode: type: number enum: - 500 message: type: string error: type: string required: - reqId - statusCode - message - error additionalProperties: false ```` --- # Source: https://infisical.com/docs/api-reference/endpoints/integrations/delete-auth-by-id.md # Delete Auth By ID > Remove an integration auth object by object id. ## OpenAPI ````yaml DELETE /api/v1/integration-auth/{integrationAuthId} paths: path: /api/v1/integration-auth/{integrationAuthId} method: delete servers: - url: https://us.infisical.com description: Production server (US) - url: https://eu.infisical.com description: Production server (EU) - url: http://localhost:8080 description: Local server request: security: - title: bearerAuth parameters: query: {} header: Authorization: type: http scheme: bearer description: An access token in Infisical cookie: {} parameters: path: integrationAuthId: schema: - type: string required: true description: The ID of integration authentication object to delete. query: {} header: {} cookie: {} body: {} response: '200': application/json: schemaArray: - type: object properties: integrationAuth: allOf: - type: object properties: id: type: string format: uuid projectId: type: string integration: type: string teamId: type: string nullable: true url: type: string nullable: true namespace: type: string nullable: true accountId: type: string nullable: true metadata: nullable: true createdAt: type: string format: date-time updatedAt: type: string format: date-time required: - id - projectId - integration - createdAt - updatedAt additionalProperties: false requiredProperties: - integrationAuth additionalProperties: false examples: example: value: integrationAuth: id: 3c90c3cc-0d44-4b50-8888-8dd25736052a projectId: integration: teamId: url: namespace: accountId: metadata: createdAt: '2023-11-07T05:31:56Z' updatedAt: '2023-11-07T05:31:56Z' description: Default Response '400': application/json: schemaArray: - type: object properties: reqId: allOf: - type: string statusCode: allOf: - type: number enum: - 400 message: allOf: - type: string error: allOf: - type: string requiredProperties: - reqId - statusCode - message - error additionalProperties: false examples: example: value: reqId: statusCode: 400 message: error: description: Default Response '401': application/json: schemaArray: - type: object properties: reqId: allOf: - type: string statusCode: allOf: - type: number enum: - 401 message: allOf: - type: string error: allOf: - type: string requiredProperties: - reqId - statusCode - message - error additionalProperties: false examples: example: value: reqId: statusCode: 401 message: error: description: Default Response '403': application/json: schemaArray: - type: object properties: reqId: allOf: - type: string statusCode: allOf: - type: number enum: - 403 message: allOf: - type: string details: allOf: - {} error: allOf: - type: string requiredProperties: - reqId - statusCode - message - error additionalProperties: false examples: example: value: reqId: statusCode: 403 message: details: error: description: Default Response '404': application/json: schemaArray: - type: object properties: reqId: allOf: - type: string statusCode: allOf: - type: number enum: - 404 message: allOf: - type: string error: allOf: - type: string requiredProperties: - reqId - statusCode - message - error additionalProperties: false examples: example: value: reqId: statusCode: 404 message: error: description: Default Response '422': application/json: schemaArray: - type: object properties: reqId: allOf: - type: string statusCode: allOf: - type: number enum: - 422 message: allOf: - {} error: allOf: - type: string requiredProperties: - reqId - statusCode - error additionalProperties: false examples: example: value: reqId: statusCode: 422 message: error: description: Default Response '500': application/json: schemaArray: - type: object properties: reqId: allOf: - type: string statusCode: allOf: - type: number enum: - 500 message: allOf: - type: string error: allOf: - type: string requiredProperties: - reqId - statusCode - message - error additionalProperties: false examples: example: value: reqId: statusCode: 500 message: error: description: Default Response deprecated: false type: path components: schemas: {} ```` --- # Source: https://infisical.com/docs/api-reference/endpoints/integrations/delete-auth.md # Delete Auth > Remove all integration's auth object from the project. ## OpenAPI ````yaml DELETE /api/v1/integration-auth paths: path: /api/v1/integration-auth method: delete servers: - url: https://us.infisical.com description: Production server (US) - url: https://eu.infisical.com description: Production server (EU) - url: http://localhost:8080 description: Local server request: security: - title: bearerAuth parameters: query: {} header: Authorization: type: http scheme: bearer description: An access token in Infisical cookie: {} parameters: path: {} query: integration: schema: - type: string required: true description: The slug of the integration to be unauthorized. projectId: schema: - type: string required: true description: The ID of the project to delete the integration auth from. header: {} cookie: {} body: {} response: '200': application/json: schemaArray: - type: object properties: integrationAuth: allOf: - type: array items: type: object properties: id: type: string format: uuid projectId: type: string integration: type: string teamId: type: string nullable: true url: type: string nullable: true namespace: type: string nullable: true accountId: type: string nullable: true metadata: nullable: true createdAt: type: string format: date-time updatedAt: type: string format: date-time required: - id - projectId - integration - createdAt - updatedAt additionalProperties: false requiredProperties: - integrationAuth additionalProperties: false examples: example: value: integrationAuth: - id: 3c90c3cc-0d44-4b50-8888-8dd25736052a projectId: integration: teamId: url: namespace: accountId: metadata: createdAt: '2023-11-07T05:31:56Z' updatedAt: '2023-11-07T05:31:56Z' description: Default Response '400': application/json: schemaArray: - type: object properties: reqId: allOf: - type: string statusCode: allOf: - type: number enum: - 400 message: allOf: - type: string error: allOf: - type: string requiredProperties: - reqId - statusCode - message - error additionalProperties: false examples: example: value: reqId: statusCode: 400 message: error: description: Default Response '401': application/json: schemaArray: - type: object properties: reqId: allOf: - type: string statusCode: allOf: - type: number enum: - 401 message: allOf: - type: string error: allOf: - type: string requiredProperties: - reqId - statusCode - message - error additionalProperties: false examples: example: value: reqId: statusCode: 401 message: error: description: Default Response '403': application/json: schemaArray: - type: object properties: reqId: allOf: - type: string statusCode: allOf: - type: number enum: - 403 message: allOf: - type: string details: allOf: - {} error: allOf: - type: string requiredProperties: - reqId - statusCode - message - error additionalProperties: false examples: example: value: reqId: statusCode: 403 message: details: error: description: Default Response '404': application/json: schemaArray: - type: object properties: reqId: allOf: - type: string statusCode: allOf: - type: number enum: - 404 message: allOf: - type: string error: allOf: - type: string requiredProperties: - reqId - statusCode - message - error additionalProperties: false examples: example: value: reqId: statusCode: 404 message: error: description: Default Response '422': application/json: schemaArray: - type: object properties: reqId: allOf: - type: string statusCode: allOf: - type: number enum: - 422 message: allOf: - {} error: allOf: - type: string requiredProperties: - reqId - statusCode - error additionalProperties: false examples: example: value: reqId: statusCode: 422 message: error: description: Default Response '500': application/json: schemaArray: - type: object properties: reqId: allOf: - type: string statusCode: allOf: - type: number enum: - 500 message: allOf: - type: string error: allOf: - type: string requiredProperties: - reqId - statusCode - message - error additionalProperties: false examples: example: value: reqId: statusCode: 500 message: error: description: Default Response deprecated: false type: path components: schemas: {} ```` --- # Source: https://infisical.com/docs/api-reference/endpoints/project-identities-membership/delete-identity-membership.md # Source: https://infisical.com/docs/api-reference/endpoints/deprecated/project-identities-v2/delete-identity-membership.md > ## Documentation Index > Fetch the complete documentation index at: https://infisical.com/docs/llms.txt > Use this file to discover all available pages before exploring further. # Delete Identity Membership > Delete project identity memberships ## OpenAPI ````yaml DELETE /api/v1/projects/{projectId}/identity-memberships/{identityId} openapi: 3.0.3 info: title: Infisical API description: List of all available APIs that can be consumed version: 0.0.1 servers: - url: https://us.infisical.com description: Production server (US) - url: https://eu.infisical.com description: Production server (EU) - url: http://localhost:8080 description: Local server security: [] paths: /api/v1/projects/{projectId}/identity-memberships/{identityId}: delete: tags: - Project Identities description: Delete project identity memberships parameters: - schema: type: string in: path name: projectId required: true description: The ID of the project to delete the identity membership from. - schema: type: string in: path name: identityId required: true description: The ID of the machine identity to delete the membership from. responses: '200': description: Default Response content: application/json: schema: type: object properties: identityMembership: type: object properties: id: type: string format: uuid projectId: type: string identityId: type: string format: uuid createdAt: type: string format: date-time updatedAt: type: string format: date-time required: - id - projectId - identityId - createdAt - updatedAt additionalProperties: false required: - identityMembership additionalProperties: false '400': description: Default Response content: application/json: schema: type: object properties: reqId: type: string statusCode: type: number enum: - 400 message: type: string error: type: string details: {} required: - reqId - statusCode - message - error additionalProperties: false '401': description: Default Response content: application/json: schema: type: object properties: reqId: type: string statusCode: type: number enum: - 401 message: type: string error: type: string required: - reqId - statusCode - message - error additionalProperties: false '403': description: Default Response content: application/json: schema: type: object properties: reqId: type: string statusCode: type: number enum: - 403 message: type: string details: {} error: type: string required: - reqId - statusCode - message - error additionalProperties: false '404': description: Default Response content: application/json: schema: type: object properties: reqId: type: string statusCode: type: number enum: - 404 message: type: string error: type: string required: - reqId - statusCode - message - error additionalProperties: false '422': description: Default Response content: application/json: schema: type: object properties: reqId: type: string statusCode: type: number enum: - 422 message: {} error: type: string required: - reqId - statusCode - error additionalProperties: false '500': description: Default Response content: application/json: schema: type: object properties: reqId: type: string statusCode: type: number enum: - 500 message: type: string error: type: string required: - reqId - statusCode - message - error additionalProperties: false security: - bearerAuth: [] components: securitySchemes: bearerAuth: type: http scheme: bearer bearerFormat: JWT description: An access token in Infisical ```` --- # Source: https://infisical.com/docs/api-reference/endpoints/project-identities/delete-identity.md > ## Documentation Index > Fetch the complete documentation index at: https://infisical.com/docs/llms.txt > Use this file to discover all available pages before exploring further. # Delete Identity > Delete an identity from a project ## OpenAPI ````yaml DELETE /api/v1/projects/{projectId}/identities/{identityId} openapi: 3.0.3 info: title: Infisical API description: List of all available APIs that can be consumed version: 0.0.1 servers: - url: https://us.infisical.com description: Production server (US) - url: https://eu.infisical.com description: Production server (EU) - url: http://localhost:8080 description: Local server security: [] paths: /api/v1/projects/{projectId}/identities/{identityId}: delete: tags: - Identities description: Delete an identity from a project operationId: deleteProjectMachineIdentity parameters: - schema: type: string in: path name: projectId required: true description: The ID of the project - schema: type: string in: path name: identityId required: true description: The ID of the machine identity to delete. responses: '200': description: Default Response content: application/json: schema: type: object properties: identity: type: object properties: id: type: string format: uuid name: type: string orgId: type: string format: uuid projectId: type: string nullable: true createdAt: type: string format: date-time updatedAt: type: string format: date-time hasDeleteProtection: type: boolean default: false activeLockoutAuthMethods: type: array items: type: string authMethods: type: array items: type: string metadata: type: array items: type: object properties: key: type: string value: type: string id: type: string required: - key - value - id additionalProperties: false required: - id - name - orgId - createdAt - updatedAt additionalProperties: false required: - identity additionalProperties: false '400': description: Default Response content: application/json: schema: type: object properties: reqId: type: string statusCode: type: number enum: - 400 message: type: string error: type: string details: {} required: - reqId - statusCode - message - error additionalProperties: false '401': description: Default Response content: application/json: schema: type: object properties: reqId: type: string statusCode: type: number enum: - 401 message: type: string error: type: string required: - reqId - statusCode - message - error additionalProperties: false '403': description: Default Response content: application/json: schema: type: object properties: reqId: type: string statusCode: type: number enum: - 403 message: type: string details: {} error: type: string required: - reqId - statusCode - message - error additionalProperties: false '404': description: Default Response content: application/json: schema: type: object properties: reqId: type: string statusCode: type: number enum: - 404 message: type: string error: type: string required: - reqId - statusCode - message - error additionalProperties: false '422': description: Default Response content: application/json: schema: type: object properties: reqId: type: string statusCode: type: number enum: - 422 message: {} error: type: string required: - reqId - statusCode - error additionalProperties: false '500': description: Default Response content: application/json: schema: type: object properties: reqId: type: string statusCode: type: number enum: - 500 message: type: string error: type: string required: - reqId - statusCode - message - error additionalProperties: false security: - bearerAuth: [] components: securitySchemes: bearerAuth: type: http scheme: bearer bearerFormat: JWT description: An access token in Infisical ```` --- # Source: https://infisical.com/docs/api-reference/endpoints/pki-collections/delete-item.md # Delete Collection Item > Remove item from PKI collection ## OpenAPI ````yaml DELETE /api/v1/pki/collections/{collectionId}/items/{collectionItemId} paths: path: /api/v1/pki/collections/{collectionId}/items/{collectionItemId} method: delete servers: - url: https://us.infisical.com description: Production server (US) - url: https://eu.infisical.com description: Production server (EU) - url: http://localhost:8080 description: Local server request: security: [] parameters: path: collectionId: schema: - type: string required: true description: The ID of the PKI collection to delete the item from. collectionItemId: schema: - type: string required: true description: The ID of the PKI collection item to delete. query: {} header: {} cookie: {} body: {} response: '200': application/json: schemaArray: - type: object properties: id: allOf: - type: string format: uuid createdAt: allOf: - type: string format: date-time updatedAt: allOf: - type: string format: date-time pkiCollectionId: allOf: - type: string format: uuid type: allOf: - type: string enum: - certificate - ca description: The type of the deleted PKI collection item. itemId: allOf: - type: string description: The resource ID of the deleted PKI collection item. requiredProperties: - id - createdAt - updatedAt - pkiCollectionId - type - itemId additionalProperties: false examples: example: value: id: 3c90c3cc-0d44-4b50-8888-8dd25736052a createdAt: '2023-11-07T05:31:56Z' updatedAt: '2023-11-07T05:31:56Z' pkiCollectionId: 3c90c3cc-0d44-4b50-8888-8dd25736052a type: certificate itemId: description: Default Response '400': application/json: schemaArray: - type: object properties: reqId: allOf: - type: string statusCode: allOf: - type: number enum: - 400 message: allOf: - type: string error: allOf: - type: string requiredProperties: - reqId - statusCode - message - error additionalProperties: false examples: example: value: reqId: statusCode: 400 message: error: description: Default Response '401': application/json: schemaArray: - type: object properties: reqId: allOf: - type: string statusCode: allOf: - type: number enum: - 401 message: allOf: - type: string error: allOf: - type: string requiredProperties: - reqId - statusCode - message - error additionalProperties: false examples: example: value: reqId: statusCode: 401 message: error: description: Default Response '403': application/json: schemaArray: - type: object properties: reqId: allOf: - type: string statusCode: allOf: - type: number enum: - 403 message: allOf: - type: string details: allOf: - {} error: allOf: - type: string requiredProperties: - reqId - statusCode - message - error additionalProperties: false examples: example: value: reqId: statusCode: 403 message: details: error: description: Default Response '404': application/json: schemaArray: - type: object properties: reqId: allOf: - type: string statusCode: allOf: - type: number enum: - 404 message: allOf: - type: string error: allOf: - type: string requiredProperties: - reqId - statusCode - message - error additionalProperties: false examples: example: value: reqId: statusCode: 404 message: error: description: Default Response '422': application/json: schemaArray: - type: object properties: reqId: allOf: - type: string statusCode: allOf: - type: number enum: - 422 message: allOf: - {} error: allOf: - type: string requiredProperties: - reqId - statusCode - error additionalProperties: false examples: example: value: reqId: statusCode: 422 message: error: description: Default Response '500': application/json: schemaArray: - type: object properties: reqId: allOf: - type: string statusCode: allOf: - type: number enum: - 500 message: allOf: - type: string error: allOf: - type: string requiredProperties: - reqId - statusCode - message - error additionalProperties: false examples: example: value: reqId: statusCode: 500 message: error: description: Default Response deprecated: false type: path components: schemas: {} ```` --- # Source: https://infisical.com/docs/api-reference/endpoints/dynamic-secrets/delete-lease.md > ## Documentation Index > Fetch the complete documentation index at: https://infisical.com/docs/llms.txt > Use this file to discover all available pages before exploring further. # Delete Lease ## OpenAPI ````yaml DELETE /api/v1/dynamic-secrets/leases/{leaseId} openapi: 3.0.3 info: title: Infisical API description: List of all available APIs that can be consumed version: 0.0.1 servers: - url: https://us.infisical.com description: Production server (US) - url: https://eu.infisical.com description: Production server (EU) - url: http://localhost:8080 description: Local server security: [] paths: /api/v1/dynamic-secrets/leases/{leaseId}: delete: tags: - Dynamic Secrets parameters: - schema: type: string minLength: 1 in: path name: leaseId required: true description: The ID of the dynamic secret lease. requestBody: content: application/json: schema: type: object properties: projectSlug: type: string minLength: 1 description: The slug of the project of the dynamic secret in. path: type: string minLength: 1 default: / description: The path of the dynamic secret in. environmentSlug: type: string minLength: 1 description: The slug of the environment of the dynamic secret in. isForced: type: boolean default: false description: >- A boolean flag to delete the the dynamic secret from Infisical without trying to remove it from external provider. Used when the dynamic secret got modified externally. required: - projectSlug - environmentSlug additionalProperties: false required: true responses: '200': description: Default Response content: application/json: schema: type: object properties: lease: type: object properties: id: type: string format: uuid version: type: number externalEntityId: type: string expireAt: type: string format: date-time status: type: string nullable: true statusDetails: type: string nullable: true dynamicSecretId: type: string format: uuid createdAt: type: string format: date-time updatedAt: type: string format: date-time config: nullable: true required: - id - version - externalEntityId - expireAt - dynamicSecretId - createdAt - updatedAt additionalProperties: false required: - lease additionalProperties: false '400': description: Default Response content: application/json: schema: type: object properties: reqId: type: string statusCode: type: number enum: - 400 message: type: string error: type: string details: {} required: - reqId - statusCode - message - error additionalProperties: false '401': description: Default Response content: application/json: schema: type: object properties: reqId: type: string statusCode: type: number enum: - 401 message: type: string error: type: string required: - reqId - statusCode - message - error additionalProperties: false '403': description: Default Response content: application/json: schema: type: object properties: reqId: type: string statusCode: type: number enum: - 403 message: type: string details: {} error: type: string required: - reqId - statusCode - message - error additionalProperties: false '404': description: Default Response content: application/json: schema: type: object properties: reqId: type: string statusCode: type: number enum: - 404 message: type: string error: type: string required: - reqId - statusCode - message - error additionalProperties: false '422': description: Default Response content: application/json: schema: type: object properties: reqId: type: string statusCode: type: number enum: - 422 message: {} error: type: string required: - reqId - statusCode - error additionalProperties: false '500': description: Default Response content: application/json: schema: type: object properties: reqId: type: string statusCode: type: number enum: - 500 message: type: string error: type: string required: - reqId - statusCode - message - error additionalProperties: false ```` --- # Source: https://infisical.com/docs/api-reference/endpoints/secrets/delete-many.md # Source: https://infisical.com/docs/api-reference/endpoints/deprecated/secrets/delete-many.md > ## Documentation Index > Fetch the complete documentation index at: https://infisical.com/docs/llms.txt > Use this file to discover all available pages before exploring further. # Bulk Delete > Delete many secrets ## OpenAPI ````yaml DELETE /api/v3/secrets/batch/raw openapi: 3.0.3 info: title: Infisical API description: List of all available APIs that can be consumed version: 0.0.1 servers: - url: https://us.infisical.com description: Production server (US) - url: https://eu.infisical.com description: Production server (EU) - url: http://localhost:8080 description: Local server security: [] paths: /api/v3/secrets/batch/raw: delete: tags: - Secrets description: Delete many secrets requestBody: content: application/json: schema: type: object properties: projectSlug: type: string description: The slug of the project to delete the secret in. workspaceId: type: string description: The ID of the project where the secret is located. environment: type: string description: The slug of the environment where the secret is located. secretPath: type: string default: / description: The path of the secret. secrets: type: array items: type: object properties: secretKey: type: string description: The name of the secret to delete. type: type: string enum: - shared - personal default: shared required: - secretKey additionalProperties: false minItems: 1 required: - environment - secrets additionalProperties: false required: true responses: '200': description: Default Response content: application/json: schema: anyOf: - type: object properties: secrets: type: array items: type: object properties: id: type: string _id: type: string workspace: type: string environment: type: string version: type: number type: type: string secretKey: type: string secretValue: type: string secretComment: type: string secretReminderNote: type: string nullable: true secretReminderRepeatDays: type: number nullable: true skipMultilineEncoding: type: boolean default: false nullable: true createdAt: type: string format: date-time updatedAt: type: string format: date-time actor: type: object properties: actorId: type: string nullable: true actorType: type: string nullable: true name: type: string nullable: true membershipId: type: string nullable: true groupId: type: string nullable: true additionalProperties: false nullable: true isRotatedSecret: type: boolean rotationId: type: string format: uuid nullable: true secretValueHidden: type: boolean required: - id - _id - workspace - environment - version - type - secretKey - secretValue - secretComment - createdAt - updatedAt - secretValueHidden additionalProperties: false required: - secrets additionalProperties: false - type: object properties: approval: type: object properties: id: type: string format: uuid policyId: type: string format: uuid hasMerged: type: boolean default: false status: type: string default: open conflicts: nullable: true slug: type: string folderId: type: string format: uuid createdAt: type: string format: date-time updatedAt: type: string format: date-time isReplicated: type: boolean nullable: true committerUserId: type: string format: uuid nullable: true statusChangedByUserId: type: string format: uuid nullable: true bypassReason: type: string nullable: true required: - id - policyId - slug - folderId - createdAt - updatedAt additionalProperties: false required: - approval additionalProperties: false description: When secret protection policy is enabled '400': description: Default Response content: application/json: schema: type: object properties: reqId: type: string statusCode: type: number enum: - 400 message: type: string error: type: string details: {} required: - reqId - statusCode - message - error additionalProperties: false '401': description: Default Response content: application/json: schema: type: object properties: reqId: type: string statusCode: type: number enum: - 401 message: type: string error: type: string required: - reqId - statusCode - message - error additionalProperties: false '403': description: Default Response content: application/json: schema: type: object properties: reqId: type: string statusCode: type: number enum: - 403 message: type: string details: {} error: type: string required: - reqId - statusCode - message - error additionalProperties: false '404': description: Default Response content: application/json: schema: type: object properties: reqId: type: string statusCode: type: number enum: - 404 message: type: string error: type: string required: - reqId - statusCode - message - error additionalProperties: false '422': description: Default Response content: application/json: schema: type: object properties: reqId: type: string statusCode: type: number enum: - 422 message: {} error: type: string required: - reqId - statusCode - error additionalProperties: false '500': description: Default Response content: application/json: schema: type: object properties: reqId: type: string statusCode: type: number enum: - 500 message: type: string error: type: string required: - reqId - statusCode - message - error additionalProperties: false security: - bearerAuth: [] components: securitySchemes: bearerAuth: type: http scheme: bearer bearerFormat: JWT description: An access token in Infisical ```` --- # Source: https://infisical.com/docs/api-reference/endpoints/organizations/delete-membership.md > ## Documentation Index > Fetch the complete documentation index at: https://infisical.com/docs/llms.txt > Use this file to discover all available pages before exploring further. # Delete User Membership > Delete organization user memberships ## OpenAPI ````yaml DELETE /api/v2/organizations/{organizationId}/memberships/{membershipId} openapi: 3.0.3 info: title: Infisical API description: List of all available APIs that can be consumed version: 0.0.1 servers: - url: https://us.infisical.com description: Production server (US) - url: https://eu.infisical.com description: Production server (EU) - url: http://localhost:8080 description: Local server security: [] paths: /api/v2/organizations/{organizationId}/memberships/{membershipId}: delete: tags: - Organizations description: Delete organization user memberships operationId: deleteOrgMembership parameters: - schema: type: string in: path name: organizationId required: true description: The ID of the organization to delete the membership from. - schema: type: string in: path name: membershipId required: true description: The ID of the membership to delete. responses: '200': description: Default Response content: application/json: schema: type: object properties: membership: type: object properties: id: type: string format: uuid role: type: string status: type: string default: invited inviteEmail: type: string nullable: true createdAt: type: string format: date-time updatedAt: type: string format: date-time userId: type: string format: uuid nullable: true orgId: type: string format: uuid roleId: type: string format: uuid nullable: true projectFavorites: type: array items: type: string nullable: true isActive: type: boolean default: true lastInvitedAt: type: string format: date-time nullable: true lastLoginAuthMethod: type: string nullable: true lastLoginTime: type: string format: date-time nullable: true required: - id - role - createdAt - updatedAt - orgId additionalProperties: false required: - membership additionalProperties: false '400': description: Default Response content: application/json: schema: type: object properties: reqId: type: string statusCode: type: number enum: - 400 message: type: string error: type: string details: {} required: - reqId - statusCode - message - error additionalProperties: false '401': description: Default Response content: application/json: schema: type: object properties: reqId: type: string statusCode: type: number enum: - 401 message: type: string error: type: string required: - reqId - statusCode - message - error additionalProperties: false '403': description: Default Response content: application/json: schema: type: object properties: reqId: type: string statusCode: type: number enum: - 403 message: type: string details: {} error: type: string required: - reqId - statusCode - message - error additionalProperties: false '404': description: Default Response content: application/json: schema: type: object properties: reqId: type: string statusCode: type: number enum: - 404 message: type: string error: type: string required: - reqId - statusCode - message - error additionalProperties: false '422': description: Default Response content: application/json: schema: type: object properties: reqId: type: string statusCode: type: number enum: - 422 message: {} error: type: string required: - reqId - statusCode - error additionalProperties: false '500': description: Default Response content: application/json: schema: type: object properties: reqId: type: string statusCode: type: number enum: - 500 message: type: string error: type: string required: - reqId - statusCode - message - error additionalProperties: false security: - bearerAuth: [] components: securitySchemes: bearerAuth: type: http scheme: bearer bearerFormat: JWT description: An access token in Infisical ```` --- # Source: https://infisical.com/docs/api-reference/endpoints/projects/delete-project.md # Source: https://infisical.com/docs/api-reference/endpoints/deprecated/projects/delete-project.md > ## Documentation Index > Fetch the complete documentation index at: https://infisical.com/docs/llms.txt > Use this file to discover all available pages before exploring further. # Delete Project > Delete project This operation is irreversible. All data associated with the project will be deleted. Please use with caution. ## OpenAPI ````yaml DELETE /api/v1/workspace/{workspaceId} openapi: 3.0.3 info: title: Infisical API description: List of all available APIs that can be consumed version: 0.0.1 servers: - url: https://us.infisical.com description: Production server (US) - url: https://eu.infisical.com description: Production server (EU) - url: http://localhost:8080 description: Local server security: [] paths: /api/v1/workspace/{workspaceId}: delete: tags: - Projects description: Delete project parameters: - schema: type: string in: path name: workspaceId required: true description: The ID of the project to delete. responses: '200': description: Default Response content: application/json: schema: type: object properties: workspace: type: object properties: id: type: string name: type: string description: type: string nullable: true type: type: string defaultProduct: type: string nullable: true slug: type: string autoCapitalization: type: boolean default: false nullable: true orgId: type: string format: uuid createdAt: type: string format: date-time updatedAt: type: string format: date-time version: type: number default: 1 upgradeStatus: type: string nullable: true pitVersionLimit: type: number default: 10 kmsCertificateKeyId: type: string format: uuid nullable: true auditLogsRetentionDays: type: number nullable: true hasDeleteProtection: type: boolean default: false nullable: true secretSharing: type: boolean default: true showSnapshotsLegacy: type: boolean default: false secretDetectionIgnoreValues: type: array items: type: string nullable: true enforceEncryptedSecretManagerSecretMetadata: type: boolean nullable: true required: - id - name - type - slug - orgId - createdAt - updatedAt additionalProperties: false additionalProperties: false '400': description: Default Response content: application/json: schema: type: object properties: reqId: type: string statusCode: type: number enum: - 400 message: type: string error: type: string details: {} required: - reqId - statusCode - message - error additionalProperties: false '401': description: Default Response content: application/json: schema: type: object properties: reqId: type: string statusCode: type: number enum: - 401 message: type: string error: type: string required: - reqId - statusCode - message - error additionalProperties: false '403': description: Default Response content: application/json: schema: type: object properties: reqId: type: string statusCode: type: number enum: - 403 message: type: string details: {} error: type: string required: - reqId - statusCode - message - error additionalProperties: false '404': description: Default Response content: application/json: schema: type: object properties: reqId: type: string statusCode: type: number enum: - 404 message: type: string error: type: string required: - reqId - statusCode - message - error additionalProperties: false '422': description: Default Response content: application/json: schema: type: object properties: reqId: type: string statusCode: type: number enum: - 422 message: {} error: type: string required: - reqId - statusCode - error additionalProperties: false '500': description: Default Response content: application/json: schema: type: object properties: reqId: type: string statusCode: type: number enum: - 500 message: type: string error: type: string required: - reqId - statusCode - message - error additionalProperties: false security: - bearerAuth: [] components: securitySchemes: bearerAuth: type: http scheme: bearer bearerFormat: JWT description: An access token in Infisical ```` --- # Source: https://infisical.com/docs/api-reference/endpoints/secrets/delete.md # Source: https://infisical.com/docs/api-reference/endpoints/secret-tags/delete.md # Source: https://infisical.com/docs/api-reference/endpoints/secret-syncs/zabbix/delete.md # Source: https://infisical.com/docs/api-reference/endpoints/secret-syncs/windmill/delete.md # Source: https://infisical.com/docs/api-reference/endpoints/secret-syncs/vercel/delete.md # Source: https://infisical.com/docs/api-reference/endpoints/secret-syncs/terraform-cloud/delete.md # Source: https://infisical.com/docs/api-reference/endpoints/secret-syncs/teamcity/delete.md # Source: https://infisical.com/docs/api-reference/endpoints/secret-syncs/supabase/delete.md # Source: https://infisical.com/docs/api-reference/endpoints/secret-syncs/render/delete.md # Source: https://infisical.com/docs/api-reference/endpoints/secret-syncs/railway/delete.md # Source: https://infisical.com/docs/api-reference/endpoints/secret-syncs/octopus-deploy/delete.md # Source: https://infisical.com/docs/api-reference/endpoints/secret-syncs/oci-vault/delete.md # Source: https://infisical.com/docs/api-reference/endpoints/secret-syncs/northflank/delete.md # Source: https://infisical.com/docs/api-reference/endpoints/secret-syncs/netlify/delete.md # Source: https://infisical.com/docs/api-reference/endpoints/secret-syncs/laravel-forge/delete.md # Source: https://infisical.com/docs/api-reference/endpoints/secret-syncs/humanitec/delete.md # Source: https://infisical.com/docs/api-reference/endpoints/secret-syncs/heroku/delete.md # Source: https://infisical.com/docs/api-reference/endpoints/secret-syncs/hashicorp-vault/delete.md # Source: https://infisical.com/docs/api-reference/endpoints/secret-syncs/gitlab/delete.md # Source: https://infisical.com/docs/api-reference/endpoints/secret-syncs/github/delete.md # Source: https://infisical.com/docs/api-reference/endpoints/secret-syncs/gcp-secret-manager/delete.md # Source: https://infisical.com/docs/api-reference/endpoints/secret-syncs/flyio/delete.md # Source: https://infisical.com/docs/api-reference/endpoints/secret-syncs/digital-ocean-app-platform/delete.md # Source: https://infisical.com/docs/api-reference/endpoints/secret-syncs/databricks/delete.md # Source: https://infisical.com/docs/api-reference/endpoints/secret-syncs/cloudflare-workers/delete.md # Source: https://infisical.com/docs/api-reference/endpoints/secret-syncs/cloudflare-pages/delete.md # Source: https://infisical.com/docs/api-reference/endpoints/secret-syncs/circleci/delete.md # Source: https://infisical.com/docs/api-reference/endpoints/secret-syncs/chef/delete.md # Source: https://infisical.com/docs/api-reference/endpoints/secret-syncs/checkly/delete.md # Source: https://infisical.com/docs/api-reference/endpoints/secret-syncs/camunda/delete.md # Source: https://infisical.com/docs/api-reference/endpoints/secret-syncs/bitbucket/delete.md # Source: https://infisical.com/docs/api-reference/endpoints/secret-syncs/azure-key-vault/delete.md # Source: https://infisical.com/docs/api-reference/endpoints/secret-syncs/azure-devops/delete.md # Source: https://infisical.com/docs/api-reference/endpoints/secret-syncs/azure-app-configuration/delete.md # Source: https://infisical.com/docs/api-reference/endpoints/secret-syncs/aws-secrets-manager/delete.md # Source: https://infisical.com/docs/api-reference/endpoints/secret-syncs/aws-parameter-store/delete.md # Source: https://infisical.com/docs/api-reference/endpoints/secret-syncs/1password/delete.md # Source: https://infisical.com/docs/api-reference/endpoints/secret-scanning/data-sources/gitlab/delete.md # Source: https://infisical.com/docs/api-reference/endpoints/secret-scanning/data-sources/github/delete.md # Source: https://infisical.com/docs/api-reference/endpoints/secret-scanning/data-sources/bitbucket/delete.md # Source: https://infisical.com/docs/api-reference/endpoints/secret-rotations/windows-local-account/delete.md # Source: https://infisical.com/docs/api-reference/endpoints/secret-rotations/unix-linux-local-account/delete.md # Source: https://infisical.com/docs/api-reference/endpoints/secret-rotations/redis-credentials/delete.md # Source: https://infisical.com/docs/api-reference/endpoints/secret-rotations/postgres-credentials/delete.md # Source: https://infisical.com/docs/api-reference/endpoints/secret-rotations/oracledb-credentials/delete.md # Source: https://infisical.com/docs/api-reference/endpoints/secret-rotations/okta-client-secret/delete.md # Source: https://infisical.com/docs/api-reference/endpoints/secret-rotations/mysql-credentials/delete.md # Source: https://infisical.com/docs/api-reference/endpoints/secret-rotations/mssql-credentials/delete.md # Source: https://infisical.com/docs/api-reference/endpoints/secret-rotations/mongodb-credentials/delete.md # Source: https://infisical.com/docs/api-reference/endpoints/secret-rotations/ldap-password/delete.md # Source: https://infisical.com/docs/api-reference/endpoints/secret-rotations/databricks-service-principal-secret/delete.md # Source: https://infisical.com/docs/api-reference/endpoints/secret-rotations/azure-client-secret/delete.md # Source: https://infisical.com/docs/api-reference/endpoints/secret-rotations/aws-iam-user-secret/delete.md # Source: https://infisical.com/docs/api-reference/endpoints/secret-rotations/auth0-client-secret/delete.md # Source: https://infisical.com/docs/api-reference/endpoints/secret-imports/delete.md # Source: https://infisical.com/docs/api-reference/endpoints/project-templates/delete.md # Source: https://infisical.com/docs/api-reference/endpoints/project-roles/delete.md # Source: https://infisical.com/docs/api-reference/endpoints/project-groups/delete.md # Source: https://infisical.com/docs/api-reference/endpoints/pki/syncs/chef/delete.md # Source: https://infisical.com/docs/api-reference/endpoints/pki/syncs/azure-key-vault/delete.md # Source: https://infisical.com/docs/api-reference/endpoints/pki/syncs/aws-secrets-manager/delete.md # Source: https://infisical.com/docs/api-reference/endpoints/pki/syncs/aws-certificate-manager/delete.md # Source: https://infisical.com/docs/api-reference/endpoints/pki-alerts/delete.md # Source: https://infisical.com/docs/api-reference/endpoints/organization-roles/delete.md # Source: https://infisical.com/docs/api-reference/endpoints/kms/keys/delete.md # Source: https://infisical.com/docs/api-reference/endpoints/identity-specific-privilege/v2/delete.md # Source: https://infisical.com/docs/api-reference/endpoints/identity-specific-privilege/v1/delete.md # Source: https://infisical.com/docs/api-reference/endpoints/identities/delete.md # Source: https://infisical.com/docs/api-reference/endpoints/groups/delete.md # Source: https://infisical.com/docs/api-reference/endpoints/folders/delete.md # Source: https://infisical.com/docs/api-reference/endpoints/environments/delete.md # Source: https://infisical.com/docs/api-reference/endpoints/dynamic-secrets/delete.md # Source: https://infisical.com/docs/api-reference/endpoints/deprecated/secrets/delete.md # Source: https://infisical.com/docs/api-reference/endpoints/deprecated/secret-tags/delete.md # Source: https://infisical.com/docs/api-reference/endpoints/deprecated/secret-imports/delete.md # Source: https://infisical.com/docs/api-reference/endpoints/deprecated/project-roles/delete.md # Source: https://infisical.com/docs/api-reference/endpoints/deprecated/project-groups/delete.md # Source: https://infisical.com/docs/api-reference/endpoints/deprecated/folders/delete.md # Source: https://infisical.com/docs/api-reference/endpoints/deprecated/environments/delete.md # Source: https://infisical.com/docs/api-reference/endpoints/certificates/delete.md # Source: https://infisical.com/docs/api-reference/endpoints/certificate-profiles/delete.md # Source: https://infisical.com/docs/api-reference/endpoints/certificate-policies/delete.md # Source: https://infisical.com/docs/api-reference/endpoints/certificate-authorities/internal/delete.md # Source: https://infisical.com/docs/api-reference/endpoints/certificate-authorities/acme/delete.md # Source: https://infisical.com/docs/api-reference/endpoints/app-connections/zabbix/delete.md # Source: https://infisical.com/docs/api-reference/endpoints/app-connections/windmill/delete.md # Source: https://infisical.com/docs/api-reference/endpoints/app-connections/vercel/delete.md # Source: https://infisical.com/docs/api-reference/endpoints/app-connections/terraform-cloud/delete.md # Source: https://infisical.com/docs/api-reference/endpoints/app-connections/teamcity/delete.md # Source: https://infisical.com/docs/api-reference/endpoints/app-connections/supabase/delete.md # Source: https://infisical.com/docs/api-reference/endpoints/app-connections/ssh/delete.md # Source: https://infisical.com/docs/api-reference/endpoints/app-connections/smb/delete.md # Source: https://infisical.com/docs/api-reference/endpoints/app-connections/render/delete.md # Source: https://infisical.com/docs/api-reference/endpoints/app-connections/redis/delete.md # Source: https://infisical.com/docs/api-reference/endpoints/app-connections/railway/delete.md # Source: https://infisical.com/docs/api-reference/endpoints/app-connections/postgres/delete.md # Source: https://infisical.com/docs/api-reference/endpoints/app-connections/oracledb/delete.md # Source: https://infisical.com/docs/api-reference/endpoints/app-connections/openrouter/delete.md # Source: https://infisical.com/docs/api-reference/endpoints/app-connections/okta/delete.md # Source: https://infisical.com/docs/api-reference/endpoints/app-connections/octopus-deploy/delete.md # Source: https://infisical.com/docs/api-reference/endpoints/app-connections/oci/delete.md # Source: https://infisical.com/docs/api-reference/endpoints/app-connections/northflank/delete.md # Source: https://infisical.com/docs/api-reference/endpoints/app-connections/netlify/delete.md # Source: https://infisical.com/docs/api-reference/endpoints/app-connections/mysql/delete.md # Source: https://infisical.com/docs/api-reference/endpoints/app-connections/mssql/delete.md # Source: https://infisical.com/docs/api-reference/endpoints/app-connections/mongodb/delete.md # Source: https://infisical.com/docs/api-reference/endpoints/app-connections/ldap/delete.md # Source: https://infisical.com/docs/api-reference/endpoints/app-connections/laravel-forge/delete.md # Source: https://infisical.com/docs/api-reference/endpoints/app-connections/humanitec/delete.md # Source: https://infisical.com/docs/api-reference/endpoints/app-connections/heroku/delete.md # Source: https://infisical.com/docs/api-reference/endpoints/app-connections/hashicorp-vault/delete.md # Source: https://infisical.com/docs/api-reference/endpoints/app-connections/gitlab/delete.md # Source: https://infisical.com/docs/api-reference/endpoints/app-connections/github/delete.md # Source: https://infisical.com/docs/api-reference/endpoints/app-connections/github-radar/delete.md # Source: https://infisical.com/docs/api-reference/endpoints/app-connections/gcp/delete.md # Source: https://infisical.com/docs/api-reference/endpoints/app-connections/flyio/delete.md # Source: https://infisical.com/docs/api-reference/endpoints/app-connections/digital-ocean/delete.md # Source: https://infisical.com/docs/api-reference/endpoints/app-connections/databricks/delete.md # Source: https://infisical.com/docs/api-reference/endpoints/app-connections/cloudflare/delete.md # Source: https://infisical.com/docs/api-reference/endpoints/app-connections/circleci/delete.md # Source: https://infisical.com/docs/api-reference/endpoints/app-connections/chef/delete.md # Source: https://infisical.com/docs/api-reference/endpoints/app-connections/checkly/delete.md # Source: https://infisical.com/docs/api-reference/endpoints/app-connections/camunda/delete.md # Source: https://infisical.com/docs/api-reference/endpoints/app-connections/bitbucket/delete.md # Source: https://infisical.com/docs/api-reference/endpoints/app-connections/azure-key-vault/delete.md # Source: https://infisical.com/docs/api-reference/endpoints/app-connections/azure-devops/delete.md # Source: https://infisical.com/docs/api-reference/endpoints/app-connections/azure-client-secret/delete.md # Source: https://infisical.com/docs/api-reference/endpoints/app-connections/azure-app-configuration/delete.md # Source: https://infisical.com/docs/api-reference/endpoints/app-connections/azure-adcs/delete.md # Source: https://infisical.com/docs/api-reference/endpoints/app-connections/aws/delete.md # Source: https://infisical.com/docs/api-reference/endpoints/app-connections/auth0/delete.md # Source: https://infisical.com/docs/api-reference/endpoints/app-connections/1password/delete.md > ## Documentation Index > Fetch the complete documentation index at: https://infisical.com/docs/llms.txt > Use this file to discover all available pages before exploring further. # Delete > Delete the specified 1Password Connection. ## OpenAPI ````yaml DELETE /api/v1/app-connections/1password/{connectionId} openapi: 3.0.3 info: title: Infisical API description: List of all available APIs that can be consumed version: 0.0.1 servers: - url: https://us.infisical.com description: Production server (US) - url: https://eu.infisical.com description: Production server (EU) - url: http://localhost:8080 description: Local server security: [] paths: /api/v1/app-connections/1password/{connectionId}: delete: tags: - App Connections description: Delete the specified 1Password Connection. operationId: deleteOnePasswordAppConnection parameters: - schema: type: string format: uuid in: path name: connectionId required: true description: The ID of the 1Password Connection to be deleted. responses: '200': description: Default Response content: application/json: schema: type: object properties: appConnection: anyOf: - type: object properties: id: type: string format: uuid name: type: string description: type: string nullable: true version: type: number default: 1 orgId: type: string format: uuid createdAt: type: string format: date-time updatedAt: type: string format: date-time isPlatformManagedCredentials: type: boolean default: false nullable: true gatewayId: type: string format: uuid nullable: true projectId: type: string nullable: true credentialsHash: type: string project: type: object properties: name: type: string id: type: string type: type: string slug: type: string required: - name - id - type - slug additionalProperties: false nullable: true app: type: string enum: - 1password method: type: string enum: - api-token credentials: type: object properties: instanceUrl: type: string format: uri minLength: 1 description: >- The URL of the 1Password Connect Server instance to authenticate with. required: - instanceUrl additionalProperties: false required: - id - name - orgId - createdAt - updatedAt - app - method - credentials additionalProperties: false title: 1Password (API Token) required: - appConnection additionalProperties: false '400': description: Default Response content: application/json: schema: type: object properties: reqId: type: string statusCode: type: number enum: - 400 message: type: string error: type: string details: {} required: - reqId - statusCode - message - error additionalProperties: false '401': description: Default Response content: application/json: schema: type: object properties: reqId: type: string statusCode: type: number enum: - 401 message: type: string error: type: string required: - reqId - statusCode - message - error additionalProperties: false '403': description: Default Response content: application/json: schema: type: object properties: reqId: type: string statusCode: type: number enum: - 403 message: type: string details: {} error: type: string required: - reqId - statusCode - message - error additionalProperties: false '404': description: Default Response content: application/json: schema: type: object properties: reqId: type: string statusCode: type: number enum: - 404 message: type: string error: type: string required: - reqId - statusCode - message - error additionalProperties: false '422': description: Default Response content: application/json: schema: type: object properties: reqId: type: string statusCode: type: number enum: - 422 message: {} error: type: string required: - reqId - statusCode - error additionalProperties: false '500': description: Default Response content: application/json: schema: type: object properties: reqId: type: string statusCode: type: number enum: - 500 message: type: string error: type: string required: - reqId - statusCode - message - error additionalProperties: false ```` --- # Source: https://infisical.com/docs/documentation/getting-started/concepts/deployment-models.md > ## Documentation Index > Fetch the complete documentation index at: https://infisical.com/docs/llms.txt > Use this file to discover all available pages before exploring further. # Using Infisical: Cloud or Self-Hosted > Choose between Infisical Cloud or a self-managed deployment Infisical can be used in two ways: via [Infisical Cloud](https://app.infisical.com), a managed offering, or through a self-hosted deployment within your own infrastructure. Both options provide the same core platform capabilities. The decision depends on your operational model, trust boundaries, and compliance requirements. While Infisical Cloud comes with built-in security and operational guarantees, a self-hosted deployment gives you full control—but also full responsibility for securing and maintaining the system. ## Infisical Cloud Infisical Cloud is our managed service found at [app.infisical.com](https://app.infisical.com). It includes automated updates, availability guarantees, and secure infrastructure operations. For most teams, Infisical Cloud is the recommended way to get started. It simplifies adoption by removing the need to manage deployment, scaling, or maintenance internally. Use this if: * You prefer not to operate infrastructure or handle upgrades * You require a secure, production-grade hosted service * You want to adopt Infisical with minimal operational overhead

By default, Infisical Cloud is a secure, multi-tenant service. For enterprises with stricter isolation or regulatory needs, dedicated cloud instances are available.

Contact [sales@infisical.com](mailto:sales@infisical.com) to learn more.

## Self-Hosted Infisical Infisical can also be deployed and managed within your own infrastructure. This approach provides full control over platform configuration, data storage, and operational security. In this model, your team is responsible for maintaining uptime, monitoring, patching, and integrations. Use this if: * You require complete control over data, deployment, and security posture * Your compliance model mandates self-managed or on-premise systems * You need to tightly integrate with internal tooling and infrastructure Infisical supports multiple deployment methods, including [Docker](/self-hosting/deployment-options/standalone-infisical), [Docker Compose](/self-hosting/deployment-options/docker-compose), [Kubernetes](/self-hosting/deployment-options/kubernetes-helm), and [Linux package](/self-hosting/deployment-options/native/linux-package/installation). To learn more, refer to the [self-hosting documentation](/self-hosting/overview).

The open-source core is available under the MIT license. Additional enterprise features and support are available with a commercial license.

Contact [sales@infisical.com](mailto:sales@infisical.com) to learn more.

--- # Source: https://infisical.com/docs/api-reference/endpoints/deprecated/secrets/detach-tags.md > ## Documentation Index > Fetch the complete documentation index at: https://infisical.com/docs/llms.txt > Use this file to discover all available pages before exploring further. # Detach tags > Detach tags from a secret ## OpenAPI ````yaml DELETE /api/v3/secrets/tags/{secretName} openapi: 3.0.3 info: title: Infisical API description: List of all available APIs that can be consumed version: 0.0.1 servers: - url: https://us.infisical.com description: Production server (US) - url: https://eu.infisical.com description: Production server (EU) - url: http://localhost:8080 description: Local server security: [] paths: /api/v3/secrets/tags/{secretName}: delete: tags: - Secrets description: Detach tags from a secret parameters: - schema: type: string in: path name: secretName required: true description: The name of the secret to detach tags from. requestBody: content: application/json: schema: type: object properties: projectSlug: type: string description: The slug of the project where the secret is located. environment: type: string description: The slug of the environment where the secret is located. secretPath: type: string default: / description: The path of the secret to detach tags from. type: type: string enum: - shared - personal default: shared description: The type of the secret to attach tags to. (shared/personal) tagSlugs: type: array items: type: string minItems: 1 description: An array of existing tag slugs to detach from the secret. required: - projectSlug - environment - tagSlugs additionalProperties: false required: true responses: '200': description: Default Response content: application/json: schema: type: object properties: secret: type: object properties: id: type: string format: uuid version: type: number default: 1 type: type: string default: shared secretKeyCiphertext: type: string secretKeyIV: type: string secretKeyTag: type: string secretValueCiphertext: type: string secretValueIV: type: string secretValueTag: type: string secretCommentCiphertext: type: string nullable: true secretCommentIV: type: string nullable: true secretCommentTag: type: string nullable: true secretReminderNote: type: string nullable: true secretReminderRepeatDays: type: number nullable: true skipMultilineEncoding: type: boolean default: false nullable: true algorithm: type: string default: aes-256-gcm keyEncoding: type: string default: utf8 metadata: nullable: true userId: type: string format: uuid nullable: true folderId: type: string format: uuid createdAt: type: string format: date-time updatedAt: type: string format: date-time tags: type: array items: type: object properties: id: type: string format: uuid slug: type: string color: type: string nullable: true name: type: string required: - id - slug - name additionalProperties: false required: - id - secretKeyCiphertext - secretKeyIV - secretKeyTag - secretValueCiphertext - secretValueIV - secretValueTag - folderId - createdAt - updatedAt - tags additionalProperties: false required: - secret additionalProperties: false '400': description: Default Response content: application/json: schema: type: object properties: reqId: type: string statusCode: type: number enum: - 400 message: type: string error: type: string details: {} required: - reqId - statusCode - message - error additionalProperties: false '401': description: Default Response content: application/json: schema: type: object properties: reqId: type: string statusCode: type: number enum: - 401 message: type: string error: type: string required: - reqId - statusCode - message - error additionalProperties: false '403': description: Default Response content: application/json: schema: type: object properties: reqId: type: string statusCode: type: number enum: - 403 message: type: string details: {} error: type: string required: - reqId - statusCode - message - error additionalProperties: false '404': description: Default Response content: application/json: schema: type: object properties: reqId: type: string statusCode: type: number enum: - 404 message: type: string error: type: string required: - reqId - statusCode - message - error additionalProperties: false '422': description: Default Response content: application/json: schema: type: object properties: reqId: type: string statusCode: type: number enum: - 422 message: {} error: type: string required: - reqId - statusCode - error additionalProperties: false '500': description: Default Response content: application/json: schema: type: object properties: reqId: type: string statusCode: type: number enum: - 500 message: type: string error: type: string required: - reqId - statusCode - message - error additionalProperties: false security: - bearerAuth: [] components: securitySchemes: bearerAuth: type: http scheme: bearer bearerFormat: JWT description: An access token in Infisical ```` --- # Source: https://infisical.com/docs/contributing/platform/developing.md > ## Documentation Index > Fetch the complete documentation index at: https://infisical.com/docs/llms.txt > Use this file to discover all available pages before exploring further. # Local development > This guide will help you set up and run the Infisical platform in local development. ## Fork and clone the repo [Fork](https://docs.github.com/en/get-started/quickstart/fork-a-repo) the [repository](https://github.com/Infisical/infisical) to your own GitHub account and then [clone](https://docs.github.com/en/repositories/creating-and-managing-repositories/cloning-a-repository) it to your local device. Once, you've done that, create a new branch: ```console theme={"dark"} git checkout -b MY_BRANCH_NAME ``` ## Set up environment variables Start by creating a `.env` file at the root of the Infisical directory then copy the contents of the file linked [here](https://github.com/Infisical/infisical/blob/main/.env.dev.example). View all available [environment variables](https://infisical.com/docs/self-hosting/configuration/envars) and guidance for each. ## Starting Infisical for development We use Docker to spin up all required services for Infisical in local development. If you are unfamiliar with Docker, don’t worry, all you have to do is install Docker for your machine and run the command below to start up the development server. #### Start local server ```bash theme={"dark"} docker compose -f docker-compose.dev.yml up --build --force-recreate ``` #### Access local server Once all the services have spun up, browse to [http://localhost:8080](http://localhost:8080). #### Shutdown local server ```bash theme={"dark"} # To stop environment use Control+C (on Mac) CTRL+C (on Win) or docker compose -f docker-compose.dev.yml down ``` ## Starting Infisical docs locally We use [Mintlify](https://mintlify.com/) for our docs. #### Install Mint CLI. ```bash theme={"dark"} npm i -g mint ``` or ```bash theme={"dark"} yarn global add mint ``` #### Running the docs Go to `docs` directory and run `mint dev`. This will start up the docs on `localhost:3000` ```bash theme={"dark"} # From the root directory cd docs; mint dev; ``` --- # Source: https://infisical.com/docs/documentation/platform/pki/ca/digicert.md > ## Documentation Index > Fetch the complete documentation index at: https://infisical.com/docs/llms.txt > Use this file to discover all available pages before exploring further. # DigiCert > Learn how to connect Infisical to DigiCert to issue certificates. ## Concept Infisical can connect to [DigiCert](https://www.digicert.com/) using the [ACME-compatible CA integration](/documentation/platform/pki/ca/acme-ca) to issue certificates back to your end-entities. ## Guide to Connecting Infisical to DigiCert CA To connect Infisical to DigiCert, follow the steps in the [ACME-compatible CA integration](/documentation/platform/pki/ca/acme-ca) guide but use the DigiCert **ACME Directory URL**: `https://acme.digicert.com/v2/acme/directory`. DigiCert requires **External Account Binding (EAB)** for all ACME registrations. You will need to obtain both a Key Identifier (KID) and an HMAC Key from your DigiCert account before registering the ACME CA in Infisical. DigiCert typically issues certificates with a 90-day validity period. --- # Source: https://infisical.com/docs/integrations/secret-syncs/digital-ocean-app-platform.md > ## Documentation Index > Fetch the complete documentation index at: https://infisical.com/docs/llms.txt > Use this file to discover all available pages before exploring further. # DigitalOcean App Platform Sync > Learn how to configure a DigitalOcean App Platform Sync for Infisical. **Prerequisites:** * Create a [DigitalOcean Connection](/integrations/app-connections/digital-ocean) Navigate to **Project** > **Integrations** and select the **Secret Syncs** tab. Click on the **Add Sync** button. Secret Syncs Tab Select DigitalOcean Configure the **Source** from where secrets should be retrieved, then click **Next**. Configure Source * **Environment**: The project environment to retrieve secrets from. * **Secret Path**: The folder path to retrieve secrets from. If you need to sync secrets from multiple folder locations, check out [secret imports](/documentation/platform/secret-reference#secret-imports). Configure the **Destination** to where secrets should be deployed, then click **Next**. Configure Destination * **DigitalOcean Connection**: The DigitalOcean Connection to authenticate with. * **App**: The App Platform app to sync secrets to. Configure the **Sync Options** to specify how secrets should be synced, then click **Next**. Configure Options * **Initial Sync Behavior**: Determines how Infisical should resolve the initial sync. * **Overwrite Destination Secrets**: Removes any secrets at the destination endpoint not present in Infisical. Digital Ocean App Platform does not support importing secrets. * **Key Schema**: Template that determines how secret names are transformed when syncing, using `{{secretKey}}` as a placeholder for the original secret name and `{{environment}}` for the environment. We highly recommend using a Key Schema to ensure that Infisical only manages the specific keys you intend, keeping everything else untouched. * **Auto-Sync Enabled**: If enabled, secrets will automatically be synced from the source location when changes occur. Disable to enforce manual syncing only. * **Disable Secret Deletion**: If enabled, Infisical will not remove secrets from the sync destination. Enable this option if you intend to manage some secrets manually outside of Infisical. Configure the **Details** of your DigitalOcean Sync, then click **Next**. Configure Details * **Name**: The name of your sync. Must be slug-friendly. * **Description**: An optional description for your sync. Review your DigitalOcean Sync configuration, then click **Create Sync**. Review Configuration If enabled, your DigitalOcean Sync will begin syncing your secrets to the destination endpoint. Sync Created To create a **DigitalOcean App Platform Sync**, make an API request to the [Create DigitalOcean Sync](/api-reference/endpoints/secret-syncs/digital-ocean-app-platform/create) API endpoint. ### Sample request ```bash Request theme={"dark"} curl --request POST \ --url https://app.infisical.com/api/v1/secret-syncs/digital-ocean-app-platform \ --header 'Content-Type: application/json' \ --data '{ "name": "my-digitalocean-sync", "projectId": "3c90c3cc-0d44-4b50-8888-8dd25736052a", "description": "sync to do app", "connectionId": "3c90c3cc-0d44-4b50-8888-8dd25736052a", "environment": "dev", "secretPath": "/app-secrets", "isEnabled": true, "syncOptions": { "initialSyncBehavior": "overwrite-destination", "autoSyncEnabled": true, "disableSecretDeletion": false }, "destinationConfig": { "appId": "3c90c3cc-0d44-4b50-8888-8dd25736052a", "appName": "do-todo-app" } }' ``` ### Sample response ```bash Response theme={"dark"} { "secretSync": { "id": "3c90c3cc-0d44-4b50-8888-8dd25736052a", "name": "my-digitalocean-sync", "description": "sync to do app", "isEnabled": true, "version": 1, "folderId": "3c90c3cc-0d44-4b50-8888-8dd25736052a", "connectionId": "3c90c3cc-0d44-4b50-8888-8dd25736052a", "createdAt": "2025-07-19T12:00:00Z", "updatedAt": "2025-07-19T12:00:00Z", "syncStatus": "succeeded", "lastSyncJobId": "job-5678", "lastSyncMessage": null, "lastSyncedAt": "2025-07-19T12:00:00Z", "syncOptions": { "initialSyncBehavior": "overwrite-destination", "autoSyncEnabled": true, "disableSecretDeletion": false }, "projectId": "3c90c3cc-0d44-4b50-8888-8dd25736052a", "connection": { "app": "digital-ocean", "name": "my-digitalocean-connection", "id": "3c90c3cc-0d44-4b50-8888-8dd25736052a" }, "environment": { "slug": "dev", "name": "Development", "id": "3c90c3cc-0d44-4b50-8888-8dd25736052a" }, "folder": { "id": "3c90c3cc-0d44-4b50-8888-8dd25736052a", "path": "/app-secrets" }, "destination": "digital-ocean", "destinationConfig": { "appId": "3c90c3cc-0d44-4b50-8888-8dd25736052a", "appName": "do-todo-app" } } } ``` --- # Source: https://infisical.com/docs/integrations/app-connections/digital-ocean.md > ## Documentation Index > Fetch the complete documentation index at: https://infisical.com/docs/llms.txt > Use this file to discover all available pages before exploring further. # DigitalOcean Connection > Learn how to configure a DigitalOcean Connection for Infisical. Infisical supports the use of [API Tokens](https://cloud.digitalocean.com/account/api/tokens) to connect with DigitalOcean. ## Create a DigitalOcean API Token DigitalOcean Dashboard API Section Give your token a descriptive name and ensure custom scopes is selected. Token Form ``` read:account read:actions read:regions read:sizes read:app/projects update:app ``` Token Form Token Form Make sure to copy the token now—you won't be able to see it again. Token Generated ## Create a DigitalOcean Connection in Infisical In your Infisical dashboard, navigate to the **Integrations** tab in the desired project, then select **App Connections**. App Connections Tab Click **+ Add Connection** and choose **DigitalOcean Connection** from the list of integrations. Select DigitalOcean Connection Complete the form by providing: * A descriptive name for the connection * An optional description * The API Token from the previous step DigitalOcean Connection Modal After submitting the form, your **DigitalOcean Connection** will be successfully created and ready to use with your Infisical project. DigitalOcean Connection Created To create a DigitalOcean Connection via API, send a request to the [Create DigitalOcean Connection](/api-reference/endpoints/app-connections/digital-ocean/create) endpoint. ### Sample request ```bash Request theme={"dark"} curl --request POST \ --url https://app.infisical.com/api/v1/app-connections/digital-ocean \ --header 'Content-Type: application/json' \ --data '{ "name": "my-digitalocean-connection", "method": "api-token", "projectId": "7ffbb072-2575-495a-b5b0-127f88caef78", "credentials": { "apiToken": "[API TOKEN]" } }' ``` ### Sample response ```bash Response theme={"dark"} { "appConnection": { "id": "a1b2c3d4-5678-90ab-cdef-1234567890ab", "name": "my-digitalocean-connection", "projectId": "7ffbb072-2575-495a-b5b0-127f88caef78", "description": null, "version": 1, "orgId": "abcdef12-3456-7890-abcd-ef1234567890", "createdAt": "2025-07-19T10:15:00.000Z", "updatedAt": "2025-07-19T10:15:00.000Z", "isPlatformManagedCredentials": false, "credentialsHash": "d41d8cd98f00b204e9800998ecf8427e", "app": "digital-ocean", "method": "api-token", "credentials": {} } } ``` --- # Source: https://infisical.com/docs/integrations/frameworks/django.md > ## Documentation Index > Fetch the complete documentation index at: https://infisical.com/docs/llms.txt > Use this file to discover all available pages before exploring further. # Django > How to use Infisical to inject environment variables and secrets into a Django app. Prerequisites: * Set up and add envars to [Infisical Cloud](https://app.infisical.com) * [Install the CLI](/cli/overview) ## Initialize Infisical for your [Django](https://www.djangoproject.com) project ```bash theme={"dark"} # navigate to the root of your of your project cd /path/to/project # then initialize Infisical infisical init ``` ## Start your application as usual but with Infisical ```bash theme={"dark"} infisical run -- # Example infisical run -- python manage.py runserver ``` --- # Source: https://infisical.com/docs/integrations/app-connections/dns-made-easy.md > ## Documentation Index > Fetch the complete documentation index at: https://infisical.com/docs/llms.txt > Use this file to discover all available pages before exploring further. # DNS Made Easy > Learn how to configure a DNS Made Easy Connection for Infisical. Infisical supports connecting to DNS Made Easy using API key and secret key for secure access to your DNS Made Easy service. ## Configure API key and secret Key for Infisical Navigate to your DNS Made Easy dashboard and go to **Account Information** under the **Config** top menu. Navigate to Account Information If your **API Key** and **Secret Key** are already available, proceed to step 2. Otherwise, check the **Generate New API Credentials** then click the **Save** button to generate the new API credentials. Generate API Credentials After creation, copy your API key and secret key. Generated API Token Keep your API key and secret key secure and do not share it. Anyone with access to this token can manage your DNS Made Easy resources. ## Setup DNS Made Easy Connection in Infisical Navigate to the **Integrations** tab in the desired project, then select **App Connections**. App
    Connections Tab Select the **DNS Made Easy Connection** option from the connection options modal. Select DNS Made Easy
    Connection Enter your DNS Made Easy API key and secret key in the provided fields and click **Connect to DNS Made Easy** to establish the connection. Connect to
    DNS Made
    Easy Your **DNS Made Easy Connection** is now available for use in your Infisical projects. DNS Made Easy Connection
    Created --- # Source: https://infisical.com/docs/self-hosting/deployment-options/docker-compose.md # Source: https://infisical.com/docs/integrations/platforms/docker-compose.md > ## Documentation Index > Fetch the complete documentation index at: https://infisical.com/docs/llms.txt > Use this file to discover all available pages before exploring further. # Docker Compose > Find out how to use Infisical to inject environment variables into services defined in your Docker Compose file. Prerequisites: * Set up and add envars to [Infisical Cloud](https://app.infisical.com) ## Configure the Infisical CLI for each service Follow this [guide](./docker) to configure the Infisical CLI for each service that you wish to inject environment variables into; you'll have to update the Dockerfile of each service. ### Generate and configure machine identity Generate a machine identity for each service you want to inject secrets into. You can do this by following the steps in the [Machine Identity](/documentation/platform/identities/machine-identities) guide. ### Set the machine identity client ID and client secret as environment variables For each service you want to inject secrets into, generate the required `INFISICAL_TOKEN_SERVICE_A` and `INFISICAL_TOKEN_SERVICE_B`. ```yaml theme={"dark"} # Example Docker Compose file services: web: build: . image: example-service-1 environment: - INFISICAL_TOKEN=${INFISICAL_TOKEN_SERVICE_A} api: build: . image: example-service-2 environment: - INFISICAL_TOKEN=${INFISICAL_TOKEN_SERVICE_B} ``` ### Export shell variables Next, set the shell variables you defined in your compose file. This can be done manually or via your CI/CD environment. Once done, it will be used to populate the corresponding `INFISICAL_TOKEN_SERVICE_A` and `INFISICAL_TOKEN_SERVICE_B` in your Docker Compose file. ```bash theme={"dark"} #Example # Token refers to the token we generated in step 2 for this service export INFISICAL_TOKEN_SERVICE_A=$(infisical login --method=universal-auth --client-id= --client-secret= --silent --plain) export INFISICAL_TOKEN_SERVICE_B=$(infisical login --method=universal-auth --client-id= --client-secret= --silent --plain) # Then run your compose file in the same terminal. docker-compose ... ``` ## Generate service token Generate a unique [Service Token](/documentation/platform/token) for each service. ## Feed service token to your Docker Compose file For each service you want to inject secrets into, set an environment variable called `INFISICAL_TOKEN` equal to a unique identifier variable. In the example below, we set `INFISICAL_TOKEN_FOR_WEB` and `INFISICAL_TOKEN_FOR_API` as the `INFISICAL_TOKEN` for the services. ```yaml theme={"dark"} # Example Docker Compose file services: web: build: . image: example-service-1 environment: - INFISICAL_TOKEN=${INFISICAL_TOKEN_FOR_WEB} api: build: . image: example-service-2 environment: - INFISICAL_TOKEN=${INFISICAL_TOKEN_FOR_API} ``` ## Export shell variables Next, set the shell variables you defined in your compose file. This can be done manually or via your CI/CD environment. Once done, it will be used to populate the corresponding `INFISICAL_TOKEN` in your Docker Compose file. ```bash theme={"dark"} #Example # Token refers to the token we generated in step 2 for this service export INFISICAL_TOKEN_FOR_WEB= # Token refers to the token we generated in step 2 for this service export INFISICAL_TOKEN_FOR_API= # Then run your compose file in the same terminal. docker-compose ... ``` --- # Source: https://infisical.com/docs/integrations/platforms/docker-intro.md > ## Documentation Index > Fetch the complete documentation index at: https://infisical.com/docs/llms.txt > Use this file to discover all available pages before exploring further. # Docker > Learn how to feed secrets from Infisical into your Docker application. There are many methods to inject Infisical secrets into Docker-based applications. Regardless of the method you choose, they all inject secrets from Infisical as environment variables into your Docker container. Install and run your app start command with Infisical CLI Feed secrets with the `--env-file` flag when using the `docker run` command Inject secrets into multiple services using Docker Compose The main difference between the "Docker Entrypoint" and "Docker run" approach is where the Infisical CLI is installed. In most production settings, it's typically less convenient to have the Infisical CLI installed and executed externally, so we suggest using the "Docker Entrypoint" method for production purposes. However, if this limitation doesn't apply to you, select the method that best fits your needs. --- # Source: https://infisical.com/docs/integrations/platforms/docker-pass-envs.md > ## Documentation Index > Fetch the complete documentation index at: https://infisical.com/docs/llms.txt > Use this file to discover all available pages before exploring further. # Docker Run > Learn how to pass secrets to your docker container at run time. This method allows you to feed secrets from Infisical into your container using the `--env-file` flag of `docker run` command. Rather than giving the flag a file path to your env file, you'll use the Infisical CLI to create a virtual file path. For this method to function as expected, you must have a bash shell (for processing substitution) and the [Infisical CLI](../../cli/overview) installed in the environment where you will be running the `docker run` command. ## 1. Authentication If you are already logged in via the CLI you can skip this step. Otherwise, head to your organization settings in Infisical Cloud to create a [Machine Identity](../../documentation/platform/identities/machine-identities). The machine identity will allow you to authenticate and fetch secrets from Infisical. Once you have created a machine identity with the required permissions, you'll need to feed the token to the CLI. Please note that we highly recommend using `infisical login` for local development. #### Pass as flag You may use the --token flag to set the token ```bash theme={"dark"} infisical export --token=<> ``` #### Pass via shell environment variable The CLI is configured to look for an environment variable named `INFISICAL_TOKEN`. If set, it'll attempt to use it for authentication. ```bash theme={"dark"} export INFISICAL_TOKEN=<> ``` You can use the `infisical login --method=universal-auth` command to directly obtain a universal auth access token and set it as an environment variable. ```bash theme={"dark"} export INFISICAL_TOKEN=$(infisical login --method=universal-auth --client-id= --client-secret= --silent --plain) ``` In production scenarios, please to avoid using the `infisical login` command and instead use a [machine identity](../../documentation/platform/identities/machine-identities). ## 2. Run your docker command with Infisical Next, use the --env-file flag of the `docker run` command with Infisical CLI to point to your secrets. Under the hood, this command will fetch secrets from Infisical and serve them as a file to the `--env-file` flag. ```bash theme={"dark"} # In this example, executing a docker run command will initiate an empty Alpine container and display the environment variables passed to it by Infisical. docker run --rm --env-file <(infisical export --format=dotenv) alpine printenv ``` To view all options of the `export` command, click [here](../../cli/commands/export) When using the --env-file option, Docker does not have the capability to support secrets that span multiple lines. --- # Source: https://infisical.com/docs/integrations/platforms/docker-swarm-with-agent.md > ## Documentation Index > Fetch the complete documentation index at: https://infisical.com/docs/llms.txt > Use this file to discover all available pages before exploring further. # Docker Swarm > Learn how to manage secrets in Docker Swarm services. In this guide, we'll demonstrate how to use Infisical for managing secrets within Docker Swarm. Specifically, we'll set up a sidecar container using the [Infisical Agent](/integrations/platforms/infisical-agent), which authenticates with Infisical to retrieve secrets and access tokens. These secrets are then stored in a shared volume accessible by other services in your Docker Swarm. ## Prerequisites * Infisical account * Docker version 20.10.24 or newer * Basic knowledge of Docker Swarm * [Git](https://git-scm.com/book/en/v2/Getting-Started-Installing-Git) installed on your system * Familiarity with the [Infisical Agent](/integrations/platforms/infisical-agent) ## Objective Our goal is to deploy an Nginx instance in your Docker Swarm cluster, configured to display Infisical secrets on its landing page. This will provide hands-on experience in fetching and utilizing secrets from Infisical within Docker Swarm. The principles demonstrated here are also applicable to Docker Compose deployments. Start by cloning the [Infisical guide assets repository](https://github.com/Infisical/infisical-guides.git) from Github. This repository includes necessary assets for this and other Infisical guides. Focus on the `docker-swarm-with-agent` sub-directory, which we'll use as our working directory. To allow the agent to fetch your Infisical secrets, choose an authentication method for the agent. For this guide, we will use [Universal Auth](/documentation/platform/identities/universal-auth) for authentication. Follow the instructions [here](/documentation/platform/identities/universal-auth) to generate a client ID and client secret. Copy the client ID and client secret obtained in the previous step into the `client-id` and `client-secret` text files, respectively. The Infisical Agent will authenticate using Universal Auth and retrieve secrets for rendering as specified in the template(s). Adjust the `polling-interval` to control the frequency of secret updates. In the example template, the secrets are rendered as an HTML page, which will be set as Nginx's home page to demonstrate successful secret retrieval and utilization. Remember to add your project id, environment slug and path of corresponding Infisical project to the secret template. ```yaml infisical-agent-config theme={"dark"} infisical: address: "https://app.infisical.com" auth: type: "universal-auth" config: client-id: "/run/secrets/infisical-universal-auth-client-id" client-secret: "/run/secrets/infisical-universal-auth-client-secret" remove_client_secret_on_read: false sinks: - type: "file" config: path: "/infisical-secrets/access-token" templates: - source-path: /run/secrets/nginx-home-page-template destination-path: /infisical-secrets/index.html config: polling-interval: 60s ``` Some paths contain `/run/secrets/` because the contents of those files reside in a [Docker secret](https://docs.docker.com/engine/swarm/secrets/#how-docker-manages-secrets). ```html nginx-home-page-template theme={"dark"}

This file is rendered by Infisical agent template engine

Here are the secrets that have been fetched from Infisical and stored in your volume mount

    {{- with secret "7df67a5f-d26a-4988-a375-7153c08149da" "dev" "/" }} {{- range . }}
  1. {{ .Key }}={{ .Value }}
  2. {{- end }} {{- end }}
```
Define the `infisical-agent` and `nginx` services in your Docker Compose file. `infisical-agent` will handle secret retrieval and storage. These secrets are stored in a volume, accessible by other services like Nginx. ```yaml docker-compose.yaml theme={"dark"} version: "3.1" services: infisical-agent: container_name: infisical-agnet image: infisical/cli:0.18.0 command: agent --config=/run/secrets/infisical-agent-config volumes: - infisical-agent:/infisical-secrets secrets: - infisical-universal-auth-client-id - infisical-universal-auth-client-secret - infisical-agent-config - nginx-home-page-template networks: - infisical_network nginx: image: nginx:latest ports: - "80:80" volumes: - infisical-agent:/usr/share/nginx/html networks: - infisical_network volumes: infisical-agent: secrets: infisical-universal-auth-client-id: file: ./client-id infisical-universal-auth-client-secret: file: ./client-secret infisical-agent-config: file: ./infisical-agent-config nginx-home-page-template: file: ./nginx-home-page-template networks: infisical_network: ``` ``` docker swarm init ``` ``` docker stack deploy -c docker-compose.yaml agent-demo ``` To confirm that secrets are properly rendered and accessible, navigate to `http://localhost`. You should see the Infisical secrets displayed on the Nginx landing page. Nginx displaying Infisical secrets ``` docker stack rm agent-demo ```
## Considerations * Secret Updates: Applications that access secrets directly from the volume mount will receive updates in real-time, in accordance with the `polling-interval` set in agent config. * In-Memory Secrets: If your application loads secrets into memory, the new secrets will be available to the application on the next deployment. --- # Source: https://infisical.com/docs/self-hosting/deployment-options/docker-swarm.md > ## Documentation Index > Fetch the complete documentation index at: https://infisical.com/docs/llms.txt > Use this file to discover all available pages before exploring further. # Docker Swarm > How to self-host Infisical with Docker Swarm (HA). # Self-Hosting Infisical with Docker Swarm This guide will provide step-by-step instructions on how to self-host Infisical using Docker Swarm. This is particularly helpful for those wanting to self-host Infisical on premise while still maintaining high availability (HA) for the core Infisical components. The guide will demonstrate a setup with three nodes, ensuring that the cluster can tolerate the failure of one node while remaining fully operational. ## Docker Swarm [Docker Swarm](https://docs.docker.com/engine/swarm/) is a native clustering and orchestration solution for Docker containers. It simplifies the deployment and management of containerized applications across multiple nodes, making it a great choice for self-hosting Infisical. Unlike Kubernetes, which requires a deep understanding of the Kubernetes ecosystem, if you're accustomed to Docker and Docker Compose, you're already familiar with most of Docker Swarm. For this reason, we suggest teams use Docker Swarm to deploy Infisical in a highly available and fault tolerant manner. ## Prerequisites * Understanding of Docker Swarm * Bare/Virtual Machines with Docker installed on each VM. * Docker Swarm initialized on the VMs. ## Core Components for High Availability The provided Docker stack includes the following core components to achieve high availability: 1. **Spilo**: [Spilo](https://github.com/zalando/spilo) is used to run PostgreSQL with [Patroni](https://github.com/zalando/patroni) for HA and automatic failover. It utilizes etcd for leader election of the PostgreSQL instances. 2. **Redis**: Redis is used for caching and is set up with Redis Sentinel for HA. The stack includes three Redis replicas and three Redis Sentinel instances for monitoring and failover. 3. **Infisical**: Infisical is stateless, allowing for easy scaling and replication across multiple nodes. 4. **HAProxy**: HAProxy is used as a load balancer to distribute traffic to the PostgreSQL and Redis instances. It is configured to perform health checks and route requests to the appropriate backend services. ## Node Failure Tolerance To ensure Infisical is highly available and fault tolerant, it's important to choose the number of nodes in the cluster. The following table shows the relationship between the number of nodes and the maximum number of nodes that can be down while the cluster continues to function: | Total Nodes | Max Nodes Down | Min Nodes Required | | ----------- | -------------- | ------------------ | | 1 | 0 | 1 | | 2 | 0 | 2 | | 3 | 1 | 2 | | 4 | 1 | 3 | | 5 | 2 | 3 | | 6 | 2 | 4 | | 7 | 3 | 4 | The formula for calculating the minimum number of nodes required is: `floor(n/2) + 1`, where `n` is the total number of nodes. This guide will demonstrate a setup with three nodes, which allows for one node to be down while the cluster remains operational. This fault tolerance applies to the following components: * Redis Sentinel: With three Sentinel instances, one instance can be down, and the remaining two can still form a quorum to make decisions. * Redis: With three Redis instances (one master and two replicas), one instance can be down, and the remaining two can continue to provide caching services. * PostgreSQL: With three PostgreSQL instances managed by Patroni and etcd, one instance can be down, and the remaining two can maintain data consistency and availability. * Manager Nodes: In a Docker Swarm cluster with three manager nodes, one manager node can be down, and the remaining two can continue to manage the cluster. For the sake of simplicity, the example in this guide only contains one manager node. It's important to note that while the cluster can tolerate the failure of one node in a three-node setup, it's recommended to have a minimum of three nodes to ensure high availability. With two nodes, the failure of a single node can result in a loss of quorum and potential downtime. ## Docker Deployment Stack Overview The [Docker stack file](https://github.com/Infisical/infisical/tree/main/docker-swarm) used in this guide defines the services and their configurations for deploying Infisical in a highly available manner. The main components of this stack are as follows. 1. **HAProxy**: The HAProxy service is configured to expose ports for accessing PostgreSQL (5433 for the master, 5434 for replicas), Redis master (6379), and the Infisical backend (8080). It uses a config file (`haproxy.cfg`) to define the load balancing and health check rules. 2. **Infisical**: The Infisical backend service is deployed with the latest PostgreSQL-compatible image. It is connected to the `infisical` network and uses secrets for environment variables. 3. **etcd**: Three etcd instances (etcd1, etcd2, etcd3) are deployed, one on each node, to provide distributed key-value storage for leader election and configuration management. 4. **Spilo**: Three Spilo instances (spolo1, spolo2, spolo3) are deployed, one on each node, to run PostgreSQL with Patroni for high availability. They are connected to the `infisical` network and use persistent volumes for data storage. 5. **Redis**: Three Redis instances (redis\_replica0, redis\_replica1, redis\_replica2) are deployed, one on each node, with redis\_replica0 acting as the master. They are connected to the `infisical` network. 6. **Redis Sentinel**: Three Redis Sentinel instances (redis\_sentinel1, redis\_sentinel2, redis\_sentinel3) are deployed, one on each node, to monitor and manage the Redis instances. They are connected to the `infisical` network. ## Deployment instructions Run the following on each node to install the Docker engine. ``` curl -fsSL https://get.docker.com -o get-docker.sh && sh get-docker.sh ``` ``` docker swarm init ``` Replace `` with the IP address of the VM that will serve as the manager node. Remember to copy the join token returned by the this init command. For the sake of simplicity, we only use one manager node in this example deployment. However, in production settings, we recommended you have at least 3 manager nodes. ``` docker swarm join --token :2377 ``` Replace `` with the token provided by the manager node during initialization. Labels on nodes will help us select where stateful components such as Postgres and Redis are deployed on. To label nodes, follow the steps below. ``` docker node update --label-add name=node1 docker node update --label-add name=node2 docker node update --label-add name=node3 ``` Replace ``, ``, and `` with the respective node IDs. To view the list of nodes and their ids, run the following on the manager node `docker node ls`. Copy the Docker stack YAML file, HAProxy configuration file and example `.env` file to the manager node. Ensure that all 3 files are placed in the same file directory. * [Docker stack file](https://github.com/Infisical/infisical/blob/main/docker-swarm/stack.yaml) (rename to infisical-stack.yaml) * [HA configuration file](https://github.com/Infisical/infisical/blob/main/docker-swarm/haproxy.cfg) (rename to haproxy.cfg) * [Example .env file](https://github.com/Infisical/infisical/blob/main/docker-swarm/.env-example) (rename to .env) ``` docker stack deploy -c infisical-stack.yaml infisical ``` ```plain theme={"dark"} $ docker service ls ID NAME MODE REPLICAS IMAGE PORTS 4kzq3ub8qgn9 infisical_etcd1 replicated 1/1 ghcr.io/zalando/spilo-16:3.2-p2 tqx9t82bn8d9 infisical_etcd2 replicated 1/1 ghcr.io/zalando/spilo-16:3.2-p2 t8vbkrasy8fz infisical_etcd3 replicated 1/1 ghcr.io/zalando/spilo-16:3.2-p2 77iei42fcf6q infisical_haproxy global 4/4 haproxy:latest *:5002-5003->5433-5434/tcp, *:6379->6379/tcp, *:7001->7000/tcp, *:8080->8080/tcp jaewzqy8md56 infisical_infisical replicated 5/5 infisical/infisical:v0.60.1-postgres 58w4zablfbtb infisical_redis_replica0 replicated 1/1 bitnami/redis:6.2.10 w4yag2whq0un infisical_redis_replica1 replicated 1/1 bitnami/redis:6.2.10 w03mriy0jave infisical_redis_replica2 replicated 1/1 bitnami/redis:6.2.10 ppo6rk47hc9t infisical_redis_sentinel1 replicated 1/1 bitnami/redis-sentinel:6.2.10 ub29vd0lnq7f infisical_redis_sentinel2 replicated 1/1 bitnami/redis-sentinel:6.2.10 szg3yky7yji2 infisical_redis_sentinel3 replicated 1/1 bitnami/redis-sentinel:6.2.10 eqtocpf5tiy0 infisical_spolo1 replicated 1/1 ghcr.io/zalando/spilo-16:3.2-p2 3lznscvk7k5t infisical_spolo2 replicated 1/1 ghcr.io/zalando/spilo-16:3.2-p2 v04ml7rz2j5q infisical_spolo3 replicated 1/1 ghcr.io/zalando/spilo-16:3.2-p2 ``` HA Proxy stats To view the health of services in your Infisical cluster, visit port `:7001` of any node in your Docker swarm. This port will expose the HA Proxy stats. Run the following command to view the IPs of the nodes in your docker swarm. ```plain theme={"dark"} $ docker node ls ID HOSTNAME STATUS AVAILABILITY MANAGER STATUS ENGINE VERSION 0jnegl4gpo235l66nglcwc07t localhost Ready Active 26.0.2 no1a7zwj88057k73m196ulkq6 * localhost Ready Active Leader 26.0.2 wcb2x27w3tq7ht4v1h7ke49qk localhost Ready Active 26.0.2 zov5q7uop7wpxc2ndz712v9oa localhost Ready Active 26.0.2 ``` The stats page may take 1-2 minutes to become accessible. self-hosting sign up Once all expected services are up and running, visit `:8080` of any node in the swarm. This will take you to the Infisical configuration page. ## FAQ To further scale and make the system more resilient, you can add more nodes to the Docker Swarm and update the stack configuration accordingly: 1. Add new VMs and join them to the Docker Swarm as worker nodes. 2. Update the Docker stack YAML file to include the new nodes in the `deploy` section of the relevant services, specifying the appropriate `node.labels.name` constraints. 3. Update the HAProxy configuration file (`haproxy.cfg`) to include the new nodes in the backend sections for PostgreSQL and Redis. 4. Redeploy the updated stack using the `docker stack deploy` command. Note that the database containers (PostgreSQL) are stateful and cannot be simply replicated. Instead, one database instance is deployed per node to ensure data consistency and avoid conflicts. Native tooling for scheduled backups of Postgres and Redis is currently in development. In the meantime, we recommend using a variety of open-source tools available for this purpose. For Postgres, [Spilo](https://github.com/zalando/spilo) provides built-in support for scheduled data dumps. You can explore other third party tools for managing db backups, one such tool is [docker-db-backup](https://github.com/tiredofit/docker-db-backup). --- # Source: https://infisical.com/docs/integrations/platforms/docker.md > ## Documentation Index > Fetch the complete documentation index at: https://infisical.com/docs/llms.txt > Use this file to discover all available pages before exploring further. # Docker Entrypoint > Learn how to use Infisical to inject environment variables into a Docker container. This approach allows you to inject secrets from Infisical directly into your application. This is achieved by installing the Infisical CLI into your docker image and modifying your start command to execute with Infisical. ## Install the Infisical CLI to your Dockerfile To install the CLI, follow the instructions for your chosen distribution [here](/cli/overview). #### We recommend you to set the version of the CLI to a specific version. This will help keep your CLI version consistent across reinstalls. [View versions](https://cloudsmith.io/~infisical/repos/infisical-cli/packages/) ## Modify the start command in your Dockerfile Starting your service with the Infisical CLI pulls your secrets from Infisical and injects them into your service. ```dockerfile theme={"dark"} CMD ["infisical", "run", "--projectId", "", "--", "[your service start command]"] # example with single single command CMD ["infisical", "run", "--projectId", "", "--", "npm", "run", "start"] # example with multiple commands CMD ["infisical", "run", "--projectId", "", "--command", "npm run start && ..."] ``` Generate a machine identity for your project by following the steps in the [Machine Identity](/documentation/platform/identities/machine-identities) guide. The machine identity will allow you to authenticate and fetch secrets from Infisical. Obtain an access token for the machine identity by running the following command: ```bash theme={"dark"} export INFISICAL_TOKEN=$(infisical login --method=universal-auth --client-id= --client-secret= --plain --silent) ``` Please note that the access token has a limited lifespan. The `infisical token renew` command can be used to renew the token if needed. The last step is to give the Infisical CLI installed in your Docker container access to the access token. This will allow the CLI to fetch and inject the secrets into your application. To feed the access token to the container, use the INFISICAL\_TOKEN environment variable as shown below. ```bash theme={"dark"} docker run --env INFISICAL_TOKEN=$INFISICAL_TOKEN [DOCKER-IMAGE]... ``` ### Using a Starting Script The drawback of the previous method is that you would have to generate the `INFISICAL_TOKEN` manually. To automate this process, you can use a shell script as your starting command. Create a machine identity for your project by following the steps in the [Machine Identity](/documentation/platform/identities/machine-identities) guide. This identity will enable authentication and secret retrieval from Infisical. Create a shell script to obtain an access token for the machine identity: ```bash script.sh theme={"dark"} #!/bin/sh export INFISICAL_TOKEN=$(infisical login --method=universal-auth --client-id=$INFISICAL_MACHINE_CLIENT_ID --client-secret=$INFISICAL_MACHINE_CLIENT_SECRET --plain --silent) exec infisical run --token $INFISICAL_TOKEN --projectId $PROJECT_ID --env $INFISICAL_SECRET_ENV --domain $INFISICAL_API_URL -- ``` > **Note:** The access token has a limited lifespan. Use the [infisical token renew](/cli/commands/token) CLI command to renew it when necessary. Caution: Implementing this directly in your Dockerfile presents two key issues: 1. Lack of persistence: Variables set in one build step are not automatically carried over to subsequent steps, complicating the process. 2. Security risk: It exposes sensitive credentials inside your container, potentially allowing anyone with container access to retrieve them. Grant the Infisical CLI access to the access token, inside your Docker container. This allows the CLI to fetch and inject secrets into your application. Add the following line to your Dockerfile: ```dockerfile theme={"dark"} CMD ["./script.sh"] ``` ```dockerfile theme={"dark"} CMD ["infisical", "run", "--", "[your service start command]"] # example with single single command CMD ["infisical", "run", "--", "npm", "run", "start"] # example with multiple commands CMD ["infisical", "run", "--command", "npm run start && ..."] ``` Head to your project settings in the Infisical dashboard to generate an [service token](/documentation/platform/token). This service token will allow you to authenticate and fetch secrets from Infisical. Once you have created a service token with the required permissions, you’ll need to feed the token to the CLI installed in your docker container. The last step is to give the Infisical CLI installed in your Docker container access to the service token. This will allow the CLI to fetch and inject the secrets into your application. To feed the service token to the container, use the INFISICAL\_TOKEN environment variable as shown below. ```bash theme={"dark"} docker run --env INFISICAL_TOKEN=[token] [DOCKER-IMAGE]... ``` --- # Source: https://infisical.com/docs/sdks/languages/dotnet.md # Source: https://infisical.com/docs/integrations/frameworks/dotnet.md > ## Documentation Index > Fetch the complete documentation index at: https://infisical.com/docs/llms.txt > Use this file to discover all available pages before exploring further. # .NET > How to use Infisical to inject environment variables and secrets into a .NET app. Prerequisites: * Set up and add envars to [Infisical Cloud](https://app.infisical.com) * [Install the CLI](/cli/overview) ## Initialize Infisical for your [.NET](https://dotnet.microsoft.com) app ```bash theme={"dark"} # navigate to the root of your of your project cd /path/to/project # then initialize infisical infisical init ``` ## Start your application as usual but with Infisical ```bash theme={"dark"} infisical run -- # Example infisical run -- dotnet run ``` --- # Source: https://infisical.com/docs/integrations/dynamic-secrets.md # Source: https://infisical.com/docs/documentation/platform/secrets-mgmt/concepts/dynamic-secrets.md # Source: https://infisical.com/docs/cli/commands/dynamic-secrets.md > ## Documentation Index > Fetch the complete documentation index at: https://infisical.com/docs/llms.txt > Use this file to discover all available pages before exploring further. # infisical dynamic-secrets > Perform dynamic secret operations directly with the CLI ``` infisical dynamic-secrets ``` ## Description Dynamic secrets are unique secrets generated on demand based on the provided configuration settings. For more details, refer to [dynamics secrets section](/documentation/platform/dynamic-secrets/overview). This command enables you to perform list, lease, renew lease, and revoke lease operations on dynamic secrets within your Infisical project. ### Sub-commands Use this command to print out all of the dynamic secrets in your project. ```bash theme={"dark"} $ infisical dynamic-secrets ``` ### Environment variables Used to fetch dynamic secrets via a [machine identity](/documentation/platform/identities/machine-identities) instead of logged-in credentials. Simply, export this variable in the terminal before running this command. ```bash theme={"dark"} # Example export INFISICAL_TOKEN=$(infisical login --method=universal-auth --client-id= --client-secret= --silent --plain) # --plain flag will output only the token, so it can be fed to an environment variable. --silent will disable any update messages. ``` Used to disable the check for new CLI versions. This can improve the time it takes to run this command. Recommended for production environments. To use, simply export this variable in the terminal before running this command. ```bash theme={"dark"} # Example export INFISICAL_DISABLE_UPDATE_CHECK=true ``` ### Flags The project ID to fetch dynamic secrets from. ```bash theme={"dark"} # Example infisical dynamic-secrets --projectId= ``` The project slug to fetch dynamic secrets from. ```bash theme={"dark"} # Example infisical dynamic-secrets --project-slug= ``` The authenticated token to fetch dynamic secrets from. This is required when using a machine identity to authenticate. ```bash theme={"dark"} # Example infisical dynamic-secrets --token= ``` Used to select the environment name on which actions should be taken. Default value: `dev` Use to select the project folder on which dynamic secrets will be accessed. ```bash theme={"dark"} # Example infisical dynamic-secrets --path="/" --env=dev ``` This command is used to create a new lease for a dynamic secret. ```bash theme={"dark"} $ infisical dynamic-secrets lease create ``` ### Flags Used to select the environment name on which actions should be taken. Default value: `dev` The `--plain` flag will output dynamic secret lease credentials values without formatting, one per line. Default value: `false` ```bash theme={"dark"} # Example infisical dynamic-secrets lease create dynamic-secret-postgres --plain ``` The `--path` flag indicates which project folder dynamic secrets will be injected from. ```bash theme={"dark"} # Example infisical dynamic-secrets lease create --path="/" --env=dev ``` The project ID of the dynamic secrets to lease from. ```bash theme={"dark"} # Example infisical dynamic-secrets lease create --projectId= ``` The project slug of the dynamic secrets to lease from. ```bash theme={"dark"} # Example infisical dynamic-secrets lease create --project-slug= ``` The authenticated token to create dynamic secret leases. This is required when using a machine identity to authenticate. ```bash theme={"dark"} # Example infisical dynamic-secrets lease create --token= ``` The lease lifetime. If not provided, the default TTL of the dynamic secret root credential will be used. ```bash theme={"dark"} # Example infisical dynamic-secrets lease create --ttl= ``` ### Provider-specific flags The following flags are specific to certain providers or integrations: The namespace to create the lease in. Only used for Kubernetes dynamic secrets. ```bash theme={"dark"} # Example infisical dynamic-secrets lease create --kubernetes-namespace= ``` This command is used to list leases for a dynamic secret. ```bash theme={"dark"} $ infisical dynamic-secrets lease list ``` ### Flags Used to select the environment name on which actions should be taken. Default value: `dev` The `--path` flag indicates which project folder dynamic secrets will be injected from. ```bash theme={"dark"} # Example infisical dynamic-secrets lease list --path="/" --env=dev ``` The project ID of the dynamic secrets to list leases from. ```bash theme={"dark"} # Example infisical dynamic-secrets lease list --projectId= ``` The project slug of the dynamic secrets to list leases from. ```bash theme={"dark"} # Example infisical dynamic-secrets lease list --project-slug= ``` The authenticated token to list dynamic secret leases. This is required when using a machine identity to authenticate. ```bash theme={"dark"} # Example infisical dynamic-secrets lease list --token= ``` This command is used to renew a lease before it expires. ```bash theme={"dark"} $ infisical dynamic-secrets lease renew ``` ### Flags Used to select the environment name on which actions should be taken. Default value: `dev` The `--path` flag indicates which project folder dynamic secrets will be renewed from. ```bash theme={"dark"} # Example infisical dynamic-secrets lease renew --path="/" --env=dev ``` The project ID of the dynamic secret to lease from. ```bash theme={"dark"} # Example infisical dynamic-secrets lease renew --projectId= ``` The project slug of the dynamic secret to lease from. ```bash theme={"dark"} # Example infisical dynamic-secrets lease renew --project-slug= ``` The authenticated token to create dynamic secret leases. This is required when using a machine identity to authenticate. ```bash theme={"dark"} # Example infisical dynamic-secrets lease renew --token= ``` The lease lifetime. If not provided, the default TTL of the dynamic secret root credential will be used. ```bash theme={"dark"} # Example infisical dynamic-secrets lease renew --ttl= ``` This command is used to delete a lease. ```bash theme={"dark"} $ infisical dynamic-secrets lease delete ``` ### Flags Used to select the environment name on which actions should be taken. Default value: `dev` The `--path` flag indicates which project folder dynamic secrets will be deleted from. ```bash theme={"dark"} # Example infisical dynamic-secrets lease delete --path="/" --env=dev ``` The project ID of the dynamic secret to delete lease from. ```bash theme={"dark"} # Example infisical dynamic-secrets lease delete --projectId= ``` The project slug of the dynamic secret to delete lease from. ```bash theme={"dark"} # Example infisical dynamic-secrets lease delete --project-slug= ``` The authenticated token to delete dynamic secret leases. This is required when using a machine identity to authenticate. ```bash theme={"dark"} # Example infisical dynamic-secrets lease delete --token= ``` --- # Source: https://infisical.com/docs/integrations/platforms/ecs-with-agent.md > ## Documentation Index > Fetch the complete documentation index at: https://infisical.com/docs/llms.txt > Use this file to discover all available pages before exploring further. # Amazon ECS > Learn how to deliver secrets to Amazon Elastic Container Service. ecs diagram This guide will go over the steps needed to access secrets stored in Infisical from Amazon Elastic Container Service (ECS). At a high level, the steps involve setting up an ECS task with an [Infisical Agent](/integrations/platforms/infisical-agent) as a sidecar container. This sidecar container uses [AWS Auth](/documentation/platform/identities/aws-auth) to authenticate with Infisical to fetch secrets/access tokens. Once the secrets/access tokens are retrieved, they are then stored in a shared [Amazon Elastic File System](https://aws.amazon.com/efs/) (EFS) volume. This volume is then made accessible to your application and all of its replicas. This guide primarily focuses on integrating Infisical Cloud with Amazon ECS on AWS Fargate and Amazon EFS. However, the principles and steps can be adapted for use with any instance of Infisical (on premise or cloud) and different ECS launch configurations. ## Prerequisites This guide requires the following prerequisites: * Infisical account * Git installed * Terraform v1.0 or later installed * Access to AWS credentials * Understanding of [Infisical Agent](/integrations/platforms/infisical-agent) ## What we will deploy For this demonstration, we'll deploy the [File Browser](https://github.com/filebrowser/filebrowser) application on our ECS cluster. Although this guide focuses on File Browser, the principles outlined here can be applied to any application of your choice. File Browser plays a key role in this context because it enables us to view all files attached to a specific volume. This feature is important for our demonstration, as it allows us to verify whether the Infisical agent is depositing the expected files into the designated file volume and if those files are accessible to the application. Volumes that contain sensitive secrets should not be publicly accessible. The use of File Browser here is solely for demonstration and verification purposes. ## Configure Authentication with Infisical In order for the Infisical agent to fetch credentials from Infisical, we'll first need to authenticate with Infisical. Follow the documentation to configure a machine identity with AWS Auth [here](/documentation/platform/identities/aws-auth). Take note of the Machine Identity ID as you will be needing this in the preceding steps. ## Clone guide assets repository To help you quickly deploy the example application, please clone the guide assets from this [Github repository](https://github.com/Infisical/infisical-guides.git). This repository contains assets for all Infisical guides. The content for this guide can be found within a sub directory called `aws-ecs-with-agent`. The guide will assume that `aws-ecs-with-agent` is your working directory going forward. ## Deploy example application Before we can deploy our full application and its related infrastructure with Terraform, we'll need to first configure our Infisical agent. ### Agent configuration overview The agent config file defines what authentication method will be used when connecting with Infisical along with where the fetched secrets/access tokens should be saved to. Since the Infisical agent will be deployed as a sidecar, the agent configuration file will need to be encoded in base64. This encoding step is necessary as it allows the agent configuration file to be added into our Terraform configuration without needing to upload it first. #### Full agent configuration file Inside the `aws-ecs-with-agent` directory, you will find a sample `agent-config.yaml` file. This agent config file will connect with Infisical Cloud using AWS Auth and deposit access tokens at path `/infisical-agent/access-token` and render secrets to file `/infisical-agent/secrets`. ```yaml agent-config.yaml theme={"dark"} infisical: address: https://app.infisical.com exit-after-auth: true auth: type: aws-iam sinks: - type: file config: path: /infisical-agent/access-token templates: - template-content: | {{- with secret "202f04d7-e4cb-43d4-a292-e893712d61fc" "dev" "/" }} {{- range . }} {{ .Key }}={{ .Value }} {{- end }} {{- end }} destination-path: /infisical-agent/secrets ``` #### Secret template The Infisical agent accepts one or more optional templates. If provided, the agent will fetch secrets using the set authentication method and format the fetched secrets according to the given template. Typically, these templates are passed in to the agent configuration file via file reference using the `source-path` property but for simplicity we define them inline. In the agent configuration above, the template defined will transform the secrets from Infisical project with the ID `202f04d7-e4cb-43d4-a292-e893712d61fc`, in the `dev` environment, and secrets located in the path `/`, into a `KEY=VALUE` format. Remember to update the project id, environment slug and secret path to one that exists within your Infisical project ## Configure app on terraform Navigate to the `ecs.tf` file in your preferred code editor. In the container\_definitions section, assign the values to the `machine_identity_id` and `agent_config` properties. The `agent_config` property expects the base64-encoded agent configuration file. In order to get this, we use the `base64encode` and `file` functions of HCL. ```hcl ecs.tf theme={"dark"} ...snip... resource "aws_ecs_task_definition" "app" { family = "cb-app-task" execution_role_arn = aws_iam_role.ecs_task_execution_role.arn task_role_arn = aws_iam_role.ecs_task_role.arn network_mode = "awsvpc" requires_compatibilities = ["FARGATE"] cpu = 4096 memory = 8192 container_definitions = templatefile("./templates/ecs/cb_app.json.tpl", { app_image = var.app_image sidecar_image = var.sidecar_image app_port = var.app_port fargate_cpu = var.fargate_cpu fargate_memory = var.fargate_memory aws_region = var.aws_region machine_identity_id = "5655f4f5-332b-45f9-af06-8f493edff36f" agent_config = base64encode(file("../agent-config.yaml")) }) volume { name = "infisical-efs" efs_volume_configuration { file_system_id = aws_efs_file_system.infisical_efs.id root_directory = "/" } } } ...snip... ``` After these values have been set, they will be passed to the Infisical agent during startup through environment variables, as configured in the `infisical-sidecar` container below. ```terraform templates/ecs/cb_app.json.tpl theme={"dark"} [ ...snip... { "name": "infisical-sidecar", "image": "${sidecar_image}", "cpu": 1024, "memory": 1024, "networkMode": "bridge", "command": ["agent"], "essential": false, "logConfiguration": { "logDriver": "awslogs", "options": { "awslogs-group": "/ecs/agent", "awslogs-region": "${aws_region}", "awslogs-stream-prefix": "ecs" } }, "healthCheck": { "command": ["CMD-SHELL", "agent", "--help"], "interval": 30, "timeout": 5, "retries": 3, "startPeriod": 0 }, "environment": [ { "name": "INFISICAL_MACHINE_IDENTITY_ID", "value": "${machine_identity_id}" }, { "name": "INFISICAL_AGENT_CONFIG_BASE64", "value": "${agent_config}" } ], "mountPoints": [ { "containerPath": "/infisical-agent", "sourceVolume": "infisical-efs" } ] } ] ``` In the above container definition, you'll notice that that the Infisical agent has a `mountPoints` defined. This mount point is referencing to the already configured EFS volume as shown below. `containerPath` is set to `/infisical-agent` because that is that the folder we have instructed the agent to deposit the credentials to. ```hcl terraform/efs.tf theme={"dark"} resource "aws_efs_file_system" "infisical_efs" { tags = { Name = "INFISICAL-ECS-EFS" } } resource "aws_efs_mount_target" "mount" { count = length(aws_subnet.private.*.id) file_system_id = aws_efs_file_system.infisical_efs.id subnet_id = aws_subnet.private[count.index].id security_groups = [aws_security_group.efs_sg.id] } ``` ## Configure AWS credentials Because we'll be deploying the example file browser application to AWS via Terraform, you will need to obtain a set of `AWS Access Key` and `Secret Key`. Once you have generated these credentials, export them to your terminal. 1. Export the AWS Access Key ID: ```bash theme={"dark"} export AWS_ACCESS_KEY_ID= ``` 2. Export the AWS Secret Access Key: ```bash theme={"dark"} export AWS_SECRET_ACCESS_KEY= ``` ## Deploy terraform configuration With the agent's sidecar configuration complete, we can now deploy our changes to AWS via Terraform. 1. Change your directory to `terraform` ```sh theme={"dark"} cd terraform ``` 2. Initialize Terraform ``` $ terraform init ``` 3. Preview resources that will be created ``` $ terraform plan ``` 4. Trigger resource creation ```bash theme={"dark"} $ terraform apply Do you want to perform these actions? Terraform will perform the actions described above. Only 'yes' will be accepted to approve. Enter a value: yes ``` ```bash theme={"dark"} Apply complete! Resources: 1 added, 1 changed, 1 destroyed. Outputs: alb_hostname = "cb-load-balancer-1675475779.us-east-1.elb.amazonaws.com:8080" ``` Once the resources have been successfully deployed, Terraform will output the host address where the file browser application will be accessible. It may take a few minutes for the application to become fully ready. ## Verify secrets/tokens in EFS volume To verify that the agent is depositing access tokens and rendering secrets to the paths specified in the agent config, navigate to the web address from the previous step. Once you visit the address, you'll be prompted to login. Enter the credentials shown below. file browser main login page Since our EFS volume is mounted to the path of the file browser application, we should see the access token and rendered secret file we defined via the agent config file. file browswer dashbaord As expected, two files are present: `access-token` and `secrets`. The `access-token` file should hold a valid `Bearer` token, which can be used to make HTTP requests to Infisical. The `secrets` file should contain secrets, formatted according to the specifications in our secret template file (presented in key=value format). file browser access token deposit file browser secrets render --- # Source: https://infisical.com/docs/self-hosting/ee.md > ## Documentation Index > Fetch the complete documentation index at: https://infisical.com/docs/llms.txt > Use this file to discover all available pages before exploring further. # Infisical Enterprise > Find out how to activate Infisical Enterprise edition (EE) features. While most features in Infisical are free to use, others are paid and require purchasing an enterprise license to use them. This guide walks through how you can use these paid features on a self-hosted instance of Infisical. Start by either signing up for a free demo [here](https://infisical.com/schedule-demo) or contacting [sales@infisical.com](mailto:sales@infisical.com) to purchase a license. Once purchased, you will be issued a license key. Set your license key as the value of the **LICENSE\_KEY** environment variable within your Infisical instance. * Assign the issued license key to the `LICENSE_KEY` environment variable in your Infisical instance. * Your Infisical instance will need to communicate with the Infisical license server to validate the license key. If you want to limit outgoing connections only to the Infisical license server, you can use the following IP addresses: `13.248.249.247` and `35.71.190.59` Ensure that your firewall or network settings allow outbound connections to these IP addresses to avoid any issues with license validation. * Assign the issued offline license key to the `LICENSE_KEY` environment variable in your Infisical instance. * The system will automatically detect that it's an offline license based on the key format. While the LICENSE\_KEY\_OFFLINE environment variable continues to be supported for compatibility with existing configurations, we recommend transitioning to LICENSE\_KEY for all license types going forward. Once your instance starts up, the license key will be validated and you'll be able to use the paid features. However, when the license expires, Infisical will continue to run, but EE features will be disabled until the license is renewed or a new one is purchased. --- # Source: https://infisical.com/docs/documentation/platform/dynamic-secrets/elastic-search.md > ## Documentation Index > Fetch the complete documentation index at: https://infisical.com/docs/llms.txt > Use this file to discover all available pages before exploring further. # Elasticsearch > Learn how to dynamically generate Elasticsearch user credentials. The Infisical Elasticsearch dynamic secret allows you to generate Elasticsearch credentials on demand based on configured role. ## Prerequisites 1. Create a role with at least `manage_security` and `monitor` permissions. 2. Assign the newly created role to your API key or user that you'll use later in the dynamic secret configuration. For testing purposes, you can also use a highly privileged role like `superuser`, that will have full control over the cluster. This is not recommended in production environments following the principle of least privilege. ## Set up Dynamic Secrets with Elasticsearch Open the Secret Overview dashboard and select the environment in which you would like to add a dynamic secret. Add Dynamic Secret Button Dynamic Secret Modal Name by which you want the secret to be referenced Default time-to-live for a generated secret (it is possible to modify this value after a secret is generated) Maximum time-to-live for a generated secret. Your Elasticsearch host. This is the endpoint that your instance runs on. *(Example: [https://your-cluster-ip](https://your-cluster-ip))* The port that your Elasticsearch instance is running on. *(Example: 9200)* The roles that the new user that is created when a lease is provisioned will be assigned to. This is a required field. This defaults to `superuser`, which is highly privileged. It is recommended to create a new role with the least privileges required for the lease. Select the authentication method you want to use to connect to your Elasticsearch instance. The username of the user that will be used to provision new dynamic secret leases. Only required if you selected the `Username/Password` authentication method. The password of the user that will be used to provision new dynamic secret leases. Only required if you selected the `Username/Password` authentication method. The ID of the API key that will be used to provision new dynamic secret leases. Only required if you selected the `API Key` authentication method. The API key that will be used to provision new dynamic secret leases. Only required if you selected the `API Key` authentication method. A CA may be required if your DB requires it for incoming connections. This is often the case when connecting to a managed service. Specifies a template for generating usernames. This field allows customization of how usernames are automatically created. Allowed template variables are: * `{{randomUsername}}`: Random username string. * `{{unixTimestamp}}`: Current Unix timestamp at the time of lease creation. * `{{identity.name}}`: Name of the identity that is generating the lease. * `{{dynamicSecret.name}}`: Name of the associated dynamic secret. * `{{dynamicSecret.type}}`: Type of the associated dynamic secret. * `{{random N}}`: Random string of N characters. Allowed template functions are: * `truncate`: Truncates a string to a specified length. * `replace`: Replaces a substring with another value. * `uppercase`: Converts a string to uppercase. * `lowercase`: Converts a string to lowercase. Examples: ```yaml theme={"dark"} {{ randomUsername }} // 3POnzeFyK9gW2nioK0q2gMjr6CZqsRiX {{ unixTimestamp }} // 17490641580 {{ identity.name }} // {{ random 5 }} // x9K2m {{ truncate identity.name 4 }} // test {{ replace identity.name '' 'new-value' }} // new-value ``` Dynamic Secret Setup Modal After submitting the form, you will see a dynamic secret created in the dashboard. If this step fails, you may have to add the CA certificate. Once you've successfully configured the dynamic secret, you're ready to generate on-demand credentials. To do this, simply click on the 'Generate' button which appears when hovering over the dynamic secret item. Alternatively, you can initiate the creation of a new lease by selecting 'New Lease' from the dynamic secret lease list section. Dynamic Secret Dynamic Secret When generating these secrets, it's important to specify a Time-to-Live (TTL) duration. This will dictate how long the credentials are valid for. Provision Lease Ensure that the TTL for the lease falls within the maximum TTL defined when configuring the dynamic secret. Once you click the `Submit` button, a new secret lease will be generated and the credentials from it will be shown to you. Provision Lease ## Audit or Revoke Leases Once you have created one or more leases, you will be able to access them by clicking on the respective dynamic secret item on the dashboard. This will allow you to see the expiration time of the lease or delete a lease before it's set time to live. Provision Lease ## Renew Leases To extend the life of the generated dynamic secret leases past its initial time to live, simply click on the **Renew** button as illustrated below. Provision Lease Lease renewals cannot exceed the maximum TTL set when configuring the dynamic secret --- # Source: https://infisical.com/docs/documentation/platform/auth-methods/email-password.md > ## Documentation Index > Fetch the complete documentation index at: https://infisical.com/docs/llms.txt > Use this file to discover all available pages before exploring further. # Email and Password > Learn how to authenticate into Infisical with email and password. **Email and Password** is the most common authentication method that can be used by user identities for authentication into Web Dashboard and Infisical CLI. It is recommended to utilize [Multi-factor Authentication](/documentation/platform/mfa) in addition to it. It is currently possible to use the **Email and Password** auth method to authenticate into the Web Dashboard and Infisical CLI. ### Emergency Kit Every **Email and Password** is accompanied by an emergency kit given to users during signup. If the password is lost or forgotten, emergency kit is only way to retrieve the access to your account. It is possible to generate a new emergency kit with the following steps: 1. Open the `Personal Settings` menu. open personal settings 2. Scroll down to the `Emergency Kit` section. 3. Enter your current password and click `Save`. ### Change Password You can update your account password at any time: 1. Open the `Personal Settings` menu. open personal settings 2. Navigate to the `Authentication` tab. open authentication tab 3. In the `Change Password` section, enter your current password and new password. change password section 4. Click `Save` to save your new password. ### Change Email You can update your account email address: 1. Open the `Personal Settings` menu. 2. Navigate to the `Authentication` tab. 3. In the `Change Email` section, enter your new email address. If you don't currently have Email authentication enabled, it will be automatically activated when you change your email. You may disable it in the authentication settings after logging in with your new email if needed. change email section 4\. Click `Send Verification Code` to receive an 6-digit verification code at your new email address. 5\. Check your new email inbox and enter the verification code. change email section 6\. Click `Confirm Email Change` to complete the process. 7\. You will be logged out and need to sign in again with your new email address. Changing your email will remove all connected external authentication methods and terminate all active sessions for security. Email changes are disabled if SCIM is enabled for any of your organizations. Contact your organization administrator if you need to change your email address in a SCIM-enabled environment. --- # Source: https://infisical.com/docs/api-reference/endpoints/kms/encryption/encrypt.md > ## Documentation Index > Fetch the complete documentation index at: https://infisical.com/docs/llms.txt > Use this file to discover all available pages before exploring further. # Encrypt Data > Encrypt data with KMS key ## OpenAPI ````yaml POST /api/v1/kms/keys/{keyId}/encrypt openapi: 3.0.3 info: title: Infisical API description: List of all available APIs that can be consumed version: 0.0.1 servers: - url: https://us.infisical.com description: Production server (US) - url: https://eu.infisical.com description: Production server (EU) - url: http://localhost:8080 description: Local server security: [] paths: /api/v1/kms/keys/{keyId}/encrypt: post: tags: - KMS Encryption description: Encrypt data with KMS key operationId: encryptWithKmsKey parameters: - schema: type: string format: uuid in: path name: keyId required: true description: The ID of the key to encrypt the data with. requestBody: content: application/json: schema: type: object properties: plaintext: type: string description: The plaintext to be encrypted (base64 encoded). required: - plaintext additionalProperties: false required: true responses: '200': description: Default Response content: application/json: schema: type: object properties: ciphertext: type: string required: - ciphertext additionalProperties: false '400': description: Default Response content: application/json: schema: type: object properties: reqId: type: string statusCode: type: number enum: - 400 message: type: string error: type: string details: {} required: - reqId - statusCode - message - error additionalProperties: false '401': description: Default Response content: application/json: schema: type: object properties: reqId: type: string statusCode: type: number enum: - 401 message: type: string error: type: string required: - reqId - statusCode - message - error additionalProperties: false '403': description: Default Response content: application/json: schema: type: object properties: reqId: type: string statusCode: type: number enum: - 403 message: type: string details: {} error: type: string required: - reqId - statusCode - message - error additionalProperties: false '404': description: Default Response content: application/json: schema: type: object properties: reqId: type: string statusCode: type: number enum: - 404 message: type: string error: type: string required: - reqId - statusCode - message - error additionalProperties: false '422': description: Default Response content: application/json: schema: type: object properties: reqId: type: string statusCode: type: number enum: - 422 message: {} error: type: string required: - reqId - statusCode - error additionalProperties: false '500': description: Default Response content: application/json: schema: type: object properties: reqId: type: string statusCode: type: number enum: - 500 message: type: string error: type: string required: - reqId - statusCode - message - error additionalProperties: false ```` --- # Source: https://infisical.com/docs/self-hosting/configuration/envars.md > ## Documentation Index > Fetch the complete documentation index at: https://infisical.com/docs/llms.txt > Use this file to discover all available pages before exploring further. # Environment Variables > Read how to configure environment variables for self-hosted Infisical. Infisical accepts all configurations via environment variables. For a minimal self-hosted instance, at least `ENCRYPTION_KEY`, `AUTH_SECRET`, `DB_CONNECTION_URI` and `REDIS_URL` must be defined. However, you can configure additional settings to activate more features as needed. ## General platform Used to configure platform-specific security and operational settings Must be a random 16 byte hex string. Can be generated with `openssl rand -hex 16` Must be a random 32 byte base64 string. Can be generated with `openssl rand -base64 32` Must be an absolute URL including the protocol (e.g. [https://app.infisical.com](https://app.infisical.com)). Specifies the internal port on which the application listens. Specifies the network interface Infisical will bind to when accepting incoming connections. By default, Infisical binds to `localhost`, which restricts access to connections from the same machine. To make the application accessible externally (e.g., for self-hosted deployments), set this to `0.0.0.0`, which tells the server to listen on all network interfaces. Example values: * `localhost` (default, same as `127.0.0.1`) * `0.0.0.0` (all interfaces, accessible externally) * `192.168.1.100` (specific interface IP) Telemetry helps us improve Infisical but if you want to disable it you may set this to `false`. Determines whether App Connections and Dynamic Secrets are permitted to connect with internal/private IP addresses. Determines whether your Infisical instance can automatically read the service account token of the pod it's running on. Used for features such as the IRSA auth method. Disable storing audit logs in the database. This is useful if you're using audit log streams and don't want to store them in the database. ## CORS Cross-Origin Resource Sharing (CORS) is a security feature that allows web applications running on one domain to access resources from another domain. The following environment variables can be used to configure the Infisical Rest API to allow or restrict access to resources from different origins. Specify a list of origins that are allowed to access the Infisical API. An example value would be `CORS_ALLOWED_ORIGINS=["https://example.com"]`. Defaults to the same value as your `SITE_URL` environment variable. Array of HTTP methods allowed for CORS requests. Defaults to reflecting the headers specified in the request's Access-Control-Request-Headers header. ## Data Layer The platform utilizes Postgres to persist all of its data and Redis for caching and backgroud tasks ### PostgreSQL Please note that the database user you create must be granted all privileges on the Infisical database. This includes the ability to create new schemas, create, update, delete, modify tables and indexes, etc. Postgres database connection string. Configure the SSL certificate for securing a Postgres connection by first encoding it in base64. Use the following command to encode your certificate: `echo "" | base64` Many cloud providers provide a CA certificate for their data regions that you can use to secure your connection with SSL. If you're hosting your database on AWS RDS, you can use their publicly available CA certificate as the database root certificate. You can find all the available CA certificates for AWS RDS on the official [AWS RDS documentation](https://docs.aws.amazon.com/AmazonRDS/latest/UserGuide/UsingWithRDS.SSL.html). As an example, if your RDS cluster is hosted in `us-east-1` *(US East, N. Virginia)*, you can use the following root certificate: [https://truststore.pki.rds.amazonaws.com/us-east-1/us-east-1-bundle.pem](https://truststore.pki.rds.amazonaws.com/us-east-1/us-east-1-bundle.pem). All the available CA certificates can be found in the AWS RDS documentation linked above. Remember to base64 encode the certificate before setting it as the `DB_ROOT_CERT` environment variable. `cat /path/to/certificate.pem | base64`. ```bash theme={"dark"} DB_ROOT_CERT=LS0tLS1CRUdJTiBDRVJUSUZJQ0FURS0tLS0tCk1 # .... (base64 encoded certificate) DB_CONNECTION_URI=?sslmode=verify-ca # or verify-full depending on your security policies ``` Postgres database read replica connection strings. It accepts a JSON string. ``` DB_READ_REPLICAS=[{"DB_CONNECTION_URI":""}] ``` Postgres read replica connection string. Configure the SSL certificate for securing a Postgres replica connection by first encoding it in base64. Use the following command to encode your certificate: `echo "" | base64` If not provided it will use master SSL certificate. ### Redis Redis is used for caching and background tasks. You can use either a standalone Redis instance, Redis Sentinel, or Redis Cluster setup. Redis connection string. For SSL/TLS connections, use the `rediss://` protocol (note the double 's'). Examples: * Without SSL: `redis://localhost:6379` * With SSL: `rediss://localhost:6379` * With authentication: `redis://:password@localhost:6379` * With SSL and authentication: `rediss://:password@localhost:6379` Comma-separated list of Sentinel host:port pairs. ` 192.168.65.254:26379,192.168.65.254:26380` The name of the Redis master set monitored by Sentinel Whether to use TLS/SSL for Redis Sentinel connection Authentication username for Redis Sentinel Authentication password for Redis Sentinel Authentication username for Redis Node Authentication password for Redis Node Comma-separated list of Redis Cluster host:port pairs. ` 192.168.65.254:26379,192.168.65.254:26380` Enable Redis TLS encryption on connection. Enable this if you are using AWS encrypt on transit for Elasticache cluster. For more information refer ![here](https://github.com/redis/ioredis?tab=readme-ov-file#special-note-aws-elasticache-clusters-with-tls). Authentication username for Redis Node Authentication password for Redis Node Comma-separated list of Redis read replicas host:port pairs. ` 192.168.65.254:26379,192.168.65.254:26380` The paramters like username, password, tls, redis type of the primary instance will be inherited. ### Redis with SSL/TLS To connect to Redis with SSL/TLS, use the `rediss://` protocol (note the double 's') in your connection string. If your Redis server uses a certificate signed by a private CA or a self-signed certificate, set the `NODE_EXTRA_CA_CERTS` environment variable to the path of your CA certificate file: ```bash theme={"dark"} REDIS_URL=rediss://your-redis-host:6379 NODE_EXTRA_CA_CERTS=/path/to/ca.crt ``` For Redis Sentinel or Cluster mode, use the `REDIS_SENTINEL_ENABLE_TLS` or `REDIS_CLUSTER_ENABLE_TLS` environment variables respectively. ## Email Service Without email configuration, Infisical's core functions like sign-up/login and secret operations work, but this disables multi-factor authentication, email invites for projects, alerts for suspicious logins, and all other email-dependent features. Hostname to connect to for establishing SMTP connections Port to connect to for establishing SMTP connections Credential to connect to host (e.g. [team@infisical.com](mailto:team@infisical.com)) Credential to connect to host Email address to be used for sending emails Name label to be used in From field (e.g. Team) If this is `true` and `SMTP_PORT` is not 465 then TLS is not used even if the server supports STARTTLS extension. If this is `true` and `SMTP_PORT` is not 465 then Infisical tries to use STARTTLS even if the server does not advertise support for it. If the connection can not be encrypted then message is not sent. If this is `true`, Infisical will validate the server's SSL/TLS certificate and reject the connection if the certificate is invalid or not trusted. If set to `false`, the client will accept the server's certificate regardless of its validity, which can be useful in development or testing environments but is not recommended for production use. If your SMTP server uses a certificate signed by a custom Certificate Authority, you should set this variable so that Infisical can trust the custom CA. This variable **must be a base64 encoded PEM certificate**. Use the following command to encode your certificate: `echo "" | base64` Infisical highly encourages the following variables be used alongside this one for maximum security: * `SMTP_REQUIRE_TLS=true` * `SMTP_TLS_REJECT_UNAUTHORIZED=true` 1. Create an account and configure [SendGrid](https://sendgrid.com) to send emails. 2. Create a SendGrid API Key under Settings > [API Keys](https://app.sendgrid.com/settings/api_keys) 3. Set a name for your API Key, we recommend using "Infisical," and select the "Restricted Key" option. You will need to enable the "Mail Send" permission as shown below: creating sendgrid api key setting sendgrid api key restriction 4. With the API Key, you can now set your SMTP environment variables: ``` SMTP_HOST=smtp.sendgrid.net SMTP_USERNAME=apikey SMTP_PASSWORD=SG.rqFsfjxYPiqE1lqZTgD_lz7x8IVLx # your SendGrid API Key from step above SMTP_PORT=587 SMTP_FROM_ADDRESS=hey@example.com # your email address being used to send out emails SMTP_FROM_NAME=Infisical ``` Remember that you will need to restart Infisical for this to work properly. 1. Create an account and configure [Mailgun](https://www.mailgun.com) to send emails. 2. Obtain your Mailgun credentials in Sending > Overview > SMTP obtain mailhog api key estriction 3. With your Mailgun credentials, you can now set up your SMTP environment variables: ``` SMTP_HOST=smtp.mailgun.org # obtained from credentials page SMTP_USERNAME=postmaster@example.mailgun.org # obtained from credentials page SMTP_PASSWORD=password # obtained from credentials page SMTP_PORT=587 SMTP_FROM_ADDRESS=hey@example.com # your email address being used to send out emails SMTP_FROM_NAME=Infisical ``` This will be used to verify the email you are sending from. Create SES identity If you AWS SES is under sandbox mode, you will only be able to send emails to verified identies. Create an IAM user for SMTP authentication and obtain SMTP credentials in SMTP settings > Create SMTP credentials opening AWS SES console creating AWS IAM SES user With your AWS SES SMTP credentials, you can now set up your SMTP environment variables for your Infisical instance. ``` SMTP_HOST=email-smtp.ap-northeast-1.amazonaws.com # SMTP endpoint obtained from SMTP settings SMTP_USERNAME=xxx # your SMTP username SMTP_PASSWORD=xxx # your SMTP password SMTP_PORT=465 SMTP_FROM_ADDRESS=hey@example.com # your email address being used to send out emails SMTP_FROM_NAME=Infisical ``` Remember that you will need to restart Infisical for this to work properly. 1. Create an account and configure [SocketLabs](https://www.socketlabs.com/) to send emails. 2. From the dashboard, navigate to SMTP Credentials > SMTP & APIs > SMTP Credentials to obtain your SocketLabs SMTP credentials. opening SocketLabs dashboard obtaining SocketLabs credentials 3. With your SocketLabs SMTP credentials, you can now set up your SMTP environment variables: ``` SMTP_HOST=smtp.socketlabs.com SMTP_USERNAME=username # obtained from your credentials SMTP_PASSWORD=password # obtained from your credentials SMTP_PORT=587 SMTP_FROM_ADDRESS=hey@example.com # your email address being used to send out emails SMTP_FROM_NAME=Infisical ``` {" "} The `SMTP_FROM_ADDRESS` environment variable should be an email for an authenticated domain under Configuration > Domain Management in SocketLabs. For example, if you're using SocketLabs in sandbox mode, then you may use an email like `team@sandbox.socketlabs.dev`. SocketLabs domain management Remember that you will need to restart Infisical for this to work properly. 1. Create an account on [Resend](https://resend.com). 2. Add a [Domain](https://resend.com/domains). adding resend domain 3. Create an [API Key](https://resend.com/api-keys). creating resend api key 4. Go to the [SMTP page](https://resend.com/settings/smtp) and copy the values. go to resend smtp settings 5. With the API Key, you can now set your SMTP environment variables variables: ``` SMTP_HOST=smtp.resend.com SMTP_USERNAME=resend SMTP_PASSWORD=YOUR_API_KEY SMTP_PORT=587 SMTP_FROM_ADDRESS=hey@example.com # your email address being used to send out emails SMTP_FROM_NAME=Infisical ``` Remember that you will need to restart Infisical for this to work properly. Create an account and enable "less secure app access" in Gmail Account Settings > Security. This will allow applications like Infisical to authenticate with Gmail via your username and password. Gmail secure app access With your Gmail username and password, you can set your SMTP environment variables: ``` SMTP_HOST=smtp.gmail.com SMTP_USERNAME=hey@gmail.com # your email SMTP_PASSWORD=password # your password SMTP_PORT=587 SMTP_FROM_ADDRESS=hey@gmail.com SMTP_FROM_NAME=Infisical ``` As per the [notice](https://support.google.com/accounts/answer/6010255?hl=en) by Google, you should note that using Gmail credentials for SMTP configuration will only work for Google Workspace or Google Cloud Identity customers as of May 30, 2022. Put differently, the SMTP configuration is only possible with business (not personal) Gmail credentials. 1. Create an account and configure [Office365](https://www.office.com/) to send emails. 2. With your login credentials, you can now set up your SMTP environment variables: ``` SMTP_HOST=smtp.office365.com SMTP_USERNAME=username@yourdomain.com # your username SMTP_PASSWORD=password # your password SMTP_PORT=587 SMTP_FROM_ADDRESS=username@yourdomain.com SMTP_FROM_NAME=Infisical ``` 1. Create an account and configure [Zoho Mail](https://www.zoho.com/mail/) to send emails. 2. With your email credentials, you can now set up your SMTP environment variables: ``` SMTP_HOST=smtp.zoho.com SMTP_USERNAME=username # your email SMTP_PASSWORD=password # your password SMTP_PORT=587 SMTP_FROM_ADDRESS=hey@example.com # your personal Zoho email or domain-based email linked to Zoho Mail SMTP_FROM_NAME=Infisical ``` {" "} You can use either your personal Zoho email address like `you@zohomail.com` or a domain-based email address like `you@yourdomain.com`. If using a domain-based email address, then please make sure that you've configured and verified it with Zoho Mail. Remember that you will need to restart Infisical for this to work properly. 1. Create an account and configure [SMTP2Go](https://www.smtp2go.com/) to send emails. 2. Turn on SMTP authentication ``` SMTP_HOST=mail.smtp2go.com SMTP_PORT=You can use one of the following ports: 2525, 80, 25, 8025, or 587 SMTP_USERNAME=username #Your SMTP2GO account's SMTP username SMTP_PASSWORD=password #Your SMTP2GO account's SMTP password SMTP_FROM_ADDRESS=hey@example.com # your email address being used to send out emails SMTP_FROM_NAME=Infisical ``` {" "} Optional (for TLS/SSL): TLS: Available on the same ports (2525, 80, 25, 8025, or 587) SSL: Available on ports 465, 8465, and 443 ## Authentication By default, users can only login via email/password based login method. To login into Infisical with OAuth providers such as Google, configure the associated variables. When set, all visits to the Infisical login page will automatically redirect users of your Infisical instance to the SAML identity provider associated with the specified organization slug. Follow detailed guide to configure [Google SSO](/documentation/platform/sso/google) OAuth2 client ID for Google login OAuth2 client secret for Google login Follow detailed guide to configure [GitHub SSO](/documentation/platform/sso/github) OAuth2 client ID for GitHub login OAuth2 client secret for GitHub login Follow detailed guide to configure [GitLab SSO](/documentation/platform/sso/gitlab) OAuth2 client ID for GitLab login OAuth2 client secret for GitLab login URL of your self-hosted instance of GitLab where the OAuth application is registered Requires enterprise license. Please contact [team@infisical.com](mailto:team@infisical.com) to get more information. Requires enterprise license. Please contact [team@infisical.com](mailto:team@infisical.com) to get more information. Requires enterprise license. Please contact [team@infisical.com](mailto:team@infisical.com) to get more information. ## App Connections You can configure third-party app connections for re-use across Infisical Projects. The AWS IAM User access key ID for assuming roles The AWS IAM User secret key for assuming roles The ID of the GitHub App The slug of the GitHub App The client ID for the GitHub App The client secret for the GitHub App The private key for the GitHub App The ID of the GitHub Radar App The slug of the GitHub Radar App The client ID for the GitHub Radar App The client secret for the GitHub Radar App The private key for the GitHub Radar App The webhook secret configured for payload verification in the GitHub Radar App The OAuth2 client ID for GitHub OAuth Connection The OAuth2 client secret for GitHub OAuth Connection The Application ID of your GitLab OAuth application. The Secret of your GitLab OAuth application. The Application ID of your Heroku OAuth application. The Secret of your Heroku OAuth application. ## Secret Scanning The App ID of your GitHub App. {" "} The slug of your GitHub App. {" "} A private key for your GitHub App. The webhook secret of your GitHub App. ## Observability You can configure Infisical to collect and expose telemetry data for analytics and monitoring. Whether or not to collect and expose telemetry data. Supported types are `prometheus` and `otlp`. If export type is set to `prometheus`, metric data will be exposed in port 9464 in the `/metrics` path. If export type is set to `otlp`, you will have to configure a value for `OTEL_EXPORT_OTLP_ENDPOINT`. Where telemetry data would be pushed to for collection. This is only applicable when `OTEL_EXPORT_TYPE` is set to `otlp`. The username for authenticating with the telemetry collector. The password for authenticating with the telemetry collector. ## Identity Auth Method The TLS header used to propagate the client certificate from the load balancer to the server. ## Environment Variable Overrides If you can't directly access and modify environment variables, you can update them using the [Server Admin Console](/documentation/platform/admin-panel/server-admin). Environment Variables Overrides Page --- # Source: https://infisical.com/docs/documentation/platform/external-migrations/envkey.md > ## Documentation Index > Fetch the complete documentation index at: https://infisical.com/docs/llms.txt > Use this file to discover all available pages before exploring further. # Migrating from EnvKey to Infisical > Learn how to migrate secrets from EnvKey to Infisical. ## Migrating from EnvKey EnvKey Dashboard Go to Import/Export on the top right corner, Click on Export Org and save the exported file. Export organization Click on copy to copy the encryption key and save it. Copy encryption key Open the Infisical dashboard and go to Organization Settings > External Migrations. Infisical Organization settings Select the EnvKey platform and click on Next. Select EnvKey platform Upload the exported file from EnvKey, paste the encryption key and click Import data. Infisical Import EnvKey It may take several minutes to complete the migration. You will receive an email when the migration is complete, or if there were any errors during the migration process. ## Talk to our team To make the migration process even more seamless, you can [schedule a meeting with our team](https://infisical.cal.com/vlad/migration-from-envkey-to-infisical) to learn more about how Infisical compares to EnvKey and discuss unique needs of your organization. You are also welcome to email us at [support@infisical.com](mailto:support@infisical.com) to ask any questions or get any technical help. --- # Source: https://infisical.com/docs/documentation/platform/pki/enrollment-methods/est.md > ## Documentation Index > Fetch the complete documentation index at: https://infisical.com/docs/llms.txt > Use this file to discover all available pages before exploring further. # Certificate Enrollment via EST ## Concept The EST enrollment method allows you to issue and manage certificates against a specific [certificate profile](/documentation/platform/pki/certificates/profiles) using the [EST protocol](https://en.wikipedia.org/wiki/Enrollment_over_Secure_Transport). This method is suitable for environments requiring strong authentication and encrypted communication, such as in IoT, enterprise networks, and secure web services. Infisical's EST service is based on [RFC 7030](https://datatracker.ietf.org/doc/html/rfc7030) and implements the following endpoints: * **cacerts** - provides the necessary CA chain for the client to validate certificates issued by the CA. * **simpleenroll** - allows an EST client to request a new certificate from Infisical's EST server * **simplereenroll** - similar to the /simpleenroll endpoint but is used for renewing an existing certificate. These EST endpoints are exposed on port 8443 under the .well-known/est path and structured under `https://app.infisical.com:8443/.well-known/est/{profile_id}/...` ## Prerequisites * Your client devices need to have a bootstrap/pre-installed certificate. * Your client devices must trust the server certificates used by Infisical's EST server. If the devices are new or lack existing trust configurations, you need to manually establish trust for the appropriate certificates. For Infisical Cloud users, the devices must be configured to trust the [Amazon root CA certificates](https://www.amazontrust.com/repository). ## Guide to Certificate Enrollment via EST In the following steps, we explore how to issue a X.509 certificate using the EST enrollment method. Create a [certificate profile](/documentation/platform/pki/certificates/profiles) with **EST** selected as the enrollment method and fill in EST-specific configuration. pki est config Here's some guidance on each EST-specific configuration field: * Disable Bootstrap CA Validation: Enable this if your devices are not configured with a bootstrap certificate. * EST Passphrase: This is also used to authenticate your devices with Infisical's EST server. When configuring the clients, use the value defined here as the EST password. * CA Chain Certificate: This is the certificate chain used to validate your devices' manufacturing/pre-installed certificates. This will be used to authenticate your devices with Infisical's EST server. Once the EST enrollment method configuration is complete, you can use the ID of the associated certificate profile `profile_id` as the EST label when enrolling EST clients with Infisical. pki est label The complete URL structure of the supported EST endpoints may look like the following: * [https://app.infisical.com:8443/.well-known/est/\{profile\_id}/cacerts](https://app.infisical.com:8443/.well-known/est/\{profile_id}/cacerts) * [https://app.infisical.com:8443/.well-known/est/\{profile\_id}/simpleenroll](https://app.infisical.com:8443/.well-known/est/\{profile_id}/simpleenroll) * [https://app.infisical.com:8443/.well-known/est/\{profile\_id}/simplereenroll](https://app.infisical.com:8443/.well-known/est/\{profile_id}/simplereenroll) To use the EST passphrase in your clients, configure it as the EST password. The EST username can be set to any arbitrary value. Use the appropriate client certificates for invoking the EST endpoints. * For `simpleenroll`, use the bootstrapped/manufacturer client certificate. * For `simplereenroll`, use a valid EST-issued client certificate. When configuring the PKCS#12 objects for the client certificates, only include the leaf certificate and the private key. --- # Source: https://infisical.com/docs/documentation/platform/event-subscriptions.md > ## Documentation Index > Fetch the complete documentation index at: https://infisical.com/docs/llms.txt > Use this file to discover all available pages before exploring further. # Event Subscriptions > Subscribe to events in Infisical for real-time updates Event Subscriptions is a paid feature that is available under the Enterprise license. Please contact [sales@infisical.com](mailto:sales@infisical.com). Event Subscriptions allow you to receive real-time notifications when specific actions occur within your Infisical projects. You can subscribe to changes such as secret modifications, with support for additional resource types coming soon. ## How It Works Event Subscriptions use [Server-Sent Events (SSE)](https://developer.mozilla.org/en-US/docs/Web/API/Server-sent_events) to deliver real-time updates to your applications: 1. Your application opens an SSE connection to the Infisical Events API. 2. When a subscribed event occurs (e.g., a secret is updated), Infisical pushes a notification through the connection. 3. Your application receives the event instantly and can take appropriate action. Event Subscriptions are designed for real-time communication and do not include persistence or replay capabilities—events are delivered once and are not stored for future retrieval. Ensure your application maintains an active connection to receive events. ## Supported Events You can subscribe to the following event types: ### Secrets | Event | Description | | ------------------------ | --------------------------------------------- | | `secret:create` | Triggered when a new secret is created | | `secret:update` | Triggered when an existing secret is modified | | `secret:delete` | Triggered when a secret is removed | | `secret:import-mutation` | Triggered when a secret changes via an import | ## Permissions Setup To receive events, the machine identity must have the **Secret Events** permission with the appropriate actions enabled. Project Detail Project Access Go to **Access Management** and select **Project Roles**. Project Role Create a new role for event subscriptions, or edit an existing one. Role Detail Select the resources the role should have access to. Add policy Policy setting Enable the actions corresponding to the events you want to receive (e.g., read, create, update, delete). ### Filtering Events with Conditions You can scope events to specific secret paths, environments, or other conditions. Policy condition This allows you to receive only the events relevant to your use case, reducing noise and improving efficiency. ## Getting Started Event Subscriptions are currently available via the [Events API](/api-reference/endpoints/events). Support for SDKs, Kubernetes Operator, and other integrations is coming soon. ### Prerequisites You need an authentication token from a machine identity. Follow the [machine identities documentation](/documentation/platform/identities/machine-identities#authentication-methods) to set up authentication. ### Subscribing to Events To subscribe to events, make a request to the events endpoint with your project ID and optional filters. Postman Subscription #### Request Parameters | Parameter | Type | Description | | --------------------------------------- | ------ | ------------------------------------------------------ | | `projectId` | string | The ID of the project to subscribe to | | `register` | array | List of event filters | | `register[].conditions` | object | Optional conditions to filter events | | `register[].conditions.environmentSlug` | string | Filter by environment (e.g., `dev`, `staging`, `prod`) | | `register[].conditions.secretPath` | string | Filter by secret path (e.g., `/api/keys`) | The endpoint responds with `Content-Type: text/event-stream` to initiate an SSE connection. In the cURL example below, we use the `-N` flag to keep the connection open to receive incoming events from Infisical. ```bash theme={"dark"} curl -X POST -N --location \ 'https://app.infisical.com/api/v1/events/subscribe/project-events' \ --header 'Content-Type: application/json' \ --header "Authorization: Bearer " \ --data '{ "projectId": "", "register": [ { "event": "secret:create", "conditions": { "environmentSlug": "dev", "secretPath": "/micro_service1" } }, { "event": "secret:update", "conditions": { "environmentSlug": "staging", "secretPath": "/**" } }, { "event": "secret:delete", "conditions": { "environmentSlug": "prod", "secretPath": "/database" } }, { "event": "secret:import-mutation", "conditions": { "environmentSlug": "prod", "secretPath": "/database" } } ] }' ``` ### Response Format * Event triggered on a secret change ```json theme={"dark"} { "projectType": "secret-manager", "data": { "eventType": "secret:create|update|delete", "payload": [ { "environment": "staging", "secretPath": "/", "secretKey": "SECRET_KEY1" }, { "environment": "staging", "secretPath": "/", "secretKey": "SECRET_KEY2" } ], } } ``` * Event triggered on a secret change in an import ```json theme={"dark"} { "projectType": "secret-manager", "data": { "eventType": "secret:import-mutation", "payload": { "environment": "staging", "secretPath": "/" } } } ``` For complete API specifications and additional examples, see the [API Reference](/api-reference/endpoints/events). --- # Source: https://infisical.com/docs/api-reference/endpoints/audit-logs/export-audit-log.md > ## Documentation Index > Fetch the complete documentation index at: https://infisical.com/docs/llms.txt > Use this file to discover all available pages before exploring further. # Export > Get all audit logs for an organization ## OpenAPI ````yaml GET /api/v1/organization/audit-logs openapi: 3.0.3 info: title: Infisical API description: List of all available APIs that can be consumed version: 0.0.1 servers: - url: https://us.infisical.com description: Production server (US) - url: https://eu.infisical.com description: Production server (EU) - url: http://localhost:8080 description: Local server security: [] paths: /api/v1/organization/audit-logs: get: tags: - Audit Logs description: Get all audit logs for an organization operationId: listOrganizationAuditLogs parameters: - schema: type: string in: query name: projectId required: false description: >- Optionally filter logs by project ID. If not provided, logs from the entire organization will be returned. - schema: type: string in: query name: environment required: false description: >- The environment to filter logs by. If not provided, logs from all environments will be returned. Note that the projectId parameter must also be provided. - schema: type: string enum: - platform - kmipClient - user - service - identity - scimClient - acmeProfile - acmeAccount - estAccount - unknownUser in: query name: actorType required: false - schema: type: string in: query name: secretPath required: false description: >- The path of the secret to query audit logs for. Note that the projectId parameter must also be provided. - schema: type: string in: query name: secretKey required: false description: >- The key of the secret to query audit logs for. Note that the projectId parameter must also be provided. - schema: type: string in: query name: eventType required: false - schema: type: string enum: - web - cli - k8-operator - terraform - other - InfisicalPythonSDK - InfisicalNodeSDK in: query name: userAgentType required: false description: Choose which consuming application to export audit logs for. - schema: type: string in: query name: eventMetadata required: false description: >- Filter by event metadata key-value pairs. Formatted as `key1=value1,key2=value2`, with comma-separation. - schema: type: string format: date-time in: query name: startDate required: false description: The date to start the export from. - schema: type: string format: date-time in: query name: endDate required: false description: The date to end the export at. - schema: type: number default: 0 in: query name: offset required: false description: >- The offset to start from. If you enter 10, it will start from the 10th audit log. - schema: type: number maximum: 1000 default: 20 in: query name: limit required: false description: The number of audit logs to return. - schema: type: string in: query name: actor required: false description: The actor to filter the audit logs by. responses: '200': description: Default Response content: application/json: schema: type: object properties: auditLogs: type: array items: type: object properties: id: type: string format: uuid ipAddress: type: string nullable: true userAgent: type: string nullable: true userAgentType: type: string nullable: true expiresAt: type: string format: date-time nullable: true createdAt: type: string format: date-time updatedAt: type: string format: date-time orgId: type: string format: uuid nullable: true projectId: type: string nullable: true projectName: type: string nullable: true event: type: object properties: type: type: string metadata: {} required: - type additionalProperties: false actor: type: object properties: type: type: string metadata: {} required: - type additionalProperties: false required: - id - createdAt - updatedAt - event - actor additionalProperties: false required: - auditLogs additionalProperties: false '400': description: Default Response content: application/json: schema: type: object properties: reqId: type: string statusCode: type: number enum: - 400 message: type: string error: type: string details: {} required: - reqId - statusCode - message - error additionalProperties: false '401': description: Default Response content: application/json: schema: type: object properties: reqId: type: string statusCode: type: number enum: - 401 message: type: string error: type: string required: - reqId - statusCode - message - error additionalProperties: false '403': description: Default Response content: application/json: schema: type: object properties: reqId: type: string statusCode: type: number enum: - 403 message: type: string details: {} error: type: string required: - reqId - statusCode - message - error additionalProperties: false '404': description: Default Response content: application/json: schema: type: object properties: reqId: type: string statusCode: type: number enum: - 404 message: type: string error: type: string required: - reqId - statusCode - message - error additionalProperties: false '422': description: Default Response content: application/json: schema: type: object properties: reqId: type: string statusCode: type: number enum: - 422 message: {} error: type: string required: - reqId - statusCode - error additionalProperties: false '500': description: Default Response content: application/json: schema: type: object properties: reqId: type: string statusCode: type: number enum: - 500 message: type: string error: type: string required: - reqId - statusCode - message - error additionalProperties: false ```` --- # Source: https://infisical.com/docs/cli/commands/export.md > ## Documentation Index > Fetch the complete documentation index at: https://infisical.com/docs/llms.txt > Use this file to discover all available pages before exploring further. # infisical export > Export Infisical secrets from CLI into different file formats ```bash theme={"dark"} infisical export [options] ``` ## Description Export environment variables from the platform into a file format. By default, output is sent to stdout (standard output), but you can use the `--output-file` flag to save directly to a file. ## Subcommands & flags Use this command to export environment variables from the platform into a raw file formats ```bash theme={"dark"} $ infisical export # Export variables to a .env file infisical export > .env infisical export --output-file=./.env # Export variables to a .env file (with export keyword) infisical export --format=dotenv-export > .env infisical export --format=dotenv-export --output-file=./.env # Export variables to a JSON file infisical export --format=json > secrets.json infisical export --format=json --output-file=./secrets.json # Export variables to a YAML file infisical export --format=yaml > secrets.yaml infisical export --format=yaml --output-file=./secrets.yaml # Render secrets using a custom template file infisical export --template= ``` ### Environment variables Used to fetch secrets via a [machine identities](/documentation/platform/identities/machine-identities) apposed to logged in credentials. Simply, export this variable in the terminal before running this command. ```bash theme={"dark"} # Example export INFISICAL_TOKEN=$(infisical login --method=universal-auth --client-id= --client-secret= --silent --plain) # --plain flag will output only the token, so it can be fed to an environment variable. --silent will disable any update messages. ``` Alternatively, you may use service tokens. ```bash theme={"dark"} # Example export INFISICAL_TOKEN= ``` Used to disable the check for new CLI versions. This can improve the time it takes to run this command. Recommended for production environments. To use, simply export this variable in the terminal before running this command. ```bash theme={"dark"} # Example export INFISICAL_DISABLE_UPDATE_CHECK=true ``` ### flags The path to write the output file to. Can be a full file path, directory, or filename. ```bash theme={"dark"} # Export to specific file infisical export --format=json --output-file=./secrets.json # Export to directory (uses default filename based on format) infisical export --format=yaml --output-file=./ ``` **When `--output-file` is specified:** * Secrets are saved directly to the specified file * A success message is displayed showing the file path * For directories: adds default filename `secrets.{format}` (e.g., `secrets.json`, `secrets.yaml`) * For dotenv formats in directories: uses `.env` as the filename **When `--output-file` is NOT specified (default behavior):** * Output is sent to stdout (standard output) * You can use shell redirection like `infisical export > secrets.json` * Maintains backwards compatibility with existing scripts If you're using shell redirection and your token expires, re-authentication will fail because the prompt can't display properly due to the redirection. The `--template` flag specifies the path to the template file used for rendering secrets. When using templates, you can omit the other format flags. ```text my-template-file theme={"dark"} {{$secrets := secret "" "" ""}} {{$length := len $secrets}} {{- "{"}} {{- with $secrets }} {{- range $index, $secret := . }} "{{ $secret.Key }}": "{{ $secret.Value }}"{{if lt $index (minus $length 1)}},{{end}} {{- end }} {{- end }} {{ "}" -}} ``` ```bash theme={"dark"} # Example infisical export --template="/path/to/template/file" ``` Used to set the environment that secrets are pulled from. ```bash theme={"dark"} # Example infisical export --env=prod ``` Note: this flag only accepts environment slug names not the fully qualified name. To view the slug name of an environment, visit the project settings page. default value: `dev` By default the project id is retrieved from the `.infisical.json` located at the root of your local project. This flag allows you to override this behavior by explicitly defining the project to fetch your secrets from. ```bash theme={"dark"} # Example infisical export --projectId=XXXXXXXXXXXXXX ``` Parse shell parameter expansions in your secrets (e.g., `${DOMAIN}`) Default value: `true` By default imported secrets are available, you can disable it by setting this option to false. Default value: `true` Format of the output file. Accepted values: `dotenv`, `dotenv-export`, `csv`, `json` and `yaml` Default value: `dotenv` Prioritizes personal secrets with the same name over shared secrets Default value: `true` The `--path` flag indicates which project folder secrets will be injected from. ```bash theme={"dark"} # Example infisical export --path="/path/to/folder" --env=dev ``` When working with tags, you can use this flag to filter and retrieve only secrets that are associated with a specific tag(s). ```bash theme={"dark"} # Example infisical export --tags=tag1,tag2,tag3 --env=dev ``` Note: you must reference the tag by its slug name not its fully qualified name. Go to project settings to view all tag slugs. By default, all secrets are fetched --- # Source: https://infisical.com/docs/integrations/frameworks/express.md > ## Documentation Index > Fetch the complete documentation index at: https://infisical.com/docs/llms.txt > Use this file to discover all available pages before exploring further. # Express, Fastify, Koa > How to use Infisical to inject environment variables and secrets into an Express app. Prerequisites: * Set up and add envars to [Infisical Cloud](https://app.infisical.com) * [Install the CLI](/cli/overview) The steps apply to the following non-exhaustive list of frameworks: * [Express](https://expressjs.com) * [Fastify](https://www.fastify.io) * [Koa](https://koajs.com) ## Initialize Infisical for your app ```bash theme={"dark"} # navigate to the root of your of your project cd /path/to/project # then initialize Infisical infisical init ``` ## Start your application as usual but with Infisical ```bash theme={"dark"} infisical run -- # Example infisical run -- npm run dev ``` --- # Source: https://infisical.com/docs/documentation/platform/pki/ca/external-ca.md > ## Documentation Index > Fetch the complete documentation index at: https://infisical.com/docs/llms.txt > Use this file to discover all available pages before exploring further. # External CA > Learn how to connect External Certificate Authorities with Infisical. ## Concept Infisical lets you integrate with External Certificate Authorities (CAs), allowing you to use existing PKI infrastructure or connect to public CAs to issue certificates for your end-entities.
```mermaid theme={"dark"} graph TD A1[External Public CA
e.g. Let's Encrypt, ZeroSSL, ...] --> Infisical A2[External Private CA
e.g. AWS Private CA, HashiCorp Vault PKI, ...] --> Infisical ```
As shown above, these CAs commonly fall under two categories: * External Private CAs: CAs like AWS Private CA, HashiCorp Vault PKI, Azure ADCS, etc. that are privately owned and are used to issue certificates for internal services; these are often either cloud-hosted private CAs or on-prem / enterprise CAs. * External Public CAs: CAs like Let's Encrypt, DigiCert, GlobalSign, etc. that are publicly trusted and are used to issue certificates for public-facing services. Note that Infisical can act as an *ACME client*, allowing you to integrate upstream with any [ACME-compatible CA](/documentation/platform/pki/ca/acme-ca) to automate certificate issuance and renewal. ## Workflow A typical workflow for integrating an External CA with Infisical consists of choosing the desired External CA type and specifying the configuration or connection details necessary to connect to the CA. The specific steps and requirements vary depending on the External CA type you choose to integrate. ## Supported External CA Types Infisical currently supports the following External CA types out of the box: * [ACME CA](/documentation/platform/pki/ca/acme-ca): An ACME-compatible CA that supports the ACME protocol, such as Let's Encrypt, ZeroSSL, Buypass, Digicert, etc. * [Azure ADCS](/documentation/platform/pki/ca/azure-adcs): A Microsoft Active Directory Certificate Services (ADCS) that supports the ADCS protocol, such as AWS Private CA, Azure ADCS, etc. If you don’t see a specific external CA listed here or need a dedicated integration guide, please reach out to [sales@infisical.com](mailto:sales@infisical.com) and we’ll help you set up the integration for your external CA. ## FAQ Yes. You can have both Private and External CAs in the same project. --- # Source: https://infisical.com/docs/self-hosting/faq.md # Source: https://infisical.com/docs/cli/faq.md > ## Documentation Index > Fetch the complete documentation index at: https://infisical.com/docs/llms.txt > Use this file to discover all available pages before exploring further. # FAQ > Frequently Asked Questions about Infisical CLI Frequently asked questions about the CLI can be found on this page. If you can't find the answer you are looking for, please create an issue on our GitHub repository or join our Slack channel for additional support. By default, the CLI will choose the most suitable store available on your system. If you experience issues with the default store, you can switch to a different one. If none of the available stores work for you, you can try using the `file` store type by running `infisical vault set file`, which should work in most cases. If you are still experiencing trouble, please seek support. [Learn more about vault command](./commands/vault) Yes. If you have previously retrieved secrets for a specific project and environment (such as dev, staging, or prod), the `run`/`secret` command will utilize the saved secrets, even when offline, on subsequent fetch attempts. Yes. This is simply a configuration file and contains no sensitive data. Visit the Infisical website and navigate to a project of your choice. Once on the project page, access the **Project Settings** from the sidebar. Within the Project name section, click the "Copy Project ID" button for copying the current Project ID to clipboard, or simply obtain it from the URL of the current page. ``` https://app.infisical.com/project//settings ``` The Infisical CLI supports custom HTTP headers for requests to servers that require additional authentication. Set these headers using the `INFISICAL_CUSTOM_HEADERS` environment variable: ```bash theme={"dark"} export INFISICAL_CUSTOM_HEADERS="Access-Client-Id=your-client-id Access-Client-Secret=your-client-secret" ``` After setting this environment variable, run your Infisical commands as usual. Custom headers are necessary when your Infisical server is protected by services like Cloudflare Access or other reverse proxies that require specific authentication headers. Without this feature, you would need to implement security workarounds that might compromise your security posture. Custom headers should be specified in the format `headername1=headervalue1 headername2=headervalue2`, with spaces separating each header-value pair. For example: ```bash theme={"dark"} export INFISICAL_CUSTOM_HEADERS="Header1=value1 Header2=value2 Header3=value3" ``` --- # Source: https://infisical.com/docs/integrations/frameworks/fiber.md > ## Documentation Index > Fetch the complete documentation index at: https://infisical.com/docs/llms.txt > Use this file to discover all available pages before exploring further. # Fiber > How to use Infisical to inject environment variables and secrets into a Fiber app. Prerequisites: * Set up and add envars to [Infisical Cloud](https://app.infisical.com) * [Install the CLI](/cli/overview) ## Initialize Infisical for your [Fiber](https://gofiber.io/) app ```bash theme={"dark"} # navigate to the root of your of your project cd /path/to/project # then initialize Infisical infisical init ``` ## Start your application as usual but with Infisical ```bash theme={"dark"} infisical run -- # Example infisical run -- go run server.go ``` --- # Source: https://infisical.com/docs/api-reference/endpoints/integrations/find-auth.md # Get Auth By ID > Get details of an integration authorization by auth object id. ## OpenAPI ````yaml GET /api/v1/integration-auth/{integrationAuthId} paths: path: /api/v1/integration-auth/{integrationAuthId} method: get servers: - url: https://us.infisical.com description: Production server (US) - url: https://eu.infisical.com description: Production server (EU) - url: http://localhost:8080 description: Local server request: security: - title: bearerAuth parameters: query: {} header: Authorization: type: http scheme: bearer description: An access token in Infisical cookie: {} parameters: path: integrationAuthId: schema: - type: string required: true description: The ID of integration authentication object. query: {} header: {} cookie: {} body: {} response: '200': application/json: schemaArray: - type: object properties: integrationAuth: allOf: - type: object properties: id: type: string format: uuid projectId: type: string integration: type: string teamId: type: string nullable: true url: type: string nullable: true namespace: type: string nullable: true accountId: type: string nullable: true metadata: nullable: true createdAt: type: string format: date-time updatedAt: type: string format: date-time required: - id - projectId - integration - createdAt - updatedAt additionalProperties: false requiredProperties: - integrationAuth additionalProperties: false examples: example: value: integrationAuth: id: 3c90c3cc-0d44-4b50-8888-8dd25736052a projectId: integration: teamId: url: namespace: accountId: metadata: createdAt: '2023-11-07T05:31:56Z' updatedAt: '2023-11-07T05:31:56Z' description: Default Response '400': application/json: schemaArray: - type: object properties: reqId: allOf: - type: string statusCode: allOf: - type: number enum: - 400 message: allOf: - type: string error: allOf: - type: string requiredProperties: - reqId - statusCode - message - error additionalProperties: false examples: example: value: reqId: statusCode: 400 message: error: description: Default Response '401': application/json: schemaArray: - type: object properties: reqId: allOf: - type: string statusCode: allOf: - type: number enum: - 401 message: allOf: - type: string error: allOf: - type: string requiredProperties: - reqId - statusCode - message - error additionalProperties: false examples: example: value: reqId: statusCode: 401 message: error: description: Default Response '403': application/json: schemaArray: - type: object properties: reqId: allOf: - type: string statusCode: allOf: - type: number enum: - 403 message: allOf: - type: string details: allOf: - {} error: allOf: - type: string requiredProperties: - reqId - statusCode - message - error additionalProperties: false examples: example: value: reqId: statusCode: 403 message: details: error: description: Default Response '404': application/json: schemaArray: - type: object properties: reqId: allOf: - type: string statusCode: allOf: - type: number enum: - 404 message: allOf: - type: string error: allOf: - type: string requiredProperties: - reqId - statusCode - message - error additionalProperties: false examples: example: value: reqId: statusCode: 404 message: error: description: Default Response '422': application/json: schemaArray: - type: object properties: reqId: allOf: - type: string statusCode: allOf: - type: number enum: - 422 message: allOf: - {} error: allOf: - type: string requiredProperties: - reqId - statusCode - error additionalProperties: false examples: example: value: reqId: statusCode: 422 message: error: description: Default Response '500': application/json: schemaArray: - type: object properties: reqId: allOf: - type: string statusCode: allOf: - type: number enum: - 500 message: allOf: - type: string error: allOf: - type: string requiredProperties: - reqId - statusCode - message - error additionalProperties: false examples: example: value: reqId: statusCode: 500 message: error: description: Default Response deprecated: false type: path components: schemas: {} ```` --- # Source: https://infisical.com/docs/api-reference/endpoints/identity-specific-privilege/v2/find-by-id.md > ## Documentation Index > Fetch the complete documentation index at: https://infisical.com/docs/llms.txt > Use this file to discover all available pages before exploring further. # Find By ID > Retrieve details of a specific privilege by id. ## OpenAPI ````yaml GET /api/v2/identity-project-additional-privilege/{id} openapi: 3.0.3 info: title: Infisical API description: List of all available APIs that can be consumed version: 0.0.1 servers: - url: https://us.infisical.com description: Production server (US) - url: https://eu.infisical.com description: Production server (EU) - url: http://localhost:8080 description: Local server security: [] paths: /api/v2/identity-project-additional-privilege/{id}: get: tags: - Identity Specific Privileges V2 description: Retrieve details of a specific privilege by id. operationId: getIdentityProjectAdditionalPrivilege parameters: - schema: type: string minLength: 1 in: path name: id required: true description: The ID of the identity privilege. responses: '200': description: Default Response content: application/json: schema: type: object properties: privilege: type: object properties: id: type: string format: uuid slug: type: string isTemporary: type: boolean default: false temporaryMode: type: string nullable: true temporaryRange: type: string nullable: true temporaryAccessStartTime: type: string format: date-time nullable: true temporaryAccessEndTime: type: string format: date-time nullable: true permissions: type: array items: type: object properties: subject: anyOf: - type: string minLength: 1 - type: array items: type: string action: anyOf: - type: string minLength: 1 - type: array items: type: string conditions: {} inverted: type: boolean required: - action additionalProperties: false createdAt: type: string format: date-time updatedAt: type: string format: date-time required: - id - slug - permissions - createdAt - updatedAt additionalProperties: false required: - privilege additionalProperties: false '400': description: Default Response content: application/json: schema: type: object properties: reqId: type: string statusCode: type: number enum: - 400 message: type: string error: type: string details: {} required: - reqId - statusCode - message - error additionalProperties: false '401': description: Default Response content: application/json: schema: type: object properties: reqId: type: string statusCode: type: number enum: - 401 message: type: string error: type: string required: - reqId - statusCode - message - error additionalProperties: false '403': description: Default Response content: application/json: schema: type: object properties: reqId: type: string statusCode: type: number enum: - 403 message: type: string details: {} error: type: string required: - reqId - statusCode - message - error additionalProperties: false '404': description: Default Response content: application/json: schema: type: object properties: reqId: type: string statusCode: type: number enum: - 404 message: type: string error: type: string required: - reqId - statusCode - message - error additionalProperties: false '422': description: Default Response content: application/json: schema: type: object properties: reqId: type: string statusCode: type: number enum: - 422 message: {} error: type: string required: - reqId - statusCode - error additionalProperties: false '500': description: Default Response content: application/json: schema: type: object properties: reqId: type: string statusCode: type: number enum: - 500 message: type: string error: type: string required: - reqId - statusCode - message - error additionalProperties: false security: - bearerAuth: [] components: securitySchemes: bearerAuth: type: http scheme: bearer bearerFormat: JWT description: An access token in Infisical ```` --- # Source: https://infisical.com/docs/api-reference/endpoints/identity-specific-privilege/v2/find-by-slug.md # Source: https://infisical.com/docs/api-reference/endpoints/identity-specific-privilege/v1/find-by-slug.md > ## Documentation Index > Fetch the complete documentation index at: https://infisical.com/docs/llms.txt > Use this file to discover all available pages before exploring further. # Find By Slug > Retrieve details of a specific privilege by privilege slug. ## OpenAPI ````yaml GET /api/v1/additional-privilege/identity/{privilegeSlug} openapi: 3.0.3 info: title: Infisical API description: List of all available APIs that can be consumed version: 0.0.1 servers: - url: https://us.infisical.com description: Production server (US) - url: https://eu.infisical.com description: Production server (EU) - url: http://localhost:8080 description: Local server security: [] paths: /api/v1/additional-privilege/identity/{privilegeSlug}: get: tags: - Identity Specific Privileges description: Retrieve details of a specific privilege by privilege slug. parameters: - schema: type: string minLength: 1 in: query name: identityId required: true description: The ID of the machine identity to list. - schema: type: string minLength: 1 in: query name: projectSlug required: true description: The slug of the project of the identity in. - schema: type: string minLength: 1 in: path name: privilegeSlug required: true description: The slug of the privilege. responses: '200': description: Default Response content: application/json: schema: type: object properties: privilege: type: object properties: id: type: string format: uuid slug: type: string projectMembershipId: type: string format: uuid isTemporary: type: boolean default: false temporaryMode: type: string nullable: true temporaryRange: type: string nullable: true temporaryAccessStartTime: type: string format: date-time nullable: true temporaryAccessEndTime: type: string format: date-time nullable: true permissions: type: array items: type: object properties: subject: anyOf: - type: string minLength: 1 - type: array items: type: string action: anyOf: - type: string minLength: 1 - type: array items: type: string conditions: {} inverted: type: boolean required: - action additionalProperties: false createdAt: type: string format: date-time updatedAt: type: string format: date-time required: - id - slug - projectMembershipId - permissions - createdAt - updatedAt additionalProperties: false required: - privilege additionalProperties: false '400': description: Default Response content: application/json: schema: type: object properties: reqId: type: string statusCode: type: number enum: - 400 message: type: string error: type: string details: {} required: - reqId - statusCode - message - error additionalProperties: false '401': description: Default Response content: application/json: schema: type: object properties: reqId: type: string statusCode: type: number enum: - 401 message: type: string error: type: string required: - reqId - statusCode - message - error additionalProperties: false '403': description: Default Response content: application/json: schema: type: object properties: reqId: type: string statusCode: type: number enum: - 403 message: type: string details: {} error: type: string required: - reqId - statusCode - message - error additionalProperties: false '404': description: Default Response content: application/json: schema: type: object properties: reqId: type: string statusCode: type: number enum: - 404 message: type: string error: type: string required: - reqId - statusCode - message - error additionalProperties: false '422': description: Default Response content: application/json: schema: type: object properties: reqId: type: string statusCode: type: number enum: - 422 message: {} error: type: string required: - reqId - statusCode - error additionalProperties: false '500': description: Default Response content: application/json: schema: type: object properties: reqId: type: string statusCode: type: number enum: - 500 message: type: string error: type: string required: - reqId - statusCode - message - error additionalProperties: false security: - bearerAuth: [] components: securitySchemes: bearerAuth: type: http scheme: bearer bearerFormat: JWT description: An access token in Infisical ```` --- # Source: https://infisical.com/docs/integrations/frameworks/flask.md > ## Documentation Index > Fetch the complete documentation index at: https://infisical.com/docs/llms.txt > Use this file to discover all available pages before exploring further. # Flask > How to use Infisical to inject environment variables and secrets into a Flask app. Prerequisites: * Set up and add envars to [Infisical Cloud](https://app.infisical.com) * [Install the CLI](/cli/overview) ## Initialize Infisical for your [Flask](https://flask.palletsprojects.com/en/2.2.x) app ```bash theme={"dark"} # navigate to the root of your of your project cd /path/to/project # then initialize Infisical infisical init ``` ## Start your application as usual but with Infisical ```bash theme={"dark"} infisical run -- # Example infisical run -- flask run ``` --- # Source: https://infisical.com/docs/integrations/secret-syncs/flyio.md # Source: https://infisical.com/docs/integrations/app-connections/flyio.md > ## Documentation Index > Fetch the complete documentation index at: https://infisical.com/docs/llms.txt > Use this file to discover all available pages before exploring further. # Fly.io Connection > Learn how to configure a Fly.io Connection for Infisical. Infisical supports the use of [Access Tokens](https://fly.io/docs/security/tokens/) to connect with Fly.io. ## Create Fly.io Access Token Dashboard Page Click Create Token Ensure that you give this token access to the correct app, then click 'Create Token'. Create Token Page After clicking 'Create Token', a modal containing your access token will appear. Save this token for later steps. ## Create Fly.io Connection in Infisical In your Infisical dashboard, navigate to the **Integrations** tab in the desired project, then select **App Connections**. App Connections Tab Click the **+ Add Connection** button and select the **Fly.io Connection** option from the available integrations. Select Fly.io Connection Complete the Fly.io Connection form by entering: * A descriptive name for the connection * An optional description for future reference * The Access Token from earlier steps Fly.io Connection Modal After clicking Create, your **Fly.io Connection** is established and ready to use with your Infisical project. Fly.io Connection Created To create a Fly.io Connection, make an API request to the [Create Fly.io Connection](/api-reference/endpoints/app-connections/flyio/create) API endpoint. ### Sample request ```bash Request theme={"dark"} curl --request POST \ --url https://app.infisical.com/api/v1/app-connections/flyio \ --header 'Content-Type: application/json' \ --data '{ "name": "my-flyio-connection", "method": "access-token", "projectId": "7ffbb072-2575-495a-b5b0-127f88caef78", "credentials": { "accessToken": "[PRIVATE TOKEN]" } }' ``` ### Sample response ```bash Response theme={"dark"} { "appConnection": { "id": "e5d18aca-86f7-4026-a95e-efb8aeb0d8e6", "name": "my-flyio-connection", "projectId": "7ffbb072-2575-495a-b5b0-127f88caef78", "description": null, "version": 1, "orgId": "6f03caa1-a5de-43ce-b127-95a145d3464c", "createdAt": "2025-04-23T19:46:34.831Z", "updatedAt": "2025-04-23T19:46:34.831Z", "isPlatformManagedCredentials": false, "credentialsHash": "7c2d371dec195f82a6a0d5b41c970a229cfcaf88e894a5b6395e2dbd0280661f", "app": "flyio", "method": "access-token", "credentials": {} } } ``` --- # Source: https://infisical.com/docs/contributing/platform/backend/folder-structure.md > ## Documentation Index > Fetch the complete documentation index at: https://infisical.com/docs/llms.txt > Use this file to discover all available pages before exploring further. # Backend folder structure ``` ├── scripts ├── e2e-test ├── bdd └── src/ ├── @types/ │ ├── knex.d.ts │ ├── fastify.d.ts │ ├── ... ├── db/ │ ├── migrations │ ├── schemas │ └── seeds ├── keystore/ ├── lib/ │ ├── api-docs │ ├── aws │ ├── axios │ ├── base64 │ ├── casl │ ├── certificates │ ├── config │ ├── crypto │ ├── dates │ ├── delay │ ├── error-codes │ ├── errors │ ├── files │ ├── fn │ ├── ... ├── queue ├── server/ │ ├── routes/ │ │ ├── v1 │ │ ├── v2 │ │ ├── v3 │ │ └── v4 │ ├── plugins │ ├── config │ └── lib ├── services/ │ ├── auth │ ├── org │ ├── ... │ └── project/ │ ├── project-service.ts │ ├── project-types.ts │ └── project-dal.ts └── ee/ ├── routes └── services ``` ### `backend/scripts` Contains reusable scripts for backend automation, like running migrations and generating SQL schemas. ### `backend/e2e-test` Integration tests for the APIs. ### `backend/bdd` Behavior-Driven Development (BDD) tests using Python and Gherkin feature files. ### `backend/src` The source code of the backend. * `@types`: Type definitions for libraries like Fastify, Knex, and other third-party dependencies. * `db`: Knex.js configuration for the database, including migrations, seed files, and SQL type schemas. * `keystore`: Key-value store abstraction layer supporting Redis and PostgreSQL for application caching, distributed locking, and coordination. * `lib`: Stateless, reusable functions used across the codebase, organized by functionality (crypto, config, dates, etc.). * `queue`: Infisical's queue system based on BullMQ. ### `src/server` * Scope anything related to Fastify/service here. * Includes routes, Fastify plugins, server configurations, and server-specific utilities. * The routes folder contains various versions of routes separated into v1, v2, v3, v4, etc. ### `src/services` * Handles the core business logic for all operations. * Follows the co-location principle: related components should be kept together. * Each service component typically contains: 1. **dal**: Database Access Layer functions for database operations 2. **service**: The service layer containing business logic. 3. **type**: Type definitions used within the service component. 4. **fns**: An optional component for sharing reusable functions related to the service. 5. **queue**: An optional component for queue-specific logic, like `secret-queue.ts`. ### `src/ee` Follows the same pattern as above, with the exception of a license change from MIT to Infisical Proprietary License. ### Guidelines and Best Practices * All services are interconnected at `/src/server/routes/index.ts`, following the principle of simple dependency injection. * Files should be named in dash-case. * Avoid using classes in the codebase; opt for simple functions instead. * All committed code must be properly linted using `npm run lint:fix` and type-checked with `npm run type:check`. * Minimize shared logic between services as much as possible. * Controllers within a router component should ideally call only one service layer, with exceptions for services like `audit-log` that require access to request object data. --- # Source: https://infisical.com/docs/documentation/platform/folder.md > ## Documentation Index > Fetch the complete documentation index at: https://infisical.com/docs/llms.txt > Use this file to discover all available pages before exploring further. # Folders > Learn how to organize secrets with folders. Infisical Folders enable users to organize secrets using custom structures dependent on the intended use case (also known as **path-based secret storage**). It is great for organizing secrets around hierarchies with multiple services or types of secrets involved at large quantities. Infisical Folders can be infinitely nested to mirror your application architecture – whether it's microservices, monorepos, or any logical grouping that best suits your needs. Consider the following structure for a microservice architecture: ``` | service1 |---- envars |---- users |-------- tokens1 |-------- tokens2 | service2 |---- envars ... ``` In this example, we store environment variables for each microservice under each respective `/envars` folder. We also store user-specific secrets for micro-service 1 under `/service1/users`. With this folder structure in place, your applications only need to specify a path like `/microservice1/envars` to fetch secrets from there. By extending this example, you can see how path-based secret storage provides a versatile approach to manage secrets for any architecture. ## Managing folders To add a folder, press the downward chevron to the right of the **Add Secret** button; then press on the **Add Folder** button. Folder names can only contain alphabets, numbers, and dashes add folder To delete a folder, hover over it and press the **X** button that appears on the right side. delete folder ### Comparing folders It's possible to compare the contents of folders across environments in the **Secrets Overview** page. When you click on a folder, the table will display the items within it across environments. In the image below, you can see that the **Development** environment is the only one that contains items in the `/users` folder, being other folders `/user-a`, `/user-b`, ... `/user-f`. comparing folders ### Replicating Folder Contents If you want to copy secrets or folders from one path to another, you can utilize the **Replicate Secrets** functionality located in the **Add Secret** dropdown. replicate secrets replicate secrets modal First, select the **Source Environment** and the **Source Root Path** you want to copy secrets *from*. In the example provided, we select `/dev-folder` as the source root path from the Development environment. This means any secrets within `/dev-folder` from Development will be replicated. By default, these secrets are copied into the *currently active* folder/path in your target environment (e.g., the root folder of your Staging environment in this scenario). As a final step, you can select the specific secrets you wish to copy and then click **Replicate Secrets**. replicate secrets modal The result shows two secrets successfully copied from the `/dev-folder` in the Development environment into the root folder of the Staging environment. If you do not select a **Source Root Path**, the replication will consider the contents of the *entire root* of the **Source Environment** (e.g., the Development environment). In this example that would mean copying the `/dev-folder` itself rather than just its contents. --- # Source: https://infisical.com/docs/integrations/framework-integrations.md > ## Documentation Index > Fetch the complete documentation index at: https://infisical.com/docs/llms.txt > Use this file to discover all available pages before exploring further. # Framework Integrations > Browse and search through all available framework integrations for Infisical. export const FrameworkIntegrationsBrowser = () => { const [searchTerm, setSearchTerm] = useState(''); const integrations = [{ "name": "React", "slug": "react", "path": "/integrations/frameworks/react", "description": "Learn how to integrate Infisical with React applications for secure secret management.", "category": "Web Frameworks" }, { "name": "Next.js", "slug": "nextjs", "path": "/integrations/frameworks/nextjs", "description": "Learn how to integrate Infisical with Next.js applications.", "category": "Web Frameworks" }, { "name": "Vue", "slug": "vuejs", "path": "/integrations/frameworks/vue", "description": "Learn how to integrate Infisical with Vue.js applications.", "category": "Web Frameworks" }, { "name": "Nuxt", "slug": "nuxtjs", "path": "/integrations/frameworks/nuxt", "description": "Learn how to integrate Infisical with Nuxt.js applications.", "category": "Web Frameworks" }, { "name": "SvelteKit", "slug": "sveltekit", "path": "/integrations/frameworks/sveltekit", "description": "Learn how to integrate Infisical with SvelteKit applications.", "category": "Web Frameworks" }, { "name": "Express, Fastify, Koa", "slug": "express", "path": "/integrations/frameworks/express", "description": "Learn how to integrate Infisical with Express.js backend applications.", "category": "Web Frameworks" }, { "name": "NestJS", "slug": "nestjs", "path": "/integrations/frameworks/nestjs", "description": "Learn how to integrate Infisical with NestJS applications.", "category": "Web Frameworks" }, { "name": "Django", "slug": "django", "path": "/integrations/frameworks/django", "description": "Learn how to integrate Infisical with Django applications.", "category": "Web Frameworks" }, { "name": "Flask", "slug": "flask", "path": "/integrations/frameworks/flask", "description": "Learn how to integrate Infisical with Flask applications.", "category": "Web Frameworks" }, { "name": "Ruby on Rails", "slug": "rails", "path": "/integrations/frameworks/rails", "description": "Learn how to integrate Infisical with Ruby on Rails applications.", "category": "Web Frameworks" }, { "name": "Spring Boot", "slug": "spring-boot-maven", "path": "/integrations/frameworks/spring-boot-maven", "description": "Learn how to integrate Infisical with Spring Boot applications.", "category": "Web Frameworks" }, { "name": "Laravel", "slug": "laravel", "path": "/integrations/frameworks/laravel", "description": "Learn how to integrate Infisical with Laravel applications.", "category": "Web Frameworks" }, { "name": ".NET", "slug": "dotnet", "path": "/integrations/frameworks/dotnet", "description": "Learn how to integrate Infisical with .NET applications.", "category": "Web Frameworks" }, { "name": "Fiber", "slug": "fiber", "path": "/integrations/frameworks/fiber", "description": "Learn how to integrate Infisical with Fiber (Go) framework.", "category": "Web Frameworks" }, { "name": "Gatsby", "slug": "gatsby", "path": "/integrations/frameworks/gatsby", "description": "Learn how to integrate Infisical with Gatsby applications.", "category": "Web Frameworks" }, { "name": "Remix", "slug": "remix", "path": "/integrations/frameworks/remix", "description": "Learn how to integrate Infisical with Remix applications.", "category": "Web Frameworks" }, { "name": "Vite", "slug": "vite", "path": "/integrations/frameworks/vite", "description": "Learn how to integrate Infisical with Vite applications.", "category": "Web Frameworks" }, { "name": "AB Initio", "slug": "ab-initio", "path": "/integrations/frameworks/ab-initio", "description": "Learn how to integrate Infisical with AB Initio applications.", "category": "Web Frameworks" }].sort(function (a, b) { return a.name.toLowerCase().localeCompare(b.name.toLowerCase()); }); const filteredIntegrations = useMemo(() => { if (searchTerm) { return integrations.filter(integration => integration.name.toLowerCase().includes(searchTerm.toLowerCase()) || integration.description.toLowerCase().includes(searchTerm.toLowerCase())); } return integrations; }, [searchTerm]); return
{}
setSearchTerm(e.target.value)} />
{}

{filteredIntegrations.length} framework integration{filteredIntegrations.length !== 1 ? 's' : ''} found {searchTerm && ` for "${searchTerm}"`}

{} {filteredIntegrations.length > 0 ?
{filteredIntegrations.map((integration, index) =>

{integration.name}

{integration.description}

)}
:

No framework integrations found matching your criteria

{searchTerm &&

Try adjusting your search terms or filters

}
}
; }; --- # Source: https://infisical.com/docs/documentation/platform/gateways/gateway-deployment.md > ## Documentation Index > Fetch the complete documentation index at: https://infisical.com/docs/llms.txt > Use this file to discover all available pages before exploring further. # Gateway Deployment > Complete guide to deploying Infisical Gateways including network configuration and firewall requirements Infisical Gateways enables secure communication between your private resources and the Infisical platform without exposing inbound ports in your network. This guide covers everything you need to deploy and configure Infisical Gateways. ## Deployment Steps To successfully deploy an Infisical Gateway for use, follow these steps in order. Create a machine identity with the correct permissions to create and manage gateways. This identity is used by the gateway to authenticate with Infisical and should be provisioned in advance. The gateway supports several [machine identity auth methods](/documentation/platform/identities/machine-identities), as listed below. Choose the one that best fits your environment and set the corresponding environment variables when deploying the gateway. Simple and secure authentication using client ID and client secret. **Environment Variables:** * `INFISICAL_AUTH_METHOD=universal-auth` * `INFISICAL_UNIVERSAL_AUTH_CLIENT_ID=` * `INFISICAL_UNIVERSAL_AUTH_CLIENT_SECRET=` Direct authentication using a machine identity access token. **Environment Variables:** * `INFISICAL_TOKEN=` Authentication using Kubernetes service account tokens. **Environment Variables:** * `INFISICAL_AUTH_METHOD=kubernetes` * `INFISICAL_MACHINE_IDENTITY_ID=` Authentication using AWS IAM roles. **Environment Variables:** * `INFISICAL_AUTH_METHOD=aws-iam` * `INFISICAL_MACHINE_IDENTITY_ID=` Authentication using GCP identity tokens. **Environment Variables:** * `INFISICAL_AUTH_METHOD=gcp-id-token` * `INFISICAL_MACHINE_IDENTITY_ID=` Authentication using GCP service account keys. **Environment Variables:** * `INFISICAL_AUTH_METHOD=gcp-iam` * `INFISICAL_MACHINE_IDENTITY_ID=` * `INFISICAL_GCP_SERVICE_ACCOUNT_KEY_FILE_PATH=` Authentication using Azure managed identity. **Environment Variables:** * `INFISICAL_AUTH_METHOD=azure` * `INFISICAL_MACHINE_IDENTITY_ID=` Authentication using OIDC identity tokens. **Environment Variables:** * `INFISICAL_AUTH_METHOD=oidc-auth` * `INFISICAL_MACHINE_IDENTITY_ID=` * `INFISICAL_JWT=` Authentication using JWT tokens. **Environment Variables:** * `INFISICAL_AUTH_METHOD=jwt-auth` * `INFISICAL_MACHINE_IDENTITY_ID=` * `INFISICAL_JWT=` Ensure a relay server is running and accessible before you deploy any gateways. You have two options: * **Managed relay (Infisical Cloud, US/EU only):** Managed relays are only available for Infisical Cloud instances in the US and EU regions. If you are using Infisical Cloud in these regions, you can use the provided managed relay. * **Self-hosted relay:** For all other cases, including all self-hosted and dedicated enterprise instances of Infisical, you must deploy your own relay server. You can also choose to deploy your own relay server when using Infisical Cloud if you require reduced geographic proximity to your target resources for lower latency or to reduce network congestion. For setup instructions, see the [Relay Deployment Guide](/documentation/platform/gateways/relay-deployment). Make sure the Infisical CLI is installed on the machine or environment where you plan to deploy the gateway. The CLI is required for gateway installation and management. See the [CLI Installation Guide](/cli/overview) for instructions. Ensure your network and firewall settings allow the gateway to connect to all required services. All connections are outbound only; no inbound ports need to be opened. | Protocol | Destination | Port | Purpose | | -------- | -------------------------------------- | ---- | ------------------------------------------ | | TCP | Relay Server IP/Hostname | 2222 | SSH reverse tunnel establishment | | TCP | Infisical instance host (US/EU, other) | 443 | API communication and certificate requests | For managed relays, allow outbound traffic to the provided relay server IP/hostname. For self-hosted relays, allow outbound traffic to your own relay server address. If you are in a corporate environment with strict egress filtering, ensure outbound TCP 2222 to relay servers and outbound HTTPS 443 to Infisical API endpoints are allowed. The Infisical CLI is used to install and start the gateway in your chosen environment. The CLI provides commands for both production and development scenarios, and supports a variety of options/flags to configure your deployment. To view all available flags and equivalent environment variables for gateway deployment, see the [Gateway CLI Command Reference](/cli/commands/gateway). For production deployments on Linux servers, install the Gateway as a systemd service so that it runs securely in the background and automatically restarts on failure or system reboot: ```bash theme={"dark"} sudo infisical gateway systemd install --token --domain --name sudo systemctl start infisical-gateway ``` By default, the gateway connects to the most optimal relay. Use the `--target-relay-name` flag to manually specify a different relay server. The systemd install command requires a Linux operating system with root/sudo privileges. For production deployments on Kubernetes clusters, install the Gateway using the Infisical Helm chart: #### Install the latest Helm Chart repository ```bash theme={"dark"} helm repo add infisical-helm-charts 'https://dl.cloudsmith.io/public/infisical/helm-charts/helm/charts/' helm repo update ``` #### Create a Kubernetes Secret The gateway supports all identity authentication methods through environment variables: ```bash theme={"dark"} kubectl create secret generic infisical-gateway-environment \ --from-literal=INFISICAL_AUTH_METHOD=universal-auth \ --from-literal=INFISICAL_UNIVERSAL_AUTH_CLIENT_ID= \ --from-literal=INFISICAL_UNIVERSAL_AUTH_CLIENT_SECRET= \ --from-literal=INFISICAL_GATEWAY_NAME= ``` By default, the gateway connects to the most optimal relay. Use the `--from-literal=INFISICAL_RELAY_NAME=` flag to manually specify a different relay server. #### Install the Gateway ```bash theme={"dark"} helm install infisical-gateway infisical-helm-charts/infisical-gateway ``` For development or testing environments: ```bash theme={"dark"} sudo infisical gateway start --token --name= ``` By default, the gateway connects to the most optimal relay. Use the `--target-relay-name` flag to manually specify a different relay server. After deployment, verify your gateway is working: 1. **Check logs** for "Gateway started successfully" message indicating the gateway is running and connected to the relay 2. **Verify registration** in the Infisical by visiting the Gateways section of your organization. The new gateway should appear with a recent heartbeat timestamp. 3. **Test connectivity** by creating a resource in Infisical that uses the gateway to access a private service. Verify the resource can successfully connect through the gateway. ## Frequently Asked Questions No inbound ports need to be opened for gateways. The gateway only makes outbound connections: * **Outbound SSH** to relay servers on port 2222 * **Outbound HTTPS** to Infisical API endpoints on port 443 * **SSH reverse tunnels** handle all communication - no return traffic configuration needed This design maintains security by avoiding the need for inbound firewall rules that could expose your network to external threats. Test relay connectivity and outbound API access from the gateway: 1. Test SSH port to relay: ```bash theme={"dark"} nc -zv 2222 ``` 2. Test outbound API access (replace with your Infisical domain if different): ```bash theme={"dark"} curl -I https://app.infisical.com ``` If the gateway cannot connect to the relay: 1. Verify the relay server is running and accessible 2. Check firewall rules allow outbound connections on port 2222 3. Confirm the relay name matches exactly 4. Test SSH port to relay: ```bash theme={"dark"} nc -zv 2222 ``` If you encounter authentication failures: 1. Verify machine identity credentials are correct 2. Check token expiration and renewal 3. Ensure authentication method is properly configured Check gateway logs for detailed error information: * **systemd service:** ```bash theme={"dark"} sudo journalctl -u infisical-gateway -f ``` * **Kubernetes:** ```bash theme={"dark"} kubectl logs deployment/infisical-gateway ``` * **Local installation:** Logs appear in the terminal where you started the gateway For systemd-based installations, the gateway's configuration file is stored at `/etc/infisical/gateway.conf`. You may reference or inspect this file for troubleshooting advanced configuration issues. The gateway is designed to handle network interruptions gracefully: * **Automatic reconnection**: The gateway will automatically attempt to reconnect to relay servers if the SSH connection is lost * **Connection retry logic**: Built-in retry mechanisms handle temporary network outages without manual intervention * **Persistent SSH tunnels**: SSH connections are automatically re-established when connectivity is restored * **Certificate rotation**: The gateway handles certificate renewal automatically during reconnection * **Graceful degradation**: The gateway logs connection issues and continues attempting to restore connectivity No manual intervention is typically required during network interruptions. --- # Source: https://infisical.com/docs/cli/commands/gateway.md > ## Documentation Index > Fetch the complete documentation index at: https://infisical.com/docs/llms.txt > Use this file to discover all available pages before exploring further. # infisical gateway > Run the Infisical gateway or manage its systemd service ```bash theme={"dark"} sudo infisical gateway start --name= --auth-method= ``` ```bash theme={"dark"} sudo infisical gateway systemd install --token= --domain= --name= ``` ## Description The Infisical gateway provides secure access to private resources using modern TCP-based SSH tunnel architecture with enhanced security and flexible deployment options. The gateway system uses SSH reverse tunnels over TCP, eliminating firewall complexity and providing excellent performance for enterprise environments. **Deprecation and Migration Notice:** The legacy `infisical gateway` command (v1) will be removed in a future release. Please migrate to `infisical gateway start` (Gateway v2). If you are moving from Gateway v1 to Gateway v2, this is NOT a drop-in switch. Gateway v2 creates new gateway instances with new gateway IDs. You must update any existing resources that reference gateway IDs (for example: dynamic secret configs, app connections, or other gateway-bound resources) to point to the new Gateway v2 gateway resource. Until you update those references, traffic will continue to target the old v1 gateway. ## Subcommands & flags Run the Infisical gateway component within your the network where your target resources are located. The gateway establishes an SSH reverse tunnel to a relay server and provides secure access to private resources within your network. ```bash theme={"dark"} sudo infisical gateway start --name= --auth-method= ``` By default, the gateway automatically connects to the relay with the lowest latency. To target a specific relay, use the `--target-relay-name=` flag. Once started, the gateway component will: * Automatically connect to a healthy relay with the lowest latency (unless the `--target-relay-name` flag is specified) * Establish outbound SSH reverse tunnel to relay server (no inbound firewall rules needed) * Authenticate using SSH certificates issued by Infisical * Automatically reconnect if the connection is lost * Provide access to private resources within your network ### Authentication The Gateway supports multiple authentication methods. Below are the available authentication methods, with their respective flags. The Universal Auth method is a simple and secure way to authenticate with Infisical. It requires a client ID and a client secret to authenticate with Infisical. Your machine identity client ID. Your machine identity client secret. The authentication method to use. Must be `universal-auth` when using Universal Auth. ```bash theme={"dark"} sudo infisical gateway start --auth-method=universal-auth --client-id= --client-secret= --name= ``` The Native Kubernetes method is used to authenticate with Infisical when running in a Kubernetes environment. It requires a service account token to authenticate with Infisical. Your machine identity ID. Path to the Kubernetes service account token to use. Default: `/var/run/secrets/kubernetes.io/serviceaccount/token`. The authentication method to use. Must be `kubernetes` when using Native Kubernetes. ```bash theme={"dark"} sudo infisical gateway start --auth-method=kubernetes --machine-identity-id= --name= ``` The Native Azure method is used to authenticate with Infisical when running in an Azure environment. Your machine identity ID. The authentication method to use. Must be `azure` when using Native Azure. ```bash theme={"dark"} sudo infisical gateway start --auth-method=azure --machine-identity-id= --name= ``` The Native GCP ID Token method is used to authenticate with Infisical when running in a GCP environment. Your machine identity ID. The authentication method to use. Must be `gcp-id-token` when using Native GCP ID Token. ```bash theme={"dark"} sudo infisical gateway start --auth-method=gcp-id-token --machine-identity-id= --name= ``` The GCP IAM method is used to authenticate with Infisical with a GCP service account key. Your machine identity ID. Path to your GCP service account key file *(Must be in JSON format!)* The authentication method to use. Must be `gcp-iam` when using GCP IAM. ```bash theme={"dark"} sudo infisical gateway start --auth-method=gcp-iam --machine-identity-id= --service-account-key-file-path= --name= ``` The AWS IAM method is used to authenticate with Infisical with an AWS IAM role while running in an AWS environment like EC2, Lambda, etc. Your machine identity ID. The authentication method to use. Must be `aws-iam` when using Native AWS IAM. ```bash theme={"dark"} sudo infisical gateway start --auth-method=aws-iam --machine-identity-id= --name= ``` The OIDC Auth method is used to authenticate with Infisical via identity tokens with OIDC. Your machine identity ID. The OIDC JWT from the identity provider. The authentication method to use. Must be `oidc-auth` when using OIDC Auth. ```bash theme={"dark"} sudo infisical gateway start --auth-method=oidc-auth --machine-identity-id= --jwt= --name= ``` The JWT Auth method is used to authenticate with Infisical via a JWT token. The JWT token to use for authentication. Your machine identity ID. The authentication method to use. Must be `jwt-auth` when using JWT Auth. ```bash theme={"dark"} sudo infisical gateway start --auth-method=jwt-auth --jwt= --machine-identity-id= --name= ``` You can use the `INFISICAL_TOKEN` environment variable to authenticate with Infisical with a raw machine identity access token. The machine identity access token to use for authentication. ```bash theme={"dark"} sudo infisical gateway start --token= --name= ``` ### Other Flags The name of the relay that this gateway should connect to. The relay must be running and registered before starting the gateway. If this flag is omitted, the gateway will automatically connect to a healthy relay with the lowest latency. ```bash theme={"dark"} # Example sudo infisical gateway start --target-relay-name=my-relay --name=my-gateway --token= ``` **Note:** For Infisical Cloud users using instance relays, the relay infrastructure is already running and managed by Infisical. If using organization relays or self-hosted instance relays, you must first start a relay server. For more information on deploying relays, refer to the [Relay Deployment Guide](/documentation/platform/gateways/relay-deployment). The name of the gateway instance. ```bash theme={"dark"} # Example sudo infisical gateway start --name=my-gateway --token= ``` Domain of your self-hosted Infisical instance. ```bash theme={"dark"} # Example sudo infisical gateway start --domain=https://app.your-domain.com --name= ``` Install and enable the gateway as a systemd service. This command must be run with sudo on Linux. ```bash theme={"dark"} sudo infisical gateway systemd install --token= --domain= --name= ``` ### Requirements * Must be run on Linux * Must be run with root/sudo privileges * Requires systemd ### Flags The machine identity access token to authenticate with Infisical. ```bash theme={"dark"} # Example sudo infisical gateway systemd install --token= --name= ``` You may also expose the token to the CLI by setting the environment variable `INFISICAL_TOKEN` before executing the install command. Domain of your self-hosted Infisical instance. ```bash theme={"dark"} # Example sudo infisical gateway systemd install --domain=https://app.your-domain.com --name= ``` The name of the gateway instance. ```bash theme={"dark"} # Example sudo infisical gateway systemd install --name=my-gateway --token= ``` The name of the relay that this gateway should connect to. The relay must be running and registered before starting the gateway. If this flag is omitted, the gateway will automatically connect to a healthy relay with the lowest latency. ```bash theme={"dark"} # Example sudo infisical gateway systemd install --target-relay-name=my-relay --token= --name= ``` **Note:** For Infisical Cloud users using instance relays, the relay infrastructure is already running and managed by Infisical. If using organization relays or self-hosted instance relays, you must first start a relay server. For more information on deploying relays, refer to the [Relay Deployment Guide](/documentation/platform/gateways/relay-deployment). ### Service Details The systemd service is installed with secure defaults: * Service file: `/etc/systemd/system/infisical-gateway.service` * Config file: `/etc/infisical/gateway.conf` * Runs with restricted privileges: * InaccessibleDirectories=/home * PrivateTmp=yes * Resource limits configured for stability * Automatically restarts on failure * Enabled to start on boot * Maintains persistent SSH reverse tunnel connections to the specified relay * Handles certificate rotation and connection recovery automatically After installation, manage the service with standard systemd commands: ```bash theme={"dark"} sudo systemctl start infisical-gateway # Start the service sudo systemctl stop infisical-gateway # Stop the service sudo systemctl status infisical-gateway # Check service status sudo systemctl disable infisical-gateway # Disable auto-start on boot ``` ## Legacy Gateway Commands **This command is deprecated and will be removed in a future release.** Please migrate to `infisical gateway start` for the new TCP-based SSH tunnel architecture. **Migration required:** If you are currently using Gateway v1 (via `infisical gateway`), moving to Gateway v2 is not in-place. Gateway v2 provisions new gateway instances with new gateway IDs. Update any resources that reference a gateway ID (for example: dynamic secret configs, app connections, or other gateway-bound resources) to use the new Gateway v2 gateway ID. Until you update those references, traffic will continue to target the old v1 gateway. Run the legacy Infisical gateway in the foreground. The gateway will connect to the relay service and maintain a persistent connection. ```bash theme={"dark"} infisical gateway --domain= --auth-method= ``` ### Authentication The Infisical CLI supports multiple authentication methods. Below are the available authentication methods, with their respective flags. The Universal Auth method is a simple and secure way to authenticate with Infisical. It requires a client ID and a client secret to authenticate with Infisical. Your machine identity client ID. Your machine identity client secret. The authentication method to use. Must be `universal-auth` when using Universal Auth. ```bash theme={"dark"} infisical gateway --auth-method=universal-auth --client-id= --client-secret= ``` The Native Kubernetes method is used to authenticate with Infisical when running in a Kubernetes environment. It requires a service account token to authenticate with Infisical. Your machine identity ID. Path to the Kubernetes service account token to use. Default: `/var/run/secrets/kubernetes.io/serviceaccount/token`. The authentication method to use. Must be `kubernetes` when using Native Kubernetes. ```bash theme={"dark"} infisical gateway --auth-method=kubernetes --machine-identity-id= ``` The Native Azure method is used to authenticate with Infisical when running in an Azure environment. Your machine identity ID. The authentication method to use. Must be `azure` when using Native Azure. ```bash theme={"dark"} infisical gateway --auth-method=azure --machine-identity-id= ``` The Native GCP ID Token method is used to authenticate with Infisical when running in a GCP environment. Your machine identity ID. The authentication method to use. Must be `gcp-id-token` when using Native GCP ID Token. ```bash theme={"dark"} infisical gateway --auth-method=gcp-id-token --machine-identity-id= ``` The GCP IAM method is used to authenticate with Infisical with a GCP service account key. Your machine identity ID. Path to your GCP service account key file *(Must be in JSON format!)* The authentication method to use. Must be `gcp-iam` when using GCP IAM. ```bash theme={"dark"} infisical gateway --auth-method=gcp-iam --machine-identity-id= --service-account-key-file-path= ``` The AWS IAM method is used to authenticate with Infisical with an AWS IAM role while running in an AWS environment like EC2, Lambda, etc. Your machine identity ID. The authentication method to use. Must be `aws-iam` when using Native AWS IAM. ```bash theme={"dark"} infisical gateway --auth-method=aws-iam --machine-identity-id= ``` The OIDC Auth method is used to authenticate with Infisical via identity tokens with OIDC. Your machine identity ID. The OIDC JWT from the identity provider. The authentication method to use. Must be `oidc-auth` when using OIDC Auth. ```bash theme={"dark"} infisical gateway --auth-method=oidc-auth --machine-identity-id= --jwt= ``` The JWT Auth method is used to authenticate with Infisical via a JWT token. The JWT token to use for authentication. Your machine identity ID. The authentication method to use. Must be `jwt-auth` when using JWT Auth. ```bash theme={"dark"} infisical gateway --auth-method=jwt-auth --jwt= --machine-identity-id= ``` You can use the `INFISICAL_TOKEN` environment variable to authenticate with Infisical with a raw machine identity access token. The machine identity access token to use for authentication. ```bash theme={"dark"} infisical gateway --token= ``` ### Other Flags Domain of your self-hosted Infisical instance. ```bash theme={"dark"} # Example infisical gateway --domain=https://app.your-domain.com ``` **This command is deprecated and will be removed in a future release.** Please migrate to `infisical gateway systemd install` for the new TCP-based SSH tunnel architecture with enhanced security and better performance. **Migration required:** If you previously installed Gateway v1 via `infisical gateway install`, moving to Gateway v2 is not in-place. Gateway v2 provisions new gateway instances with new gateway IDs. Update any resources that reference a gateway ID (for example: dynamic secret configs, app connections, or other gateway-bound resources) to use the new Gateway v2 gateway ID. Until you update those references, traffic will continue to target the old v1 gateway. Install and enable the legacy gateway as a systemd service. This command must be run with sudo on Linux. ```bash theme={"dark"} sudo infisical gateway install --token= --domain= ``` ### Requirements * Must be run on Linux * Must be run with root/sudo privileges * Requires systemd ### Flags The machine identity access token to authenticate with Infisical. ```bash theme={"dark"} # Example sudo infisical gateway install --token= ``` You may also expose the token to the CLI by setting the environment variable `INFISICAL_TOKEN` before executing the install command. Domain of your self-hosted Infisical instance. ```bash theme={"dark"} # Example sudo infisical gateway install --domain=https://app.your-domain.com ``` ### Service Details The systemd service is installed with secure defaults: * Service file: `/etc/systemd/system/infisical-gateway.service` * Config file: `/etc/infisical/gateway.conf` * Runs with restricted privileges: * InaccessibleDirectories=/home * PrivateTmp=yes * Resource limits configured for stability * Automatically restarts on failure * Enabled to start on boot After installation, manage the service with standard systemd commands: ```bash theme={"dark"} sudo systemctl start infisical-gateway # Start the service sudo systemctl stop infisical-gateway # Stop the service sudo systemctl status infisical-gateway # Check service status sudo systemctl disable infisical-gateway # Disable auto-start on boot ``` ## Frequently Asked Questions If the `--target-relay-name` flag is omitted, the gateway automatically selects the optimal relay. It first checks for healthy organization relays and connects to the one with the lowest latency. If no organization relays are available, it then performs the same latency-based selection among the available managed relays. No. The first time the gateway starts, it selects the optimal relay (based on latency) and caches that selection. On subsequent restarts, it will prioritize connecting to the cached relay. If it's unable to connect, it will then re-evaluate and connect to the next most optimal relay available. --- # Source: https://infisical.com/docs/integrations/frameworks/gatsby.md > ## Documentation Index > Fetch the complete documentation index at: https://infisical.com/docs/llms.txt > Use this file to discover all available pages before exploring further. # Gatsby > How to use Infisical to inject environment variables and secrets into a Gatsby app. Prerequisites: * Set up and add envars to [Infisical Cloud](https://app.infisical.com) * [Install the CLI](/cli/overview) ## Initialize Infisical for your [Gatsby](https://www.gatsbyjs.com) app ```bash theme={"dark"} # navigate to the root of your of your project cd /path/to/project # then initialize Infisical infisical init ``` ## Start your application as usual but with Infisical ```bash theme={"dark"} infisical run -- # Example infisical run -- npm run develop ``` Note that for environment variables to be exposed to the client, you'll have to prefix them with `GATSBY_`. Read more about that [here](https://www.gatsbyjs.com/docs/how-to/local-development/environment-variables/#accessing-environment-variables-in-the-browser). --- # Source: https://infisical.com/docs/documentation/platform/identities/gcp-auth.md > ## Documentation Index > Fetch the complete documentation index at: https://infisical.com/docs/llms.txt > Use this file to discover all available pages before exploring further. # GCP Auth > Learn how to authenticate with Infisical for services on Google Cloud Platform **GCP Auth** is a GCP-native authentication method for GCP resources to access Infisical. It consists of two sub-methods/approaches: * GCP ID Token Auth: For GCP services including [Compute Engine](https://cloud.google.com/compute/docs/instances/verifying-instance-identity#request_signature), [App Engine standard environment](https://cloud.google.com/appengine/docs/standard/python3/runtime#metadata_server), [App Engine flexible environment](https://cloud.google.com/appengine/docs/flexible/python/runtime#metadata_server), [Cloud Functions](https://cloud.google.com/functions/docs/securing/function-identity#using_the_metadata_server_to_acquire_tokens), [Cloud Run](https://cloud.google.com/run/docs/container-contract#metadata-server), [Google Kubernetes Engine](https://cloud.google.com/kubernetes-engine/docs/concepts/workload-identity#instance_metadata), and [Cloud Build](https://cloud.google.com/kubernetes-engine/docs/concepts/workload-identity#instance_metadata) to authenticate with Infisical. * GCP IAM Auth: For Google Cloud Platform (GCP) service accounts to authenticate with Infisical. ## Diagram The following sequence diagram illustrates the GCP ID Token Auth workflow for authenticating GCP resources with Infisical. ```mermaid theme={"dark"} sequenceDiagram participant GCE as GCP Service participant Infis as Infisical participant Google as OAuth2 API Note over GCE,Google: Step 1: Instance Identity Token Retrieval GCE->>Google: Request instance identity metadata token Google-->>GCE: Return JWT token with RS256 signature Note over GCE,Infis: Step 2: Identity Token Login Operation GCE->>Infis: Send JWT token to /api/v1/auth/gcp-auth/login Infis->>Google: Request OAuth2 certificates Google-->>Infis: Return certificates Note over Infis: Step 3: Identity Token Verification Note over Infis: Step 4: Identity Property Validation Infis->>GCE: Return short-lived access token Note over GCE,Infis: Step 4: Access Infisical API with Token GCE->>Infis: Make authenticated requests using the short-lived access token ``` ## Concept At a high-level, Infisical authenticates a GCP resource by verifying its identity and checking that it meets specific requirements (e.g. it is an allowed GCE instance) at the `/api/v1/auth/gcp-auth/login` endpoint. If successful, then Infisical returns a short-lived access token that can be used to make authenticated requests to the Infisical API. To be more specific: 1. The client running on a GCP service obtains an [ID token](https://cloud.google.com/docs/authentication/get-id-token) constituting the identity for a GCP resource such as a GCE instance or Cloud Function; this is a unique JWT token that includes details about the instance as well as Google's [RS256 signature](https://datatracker.ietf.org/doc/html/rfc7518#section-3.3). 2. The client sends the ID token to Infisical at the `/api/v1/auth/gcp-auth/login` endpoint. 3. Infisical verifies the token against Google's [public OAuth2 certificates](https://www.googleapis.com/oauth2/v3/certs). 4. Infisical checks if the entity behind the ID token is allowed to authenticate with Infisical based on set criteria such as **Allowed Service Account Emails**. 5. If all is well, Infisical returns a short-lived access token that the client can use to make authenticated requests to the Infisical API. We recommend using one of Infisical's clients like SDKs or the Infisical Agent to authenticate with Infisical using GCP ID Token Auth as they handle the authentication process including generating the instance ID token for you. Also, note that Infisical needs network-level access to send requests to the Google Cloud API as part of the GCP Auth workflow. ## Guide In the following steps, we explore how to create and use identities for your workloads and applications on GCP to access the Infisical API using the GCP ID Token authentication method. To create an identity, head to your Organization Settings > Access Control > Identities and press **Create identity**. identities organization When creating an identity, you specify an organization level [role](/documentation/platform/access-controls/role-based-access-controls) for it to assume; you can configure roles in Organization Settings > Access Control > Organization Roles. identities organization create Now input a few details for your new identity. Here's some guidance for each field: * Name (required): A friendly name for the identity. * Role (required): A role from the **Organization Roles** tab for the identity to assume. The organization role assigned will determine what organization level resources this identity can have access to. Once you've created an identity, you'll be redirected to a page where you can manage the identity. identities page Since the identity has been configured with Universal Auth by default, you should re-configure it to use GCP Auth instead. To do this, press to edit the **Authentication** section, remove the existing Universal Auth configuration, and add a new GCP Auth configuration onto the identity; set the **Type** field to **GCP ID Token Auth**. identities page remove default auth identities create gcp auth method Here's some more guidance on each field: * Allowed Service Account Emails: A comma-separated list of trusted service account emails corresponding to the GCE resource(s) allowed to authenticate with Infisical; this could be something like `test@project.iam.gserviceaccount.com`, `12345-compute@developer.gserviceaccount.com`, etc. * Allowed Projects: A comma-separated list of trusted GCP projects that the GCE instance must belong to authenticate with Infisical. Note that this validation property will only work for GCE instances. * Allowed Zones: A comma-separated list of trusted zones that the GCE instances must belong to authenticate with Infisical; this should be the fully-qualified zone name in the format `-`like `us-central1-a`, `us-west1-b`, etc. Note that this validation property will only work for GCE instances. * Access Token TTL (default is `2592000` equivalent to 30 days): The lifetime for an acccess token in seconds. This value will be referenced at renewal time. * Access Token Max TTL (default is `2592000` equivalent to 30 days): The maximum lifetime for an acccess token in seconds. This value will be referenced at renewal time. * Access Token Max Number of Uses (default is `0`): The maximum number of times that an access token can be used; a value of `0` implies infinite number of uses. * Access Token Trusted IPs: The IPs or CIDR ranges that access tokens can be used from. By default, each token is given the `0.0.0.0/0`, allowing usage from any network address. To enable the identity to access project-level resources such as secrets within a specific project, you should add it to that project. To do this, head over to the project you want to add the identity to and go to Project Settings > Access Control > Machine Identities and press **Add identity**. Next, select the identity you want to add to the project and the project level role you want to allow it to assume. The project role assigned will determine what project level resources this identity can have access to. identities project identities project create To access the Infisical API as the identity, you need to generate an [ID token](https://cloud.google.com/docs/authentication/get-id-token) constituting the identity of the present GCE instance and make a request to the `/api/v1/auth/gcp-auth/login` endpoint containing the token in exchange for an access token. We provide a few code examples below of how you can authenticate with Infisical to access the [Infisical API](/api-reference/overview/introduction). Start by making a request from the GCE instance to obtain the ID token. For more examples of how to obtain the token in Java, Go, Node.js, etc. refer to the [official documentation](https://cloud.google.com/docs/authentication/get-id-token#curl). #### Sample request ```bash curl theme={"dark"} curl -H "Metadata-Flavor: Google" \ 'http://metadata/computeMetadata/v1/instance/service-accounts/default/identity?audience=&format=full' ``` Note that you should replace `` with the ID of the identity you created in step 1. Next use send the obtained JWT token along to authenticate with Infisical and obtain an access token. #### Sample request ```bash Request theme={"dark"} curl --location --request POST 'https://app.infisical.com/api/v1/auth/gcp-auth/login' \ --header 'Content-Type: application/x-www-form-urlencoded' \ --data-urlencode 'identityId=...' \ --data-urlencode 'jwt=...' ``` #### Sample response ```bash Response theme={"dark"} { "accessToken": "...", "expiresIn": 7200, "accessTokenMaxTTL": 43244 "tokenType": "Bearer" } ``` Next, you can use the access token to access the [Infisical API](/api-reference/overview/introduction) We recommend using one of Infisical's clients like SDKs or the Infisical Agent to authenticate with Infisical using GCP IAM Auth as they handle the authentication process including generating the signed JWT token. Each identity access token has a time-to-live (TTL) which you can infer from the response of the login operation; the default TTL is `7200` seconds which can be adjusted. If an identity access token expires, it can no longer authenticate with the Infisical API. In this case, a new access token should be obtained by performing another login operation. ## Diagram The following sequence diagram illustrates the GCP IAM Auth workflow for authenticating GCP IAM service accounts with Infisical. ```mermaid theme={"dark"} sequenceDiagram participant GCE as Client participant Infis as Infisical participant Google as Cloud IAM Note over GCE,Google: Step 1: Signed JWT Token Generation GCE->>Google: Request to generate signed JWT token Google-->>GCE: Return signed JWT token Note over GCE,Infis: Step 2: JWT Token Login Operation GCE->>Infis: Send signed JWT token to /api/v1/auth/gcp-auth/login Infis->>Google: Request public key Google-->>Infis: Return public key Note over Infis: Step 3: JWT Token Verification Note over Infis: Step 4: JWT Property Validation Infis->>GCE: Return short-lived access token Note over GCE,Infis: Step 5: Access Infisical API with Token GCE->>Infis: Make authenticated requests using the short-lived access token ``` ## Concept At a high-level, Infisical authenticates an IAM service account by verifying its identity and checking that it meets specific requirements (e.g. it is an allowed service account) at the `/api/v1/auth/gcp-auth/login` endpoint. If successful, then Infisical returns a short-lived access token that can be used to make authenticated requests to the Infisical API. To be more specific: 1. The client generates a signed JWT token using the `projects.serviceAccounts.signJwt` [API method](https://cloud.google.com/iam/docs/reference/credentials/rest/v1/projects.serviceAccounts/signJwt); this is done using the service account credentials associated with the client. 2. The client sends the signed JWT token to Infisical at the `/api/v1/auth/gcp-auth/login` endpoint. 3. Infisical verifies the signed JWT token. 4. Infisical checks if the service account behind the JWT token is allowed to authenticate with Infisical based **Allowed Service Account Emails**. 5. If all is well, Infisical returns a short-lived access token that the client can use to make authenticated requests to the Infisical API. We recommend using one of Infisical's clients like SDKs or the Infisical Agent to authenticate with Infisical using GCP IAM Auth as they handle the authentication process including generating the signed JWT token. Also, note that Infisical needs network-level access to send requests to the Google Cloud API as part of the GCP Auth workflow. ## Guide In the following steps, we explore how to create and use identities for your workloads and applications on GCP to access the Infisical API using the GCP IAM authentication method. To create an identity, head to your Organization Settings > Access Control > Identities and press **Create identity**. identities organization When creating an identity, you specify an organization level [role](/documentation/platform/access-controls/role-based-access-controls) for it to assume; you can configure roles in Organization Settings > Access Control > Organization Roles. identities organization create Now input a few details for your new identity. Here's some guidance for each field: * Name (required): A friendly name for the identity. * Role (required): A role from the **Organization Roles** tab for the identity to assume. The organization role assigned will determine what organization level resources this identity can have access to. Once you've created an identity, you'll be redirected to a page where you can manage the identity. identities page Since the identity has been configured with Universal Auth by default, you should re-configure it to use GCP Auth instead. To do this, press to edit the **Authentication** section, remove the existing Universal Auth configuration, and add a new GCP Auth configuration onto the identity; set the **Type** field to **GCP IAM Auth**. identities page remove default auth identities organization create token auth method Here's some more guidance on each field: * Allowed Service Account Emails: A comma-separated list of trusted IAM service account emails that are allowed to authenticate with Infisical; this could be something like `test@project.iam.gserviceaccount.com`, `12345-compute@developer.gserviceaccount.com`, etc. * Access Token TTL (default is `2592000` equivalent to 30 days): The lifetime for an acccess token in seconds. This value will be referenced at renewal time. * Access Token Max TTL (default is `2592000` equivalent to 30 days): The maximum lifetime for an acccess token in seconds. This value will be referenced at renewal time. * Access Token Max Number of Uses (default is `0`): The maximum number of times that an access token can be used; a value of `0` implies infinite number of uses. * Access Token Trusted IPs: The IPs or CIDR ranges that access tokens can be used from. By default, each token is given the `0.0.0.0/0`, allowing usage from any network address. To enable the identity to access project-level resources such as secrets within a specific project, you should add it to that project. To do this, head over to the project you want to add the identity to and go to Project Settings > Access Control > Machine Identities and press **Add identity**. Next, select the identity you want to add to the project and the project level role you want to allow it to assume. The project role assigned will determine what project level resources this identity can have access to. identities project identities project create To access the Infisical API as the identity, you need to generate a signed JWT token using the `projects.serviceAccounts.signJwt` [API method](https://cloud.google.com/iam/docs/reference/credentials/rest/v1/projects.serviceAccounts/signJwt) and make a request to the `/api/v1/auth/gcp-auth/login` endpoint containing the signed JWT token in exchange for an access token. Make sure that the service account has the `iam.serviceAccounts.signJwt` permission or the `roles/iam.serviceAccountTokenCreator` role. We provide a few code examples below of how you can authenticate with Infisical to access the [Infisical API](/api-reference/overview/introduction). The following code provides a generic example of how you can generate a signed JWT token against the `projects.serviceAccounts.signJwt` API method. The shown example uses Node.js and the official [google-auth-library](https://github.com/googleapis/google-auth-library-nodejs#readme) package but you can use any language you wish. ```javascript theme={"dark"} const { GoogleAuth } = require("google-auth-library"); const auth = new GoogleAuth({ scopes: "https://www.googleapis.com/auth/cloud-platform", }); const credentials = await auth.getCredentials(); const identityId = ""; const jwtPayload = { sub: credentials.client_email, aud: identityId, }; const { data } = await client.request({ url: `https://iamcredentials.googleapis.com/v1/projects/-/serviceAccounts/${credentials.client_email}:signJwt`, method: "POST", data: { payload: JSON.stringify(jwtPayload) }, }); const jwt = data.signedJwt // send this jwt to Infisical in the next step ``` #### Sample request ```bash Request theme={"dark"} curl --location --request POST 'https://app.infisical.com/api/v1/auth/gcp-auth/login' \ --header 'Content-Type: application/x-www-form-urlencoded' \ --data-urlencode 'identityId=...' \ --data-urlencode 'jwt=...' ``` #### Sample response ```bash Response theme={"dark"} { "accessToken": "...", "expiresIn": 7200, "accessTokenMaxTTL": 43244 "tokenType": "Bearer" } ``` Next, you can use the access token to access the [Infisical API](/api-reference/overview/introduction) We recommend using one of Infisical's clients like SDKs or the Infisical Agent to authenticate with Infisical using GCP IAM Auth as they handle the authentication process including generating the signed JWT token. Each identity access token has a time-to-live (TTL) which you can infer from the response of the login operation; the default TTL is `7200` seconds which can be adjusted. If an identity access token expires, it can no longer authenticate with the Infisical API. In this case, a new access token should be obtained by performing another login operation. --- # Source: https://infisical.com/docs/documentation/platform/dynamic-secrets/gcp-iam.md > ## Documentation Index > Fetch the complete documentation index at: https://infisical.com/docs/llms.txt > Use this file to discover all available pages before exploring further. # GCP IAM > Learn how to dynamically generate GCP service account tokens. The Infisical GCP IAM dynamic secret allows you to generate GCP service account tokens on demand based on service account permissions. GCP service account access tokens cannot be revoked. As such, revoking or regenerating a token does not invalidate the old one; it remains active until it expires. You must enable the [IAM API](https://console.cloud.google.com/apis/library/iam.googleapis.com) and [IAM Credentials API](https://console.cloud.google.com/apis/library/iamcredentials.googleapis.com) in your GCP console as a prerequisite Using the GCP integration on a self-hosted instance of Infisical requires configuring a service account on GCP and configuring your instance to use it. Service Account API Service Account IAM Page Create a new service account that will be used to impersonate other GCP service accounts for your app connections. Create Service Account Page Press "DONE" after creating the service account. Download the JSON key file for your service account. This will be used to authenticate your instance with GCP. Service Account Credential Page 1. Copy the entire contents of the downloaded JSON key file. 2. Set it as a string value for the `INF_APP_CONNECTION_GCP_SERVICE_ACCOUNT_CREDENTIAL` environment variable. 3. Restart your Infisical instance to apply the changes. 4. You can now use GCP integration with service account impersonation. ## Create GCP Service Account Service Account Page Create Service Account When you assign specific roles and permissions to this service account, any tokens generated through Infisical's dynamic secrets functionality will inherit these exact permissions. This means that applications using these dynamically generated tokens will have the same access capabilities as defined by the service account's role assignments, ensuring proper access control while maintaining the principle of least privilege. After configuring the appropriate roles, press "DONE". To enable service account impersonation, you'll need to grant the **Service Account Token Creator** role to the Infisical instance's service account. This configuration allows Infisical to securely impersonate the new service account. * Navigate to the IAM & Admin > Service Accounts section in your Google Cloud Console * Select the newly created service account * Click on the "PERMISSIONS" tab * Click "Grant Access" to add a new principal If you're using Infisical Cloud US, use the following service account: `infisical-us@infisical-us.iam.gserviceaccount.com` If you're using Infisical Cloud EU, use the following service account: `infisical-eu@infisical-eu.iam.gserviceaccount.com` If you're self-hosting, follow the "Self-Hosted Instance" guide at the top of the page and then use service account you created Service Account Page ## Set up Dynamic Secrets with GCP IAM Open the Secret Overview dashboard and select the environment in which you would like to add a dynamic secret. Add Dynamic Secret Button Dynamic Secret Modal Name by which you want the secret to be referenced Default time-to-live for a generated secret (it is possible to modify this value after a secret is generated) Maximum time-to-live for a generated secret The email tied to the service account created in earlier steps. After submitting the form, you will see a dynamic secret created in the dashboard. Once you've successfully configured the dynamic secret, you're ready to generate on-demand credentials. To do this, simply click on the 'Generate' button which appears when hovering over the dynamic secret item. Alternatively, you can initiate the creation of a new lease by selecting 'New Lease' from the dynamic secret lease list section. Dynamic Secret Dynamic Secret When generating these secrets, it's important to specify a Time-to-Live (TTL) duration. This will dictate how long the credentials are valid for. Provision Lease Ensure that the TTL for the lease falls within the maximum TTL defined when configuring the dynamic secret. Once you click the `Submit` button, a new secret lease will be generated and the credentials from it will be shown to you. Dynamic Secret Lease ## Audit or Revoke Leases Once you have created one or more leases, you will be able to access them by clicking on the respective dynamic secret item on the dashboard. This will allow you to see the expiration time of the lease or delete a lease before its set time to live. Lease Data ## Renew Leases To extend the life of the generated dynamic secret leases past its initial time to live, simply click on the **Renew** button as illustrated below. Lease Renew Lease renewals cannot exceed the maximum TTL set when configuring the dynamic secret --- # Source: https://infisical.com/docs/documentation/platform/kms-configuration/gcp-kms.md > ## Documentation Index > Fetch the complete documentation index at: https://infisical.com/docs/llms.txt > Use this file to discover all available pages before exploring further. # GCP Key Management Service > Learn how to manage encryption using GCP KMS To enhance the security of your Infisical projects, you can now encrypt your secrets using an external Key Management Service (KMS). When external KMS is configured for your project, all encryption and decryption operations will be handled by the chosen KMS. This guide will walk you through the steps needed to configure external KMS support with Google Cloud KMS. ## Prerequisites Before you begin, you'll first need to set up a GCP Service Account, add a KMS key and set the required permissions. 1. Navigate to the [Create Service Account](https://console.cloud.google.com/iam-admin/serviceaccounts/create) page in your GCP Console. GCP Service Account Creation 2. Give the service account a suitable **name** and **description**. Then click **Create and Continue**. 3. Under **Grant this service account access to project**, click **Select a role** and select the **Cloud KMS Viewer** and **Cloud KMS CryptoKey Encrypter/Decrypter**\* roles, then click **Continue**. GCP Service Account Permissions 4. You can skip the **Grant users access to this service account** options. 5. Click Done. 6. You should see the service account in the list of service accounts. Click it to view the service account details. 7. Select the **Keys** tab, click **Add Key**, select **Create new key**, select **JSON** as the key type, then click **Create**. 8. You will be prompted to download a JSON file that we will need later on. Remember to keep the JSON file in a secure location. It will be used to authenticate your GCP service account. Once you have successfully set up GCP KMS with Infisical, you should permanently delete the JSON file. 1. Navigate to the [KMS](https://console.cloud.google.com/security/kms) page in your GCP Console. If you have not used GCP KMS before, you will be redirected to the **Cloud Key Management Service (KMS) API** page. Click **Enable** to enable the KMS API, then continue the steps below. It may take a few minutes for the API to be enabled and KMS section of the Cloud Console to become viewable. 2. In the KMS section, click **Create Key Ring**. GCP Create Key Ring 3. Give the key ring a **Name** and select a **Region**, then click **Create**. We don't currently support multi-region key rings. 4. On the "Create Key" page, give the key a **Name** and set the **Protection Level** based on your requirements (or use default *Software*), then click **Continue**. 5. Under **Key Material**, select **Generated Key**, then click **Continue**. 6. Under **Purpose**, select **Symmetric encrypt/decrypt**, then click **Continue**. 7. For **Key Rotation Period**, select **Never (manual rotation)**, then click **Continue** followed by **Create**. 8. You should see the key in the list of keys. We're now ready to set it up in Infisical. ## Setup GCP KMS in the Organization Settings Next, you will need to follow the steps listed below to add GCP KMS for your organization. Open encryption org settings Add encryption org settings Click the 'Add' button to begin adding a new external KMS. Select Encryption Provider Choose 'GCP KMS' from the list of encryption providers. GCP Create KMS Modal Selecting GCP as the provider will require you input the following fields. Name for referencing the GCP KMS key within the organization. Short description of the GCP KMS key. The GCP region where the GCP KMS key ring is located. Upload the JSON file you downloaded earlier when creating the GCP service account. This field will be populated with the list of GCP KMS keys in the selected region. Select the key you created earlier. Save your configuration to apply the settings. You now have a GCP KMS Key configured at the organization level. You can assign these GCP KMS keys to existing Infisical projects by visiting the 'Project Settings' page. ## Assign GCP KMS Key to an Existing Project To assign the GCP KMS key you added to your organization, follow the steps below. Open encryption project
    settings Select encryption project
    settings Choose the GCP KMS key you configured earlier. Once you have selected the KMS of choice, click save. --- # Source: https://infisical.com/docs/integrations/secret-syncs/gcp-secret-manager.md > ## Documentation Index > Fetch the complete documentation index at: https://infisical.com/docs/llms.txt > Use this file to discover all available pages before exploring further. # GCP Secret Manager Sync > Learn how to configure a GCP Secret Manager Sync for Infisical. **Prerequisites:** * Set up and add secrets to [Infisical Cloud](https://app.infisical.com) * Create a [GCP Connection](/integrations/app-connections/gcp) with the required **Secret Sync** permissions * Enable **Cloud Resource Manager API**, **Secret Manager API**, and **Service Usage API** on your GCP project Secret Syncs Tab Secret Syncs Tab Secret Syncs Tab * Ensure your network security policies allow incoming requests from Infisical to this secret sync provider, if network restrictions apply. 1. Navigate to **Project** > **Integrations** and select the **Secret Syncs** tab. Click on the **Add Sync** button. Secret Syncs Tab 2. Select the **GCP Secret Manager** option. Select GCP Secret Manager 3. Configure the **Source** from where secrets should be retrieved, then click **Next**. Configure Source * **Environment**: The project environment to retrieve secrets from. * **Secret Path**: The folder path to retrieve secrets from. If you need to sync secrets from multiple folder locations, check out [secret imports](/documentation/platform/secret-reference#secret-imports). 4. Configure the **Destination** to where secrets should be deployed, then click **Next**. Configure Destination * **GCP Connection**: The GCP Connection to authenticate with. * **Project**: The GCP project to sync with. * **Scope**: The GCP project scope that secrets should be synced to: * **Global**: Secrets will be synced globally; available to all project regions. * **Region**: Secrets will be synced to the specified region. 5. Configure the **Sync Options** to specify how secrets should be synced, then click **Next**. Configure Options * **Initial Sync Behavior**: Determines how Infisical should resolve the initial sync. * **Overwrite Destination Secrets**: Removes any secrets at the destination endpoint not present in Infisical. * **Import Secrets (Prioritize Infisical)**: Imports secrets from the destination endpoint before syncing, prioritizing values from Infisical over GCP Secret Manager when keys conflict. * **Import Secrets (Prioritize GCP Secret Manager)**: Imports secrets from the destination endpoint before syncing, prioritizing values from GCP Secret Manager over Infisical when keys conflict. * **Key Schema**: Template that determines how secret names are transformed when syncing, using `{{secretKey}}` as a placeholder for the original secret name and `{{environment}}` for the environment. We highly recommend using a Key Schema to ensure that Infisical only manages the specific keys you intend, keeping everything else untouched. * **Auto-Sync Enabled**: If enabled, secrets will automatically be synced from the source location when changes occur. Disable to enforce manual syncing only. * **Disable Secret Deletion**: If enabled, Infisical will not remove secrets from the sync destination. Enable this option if you intend to manage some secrets manually outside of Infisical. 6. Configure the **Details** of your GCP Secret Manager Sync, then click **Next**. Configure Details * **Name**: The name of your sync. Must be slug-friendly. * **Description**: An optional description for your sync. 7. Review your Secret Manager Sync configuration, then click **Create Sync**. Confirm Configuration 8. If enabled, your GCP Secret Manager Sync will begin syncing your secrets to the destination endpoint. Sync Secrets To create a **GCP Secret Manager Sync**, make an API request to the [Create GCP Secret Manager Sync](/api-reference/endpoints/secret-syncs/gcp-secret-manager/create) API endpoint. ### Sample request ```bash Request theme={"dark"} curl --request POST \ --url https://app.infisical.com/api/v1/secret-syncs/gcp-secret-manager \ --header 'Content-Type: application/json' \ --data '{ "destinationConfig": { "scope": "global", "projectId": "infisical-test-playground" }, "name": "my-gcp-sync", "description": "this is an example secret sync", "secretPath": "/", "syncOptions": { "initialSyncBehavior": "overwrite-destination" }, "isAutoSyncEnabled": true, "connectionId": "eec83609-5eb4-4d8d-9f6e-ded016984f0d", "environment": "dev", "projectId": "09eda1f8-85a3-47a9-8a6f-e27f133b2a36" }' ``` ### Sample response ```bash Response theme={"dark"} { "secretSync": { "id": "aee02c4a-4a5f-488c-82dd-0b3164772871", "name": "my-gcp-sync", "description": "this is an example secret sync", "isAutoSyncEnabled": true, "version": 1, "projectId": "09eda1f8-85a3-47a9-8a6f-e27f133b2a36", "folderId": "1447389e-16fb-49ba-96fd-361b5a2522af", "connectionId": "eec83609-5eb4-4d8d-9f6e-ded016984f0d", "createdAt": "2025-01-27T12:28:59.408Z", "updatedAt": "2025-01-27T12:28:59.408Z", "syncStatus": "pending", "lastSyncJobId": null, "lastSyncMessage": null, "lastSyncedAt": null, "importStatus": null, "lastImportJobId": null, "lastImportMessage": null, "lastImportedAt": null, "removeStatus": null, "lastRemoveJobId": null, "lastRemoveMessage": null, "lastRemovedAt": null, "syncOptions": { "initialSyncBehavior": "overwrite-destination" }, "connection": { "app": "gcp", "name": "my-gcp-connection", "id": "eec83609-5eb4-4d8d-9f6e-ded016984f0d" }, "environment": { "slug": "dev", "name": "Development", "id": "124e0392-4070-4b1c-900e-ced30cd55bf3" }, "folder": { "id": "1447389e-16fb-49ba-96fd-361b5a2522af", "path": "/" }, "destination": "gcp-secret-manager", "destinationConfig": { "projectId": "infisical-test-playground" } } } ``` --- # Source: https://infisical.com/docs/integrations/app-connections/gcp.md > ## Documentation Index > Fetch the complete documentation index at: https://infisical.com/docs/llms.txt > Use this file to discover all available pages before exploring further. # GCP Connection > Learn how to configure a GCP Connection for Infisical. Infisical supports [service account impersonation](https://cloud.google.com/iam/docs/service-account-impersonation) to connect with your GCP projects. Using the GCP integration on a self-hosted instance of Infisical requires configuring a service account on GCP and configuring your instance to use it. Enable the IAM Service Account Credentials API for the project containing the service account that will be impersonated. You can do this from the Google Cloud Console or via the command line. Service Account API To enable via command line, run the following command, replacing `projectId` with your GCP project ID: ```bash theme={"dark"} gcloud services enable iamcredentials.googleapis.com --project=projectId ``` Verify the API is enabled by running: ```bash theme={"dark"} gcloud services list --enabled --project=projectId | grep iamcredentials ``` Service Account IAM Page Create a new service account that will be used to impersonate other GCP service accounts for your app connections. Create Service Account Page Press "DONE" after creating the service account. Download the JSON key file for your service account. This will be used to authenticate your instance with GCP. Service Account Credential Page 1. Copy the entire contents of the downloaded JSON key file. 2. Set it as a string value for the `INF_APP_CONNECTION_GCP_SERVICE_ACCOUNT_CREDENTIAL` environment variable. 3. Restart your Infisical instance to apply the changes. 4. You can now use GCP integration with service account impersonation. ## Configure Service Account for Infisical Service Account Page Create a new service account with an ID that follows this requirement: Your service account ID must end with the first two sections of your Infisical organization ID. Example: * Infisical organization ID: `df92581a-0fe9-42b5-b526-0a1e88ec8085` * Required service account ID suffix: `df92581a-0fe9` Create Service Account Add the required permissions for secret syncs: Assign Service Account Permission After configuring the appropriate roles, press "DONE". To enable service account impersonation, you'll need to grant the **Service Account Token Creator** role to the Infisical instance's service account. This configuration allows Infisical to securely impersonate the new service account. * Navigate to the IAM & Admin > Service Accounts section in your Google Cloud Console * Select the newly created service account * Click on the "PERMISSIONS" tab * Click "Grant Access" to add a new principal If you're using Infisical Cloud US, use the following service account: [infisical-us@infisical-us.iam.gserviceaccount.com](mailto:infisical-us@infisical-us.iam.gserviceaccount.com) If you're using Infisical Cloud EU, use the following service account: [infisical-eu@infisical-eu.iam.gserviceaccount.com](mailto:infisical-eu@infisical-eu.iam.gserviceaccount.com) Service Account Page ## Setup GCP Connection in Infisical Navigate to the **Integrations** tab in the desired project, then select **App Connections**. App Connections
    Tab Select the **GCP Connection** option from the connection options modal. Select GCP
    Connection Select the **Service Account Impersonation** method and click **Connect to GCP**. Connect via GCP
    impersonation Your **GCP Connection** is now available for use. Impersonation GCP
    Connection --- # Source: https://infisical.com/docs/documentation/platform/ldap/general.md # Source: https://infisical.com/docs/documentation/platform/identities/oidc-auth/general.md # Source: https://infisical.com/docs/documentation/platform/identities/ldap-auth/general.md > ## Documentation Index > Fetch the complete documentation index at: https://infisical.com/docs/llms.txt > Use this file to discover all available pages before exploring further. # General > Learn how to authenticate with Infisical using LDAP. **LDAP Auth** is an LDAP based authentication method that allows you to authenticate with Infisical using a machine identity configured with an [LDAP](https://en.wikipedia.org/wiki/Lightweight_Directory_Access_Protocol) directory. ## Templates You can create reusable LDAP authentication templates to standardize configurations across multiple machine identities. Templates help ensure consistency, reduce configuration errors, and simplify identity management at scale. To create and manage LDAP auth templates, see our [Machine Identity Auth Templates documentation](/documentation/platform/identities/auth-templates). Once you've created a template, you can apply it when configuring LDAP auth for your identities in the guide below. ## Guide To create an identity, head to your Organization Settings > Access Control > Identities and press **Create identity**. Create identity When creating an identity, you specify an organization level role for it to assume; you can configure roles in Organization Settings > Access Control > Organization Roles. Create identity modal Now input a few details for your new identity. Here's some guidance for each field: * Name (required): A friendly name for the identity. * Role (required): A role from the Organization Roles tab for the identity to assume. The organization role assigned will determine what organization level resources this identity can have access to. Once you've created an identity, you'll be redirected to a page where you can manage the identity. To configure LDAP auth for your identity, press the **Add Auth Method** button on the identity's page. Add auth method Now select **LDAP Auth** from the list of available auth methods for the identity. Select LDAP auth After selecting **LDAP Auth**, you'll see the form you need to fill out to configure LDAP auth for your identity. The following fields are available: **Configuration Tab** * `URL`: The LDAP server to connect to such as `ldap://ldap.your-org.com`, `ldaps://ldap.myorg.com:636` *(for connection over SSL/TLS)*, etc. * `Bind DN`: The DN to bind to the LDAP server with. * `Bind Pass`: The password to bind to the LDAP server with. * `Search Base / DN`: Base DN under which to perform user search such as `ou=Users,dc=acme,dc=com`. * `User Search Filter`: Template used to construct the LDAP user search filter such as `(uid={{username}})`; use literal `{{username}}` to have the given username used in the search. The default is `(uid={{username}})` which is compatible with several common directory schemas. * `Required Attributes`: A key/value pair of attributes that must be present in the LDAP user entry for them to be authenticated. As an example, if you set key `uid` to value `user1,user2,user3`, then only users with `uid` of `user1`, `user2`, or `user3` will be able to login with this identity. Each value is a comma separated list of attributes. * `Access Token TTL` *(default is 2592000 equivalent to 30 days)*: The lifetime for an access token in seconds. This value will be referenced at renewal time. * `Access Token Max TTL` *(default is 2592000 equivalent to 30 days)*: The maximum lifetime for an access token in seconds. This value will be referenced at renewal time. * `Access Token Max Number of Uses` *(default is 0)*: The maximum number of times that an access token can be used; a value of 0 implies infinite number of uses. **Lockout Tab** * `Lockout` *(enabled by default)*: The lockout feature will temporarily block login attempts after X consecutive login failures. * `Lockout Threshold` *(default is 3)*: The amount of times login must fail before locking the identity auth method. * `Lockout Duration` *(default is 5 minutes)*: How long an identity auth method lockout lasts. * `Lockout Counter Reset` *(default is 30 seconds)*: How long to wait from the most recent failed login until resetting the lockout counter. **Advanced Tab** * `CA Certificate`: The CA certificate to use when verifying the LDAP server certificate. This field is optional but recommended. * `Access Token Trusted IPs`: The IPs or CIDR ranges that access tokens can be used from. By default, each token is given the 0.0.0.0/0, allowing usage from any network address. Once you've filled out the form, press **Add** to save your changes. Configure LDAP auth After configuring LDAP auth for your identity, you can authenticate with the identity and obtain an access token using your LDAP credentials. ```bash theme={"dark"} curl --request POST \ --url https://app.infisical.com/api/v1/auth/ldap-auth/login \ --header 'Content-Type: application/json' \ --data '{ "identityId": "", "username": "", "password": "" }' ``` For EU Cloud and Self-Hosted users, make sure to replace `https://app.infisical.com` with `https://eu.infisical.com` or your self-hosted instance's URL in the request URL. If successful, you'll receive an access token in the response body. ```json theme={"dark"} { "accessToken": "your-access-token", "expiresIn": 2592000, "accessTokenMaxTTL": 2592000, "tokenType": "Bearer" } ``` You can read more about the login API endpoint [here](/api-reference/endpoints/ldap-auth/login). **FAQ** You can reset (remove) all lockouts for an identity auth method by clicking into the auth method and pressing **Reset All Lockouts**. ldap reset lockouts --- # Source: https://infisical.com/docs/api-reference/endpoints/secret-tags/get-by-id.md # Source: https://infisical.com/docs/api-reference/endpoints/secret-syncs/zabbix/get-by-id.md # Source: https://infisical.com/docs/api-reference/endpoints/secret-syncs/windmill/get-by-id.md # Source: https://infisical.com/docs/api-reference/endpoints/secret-syncs/vercel/get-by-id.md # Source: https://infisical.com/docs/api-reference/endpoints/secret-syncs/terraform-cloud/get-by-id.md # Source: https://infisical.com/docs/api-reference/endpoints/secret-syncs/teamcity/get-by-id.md # Source: https://infisical.com/docs/api-reference/endpoints/secret-syncs/supabase/get-by-id.md # Source: https://infisical.com/docs/api-reference/endpoints/secret-syncs/render/get-by-id.md # Source: https://infisical.com/docs/api-reference/endpoints/secret-syncs/railway/get-by-id.md # Source: https://infisical.com/docs/api-reference/endpoints/secret-syncs/octopus-deploy/get-by-id.md # Source: https://infisical.com/docs/api-reference/endpoints/secret-syncs/oci-vault/get-by-id.md # Source: https://infisical.com/docs/api-reference/endpoints/secret-syncs/northflank/get-by-id.md # Source: https://infisical.com/docs/api-reference/endpoints/secret-syncs/netlify/get-by-id.md # Source: https://infisical.com/docs/api-reference/endpoints/secret-syncs/laravel-forge/get-by-id.md # Source: https://infisical.com/docs/api-reference/endpoints/secret-syncs/humanitec/get-by-id.md # Source: https://infisical.com/docs/api-reference/endpoints/secret-syncs/heroku/get-by-id.md # Source: https://infisical.com/docs/api-reference/endpoints/secret-syncs/hashicorp-vault/get-by-id.md # Source: https://infisical.com/docs/api-reference/endpoints/secret-syncs/gitlab/get-by-id.md # Source: https://infisical.com/docs/api-reference/endpoints/secret-syncs/github/get-by-id.md # Source: https://infisical.com/docs/api-reference/endpoints/secret-syncs/gcp-secret-manager/get-by-id.md # Source: https://infisical.com/docs/api-reference/endpoints/secret-syncs/flyio/get-by-id.md # Source: https://infisical.com/docs/api-reference/endpoints/secret-syncs/digital-ocean-app-platform/get-by-id.md # Source: https://infisical.com/docs/api-reference/endpoints/secret-syncs/databricks/get-by-id.md # Source: https://infisical.com/docs/api-reference/endpoints/secret-syncs/cloudflare-workers/get-by-id.md # Source: https://infisical.com/docs/api-reference/endpoints/secret-syncs/cloudflare-pages/get-by-id.md # Source: https://infisical.com/docs/api-reference/endpoints/secret-syncs/circleci/get-by-id.md # Source: https://infisical.com/docs/api-reference/endpoints/secret-syncs/chef/get-by-id.md # Source: https://infisical.com/docs/api-reference/endpoints/secret-syncs/checkly/get-by-id.md # Source: https://infisical.com/docs/api-reference/endpoints/secret-syncs/camunda/get-by-id.md # Source: https://infisical.com/docs/api-reference/endpoints/secret-syncs/bitbucket/get-by-id.md # Source: https://infisical.com/docs/api-reference/endpoints/secret-syncs/azure-key-vault/get-by-id.md # Source: https://infisical.com/docs/api-reference/endpoints/secret-syncs/azure-devops/get-by-id.md # Source: https://infisical.com/docs/api-reference/endpoints/secret-syncs/azure-app-configuration/get-by-id.md # Source: https://infisical.com/docs/api-reference/endpoints/secret-syncs/aws-secrets-manager/get-by-id.md # Source: https://infisical.com/docs/api-reference/endpoints/secret-syncs/aws-parameter-store/get-by-id.md # Source: https://infisical.com/docs/api-reference/endpoints/secret-syncs/1password/get-by-id.md # Source: https://infisical.com/docs/api-reference/endpoints/secret-scanning/data-sources/gitlab/get-by-id.md # Source: https://infisical.com/docs/api-reference/endpoints/secret-scanning/data-sources/github/get-by-id.md # Source: https://infisical.com/docs/api-reference/endpoints/secret-scanning/data-sources/bitbucket/get-by-id.md # Source: https://infisical.com/docs/api-reference/endpoints/secret-rotations/windows-local-account/get-by-id.md # Source: https://infisical.com/docs/api-reference/endpoints/secret-rotations/unix-linux-local-account/get-by-id.md # Source: https://infisical.com/docs/api-reference/endpoints/secret-rotations/redis-credentials/get-by-id.md # Source: https://infisical.com/docs/api-reference/endpoints/secret-rotations/postgres-credentials/get-by-id.md # Source: https://infisical.com/docs/api-reference/endpoints/secret-rotations/oracledb-credentials/get-by-id.md # Source: https://infisical.com/docs/api-reference/endpoints/secret-rotations/okta-client-secret/get-by-id.md # Source: https://infisical.com/docs/api-reference/endpoints/secret-rotations/mysql-credentials/get-by-id.md # Source: https://infisical.com/docs/api-reference/endpoints/secret-rotations/mssql-credentials/get-by-id.md # Source: https://infisical.com/docs/api-reference/endpoints/secret-rotations/mongodb-credentials/get-by-id.md # Source: https://infisical.com/docs/api-reference/endpoints/secret-rotations/ldap-password/get-by-id.md # Source: https://infisical.com/docs/api-reference/endpoints/secret-rotations/databricks-service-principal-secret/get-by-id.md # Source: https://infisical.com/docs/api-reference/endpoints/secret-rotations/azure-client-secret/get-by-id.md # Source: https://infisical.com/docs/api-reference/endpoints/secret-rotations/aws-iam-user-secret/get-by-id.md # Source: https://infisical.com/docs/api-reference/endpoints/secret-rotations/auth0-client-secret/get-by-id.md # Source: https://infisical.com/docs/api-reference/endpoints/project-templates/get-by-id.md # Source: https://infisical.com/docs/api-reference/endpoints/project-identities/get-by-id.md # Source: https://infisical.com/docs/api-reference/endpoints/project-identities-membership/get-by-id.md # Source: https://infisical.com/docs/api-reference/endpoints/project-groups/get-by-id.md # Source: https://infisical.com/docs/api-reference/endpoints/pki/syncs/get-by-id.md # Source: https://infisical.com/docs/api-reference/endpoints/pki/syncs/chef/get-by-id.md # Source: https://infisical.com/docs/api-reference/endpoints/pki/syncs/azure-key-vault/get-by-id.md # Source: https://infisical.com/docs/api-reference/endpoints/pki/syncs/aws-secrets-manager/get-by-id.md # Source: https://infisical.com/docs/api-reference/endpoints/pki/syncs/aws-certificate-manager/get-by-id.md # Source: https://infisical.com/docs/api-reference/endpoints/kms/keys/get-by-id.md # Source: https://infisical.com/docs/api-reference/endpoints/identities/get-by-id.md # Source: https://infisical.com/docs/api-reference/endpoints/groups/get-by-id.md # Source: https://infisical.com/docs/api-reference/endpoints/folders/get-by-id.md # Source: https://infisical.com/docs/api-reference/endpoints/deprecated/secret-tags/get-by-id.md # Source: https://infisical.com/docs/api-reference/endpoints/deprecated/project-identities-v2/get-by-id.md # Source: https://infisical.com/docs/api-reference/endpoints/deprecated/project-groups/get-by-id.md # Source: https://infisical.com/docs/api-reference/endpoints/deprecated/folders/get-by-id.md # Source: https://infisical.com/docs/api-reference/endpoints/certificate-profiles/get-by-id.md # Source: https://infisical.com/docs/api-reference/endpoints/certificate-policies/get-by-id.md # Source: https://infisical.com/docs/api-reference/endpoints/app-connections/zabbix/get-by-id.md # Source: https://infisical.com/docs/api-reference/endpoints/app-connections/windmill/get-by-id.md # Source: https://infisical.com/docs/api-reference/endpoints/app-connections/vercel/get-by-id.md # Source: https://infisical.com/docs/api-reference/endpoints/app-connections/terraform-cloud/get-by-id.md # Source: https://infisical.com/docs/api-reference/endpoints/app-connections/teamcity/get-by-id.md # Source: https://infisical.com/docs/api-reference/endpoints/app-connections/supabase/get-by-id.md # Source: https://infisical.com/docs/api-reference/endpoints/app-connections/ssh/get-by-id.md # Source: https://infisical.com/docs/api-reference/endpoints/app-connections/smb/get-by-id.md # Source: https://infisical.com/docs/api-reference/endpoints/app-connections/render/get-by-id.md # Source: https://infisical.com/docs/api-reference/endpoints/app-connections/redis/get-by-id.md # Source: https://infisical.com/docs/api-reference/endpoints/app-connections/railway/get-by-id.md # Source: https://infisical.com/docs/api-reference/endpoints/app-connections/postgres/get-by-id.md # Source: https://infisical.com/docs/api-reference/endpoints/app-connections/oracledb/get-by-id.md # Source: https://infisical.com/docs/api-reference/endpoints/app-connections/openrouter/get-by-id.md # Source: https://infisical.com/docs/api-reference/endpoints/app-connections/okta/get-by-id.md # Source: https://infisical.com/docs/api-reference/endpoints/app-connections/octopus-deploy/get-by-id.md # Source: https://infisical.com/docs/api-reference/endpoints/app-connections/oci/get-by-id.md # Source: https://infisical.com/docs/api-reference/endpoints/app-connections/northflank/get-by-id.md # Source: https://infisical.com/docs/api-reference/endpoints/app-connections/netlify/get-by-id.md # Source: https://infisical.com/docs/api-reference/endpoints/app-connections/mysql/get-by-id.md # Source: https://infisical.com/docs/api-reference/endpoints/app-connections/mssql/get-by-id.md # Source: https://infisical.com/docs/api-reference/endpoints/app-connections/mongodb/get-by-id.md # Source: https://infisical.com/docs/api-reference/endpoints/app-connections/ldap/get-by-id.md # Source: https://infisical.com/docs/api-reference/endpoints/app-connections/laravel-forge/get-by-id.md # Source: https://infisical.com/docs/api-reference/endpoints/app-connections/humanitec/get-by-id.md # Source: https://infisical.com/docs/api-reference/endpoints/app-connections/heroku/get-by-id.md # Source: https://infisical.com/docs/api-reference/endpoints/app-connections/hashicorp-vault/get-by-id.md # Source: https://infisical.com/docs/api-reference/endpoints/app-connections/gitlab/get-by-id.md # Source: https://infisical.com/docs/api-reference/endpoints/app-connections/github/get-by-id.md # Source: https://infisical.com/docs/api-reference/endpoints/app-connections/github-radar/get-by-id.md # Source: https://infisical.com/docs/api-reference/endpoints/app-connections/gcp/get-by-id.md # Source: https://infisical.com/docs/api-reference/endpoints/app-connections/flyio/get-by-id.md # Source: https://infisical.com/docs/api-reference/endpoints/app-connections/digital-ocean/get-by-id.md # Source: https://infisical.com/docs/api-reference/endpoints/app-connections/databricks/get-by-id.md # Source: https://infisical.com/docs/api-reference/endpoints/app-connections/cloudflare/get-by-id.md # Source: https://infisical.com/docs/api-reference/endpoints/app-connections/circleci/get-by-id.md # Source: https://infisical.com/docs/api-reference/endpoints/app-connections/chef/get-by-id.md # Source: https://infisical.com/docs/api-reference/endpoints/app-connections/checkly/get-by-id.md # Source: https://infisical.com/docs/api-reference/endpoints/app-connections/camunda/get-by-id.md # Source: https://infisical.com/docs/api-reference/endpoints/app-connections/bitbucket/get-by-id.md # Source: https://infisical.com/docs/api-reference/endpoints/app-connections/azure-key-vault/get-by-id.md # Source: https://infisical.com/docs/api-reference/endpoints/app-connections/azure-devops/get-by-id.md # Source: https://infisical.com/docs/api-reference/endpoints/app-connections/azure-client-secret/get-by-id.md # Source: https://infisical.com/docs/api-reference/endpoints/app-connections/azure-app-configuration/get-by-id.md # Source: https://infisical.com/docs/api-reference/endpoints/app-connections/azure-adcs/get-by-id.md # Source: https://infisical.com/docs/api-reference/endpoints/app-connections/aws/get-by-id.md # Source: https://infisical.com/docs/api-reference/endpoints/app-connections/auth0/get-by-id.md # Source: https://infisical.com/docs/api-reference/endpoints/app-connections/1password/get-by-id.md > ## Documentation Index > Fetch the complete documentation index at: https://infisical.com/docs/llms.txt > Use this file to discover all available pages before exploring further. # Get by ID > Get the specified 1Password Connection by ID. ## OpenAPI ````yaml GET /api/v1/app-connections/1password/{connectionId} openapi: 3.0.3 info: title: Infisical API description: List of all available APIs that can be consumed version: 0.0.1 servers: - url: https://us.infisical.com description: Production server (US) - url: https://eu.infisical.com description: Production server (EU) - url: http://localhost:8080 description: Local server security: [] paths: /api/v1/app-connections/1password/{connectionId}: get: tags: - App Connections description: Get the specified 1Password Connection by ID. operationId: getOnePasswordAppConnection parameters: - schema: type: string format: uuid in: path name: connectionId required: true description: The ID of the 1Password Connection to retrieve. responses: '200': description: Default Response content: application/json: schema: type: object properties: appConnection: anyOf: - type: object properties: id: type: string format: uuid name: type: string description: type: string nullable: true version: type: number default: 1 orgId: type: string format: uuid createdAt: type: string format: date-time updatedAt: type: string format: date-time isPlatformManagedCredentials: type: boolean default: false nullable: true gatewayId: type: string format: uuid nullable: true projectId: type: string nullable: true credentialsHash: type: string project: type: object properties: name: type: string id: type: string type: type: string slug: type: string required: - name - id - type - slug additionalProperties: false nullable: true app: type: string enum: - 1password method: type: string enum: - api-token credentials: type: object properties: instanceUrl: type: string format: uri minLength: 1 description: >- The URL of the 1Password Connect Server instance to authenticate with. required: - instanceUrl additionalProperties: false required: - id - name - orgId - createdAt - updatedAt - app - method - credentials additionalProperties: false title: 1Password (API Token) required: - appConnection additionalProperties: false '400': description: Default Response content: application/json: schema: type: object properties: reqId: type: string statusCode: type: number enum: - 400 message: type: string error: type: string details: {} required: - reqId - statusCode - message - error additionalProperties: false '401': description: Default Response content: application/json: schema: type: object properties: reqId: type: string statusCode: type: number enum: - 401 message: type: string error: type: string required: - reqId - statusCode - message - error additionalProperties: false '403': description: Default Response content: application/json: schema: type: object properties: reqId: type: string statusCode: type: number enum: - 403 message: type: string details: {} error: type: string required: - reqId - statusCode - message - error additionalProperties: false '404': description: Default Response content: application/json: schema: type: object properties: reqId: type: string statusCode: type: number enum: - 404 message: type: string error: type: string required: - reqId - statusCode - message - error additionalProperties: false '422': description: Default Response content: application/json: schema: type: object properties: reqId: type: string statusCode: type: number enum: - 422 message: {} error: type: string required: - reqId - statusCode - error additionalProperties: false '500': description: Default Response content: application/json: schema: type: object properties: reqId: type: string statusCode: type: number enum: - 500 message: type: string error: type: string required: - reqId - statusCode - message - error additionalProperties: false ```` --- # Source: https://infisical.com/docs/api-reference/endpoints/secret-syncs/zabbix/get-by-name.md # Source: https://infisical.com/docs/api-reference/endpoints/secret-syncs/windmill/get-by-name.md # Source: https://infisical.com/docs/api-reference/endpoints/secret-syncs/vercel/get-by-name.md # Source: https://infisical.com/docs/api-reference/endpoints/secret-syncs/terraform-cloud/get-by-name.md # Source: https://infisical.com/docs/api-reference/endpoints/secret-syncs/teamcity/get-by-name.md # Source: https://infisical.com/docs/api-reference/endpoints/secret-syncs/supabase/get-by-name.md # Source: https://infisical.com/docs/api-reference/endpoints/secret-syncs/render/get-by-name.md # Source: https://infisical.com/docs/api-reference/endpoints/secret-syncs/railway/get-by-name.md # Source: https://infisical.com/docs/api-reference/endpoints/secret-syncs/octopus-deploy/get-by-name.md # Source: https://infisical.com/docs/api-reference/endpoints/secret-syncs/oci-vault/get-by-name.md # Source: https://infisical.com/docs/api-reference/endpoints/secret-syncs/northflank/get-by-name.md # Source: https://infisical.com/docs/api-reference/endpoints/secret-syncs/netlify/get-by-name.md # Source: https://infisical.com/docs/api-reference/endpoints/secret-syncs/laravel-forge/get-by-name.md # Source: https://infisical.com/docs/api-reference/endpoints/secret-syncs/humanitec/get-by-name.md # Source: https://infisical.com/docs/api-reference/endpoints/secret-syncs/heroku/get-by-name.md # Source: https://infisical.com/docs/api-reference/endpoints/secret-syncs/hashicorp-vault/get-by-name.md # Source: https://infisical.com/docs/api-reference/endpoints/secret-syncs/gitlab/get-by-name.md # Source: https://infisical.com/docs/api-reference/endpoints/secret-syncs/github/get-by-name.md # Source: https://infisical.com/docs/api-reference/endpoints/secret-syncs/gcp-secret-manager/get-by-name.md # Source: https://infisical.com/docs/api-reference/endpoints/secret-syncs/flyio/get-by-name.md # Source: https://infisical.com/docs/api-reference/endpoints/secret-syncs/digital-ocean-app-platform/get-by-name.md # Source: https://infisical.com/docs/api-reference/endpoints/secret-syncs/databricks/get-by-name.md # Source: https://infisical.com/docs/api-reference/endpoints/secret-syncs/cloudflare-workers/get-by-name.md # Source: https://infisical.com/docs/api-reference/endpoints/secret-syncs/cloudflare-pages/get-by-name.md # Source: https://infisical.com/docs/api-reference/endpoints/secret-syncs/circleci/get-by-name.md # Source: https://infisical.com/docs/api-reference/endpoints/secret-syncs/chef/get-by-name.md # Source: https://infisical.com/docs/api-reference/endpoints/secret-syncs/checkly/get-by-name.md # Source: https://infisical.com/docs/api-reference/endpoints/secret-syncs/camunda/get-by-name.md # Source: https://infisical.com/docs/api-reference/endpoints/secret-syncs/bitbucket/get-by-name.md # Source: https://infisical.com/docs/api-reference/endpoints/secret-syncs/azure-key-vault/get-by-name.md # Source: https://infisical.com/docs/api-reference/endpoints/secret-syncs/azure-devops/get-by-name.md # Source: https://infisical.com/docs/api-reference/endpoints/secret-syncs/azure-app-configuration/get-by-name.md # Source: https://infisical.com/docs/api-reference/endpoints/secret-syncs/aws-secrets-manager/get-by-name.md # Source: https://infisical.com/docs/api-reference/endpoints/secret-syncs/aws-parameter-store/get-by-name.md # Source: https://infisical.com/docs/api-reference/endpoints/secret-syncs/1password/get-by-name.md # Source: https://infisical.com/docs/api-reference/endpoints/secret-scanning/data-sources/gitlab/get-by-name.md # Source: https://infisical.com/docs/api-reference/endpoints/secret-scanning/data-sources/github/get-by-name.md # Source: https://infisical.com/docs/api-reference/endpoints/secret-scanning/data-sources/bitbucket/get-by-name.md # Source: https://infisical.com/docs/api-reference/endpoints/secret-rotations/windows-local-account/get-by-name.md # Source: https://infisical.com/docs/api-reference/endpoints/secret-rotations/unix-linux-local-account/get-by-name.md # Source: https://infisical.com/docs/api-reference/endpoints/secret-rotations/redis-credentials/get-by-name.md # Source: https://infisical.com/docs/api-reference/endpoints/secret-rotations/postgres-credentials/get-by-name.md # Source: https://infisical.com/docs/api-reference/endpoints/secret-rotations/oracledb-credentials/get-by-name.md # Source: https://infisical.com/docs/api-reference/endpoints/secret-rotations/okta-client-secret/get-by-name.md # Source: https://infisical.com/docs/api-reference/endpoints/secret-rotations/mysql-credentials/get-by-name.md # Source: https://infisical.com/docs/api-reference/endpoints/secret-rotations/mssql-credentials/get-by-name.md # Source: https://infisical.com/docs/api-reference/endpoints/secret-rotations/mongodb-credentials/get-by-name.md # Source: https://infisical.com/docs/api-reference/endpoints/secret-rotations/ldap-password/get-by-name.md # Source: https://infisical.com/docs/api-reference/endpoints/secret-rotations/databricks-service-principal-secret/get-by-name.md # Source: https://infisical.com/docs/api-reference/endpoints/secret-rotations/azure-client-secret/get-by-name.md # Source: https://infisical.com/docs/api-reference/endpoints/secret-rotations/aws-iam-user-secret/get-by-name.md # Source: https://infisical.com/docs/api-reference/endpoints/secret-rotations/auth0-client-secret/get-by-name.md # Source: https://infisical.com/docs/api-reference/endpoints/kms/keys/get-by-name.md # Source: https://infisical.com/docs/api-reference/endpoints/app-connections/zabbix/get-by-name.md # Source: https://infisical.com/docs/api-reference/endpoints/app-connections/windmill/get-by-name.md # Source: https://infisical.com/docs/api-reference/endpoints/app-connections/vercel/get-by-name.md # Source: https://infisical.com/docs/api-reference/endpoints/app-connections/terraform-cloud/get-by-name.md # Source: https://infisical.com/docs/api-reference/endpoints/app-connections/teamcity/get-by-name.md # Source: https://infisical.com/docs/api-reference/endpoints/app-connections/supabase/get-by-name.md # Source: https://infisical.com/docs/api-reference/endpoints/app-connections/ssh/get-by-name.md # Source: https://infisical.com/docs/api-reference/endpoints/app-connections/smb/get-by-name.md # Source: https://infisical.com/docs/api-reference/endpoints/app-connections/render/get-by-name.md # Source: https://infisical.com/docs/api-reference/endpoints/app-connections/redis/get-by-name.md # Source: https://infisical.com/docs/api-reference/endpoints/app-connections/railway/get-by-name.md # Source: https://infisical.com/docs/api-reference/endpoints/app-connections/postgres/get-by-name.md # Source: https://infisical.com/docs/api-reference/endpoints/app-connections/oracledb/get-by-name.md # Source: https://infisical.com/docs/api-reference/endpoints/app-connections/openrouter/get-by-name.md # Source: https://infisical.com/docs/api-reference/endpoints/app-connections/okta/get-by-name.md # Source: https://infisical.com/docs/api-reference/endpoints/app-connections/octopus-deploy/get-by-name.md # Source: https://infisical.com/docs/api-reference/endpoints/app-connections/oci/get-by-name.md # Source: https://infisical.com/docs/api-reference/endpoints/app-connections/northflank/get-by-name.md # Source: https://infisical.com/docs/api-reference/endpoints/app-connections/netlify/get-by-name.md # Source: https://infisical.com/docs/api-reference/endpoints/app-connections/mysql/get-by-name.md # Source: https://infisical.com/docs/api-reference/endpoints/app-connections/mssql/get-by-name.md # Source: https://infisical.com/docs/api-reference/endpoints/app-connections/mongodb/get-by-name.md # Source: https://infisical.com/docs/api-reference/endpoints/app-connections/ldap/get-by-name.md # Source: https://infisical.com/docs/api-reference/endpoints/app-connections/laravel-forge/get-by-name.md # Source: https://infisical.com/docs/api-reference/endpoints/app-connections/humanitec/get-by-name.md # Source: https://infisical.com/docs/api-reference/endpoints/app-connections/heroku/get-by-name.md # Source: https://infisical.com/docs/api-reference/endpoints/app-connections/hashicorp-vault/get-by-name.md # Source: https://infisical.com/docs/api-reference/endpoints/app-connections/gitlab/get-by-name.md # Source: https://infisical.com/docs/api-reference/endpoints/app-connections/github/get-by-name.md # Source: https://infisical.com/docs/api-reference/endpoints/app-connections/github-radar/get-by-name.md # Source: https://infisical.com/docs/api-reference/endpoints/app-connections/gcp/get-by-name.md # Source: https://infisical.com/docs/api-reference/endpoints/app-connections/flyio/get-by-name.md # Source: https://infisical.com/docs/api-reference/endpoints/app-connections/digital-ocean/get-by-name.md # Source: https://infisical.com/docs/api-reference/endpoints/app-connections/databricks/get-by-name.md # Source: https://infisical.com/docs/api-reference/endpoints/app-connections/cloudflare/get-by-name.md # Source: https://infisical.com/docs/api-reference/endpoints/app-connections/circleci/get-by-name.md # Source: https://infisical.com/docs/api-reference/endpoints/app-connections/chef/get-by-name.md # Source: https://infisical.com/docs/api-reference/endpoints/app-connections/checkly/get-by-name.md # Source: https://infisical.com/docs/api-reference/endpoints/app-connections/camunda/get-by-name.md # Source: https://infisical.com/docs/api-reference/endpoints/app-connections/bitbucket/get-by-name.md # Source: https://infisical.com/docs/api-reference/endpoints/app-connections/azure-key-vault/get-by-name.md # Source: https://infisical.com/docs/api-reference/endpoints/app-connections/azure-devops/get-by-name.md # Source: https://infisical.com/docs/api-reference/endpoints/app-connections/azure-client-secret/get-by-name.md # Source: https://infisical.com/docs/api-reference/endpoints/app-connections/azure-app-configuration/get-by-name.md # Source: https://infisical.com/docs/api-reference/endpoints/app-connections/azure-adcs/get-by-name.md # Source: https://infisical.com/docs/api-reference/endpoints/app-connections/aws/get-by-name.md # Source: https://infisical.com/docs/api-reference/endpoints/app-connections/auth0/get-by-name.md # Source: https://infisical.com/docs/api-reference/endpoints/app-connections/1password/get-by-name.md > ## Documentation Index > Fetch the complete documentation index at: https://infisical.com/docs/llms.txt > Use this file to discover all available pages before exploring further. # Get by Name > Get the specified 1Password Connection by name. ## OpenAPI ````yaml GET /api/v1/app-connections/1password/connection-name/{connectionName} openapi: 3.0.3 info: title: Infisical API description: List of all available APIs that can be consumed version: 0.0.1 servers: - url: https://us.infisical.com description: Production server (US) - url: https://eu.infisical.com description: Production server (EU) - url: http://localhost:8080 description: Local server security: [] paths: /api/v1/app-connections/1password/connection-name/{connectionName}: get: tags: - App Connections description: Get the specified 1Password Connection by name. operationId: getOnePasswordAppConnectionByName parameters: - schema: type: string in: query name: projectId required: false description: >- The project ID of the 1Password Connection is associated with. Leave unspecified to get organization-level connections. - schema: type: string minLength: 1 in: path name: connectionName required: true description: The name of the 1Password Connection to retrieve. responses: '200': description: Default Response content: application/json: schema: type: object properties: appConnection: anyOf: - type: object properties: id: type: string format: uuid name: type: string description: type: string nullable: true version: type: number default: 1 orgId: type: string format: uuid createdAt: type: string format: date-time updatedAt: type: string format: date-time isPlatformManagedCredentials: type: boolean default: false nullable: true gatewayId: type: string format: uuid nullable: true projectId: type: string nullable: true credentialsHash: type: string project: type: object properties: name: type: string id: type: string type: type: string slug: type: string required: - name - id - type - slug additionalProperties: false nullable: true app: type: string enum: - 1password method: type: string enum: - api-token credentials: type: object properties: instanceUrl: type: string format: uri minLength: 1 description: >- The URL of the 1Password Connect Server instance to authenticate with. required: - instanceUrl additionalProperties: false required: - id - name - orgId - createdAt - updatedAt - app - method - credentials additionalProperties: false title: 1Password (API Token) required: - appConnection additionalProperties: false '400': description: Default Response content: application/json: schema: type: object properties: reqId: type: string statusCode: type: number enum: - 400 message: type: string error: type: string details: {} required: - reqId - statusCode - message - error additionalProperties: false '401': description: Default Response content: application/json: schema: type: object properties: reqId: type: string statusCode: type: number enum: - 401 message: type: string error: type: string required: - reqId - statusCode - message - error additionalProperties: false '403': description: Default Response content: application/json: schema: type: object properties: reqId: type: string statusCode: type: number enum: - 403 message: type: string details: {} error: type: string required: - reqId - statusCode - message - error additionalProperties: false '404': description: Default Response content: application/json: schema: type: object properties: reqId: type: string statusCode: type: number enum: - 404 message: type: string error: type: string required: - reqId - statusCode - message - error additionalProperties: false '422': description: Default Response content: application/json: schema: type: object properties: reqId: type: string statusCode: type: number enum: - 422 message: {} error: type: string required: - reqId - statusCode - error additionalProperties: false '500': description: Default Response content: application/json: schema: type: object properties: reqId: type: string statusCode: type: number enum: - 500 message: type: string error: type: string required: - reqId - statusCode - message - error additionalProperties: false ```` --- # Source: https://infisical.com/docs/api-reference/endpoints/secret-scanning/config/get-by-project-id.md > ## Documentation Index > Fetch the complete documentation index at: https://infisical.com/docs/llms.txt > Use this file to discover all available pages before exploring further. # Get by Project ID > Get the Secret Scanning Config for the specified project. ## OpenAPI ````yaml GET /api/v2/secret-scanning/configs openapi: 3.0.3 info: title: Infisical API description: List of all available APIs that can be consumed version: 0.0.1 servers: - url: https://us.infisical.com description: Production server (US) - url: https://eu.infisical.com description: Production server (EU) - url: http://localhost:8080 description: Local server security: [] paths: /api/v2/secret-scanning/configs: get: tags: - Secret Scanning description: Get the Secret Scanning Config for the specified project. operationId: getSecretScanningConfig parameters: - schema: type: string minLength: 1 in: query name: projectId required: true description: >- The ID of the project to retrieve the Secret Scanning Configuration for. responses: '200': description: Default Response content: application/json: schema: type: object properties: config: type: object properties: content: type: string nullable: true projectId: type: string updatedAt: type: string format: date-time nullable: true required: - projectId additionalProperties: false required: - config additionalProperties: false '400': description: Default Response content: application/json: schema: type: object properties: reqId: type: string statusCode: type: number enum: - 400 message: type: string error: type: string details: {} required: - reqId - statusCode - message - error additionalProperties: false '401': description: Default Response content: application/json: schema: type: object properties: reqId: type: string statusCode: type: number enum: - 401 message: type: string error: type: string required: - reqId - statusCode - message - error additionalProperties: false '403': description: Default Response content: application/json: schema: type: object properties: reqId: type: string statusCode: type: number enum: - 403 message: type: string details: {} error: type: string required: - reqId - statusCode - message - error additionalProperties: false '404': description: Default Response content: application/json: schema: type: object properties: reqId: type: string statusCode: type: number enum: - 404 message: type: string error: type: string required: - reqId - statusCode - message - error additionalProperties: false '422': description: Default Response content: application/json: schema: type: object properties: reqId: type: string statusCode: type: number enum: - 422 message: {} error: type: string required: - reqId - statusCode - error additionalProperties: false '500': description: Default Response content: application/json: schema: type: object properties: reqId: type: string statusCode: type: number enum: - 500 message: type: string error: type: string required: - reqId - statusCode - message - error additionalProperties: false ```` --- # Source: https://infisical.com/docs/api-reference/endpoints/secret-tags/get-by-slug.md # Source: https://infisical.com/docs/api-reference/endpoints/project-roles/get-by-slug.md # Source: https://infisical.com/docs/api-reference/endpoints/organization-roles/get-by-slug.md # Source: https://infisical.com/docs/api-reference/endpoints/deprecated/secret-tags/get-by-slug.md # Source: https://infisical.com/docs/api-reference/endpoints/deprecated/project-roles/get-by-slug.md # Source: https://infisical.com/docs/api-reference/endpoints/certificate-profiles/get-by-slug.md > ## Documentation Index > Fetch the complete documentation index at: https://infisical.com/docs/llms.txt > Use this file to discover all available pages before exploring further. # Get by Slug ## OpenAPI ````yaml GET /api/v1/cert-manager/certificate-profiles/slug/{slug} openapi: 3.0.3 info: title: Infisical API description: List of all available APIs that can be consumed version: 0.0.1 servers: - url: https://us.infisical.com description: Production server (US) - url: https://eu.infisical.com description: Production server (EU) - url: http://localhost:8080 description: Local server security: [] paths: /api/v1/cert-manager/certificate-profiles/slug/{slug}: get: tags: - PKI Certificate Profiles operationId: getCertificateProfileBySlug parameters: - schema: type: string minLength: 1 in: query name: projectId required: true - schema: type: string minLength: 1 in: path name: slug required: true responses: '200': description: Default Response content: application/json: schema: type: object properties: certificateProfile: type: object properties: id: type: string format: uuid projectId: type: string caId: type: string format: uuid nullable: true certificatePolicyId: type: string format: uuid slug: type: string description: type: string nullable: true enrollmentType: type: string estConfigId: type: string format: uuid nullable: true apiConfigId: type: string format: uuid nullable: true createdAt: type: string format: date-time updatedAt: type: string format: date-time acmeConfigId: type: string format: uuid nullable: true issuerType: type: string default: ca externalConfigs: anyOf: - type: object properties: template: type: string minLength: 1 description: Certificate template name for Azure AD CS required: - template additionalProperties: false - type: object properties: {} additionalProperties: false - type: object properties: {} additionalProperties: false nullable: true defaultTtlDays: type: number nullable: true required: - id - projectId - certificatePolicyId - slug - enrollmentType - createdAt - updatedAt additionalProperties: false required: - certificateProfile additionalProperties: false '400': description: Default Response content: application/json: schema: type: object properties: reqId: type: string statusCode: type: number enum: - 400 message: type: string error: type: string details: {} required: - reqId - statusCode - message - error additionalProperties: false '401': description: Default Response content: application/json: schema: type: object properties: reqId: type: string statusCode: type: number enum: - 401 message: type: string error: type: string required: - reqId - statusCode - message - error additionalProperties: false '403': description: Default Response content: application/json: schema: type: object properties: reqId: type: string statusCode: type: number enum: - 403 message: type: string details: {} error: type: string required: - reqId - statusCode - message - error additionalProperties: false '404': description: Default Response content: application/json: schema: type: object properties: reqId: type: string statusCode: type: number enum: - 404 message: type: string error: type: string required: - reqId - statusCode - message - error additionalProperties: false '422': description: Default Response content: application/json: schema: type: object properties: reqId: type: string statusCode: type: number enum: - 422 message: {} error: type: string required: - reqId - statusCode - error additionalProperties: false '500': description: Default Response content: application/json: schema: type: object properties: reqId: type: string statusCode: type: number enum: - 500 message: type: string error: type: string required: - reqId - statusCode - message - error additionalProperties: false ```` --- # Source: https://infisical.com/docs/api-reference/endpoints/project-users/get-by-username.md # Source: https://infisical.com/docs/api-reference/endpoints/deprecated/project-users/get-by-username.md > ## Documentation Index > Fetch the complete documentation index at: https://infisical.com/docs/llms.txt > Use this file to discover all available pages before exploring further. # Get By Username > Return project user memberships ## OpenAPI ````yaml POST /api/v1/workspace/{workspaceId}/memberships/details openapi: 3.0.3 info: title: Infisical API description: List of all available APIs that can be consumed version: 0.0.1 servers: - url: https://us.infisical.com description: Production server (US) - url: https://eu.infisical.com description: Production server (EU) - url: http://localhost:8080 description: Local server security: [] paths: /api/v1/workspace/{workspaceId}/memberships/details: post: tags: - Project Users description: Return project user memberships parameters: - schema: type: string minLength: 1 in: path name: workspaceId required: true description: The ID of the project to get memberships from. requestBody: content: application/json: schema: type: object properties: username: type: string minLength: 1 description: >- The username to get project membership of. Email is the default username. required: - username additionalProperties: false required: true responses: '200': description: Default Response content: application/json: schema: type: object properties: membership: type: object properties: id: type: string format: uuid userId: type: string format: uuid projectId: type: string user: type: object properties: email: type: string nullable: true firstName: type: string nullable: true lastName: type: string nullable: true id: type: string format: uuid publicKey: type: string nullable: true required: - id additionalProperties: false roles: type: array items: type: object properties: id: type: string role: type: string customRoleId: type: string nullable: true customRoleName: type: string nullable: true customRoleSlug: type: string nullable: true isTemporary: type: boolean temporaryMode: type: string nullable: true temporaryRange: type: string nullable: true temporaryAccessStartTime: type: string format: date-time nullable: true temporaryAccessEndTime: type: string format: date-time nullable: true required: - id - role - isTemporary additionalProperties: false required: - id - userId - projectId - user - roles additionalProperties: false required: - membership additionalProperties: false '400': description: Default Response content: application/json: schema: type: object properties: reqId: type: string statusCode: type: number enum: - 400 message: type: string error: type: string details: {} required: - reqId - statusCode - message - error additionalProperties: false '401': description: Default Response content: application/json: schema: type: object properties: reqId: type: string statusCode: type: number enum: - 401 message: type: string error: type: string required: - reqId - statusCode - message - error additionalProperties: false '403': description: Default Response content: application/json: schema: type: object properties: reqId: type: string statusCode: type: number enum: - 403 message: type: string details: {} error: type: string required: - reqId - statusCode - message - error additionalProperties: false '404': description: Default Response content: application/json: schema: type: object properties: reqId: type: string statusCode: type: number enum: - 404 message: type: string error: type: string required: - reqId - statusCode - message - error additionalProperties: false '422': description: Default Response content: application/json: schema: type: object properties: reqId: type: string statusCode: type: number enum: - 422 message: {} error: type: string required: - reqId - statusCode - error additionalProperties: false '500': description: Default Response content: application/json: schema: type: object properties: reqId: type: string statusCode: type: number enum: - 500 message: type: string error: type: string required: - reqId - statusCode - message - error additionalProperties: false security: - bearerAuth: [] components: securitySchemes: bearerAuth: type: http scheme: bearer bearerFormat: JWT description: An access token in Infisical ```` --- # Source: https://infisical.com/docs/api-reference/endpoints/universal-auth/get-client-secret-by-id.md > ## Documentation Index > Fetch the complete documentation index at: https://infisical.com/docs/llms.txt > Use this file to discover all available pages before exploring further. # Get Client Secret By ID > Get Universal Auth Client Secret for machine identity ## OpenAPI ````yaml GET /api/v1/auth/universal-auth/identities/{identityId}/client-secrets/{clientSecretId} openapi: 3.0.3 info: title: Infisical API description: List of all available APIs that can be consumed version: 0.0.1 servers: - url: https://us.infisical.com description: Production server (US) - url: https://eu.infisical.com description: Production server (EU) - url: http://localhost:8080 description: Local server security: [] paths: /api/v1/auth/universal-auth/identities/{identityId}/client-secrets/{clientSecretId}: get: tags: - Universal Auth description: Get Universal Auth Client Secret for machine identity operationId: getUniversalAuthClientSecret parameters: - schema: type: string in: path name: identityId required: true description: The ID of the machine identity to get the client secret from. - schema: type: string in: path name: clientSecretId required: true description: The ID of the client secret to get details. responses: '200': description: Default Response content: application/json: schema: type: object properties: clientSecretData: type: object properties: id: type: string createdAt: type: string format: date-time updatedAt: type: string format: date-time description: type: string clientSecretPrefix: type: string clientSecretNumUses: type: number default: 0 clientSecretNumUsesLimit: type: number default: 0 clientSecretTTL: type: number default: 0 identityUAId: type: string format: uuid isClientSecretRevoked: type: boolean default: false required: - id - createdAt - updatedAt - description - clientSecretPrefix - identityUAId additionalProperties: false required: - clientSecretData additionalProperties: false '400': description: Default Response content: application/json: schema: type: object properties: reqId: type: string statusCode: type: number enum: - 400 message: type: string error: type: string details: {} required: - reqId - statusCode - message - error additionalProperties: false '401': description: Default Response content: application/json: schema: type: object properties: reqId: type: string statusCode: type: number enum: - 401 message: type: string error: type: string required: - reqId - statusCode - message - error additionalProperties: false '403': description: Default Response content: application/json: schema: type: object properties: reqId: type: string statusCode: type: number enum: - 403 message: type: string details: {} error: type: string required: - reqId - statusCode - message - error additionalProperties: false '404': description: Default Response content: application/json: schema: type: object properties: reqId: type: string statusCode: type: number enum: - 404 message: type: string error: type: string required: - reqId - statusCode - message - error additionalProperties: false '422': description: Default Response content: application/json: schema: type: object properties: reqId: type: string statusCode: type: number enum: - 422 message: {} error: type: string required: - reqId - statusCode - error additionalProperties: false '500': description: Default Response content: application/json: schema: type: object properties: reqId: type: string statusCode: type: number enum: - 500 message: type: string error: type: string required: - reqId - statusCode - message - error additionalProperties: false security: - bearerAuth: [] components: securitySchemes: bearerAuth: type: http scheme: bearer bearerFormat: JWT description: An access token in Infisical ```` --- # Source: https://infisical.com/docs/api-reference/endpoints/secret-rotations/windows-local-account/get-generated-credentials-by-id.md # Source: https://infisical.com/docs/api-reference/endpoints/secret-rotations/unix-linux-local-account/get-generated-credentials-by-id.md # Source: https://infisical.com/docs/api-reference/endpoints/secret-rotations/redis-credentials/get-generated-credentials-by-id.md # Source: https://infisical.com/docs/api-reference/endpoints/secret-rotations/postgres-credentials/get-generated-credentials-by-id.md # Source: https://infisical.com/docs/api-reference/endpoints/secret-rotations/oracledb-credentials/get-generated-credentials-by-id.md # Source: https://infisical.com/docs/api-reference/endpoints/secret-rotations/okta-client-secret/get-generated-credentials-by-id.md # Source: https://infisical.com/docs/api-reference/endpoints/secret-rotations/mysql-credentials/get-generated-credentials-by-id.md # Source: https://infisical.com/docs/api-reference/endpoints/secret-rotations/mssql-credentials/get-generated-credentials-by-id.md # Source: https://infisical.com/docs/api-reference/endpoints/secret-rotations/mongodb-credentials/get-generated-credentials-by-id.md # Source: https://infisical.com/docs/api-reference/endpoints/secret-rotations/ldap-password/get-generated-credentials-by-id.md # Source: https://infisical.com/docs/api-reference/endpoints/secret-rotations/databricks-service-principal-secret/get-generated-credentials-by-id.md # Source: https://infisical.com/docs/api-reference/endpoints/secret-rotations/azure-client-secret/get-generated-credentials-by-id.md # Source: https://infisical.com/docs/api-reference/endpoints/secret-rotations/aws-iam-user-secret/get-generated-credentials-by-id.md # Source: https://infisical.com/docs/api-reference/endpoints/secret-rotations/auth0-client-secret/get-generated-credentials-by-id.md > ## Documentation Index > Fetch the complete documentation index at: https://infisical.com/docs/llms.txt > Use this file to discover all available pages before exploring further. # Get Credentials by ID > Get the generated credentials for the specified Auth0 Client Secret Rotation. ## OpenAPI ````yaml GET /api/v2/secret-rotations/auth0-client-secret/{rotationId}/generated-credentials openapi: 3.0.3 info: title: Infisical API description: List of all available APIs that can be consumed version: 0.0.1 servers: - url: https://us.infisical.com description: Production server (US) - url: https://eu.infisical.com description: Production server (EU) - url: http://localhost:8080 description: Local server security: [] paths: /api/v2/secret-rotations/auth0-client-secret/{rotationId}/generated-credentials: get: tags: - Secret Rotations description: >- Get the generated credentials for the specified Auth0 Client Secret Rotation. operationId: getAuth0ClientSecretRotationGeneratedCredentials parameters: - schema: type: string format: uuid in: path name: rotationId required: true description: >- The ID of the Auth0 Client Secret Rotation to retrieve the generated credentials for. responses: '200': description: Default Response content: application/json: schema: type: object properties: generatedCredentials: type: array items: type: object properties: clientId: type: string clientSecret: type: string required: - clientId - clientSecret additionalProperties: false minItems: 1 maxItems: 2 activeIndex: type: number rotationId: type: string format: uuid type: type: string enum: - auth0-client-secret required: - generatedCredentials - activeIndex - rotationId - type additionalProperties: false '400': description: Default Response content: application/json: schema: type: object properties: reqId: type: string statusCode: type: number enum: - 400 message: type: string error: type: string details: {} required: - reqId - statusCode - message - error additionalProperties: false '401': description: Default Response content: application/json: schema: type: object properties: reqId: type: string statusCode: type: number enum: - 401 message: type: string error: type: string required: - reqId - statusCode - message - error additionalProperties: false '403': description: Default Response content: application/json: schema: type: object properties: reqId: type: string statusCode: type: number enum: - 403 message: type: string details: {} error: type: string required: - reqId - statusCode - message - error additionalProperties: false '404': description: Default Response content: application/json: schema: type: object properties: reqId: type: string statusCode: type: number enum: - 404 message: type: string error: type: string required: - reqId - statusCode - message - error additionalProperties: false '422': description: Default Response content: application/json: schema: type: object properties: reqId: type: string statusCode: type: number enum: - 422 message: {} error: type: string required: - reqId - statusCode - error additionalProperties: false '500': description: Default Response content: application/json: schema: type: object properties: reqId: type: string statusCode: type: number enum: - 500 message: type: string error: type: string required: - reqId - statusCode - message - error additionalProperties: false ```` --- # Source: https://infisical.com/docs/api-reference/endpoints/certificate-profiles/get-latest-active-bundle.md > ## Documentation Index > Fetch the complete documentation index at: https://infisical.com/docs/llms.txt > Use this file to discover all available pages before exploring further. # Get Latest Active Certificate Bundle > Get latest active certificate bundle for a profile ## OpenAPI ````yaml GET /api/v1/cert-manager/certificate-profiles/{id}/certificates/latest-active-bundle openapi: 3.0.3 info: title: Infisical API description: List of all available APIs that can be consumed version: 0.0.1 servers: - url: https://us.infisical.com description: Production server (US) - url: https://eu.infisical.com description: Production server (EU) - url: http://localhost:8080 description: Local server security: [] paths: /api/v1/cert-manager/certificate-profiles/{id}/certificates/latest-active-bundle: get: tags: - PKI Certificate Profiles description: Get latest active certificate bundle for a profile operationId: getCertificateProfileLatestActiveBundle parameters: - schema: type: string format: uuid in: path name: id required: true responses: '200': description: Default Response content: application/json: schema: type: object properties: certificate: type: string nullable: true certificateChain: type: string nullable: true privateKey: type: string nullable: true serialNumber: type: string nullable: true required: - certificate - certificateChain - privateKey - serialNumber additionalProperties: false '400': description: Default Response content: application/json: schema: type: object properties: reqId: type: string statusCode: type: number enum: - 400 message: type: string error: type: string details: {} required: - reqId - statusCode - message - error additionalProperties: false '401': description: Default Response content: application/json: schema: type: object properties: reqId: type: string statusCode: type: number enum: - 401 message: type: string error: type: string required: - reqId - statusCode - message - error additionalProperties: false '403': description: Default Response content: application/json: schema: type: object properties: reqId: type: string statusCode: type: number enum: - 403 message: type: string details: {} error: type: string required: - reqId - statusCode - message - error additionalProperties: false '404': description: Default Response content: application/json: schema: type: object properties: reqId: type: string statusCode: type: number enum: - 404 message: type: string error: type: string required: - reqId - statusCode - message - error additionalProperties: false '422': description: Default Response content: application/json: schema: type: object properties: reqId: type: string statusCode: type: number enum: - 422 message: {} error: type: string required: - reqId - statusCode - error additionalProperties: false '500': description: Default Response content: application/json: schema: type: object properties: reqId: type: string statusCode: type: number enum: - 500 message: type: string error: type: string required: - reqId - statusCode - message - error additionalProperties: false ```` --- # Source: https://infisical.com/docs/api-reference/endpoints/organizations/ldap-sso/get-ldap-config.md > ## Documentation Index > Fetch the complete documentation index at: https://infisical.com/docs/llms.txt > Use this file to discover all available pages before exploring further. # Get LDAP SSO Config > Get LDAP config ## OpenAPI ````yaml GET /api/v1/ldap/config openapi: 3.0.3 info: title: Infisical API description: List of all available APIs that can be consumed version: 0.0.1 servers: - url: https://us.infisical.com description: Production server (US) - url: https://eu.infisical.com description: Production server (EU) - url: http://localhost:8080 description: Local server security: [] paths: /api/v1/ldap/config: get: tags: - LDAP SSO description: Get LDAP config parameters: - schema: type: string in: query name: organizationId required: true description: The ID of the organization to get the LDAP config for. responses: '200': description: Default Response content: application/json: schema: type: object properties: id: type: string organization: type: string isActive: type: boolean url: type: string bindDN: type: string bindPass: type: string uniqueUserAttribute: type: string searchBase: type: string searchFilter: type: string groupSearchBase: type: string groupSearchFilter: type: string caCert: type: string required: - id - organization - isActive - url - bindDN - bindPass - uniqueUserAttribute - searchBase - searchFilter - groupSearchBase - groupSearchFilter - caCert additionalProperties: false '400': description: Default Response content: application/json: schema: type: object properties: reqId: type: string statusCode: type: number enum: - 400 message: type: string error: type: string details: {} required: - reqId - statusCode - message - error additionalProperties: false '401': description: Default Response content: application/json: schema: type: object properties: reqId: type: string statusCode: type: number enum: - 401 message: type: string error: type: string required: - reqId - statusCode - message - error additionalProperties: false '403': description: Default Response content: application/json: schema: type: object properties: reqId: type: string statusCode: type: number enum: - 403 message: type: string details: {} error: type: string required: - reqId - statusCode - message - error additionalProperties: false '404': description: Default Response content: application/json: schema: type: object properties: reqId: type: string statusCode: type: number enum: - 404 message: type: string error: type: string required: - reqId - statusCode - message - error additionalProperties: false '422': description: Default Response content: application/json: schema: type: object properties: reqId: type: string statusCode: type: number enum: - 422 message: {} error: type: string required: - reqId - statusCode - error additionalProperties: false '500': description: Default Response content: application/json: schema: type: object properties: reqId: type: string statusCode: type: number enum: - 500 message: type: string error: type: string required: - reqId - statusCode - message - error additionalProperties: false security: - bearerAuth: [] components: securitySchemes: bearerAuth: type: http scheme: bearer bearerFormat: JWT description: An access token in Infisical ```` --- # Source: https://infisical.com/docs/api-reference/endpoints/dynamic-secrets/get-lease.md > ## Documentation Index > Fetch the complete documentation index at: https://infisical.com/docs/llms.txt > Use this file to discover all available pages before exploring further. # Get Lease ## OpenAPI ````yaml GET /api/v1/dynamic-secrets/leases/{leaseId} openapi: 3.0.3 info: title: Infisical API description: List of all available APIs that can be consumed version: 0.0.1 servers: - url: https://us.infisical.com description: Production server (US) - url: https://eu.infisical.com description: Production server (EU) - url: http://localhost:8080 description: Local server security: [] paths: /api/v1/dynamic-secrets/leases/{leaseId}: get: tags: - Dynamic Secrets parameters: - schema: type: string minLength: 1 in: query name: projectSlug required: true description: The slug of the project to create dynamic secret in. - schema: type: string default: / in: query name: path required: false description: The path to list folders from. - schema: type: string minLength: 1 in: query name: environmentSlug required: true description: The slug of the environment to list folders from. - schema: type: string minLength: 1 in: path name: leaseId required: true description: The ID of the dynamic secret lease. responses: '200': description: Default Response content: application/json: schema: type: object properties: lease: type: object properties: id: type: string format: uuid version: type: number externalEntityId: type: string expireAt: type: string format: date-time status: type: string nullable: true statusDetails: type: string nullable: true dynamicSecretId: type: string format: uuid createdAt: type: string format: date-time updatedAt: type: string format: date-time config: nullable: true dynamicSecret: type: object properties: id: type: string format: uuid name: type: string version: type: number type: type: string defaultTTL: type: string maxTTL: type: string nullable: true folderId: type: string format: uuid status: type: string nullable: true statusDetails: type: string nullable: true createdAt: type: string format: date-time updatedAt: type: string format: date-time projectGatewayId: type: string format: uuid nullable: true gatewayId: type: string format: uuid nullable: true usernameTemplate: type: string nullable: true gatewayV2Id: type: string format: uuid nullable: true metadata: type: array items: type: object properties: key: type: string minLength: 1 value: type: string default: '' required: - key additionalProperties: false required: - id - name - version - type - defaultTTL - folderId - createdAt - updatedAt additionalProperties: false required: - id - version - externalEntityId - expireAt - dynamicSecretId - createdAt - updatedAt - dynamicSecret additionalProperties: false required: - lease additionalProperties: false '400': description: Default Response content: application/json: schema: type: object properties: reqId: type: string statusCode: type: number enum: - 400 message: type: string error: type: string details: {} required: - reqId - statusCode - message - error additionalProperties: false '401': description: Default Response content: application/json: schema: type: object properties: reqId: type: string statusCode: type: number enum: - 401 message: type: string error: type: string required: - reqId - statusCode - message - error additionalProperties: false '403': description: Default Response content: application/json: schema: type: object properties: reqId: type: string statusCode: type: number enum: - 403 message: type: string details: {} error: type: string required: - reqId - statusCode - message - error additionalProperties: false '404': description: Default Response content: application/json: schema: type: object properties: reqId: type: string statusCode: type: number enum: - 404 message: type: string error: type: string required: - reqId - statusCode - message - error additionalProperties: false '422': description: Default Response content: application/json: schema: type: object properties: reqId: type: string statusCode: type: number enum: - 422 message: {} error: type: string required: - reqId - statusCode - error additionalProperties: false '500': description: Default Response content: application/json: schema: type: object properties: reqId: type: string statusCode: type: number enum: - 500 message: type: string error: type: string required: - reqId - statusCode - message - error additionalProperties: false ```` --- # Source: https://infisical.com/docs/api-reference/endpoints/organizations/oidc-sso/get-oidc-config.md > ## Documentation Index > Fetch the complete documentation index at: https://infisical.com/docs/llms.txt > Use this file to discover all available pages before exploring further. # Get OIDC Config > Get OIDC config ## OpenAPI ````yaml GET /api/v1/sso/oidc/config openapi: 3.0.3 info: title: Infisical API description: List of all available APIs that can be consumed version: 0.0.1 servers: - url: https://us.infisical.com description: Production server (US) - url: https://eu.infisical.com description: Production server (EU) - url: http://localhost:8080 description: Local server security: [] paths: /api/v1/sso/oidc/config: get: tags: - OIDC SSO description: Get OIDC config parameters: - schema: type: string in: query name: organizationId required: true description: The ID of the organization to get the OIDC config for. responses: '200': description: Default Response content: application/json: schema: type: object properties: id: type: string format: uuid issuer: type: string nullable: true authorizationEndpoint: type: string nullable: true jwksUri: type: string nullable: true tokenEndpoint: type: string nullable: true userinfoEndpoint: type: string nullable: true configurationType: type: string discoveryURL: type: string nullable: true isActive: type: boolean orgId: type: string format: uuid allowedEmailDomains: type: string nullable: true manageGroupMemberships: type: boolean default: false jwtSignatureAlgorithm: type: string default: RS256 clientId: type: string clientSecret: type: string required: - id - configurationType - isActive - orgId - clientId - clientSecret additionalProperties: false '400': description: Default Response content: application/json: schema: type: object properties: reqId: type: string statusCode: type: number enum: - 400 message: type: string error: type: string details: {} required: - reqId - statusCode - message - error additionalProperties: false '401': description: Default Response content: application/json: schema: type: object properties: reqId: type: string statusCode: type: number enum: - 401 message: type: string error: type: string required: - reqId - statusCode - message - error additionalProperties: false '403': description: Default Response content: application/json: schema: type: object properties: reqId: type: string statusCode: type: number enum: - 403 message: type: string details: {} error: type: string required: - reqId - statusCode - message - error additionalProperties: false '404': description: Default Response content: application/json: schema: type: object properties: reqId: type: string statusCode: type: number enum: - 404 message: type: string error: type: string required: - reqId - statusCode - message - error additionalProperties: false '422': description: Default Response content: application/json: schema: type: object properties: reqId: type: string statusCode: type: number enum: - 422 message: {} error: type: string required: - reqId - statusCode - error additionalProperties: false '500': description: Default Response content: application/json: schema: type: object properties: reqId: type: string statusCode: type: number enum: - 500 message: type: string error: type: string required: - reqId - statusCode - message - error additionalProperties: false security: - bearerAuth: [] components: securitySchemes: bearerAuth: type: http scheme: bearer bearerFormat: JWT description: An access token in Infisical ```` --- # Source: https://infisical.com/docs/api-reference/endpoints/projects/get-project-by-slug.md # Source: https://infisical.com/docs/api-reference/endpoints/deprecated/projects/get-project-by-slug.md > ## Documentation Index > Fetch the complete documentation index at: https://infisical.com/docs/llms.txt > Use this file to discover all available pages before exploring further. # Get Project By Slug > Get project details by slug ## OpenAPI ````yaml GET /api/v2/workspace/{slug} openapi: 3.0.3 info: title: Infisical API description: List of all available APIs that can be consumed version: 0.0.1 servers: - url: https://us.infisical.com description: Production server (US) - url: https://eu.infisical.com description: Production server (EU) - url: http://localhost:8080 description: Local server security: [] paths: /api/v2/workspace/{slug}: get: tags: - Projects description: Get project details by slug parameters: - schema: type: string minLength: 1 maxLength: 64 in: path name: slug required: true description: The slug of the project to get. responses: '200': description: Default Response content: application/json: schema: type: object properties: id: type: string name: type: string description: type: string nullable: true type: type: string defaultProduct: type: string nullable: true slug: type: string autoCapitalization: type: boolean default: false nullable: true orgId: type: string format: uuid createdAt: type: string format: date-time updatedAt: type: string format: date-time version: type: number default: 1 upgradeStatus: type: string nullable: true pitVersionLimit: type: number default: 10 kmsCertificateKeyId: type: string format: uuid nullable: true auditLogsRetentionDays: type: number nullable: true hasDeleteProtection: type: boolean default: false nullable: true secretSharing: type: boolean default: true showSnapshotsLegacy: type: boolean default: false secretDetectionIgnoreValues: type: array items: type: string nullable: true enforceEncryptedSecretManagerSecretMetadata: type: boolean nullable: true _id: type: string environments: type: array items: type: object properties: name: type: string slug: type: string id: type: string required: - name - slug - id additionalProperties: false kmsSecretManagerKeyId: type: string nullable: true required: - id - name - type - slug - orgId - createdAt - updatedAt - _id - environments additionalProperties: false '400': description: Default Response content: application/json: schema: type: object properties: reqId: type: string statusCode: type: number enum: - 400 message: type: string error: type: string details: {} required: - reqId - statusCode - message - error additionalProperties: false '401': description: Default Response content: application/json: schema: type: object properties: reqId: type: string statusCode: type: number enum: - 401 message: type: string error: type: string required: - reqId - statusCode - message - error additionalProperties: false '403': description: Default Response content: application/json: schema: type: object properties: reqId: type: string statusCode: type: number enum: - 403 message: type: string details: {} error: type: string required: - reqId - statusCode - message - error additionalProperties: false '404': description: Default Response content: application/json: schema: type: object properties: reqId: type: string statusCode: type: number enum: - 404 message: type: string error: type: string required: - reqId - statusCode - message - error additionalProperties: false '422': description: Default Response content: application/json: schema: type: object properties: reqId: type: string statusCode: type: number enum: - 422 message: {} error: type: string required: - reqId - statusCode - error additionalProperties: false '500': description: Default Response content: application/json: schema: type: object properties: reqId: type: string statusCode: type: number enum: - 500 message: type: string error: type: string required: - reqId - statusCode - message - error additionalProperties: false security: - bearerAuth: [] components: securitySchemes: bearerAuth: type: http scheme: bearer bearerFormat: JWT description: An access token in Infisical ```` --- # Source: https://infisical.com/docs/api-reference/endpoints/projects/get-project.md # Source: https://infisical.com/docs/api-reference/endpoints/deprecated/projects/get-project.md > ## Documentation Index > Fetch the complete documentation index at: https://infisical.com/docs/llms.txt > Use this file to discover all available pages before exploring further. # Get Project > Get project ## OpenAPI ````yaml GET /api/v1/workspace/{workspaceId} openapi: 3.0.3 info: title: Infisical API description: List of all available APIs that can be consumed version: 0.0.1 servers: - url: https://us.infisical.com description: Production server (US) - url: https://eu.infisical.com description: Production server (EU) - url: http://localhost:8080 description: Local server security: [] paths: /api/v1/workspace/{workspaceId}: get: tags: - Projects description: Get project parameters: - schema: type: string in: path name: workspaceId required: true description: The ID of the project. responses: '200': description: Default Response content: application/json: schema: type: object properties: workspace: type: object properties: id: type: string name: type: string description: type: string nullable: true type: type: string defaultProduct: type: string nullable: true slug: type: string autoCapitalization: type: boolean default: false nullable: true orgId: type: string format: uuid createdAt: type: string format: date-time updatedAt: type: string format: date-time version: type: number default: 1 upgradeStatus: type: string nullable: true pitVersionLimit: type: number default: 10 kmsCertificateKeyId: type: string format: uuid nullable: true auditLogsRetentionDays: type: number nullable: true hasDeleteProtection: type: boolean default: false nullable: true secretSharing: type: boolean default: true showSnapshotsLegacy: type: boolean default: false secretDetectionIgnoreValues: type: array items: type: string nullable: true enforceEncryptedSecretManagerSecretMetadata: type: boolean nullable: true _id: type: string environments: type: array items: type: object properties: name: type: string slug: type: string id: type: string required: - name - slug - id additionalProperties: false required: - id - name - type - slug - orgId - createdAt - updatedAt - _id - environments additionalProperties: false additionalProperties: false '400': description: Default Response content: application/json: schema: type: object properties: reqId: type: string statusCode: type: number enum: - 400 message: type: string error: type: string details: {} required: - reqId - statusCode - message - error additionalProperties: false '401': description: Default Response content: application/json: schema: type: object properties: reqId: type: string statusCode: type: number enum: - 401 message: type: string error: type: string required: - reqId - statusCode - message - error additionalProperties: false '403': description: Default Response content: application/json: schema: type: object properties: reqId: type: string statusCode: type: number enum: - 403 message: type: string details: {} error: type: string required: - reqId - statusCode - message - error additionalProperties: false '404': description: Default Response content: application/json: schema: type: object properties: reqId: type: string statusCode: type: number enum: - 404 message: type: string error: type: string required: - reqId - statusCode - message - error additionalProperties: false '422': description: Default Response content: application/json: schema: type: object properties: reqId: type: string statusCode: type: number enum: - 422 message: {} error: type: string required: - reqId - statusCode - error additionalProperties: false '500': description: Default Response content: application/json: schema: type: object properties: reqId: type: string statusCode: type: number enum: - 500 message: type: string error: type: string required: - reqId - statusCode - message - error additionalProperties: false security: - bearerAuth: [] components: securitySchemes: bearerAuth: type: http scheme: bearer bearerFormat: JWT description: An access token in Infisical ```` --- # Source: https://infisical.com/docs/api-reference/endpoints/organizations/saml-sso/get-saml-config.md > ## Documentation Index > Fetch the complete documentation index at: https://infisical.com/docs/llms.txt > Use this file to discover all available pages before exploring further. # Get SAML SSO Config > Get SAML config ## OpenAPI ````yaml GET /api/v1/sso/config openapi: 3.0.3 info: title: Infisical API description: List of all available APIs that can be consumed version: 0.0.1 servers: - url: https://us.infisical.com description: Production server (US) - url: https://eu.infisical.com description: Production server (EU) - url: http://localhost:8080 description: Local server security: [] paths: /api/v1/sso/config: get: tags: - SAML SSO description: Get SAML config parameters: - schema: type: string in: query name: organizationId required: true description: The ID of the organization to get the SAML config for. responses: '200': description: Default Response content: application/json: schema: type: object properties: id: type: string organization: type: string orgId: type: string authProvider: type: string isActive: type: boolean entryPoint: type: string issuer: type: string cert: type: string lastUsed: type: string format: date-time nullable: true enableGroupSync: type: boolean required: - id - organization - orgId - authProvider - isActive - entryPoint - issuer - cert additionalProperties: false '400': description: Default Response content: application/json: schema: type: object properties: reqId: type: string statusCode: type: number enum: - 400 message: type: string error: type: string details: {} required: - reqId - statusCode - message - error additionalProperties: false '401': description: Default Response content: application/json: schema: type: object properties: reqId: type: string statusCode: type: number enum: - 401 message: type: string error: type: string required: - reqId - statusCode - message - error additionalProperties: false '403': description: Default Response content: application/json: schema: type: object properties: reqId: type: string statusCode: type: number enum: - 403 message: type: string details: {} error: type: string required: - reqId - statusCode - message - error additionalProperties: false '404': description: Default Response content: application/json: schema: type: object properties: reqId: type: string statusCode: type: number enum: - 404 message: type: string error: type: string required: - reqId - statusCode - message - error additionalProperties: false '422': description: Default Response content: application/json: schema: type: object properties: reqId: type: string statusCode: type: number enum: - 422 message: {} error: type: string required: - reqId - statusCode - error additionalProperties: false '500': description: Default Response content: application/json: schema: type: object properties: reqId: type: string statusCode: type: number enum: - 500 message: type: string error: type: string required: - reqId - statusCode - message - error additionalProperties: false security: - bearerAuth: [] components: securitySchemes: bearerAuth: type: http scheme: bearer bearerFormat: JWT description: An access token in Infisical ```` --- # Source: https://infisical.com/docs/api-reference/endpoints/token-auth/get-tokens.md > ## Documentation Index > Fetch the complete documentation index at: https://infisical.com/docs/llms.txt > Use this file to discover all available pages before exploring further. # Get Tokens > Get tokens for machine identity with Token Auth ## OpenAPI ````yaml GET /api/v1/auth/token-auth/identities/{identityId}/tokens openapi: 3.0.3 info: title: Infisical API description: List of all available APIs that can be consumed version: 0.0.1 servers: - url: https://us.infisical.com description: Production server (US) - url: https://eu.infisical.com description: Production server (EU) - url: http://localhost:8080 description: Local server security: [] paths: /api/v1/auth/token-auth/identities/{identityId}/tokens: get: tags: - Token Auth description: Get tokens for machine identity with Token Auth operationId: getTokenAuthTokens parameters: - schema: type: number minimum: 0 maximum: 100 default: 0 in: query name: offset required: false description: >- The offset to start from. If you enter 10, it will start from the 10th token. - schema: type: number minimum: 1 maximum: 100 default: 20 in: query name: limit required: false description: The number of tokens to return. - schema: type: string in: path name: identityId required: true description: The ID of the machine identity to list token metadata for. responses: '200': description: Default Response content: application/json: schema: type: object properties: tokens: type: array items: type: object properties: id: type: string accessTokenTTL: type: number default: 2592000 accessTokenMaxTTL: type: number default: 2592000 accessTokenNumUses: type: number default: 0 accessTokenNumUsesLimit: type: number default: 0 accessTokenLastUsedAt: type: string format: date-time nullable: true accessTokenLastRenewedAt: type: string format: date-time nullable: true isAccessTokenRevoked: type: boolean default: false identityUAClientSecretId: type: string nullable: true identityId: type: string format: uuid createdAt: type: string format: date-time updatedAt: type: string format: date-time name: type: string nullable: true authMethod: type: string accessTokenPeriod: type: number default: 0 subOrganizationId: type: string format: uuid nullable: true required: - id - identityId - createdAt - updatedAt - authMethod additionalProperties: false required: - tokens additionalProperties: false '400': description: Default Response content: application/json: schema: type: object properties: reqId: type: string statusCode: type: number enum: - 400 message: type: string error: type: string details: {} required: - reqId - statusCode - message - error additionalProperties: false '401': description: Default Response content: application/json: schema: type: object properties: reqId: type: string statusCode: type: number enum: - 401 message: type: string error: type: string required: - reqId - statusCode - message - error additionalProperties: false '403': description: Default Response content: application/json: schema: type: object properties: reqId: type: string statusCode: type: number enum: - 403 message: type: string details: {} error: type: string required: - reqId - statusCode - message - error additionalProperties: false '404': description: Default Response content: application/json: schema: type: object properties: reqId: type: string statusCode: type: number enum: - 404 message: type: string error: type: string required: - reqId - statusCode - message - error additionalProperties: false '422': description: Default Response content: application/json: schema: type: object properties: reqId: type: string statusCode: type: number enum: - 422 message: {} error: type: string required: - reqId - statusCode - error additionalProperties: false '500': description: Default Response content: application/json: schema: type: object properties: reqId: type: string statusCode: type: number enum: - 500 message: type: string error: type: string required: - reqId - statusCode - message - error additionalProperties: false security: - bearerAuth: [] components: securitySchemes: bearerAuth: type: http scheme: bearer bearerFormat: JWT description: An access token in Infisical ```` --- # Source: https://infisical.com/docs/api-reference/endpoints/service-tokens/get.md # Source: https://infisical.com/docs/api-reference/endpoints/organization-roles/get.md # Source: https://infisical.com/docs/api-reference/endpoints/groups/get.md # Source: https://infisical.com/docs/api-reference/endpoints/dynamic-secrets/get.md > ## Documentation Index > Fetch the complete documentation index at: https://infisical.com/docs/llms.txt > Use this file to discover all available pages before exploring further. # Get ## OpenAPI ````yaml GET /api/v1/dynamic-secrets/{name} openapi: 3.0.3 info: title: Infisical API description: List of all available APIs that can be consumed version: 0.0.1 servers: - url: https://us.infisical.com description: Production server (US) - url: https://eu.infisical.com description: Production server (EU) - url: http://localhost:8080 description: Local server security: [] paths: /api/v1/dynamic-secrets/{name}: get: tags: - Dynamic Secrets parameters: - schema: type: string minLength: 1 in: query name: projectSlug required: true description: The slug of the project to create dynamic secret in. - schema: type: string default: / in: query name: path required: false description: The path to list folders from. - schema: type: string minLength: 1 in: query name: environmentSlug required: true description: The slug of the environment to list folders from. - schema: type: string minLength: 1 in: path name: name required: true description: The name of the dynamic secret. responses: '200': description: Default Response content: application/json: schema: type: object properties: dynamicSecret: type: object properties: id: type: string format: uuid name: type: string version: type: number type: type: string defaultTTL: type: string maxTTL: type: string nullable: true folderId: type: string format: uuid status: type: string nullable: true statusDetails: type: string nullable: true createdAt: type: string format: date-time updatedAt: type: string format: date-time projectGatewayId: type: string format: uuid nullable: true gatewayId: type: string format: uuid nullable: true usernameTemplate: type: string nullable: true gatewayV2Id: type: string format: uuid nullable: true metadata: type: array items: type: object properties: key: type: string minLength: 1 value: type: string default: '' required: - key additionalProperties: false inputs: {} required: - id - name - version - type - defaultTTL - folderId - createdAt - updatedAt additionalProperties: false required: - dynamicSecret additionalProperties: false '400': description: Default Response content: application/json: schema: type: object properties: reqId: type: string statusCode: type: number enum: - 400 message: type: string error: type: string details: {} required: - reqId - statusCode - message - error additionalProperties: false '401': description: Default Response content: application/json: schema: type: object properties: reqId: type: string statusCode: type: number enum: - 401 message: type: string error: type: string required: - reqId - statusCode - message - error additionalProperties: false '403': description: Default Response content: application/json: schema: type: object properties: reqId: type: string statusCode: type: number enum: - 403 message: type: string details: {} error: type: string required: - reqId - statusCode - message - error additionalProperties: false '404': description: Default Response content: application/json: schema: type: object properties: reqId: type: string statusCode: type: number enum: - 404 message: type: string error: type: string required: - reqId - statusCode - message - error additionalProperties: false '422': description: Default Response content: application/json: schema: type: object properties: reqId: type: string statusCode: type: number enum: - 422 message: {} error: type: string required: - reqId - statusCode - error additionalProperties: false '500': description: Default Response content: application/json: schema: type: object properties: reqId: type: string statusCode: type: number enum: - 500 message: type: string error: type: string required: - reqId - statusCode - message - error additionalProperties: false ```` --- # Source: https://infisical.com/docs/documentation/platform/github-org-sync.md > ## Documentation Index > Fetch the complete documentation index at: https://infisical.com/docs/llms.txt > Use this file to discover all available pages before exploring further. # GitHub Team Sync > Learn how to automatically synchronize your GitHub teams with Infisical Groups. ## Overview The GitHub Organization Synchronization feature streamlines user and group management by automatically syncing users belonging to your specified GitHub organization with corresponding groups within Infisical. This integration ensures that users logging in via GitHub are automatically added to or removed from Infisical groups based on their team memberships within your GitHub organization. ## Configuration To enable and configure GitHub Organization Synchronization, follow these steps: 1. Navigate to the **Single Sign-On (SSO)** page and select the **Provisioning** tab. config 2. Click the **Configure** button and provide the name of your GitHub Organization. config-modal Toggle ON GitHub Organization sync to activate sync. toggle-on Connecting the Infisical OAuth application grants it permission to **read:org** details. This approval is done by selecting your organization during the GitHub OAuth login process. 1. Initiate the login process via the GitHub OAuth flow. oauth-flow-start 2. Select the organization you have connected. 3. Grant access to Infisical oauth application to your configured organization. Infisical shown here is an organization, just for walkthrough. grant-access This action only needs to be done once and authorizes the Infisical OAuth app to read organization details, including team information. The following users don't need to select organization in GitHub on login anymore. ## Working Once configured, the GitHub Organization Synchronization feature functions as follows: When a user logs in via the GitHub OAuth flow and selects the configured organization, the system will then automatically synchronize the teams they are a part of in GitHub with corresponding groups in Infisical. ## Manual Team Sync You can manually synchronize GitHub teams for all organization members who have previously logged in with GitHub. This bulk sync operation updates team memberships without requiring users to log in again. To perform manual syncs, you'll need to create a GitHub Personal Access Token with the appropriate permissions. GitHub offers two types of tokens: 1. Go to [GitHub Settings → Personal Access Tokens → Tokens (classic)](https://github.com/settings/tokens) 2. Click **Generate new token** → **Generate new token (classic)** 3. Give your token a descriptive name (e.g., "Infisical GitHub Sync") 4. Set an appropriate expiration date 5. Select the **read:org** scope - Required to read organization team information 6. Click **Generate token** 7. Copy the token immediately (you won't be able to see it again) Classic Token Creation 1. Go to [GitHub Settings → Personal Access Tokens → Fine-grained tokens](https://github.com/settings/personal-access-tokens/new) 2. Click **Generate new token** 3. Give your token a descriptive name (e.g., "Infisical GitHub Sync") 4. Set an appropriate expiration date 5. Select your organization under **Resource owner** 6. Under **Organization permissions**, set **Members** to **Read** 7. Click **Generate token** 8. Copy the token immediately (you won't be able to see it again) Fine-grained Token Creation 1. Navigate to the **Single Sign-On (SSO)** page and select the **Provisioning** tab. 2. Click the **Configure** button next to your GitHub Organization configuration. 3. In the configuration modal, you'll find an optional **GitHub Access Token** field. 4. Paste the token you generated in the previous step. 5. Click **Update** to save the configuration. Token Configuration Modal Once you have configured the GitHub access token: 1. Navigate to the **Single Sign-On (SSO)** page and select the **Provisioning** tab. 2. You'll see a **Sync Now** section with a button to trigger the manual sync. 3. Click **Sync Now** to synchronize GitHub teams for all organization members. Manual Sync Button The sync operation will process all organization members who have previously logged in with GitHub and update their team memberships accordingly. ## Troubleshooting If you encounter an error related to this, it indicates that you need to approve the Infisical OAuth application within your GitHub organization. You can verify the application's approval status by navigating to **[https://github.com/organizations/\_\_your-organization\_\_/settings/oauth\_application\_policy](https://github.com/organizations/__your-organization__/settings/oauth_application_policy)**. Replace `__your-organization__` with the actual name of your GitHub organization. check-approval --- # Source: https://infisical.com/docs/integrations/app-connections/github-radar.md > ## Documentation Index > Fetch the complete documentation index at: https://infisical.com/docs/llms.txt > Use this file to discover all available pages before exploring further. # GitHub Radar Connection > Learn how to configure a GitHub Radar Connection for Infisical. Infisical supports GitHub App installation for creating a GitHub Radar Connection. GitHub Radar Connections are specifically configured for [Secret Scanning](/documentation/platform/secret-scanning/overview) and require specific permissions and webhook configuration. Check out our [GitHub Connection](/integrations/app-connections/github) for secret management features such as [Secret Syncs](/integrations/secret-syncs/overview). Using a GitHub Radar Connection with app authentication on a self-hosted instance of Infisical requires configuring an application on GitHub and registering your instance with it. Navigate to the GitHub App Settings [here](https://github.com/settings/apps). Click **New GitHub App**. If you have a GitHub organization, you can create an application under it in your organization Settings > Developer settings > GitHub Apps > New GitHub App. create github radar app Configure the following fields: 1. **Name** - give your app a name 2. **Homepage URL** - your self-hosted domain (i.e. `https://your-domain.com`) 3. **Callback URL** - the callback URL for your domain (i.e. `https://your-domain.com/organization/app-connections/github-radar/oauth/callback`) 4. **User Authorization** - enable request user authorization on app installation github radar app details Enable and configure the Webhook fields: * **Webhook URL** - the webhook URL for your domain (i.e. `https://your-domain.com/secret-scanning/webhooks/github`) * **Webhook Secret** - a strong, generated secret to verify webhook payloads * **SSL Verification** - enable SSL verification github radar app webhook Set the following repository permissions: * **Contents**: `Read-only` * **Metadata**: `Read-only` github radar app permissions 1 github radar app permissions 2 Subscribe to the following events: * **Push** github radar app events Create the Github application. github radar app complete Generate a new **Client Secret** for your GitHub application. github radar app client secret Generate a new **Private Key** for your Github application. You will need to copy the contents of the .pem file downloaded github radar app private key Obtain the following credentials: 1. **Slug** - the slug of your application found in the URL 2. **App ID** - the ID of your application 3. **Client ID** - the client ID of your application 4. **Client Secret** - the client secret generated above 5. **Private Key** - the contents of the private key .pem file generated above 6. **Webhook Secret** - the secret generated in the previous step when configuring the webhook github radar app credentials Back in your Infisical instance, add the six new environment variables for the credentials of your GitHub Radar application: * `INF_APP_CONNECTION_GITHUB_RADAR_APP_CLIENT_ID`: The **Client ID** of your GitHub application. * `INF_APP_CONNECTION_GITHUB_RADAR_APP_CLIENT_SECRET`: The **Client Secret** of your GitHub application. * `INF_APP_CONNECTION_GITHUB_RADAR_APP_SLUG`: The **Slug** of your GitHub application. This is the one found in the URL. * `INF_APP_CONNECTION_GITHUB_RADAR_APP_ID`: The **App ID** of your GitHub application. * `INF_APP_CONNECTION_GITHUB_RADAR_APP_PRIVATE_KEY`: The **Private Key** of your GitHub application. * `INF_APP_CONNECTION_GITHUB_RADAR_APP_WEBHOOK_SECRET`: The **Webhook Secret** of your GitHub application. Once added, restart your Infisical instance and use the GitHub integration via app authentication. ## Setup GitHub Radar Connection in Infisical Navigate to the **Integrations** tab in the desired project, then select **App Connections**. App Connections Tab Select the **GitHub Radar Connection** option from the connection options modal. Select GitHub Radar Connection Select the **GitHub App** method and click **Connect to GitHub**. Connect via GitHub App You will then be redirected to the GitHub App installation page. Install and authorize the GitHub application. This will redirect you back to Infisical's App Connections page. Install GitHub App Your **GitHub Radar Connection** is now available for use. GitHub Radar Connection --- # Source: https://infisical.com/docs/integrations/secret-syncs/github.md # Source: https://infisical.com/docs/integrations/app-connections/github.md # Source: https://infisical.com/docs/documentation/platform/sso/github.md # Source: https://infisical.com/docs/documentation/platform/secret-scanning/github.md # Source: https://infisical.com/docs/documentation/platform/identities/oidc-auth/github.md # Source: https://infisical.com/docs/documentation/platform/dynamic-secrets/github.md > ## Documentation Index > Fetch the complete documentation index at: https://infisical.com/docs/llms.txt > Use this file to discover all available pages before exploring further. # GitHub > Learn how to dynamically generate GitHub App tokens. The Infisical GitHub dynamic secret allows you to generate short-lived tokens for a GitHub App on demand based on service account permissions. ## Setup GitHub App Navigate to [GitHub App settings](https://github.com/settings/apps) and click **New GitHub App**. integrations github app create Give the application a name and a homepage URL. These values do not need to be anything specific. Disable webhook by unchecking the Active checkbox. integrations github app webhook Configure the app's permissions to grant the necessary access for the dynamic secret's short-lived tokens based on your use case. Create the GitHub Application. integrations github app create confirm If you have a GitHub organization, you can create an application under it in your organization Settings > Developer settings > GitHub Apps > New GitHub App. Copy the **App ID** and generate a new **Private Key** for your GitHub Application. integrations github app create private key Save these for later steps. Install your application to whichever repositories and organizations that you want the dynamic secret to access. Install App Install App Once you've installed the app, **copy the installation ID** from the URL and save it for later steps. Install App ## Set up Dynamic Secrets with GitHub Open the Secret Overview dashboard and select the environment in which you would like to add a dynamic secret. Add Dynamic Secret Button Dynamic Secret Modal Name by which you want the secret to be referenced The ID of the app created in earlier steps. The Private Key of the app created in earlier steps. The ID of the installation from earlier steps. After submitting the form, you will see a dynamic secret created in the dashboard. Once you've successfully configured the dynamic secret, you're ready to generate on-demand credentials. To do this, simply click on the 'Generate' button which appears when hovering over the dynamic secret item. Alternatively, you can initiate the creation of a new lease by selecting 'New Lease' from the dynamic secret lease list section. Dynamic Secret Dynamic Secret When generating these secrets, the TTL will be fixed to 1 hour. Provision Lease Once you click the `Submit` button, a new secret lease will be generated and the credentials from it will be shown to you. Dynamic Secret Lease ## Audit or Revoke Leases Once you have created one or more leases, you will be able to access them by clicking on the respective dynamic secret item on the dashboard. This will allow you to see the expiration time of the lease or delete a lease before its set time to live. Lease Data GitHub App tokens cannot be revoked. As such, revoking a token on Infisical does not invalidate the GitHub token; it remains active until it expires. ## Renew Leases GitHub App tokens cannot be renewed because they are fixed to a lifetime of 1 hour. --- # Source: https://infisical.com/docs/integrations/cicd/githubactions.md > ## Documentation Index > Fetch the complete documentation index at: https://infisical.com/docs/llms.txt > Use this file to discover all available pages before exploring further. # GitHub Actions > How to sync secrets from Infisical to GitHub Actions Use our [GitHub Secret Syncs](../secret-syncs/github) to sync secrets to GitHub at the organization-level, repository-level, and repository environment-level. Alternatively, you can use Infisical's official GitHub Action [here](https://github.com/Infisical/secrets-action). --- # Source: https://infisical.com/docs/integrations/secret-syncs/gitlab.md # Source: https://infisical.com/docs/integrations/cicd/gitlab.md # Source: https://infisical.com/docs/integrations/app-connections/gitlab.md # Source: https://infisical.com/docs/documentation/platform/sso/gitlab.md # Source: https://infisical.com/docs/documentation/platform/secret-scanning/gitlab.md # Source: https://infisical.com/docs/documentation/platform/identities/oidc-auth/gitlab.md > ## Documentation Index > Fetch the complete documentation index at: https://infisical.com/docs/llms.txt > Use this file to discover all available pages before exploring further. # GitLab > Learn how to authenticate GitLab pipelines with Infisical using OpenID Connect (OIDC). **OIDC Auth** is a platform-agnostic JWT-based authentication method that can be used to authenticate from any platform or environment using an identity provider with OpenID Connect. ## Diagram The following sequence diagram illustrates the OIDC Auth workflow for authenticating GitLab pipelines with Infisical. ```mermaid theme={"dark"} sequenceDiagram participant Client as GitLab Pipeline participant Idp as GitLab Identity Provider participant Infis as Infisical Client->>Idp: Step 1: Request identity token Idp-->>Client: Return JWT with verifiable claims Note over Client,Infis: Step 2: Login Operation Client->>Infis: Send signed JWT to /api/v1/auth/oidc-auth/login Note over Infis,Idp: Step 3: Query verification Infis->>Idp: Request JWT public key using OIDC Discovery Idp-->>Infis: Return public key Note over Infis: Step 4: JWT validation Infis->>Client: Return short-lived access token Note over Client,Infis: Step 5: Access Infisical API with Token Client->>Infis: Make authenticated requests using the short-lived access token ``` ## Concept At a high-level, Infisical authenticates a client by verifying the JWT and checking that it meets specific requirements (e.g. it is issued by a trusted identity provider) at the `/api/v1/auth/oidc-auth/login` endpoint. If successful, then Infisical returns a short-lived access token that can be used to make authenticated requests to the Infisical API. To be more specific: 1. The GitLab pipeline requests an identity token from GitLab's identity provider. 2. The fetched identity token is sent to Infisical at the `/api/v1/auth/oidc-auth/login` endpoint. 3. Infisical fetches the public key that was used to sign the identity token from GitLab's identity provider using OIDC Discovery. 4. Infisical validates the JWT using the public key provided by the identity provider and checks that the subject, audience, and claims of the token matches with the set criteria. 5. If all is well, Infisical returns a short-lived access token that the GitLab pipeline can use to make authenticated requests to the Infisical API. Infisical needs network-level access to GitLab's identity provider endpoints. ## Guide In the following steps, we explore how to create and use identities to access the Infisical API using the OIDC Auth authentication method. To create an identity, head to your Organization Settings > Access Control > Identities and press **Create identity**. identities organization When creating an identity, you specify an organization level [role](/documentation/platform/access-controls/role-based-access-controls) for it to assume; you can configure roles in Organization Settings > Access Control > Organization Roles. identities organization create Now input a few details for your new identity. Here's some guidance for each field: * Name (required): A friendly name for the identity. * Role (required): A role from the **Organization Roles** tab for the identity to assume. The organization role assigned will determine what organization level resources this identity can have access to. Once you've created an identity, you'll be redirected to a page where you can manage the identity. identities page Since the identity has been configured with Universal Auth by default, you should re-configure it to use OIDC Auth instead. To do this, press to edit the **Authentication** section, remove the existing Universal Auth configuration, and add a new OIDC Auth configuration onto the identity. identities page remove default auth identities create oidc auth method Restrict access by configuring the Subject, Audiences, and Claims fields Here's some more guidance on each field: * OIDC Discovery URL: The URL used to retrieve the OpenID Connect configuration from the identity provider. This will be used to fetch the public key needed for verifying the provided JWT. For GitLab SaaS (GitLab.com), this should be set to `https://gitlab.com`. For self-hosted GitLab instances, use the domain of your GitLab instance. * Issuer: The unique identifier of the identity provider issuing the JWT. This value is used to verify the iss (issuer) claim in the JWT to ensure the token is issued by a trusted provider. This should also be set to the domain of the Gitlab instance. * CA Certificate: The PEM-encoded CA cert for establishing secure communication with the Identity Provider endpoints. For GitLab.com, this can be left blank. * Subject: The expected principal that is the subject of the JWT. For GitLab pipelines, this should be set to a string that uniquely identifies the pipeline and its context, in the format `project_path:{group}/{project}:ref_type:{type}:ref:{branch_name}` (e.g., `project_path:example-group/example-project:ref_type:branch:ref:main`). * Claims: Additional information or attributes that should be present in the JWT for it to be valid. You can refer to GitLab's [documentation](https://docs.gitlab.com/ee/ci/secrets/id_token_authentication.html#token-payload) for the list of supported claims. * Access Token TTL (default is `2592000` equivalent to 30 days): The lifetime for an acccess token in seconds. This value will be referenced at renewal time. * Access Token Max TTL (default is `2592000` equivalent to 30 days): The maximum lifetime for an acccess token in seconds. This value will be referenced at renewal time. * Access Token Max Number of Uses (default is `0`): The maximum number of times that an access token can be used; a value of `0` implies infinite number of uses. * Access Token Trusted IPs: The IPs or CIDR ranges that access tokens can be used from. By default, each token is given the `0.0.0.0/0`, allowing usage from any network address. For more details on the appropriate values for the OIDC fields, refer to GitLab's [documentation](https://docs.gitlab.com/ee/ci/secrets/id_token_authentication.html#token-payload). The `subject`, `audiences`, and `claims` fields support glob pattern matching; however, we highly recommend using hardcoded values whenever possible. To enable the identity to access project-level resources such as secrets within a specific project, you should add it to that project. To do this, head over to the project you want to add the identity to and go to Project Settings > Access Control > Machine Identities and press **Add identity**. Next, select the identity you want to add to the project and the project level role you want to allow it to assume. The project role assigned will determine what project level resources this identity can have access to. identities project identities project create As demonstration, we will be using the Infisical CLI to fetch Infisical secrets and utilize them within a GitLab pipeline. To access Infisical secrets as the identity, you need to use an identity token from GitLab which matches the OIDC configuration defined for the machine identity. This can be done by defining the `id_tokens` property. The resulting token would then be used to login with OIDC like the following: `infisical login --method=oidc-auth --oidc-jwt=$GITLAB_TOKEN` Below is a complete example of how a GitLab pipeline can be configured to work with secrets from Infisical using the Infisical CLI with OIDC Auth: ```yaml theme={"dark"} image: ubuntu stages: - build build-job: stage: build id_tokens: INFISICAL_ID_TOKEN: aud: infisical-aud-test script: - apt update && apt install -y curl - curl -1sLf 'https://dl.cloudsmith.io/public/infisical/infisical-cli/setup.deb.sh' | bash - apt-get update && apt-get install -y infisical - export INFISICAL_TOKEN=$(infisical login --method=oidc-auth --machine-identity-id=4e807a78-1b1c-4bd6-9609-ef2b0cf4fd54 --oidc-jwt=$INFISICAL_ID_TOKEN --silent --plain) - infisical run --projectId=1d0443c1-cd43-4b3a-91a3-9d5f81254a89 --env=dev -- npm run build ``` The `id_tokens` keyword is used to request an ID token for the job. In this example, an ID token named `INFISICAL_ID_TOKEN` is requested with the audience (`aud`) claim set to "infisical-aud-test". This ID token will be used to authenticate with Infisical. Each identity access token has a time-to-live (TTL) which you can infer from the response of the login operation; the default TTL is `7200` seconds, which can be adjusted. If an identity access token expires, it can no longer authenticate with the Infisical API. In this case, a new access token should be obtained by performing another login operation. --- # Source: https://infisical.com/docs/documentation/platform/pki/integration-guides/gloo-mesh.md > ## Documentation Index > Fetch the complete documentation index at: https://infisical.com/docs/llms.txt > Use this file to discover all available pages before exploring further. # Gloo Mesh > Learn how to automatically provision and manage Istio intermediate CA certificates for Gloo Mesh using Infisical This guide will provide a high level overview on how you can use Infisical and [cert-manager](https://cert-manager.io/) to issue Istio intermediate CA certificates for your Gloo Mesh workload clusters. For more background about Istio certificates, see the [Istio CA overview](https://istio.io/latest/docs/concepts/security/#pki). ## Overview In this setup, we will use Infisical to generate and store your root CA and subordinate CAs that are used to generate Istio intermediate CAs for your Gloo Mesh workload clusters. To manage the lifecycle of Istio intermediate CA certificates, you'll also install [cert-manager](https://cert-manager.io/). Cert-manager is a Kubernetes controller that helps you automate the process of obtaining and renewing certificates from various PKI providers. With this approach, you get the following benefits: * Securely store your root CA certificates and private keys. * Leverage Infisical subordinate CAs for an extra layer of protection beneath your root CA. * Use cert-manager to automatically issue and renew Istio intermediate CA certificates from the same root, ensuring cross-cluster workload communication. * Increased auditability of private key infrastructure. ## General Setup The certificate provisioning workflow begins with setting up your PKI hierarchy in Infisical, where you create root and subordinate certificate authorities. When you deploy a `Certificate` CRD in your workload cluster, `cert-manager` uses the [ACME enrollment method](/documentation/platform/pki/enrollment-methods/acme) configured on a [certificate profile](/documentation/platform/pki/certificates/profiles) to authenticate using EAB credentials and request an intermediate CA certificate. Infisical verifies the request against your certificate policies and returns the signed certificate. From there, Istio's control plane will automatically use this intermediate CA to sign leaf certificates for workloads in the service mesh, enabling secure mTLS communication across your entire Gloo Mesh infrastructure. Follow the [Kubernetes cert-manager guide](/documentation/platform/pki/k8s-cert-manager) for detailed instructions on how to set up the Infisical and cert-manager for your Istio intermediate CA certificates in Gloo Mesh clusters. For Gloo Mesh-specific configuration, ensure that: * The Certificate resource targets the `istio-system` namespace with `secretName: cacerts` * Certificate profiles in Infisical are configured for intermediate CA usage with appropriate key usage and constraints * Multiple workload clusters use the same Infisical root to enable cross-cluster mTLS communication ## Using the certificates Once the `cacerts` Kubernetes secret is created in the `istio-system` namespace, Istio automatically uses the custom CA certificate instead of the default self-signed certificate. When you deploy applications to your Gloo Mesh service mesh, the workloads will receive leaf certificates signed by your Infisical intermediate CA, enabling secure mTLS communication across your entire mesh infrastructure. --- # Source: https://infisical.com/docs/sdks/languages/go.md > ## Documentation Index > Fetch the complete documentation index at: https://infisical.com/docs/llms.txt > Use this file to discover all available pages before exploring further. # Infisical Go SDK If you're working with Go, the official Infisical Go SDK package is the easiest way to fetch and work with secrets for your application. * [Package](https://pkg.go.dev/github.com/infisical/go-sdk) * [Github Repository](https://github.com/infisical/go-sdk) # Basic Usage ```go theme={"dark"} package main import ( "fmt" "os" "context" infisical "github.com/infisical/go-sdk" ) func main() { client := infisical.NewInfisicalClient(context.Background(), infisical.Config{ SiteUrl: "https://app.infisical.com", // Optional, default is https://app.infisical.com AutoTokenRefresh: true, // Wether or not to let the SDK handle the access token lifecycle. Defaults to true if not specified. }) _, err := client.Auth().UniversalAuthLogin("YOUR_CLIENT_ID", "YOUR_CLIENT_SECRET") if err != nil { fmt.Printf("Authentication failed: %v", err) os.Exit(1) } apiKeySecret, err := client.Secrets().Retrieve(infisical.RetrieveSecretOptions{ SecretKey: "API_KEY", Environment: "dev", ProjectID: "YOUR_PROJECT_ID", SecretPath: "/", }) if err != nil { fmt.Printf("Error: %v", err) os.Exit(1) } fmt.Printf("API Key Secret: %v", apiKeySecret) } ``` This example demonstrates how to use the Infisical Go SDK in a simple Go application. The application retrieves a secret named `API_KEY` from the `dev` environment of the `YOUR_PROJECT_ID` project. We do not recommend hardcoding your [Machine Identity Tokens](/documentation/platform/identities/machine-identities). Setting it as an environment variable would be best. # Installation ```console theme={"dark"} $ go get github.com/infisical/go-sdk ``` # Configuration Import the SDK and create a client instance. ```go theme={"dark"} client := infisical.NewInfisicalClient(context.Background(), infisical.Config{ SiteUrl: "https://app.infisical.com", // Optional, default is https://api.infisical.com }) ``` ### Configuration Options The URL of the Infisical API.. Optionally set the user agent that will be used for HTTP requests. *(Not recommended)* Whether or not to let the SDK handle the access token lifecycle. Defaults to true if not specified. Whether or not to suppress logs such as warnings from the token refreshing process. Defaults to false if not specified. Defines how long certain responses should be cached in memory, in seconds. When set to a positive value, responses from specific methods (like secret fetching) will be cached for this duration. Set to 0 to disable caching. Allows you to pass custom headers to the HTTP requests made by the SDK. Expected format is a map of `Header1: Value1, Header2: Value 2`. # Automatic token refreshing The Infisical Go SDK supports automatic token refreshing. After using one of the auth methods such as Universal Auth, the SDK will automatically renew and re-authenticate when needed. This behavior is enabled by default, but you can opt-out by setting `AutoTokenRefresh` to `false` in the client settings. ```go theme={"dark"} client := infisical.NewInfisicalClient(context.Background(), infisical.Config{ AutoTokenRefresh: false, // <- Disable automatic token refreshing }) ``` When using automatic token refreshing it's important to understand how your application uses the Infiiscal client. If you are instantiating new instances of the client often, it's important to cancel the context when the client is no longer needed to avoid the token refreshing process from running indefinitely. ```go theme={"dark"} ctx, cancel := context.WithCancel(context.Background()) defer cancel() // Cancel the context when the client is no longer needed client := infisical.NewInfisicalClient(ctx, infisical.Config{ AutoTokenRefresh: true, }) // Use the client ``` This is only necessary if you are creating multiple instances of the client, and those instances are deleted or otherwise removed throughout the application lifecycle. If you are only creating one instance of the client, and it will be used throughout the lifetime of your application, you don't need to worry about this. # Authentication The SDK supports a variety of authentication methods. The most common authentication method is Universal Auth, which uses a client ID and client secret to authenticate. #### Universal Auth **Using environment variables** Call `.Auth().UniversalAuthLogin()` with empty arguments to use the following environment variables: * `INFISICAL_UNIVERSAL_AUTH_CLIENT_ID` - Your machine identity client ID. * `INFISICAL_UNIVERSAL_AUTH_CLIENT_SECRET` - Your machine identity client secret. **Using the SDK directly** ```go theme={"dark"} _, err := client.Auth().UniversalAuthLogin("CLIENT_ID", "CLIENT_SECRET") if err != nil { fmt.Println(err) os.Exit(1) } ``` #### GCP ID Token Auth Please note that this authentication method will only work if you're running your application on Google Cloud Platform. Please [read more](/documentation/platform/identities/gcp-auth) about this authentication method. **Using environment variables** Call `.Auth().GcpIdTokenAuthLogin()` with empty arguments to use the following environment variables: * `INFISICAL_GCP_AUTH_IDENTITY_ID` - Your Infisical Machine Identity ID. **Using the SDK directly** ```go theme={"dark"} _, err := client.Auth().GcpIdTokenAuthLogin("YOUR_MACHINE_IDENTITY_ID") if err != nil { fmt.Println(err) os.Exit(1) } ``` #### GCP IAM Auth **Using environment variables** Call `.Auth().GcpIamAuthLogin()` with empty arguments to use the following environment variables: * `INFISICAL_GCP_IAM_AUTH_IDENTITY_ID` - Your Infisical Machine Identity ID. * `INFISICAL_GCP_IAM_SERVICE_ACCOUNT_KEY_FILE_PATH` - The path to your GCP service account key file. **Using the SDK directly** ```go theme={"dark"} _, err = client.Auth().GcpIamAuthLogin("MACHINE_IDENTITY_ID", "SERVICE_ACCOUNT_KEY_FILE_PATH") if err != nil { fmt.Println(err) os.Exit(1) } ``` #### AWS IAM Auth Please note that this authentication method will only work if you're running your application on AWS. Please [read more](/documentation/platform/identities/aws-auth) about this authentication method. **Using environment variables** Call `.Auth().AwsIamAuthLogin()` with empty arguments to use the following environment variables: * `INFISICAL_AWS_IAM_AUTH_IDENTITY_ID` - Your Infisical Machine Identity ID. **Using the SDK directly** ```go theme={"dark"} _, err = client.Auth().AwsIamAuthLogin("MACHINE_IDENTITY_ID") if err != nil { fmt.Println(err) os.Exit(1) } ``` #### Azure Auth Please note that this authentication method will only work if you're running your application on Azure. Please [read more](/documentation/platform/identities/azure-auth) about this authentication method. **Using environment variables** Call `.Auth().AzureAuthLogin()` with empty arguments to use the following environment variables: * `INFISICAL_AZURE_AUTH_IDENTITY_ID` - Your Infisical Machine Identity ID. **Using the SDK directly** ```go theme={"dark"} _, err = client.Auth().AzureAuthLogin("MACHINE_IDENTITY_ID") if err != nil { fmt.Println(err) os.Exit(1) } ``` #### Kubernetes Auth Please note that this authentication method will only work if you're running your application on Kubernetes. Please [read more](/documentation/platform/identities/kubernetes-auth) about this authentication method. **Using environment variables** Call `.Auth().KubernetesAuthLogin()` with empty arguments to use the following environment variables: * `INFISICAL_KUBERNETES_IDENTITY_ID` - Your Infisical Machine Identity ID. * `INFISICAL_KUBERNETES_SERVICE_ACCOUNT_TOKEN_PATH_ENV_NAME` - The environment variable name that contains the path to the service account token. This is optional and will default to `/var/run/secrets/kubernetes.io/serviceaccount/token`. **Using the SDK directly** ```go theme={"dark"} // Service account token path will default to /var/run/secrets/kubernetes.io/serviceaccount/token if empty value is passed _, err = client.Auth().KubernetesAuthLogin("MACHINE_IDENTITY_ID", "SERVICE_ACCOUNT_TOKEN_PATH") if err != nil { fmt.Println(err) os.Exit(1) } ``` #### JWT Auth Please note that this authentication method requires a valid JWT token from your JWT issuer. Please [read more](/documentation/platform/identities/jwt-auth) about this authentication method. **Using the SDK** ```go theme={"dark"} credential, err := client.Auth().JwtAuthLogin("MACHINE_IDENTITY_ID", "JWT_TOKEN") if err != nil { fmt.Println(err) os.Exit(1) } ``` #### LDAP Auth Please note that this authentication method requires LDAP credentials. Please [read more](/documentation/platform/identities/ldap-auth/general) about this authentication method. **Using environment variables** You can set the `INFISICAL_LDAP_AUTH_IDENTITY_ID` environment variable and pass empty string for the identity ID: ```go theme={"dark"} credential, err := client.Auth().LdapAuthLogin("", "LDAP_USERNAME", "LDAP_PASSWORD") if err != nil { fmt.Println(err) os.Exit(1) } ``` **Using the SDK directly** ```go theme={"dark"} credential, err := client.Auth().LdapAuthLogin("MACHINE_IDENTITY_ID", "LDAP_USERNAME", "LDAP_PASSWORD") if err != nil { fmt.Println(err) os.Exit(1) } ``` #### OCI Auth Please note that this authentication method will only work if you're running your application on Oracle Cloud Infrastructure. Please [read more](/documentation/platform/identities/oci-auth) about this authentication method. **Using environment variables** You can set the `INFISICAL_OCI_AUTH_IDENTITY_ID` environment variable and omit the `IdentityID` field: ```go theme={"dark"} credential, err := client.Auth().OciAuthLogin(infisical.OciAuthLoginOptions{ UserID: "USER_OCID", TenancyID: "TENANCY_OCID", Fingerprint: "FINGERPRINT", PrivateKey: "PRIVATE_KEY", Region: "REGION", }) if err != nil { fmt.Println(err) os.Exit(1) } ``` **Using the SDK directly** ```go theme={"dark"} credential, err := client.Auth().OciAuthLogin(infisical.OciAuthLoginOptions{ IdentityID: "MACHINE_IDENTITY_ID", UserID: "USER_OCID", TenancyID: "TENANCY_OCID", Fingerprint: "FINGERPRINT", PrivateKey: "PRIVATE_KEY", Region: "REGION", Passphrase: nil, // Optional: pointer to string if your private key has a passphrase }) if err != nil { fmt.Println(err) os.Exit(1) } ``` **OciAuthLoginOptions fields:** * `IdentityID` (string) - Your Infisical Machine Identity ID. Can be set via `INFISICAL_OCI_AUTH_IDENTITY_ID` environment variable. * `UserID` (string) - Your OCI user OCID. * `TenancyID` (string) - Your OCI tenancy OCID. * `Fingerprint` (string) - Your OCI API key fingerprint. * `PrivateKey` (string) - Your OCI private key (PEM format). * `Region` (string) - Your OCI region (e.g., `us-ashburn-1`). * `Passphrase` (\*string) - Optional: pointer to passphrase string if your private key is encrypted. ## Organization Authentication All SDK authentication methods support logging into a sub-organization that your machine identity has access to. This is optional and only necessary when attempting to authenticate into a sub-organization using an identity created at the root organization. Use the `.Auth().WithOrganizationSlug("")` method to specify which organization to authenticate against: ```go theme={"dark"} _, err := client.Auth().WithOrganizationSlug("ORGANIZATION_SLUG").UniversalAuthLogin("CLIENT_ID", "CLIENT_SECRET") if err != nil { fmt.Println(err) os.Exit(1) } ``` If no organization slug is provided, the authentication session defaults to the organization where the machine identity was originally created. ## Secrets ### List Secrets `client.Secrets().List(options)` Retrieve all secrets within the Infisical project and environment that client is connected to. ```go theme={"dark"} secrets, err := client.Secrets().List(infisical.ListSecretsOptions{ ProjectID: "PROJECT_ID", Environment: "dev", SecretPath: "/foo/bar", AttachToProcessEnv: false, }) ``` #### Parameters The slug name (dev, prod, etc) of the environment from where secrets should be fetched from. The project ID where the secret lives in. The path from where secrets should be fetched from. Whether or not to set the fetched secrets to the process environment. If true, you can access the secrets like so `System.getenv("SECRET_NAME")`. Whether or not to include imported secrets from the current path. Read about [secret import](/documentation/platform/secret-reference) Whether or not to fetch secrets recursively from the specified path. Please note that there's a 20-depth limit for recursive fetching. Whether or not to expand secret references in the fetched secrets. Read about [secret reference](/documentation/platform/secret-reference) ### ### Retrieve Secret `client.Secrets().Retrieve(options)` Retrieve a secret from Infisical. By default `Secrets().Retrieve()` fetches and returns a shared secret. ```go theme={"dark"} secret, err := client.Secrets().Retrieve(infisical.RetrieveSecretOptions{ SecretKey: "API_KEY", ProjectID: "PROJECT_ID", Environment: "dev", }) ``` #### Parameters The key of the secret to retrieve. The project ID where the secret lives in. The slug name (dev, prod, etc) of the environment from where secrets should be fetched from. The path from where secret should be fetched from. The type of the secret. Valid options are "shared" or "personal". If not specified, the default value is "shared". The version of the secret to retrieve. ### ### Create Secret `client.Secrets().Create(options)` Create a new secret in Infisical. ```go theme={"dark"} secret, err := client.Secrets().Create(infisical.CreateSecretOptions{ ProjectID: "PROJECT_ID", Environment: "dev", SecretKey: "NEW_SECRET_KEY", SecretValue: "NEW_SECRET_VALUE", SecretComment: "This is a new secret", }) ``` #### Parameters The key of the secret to create. The value of the secret. A comment for the secret. The project ID where the secret lives in. The slug name (dev, prod, etc) of the environment from where secrets should be fetched from. The path from where secret should be created. The type of the secret. Valid options are "shared" or "personal". If not specified, the default value is "shared". ### ### Update Secret `client.Secrets().Update(options)` Update an existing secret in Infisical. ```go theme={"dark"} secret, err := client.Secrets().Update(infisical.UpdateSecretOptions{ ProjectID: "PROJECT_ID", Environment: "dev", SecretKey: "NEW_SECRET_KEY", NewSecretValue: "NEW_SECRET_VALUE", NewSkipMultilineEncoding: false, }) ``` #### Parameters The key of the secret to update. The new value of the secret. Whether or not to skip multiline encoding for the new secret value. The project ID where the secret lives in. The slug name (dev, prod, etc) of the environment from where secrets should be fetched from. The path from where secret should be updated. The type of the secret. Valid options are "shared" or "personal". If not specified, the default value is "shared". ### ### Delete Secret `client.Secrets().Delete(options)` Delete a secret in Infisical. ```go theme={"dark"} secret, err := client.Secrets().Delete(infisical.DeleteSecretOptions{ ProjectID: "PROJECT_ID", Environment: "dev", SecretKey: "SECRET_KEY", }) ``` #### Parameters The key of the secret to update. The project ID where the secret lives in. The slug name (dev, prod, etc) of the environment from where secrets should be fetched from. The path from where secret should be deleted. The type of the secret. Valid options are "shared" or "personal". If not specified, the default value is "shared". ### Batch Create Secrets `client.Secrets().Batch().Create(options)` Create multiple secrets in Infisical. ```go theme={"dark"} createdSecrets, err := client.Secrets().Batch().Create(infisical.BatchCreateSecretsOptions{ Environment: "", SecretPath: "", ProjectID: "", Secrets: []infisical.BatchCreateSecret{ { SecretKey: "SECRET-1", SecretValue: "test-value-1", }, { SecretKey: "SECRET-2", SecretValue: "test-value-2", }, }, }) ``` #### Parameters The slug name (dev, prod, etc) of the environment from where secrets should be fetched from. The project ID where the secret lives in. The path from where secret should be created. The key of the secret to create. The value of the secret. The comment to add to the secret. Whether or not to skip multiline encoding for the secret value. The tag IDs to associate with the secret. The key of the metadata. The value of the metadata. ## Folders ### ### List Folders `client.Folders().List(options)` Retrieve all within the Infisical project and environment that client is connected to. ```go theme={"dark"} folders, err := client.Folders().List(infisical.ListFoldersOptions{ ProjectID: "PROJECT_ID", Environment: "dev", Path: "/", }) ``` #### Parameters The slug name (dev, prod, etc) of the environment from where folders should be fetched from. The project ID where the folder lives in. The path from where folders should be fetched from. ### ### Create Folder `client.Folders().Create(options)` Create a new folder in Infisical. ```go theme={"dark"} folder, err := client.Folders().Create(infisical.CreateFolderOptions{ ProjectID: "PROJECT_ID", Name: "new=folder-name", Environment: "dev", Path: "/", }) ``` #### Parameters The ID of the project where the folder will be created. The slug name (dev, prod, etc) of the environment where the folder will be created. The path to create the folder in. The root path is `/`. The name of the folder to create. ### ### Update Folder `client.Folders().Update(options)` Update an existing folder in Infisical. ```go theme={"dark"} folder, err := client.Folders().Update(infisical.UpdateFolderOptions{ ProjectID: "PROJECT_ID", Environment: "dev", Path: "/", FolderID: "FOLDER_ID_TO_UPDATE", NewName: "new-folder-name", }) ``` #### Parameters The ID of the project where the folder will be updated. The slug name (dev, prod, etc) of the environment from where the folder lives in. The path from where the folder should be updated. The ID of the folder to update. The new name of the folder. ### ### Delete Folder `client.Folders().Delete(options)` Delete a folder in Infisical. ```go theme={"dark"} deletedFolder, err := client.Folders().Delete(infisical.DeleteFolderOptions{ // Either folder ID or folder name is required. FolderName: "name-of-folder-to-delete", FolderID: "folder-id-to-delete", ProjectID: "PROJECT_ID", Environment: "dev", Path: "/", }) ``` #### Parameters The name of the folder to delete. Note that either `FolderName` or `FolderID` is required. The ID of the folder to delete. Note that either `FolderName` or `FolderID` is required. The ID of the project where the folder lives in. The slug name (dev, prod, etc) of the environment from where the folder lives in. The path from where the folder should be deleted. ## KMS ### Create Key `client.Kms().Keys().Create(options)` Create a new key in Infisical. ```go theme={"dark"} newKey, err := client.Kms().Keys().Create(infisical.KmsCreateKeyOptions{ KeyUsage: "|", Description: "", Name: "", EncryptionAlgorithm: "|||", ProjectId: "", }) ``` #### Parameters The usage of the key. Valid options are `sign-verify` or `encrypt-decrypt`. The usage dictates what the key can be used for. The description of the key. The name of the key. The encryption algorithm of the key. Valid options for Signing/Verifying keys are: * `rsa-4096` * `ecc-nist-p256` Valid options for Encryption/Decryption keys are: * `aes-256-gcm` * `aes-128-gcm` The ID of the project where the key will be created. #### Return (object) The ID of the key that was created. The name of the key that was created. The description of the key that was created. Whether or not the key is disabled. The ID of the organization that the key belongs to. The ID of the project that the key belongs to. The intended usage of the key that was created. The encryption algorithm of the key that was created. The version of the key that was created. ### Delete Key `client.Kms().Keys().Delete(options)` Delete a key in Infisical. ```go theme={"dark"} deletedKey, err = client.Kms().Keys().Delete(infisical.KmsDeleteKeyOptions{ KeyId: "", }) ``` #### Parameters The ID of the key to delete. #### Return (object) The ID of the key that was deleted The name of the key that was deleted. The description of the key that was deleted. Whether or not the key is disabled. The ID of the organization that the key belonged to. The ID of the project that the key belonged to. The intended usage of the key that was deleted. The encryption algorithm of the key that was deleted. The version of the key that was deleted. ### Signing Data `client.Kms().Signing().Sign(options)` Sign data in Infisical. ```go theme={"dark"} res, err := client.Kms().Signing().SignData(infisical.KmsSignDataOptions{ KeyId: "", Data: "", // Must be a base64 encoded string. SigningAlgorithm: "", // The signing algorithm that will be used to sign the data. }) ``` #### Parameters The ID of the key to sign the data with. The data to sign. Must be a base64 encoded string. Whether the data is already digested or not. The signing algorithm to use. You must use a signing algorithm that matches the key usage. If you are unsure about which signing algorithms are available for your key, you can use the `client.Kms().Signing().ListSigningAlgorithms()` method. It will return an array of signing algorithms that are available for your key. Valid options for `RSA 4096` keys are: * `RSASSA_PSS_SHA_512` * `RSASSA_PSS_SHA_384` * `RSASSA_PSS_SHA_256` * `RSASSA_PKCS1_V1_5_SHA_512` * `RSASSA_PKCS1_V1_5_SHA_384` * `RSASSA_PKCS1_V1_5_SHA_256` Valid options for `ECC NIST P256` keys are: * `ECDSA_SHA_512` * `ECDSA_SHA_384` * `ECDSA_SHA_256` #### Return (\[]byte) The signature of the data that was signed. ### Verifying Data `client.Kms().Signing().Verify(options)` Verify data in Infisical. ```go theme={"dark"} res, err := client.Kms().Signing().Verify(infisical.KmsVerifyDataOptions{ KeyId: "", Data: "", // Must be a base64 encoded string. SigningAlgorithm: "", // The signing algorithm that was used to sign the data. }) ``` #### Parameters The ID of the key to verify the data with. The data to verify. Must be a base64 encoded string. Whether the data is already digested or not. The signing algorithm that was used to sign the data. #### Return (object) Whether or not the data is valid. The ID of the key that was used to verify the data. The signing algorithm that was used to verify the data. ### List Signing Algorithms `client.Kms().Signing().ListSigningAlgorithms(options)` List signing algorithms in Infisical. ```go theme={"dark"} res, err := client.Kms().Signing().ListSigningAlgorithms(infisical.KmsListSigningAlgorithmsOptions{ KeyId: "", }) ``` #### Parameters The ID of the key to list signing algorithms for. #### Return (\[]string) The signing algorithms that are available for the key. ### Get Public Key This method is only available for keys with key usage `sign-verify`. If you attempt to use this method on a key that is intended for encryption/decryption, it will return an error. `client.Kms().Signing().GetPublicKey(options)` Get the public key in Infisical. ```go theme={"dark"} publicKey, err := client.Kms().Signing().GetPublicKey(infisical.KmsGetPublicKeyOptions{ KeyId: "", }) ``` #### Parameters The ID of the key to get the public key for. #### Return (string) The public key for the key. ### Encrypt Data `client.Kms().Encryption().Encrypt(options)` Encrypt data with a key in Infisical KMS. ```go theme={"dark"} res, err := client.Kms().EncryptData(infisical.KmsEncryptDataOptions{ KeyId: "", Plaintext: "", }) ``` #### Parameters The ID of the key to encrypt the data with. #### Return (string) The encrypted data. ### Decrypt Data `client.Kms().DecryptData(options)` Decrypt data with a key in Infisical KMS. ```go theme={"dark"} res, err := client.Kms().DecryptData(infisical.KmsDecryptDataOptions{ KeyId: "", Ciphertext: "", }) ``` #### Parameters The ID of the key to decrypt the data with. The encrypted data to decrypt. #### Return (string) The decrypted data. --- # Source: https://infisical.com/docs/self-hosting/reference-architectures/google-cloud-run.md > ## Documentation Index > Fetch the complete documentation index at: https://infisical.com/docs/llms.txt > Use this file to discover all available pages before exploring further. # Google Cloud Run > Reference architecture for self-hosting Infisical on Google Cloud Run. ## Overview This guide outlines a reference architecture for deploying Infisical in a self-hosted configuration using Google Cloud Run. It is intended to provide a scalable, secure, and production-ready baseline for organizations choosing Google Cloud Platform (GCP) as their infrastructure provider. ## Core Components * **Cloud Run:** Infisical service is containerized and deployed as fully managed Cloud Run services. * **Cloud SQL:** Infisical uses Postgres as its persistence layer. As such, Cloud SQL for PostgreSQL is used. * **MemoryStore for Redis:** To schedule jobs, process audit logs and cache performance, Infisical requires Redis. ## Securing Infisical's root credential * **Secrets Manager:** To secure Infisical’s root credentials (database connection string, encryption key, etc.), we highly recommend that you use Google Secrets Manager and only allow the tasks running Infisical to access them. ## High Availability and Scalability This architecture leverages Google Cloud's managed services to achieve high availability and scalability out of the box: **Cloud Run:** * Automatically scales the number of container instances up or down based on incoming request volume. * Supports rapid scaling during traffic spikes, ensuring low latency. * Configurable minimum and maximum instances to handle baseline and peak loads. **Cloud SQL:** * Provides high availability configurations (regional instances with automatic failover) to ensure database uptime. * Automated backups, point-in-time recovery, and maintenance. **MemoryStore:** * Offers highly available Redis configurations with replication. * Fully managed with automatic scaling and patching. **Cloud Load Balancer:** * Distributes user traffic across available Cloud Run instances. * Provides SSL termination, global load balancing, and health checks. **Note:** To further improve performance and availability, consider enabling multi-region deployment strategies, regional VPC Connectors, and database replicas for read-heavy workloads. ## Configuration **Cloud SQL (PostgreSQL):** * Create a Cloud SQL instance. * Under `Zonal availability`, select the `Multiple zones` option to ensure High Availability. * Configure private IP access. **MemoryStore (Redis):** * Deploy a Redis instance. * Configure VPC access. Visit [Docker Hub](https://hub.docker.com/r/infisical/infisical/tags) and select a version of Infisical image you would like to deploy. Then, within Cloud Run, paste the URL of the specific Infisical Docker image you would like to use within the `Container image URL` field. Cloud Run container image settings UI Remember to replace `` with the docker image tag of your choice. For a minimal installation of Infisical, you must configure the following environment variables: ```bash theme={"dark"} ENCRYPTION_KEY= AUTH_SECRET= DB_CONNECTION_URI="" SITE_URL="" REDIS_URL="" ``` [View all available configurations](/self-hosting/configuration/envars). You will want to setup Postgres and Redis within Google Cloud Platform to connect to Infisical. Once you have added the required environment variables to the `Environment Variables` section within Cloud Run, create the container to get Infisical up and running. Cloud Run container environment variables settings UI The above environment variable values are only to be used as an example and should not be used in production Enable `Connect to a VPC for outbound traffic`: This enables the service to talk to private resources (e.g., a Cloud SQL database, Redis instance on a private IP) inside your Google Cloud VPC network. Select `Send traffic directly to a VPC`: It gives lower latency and better performance, but uses more IPs from the subnet. Your Cloud Run revision must be in the same VPC network Cloud Run container network settings UI Once the container is running, verify the installation by opening your web browser and navigating to the Site URL. --- # Source: https://infisical.com/docs/documentation/platform/sso/google-saml.md > ## Documentation Index > Fetch the complete documentation index at: https://infisical.com/docs/llms.txt > Use this file to discover all available pages before exploring further. # Google SAML > Learn how to configure Google SAML for Infisical SSO. Google SAML SSO feature is a paid feature. If you're using Infisical Cloud, then it is available under the **Pro Tier**. If you're self-hosting Infisical, then you should contact [sales@infisical.com](mailto:sales@infisical.com) to purchase an enterprise license to use it. In Infisical, head to the **Single Sign-On (SSO)** page and select the **General** tab. Click **Connect** for **SAML** under the Connect to an Identity Provider section. Select **Google**, then click **Connect** again. SSO connect section Next, note the **ACS URL** and **SP Entity ID** to use when configuring the Google SAML application. Google SAML initial configuration 2.1. In your [Google Admin console](https://support.google.com/a/answer/182076), head to Menu > Apps > Web and mobile apps and create a **custom SAML app**. Google SAML app creation 2.2. In the **App details** tab, give the application a unique name like Infisical. Google SAML app naming 2.3. In the **Google Identity Provider details** tab, copy the **SSO URL**, **Entity ID** and **Certificate**. Google SAML custom app details 2.4. Back in Infisical, set **SSO URL** and **Certificate** to the corresponding items from step 2.3. Google SAML Infisical config 2.5. Back in the Google Admin console, in the **Service provider details** tab, set the **ACS URL** and **Entity ID** to the corresponding items from step 1. Also, check the **Signed response** checkbox. Google SAML app config 2 2.6. In the **Attribute mapping** tab, configure the following map: * **First name** -> **firstName** * **Last name** -> **lastName** * **Primary email** -> **email** Google SAML attribute mapping If you want to sync Google groups to Infisical groups, you can also configure: * **groups** -> **groups** This requires setting up group claims in Google Workspace. See the [Group Membership Mapping](#saml-group-membership-mapping) section below for details. Click **Finish**. Back in your [Google Admin console](https://support.google.com/a/answer/182076), head to Menu > Apps > Web and mobile apps > your SAML app and press on **User access**. Google SAML user access To assign everyone in your organization to the application, click **On for everyone** or **Off for everyone** and then click **Save**. You can also assign an organizational unit or set of users to an application; you can learn more about that [here](https://support.google.com/a/answer/6087519?hl=en#add_custom_saml\&turn_on\&verify_sso&\&zippy=%2Cstep-add-the-custom-saml-app%2Cstep-turn-on-your-saml-app%2Cstep-verify-that-sso-is-working-with-your-custom-app). Google SAML user access assignment Enabling SAML SSO allows members in your organization to log into Infisical via Google Workspace. Google SAML enable Enforcing SAML SSO ensures that members in your organization can only access Infisical by logging into the organization via Google. To enforce SAML SSO, you're required to test out the SAML connection by successfully authenticating at least one Google user with Infisical; Once you've completed this requirement, you can toggle the **Enforce SAML SSO** button to enforce SAML SSO. We recommend ensuring that your account is provisioned the application in Google prior to enforcing SAML SSO to prevent any unintended issues. In case of a lockout, an organization admin can use the [Admin Login Portal](https://infisical.com/docs/documentation/platform/sso/overview#admin-login-portal) in the `/login/admin` path e.g. [https://app.infisical.com/login/admin](https://app.infisical.com/login/admin). ## SAML Group Membership Mapping Automatically sync Google Workspace group memberships to Infisical. In your Google Admin console SAML app, go to **Attribute mapping** and add: * **Google groups**: Include all groups you want to include in the SAML claim. Only these groups will be synced to Infisical. * **App attribute**: `groups` Google SAML groups attribute mapping Back in Infisical, under Organization Settings, enable **SAML Group Membership Mapping** in the **Single Sign-On (SSO)** tab. Google SAML group membership mapping Once configured, Google groups will now be automatically synchronized when users log in through SAML. Users will be added to or removed from Infisical groups based on their current Google group memberships. Group membership changes in the SAML provider only sync with Infisical when a user logs in via SAML. For example, if you remove a user from a group in the SAML provider, this change will not be reflected in Infisical until their next SAML login. To ensure this behavior, Infisical recommends enabling Enforce SAML SSO. If you are only using one organization on your Infisical instance, you can configure a default organization in the [Server Admin Console](../admin-panel/server-admin#default-organization) to expedite SAML login. If you're configuring SAML SSO on a self-hosted instance of Infisical, make sure to set the `AUTH_SECRET` and `SITE_URL` environment variable for it to work:
* `AUTH_SECRET`: A secret key used for signing and verifying JWT. This can be a random 32-byte base64 string generated with `openssl rand -base64 32`.
* `SITE_URL`: The absolute URL of your self-hosted instance of Infisical including the protocol (e.g. [https://app.infisical.com](https://app.infisical.com)) References: * Google's guide to [set up your own custom SAML app](https://support.google.com/a/answer/6087519?hl=en#add_custom_saml\&turn_on\&verify_sso&\&zippy=%2Cstep-add-the-custom-saml-app%2Cstep-turn-on-your-saml-app%2Cstep-verify-that-sso-is-working-with-your-custom-app). --- # Source: https://infisical.com/docs/documentation/platform/sso/google.md > ## Documentation Index > Fetch the complete documentation index at: https://infisical.com/docs/llms.txt > Use this file to discover all available pages before exploring further. # Google SSO > Learn how to configure Google SSO for Infisical. Using Google SSO on a self-hosted instance of Infisical requires configuring an OAuth2 application in GCP and registering your instance with it. Navigate to your project API & Services > Credentials to create a new OAuth2 application. GCP API services GCP create new OAuth2 application Create the application. As part of the form, add to **Authorized redirect URIs**: `https://your-domain.com/api/v1/sso/google`. GCP create new OAuth2 application form Obtain the **Client ID** and **Client Secret** for your GCP OAuth2 application. GCP obtain OAuth2 credentials Back in your Infisical instance, make sure to set the following environment variables: * `CLIENT_ID_GOOGLE_LOGIN`: The **Client ID** of your GCP OAuth2 application. * `CLIENT_SECRET_GOOGLE_LOGIN`: The **Client Secret** of your GCP OAuth2 application. * `AUTH_SECRET`: A secret key used for signing and verifying JWT. This can be a random 32-byte base64 string generated with `openssl rand -base64 32`. * `SITE_URL`: The URL of your self-hosted instance of Infisical - should be an absolute URL including the protocol (e.g. [https://app.infisical.com](https://app.infisical.com)) Once added, restart your Infisical instance and log in with Google ## FAQ It is likely that you have misconfigured your self-hosted instance of Infisical. You should: * Check that you have set the `CLIENT_ID_GOOGLE_LOGIN`, `CLIENT_SECRET_GOOGLE_LOGIN`, `AUTH_SECRET`, and `SITE_URL` environment variables. * Check that the **Authorized redirect URI** specified in GCP matches the `SITE_URL` environment variable. For example, if the former is `https://app.infisical.com/api/v1/sso/google` then the latter should be `https://app.infisical.com`. --- # Source: https://infisical.com/docs/documentation/guides/governance-models.md > ## Documentation Index > Fetch the complete documentation index at: https://infisical.com/docs/llms.txt > Use this file to discover all available pages before exploring further. # Centralized vs. Self-Service Governance > Learn how to structure Infisical for centralized platform administration or team self-service autonomy Organizations adopt different approaches to secrets management governance based on their security requirements, compliance obligations, and team structures. Infisical supports a spectrum of governance models—from fully centralized platform administration to team-driven self-service. This guide covers how to configure Infisical for different governance approaches and what tradeoffs to consider. ## Understanding the Spectrum Most organizations don't operate at the extremes. Instead, they land somewhere on a spectrum between two models: **Centralized Administration**: A dedicated platform or security team controls project creation, access policies, integrations, and secret lifecycle management. Application teams consume secrets but don't manage the underlying infrastructure. **Self-Service**: Teams have autonomy to create projects, manage their own access, configure integrations, and operate independently. Central teams provide guardrails and standards rather than direct management. The right model depends on your regulatory environment, team maturity, organizational scale, and security posture. Highly regulated industries often lean toward centralized control, while organizations with mature DevOps practices may benefit from self-service with guardrails. ## Organizational Structure Project and environment structure is where governance decisions start to take shape. ### Project Ownership | Approach | Centralized | Self-Service | | ---------------------- | ----------------------------------------------------------------- | --------------------------------------------- | | **Project creation** | Platform team creates all projects on behalf of application teams | Teams create their own projects as needed | | **Naming conventions** | Enforced through process and templates | Documented standards, team-enforced | | **Folder structure** | Predefined conventions (e.g., `/apps/{app-name}/{component}`) | Teams define hierarchies that fit their needs | ### Project Templates [Project Templates](/documentation/platform/project-templates) allow you to define standard environments, roles, and settings that are applied when creating new projects. This feature supports both governance models: * **Centralized**: Require all projects to use approved templates, ensuring consistent environment structures and role definitions across the organization * **Self-Service**: Provide templates as a starting point that teams can build upon, reducing setup time while allowing customization Project Templates apply at creation time and don't propagate changes to existing projects. Plan your template strategy before widespread adoption. ### Environment Strategy Environments define the deployment stages where secrets are managed. * **Standardized environments** (e.g., `dev`, `staging`, `prod`) provide consistency and simplify cross-team collaboration * **Custom environments** allow teams to model their specific deployment pipelines (e.g., `qa`, `uat`, `perf-test`, `prod-eu`, `prod-us`) With Project Templates, you can enforce a base set of environments while optionally allowing teams to add additional ones. ## Authentication and Identity How you manage identity—both for users and machines—significantly affects your governance strategy. ### User Authentication | Approach | Centralized | Self-Service | | -------------------- | ------------------------------------- | --------------------------------------- | | **Login methods** | SSO enforced, local accounts disabled | SSO available, local accounts permitted | | **MFA** | Required organization-wide | Encouraged or optional | | **Session duration** | Short sessions enforced | Longer sessions permitted | Infisical supports multiple authentication methods that can be configured based on your requirements: * [SAML SSO](/documentation/platform/sso/overview) with providers like Okta, Azure AD, Google Workspace, and JumpCloud * [OIDC SSO](/documentation/platform/sso/general-oidc) for standards-based authentication * [LDAP](/documentation/platform/ldap/overview) for directory-based authentication ### User Provisioning | Approach | Centralized | Self-Service | | ------------------- | ----------------------------------------- | ------------------------------------ | | **User onboarding** | Automatic via SCIM from identity provider | Direct invitations by project admins | | **Role assignment** | Mapped from IdP groups | Assigned manually per project | | **Offboarding** | Automatic deprovisioning via SCIM | Manual removal required | [SCIM provisioning](/documentation/platform/scim/overview) enables automatic user lifecycle management synced with your identity provider. Combined with [group mappings](/documentation/platform/scim/group-mappings), you can automatically assign organization roles based on IdP group membership. For organizations using SAML, [group membership mapping](/documentation/platform/sso/google-saml#saml-group-membership-mapping) synchronizes group memberships when users log in, ensuring access reflects current IdP state. ### Machine Identity Management [Machine identities](/documentation/platform/identities/machine-identities) authenticate applications, services, and automated systems with Infisical. Your governance model shapes how these identities are managed: | Approach | Centralized | Self-Service | | ------------------------- | -------------------------------------------------------------------------- | -------------------------------------------------------- | | **Identity creation** | Platform team creates all identities; teams submit requests | Teams create identities for their own projects | | **Auth method selection** | Standardized methods enforced (e.g., "Kubernetes Auth only in production") | Teams choose methods appropriate to their infrastructure | | **Credential management** | Platform team manages and distributes credentials | Teams manage their own identity credentials | Infisical supports multiple machine identity authentication methods: * [Universal Auth](/documentation/platform/identities/universal-auth) — Client ID/secret authentication for any environment * [Kubernetes Auth](/documentation/platform/identities/kubernetes-auth) — Native authentication using Kubernetes service accounts * [AWS Auth](/documentation/platform/identities/aws-auth) — Authentication using AWS IAM roles * [Azure Auth](/documentation/platform/identities/azure-auth) — Authentication using Azure managed identities * [GCP Auth](/documentation/platform/identities/gcp-auth) — Authentication using GCP service accounts * [OIDC Auth](/documentation/platform/identities/oidc-auth) — Authentication using OIDC identity tokens Centralized organizations often standardize on platform-native authentication methods (Kubernetes Auth, cloud provider auth) to eliminate static credentials, while self-service models may permit Universal Auth for flexibility. ## Access Control Infisical's [role-based access control](/documentation/platform/access-controls/role-based-access-controls) operates at two levels: organization and project. How you configure these controls determines who can do what across your secrets infrastructure. ### Organization-Level Roles [Organization roles](/documentation/platform/access-controls/role-based-access-controls#organization-level-access-controls) govern access to organization-wide resources like billing, member management, and identity provider configuration. | Role | Capabilities | | ---------------- | --------------------------------------------------------------- | | **Admin** | Full access to all organization settings and all projects | | **Member** | Basic organization access; project access determined separately | | **Custom roles** | Tailored permissions for specific administrative functions | The Admin role grants access to all projects in the organization. In both governance models, this role should be assigned sparingly to prevent unintended access to sensitive secrets. ### Project-Level Roles [Project roles](/documentation/platform/access-controls/role-based-access-controls#project-level-access-controls) control what users and machine identities can do within a specific project. | Approach | Centralized | Self-Service | | --------------------- | ---------------------------------------------------------------------- | ------------------------------------------------- | | **Role definition** | Custom roles defined by platform team; teams assigned predefined roles | Teams create project-level custom roles as needed | | **Production access** | Restricted to specific roles; requires approval | Teams determine their own access patterns | | **Role assignment** | Managed through groups synced from IdP | Project admins assign roles directly | Built-in project roles include: * **Admin**: Full access to all environments, folders, secrets, and project settings * **Developer**: Standard access with restrictions on project administration and policy management * **Viewer**: Read-only access to secrets and project resources [Custom roles](/documentation/platform/access-controls/role-based-access-controls#creating-custom-roles) let you define granular permissions for specific environments, folder paths, and actions—useful for implementing least-privilege access. ### Groups [Groups](/documentation/platform/groups) simplify access management by allowing you to assign roles to collections of users rather than individuals. Key behaviors: * Adding a group to a project grants all group members access with the assigned role(s) * Users inherit composite permissions from all groups they belong to * Group membership can be managed locally or synced from your identity provider via SCIM | Approach | Centralized | Self-Service | | ---------------------- | ---------------------------------------- | --------------------------------------------- | | **Group management** | Groups defined in IdP, synced via SCIM | Project admins create and manage local groups | | **Project membership** | Controlled through IdP group assignments | Direct group/user additions by project admins | ### Temporary and Just-in-Time Access For sensitive environments, both governance models benefit from time-limited access: * [Temporary access](/documentation/platform/access-controls/temporary-access) grants permissions that automatically expire after a defined period * [Additional privileges](/documentation/platform/access-controls/additional-privileges) allow temporary elevation beyond a user's base role Centralized organizations typically require temporary access for production environments, while self-service models may use it selectively for high-risk operations. ## Approval Workflows [Approval workflows](/documentation/platform/pr-workflows) add oversight to sensitive operations, supporting compliance requirements and change management practices. ### Change Policies Change policies require approval before secrets can be modified in specific environments or folder paths. When a policy applies, proposed changes enter a review queue where designated approvers can approve and merge—or reject—the changes. | Approach | Centralized | Self-Service | | ---------------------- | --------------------------------------------- | ------------------------------------------------------ | | **Policy scope** | Required for all production environments | Teams define policies for their sensitive environments | | **Approvers** | Security team members or designated reviewers | Team leads or senior engineers | | **Bypass permissions** | Strictly limited | May allow emergency bypass for on-call | ### Access Requests [Access requests](/documentation/platform/access-controls/access-requests) formalize the process of granting access to sensitive resources. Combined with temporary access, this enables just-in-time access patterns where users request and receive time-limited permissions. | Approach | Centralized | Self-Service | | ----------------------- | ------------------------------- | ----------------------------------- | | **Request requirement** | Mandatory for production access | Optional or environment-specific | | **Approval workflow** | Formal review by security team | Peer approval or team lead sign-off | | **Access duration** | Strictly time-limited | Flexible based on need | ### Notifications Approval workflows integrate with [Slack](/documentation/platform/workflow-integrations/slack-integration) and [Microsoft Teams](/documentation/platform/workflow-integrations/microsoft-teams-integration) to notify approvers in real-time, reducing delays in the approval process. ## Secret Lifecycle Who creates, rotates, and retires secrets—and how—depends on your governance model. ### App Connections [App Connections](/integrations/app-connections/overview) are reusable integrations with third-party platforms like AWS, GCP, Azure, databases, and other services. They're required for secret rotation, dynamic secrets, and secret syncs—so how you manage them affects multiple workflows. | Approach | Centralized | Self-Service | | ------------------------- | ---------------------------------------------------------------------------------------------- | ------------------------------------------------------- | | **Connection creation** | Platform team creates connections at the organization level and distributes access to projects | Teams create their own connections at the project level | | **Credential management** | Platform team manages service accounts and API keys used by connections | Teams manage credentials for their own connections | | **Access distribution** | Connections shared across multiple projects as needed | Each team maintains their own set of connections | ### Secret Creation and Ownership | Approach | Centralized | Self-Service | | ----------------------- | ----------------------------------------------------------------- | ---------------------------------- | | **Shared secrets** | Platform team provisions infrastructure secrets (databases, APIs) | Teams request or create their own | | **Application secrets** | Teams manage within their designated paths | Teams have full ownership | | **Secret standards** | Naming conventions and metadata requirements enforced | Guidelines provided, team-enforced | ### Secret Rotation [Secret rotation](/documentation/platform/secret-rotation/overview) automates credential lifecycle management, reducing the risk of long-lived secrets. | Approach | Centralized | Self-Service | | ---------------------- | ----------------------------------------------------- | ------------------------------------- | | **Rotation policies** | Defined and managed by platform team | Teams configure for their services | | **Rotation schedules** | Standardized intervals based on secret classification | Teams determine appropriate intervals | ### Dynamic Secrets [Dynamic secrets](/documentation/platform/dynamic-secrets/overview) generate short-lived credentials on demand, eliminating standing access to sensitive systems. | Approach | Centralized | Self-Service | | ------------------ | -------------------------------------------- | ------------------------------------------------ | | **Configuration** | Platform team sets up dynamic secret sources | Teams configure for their databases and services | | **Lease duration** | Standardized TTLs based on use case | Teams determine appropriate durations | | **Access control** | Restricted to specific roles | Available to authorized team members | ### Secret Referencing Within Projects [Secret referencing](/documentation/platform/secret-references) and [imports](/documentation/platform/secret-references) allow secrets to be shared across environments and folders within the same project. This helps reduce duplication when the same secret is needed in multiple environments. | Approach | Centralized | Self-Service | | ---------------------- | -------------------------------------------------------- | ------------------------------------------------- | | **Reference patterns** | Standardized import structures across projects | Teams define their own reference hierarchies | | **Base environment** | Platform team designates source environments for imports | Teams choose which environments to reference from | Projects in Infisical are isolated from one another. Secret referencing and imports work within a single project—you cannot reference secrets across different projects. ## Integrations and Secret Delivery Infisical offers multiple methods for delivering secrets to applications and infrastructure. ### Secret Syncs [Secret Syncs](/integrations/secret-syncs/overview) push secrets to third-party platforms like AWS Secrets Manager, Azure Key Vault, GCP Secret Manager, and others. Syncs keep external secret stores updated when values change in Infisical. | Approach | Centralized | Self-Service | | -------------------- | ------------------------------------------------------- | ---------------------------------------- | | **Sync setup** | Platform team configures syncs to approved destinations | Teams configure syncs for their projects | | **Target platforms** | Limited to approved platforms | Teams choose appropriate destinations | | **Sync scope** | Standardized patterns (e.g., sync prod to AWS SM only) | Teams determine what to sync and where | ### Kubernetes Integration For Kubernetes environments, two primary integration patterns are available: * [Infisical Kubernetes Operator](/integrations/platforms/kubernetes/infisical-operator) — Syncs secrets to Kubernetes Secrets resources * [Infisical Secrets Injector](/integrations/platforms/kubernetes-injector) — Injects secrets directly into pods at runtime | Approach | Centralized | Self-Service | | ------------------------ | ----------------------------------------------------- | ------------------------------------------------ | | **Operator deployment** | Single cluster-wide instance managed by platform team | Teams may deploy namespace-scoped instances | | **Secret sync patterns** | Standardized CRD configurations | Teams define their own InfisicalSecret resources | ### Agent and CLI The [Infisical Agent](/infisical-agent/overview) and [CLI](/cli/overview) provide flexible secret consumption patterns: | Approach | Centralized | Self-Service | | -------------------- | ------------------------------------------ | ------------------------------------------- | | **Agent deployment** | Managed by platform team as infrastructure | Teams deploy and configure their own agents | | **CLI usage** | Standardized configurations provided | Teams use CLI as needed in their workflows | ### Gateways [Gateways](/documentation/platform/gateways/overview) enable Infisical to securely access private resources—such as databases in isolated VPCs—without exposing them to the public internet. Gateways are lightweight components deployed within your private network that establish secure, outbound-only connections to Infisical. Gateways are essential for features that require direct access to private infrastructure: * [Dynamic secrets](/documentation/platform/dynamic-secrets/overview) for databases in private networks * [Secret rotation](/documentation/platform/secret-rotation/overview) for credentials stored in isolated systems * [Kubernetes Auth](/documentation/platform/identities/kubernetes-auth) token review for private clusters #### Gateway Architecture Gateways operate at two levels within Infisical: 1. **Organization-level registration**: Gateways are registered and visible in Organization Settings → Access Control → Gateways. This provides central visibility into all gateway infrastructure. 2. **Project-level linking**: When configuring features like dynamic secrets, teams select from available gateways to route requests through private networks. This architecture naturally supports a hybrid governance model where infrastructure teams manage gateway deployment while application teams consume them. #### Governance Considerations | Approach | Centralized | Self-Service | | ------------------------------- | --------------------------------------------------------------------- | -------------------------------------------------------------- | | **Gateway deployment** | Platform/infrastructure team deploys gateways in shared network zones | Teams deploy gateways in their own VPCs or network segments | | **Machine identity management** | Platform team creates and manages identities used by gateways | Teams create identities for gateways they deploy | | **Network configuration** | Central team manages firewall rules and network connectivity | Teams responsible for their own network access | | **Gateway selection** | Platform team links gateways to projects | Teams select from available gateways when configuring features | Each gateway requires a [machine identity](/documentation/platform/identities/machine-identities) for authentication. Your gateway governance model should align with your broader machine identity strategy. #### Common Patterns **Shared Gateway Model** (Centralized) A platform team deploys gateways in shared network zones that can reach common infrastructure (e.g., a central database cluster). Multiple projects link to these shared gateways, reducing deployment overhead and centralizing network management. This pattern works well when: * Multiple applications share common database infrastructure * Network access is controlled by a central team * You want to minimize the number of gateway deployments to manage **Team-Owned Gateway Model** (Self-Service) Each team deploys gateways within their own network boundaries (e.g., per-team VPCs or Kubernetes namespaces). Teams manage the full lifecycle of their gateways, including the machine identities that authenticate them. This pattern works well when: * Teams have isolated network environments * Teams have infrastructure expertise to deploy and maintain gateways * Strict network segmentation requires dedicated gateways per team **Hybrid Model** Platform team deploys and registers gateways, but application teams independently select which gateway to use when configuring dynamic secrets or rotation. This provides central oversight of infrastructure while giving teams flexibility in how they use it. For Kubernetes environments, gateways can also serve as token reviewers for [Kubernetes Auth](/documentation/platform/identities/kubernetes-auth), eliminating the need for long-lived service account tokens. In this scenario, the gateway deployment often aligns with whoever manages the Kubernetes cluster. ## Audit and Compliance Visibility into secrets access and changes is critical for security and compliance. Infisical provides audit capabilities at both organization and project levels. ### Audit Logs [Audit logs](/documentation/platform/audit-logs) capture all platform activity including secret access, modifications, and administrative actions. | Level | Scope | Typical Access | | ---------------- | ---------------------------------- | ---------------------------------- | | **Organization** | All activity across all projects | Security team, compliance officers | | **Project** | Activity within a specific project | Project admins, team leads | | Approach | Centralized | Self-Service | | ------------------------ | ---------------------------------------------- | -------------------------------------------- | | **Log access** | Security team has organization-wide visibility | Teams access only their project logs | | **Log retention** | Centrally managed retention policies | Platform-defined retention | | **Compliance reporting** | Platform team generates reports | Teams may generate their own project reports | ### Audit Log Streaming [Audit log streaming](/documentation/platform/audit-log-streams/audit-log-streams) exports logs to external systems for long-term retention and analysis. Supported destinations include: * SIEM platforms (Splunk, Datadog, Elastic) * Cloud storage (AWS S3, Azure Blob Storage) * Log aggregators (Better Stack, generic HTTP endpoints) | Approach | Centralized | Self-Service | | ------------------------ | ------------------------------------- | ------------------------------------- | | **Stream configuration** | Platform team manages all log streams | N/A (organization-level feature) | | **SIEM integration** | Centralized security monitoring | Teams may not have direct SIEM access | ## Security Controls Beyond access control, Infisical offers additional security settings. ### Security Policies Organization-level [security policies](/documentation/platform/organization) allow you to enforce: * MFA requirements for all users * Session duration limits * Login restrictions ### IP Access Controls Restrict API and dashboard access to specific IP ranges, useful for: * Limiting production access to corporate networks or VPNs * Restricting machine identity authentication to known infrastructure IPs ### Encryption and Key Management | Feature | Description | Governance Consideration | | ---------------- | --------------------------------------------------- | ------------------------------------- | | **External KMS** | Integrate with AWS KMS, GCP KMS, or Azure Key Vault | Centralized key management | | **BYOK** | Bring your own encryption keys | Enterprise key management policies | | **KMIP** | Connect to KMIP-compatible HSMs | Hardware-backed security requirements | These features are typically managed centrally regardless of overall governance model, as encryption infrastructure requires specialized expertise. ## Choosing Your Model A few factors tend to push organizations toward one end of the spectrum or the other: ### Factors Favoring Centralized Control * **Regulatory requirements**: SOC 2, HIPAA, PCI-DSS, and similar frameworks often require demonstrated control over secrets management * **Limited security expertise**: When application teams lack security experience, central management reduces risk * **Consistency requirements**: Large organizations benefit from standardized patterns across teams * **High-risk environments**: Financial services, healthcare, and government contexts often require strict oversight ### Factors Favoring Self-Service * **Mature DevOps culture**: Teams with strong security awareness can manage their own secrets responsibly * **Speed of delivery**: Self-service reduces bottlenecks and accelerates development cycles * **Diverse technology stacks**: Teams using different platforms benefit from flexibility in integration choices * **Distributed organizations**: Global teams may need autonomy to operate across time zones ### The Hybrid Approach Most organizations benefit from a hybrid model that combines central guardrails with team autonomy: **Platform team responsibilities:** * SSO and SCIM configuration * Project template creation and maintenance * Organization-wide security policies * Audit log streaming and compliance reporting * Approval workflow policies for production environments * Shared infrastructure secrets (databases, external APIs) **Application team responsibilities:** * Project creation (from approved templates) * Application-specific secret management * Integration configuration within their projects * Team-level access control within policy bounds * Secret rotation for team-owned credentials This balances compliance requirements with team velocity—central teams handle the infrastructure and guardrails, while application teams own their day-to-day secrets operations. ## Implementation Considerations ### Starting Centralized, Moving to Self-Service Organizations often begin with centralized control and gradually extend autonomy as teams demonstrate security maturity: 1. **Phase 1**: Platform team manages all aspects; teams consume secrets via provided integrations 2. **Phase 2**: Teams gain ability to manage secrets within their projects; platform team controls project creation and policies 3. **Phase 3**: Teams can create projects from templates and configure integrations; platform team focuses on guardrails and compliance ### Starting Self-Service, Adding Controls Organizations scaling from startup to enterprise may need to add centralization: 1. **Phase 1**: Establish SSO and basic security policies 2. **Phase 2**: Introduce project templates and approval workflows for production 3. **Phase 3**: Implement SCIM provisioning and comprehensive audit streaming ### Documentation and Training Regardless of model, invest in: * Clear documentation of secrets management standards and processes * Training for teams on Infisical features and security best practices * Runbooks for common operations (secret rotation, access requests, incident response) ## Summary Here's a quick reference for how key Infisical features map to each governance model: | Feature | Centralized Use | Self-Service Use | | ---------------------------------------------------------------------------------- | ----------------------------------------------- | -------------------------------------- | | [Project Templates](/documentation/platform/project-templates) | Enforce standards | Provide starting points | | [SCIM](/documentation/platform/scim/overview) | Automate user lifecycle | Supplement direct invitations | | [Groups](/documentation/platform/groups) | IdP-synced membership | Local team management | | [Custom Roles](/documentation/platform/access-controls/role-based-access-controls) | Define organization-wide | Create project-specific | | [Approval Workflows](/documentation/platform/pr-workflows) | Require for all changes | Apply selectively | | [App Connections](/integrations/app-connections/overview) | Org-level connections distributed to projects | Teams create project-level connections | | [Secret Syncs](/integrations/secret-syncs/overview) | Platform-managed syncs to approved destinations | Teams configure their own syncs | | [Gateways](/documentation/platform/gateways/overview) | Shared infrastructure for private access | Team-deployed per network zone | | [Audit Logs](/documentation/platform/audit-logs) | Centralized monitoring | Project-level visibility | Most organizations land somewhere in between—central control over identity, policies, and infrastructure with team ownership of secrets and integrations. You can start at either end of the spectrum and adjust as your needs change. --- # Source: https://infisical.com/docs/integrations/build-tools/gradle.md > ## Documentation Index > Fetch the complete documentation index at: https://infisical.com/docs/llms.txt > Use this file to discover all available pages before exploring further. # Gradle > How to use Infisical to inject environment variables with Gradle # Using Infisical with Gradle By integrating [Infisical CLI](../../cli/overview) with Gradle, you can configure your builds and scripts to different environments, CI/CD pipelines, and more without explicitly setting variables in the command line. This documentation provides an overview of how to use Infisical with [Gradle](https://gradle.org/). ## Basic Usage To run a Gradle task with Infisical, you can use the `run` command. The basic structure is: ``` infisical run -- [Your command here] ``` For example, to run the `generateFile` task in Gradle: ```groovy build.gradle theme={"dark"} task generateFile { doLast { String content = System.getenv('ENV_NAME_FROM_INFISICAL') ?: 'Default Content' file('output.txt').text = content println "Generated output.txt with content: $content" } } ``` ``` infisical run -- gradle generateFile ``` With this command, Infisical will automatically inject the environment variables associated with the current Infisical project into the Gradle process. Your Gradle script can then access these variables using `System.getenv('VARIABLE_NAME')`. ## More Examples ### 1. Building a Project with a Specific Profile Assuming you have different build profiles (e.g., 'development', 'production'), you can use Infisical to switch between them: ``` infisical run -- gradle build ``` Inside your `build.gradle`, you might have: ```groovy build.gradle theme={"dark"} if (System.getenv('PROFILE') == 'production') { // production-specific configurations } ``` ### 2. Running Tests with Different Database Configurations If you want to run tests against different database configurations: ``` infisical run -- gradle test ``` Your test configuration in `build.gradle` can then adjust the database URL accordingly: ```groovy build.gradle theme={"dark"} test { systemProperty 'db.url', System.getenv('DB_URL') } ``` ### 3. Generating Artifacts with Versioning For automated CI/CD pipelines, you might want to inject a build number or version: ``` infisical run -- gradle assemble ``` And in `build.gradle`: ```groovy build.gradle theme={"dark"} version = System.getenv('BUILD_NUMBER') ?: '1.0.0-SNAPSHOT' ``` ## Advantages of Using Infisical with Gradle 1. **Flexibility**: Easily adapt your Gradle builds to different environments without modifying the build scripts or setting environment variables manually. 2. **Reproducibility**: Ensure consistent builds by leveraging the environment variables from the related Infisical project. 3. **Security**: Protect sensitive information by using Infisical's secrets management without exposing them in scripts or logs. --- # Source: https://infisical.com/docs/documentation/platform/scim/group-mappings.md > ## Documentation Index > Fetch the complete documentation index at: https://infisical.com/docs/llms.txt > Use this file to discover all available pages before exploring further. # SCIM Group Mappings > Learn how to enhance your SCIM implementation using group mappings SCIM provisioning, and by extension group mapping, 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](mailto:sales@infisical.com) to purchase an enterprise license to use it. ## SCIM Group to Organization Role Mapping By default, when users are provisioned via SCIM, they will be assigned the default organization role configured in [Organization General Settings](/documentation/platform/organization#settings). For more precise control over membership roles, you can set up SCIM Group to Organization Role Mappings. This enables you to assign specific roles based on the group from which a user is provisioned. SCIM Group Mapping To configure a mapping, simply enter the SCIM group's name and select the role you would like users to be assigned from this group. Be sure to tap **Update Mappings** once complete. SCIM Group Mappings only apply when users are first provisioned. Previously provisioned users will not be affected, allowing you to customize user roles after they are added. --- # Source: https://infisical.com/docs/documentation/platform/sso/keycloak-oidc/group-membership-mapping.md # Source: https://infisical.com/docs/documentation/platform/sso/general-oidc/group-membership-mapping.md > ## Documentation Index > Fetch the complete documentation index at: https://infisical.com/docs/llms.txt > Use this file to discover all available pages before exploring further. # General OIDC Group Membership Mapping > Learn how to sync OIDC group members to matching groups in Infisical. You can have Infisical automatically sync group memberships between your OIDC provider and Infisical by configuring a `groups` claim on your provider tokens. When a user logs in via OIDC, they will be added to Infisical groups that are present in their OIDC `groups` claim, and removed from any Infisical groups not present in the claim. When enabled, manual management of Infisical group memberships will be disabled. Group membership changes in your OIDC provider only sync with Infisical when a user logs in via OIDC. For example, if you remove a user from a group in your OIDC provider, this change will not be reflected in Infisical until their next OIDC login. To ensure this behavior, Infisical recommends enabling Enforce OIDC SSO in the OIDC settings. To enable OIDC Group Membership Mapping, you must configure a `groups` claim in your OIDC provider. Add a `groups` property with a list of the user's OIDC group names to your token. Example of expected token payload: ```json theme={"dark"} { // "email": "john@provider.com", // "given_name": "John", // ...other claims "groups": ["Billing Group", "Sales Group"] } ``` Setup varies between OIDC providers. Please refer to your OIDC provider's documentation for more information. 2.1. In Infisical, create any groups you would like to sync users to. Make sure the name of the Infisical group is an exact match of the OIDC group name. OIDC general infisical group 2.2. Next, enable **OIDC Group Membership Mapping** on the **Single Sign-On (SSO)** page under the **General** tab. OIDC general enable group membership mapping 2.3. The next time a user logs in they will be synced to their matching OIDC groups. OIDC general synced users --- # Source: https://infisical.com/docs/documentation/platform/groups.md > ## Documentation Index > Fetch the complete documentation index at: https://infisical.com/docs/llms.txt > Use this file to discover all available pages before exploring further. # Groups > Manage groups containing users and machine identities in Infisical. Groups 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 [team@infisical.com](mailto:team@infisical.com) to purchase an enterprise license to use it. ## Concept A group is a collection of identities (users and/or machine identities) that you can create in an Infisical organization to more efficiently manage permissions and access control for multiple identities together. For example, you can have a group called `Developers` with the `Developer` role containing all the developers in your organization, or a group called `CI/CD Identities` containing all the machine identities used in your CI/CD pipelines. Groups have the following properties: * If a group is added to a project under specific role(s), all identities in the group will be provisioned access to the project with the role(s). Conversely, if a group is removed from a project, all identities in the group will lose access to the project. * If an identity is added to a group, they will inherit the access control properties of the group including access to project(s) under the role(s) assigned to the group. Conversely, if an identity is removed from a group, they will lose access to project(s) that the group has access to. * If an identity was previously added to a project under a role and is later added to a group that has access to the same project under a different role, then the identity will now have access to the project under the composite permissions of the two roles. If the group is subsequently removed from the project, the identity will not lose access to the project as they were previously added to the project separately. * An identity can be part of multiple groups. If an identity is part of multiple groups, they will inherit the composite permissions of all the groups that they are part of. ## Workflow In the following steps, we explore how to create and use groups to provision access to projects in Infisical. Groups can contain both users and machine identities, and the workflow is the same for both types of identities. To create a group, head to your Organization Settings > Access Control > Groups and press **Create group**. groups org When creating a group, you specify an organization level [role](/documentation/platform/access-controls/role-based-access-controls) for it to assume; you can configure roles in Organization Settings > Access Control > Organization Roles. groups org create Now input a few details for your new group. Here’s some guidance for each field: * Name (required): A friendly name for the group like `Engineering`. * Slug (required): A unique identifier for the group like `engineering`. * Role (required): A role from the Organization Roles tab for the group to assume. The organization role assigned will determine what organization level resources this group can have access to. Next, you'll want to assign identities (users and/or machine identities) to the group. To do this, click on the group row to open the group details page and click on the **+** button. groups org users details In this example, we're assigning **Alan Turing** and **Ada Lovelace** (users) to the group **Engineering**. You can similarly add machine identities to the group by selecting them from the **Machine Identities** tab in the modal. groups org assign users To enable the group to access project-level resources such as secrets within a specific project, you should add it to that project. To do this, head over to the project you want to add the group to and go to Project Settings > Access Control > Groups and press **Add Group to Project**. groups project Next, select the group you want to add to the project and the project level role you want to allow it to assume. The project role assigned will determine what project level resources this group can have access to. groups project add That's it! All identities of the group now have access to the project under the role you assigned to the group. --- # Source: https://infisical.com/docs/integrations/secret-syncs/hashicorp-vault.md # Source: https://infisical.com/docs/integrations/app-connections/hashicorp-vault.md > ## Documentation Index > Fetch the complete documentation index at: https://infisical.com/docs/llms.txt > Use this file to discover all available pages before exploring further. # Hashicorp Vault Connection > Learn how to configure a Hashicorp Vault Connection for Infisical. Infisical is compatible with Vault Self-hosted, HCP Vault Dedicated, and HCP Vault Enterprise deployments. Please note that HCP Generic Secrets are currently not supported. Infisical supports two methods for connecting to Hashicorp Vault. Vault Access In the **Authentication Methods** tab, click on **Enable new method**. Vault Enable Method Vault AppRole You may change the name of the method, but we suggest keeping it as `approle`. Vault Enable Method From the home page, navigate to **Policies**. Vault Policies Navigate Vault Policies Page You may name your policy whatever you want, but remember the name as it will be used in future steps. Depending on your use case, you may have different policy configurations: ```hcl theme={"dark"} path "demo_mount/data/*" { capabilities = [ "create", "read", "update" ] } path "sys/mounts" { capabilities = ["read"] } ``` * **demo\_mount**: The name of the target secrets engine (e.g., 'secret', 'kv'). * **data/\***: The path within the secrets engine used for storing secrets. The wildcard (\*) grants access to all secrets within this mount point. Make sure to replace the policy path with the specific path where you intend to sync your secrets. For better security and control, it's recommended to use a more granular path instead of a wildcard (\*). You can also specify a path that doesn’t yet exist—Infisical will automatically create it for you during the sync process. Vault Create Policy **Open Vault Shell** Vault Shell If you used custom approle or policy names in previous steps, you'll need to customize the following commands. **Create Infisical Role** ```hcl theme={"dark"} vault write auth/approle/role/infisical token_policies="infisical-policy" token_ttl=30s token_max_ttl=2m ``` **Read RoleID** ```hcl theme={"dark"} vault read auth/approle/role/infisical/role-id ``` **Generate New SecretID** ```hcl theme={"dark"} vault write -force auth/approle/role/infisical/secret-id ``` Your shell output should look similar to the image below. Save the RoleID and SecretID values for later steps. Vault Shell Output ## Get a Hashicorp Vault Access Token Open your profile dropdown and click **Copy token**. This token will be used in later steps. Vault Profile Copy Token ## Getting Vault Instance URL For self-hosted instances, locate and copy your vault's base URL (for example: `https://vault.example.com`). Save the URL for later steps. On HCP instances, you may need to navigate to **Cluster Overview** to see your cluster URL. Save this value for later steps. Vault Cluster URLs Cluster Overview is found in the HCP dashboard, not in your cluster's web UI. ## Setup Vault Connection in Infisical In your Infisical dashboard, navigate to the **Integrations** tab in the desired project, then select **App Connections**. App Connections Tab Click the **+ Add Connection** button and select the **Hashicorp Vault Connection** option. Select Vault Connection Configure your Vault Connection using the Instance URL and credentials from the steps above. **Depending on if you chose to authenticate with an Access Token or AppRole, you may need to input different information.** Vault Configure Connection * **Name**: The name of the connection being created. Must be slug-friendly. * **Description**: An optional description to provide details about this connection. * **Gateway (optional):** The gateway connected to your private network. All requests made to your Vault instance will be made through the configured gateway. * **Instance URL**: The URL of your Hashicorp Vault instance. * **Namespace (optional)**: The namespace within your vault. Self-hosted and enterprise clusters may not use namespaces. * **Role ID**: The Role ID generated in the steps above. * **Secret ID**: The Secret ID generated in the steps above. * **Name**: The name of the connection being created. Must be slug-friendly. * **Description**: An optional description to provide details about this connection. * **Gateway (optional):** The gateway connected to your private network. All requests made to your Vault instance will be made through the configured gateway. * **Instance URL**: The URL of your Hashicorp Vault instance. * **Namespace (optional)**: The namespace within your vault. Self-hosted and enterprise clusters may not use namespaces. * **Access Token**: The Access Token generated in the steps above. Your Vault Connection is now available for use. Vault Connection Created To create a Vault Connection, make an API request to the [Create Hashicorp Vault Connection](/api-reference/endpoints/app-connections/hashicorp-vault/create) API endpoint. ### Sample request ```bash Request theme={"dark"} curl --request POST \ --url https://app.infisical.com/api/v1/app-connections/hashicorp-vault \ --header 'Content-Type: application/json' \ --data '{ "name": "my-vault-connection", "method": "app-role", "projectId": "7ffbb072-2575-495a-b5b0-127f88caef78", "credentials": { "instanceUrl": "https://vault.example.com", "roleId": "4797c4fa-7794-71f0-c8b1-7c87759df5bf", "secretId": "ad24df93-19c8-c865-9997-6b8513253d3a" } }' ``` ### Sample response ```bash Response theme={"dark"} { "appConnection": { "id": "3c90c3cc-0d44-4b50-8888-8dd25736052a", "name": "my-vault-connection", "projectId": "7ffbb072-2575-495a-b5b0-127f88caef78", "version": 1, "orgId": "3c90c3cc-0d44-4b50-8888-8dd25736052a", "createdAt": "2025-04-01T05:31:56Z", "updatedAt": "2025-04-01T05:31:56Z", "app": "hashicorp-vault", "method": "app-role", "credentials": { "instanceUrl": "https://vault.example.com", "roleId": "4797c4fa-7794-71f0-c8b1-7c87759df5bf" } } } ``` --- # Source: https://infisical.com/docs/integrations/cloud/hasura-cloud.md # Hasura Cloud > How to sync secrets from Infisical to Hasura Cloud Prerequisites: * Set up and add envars to [Infisical Cloud](https://app.infisical.com) Obtain a Hasura Cloud Access Token in My Account > Access Tokens integrations hasura cloud tokens Navigate to your project's integrations tab in Infisical. integrations Press on the Hasura Cloud tile and input your Hasura Cloud access token to grant Infisical access to your Hasura Cloud account. integrations hasura cloud authorization Select which Infisical environment secrets you want to sync to which Hasura Cloud project and press create integration to start syncing secrets to Hasura Cloud. integrations hasura cloud integrations hasura cloud --- # Source: https://infisical.com/docs/integrations/secret-syncs/heroku.md # Source: https://infisical.com/docs/integrations/app-connections/heroku.md > ## Documentation Index > Fetch the complete documentation index at: https://infisical.com/docs/llms.txt > Use this file to discover all available pages before exploring further. # Heroku Connection > Learn how to configure a Heroku Connection for Infisical using OAuth or Auth Token methods. Infisical supports two methods for connecting to Heroku: **OAuth** and **Auth Token**. Choose the method that best fits your setup and security requirements. The OAuth method provides secure authentication through Heroku's OAuth flow. Using the Heroku Connection with OAuth on a self-hosted instance of Infisical requires configuring an API client in Heroku and registering your instance with it. **Prerequisites:** * A Heroku account with existing applications * Self-hosted Infisical instance Navigate to your user Account settings > Applications to create a new API client. Heroku config settings Heroku config applications Heroku config new app Create the API client. As part of the form, set the **OAuth callback URL** to `https://your-domain.com/organization/app-connections/heroku/oauth/callback`. The domain you defined in the OAuth callback URL should be equivalent to the `SITE_URL` configured in your Infisical instance. Heroku config new app form Obtain the **Client ID** and **Client Secret** for your Heroku API client. Heroku config credentials Back in your Infisical instance, add two new environment variables for the credentials of your Heroku API client: * `INF_APP_CONNECTION_HEROKU_OAUTH_CLIENT_ID`: The **Client ID** of your Heroku API client. * `INF_APP_CONNECTION_HEROKU_OAUTH_CLIENT_SECRET`: The **Client Secret** of your Heroku API client. Once added, restart your Infisical instance and use the Heroku Connection. ## Setup Heroku OAuth Connection in Infisical Navigate to the **Integrations** tab in the desired project, then select **App Connections**. App Connections Tab Select the **Heroku Connection** option from the connection options modal. Select Heroku Connection Select the **OAuth** method and click **Connect to Heroku**. Connect via Heroku OAuth You will be redirected to Heroku to grant Infisical access to your Heroku account. Once granted, you will be redirected back to Infisical's App Connections page. Heroku Authorization Your **Heroku Connection** is now available for use. Heroku OAuth Connection The Auth Token method uses a Heroku API token for authentication, providing a straightforward setup process. ## Setup Heroku Auth Token Connection in Infisical Log in to your Heroku account and navigate to Account Settings. Under the **Authorizations** section on the **Applications** tab, reveal and copy your Authorization token. If you don't have one, click **Create Authorization** to create a new token. Keep your Authorization token secure and do not share it. Anyone with access to this token can manage your Heroku applications. Heroku API Token Navigate to the **Integrations** tab in the desired project, then select **App Connections**. App Connections Tab Select the **Heroku Connection** option from the connection options modal. Select Heroku Connection Select the **Auth Token** method and paste your Heroku Authorization token in the provided field. Configure Auth Token Click **Connect** to establish the connection. Your **Heroku Connection** is now available for use. Heroku Auth Token Connection Auth Token connections require manual token rotation when your Heroku Authorization expires or is regenerated. Monitor your connection status and update the token as needed. --- # Source: https://infisical.com/docs/documentation/platform/ssh/host-groups.md # Host Groups > Learn how to organize SSH hosts into groups and manage access policies at scale. ## Concept Infisical SSH lets you configure host groups to organize and manage multiple SSH hosts with shared access configuration. These host groups can be created based on environments (`development`, `staging`, `production`), geographical regions (`us-east`, `eu-west`, `ap-northeast`), or functions (`web-servers`, `database-servers`, `worker-nodes`) to streamline access management across your infrastructure. Using a host group, you can define login mappings at the group level and have them be applied to all hosts assigned to that group. For example, you can specify that `john@example.com` can login as `ubuntu` on all hosts assigned to the `production` host group. ## Workflow The typical workflow for using Infisical SSH with host groups consists of the following steps: 1. The administrator creates host groups based on logical groupings (environments, regions, functions, etc.). 2. The administrator configures login mappings at the host group level to define access policies. 3. The administrator registers remote hosts with Infisical using the Infisical CLI via the `infisical ssh add-host` command and assigns them to appropriate host groups either using the `--host-group` flag or by adding them to the host group via UI. 4. User(s) access the remote hosts using the Infisical CLI via the `infisical ssh connect` command, with access determined by the login mappings defined at both host and host group levels. ## Admin Guide for Configuring Host Groups In the following steps, we'll walk through how to create and configure Host Groups in Infisical SSH, and how to add hosts to these groups. 1.1. Navigate to your Infisical SSH project and select the **Hosts** tab. 1.2. Click **Add Group** in the **Host Groups** section to create a new group. Enter a name (e.g., `production-servers` or `tokyo-region`) and login mapping(s) for the host group. A login mapping for a host group applies to all hosts assigned to the group and dictates what user(s) will be allowed access to the remote hosts in that group under specific login user(s); in the allowed principals, you should select user(s) part of the Infisical SSH project that will be allowed to login to the remote host as the login user. For instance, if you add a mapping to a host group with the login user `ec2-user` to some users John and Alice in Infisical, then they will be allowed to login to any remote host that is part of the group as `ec2-user` which is a system user that exists on the remote host(s). ssh group add group ssh group add group 2 1.3. Click **Add** to create the host group. After creating the host group, you can assign a host to it from inside the host group page in the **SSH Hosts** section. Generally, this is where you'll manage the hosts in a group. ssh group add group - add host ssh group add group - added host --- # Source: https://infisical.com/docs/contributing/platform/backend/how-to-create-a-feature.md > ## Documentation Index > Fetch the complete documentation index at: https://infisical.com/docs/llms.txt > Use this file to discover all available pages before exploring further. # Backend development guide Suppose you're interested in implementing a new feature in Infisical's backend, let's call it "feature-x." Here are the general steps you should follow. ## Creating new database model If your feature involves a change in the database, you need to first address this by generating the necessary database schemas. 1. If you're adding a new table, update the `TableName` enum in `/src/db/schemas/models.ts` to include the new table name. 2. Create a new migration file by going to the `/backend` folder and running `npm run migration:new` and give it a relevant name, such as `feature-x`. 3. Navigate to `/src/db/migrations/_.ts`. 4. Modify both the `up` and `down` functions to create or alter Postgres fields on migration up and to revert these changes on migration down, ensuring idempotency as outlined [here](https://github.com/graphile/migrate/blob/main/docs/idempotent-examples.md). ### Generating TS Schemas While typically you would need to manually write TS types for Knex type-sense, we have automated this process: 1. If you haven't done it yet, create a new `.env.migration` file at the root of the Infisical directory then copy the contents of the file linked [here](https://github.com/Infisical/infisical/blob/main/.env.migration.example) 2. Start the server. 3. Go to the `/backend` folder and run `npm run migration:latest-dev` to apply all database changes. 4. Execute `npm run generate:schema` to automatically generate types and schemas using [zod](https://github.com/colinhacks/zod) in the `/src/db/schemas` folder. 5. Update the barrel export in `schema/index` and include the new tables in `/src/@types/knex.d.ts` to enable type-sensing in Knex.js. ## Business Logic Once the database changes are in place, it's time to create the APIs for `feature-x`: 1. Execute `npm run generate:component`. 2. Choose option 1 for the service component. 3. Name the service in dash-case, like `feature-x`. This will create a `feature-x` folder in `/src/services` containing three files. 1. `feature-x-dal`: The Database Access Layer functions. 2. `feature-x-service`: The service layer where all the business logic is handled. 3. `feature-x-type`: The types used by `feature-x`. For reusable shared functions, set up a file named `feature-x-fns`. Use the custom Infisical function `ormify` in `src/lib/knex` for simple database operations within the DAL. ## Connecting the Service Layer to the Server Layer Server-related logic is handled in `/src/server`. To connect the service layer to the server layer, we use Fastify's dependency injection pattern: 1. Add the service type in `/src/@types/fastify.d.ts` under the `services` namespace of the `FastifyInstance` interface. 2. In `/src/server/routes/index.ts`, instantiate the required dependencies for `feature-x` (such as the DAL and service layers), and then add the service instance to the `server.decorate()` call, where all services are registered for dependency injection. 3. This makes the service layer accessible within all routes under the Fastify service instance, accessed via `server.services..`. ## Writing API Routes 1. To create a route component, run `npm run generate:component`. 2. Select option 3, type the router name in dash-case, and provide the version number. This will generate a router file in `src/server/routes/v/` 1. Implement your logic to connect with the service layer as needed. 2. Import the router component in the version folder's index.ts. For instance, if it's in v1, import it in `v1/index.ts`. 3. Finally, register it under the appropriate prefix for access. --- # Source: https://infisical.com/docs/documentation/platform/kms/hsm-integration.md > ## Documentation Index > Fetch the complete documentation index at: https://infisical.com/docs/llms.txt > Use this file to discover all available pages before exploring further. # HSM Integration > Learn more about integrating an HSM with Infisical KMS. Changing the encryption strategy for your instance is an Enterprise-only feature. This section is intended for users who have obtained an Enterprise license and are on-premise. Please reach out to [sales@infisical.com](mailto:sales@infisical.com) if you have any questions. ## Overview Infisical KMS currently supports two encryption strategies: 1. **Standard Encryption**: This is the default encryption strategy used by Infisical KMS. It uses a software-protected encryption key to encrypt KMS keys within your Infisical instance. The root encryption key is defined by setting the `ENCRYPTION_KEY` environment variable. 2. **Hardware Security Module (HSM)**: This encryption strategy uses a Hardware Security Module (HSM) to create a root encryption key that is stored on a physical device to encrypt the KMS keys within your instance. ## Hardware Security Module (HSM) HSM Illustration Using a hardware security module comes with the added benefit of having a secure and tamper-proof device to store your encryption keys. This ensures that your data is protected from unauthorized access. All encryption keys used for cryptographic operations are stored within the HSM. This means that if the HSM is lost or destroyed, you will no longer be able to decrypt your data stored within Infisical. Most providers offer recovery options for HSM devices, which you should consider when setting up an HSM device. Enabling HSM encryption has a set of key benefits: 1. **Root Key Wrapping**: The root KMS encryption key that is used to secure your Infisical instance will be encrypted using the HSM device rather than the standard software-protected key. #### Caveats * **Performance**: Using an HSM device can have a performance impact on your Infisical instance. This is due to the additional latency introduced by the HSM device. This is however only noticeable when your instance(s) start up or when the encryption strategy is changed. * **Key Recovery**: If the HSM device is lost or destroyed, you will no longer be able to decrypt your data stored within Infisical. Most HSM providers offer recovery options, which you should consider when setting up an HSM device. ## Requirements * An HSM device *(PKCS#11 compatible library)* from a compatible provider such as [Thales Luna HSM](https://cpl.thalesgroup.com/encryption/data-protection-on-demand/services/luna-cloud-hsm), [AWS CloudHSM](https://aws.amazon.com/cloudhsm/), [Fortanix HSM](https://www.fortanix.com/platform/data-security-manager), or others. Infisical is validated to work with PKCS#11 2.30 and newer. If your HSM device doesn't follow the >=2.30 PKCS#11 standard you may see degraded performance. ## Environment Variable Configuration To configure your Infisical instance to use an HSM, you must set the required environment variables. Below you'll find an example of the required environment variables. For further instructions on how to configure the HSM device for your Infisical instance, please see the [Setup Instructions](#setup-instructions) section. ```dotenv theme={"dark"} HSM_LIB_PATH=/usr/local/lib/cloudhsm/cloudhsm.so HSM_SLOT=1 HSM_KEY_LABEL=infisical-key HSM_PIN=your:pin ``` * `HSM_LIB_PATH`: The path to the PKCS#11 library provided by the HSM provider. This usually comes in the form of a `.so` for Linux and MacOS, or a `.dll` file for Windows. For Docker, you need to mount the library path as a volume. Further instructions can be found below. If you are using Docker, make sure to set the HSM\_LIB\_PATH environment variable to the path where the library is mounted in the container. * `HSM_PIN`: The PKCS#11 PIN to use for authentication with the HSM device. * `HSM_SLOT`: The slot number to use for the HSM device. This is typically between `0` and `5` for most HSM devices. * `HSM_KEY_LABEL`: The label of the key to use for encryption. **Please note that if no key is found with the provided label, the HSM will create a new key with the provided label.** You can read more about the [default instance configurations](/self-hosting/configuration/envars) here. ## PKCS#11 Key Attributes If no AES key or HMAC key already exists with the label you defined on the `HSM_KEY_LABEL` environment variable, then Infisical will create one for you automatically using the label specified on `HSM_KEY_LABEL`. Below you'll find a list of the attributes each key will be created with. ### AES Key If you bring your own AES key and don't let Infisical create it for you it must have at least the following attributes: * `CKA_CLASS`: `CKO_SECRET_KEY` — Defines the key class *(secret key)*. * `CKA_KEY_TYPE`: `CKO_AES` — Defines the key type *(AES key)*. * `CKA_VALUE_LEN`: `32` — 256-bit key size. * `CKA_ENCRYPT`: `true` — Encryption capabilities enabled. * `CKA_DECRYPT`: `true` — Decryption capabilities enabled. * `CKA_TOKEN`: `true` — The key material will persist in your HSM so it can be reused. Note that for security reasons it is highly recommended to create an AES key with the full set of key attributes seen below if you're going to bring your own key. * `CKA_CLASS`: `CKO_SECRET_KEY` — Defines the key class *(secret key)*. * `CKA_KEY_TYPE`: `CKO_AES` — Defines the key type *(AES key)*. * `CKA_VALUE_LEN`: `32` — 256-bit key size. * `CKA_LABEL`: Your specified label in the `HSM_KEY_LABEL` environment variable. * `CKA_ENCRYPT`: `true` — Encryption capabilities enabled. * `CKA_DECRYPT`: `true` — Decryption capabilities enabled. * `CKA_TOKEN`: `true` — The key material will persist in your HSM so it can be reused. * `CKA_EXTRACTABLE`: `false` — The key material is not extractable from the HSM. * `CKA_SENSITIVE`: `true` — The key material is marked as sensitive. * `CKA_PRIVATE`: `true` — The key material is marked as private to the slot and can't be accessed from other slots. ### HMAC Key If you bring your own HMAC key and don't let Infisical create it for you it must have at least the following attributes: * `CKA_CLASS`: `CKO_SECRET_KEY` — Defines the key class *(secret key)*. * `CKA_KEY_TYPE`: `CKO_GENERIC_SECRET` — Defines the key class *(generic secret key)*. * `CKA_VALUE_LEN`: `32` — 256-bit key size * `CKA_SIGN`: `true` — Signing capabilities enabled * `CKA_VERIFY`: `true` — Verifying capabilities enabled. * `CKA_TOKEN`: `true` — The key material will persist in your HSM so it can be reused. Note that for security reasons it is highly recommended to create an HMAC key with the full set of key attributes seen below if you're going to bring your own key. * `CKA_CLASS`: `CKO_SECRET_KEY` — Defines the key class *(secret key)*. * `CKA_KEY_TYPE`: `CKO_GENERIC_SECRET` — Defines the key class *(generic secret key)*. * `CKA_VALUE_LEN`: `32` — 256-bit key size. * `CKA_LABEL`: Your specified label in the `HSM_KEY_LABEL` environment variable, suffixed with `_HMAC`. If you specify `infisical-key-v1`, then the HMAC key label will become `infisical-key-v1_HMAC`. * `CKA_SIGN`: `true` — Signing capabilities enabled * `CKA_VERIFY`: `true` — Verifying capabilities enabled. * `CKA_TOKEN`: `true` — The key material will persist in your HSM so it can be reused. * `CKA_EXTRACTABLE`: `false` — The key material is not extractable from the HSM. * `CKA_SENSITIVE`: `true` — The key material is marked as sensitive. * `CKA_PRIVATE`: `true` — The key material is marked as private to the slot and can't be accessed from other slots. ## Setup Instructions To set up HSM encryption, you need to configure an HSM provider and HSM key. The HSM provider is used to connect to the HSM device, and the HSM key is used to encrypt Infisical's KMS keys. We recommend using a Cloud HSM provider such as [Thales Luna HSM](https://cpl.thalesgroup.com/encryption/data-protection-on-demand/services/luna-cloud-hsm), [AWS CloudHSM](https://aws.amazon.com/cloudhsm/), or [Fortanix HSM](https://www.fortanix.com/platform/data-security-manager). You need to follow the instructions provided by the HSM provider to set up the HSM device. Once the HSM device is set up, the HSM device can be used within Infisical. After setting up the HSM from your provider, you will have a set of files that you can use to access the HSM. These files need to be present on the machine where Infisical is running. If you are using containers, you will need to mount the folder where these files are stored as a volume in the container. The setup process for an HSM device varies depending on the provider. We have created guides for Thales Luna Cloud HSM and Fortanix HSM, which you can find below. Are you using Docker or Kubernetes for your deployment? If you are using Docker or Kubernetes, please follow the instructions in the [Using HSM's in your Deployment](#using-hsms-in-your-deployment) section. Configuring the HSM on Infisical requires setting a set of environment variables: * `HSM_LIB_PATH`: The path to the PKCS#11 library provided by the HSM provider. This usually comes in the form of a `.so` for Linux and MacOS, or a `.dll` file for Windows. For Docker, you need to mount the library path as a volume. Further instructions can be found below. If you are using Docker, make sure to set the HSM\_LIB\_PATH environment variable to the path where the library is mounted in the container. * `HSM_PIN`: The PKCS#11 PIN to use for authentication with the HSM device. * `HSM_SLOT`: The slot number to use for the HSM device. This is typically between `0` and `5` for most HSM devices. * `HSM_KEY_LABEL`: The label of the key to use for encryption. **Please note that if no key is found with the provided label, the HSM will create a new key with the provided label.** You can read more about the [default instance configurations](/self-hosting/configuration/envars) here. After setting up the HSM, you need to restart the Infisical instance for the changes to take effect. Server Admin Console Set Encryption Strategy Once you press the 'Save' button, your Infisical instance will immediately switch to the HSM encryption strategy. This will re-encrypt your KMS key with keys from the HSM device. To verify that the HSM was correctly configured, you can try creating a new secret in one of your projects. If the secret is created successfully, the HSM is now being used for encryption. ## Using HSMs In Your Deployment When using Docker, you need to mount the path containing the HSM client files. This section covers how to configure your Infisical instance to use an HSM with Docker. When using Docker, you are able to set your HSM library path to any location on your machine. In this example, we are going to be using `/etc/luna-docker`. ```bash theme={"dark"} mkdir /etc/luna-docker ``` After [setting up your Luna Cloud HSM client](https://thalesdocs.com/gphsm/luna/7/docs/network/Content/install/client_install/add_dpod.htm), you should have a set of files, referred to as the HSM client. You don't need all the files, but for simplicity we recommend copying all the files from the client. A folder structure of a client folder will often look like this: ``` partition-ca-certificate.pem partition-certificate.pem server-certificate.pem Chrystoki.conf /plugins libcloud.plugin /lock /libs /64 libCryptoki2.so /jsp LunaProvider.jar /64 libLunaAPI.so /etc openssl.cnf /bin /64 ckdemo lunacm multitoken vtl ``` The most important parts of the client folder is the `Chrystoki.conf` file, and the `libs`, `plugins`, and `jsp` folders. You need to copy these files to the folder you created in the first step. ```bash theme={"dark"} cp -r / /etc/luna-docker ``` The `Chrystoki.conf` file is used to configure the HSM client. You need to update the `Chrystoki.conf` file to point to the correct file paths. In this example, we will be mounting the `/etc/luna-docker` folder to the Docker container under a different path. The path we will use in this example is `/usr/safenet/lunaclient`. This means `/etc/luna-docker` will be mounted to `/usr/safenet/lunaclient` in the Docker container. An example config file will look like this: ```Chrystoki.conf theme={"dark"} Chrystoki2 = { # This path points to the mounted path, /usr/safenet/lunaclient LibUNIX64 = /usr/safenet/lunaclient/libs/64/libCryptoki2.so; } Luna = { DefaultTimeOut = 500000; PEDTimeout1 = 100000; PEDTimeout2 = 200000; PEDTimeout3 = 20000; KeypairGenTimeOut = 2700000; CloningCommandTimeOut = 300000; CommandTimeOutPedSet = 720000; } CardReader = { LunaG5Slots = 0; RemoteCommand = 1; } Misc = { # Update the paths to point to the mounted path if your folder structure is different from the one mentioned in the previous step. PluginModuleDir = /usr/safenet/lunaclient/plugins; MutexFolder = /usr/safenet/lunaclient/lock; PE1746Enabled = 1; ToolsDir = /usr/bin; } Presentation = { ShowEmptySlots = no; } LunaSA Client = { ReceiveTimeout = 20000; # Update the paths to point to the mounted path if your folder structure is different from the one mentioned in the previous step. SSLConfigFile = /usr/safenet/lunaclient/etc/openssl.cnf; ClientPrivKeyFile = ./etc/ClientNameKey.pem; ClientCertFile = ./etc/ClientNameCert.pem; ServerCAFile = ./etc/CAFile.pem; NetClient = 1; TCPKeepAlive = 1; } REST = { AppLogLevel = error ServerName = ; ServerPort = 443; AuthTokenConfigURI = ; AuthTokenClientId = ; AuthTokenClientSecret = ; RestClient = 1; ClientTimeoutSec = 120; ClientPoolSize = 32; ClientEofRetryCount = 15; ClientConnectRetryCount = 900; ClientConnectIntervalMs = 1000; } XTC = { Enabled = 1; TimeoutSec = 600; } ``` Save the file after updating the paths. Running Docker with HSM encryption requires setting the HSM-related environment variables as mentioned previously in the [HSM setup instructions](#setup-instructions). You can set these environment variables in your Docker run command. We are setting the environment variables for Docker via the command line in this example, but you can also pass in a `.env` file to set these environment variables. If no key is found with the provided key label, the HSM will create a new key with the provided label. Infisical depends on an AES and HMAC key to be present in the HSM. If these keys are not present, Infisical will create them. The AES key label will be the value of the `HSM_KEY_LABEL` environment variable, and the HMAC key label will be the value of the `HSM_KEY_LABEL` environment variable with the suffix `_HMAC`. ```bash theme={"dark"} docker run -p 80:8080 \ -v /etc/luna-docker:/usr/safenet/lunaclient \ -e HSM_LIB_PATH="/usr/safenet/lunaclient/libs/64/libCryptoki2.so" \ -e HSM_PIN="" \ -e HSM_SLOT= \ -e HSM_KEY_LABEL="" \ # The rest are unrelated to HSM setup... -e ENCRYPTION_KEY="<>" \ -e AUTH_SECRET="<>" \ -e DB_CONNECTION_URI="<>" \ -e REDIS_URL="<>" \ -e SITE_URL="<>" \ infisical/infisical: # Replace with the version you want to use ``` We recommend reading further about [using Infisical with Docker](/self-hosting/deployment-options/standalone-infisical). After following these steps, your Docker setup will be ready to use HSM encryption. To use Fortanix HSM with Infisical, you need to: 1. Create an App in Fortanix: * Set Interface value to be PKCS#11 * Select API key as authentication method * Assign app to a group Fortanix HSM Setup 2. Take note of the domain (e.g., apac.smartkey.io). You will need this to set up the configuration file for the Fortanix client. The easiest approach would be to download the `.so` file for Linux directly from the [Fortanix PKCS#11 installation page](https://fortanix.zendesk.com/hc/en-us/sections/4408769080724-PKCS-11). Create a configuration file named `pkcs11.conf` with the following content: ``` api_endpoint = "https://apac.smartkey.io" prevent_duplicate_opaque_objects = true retry_timeout_millis = 60000 ``` Note: Replace `apac.smartkey.io` with your actual Fortanix domain if different. For more details about the configuration file format and additional options, refer to the [Fortanix PKCS#11 Configuration File Documentation](https://support.fortanix.com/docs/clients-pkcs11-library#511-configuration-file-format). Create a directory to store the Fortanix library and configuration file: ```bash theme={"dark"} mkdir -p /etc/fortanix-hsm ``` Copy the downloaded `.so` file and the `pkcs11.conf` file to this directory: ```bash theme={"dark"} cp /path/to/fortanix_pkcs11_4.37.2554.so /etc/fortanix-hsm/ cp /path/to/pkcs11.conf /etc/fortanix-hsm/ ``` Run Docker with Fortanix HSM by mounting the directory and setting the required environment variables: ```bash theme={"dark"} docker run -p 80:8080 \ -v /etc/fortanix-hsm:/etc/fortanix-hsm \ -e HSM_LIB_PATH="/etc/fortanix-hsm/fortanix_pkcs11_4.37.2554.so" \ # Path to the PKCS#11 library -e HSM_PIN="MDE3YWUxO..." \ # Your Fortanix app API key used for authentication -e HSM_SLOT=0 \ # Slot value (arbitrary for Fortanix HSM) -e HSM_KEY_LABEL="hsm-key-label" \ # Label to identify the encryption key in the HSM -e FORTANIX_PKCS11_CONFIG_PATH="/etc/fortanix-hsm/pkcs11.conf" \ # Path to Fortanix configuration file # The rest are unrelated to HSM setup... -e ENCRYPTION_KEY="<>" \ -e AUTH_SECRET="<>" \ -e DB_CONNECTION_URI="<>" \ -e REDIS_URL="<>" \ -e SITE_URL="<>" \ infisical/infisical: # Replace with the version you want to use ``` Note: Fortanix HSM integration only works for AMD64 CPU architectures. After following these steps, your Docker setup will be ready to use Fortanix HSM encryption. ### Prerequisites * An [activated AWS CloudHSM cluster](https://docs.aws.amazon.com/cloudhsm/latest/userguide/activate-cluster.html) with at least 1 HSM device. * A [HSM user with the `Crypto User` role](https://docs.aws.amazon.com/cloudhsm/latest/userguide/cloudhsm_cli-user-create.html). In this guide we are using a user with the username `testUser` and the password `testPassword`. Before using the CloudHSM client, it must be configured properly so Infisical can use it for cryptographic operations. **1. Download the AWS CloudHSM client** You can download the AWS CloudHSM client from [the AWS documentation](https://docs.aws.amazon.com/cloudhsm/latest/userguide/pkcs11-library-install.html). Note that the AWS CloudHSM client is only available for Linux and Windows. If you're on a different operating system, you'll need to access a Linux machine to configure the client, such as an AWS EC2 Debian instance. **2. Configure the CloudHSM client** After installing the CloudHSM client, you should see all related files in the `/opt/cloudhsm/` directory on your machine. You need to run the `configure-pkcs11` binary which will configure the client to connect with your AWS CloudHSM cluster. Depending on if you have multiple HSM's inside your cluster, you'll need to run the command with different arguments. Below you'll find the appropriate command for your use case: ```bash theme={"dark"} sudo /opt/cloudhsm/bin/configure-pkcs11 -a --disable-key-availability-check ``` To use a single HSM, you must first manage client key durability settings by setting `disable_key_availability_check` to true by passing the `--disable-key-availability-check` flag. For more information read the [Key Synchronization](https://docs.aws.amazon.com/cloudhsm/latest/userguide/manage-key-sync.html) section in the AWS CloudHSM documentation. ```bash theme={"dark"} sudo /opt/cloudhsm/bin/configure-pkcs11 -a ... --disable-key-availability-check ``` At this point you should have: 1. [Activated the CloudHSM cluster](https://docs.aws.amazon.com/cloudhsm/latest/userguide/activate-cluster.html) 2. [Created a Crypto User HSM user](https://docs.aws.amazon.com/cloudhsm/latest/userguide/cloudhsm_cli-user-create.html) 3. Downloaded and configured the CloudHSM client as described in the previous steps. **3. Download the configured HSM client files** After configuring the CloudHSM client, you should notice that the PKCS11 configuration file has been updated to include the HSM's ENI IP address. You can find this file in the `/opt/cloudhsm/etc/cloudhsm-pkcs11.cfg` directory, and it should look like this: ```json cloudhsm-pkcs11.cfg theme={"dark"} { "clusters": [ { "type": "hsm1", "cluster": { // Your issuing CA certificate. // As per AWS documentation, this defaults to `/opt/cloudhsm/etc/customerCA.crt`. "hsm_ca_file": "/opt/cloudhsm/etc/customerCA.crt", "servers": [ { "hostname": "", "port": 2223, "enable": true }, { "hostname": "", "port": 2223, "enable": true } ], // Only relevant if you passed the --disable-key-availability-check flag "options": { "disable_key_availability_check": true } } } ], "logging": { "log_type": "file", "log_file": "/opt/cloudhsm/run/cloudhsm-pkcs11.log", "log_level": "info", "log_interval": "daily" } } ``` Save the entire `/opt/cloudhsm` folder, as you will need to mount this to your Infisical Docker container in the later steps. In this guide we will be saving all the files from the folder as `/etc/cloudhsm` and mounting it to the `/etc/cloudhsm` directory in the Docker container. On the same machine that you configured the CloudHSM client, you can use `pkcs11-tool` to find the HSM slot number and to verify that the client is working correctly. First, install the `pkcs11-tool` package: ```bash theme={"dark"} sudo apt-get install opensc -y ``` Then, run the following command to find the HSM slot number: ```bash theme={"dark"} pkcs11-tool --module /opt/cloudhsm/lib/libcloudhsm_pkcs11.so --list-slots --login ``` It'll prompt you to log in with your PIN, which is your username and password separated by a colon. Example: `testUser:testPassword`. This will output the HSM slot number like so: ```bash theme={"dark"} ubuntu@ec-2:~$ pkcs11-tool --module /opt/cloudhsm/lib/libcloudhsm_pkcs11.so --list-slots Available slots: Slot 0 (0x2000000000000001): hsm1 token label : hsm1 token manufacturer : Marvell Semiconductors, Inc. token model : LS2 token flags : login required, rng, token initialized hardware version : 66.48 firmware version : 10.2 serial num : pin min/max : 8/32 ``` In this case we see that the HSM has a slot in the position of `0`. This slot number will be used in the later steps to set the `HSM_SLOT` environment variable. When you initialized your HSM, you were prompted to download the cluster CSR and sign it. In order to use the HSM with Infisical, you need to obtain the issuer CA certificate that was used to sign the cluster CSR. If you followed [the official AWS documentation](https://docs.aws.amazon.com/cloudhsm/latest/userguide/initialize-cluster.html), you should have a CA certificate called `customerCA.crt`. Save the CA certificate to a path, as this will need to be mounted as a Docker volume in the next step. For this example, we'll save it to `/aws-files/customerCA.crt`. Running Docker with HSM encryption requires setting the HSM-related environment variables as mentioned previously in the [HSM setup instructions](#setup-instructions). You can set these environment variables in your Docker run command. We are setting the environment variables for Docker via the command line in this example, but you can also pass in a `.env` file to set these environment variables. If no key is found with the provided key label, the HSM will create a new key with the provided label. Infisical depends on an AES and HMAC key to be present in the HSM. If these keys are not present, Infisical will create them. The AES key label will be the value of the `HSM_KEY_LABEL` environment variable, and the HMAC key label will be the value of the `HSM_KEY_LABEL` environment variable with the suffix `_HMAC`. ```bash theme={"dark"} docker run -p 80:8080 \ # Mount the HSM client files to "/opt/cloudhsm" -v /etc/cloudhsm:/opt/cloudhsm \ # Mount the issuer CA certificate to "/opt/cloudhsm/etc/customerCA.crt" -v /aws-files/customerCA.crt:/opt/cloudhsm/etc/customerCA.crt \ # Set the HSM library path to whats expected within Docker (/opt/cloudhsm/lib/libcloudhsm_pkcs11.so) -e HSM_LIB_PATH="/opt/cloudhsm/lib/libcloudhsm_pkcs11.so" \ # Set the HSM PIN to the username and password of the HSM user, separated by a colon -e HSM_PIN=CryptoUserUsername:CryptoUserPassword \ # Set the HSM slot number to the slot number of the HSM device as found in the previous step -e HSM_SLOT= \ # Set the HSM key label to a label that will be used to identify the encryption key in the HSM. This key label does not need to exist before hand. -e HSM_KEY_LABEL=infisical-crypto-key \ # The rest of your environment variables ... # -e ... infisical/infisical: # Replace with the version you want to use ``` We recommend reading further about [using Infisical with Docker](/self-hosting/deployment-options/standalone-infisical). After following these steps, your Docker setup will be ready to use HSM encryption. When you are deploying Infisical with the [Kubernetes self-hosting option](/self-hosting/deployment-options/kubernetes-helm), you can still use HSM encryption, but you need to ensure that the HSM client files are present in the container. This is only supported on helm chart version `1.7.1` and above. Please see the [Helm Chart Changelog](https://github.com/Infisical/infisical/blob/main/helm-charts/infisical-standalone-postgres/CHANGELOG.md#141-march-19-2025) for more information. When using Kubernetes, you need to mount the path containing the HSM client files. This section covers how to configure your Infisical instance to use an HSM with Kubernetes. In this example, we are going to be using `/etc/luna-docker`. ```bash theme={"dark"} mkdir /etc/luna-docker ``` After [setting up your Luna Cloud HSM client](https://thalesdocs.com/gphsm/luna/7/docs/network/Content/install/client_install/add_dpod.htm), you should have a set of files, referred to as the HSM client. You don't need all the files, but for simplicity we recommend copying all the files from the client. A folder structure of a client folder will often look like this: ``` partition-ca-certificate.pem partition-certificate.pem server-certificate.pem Chrystoki.conf /plugins libcloud.plugin /lock /libs /64 libCryptoki2.so /jsp LunaProvider.jar /64 libLunaAPI.so /etc openssl.cnf /bin /64 ckdemo lunacm multitoken vtl ``` The most important parts of the client folder is the `Chrystoki.conf` file, and the `libs`, `plugins`, and `jsp` folders. You need to copy these files to the folder you created in the first step. ```bash theme={"dark"} cp -r //* /etc/luna-docker ``` The `/*` wildcard will copy all files and folders within the HSM client. The wildcard is important to ensure that the file structure is inline with the rest of this guide. After copying the files, the `/etc/luna-docker` directory should have the following file structure: ```bash theme={"dark"} $ ls -R /etc/luna-docker Chrystoki.conf etc lock server-certificate.pem Chrystoki.conf.tmp2E jsp partition-ca-certificate.pem setenv lch-support-linux-64bit partition-certificate.pem bin libs plugins /etc/luna-docker/bin: 64 /etc/luna-docker/bin/64: ckdemo cmu lunacm multitoken vtl /etc/luna-docker/etc: openssl.cnf /etc/luna-docker/jsp: 64 LunaProvider.jar /etc/luna-docker/jsp/64: libLunaAPI.so /etc/luna-docker/libs: 64 /etc/luna-docker/libs/64: libCryptoki2.so /etc/luna-docker/lock: /etc/luna-docker/plugins: libcloud.plugin ``` The `Chrystoki.conf` file is used to configure the HSM client. You need to update the `Chrystoki.conf` file to point to the correct file paths. In this example, we will be mounting the `/etc/luna-docker` folder from the host to containers in our deployment's pods at the path `/usr/safenet/lunaclient`. This means the contents of `/etc/luna-docker` on the host will be accessible at `/usr/safenet/lunaclient` within the containers. An example config file will look like this: ```Chrystoki.conf theme={"dark"} Chrystoki2 = { # This path points to the mounted path, /usr/safenet/lunaclient LibUNIX64 = /usr/safenet/lunaclient/libs/64/libCryptoki2.so; } Luna = { DefaultTimeOut = 500000; PEDTimeout1 = 100000; PEDTimeout2 = 200000; PEDTimeout3 = 20000; KeypairGenTimeOut = 2700000; CloningCommandTimeOut = 300000; CommandTimeOutPedSet = 720000; } CardReader = { LunaG5Slots = 0; RemoteCommand = 1; } Misc = { # Update the paths to point to the mounted path if your folder structure is different from the one mentioned in the previous step. PluginModuleDir = /usr/safenet/lunaclient/plugins; MutexFolder = /usr/safenet/lunaclient/lock; PE1746Enabled = 1; ToolsDir = /usr/bin; } Presentation = { ShowEmptySlots = no; } LunaSA Client = { ReceiveTimeout = 20000; # Update the paths to point to the mounted path if your folder structure is different from the one mentioned in the previous step. SSLConfigFile = /usr/safenet/lunaclient/etc/openssl.cnf; ClientPrivKeyFile = ./etc/ClientNameKey.pem; ClientCertFile = ./etc/ClientNameCert.pem; ServerCAFile = ./etc/CAFile.pem; NetClient = 1; TCPKeepAlive = 1; } REST = { AppLogLevel = error ServerName = ; ServerPort = 443; AuthTokenConfigURI = ; AuthTokenClientId = ; AuthTokenClientSecret = ; RestClient = 1; ClientTimeoutSec = 120; ClientPoolSize = 32; ClientEofRetryCount = 15; ClientConnectRetryCount = 900; ClientConnectIntervalMs = 1000; } XTC = { Enabled = 1; TimeoutSec = 600; } ``` Save the file after updating the paths. You need to create a Persistent Volume Claim (PVC) to mount the HSM client files to the Infisical deployment. ```bash theme={"dark"} kubectl apply -f - < Next we need to update the environment variables used for the deployment. If you followed the [setup instructions for Kubernetes deployments](/self-hosting/deployment-options/kubernetes-helm), you should have a Kubernetes secret called `infisical-secrets`. We need to update the secret with the following environment variables: * `HSM_LIB_PATH` - The path to the HSM client library *(mapped to `/usr/safenet/lunaclient/libs/64/libCryptoki2.so`)* * `HSM_PIN` - The PIN for the HSM device that you created when setting up your Luna Cloud HSM client * `HSM_SLOT` - The slot number for the HSM device that you selected when setting up your Luna Cloud HSM client * `HSM_KEY_LABEL` - The label for the HSM key. If no key is found with the provided key label, the HSM will create a new key with the provided label. The following is an example of the secret that you should update: ```yaml theme={"dark"} apiVersion: v1 kind: Secret metadata: name: infisical-secrets type: Opaque stringData: # ... Other environment variables ... HSM_LIB_PATH: "/usr/safenet/lunaclient/libs/64/libCryptoki2.so" # If you followed this guide, this will be the path of the Luna Cloud HSM client HSM_PIN: "" HSM_SLOT: "" HSM_KEY_LABEL: "" ``` Save the file after updating the environment variables, and apply the secret changes ```bash theme={"dark"} kubectl apply -f ./secret-file-name.yaml ``` After we've successfully configured the PVC and updated our environment variables, we are ready to update the deployment configuration so that the pods it creates can access the HSM client files. ```yaml theme={"dark"} # ... The rest of the values.yaml file ... image: repository: infisical/infisical tag: "v0.117.1-postgres" pullPolicy: IfNotPresent extraVolumeMounts: - name: hsm-data mountPath: /usr/safenet/lunaclient # The path we will mount the HSM client files to extraVolumes: - name: hsm-data persistentVolumeClaim: claimName: infisical-data-pvc # The PVC we created in the previous step # ... The rest of the values.yaml file ... ``` After updating the values.yaml file, you need to upgrade the Helm chart in order for the changes to take effect. ```bash theme={"dark"} helm upgrade --install infisical infisical-helm-charts/infisical-standalone --values /path/to/values.yaml ``` After upgrading the Helm chart, you need to restart the deployment in order for the changes to take effect. ```bash theme={"dark"} kubectl rollout restart deployment/infisical-infisical ``` After following these steps, your Kubernetes setup will be ready to use HSM encryption. First, you need to set up Fortanix HSM by: 1. Creating an App in Fortanix: * Set Interface value to be PKCS#11 * Select API key as authentication method * Assign app to a group Fortanix HSM Setup 2. Take note of the domain (e.g., apac.smartkey.io). You will need this when setting up the configuration file. Create a directory to store the Fortanix configuration files: ```bash theme={"dark"} mkdir -p /etc/fortanix-hsm ``` Download the Fortanix PKCS#11 library for Linux from the [Fortanix PKCS#11 installation page](https://fortanix.zendesk.com/hc/en-us/sections/4408769080724-PKCS-11). Create a configuration file named `pkcs11.conf` with the following content: ``` api_endpoint = "https://apac.smartkey.io" prevent_duplicate_opaque_objects = true retry_timeout_millis = 60000 ``` Note: Replace `apac.smartkey.io` with your actual Fortanix domain if different. Create a Persistent Volume Claim to store the Fortanix files: ```bash theme={"dark"} kubectl apply -f - < Update your Kubernetes secret with the Fortanix HSM environment variables: ```yaml theme={"dark"} apiVersion: v1 kind: Secret metadata: name: infisical-secrets type: Opaque stringData: # ... Other environment variables ... HSM_LIB_PATH: "/etc/fortanix-hsm/fortanix_pkcs11_4.37.2554.so" # Path to the PKCS#11 library in the container HSM_PIN: "" # Your Fortanix app API key used for authentication HSM_SLOT: "0" # Slot value (can be set to 0 for Fortanix HSM as it's arbitrary) HSM_KEY_LABEL: "hsm-key-label" # Label to identify the encryption key in the HSM FORTANIX_PKCS11_CONFIG_PATH: "/etc/fortanix-hsm/pkcs11.conf" # Path to Fortanix configuration file ``` Apply the updated secret: ```bash theme={"dark"} kubectl apply -f ./secret-file-name.yaml ``` Update your Helm values to mount the Fortanix HSM files: ```yaml theme={"dark"} # ... The rest of the values.yaml file ... image: repository: infisical/infisical tag: "v0.117.1-postgres" pullPolicy: IfNotPresent extraVolumeMounts: - name: fortanix-data mountPath: /etc/fortanix-hsm # The path where Fortanix files will be available extraVolumes: - name: fortanix-data persistentVolumeClaim: claimName: fortanix-hsm-pvc # ... The rest of the values.yaml file ... ``` Note: Fortanix HSM integration only works for AMD64 CPU architectures. Upgrade the Helm chart with the new values: ```bash theme={"dark"} helm upgrade --install infisical infisical-helm-charts/infisical-standalone --values /path/to/values.yaml ``` Restart the deployment: ```bash theme={"dark"} kubectl rollout restart deployment/infisical-infisical ``` After following these steps, your Kubernetes setup will be ready to use Fortanix HSM encryption. ### Prerequisites * An [activated AWS CloudHSM cluster](https://docs.aws.amazon.com/cloudhsm/latest/userguide/activate-cluster.html) with at least 1 HSM device. * A [HSM user with the `Crypto User` role](https://docs.aws.amazon.com/cloudhsm/latest/userguide/cloudhsm_cli-user-create.html). In this guide we are using a user with the username `testUser` and the password `testPassword`. * A Kubernetes cluster AWS CloudHSM is supported on helm chart version `1.7.1` and above. Please see the [Helm Chart Changelog](https://github.com/Infisical/infisical/blob/main/helm-charts/infisical-standalone-postgres/CHANGELOG.md#141-march-19-2025) for more information. If you're using AWS EKS, you need to specify a storage class for the PVC and ensure that the EBS CSI Driver is installed and running. By default, EKS exposes `gp2` as the default storage class. Below are the steps required for setting the default storage class and ensuring the EBS CSI Driver is installed and running: Enable OIDC authentication for the EKS cluster: ```bash theme={"dark"} eksctl utils associate-iam-oidc-provider \ --region \ --cluster \ --approve ``` * Replace `` with your AWS region. * Replace `` with your cluster name. 1. Check if EBS CSI Driver is installed and running by running the following command: ```bash theme={"dark"} kubectl get pods -n kube-system | grep ebs-csi ``` If you see no pods, you need to install the EBS CSI Driver as seen in the next step. Create a new IAM service account for the EBS CSI Driver: ```bash theme={"dark"} eksctl create iamserviceaccount \ --name ebs-csi-controller-sa \ --namespace kube-system \ --region \ --cluster \ --attach-policy-arn arn:aws:iam::aws:policy/service-role/AmazonEBSCSIDriverPolicy \ --approve \ --role-name AmazonEKS_EBS_CSI_DriverRole ``` * Replace `` with your cluster name. * Replace `` with your AWS region. Install the EBS CSI Driver: ```bash theme={"dark"} eksctl create addon \ --name aws-ebs-csi-driver \ --cluster \ --region \ --service-account-role-arn arn:aws:iam:::role/AmazonEKS_EBS_CSI_DriverRole \ --force ``` * Replace `` with your cluster name. * Replace `` with your AWS region. * Replace `` with your actual account ID. Can be obtained by running `aws sts get-caller-identity --query Account --output text`. Verify the EBS CSI Driver is installed and running by running the following command: ```bash theme={"dark"} kubectl get pods -n kube-system | grep ebs-csi ``` You should see an output like this: ```bash theme={"dark"} kubectl get pods -n kube-system | grep ebs-csi ebs-csi-controller-6b6bbf996-rvf8r 6/6 Running 0 21s ebs-csi-controller-6b6bbf996-vk4ng 6/6 Running 0 21s ebs-csi-node-c6vbb 3/3 Running 0 21s ebs-csi-node-s9zlr 3/3 Running 0 21s ``` You can find the enabled storage class by running the following command: ```bash theme={"dark"} kubectl get storageclass ``` You should see an output like this: ```bash theme={"dark"} $ kubectl get storageclass NAME PROVISIONER RECLAIMPOLICY VOLUMEBINDINGMODE ALLOWVOLUMEEXPANSION AGE gp2 kubernetes.io/aws-ebs Delete WaitForFirstConsumer false 65m ``` In this case, the enabled storage class is `gp2`. You can set the default PVC storage class by patching the storage class with the following command: ```bash theme={"dark"} kubectl patch storageclass gp2 -p '{"metadata": {"annotations":{"storageclass.kubernetes.io/is-default-class":"true"}}}' ``` This will set the `gp2` storage class as the default storage class. Now when you run `kubectl get storageclass`, you should see that `gp2` is the default storage class. ```bash theme={"dark"} $ kubectl get storageclass NAME PROVISIONER RECLAIMPOLICY VOLUMEBINDINGMODE ALLOWVOLUMEEXPANSION AGE gp2 (default) kubernetes.io/aws-ebs Delete WaitForFirstConsumer false 68m ``` Notice the `(default)` next to the `gp2` storage class. You need to create a Persistent Volume Claim (PVC) to mount the HSM client files to the Infisical deployment. ```bash theme={"dark"} kubectl apply -f - < We need to configure the PVC to work with the CloudHSM, so Infisical can consume the HSM client files. **2.1. Start a shell in the PVC pod:** This will allow us to run commands directly within the setup pod. We'll use this to configure the CloudHSM client and to validate that it's working correctly. ```bash theme={"dark"} kubectl exec -it cloudhsm-setup-pod -- /bin/sh ``` **2.2. Install the necessary packages:** This will install the necessary packages to allow us to test and install the CloudHSM client. ```bash theme={"dark"} apt-get update -y apt-get install opensc telnet wget -y ``` **2.3. Try to reach the HSM device:** We need to validate that we're able to reach the HSM device from within Kubernetes. You can use telnet to ping the HSM device like so: ```bash theme={"dark"} telnet 2223 ``` You should see an output like this: ```bash theme={"dark"} $ telnet 2223 Trying ... Connected to . ``` If it gets stuck on `Trying ....`, you may have configured your HSM client's security group incorrectly. Make sure you configure the security group to allow traffic from EKS on port 2223-2225. **2.4. Install the AWS CloudHSM client:** The Infisical images run on Debian, so we need to install a Debian-compatible version of the AWS CloudHSM client. ```bash theme={"dark"} wget https://s3.amazonaws.com/cloudhsmv2-software/CloudHsmClient/Jammy/cloudhsm-pkcs11_latest_u22.04_amd64.deb apt-get install ./cloudhsm-pkcs11_latest_u22.04_amd64.deb -y ``` **2.5. Configure the CloudHSM client:** After installing the CloudHSM client, you should see all related files in the `/opt/cloudhsm/` directory on the CloudHSM setup pod. You need to run the `configure-pkcs11` binary which will configure the client to connect with your AWS CloudHSM cluster. Depending on if you have multiple HSM's inside your cluster, you'll need to run the command with different arguments. Below you'll find the appropriate command for your use case: ```bash theme={"dark"} /opt/cloudhsm/bin/configure-pkcs11 -a --disable-key-availability-check ``` To use a single HSM, you must first manage client key durability settings by setting `disable_key_availability_check` to true by passing the `--disable-key-availability-check` flag. For more information read the [Key Synchronization](https://docs.aws.amazon.com/cloudhsm/latest/userguide/manage-key-sync.html) section in the AWS CloudHSM documentation. ```bash theme={"dark"} /opt/cloudhsm/bin/configure-pkcs11 -a ... --disable-key-availability-check ``` **2.6. Verify the CloudHSM client is configured correctly:** You can verify the CloudHSM client is configured correctly by running the following command: ```bash theme={"dark"} cat /opt/cloudhsm/etc/cloudhsm-pkcs11.cfg ``` You should see an output like this: ```json theme={"dark"} { "clusters": [ { "type": "hsm1", "cluster": { "hsm_ca_file": "/opt/cloudhsm/etc/customerCA.crt", "servers": [ { "hostname": "172.31.39.155", "port": 2223, "enable": true } ], "options": { "disable_key_availability_check": true } } } ], "logging": { "log_type": "file", "log_file": "/opt/cloudhsm/run/cloudhsm-pkcs11.log", "log_level": "info", "log_interval": "daily" } } ``` **2.7. Exit the pod:** Exit the pod by running the following command: ```bash theme={"dark"} exit ``` **2.8. Copy your issuer CA certificate to the PVC:** When you initialized your HSM, you were prompted to download the cluster CSR and sign it. In order to use the HSM with Infisical, you need to obtain the issuer CA certificate that was used to sign the cluster CSR. If you followed [the official AWS documentation](https://docs.aws.amazon.com/cloudhsm/latest/userguide/initialize-cluster.html), you should have a CA certificate called `customerCA.crt`. Copy the CA certificate from your local machine to the setup pod: ```bash theme={"dark"} kubectl cp /path/to/customerCA.crt cloudhsm-setup-pod:/opt/cloudhsm/etc/customerCA.crt ``` Ensure that the file is at `/opt/cloudhsm/etc/customerCA.crt` inside the setup pod by running the following command: ```bash theme={"dark"} kubectl exec -it cloudhsm-setup-pod -- cat /opt/cloudhsm/etc/customerCA.crt ``` **2.9. Test the HSM client:** Finally, after we're done configuring the HSM client, we need to test it to ensure that it's working correctly. First, start a new shell into the setup pod by running the same shell command as before: ```bash theme={"dark"} kubectl exec -it cloudhsm-setup-pod -- /bin/sh ``` Next, try generating a random 32 bytes long string by running the following command: ```bash theme={"dark"} pkcs11-tool --module /opt/cloudhsm/lib/libcloudhsm_pkcs11.so \ --login --pin : \ --generate-random 32 | base64 ``` You should see an output like this: ```bash theme={"dark"} Using slot 0 with a present token (0x2000000000000001) av1dlhVEsssjpcTNS+ysGUoKWH6+/PCaEDIdal5oQc0= ``` Replace the `:` with your username and password combination of the Crypto user you have created that you want to use to perform cryptographic operations. In AWS CloudHSM, the PIN is always the username and password separated by a colon. **2.10. Copy the configured client to the PVC:** Copy from the HSM files into the `/data` directory in the PVC, which is what will be mounted for the Infisical deployment. ```bash theme={"dark"} cp -r /opt/cloudhsm/. /data/ ``` Verify the files were copied correctly by running the following command: ```bash theme={"dark"} ls -la /data/ ``` You should see an output like this: ```bash theme={"dark"} drwxr-xr-x. 8 root root 4096 Oct 13 18:50 . drwxr-xr-x. 1 root root 131 Oct 13 18:29 .. drwxr-xr-x. 2 root root 4096 Oct 13 18:50 bin drwxr-xr-x. 3 root root 4096 Oct 13 18:50 doc drwxr-xr-x. 2 root root 4096 Oct 13 18:50 etc drwxr-xr-x. 3 root root 4096 Oct 13 18:50 include drwxr-xr-x. 2 root root 4096 Oct 13 18:50 lib drwxr-xr-t. 2 root root 4096 Oct 13 18:50 run ``` **2.11. Set the correct permissions for the HSM client files:** ```bash theme={"dark"} chmod -R 755 /data/ ``` **2.12. Exit the pod:** Exit the pod by running the following command: ```bash theme={"dark"} exit ``` **2.13. Delete the setup pod:** Delete the setup pod by running the following command: ```bash theme={"dark"} kubectl delete pod cloudhsm-setup-pod ``` Next we need to update the environment variables used for the deployment. If you followed the [setup instructions for Kubernetes deployments](/self-hosting/deployment-options/kubernetes-helm), you should have a Kubernetes secret called `infisical-secrets`. We need to update the secret with the following environment variables: * `HSM_LIB_PATH` - The path to the CloudHSM PKCS#11 library *(mapped to `/opt/cloudhsm/lib/libcloudhsm_pkcs11.so`)* * `HSM_PIN` - The PIN for the HSM device, which is the username and password of your Crypto User separated by a colon (e.g., `testUser:testPassword`) * `HSM_SLOT` - The slot number for the HSM device that you found in the previous step * `HSM_KEY_LABEL` - The label for the HSM key. If no key is found with the provided key label, the HSM will create a new key with the provided label. The following is an example of the secret that you should update: ```yaml theme={"dark"} apiVersion: v1 kind: Secret metadata: name: infisical-secrets type: Opaque stringData: # ... Other environment variables ... HSM_LIB_PATH: "/opt/cloudhsm/lib/libcloudhsm_pkcs11.so" HSM_PIN: "testUser:testPassword" # Replace with your actual Crypto User credentials HSM_SLOT: "0" # Replace with your actual slot number HSM_KEY_LABEL: "infisical-crypto-key" ``` Save the file after updating the environment variables, and apply the secret changes ```bash theme={"dark"} kubectl apply -f ./secret-file-name.yaml ``` After we've successfully configured the PVC and updated our environment variables, we are ready to update the deployment configuration so that the pods it creates can access the HSM client files. ```yaml theme={"dark"} # ... The rest of the values.yaml file ... infisical: image: repository: infisical/infisical tag: "v0.151.0" pullPolicy: IfNotPresent extraVolumeMounts: - name: cloudhsm-data mountPath: /opt/cloudhsm # The path we will mount the HSM client files to extraVolumes: - name: cloudhsm-data persistentVolumeClaim: claimName: cloudhsm-data-pvc # The PVC we created in the previous step # ... The rest of the values.yaml file ... ``` Make sure to set the `tag` to **`v0.151.0-nightly-20251013.1` or above**, as this is the minimum Infisical version that supports AWS CloudHSM. Ensure that the configuration file at `/opt/cloudhsm/etc/cloudhsm-pkcs11.cfg` references the correct path for the issuer CA certificate (`/opt/cloudhsm/etc/customerCA.crt`). This should already be configured correctly if you followed the previous steps. After updating the values.yaml file, you need to upgrade the Helm chart in order for the changes to take effect. ```bash theme={"dark"} helm repo update helm upgrade --install infisical infisical-helm-charts/infisical-standalone --values /path/to/values.yaml ``` After upgrading the Helm chart, you need to restart the deployment in order for the changes to take effect. ```bash theme={"dark"} kubectl rollout restart deployment/infisical-infisical-standalone-infisical ``` After following these steps, your Kubernetes setup will be ready to use AWS CloudHSM encryption. ## Disabling HSM Encryption To disable HSM encryption, navigate to Infisical's Server Admin Console and set the KMS encryption strategy to `Software-based Encryption`. This will revert the encryption strategy back to the default software-based encryption. In order to disable HSM encryption, the Infisical instance must be able to access the HSM device. If the HSM device is no longer accessible, you will not be able to disable HSM encryption. --- # Source: https://infisical.com/docs/integrations/secret-syncs/humanitec.md # Source: https://infisical.com/docs/integrations/app-connections/humanitec.md > ## Documentation Index > Fetch the complete documentation index at: https://infisical.com/docs/llms.txt > Use this file to discover all available pages before exploring further. # Humanitec Connection > Learn how to configure a Humanitec Connection for Infisical. Infisical supports connecting to Humanitec using a service user. ## Setup Humanitec Connection in Infisical Navigate to the Humanitec **Service Users** tab. Humanitec Service Users Tab Create a new service user. Take into account that the role set here will affect the permissions of the API Token so be sure to set it so the Service User has access permissions to the App you want to integrate to Infisical. Humanitec Create New Service User Add a new API token for the service user. Humanitec Add API Token Create the API token for the service user. This token's permission will be limited to the **Service User** role. If you configure an expiry date for your API token you will need to manually rotate to a new token prior to expiration to avoid integration downtime. Humanitec Create API Token A modal with the API token will be displayed. Save the token in a secure location for later use in the following steps. Humanitec Copy API Token After following the previous steps the Service User has been successfully created, and now should be visible on the Service Users tab. Humanitec Service User Created Move to the **Applications** tab and add the Service User to the Application you want to sync with Infisical. Clicking on the App Title will open the App details page. Humanitec Applications Tab Move to the **People** tab and add a new member to this Application. The recently created User Service should be visible on the dropdown shown. Make sure to assign at least Developer role as Write permissions are required. Humanitec Add User to Application Humanitec Add User Options Humanitec Add User Role Your **Humanitec Connection** is now available for use. Humanitec Connection Created Navigate to the **Integrations** tab in the desired project, then select **App Connections**. App Connections Tab Select the **Humanitec Connection** option from the connection options modal. Select Humanitec Connection Fill the Humanitec Connection modal, here you will need to provide the User Service API Token generated in the previous step. Humanitec Connection Modal Your **Humanitec Connection** is now available for use. Humanitec Connection Created --- # Source: https://infisical.com/docs/api-reference/endpoints/certificate-authorities/internal/import-cert.md > ## Documentation Index > Fetch the complete documentation index at: https://infisical.com/docs/llms.txt > Use this file to discover all available pages before exploring further. # Import certificate > Import certificate and chain to CA ## OpenAPI ````yaml POST /api/v1/cert-manager/ca/internal/{caId}/import-certificate openapi: 3.0.3 info: title: Infisical API description: List of all available APIs that can be consumed version: 0.0.1 servers: - url: https://us.infisical.com description: Production server (US) - url: https://eu.infisical.com description: Production server (EU) - url: http://localhost:8080 description: Local server security: [] paths: /api/v1/cert-manager/ca/internal/{caId}/import-certificate: post: tags: - PKI Certificate Authorities description: Import certificate and chain to CA operationId: importCaCertificate parameters: - schema: type: string in: path name: caId required: true description: The ID of the CA to import the certificate for. requestBody: content: application/json: schema: type: object properties: certificate: type: string description: The certificate body to import. certificateChain: type: string description: The certificate chain to import. required: - certificate - certificateChain additionalProperties: false required: true responses: '200': description: Default Response content: application/json: schema: type: object properties: message: type: string caId: type: string required: - message - caId additionalProperties: false '400': description: Default Response content: application/json: schema: type: object properties: reqId: type: string statusCode: type: number enum: - 400 message: type: string error: type: string details: {} required: - reqId - statusCode - message - error additionalProperties: false '401': description: Default Response content: application/json: schema: type: object properties: reqId: type: string statusCode: type: number enum: - 401 message: type: string error: type: string required: - reqId - statusCode - message - error additionalProperties: false '403': description: Default Response content: application/json: schema: type: object properties: reqId: type: string statusCode: type: number enum: - 403 message: type: string details: {} error: type: string required: - reqId - statusCode - message - error additionalProperties: false '404': description: Default Response content: application/json: schema: type: object properties: reqId: type: string statusCode: type: number enum: - 404 message: type: string error: type: string required: - reqId - statusCode - message - error additionalProperties: false '422': description: Default Response content: application/json: schema: type: object properties: reqId: type: string statusCode: type: number enum: - 422 message: {} error: type: string required: - reqId - statusCode - error additionalProperties: false '500': description: Default Response content: application/json: schema: type: object properties: reqId: type: string statusCode: type: number enum: - 500 message: type: string error: type: string required: - reqId - statusCode - message - error additionalProperties: false ```` --- # Source: https://infisical.com/docs/api-reference/endpoints/secret-syncs/zabbix/import-secrets.md # Source: https://infisical.com/docs/api-reference/endpoints/secret-syncs/windmill/import-secrets.md # Source: https://infisical.com/docs/api-reference/endpoints/secret-syncs/vercel/import-secrets.md # Source: https://infisical.com/docs/api-reference/endpoints/secret-syncs/teamcity/import-secrets.md # Source: https://infisical.com/docs/api-reference/endpoints/secret-syncs/render/import-secrets.md # Source: https://infisical.com/docs/api-reference/endpoints/secret-syncs/railway/import-secrets.md # Source: https://infisical.com/docs/api-reference/endpoints/secret-syncs/oci-vault/import-secrets.md # Source: https://infisical.com/docs/api-reference/endpoints/secret-syncs/northflank/import-secrets.md # Source: https://infisical.com/docs/api-reference/endpoints/secret-syncs/laravel-forge/import-secrets.md # Source: https://infisical.com/docs/api-reference/endpoints/secret-syncs/hashicorp-vault/import-secrets.md # Source: https://infisical.com/docs/api-reference/endpoints/secret-syncs/gcp-secret-manager/import-secrets.md # Source: https://infisical.com/docs/api-reference/endpoints/secret-syncs/chef/import-secrets.md # Source: https://infisical.com/docs/api-reference/endpoints/secret-syncs/bitbucket/import-secrets.md # Source: https://infisical.com/docs/api-reference/endpoints/secret-syncs/azure-key-vault/import-secrets.md # Source: https://infisical.com/docs/api-reference/endpoints/secret-syncs/azure-devops/import-secrets.md # Source: https://infisical.com/docs/api-reference/endpoints/secret-syncs/azure-app-configuration/import-secrets.md # Source: https://infisical.com/docs/api-reference/endpoints/secret-syncs/aws-secrets-manager/import-secrets.md # Source: https://infisical.com/docs/api-reference/endpoints/secret-syncs/aws-parameter-store/import-secrets.md # Source: https://infisical.com/docs/api-reference/endpoints/secret-syncs/1password/import-secrets.md > ## Documentation Index > Fetch the complete documentation index at: https://infisical.com/docs/llms.txt > Use this file to discover all available pages before exploring further. # Import Secrets > Import secrets from the specified 1Password Sync destination. ## OpenAPI ````yaml POST /api/v1/secret-syncs/1password/{syncId}/import-secrets openapi: 3.0.3 info: title: Infisical API description: List of all available APIs that can be consumed version: 0.0.1 servers: - url: https://us.infisical.com description: Production server (US) - url: https://eu.infisical.com description: Production server (EU) - url: http://localhost:8080 description: Local server security: [] paths: /api/v1/secret-syncs/1password/{syncId}/import-secrets: post: tags: - Secret Syncs description: Import secrets from the specified 1Password Sync destination. operationId: importOnePasswordSecretSyncSecrets parameters: - schema: type: string enum: - prioritize-source - prioritize-destination in: query name: importBehavior required: true description: >- Specify whether Infisical should prioritize secret values from Infisical or 1Password. - schema: type: string format: uuid in: path name: syncId required: true description: The ID of the 1Password Sync to trigger importing secrets for. responses: '200': description: Default Response content: application/json: schema: type: object properties: secretSync: type: object properties: id: type: string format: uuid name: type: string description: type: string nullable: true isAutoSyncEnabled: type: boolean default: true version: type: number default: 1 projectId: type: string folderId: type: string format: uuid nullable: true connectionId: type: string format: uuid createdAt: type: string format: date-time updatedAt: type: string format: date-time syncStatus: type: string nullable: true lastSyncJobId: type: string nullable: true lastSyncMessage: type: string nullable: true lastSyncedAt: type: string format: date-time nullable: true importStatus: type: string nullable: true lastImportJobId: type: string nullable: true lastImportMessage: type: string nullable: true lastImportedAt: type: string format: date-time nullable: true removeStatus: type: string nullable: true lastRemoveJobId: type: string nullable: true lastRemoveMessage: type: string nullable: true lastRemovedAt: type: string format: date-time nullable: true syncOptions: type: object properties: initialSyncBehavior: type: string enum: - overwrite-destination - import-prioritize-source - import-prioritize-destination description: >- Specify how Infisical should resolve the initial sync to the 1Password destination. keySchema: type: string description: >- Specify the format to use for structuring secret keys in the 1Password destination. disableSecretDeletion: type: boolean description: >- Enable this flag to prevent removal of secrets from the 1Password destination when syncing. required: - initialSyncBehavior additionalProperties: false description: Optional parameters to modify how secrets are synced. connection: type: object properties: app: type: string enum: - 1password name: type: string id: type: string format: uuid required: - app - name - id additionalProperties: false environment: type: object properties: slug: type: string name: type: string id: type: string format: uuid required: - slug - name - id additionalProperties: false nullable: true folder: type: object properties: id: type: string path: type: string required: - id - path additionalProperties: false nullable: true destination: type: string enum: - 1password destinationConfig: type: object properties: vaultId: type: string minLength: 1 description: The ID of the 1Password vault to sync secrets to. valueLabel: type: string description: >- The label of the entry that holds the secret value. required: - vaultId additionalProperties: false required: - id - name - projectId - connectionId - createdAt - updatedAt - syncOptions - connection - environment - folder - destination - destinationConfig additionalProperties: false title: 1Password required: - secretSync additionalProperties: false '400': description: Default Response content: application/json: schema: type: object properties: reqId: type: string statusCode: type: number enum: - 400 message: type: string error: type: string details: {} required: - reqId - statusCode - message - error additionalProperties: false '401': description: Default Response content: application/json: schema: type: object properties: reqId: type: string statusCode: type: number enum: - 401 message: type: string error: type: string required: - reqId - statusCode - message - error additionalProperties: false '403': description: Default Response content: application/json: schema: type: object properties: reqId: type: string statusCode: type: number enum: - 403 message: type: string details: {} error: type: string required: - reqId - statusCode - message - error additionalProperties: false '404': description: Default Response content: application/json: schema: type: object properties: reqId: type: string statusCode: type: number enum: - 404 message: type: string error: type: string required: - reqId - statusCode - message - error additionalProperties: false '422': description: Default Response content: application/json: schema: type: object properties: reqId: type: string statusCode: type: number enum: - 422 message: {} error: type: string required: - reqId - statusCode - error additionalProperties: false '500': description: Default Response content: application/json: schema: type: object properties: reqId: type: string statusCode: type: number enum: - 500 message: type: string error: type: string required: - reqId - statusCode - message - error additionalProperties: false ```` --- # Source: https://infisical.com/docs/integrations/platforms/infisical-agent.md > ## Documentation Index > Fetch the complete documentation index at: https://infisical.com/docs/llms.txt > Use this file to discover all available pages before exploring further. # Infisical Agent > This page describes how to manage secrets using Infisical Agent. Infisical Agent is a client daemon that simplifies the adoption of Infisical by providing a more scalable and user-friendly approach for applications to interact with Infisical. It eliminates the need to modify application logic by enabling clients to decide how they want their secrets rendered through the use of templates. agent diagram ## Key Features * **Token lifecycle management**: Automatically authenticates with Infisical and deposits renewed access tokens at specified path for applications to consume * **Templating**: Renders secrets and dynamic secret leases via user provided templates to desired formats for applications to consume ## Token Renewal The Infisical agent can help manage the life cycle of access tokens. The token renewal process is split into two main components: a `Method`, which is the authentication process suitable for your current setup, and `Sinks`, which are the places where the agent deposits the new access token whenever it receives updates. When the Infisical Agent is started, it will attempt to obtain a valid access token using the authentication method you have configured. If the agent is unable to fetch a valid token, the agent will keep trying, increasing the time between each attempt. Once a access token is successfully fetched, the agent will make sure the access token stays valid, continuing to renew it before it expires. Every time the agent successfully retrieves a new access token, it writes the new token to the Sinks you've configured. Access tokens can be utilized with Infisical SDKs or directly in API requests to retrieve secrets from Infisical ## Templating The Infisical agent can help deliver formatted secrets to your application in a variety of environments. To achieve this, the agent will retrieve secrets from Infisical, format them using a specified template, and then save these formatted secrets to a designated file path. Templating process is done through the use of Go language's [text/template feature](https://pkg.go.dev/text/template).You can refer to the available secret template functions [here](#available-secret-template-functions). Multiple template definitions can be set in the agent configuration file to generate a variety of formatted secret files. When the agent is started and templates are defined in the agent configuration file, the agent will attempt to acquire a valid access token using the set authentication method outlined in the agent's configuration. If this initial attempt is unsuccessful, the agent will momentarily pauses before continuing to make more attempts. Once the agent successfully obtains a valid access token, the agent proceeds to fetch the secrets from Infisical using it. It then formats these secrets using the user provided templates and writes the formatted data to configured file paths. ### Available secret template functions The secret template functions is what you will use to fetch resources such as static secrets and dynamic secret leases from Infisical. Below is a list of the available secret template functions that you can use in your templates. ```bash theme={"dark"} secret "" "environment-slug" "" "" ``` ```bash example-template-usage-1 theme={"dark"} {{- with secret "6553ccb2b7da580d7f6e7260" "dev" "/" `{"recursive": false, "expandSecretReferences": true}` }} {{- range . }} {{ .Key }}={{ .Value }} {{- end }} {{- end }} ``` ```bash example-template-usage-2 theme={"dark"} {{- with secret "da8056c8-01e2-4d24-b39f-cb4e004b8d44" "staging" "/" `{"recursive": true, "expandSecretReferences": true}` }} {{- range . }} {{- if eq .SecretPath "/"}} {{ .Key }}={{ .Value }} {{- else}} {{ .SecretPath }}/{{ .Key }}={{ .Value }} {{- end}} {{- end }} {{- end }} ``` **Function name**: `secret` **Description**: This function can be used to render the full list of secrets within a given project, environment and secret path. An optional JSON argument is also available. It includes the properties `recursive`, which defaults to false, and `expandSecretReferences`, which defaults to true and expands the returned secrets. **Returns**: A single secret object with the following keys `Key, WorkspaceId, Value, SecretPath, Type, ID, and Comment` ```bash theme={"dark"} getSecretByName "" "" "" "" ``` ```bash example-template-usage theme={"dark"} {{ with getSecretByName "d821f21d-aa90-453b-8448-8c78c1160a0e" "dev" "/" "POSTHOG_HOST"}} {{ if .Value }} password = "{{ .Value }}" {{ end }} {{ end }} ``` **Function name**: `getSecretByName` **Description**: This function can be used to render a single secret by it's name. **Returns**: A list of secret objects with the following keys `Key, WorkspaceId, Value, Type, ID, and Comment` ```bash theme={"dark"} dynamic_secret "" "" "" "" "" ``` ```bash example-redis-dynamic-secret theme={"dark"} {{ with dynamic_secret "aaa-o7en-s5qm" "dev" "/" "redis" "1m" }} {{ .DB_USERNAME }}={{ .DB_PASSWORD }} {{- end }} ``` **Function Name**: `dynamic_secret` **Description**: This function can be used to render a dynamic secret lease credentials. The credentials are automatically renewed before they expire, ensuring that the rendered credentials are always up-to-date. **Returns**: An object with keys corresponding to the dynamic secret lease credentials. Note that if you have multiple dynamic secret templates with identical configurations, only one lease will be created in Infisical for those templates, and the same lease will be written to your specified destination paths. ## Caching The Infisical Agent supports clientside caching of Dynamic Secret leases. If the cache is enabled, the agent will persist the dynamic secret leases to the cache across restarts of the agent. ### Persistent Caching The Agent currently only supports persistent caching. To utilize persistent caching, you must be within a Kubernetes environment. We recommend using the [Infisical Agent Injector](/integrations/platforms/kubernetes-injector) to inject the agent into pods within your Kubernetes cluster on demand. ### Cache eviction Cache eviction is the process of removing cached data from the cache. The Agent will automatically evict cached data when the cache is full during a garbage collection cycle which is triggered every 10 minutes. The cache will also automatically evict cached data that has gone stale or is about to go stale. For dynamic resources (such as dynamic secret leases), there's a TTL (Time-to-Live) associated with each lease which is used to determine if the lease is stale or about to go stale. If a stale dynamic secret lease is detected, it will be automatically evicted from the cache and replaced with a new up-to-date lease. ### Cache Configuration Configuring the cache is done through the agent configuration file. The following fields are available to configure the cache: The type of persistent caching to use. Currently only `kubernetes` is available, and will only work within Kubernetes environments. The path to where your persistent cache will be stored. Persistent caching is only supported within kubernetes environments at the moment. Please refer to the [Infisical Agent Injector](/integrations/platforms/kubernetes-injector) documentation for more information on how to use persistent caching within Kubernetes environments. ```yaml example-agent-config-file.yaml theme={"dark"} cache: persistent: type: "kubernetes" path: "/home/infisical/cache" service-account-token-path: "/var/run/secrets/kubernetes.io/serviceaccount/token" ``` ## Retrying mechanism The agent will automatically attempt to retry failed API requests such as authentication, secrets retrieval, dynamic secret lease provisioning, etc. By default, the agent will retry up to 3 times with a base delay of 200ms and a maximum delay of 5s. You can configure the retrying mechanism through the agent configuration file. The following fields are available to configure the retrying mechanism: How many times to retry failed API requests such as authentication, secret retrieval, etc. Defaults to `3` retries. The maximum delay between retries. Defaults to `5s` (5 seconds). The base delay between retries. Defaults to `200ms` (200 milliseconds). ```yaml example-agent-config-file.yaml theme={"dark"} infisical: address: "https://app.infisical.com" retry-strategy: max-retries: 3 max-delay: "5s" base-delay: "200ms" # ... rest of the agent configuration file ``` ## Agent configuration file To set up the authentication method for token renewal and to define secret templates, the Infisical agent requires a YAML configuration file containing properties defined below. While specifying an authentication method is mandatory to start the agent, configuring sinks and secret templates are optional. | Field | Description | | --------------------------------------------- | ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | | `infisical.address` | The URL of the Infisical service. Default: `"https://app.infisical.com"`. | | `infisical.exit-after-auth` | Whether to exit the agent after authentication and first secret render. Default: `"false"`. | | `infisical.revoke-credentials-on-shutdown` | Whether to revoke all managed dynamic secret leases and identity access tokens on shutdown. Default: `"false"`. | | `infisical.retry-strategy.max-retries` | How many times to retry failed API requests such as authentication, secret retrieval, etc. Defaults to `3` retries. | | `infisical.retry-strategy.max-delay` | The maximum delay between retries. Defaults to `5s` (5 seconds). | | `infisical.retry-strategy.base-delay` | The base delay between retries. Defaults to `200ms` (200 milliseconds). | | `auth.type` | The type of authentication method used. Available options: `universal-auth`, `kubernetes`, `azure`, `gcp-id-token`, `gcp-iam`, `aws-iam` | | `auth.config.identity-id` | The file path where the machine identity id is stored

This field is required when using any of the following auth types: `kubernetes`, `azure`, `gcp-id-token`, `gcp-iam`, or `aws-iam`. | | `auth.config.service-account-token` | Path to the Kubernetes service account token to use (optional)

Default: `/var/run/secrets/kubernetes.io/serviceaccount/token` | | `auth.config.service-account-key` | Path to your GCP service account key file. This field is required when using `gcp-iam` auth type.

Please note that the file should be in JSON format. | | `auth.config.client-id` | The file path where the universal-auth client id is stored. | | `auth.config.client-secret` | The file path where the universal-auth client secret is stored. | | `auth.config.remove_client_secret_on_read` | This will instruct the agent to remove the client secret from disk. | | `sinks[].type` | The type of sink in a list of sinks. Each item specifies a sink type. Currently, only `"file"` type is available. | | `sinks[].config.path` | The file path where the access token should be stored for each sink in the list. | | `cache.persistent.type` | The type of persistent caching to use. Currently only `kubernetes` is available, and will only work within Kubernetes environments. | | `cache.persistent.path` | The path to where your persistent cache will be stored. | | `cache.persistent.service-account-token-path` | The path to the Kubernetes service account token to use for encrypting the persistent cache. Required when using `kubernetes` cache type. Defaults to `/var/run/secrets/kubernetes.io/serviceaccount/token` | | `templates[].source-path` | The path to the template file that should be used to render secrets. | | `templates[].template-content` | The inline secret template to be used for rendering the secrets. | | `templates[].destination-path` | The path where the rendered secrets from the source template will be saved to. | | `templates[].config.polling-interval` | How frequently to check for secret changes. Default: `5m` (5 minutes) (optional) | | `templates[].config.execute.command` | The command to execute when secret change is detected (optional) | | `templates[].config.execute.timeout` | How long in seconds to wait for command to execute before timing out (optional) | ## Authentication The Infisical agent supports multiple authentication methods. Below are the available authentication methods, with their respective configurations. The Universal Auth method is a simple and secure way to authenticate with Infisical. It requires a client ID and a client secret to authenticate with Infisical. Path to the file containing the universal auth client ID. Path to the file containing the universal auth client secret. Instructs the agent to remove the client secret from disk after reading it. To create a universal auth machine identity, follow the step by step guide outlined [here](/documentation/platform/identities/universal-auth). Update the agent configuration file with the specified auth method, client ID, and client secret. In the snippet below you can see a sample configuration of the `auth` field when using the Universal Auth method. ```yaml example-auth-config.yaml theme={"dark"} auth: type: "universal-auth" config: client-id: "./client-id" # Path to the file containing the client ID client-secret: "./client" # Path to the file containing the client secret remove_client_secret_on_read: false # Optional field, instructs the agent to remove the client secret from disk after reading it ``` The Native Kubernetes method is used to authenticate with Infisical when running in a Kubernetes environment. It requires a service account token to authenticate with Infisical. {" "} Path to the file containing the machine identity ID. Path to the Kubernetes service account token to use. Default: `/var/run/secrets/kubernetes.io/serviceaccount/token`. To create a Kubernetes machine identity, follow the step by step guide outlined [here](/documentation/platform/identities/kubernetes-auth). Update the agent configuration file with the specified auth method, identity ID, and service account token. In the snippet below you can see a sample configuration of the `auth` field when using the Kubernetes method. ```yaml example-auth-config.yaml theme={"dark"} auth: type: "kubernetes" config: identity-id: "./identity-id" # Path to the file containing the machine identity ID service-account-token: "/var/run/secrets/kubernetes.io/serviceaccount/token" # Optional field, custom path to the Kubernetes service account token to use ``` The Native Azure method is used to authenticate with Infisical when running in an Azure environment. Path to the file containing the machine identity ID. To create an Azure machine identity, follow the step by step guide outlined [here](/documentation/platform/identities/azure-auth). Update the agent configuration file with the specified auth method and identity ID. In the snippet below you can see a sample configuration of the `auth` field when using the Azure method. ```yaml example-auth-config.yaml theme={"dark"} auth: type: "azure" config: identity-id: "./identity-id" # Path to the file containing the machine identity ID ``` The Native GCP ID Token method is used to authenticate with Infisical when running in a GCP environment. Path to the file containing the machine identity ID. To create a GCP machine identity, follow the step by step guide outlined [here](/documentation/platform/identities/gcp-auth). Update the agent configuration file with the specified auth method and identity ID. In the snippet below you can see a sample configuration of the `auth` field when using the GCP ID Token method. ```yaml example-auth-config.yaml theme={"dark"} auth: type: "gcp-id-token" config: identity-id: "./identity-id" # Path to the file containing the machine identity ID ``` The GCP IAM method is used to authenticate with Infisical with a GCP service account key. Path to the file containing the machine identity ID. Path to your GCP service account key file. To create a GCP machine identity, follow the step by step guide outlined [here](/documentation/platform/identities/gcp-auth). Update the agent configuration file with the specified auth method, identity ID, and service account key. In the snippet below you can see a sample configuration of the `auth` field when using the GCP IAM method. ```yaml example-auth-config.yaml theme={"dark"} auth: type: "gcp-iam" config: identity-id: "./identity-id" # Path to the file containing the machine identity ID service-account-key: "./service-account-key.json" # Path to your GCP service account key file ``` The AWS IAM method is used to authenticate with Infisical with an AWS IAM role while running in an AWS environment like EC2, Lambda, etc. Path to the file containing the machine identity ID. To create an AWS machine identity, follow the step by step guide outlined [here](/documentation/platform/identities/aws-auth). Update the agent configuration file with the specified auth method and identity ID. In the snippet below you can see a sample configuration of the `auth` field when using the AWS IAM method. ```yaml example-auth-config.yaml theme={"dark"} auth: type: "aws-iam" config: identity-id: "./identity-id" # Path to the file containing the machine identity ID ``` ## Quick start Infisical Agent To install the Infisical agent, you must first install the [Infisical CLI](/cli/overview) in the desired environment where you'd like the agent to run. This is because the Infisical agent is a sub-command of the Infisical CLI. Once you have the CLI installed, you will need to provision programmatic access for the agent via [Universal Auth](/documentation/platform/identities/universal-auth). To obtain a **Client ID** and a **Client Secret**, follow the step by step guide outlined [here](/documentation/platform/identities/universal-auth). Next, create agent config file as shown below. The example agent configuration file defines the token authentication method, one sink location, and a secret template. ```yaml example-agent-config-file.yaml theme={"dark"} infisical: address: "https://app.infisical.com" auth: type: "universal-auth" config: client-id: "./client-id" client-secret: "./client-secret" remove_client_secret_on_read: false sinks: - type: "file" config: path: "/some/path/to/store/access-token/file-name" templates: - source-path: my-dot-ev-secret-template destination-path: /some/path/.env config: polling-interval: 60s execute: timeout: 30 command: ./reload-app.sh ``` The secret template below will be used to render the secrets with the key and the value separated by `=` sign. You'll notice that a custom function named `secret` is used to fetch the secrets. This function takes the following arguments: `secret "" "" ""`. ```text my-dot-ev-secret-template theme={"dark"} {{- with secret "6553ccb2b7da580d7f6e7260" "dev" "/" }} {{- range . }} {{ .Key }}={{ .Value }} {{- end }} {{- end }} ``` After defining the agent configuration file, run the command below pointing to the path where the agent configuration file is located. ```bash theme={"dark"} infisical agent --config example-agent-config-file.yaml ``` --- # Source: https://infisical.com/docs/integrations/platforms/kubernetes/infisical-dynamic-secret-crd.md > ## Documentation Index > Fetch the complete documentation index at: https://infisical.com/docs/llms.txt > Use this file to discover all available pages before exploring further. # Using the InfisicalDynamicSecret CRD > Learn how to generate dynamic secret leases in Infisical and sync them to your Kubernetes cluster. ## Overview The **InfisicalDynamicSecret** CRD allows you to easily create and manage dynamic secret leases in Infisical and automatically sync them to your Kubernetes cluster as native **Kubernetes Secret** resources. This means any Pod, Deployment, or other Kubernetes resource can make use of dynamic secrets from Infisical just like any other K8s secret. This CRD offers the following features: * **Generate a dynamic secret lease** in Infisical and track its lifecycle. * **Write** the dynamic secret from Infisical to your cluster as native Kubernetes secret. * **Automatically rotate** the dynamic secret value before it expires to make sure your cluster always has valid credentials. * **Optionally trigger redeployments** of any workloads that consume the secret if you enable auto-reload. ### Prerequisites * A project within Infisical. * A [machine identity](/documentation/platform/identities/machine-identities) ready for use in Infisical that has permissions to create dynamic secret leases in the project. * You have already configured a dynamic secret in Infisical. * The operator is installed on to your Kubernetes cluster. ## Configure Dynamic Secret CRD The example below shows a sample **InfisicalDynamicSecret** CRD that creates a dynamic secret lease in Infisical, and syncs the lease to your Kubernetes cluster. ```yaml dynamic-secret-crd.yaml theme={"dark"} apiVersion: secrets.infisical.com/v1alpha1 kind: InfisicalDynamicSecret metadata: name: infisicaldynamicsecret spec: hostAPI: https://app.infisical.com/api # Optional, defaults to https://app.infisical.com/api dynamicSecret: secretName: projectId: secretsPath: # Root directory is / environmentSlug: # Lease revocation policy defines what should happen to leases created by the operator if the CRD is deleted. # If set to "Revoke", leases will be revoked when the InfisicalDynamicSecret CRD is deleted. leaseRevocationPolicy: Revoke # Lease TTL defines how long the lease should last for the dynamic secret. # This value must be less than 1 day, and if a max TTL is defined on the dynamic secret, it must be below the max TTL. leaseTTL: 1m # A reference to the secret that the dynamic secret lease should be stored in. # If the secret doesn't exist, it will automatically be created. managedSecretReference: secretName: secretNamespace: default # Must be the same namespace as the InfisicalDynamicSecret CRD. creationPolicy: Orphan # Only have one authentication method defined or you are likely to run into authentication issues. # Remove all except one authentication method. authentication: awsIamAuth: identityId: azureAuth: identityId: gcpIamAuth: identityId: serviceAccountKeyFilePath: gcpIdTokenAuth: identityId: ldapAuth: identityId: credentialsRef: secretName: # ldap-auth-credentials secretNamespace: # default kubernetesAuth: identityId: serviceAccountRef: name: namespace: universalAuth: credentialsRef: secretName: # universal-auth-credentials secretNamespace: # default ``` Apply the InfisicalDynamicSecret CRD to your cluster. ```bash theme={"dark"} kubectl apply -f dynamic-secret-crd.yaml ``` After applying the InfisicalDynamicSecret CRD, you should notice that the dynamic secret lease has been created in Infisical and synced to your Kubernetes cluster. You can verify that the lease has been created by doing: ```bash theme={"dark"} kubectl get secret -o yaml ``` After getting the secret, you should should see that the secret has data that contains the lease credentials. ```yaml theme={"dark"} apiVersion: v1 data: DB_PASSWORD: VHhETjZ4c2xsTXpOSWdPYW5LLlRyNEc2alVKYml6WiQjQS0tNTdodyREM3ZLZWtYSi4hTkdyS0F+TVFsLU9CSA== DB_USERNAME: cHg4Z0dJTUVBcHdtTW1aYnV3ZWRsekJRRll6cW4wFEE= kind: Secret # ..... ``` ### InfisicalDynamicSecret CRD properties If you are fetching secrets from a self-hosted instance of Infisical set the value of `hostAPI` to `https://your-self-hosted-instace.com/api` When `hostAPI` is not defined the operator fetches secrets from Infisical Cloud. If you have installed your Infisical instance within the same cluster as the Infisical operator, you can optionally access the Infisical backend's service directly without having to route through the public internet. To achieve this, use the following address for the hostAPI field: ```bash theme={"dark"} http://..svc.cluster.local:4000/api ``` Make sure to replace `` and `` with the appropriate values for your backend service and namespace. The `leaseTTL` is a string-formatted duration that defines the time the lease should last for the dynamic secret. The format of the field is `[duration][unit]` where `duration` is a number and `unit` is a string representing the unit of time. The following units are supported: * `s` for seconds (must be at least 5 seconds) * `m` for minutes * `h` for hours * `d` for days The lease duration at most be 1 day (24 hours). And the TTL must be less than the max TTL defined on the dynamic secret. The `managedSecretReference` field is used to define the Kubernetes secret where the dynamic secret lease should be stored. The required fields are `secretName` and `secretNamespace`. ```yaml theme={"dark"} spec: managedSecretReference: secretName: secretNamespace: default ``` {" "} The name of the Kubernetes secret where the dynamic secret lease should be stored. {" "} The namespace of the Kubernetes secret where the dynamic secret lease should be stored. Creation policies allow you to control whether or not owner references should be added to the managed Kubernetes secret that is generated by the Infisical operator. This is useful for tools such as ArgoCD, where every resource requires an owner reference; otherwise, it will be pruned automatically. #### Available options * `Orphan` (default) * `Owner` When creation policy is set to `Owner`, the `InfisicalSecret` CRD must be in the same namespace as where the managed kubernetes secret. This field is optional. Override the default Opaque type for managed secrets with this field. Useful for creating kubernetes.io/dockerconfigjson secrets. This field is optional. The field is optional and will default to `None` if not defined. The lease revocation policy defines what the operator should do with the leases created by the operator, when the InfisicalDynamicSecret CRD is deleted. Valid values are `None` and `Revoke`. Behavior of each policy: * `None`: The operator will not override existing secrets in Infisical. If a secret with the same key already exists, the operator will skip pushing that secret, and the secret will not be managed by the operator. * `Revoke`: The operator will revoke the leases created by the operator when the InfisicalDynamicSecret CRD is deleted. ```yaml theme={"dark"} spec: leaseRevocationPolicy: Revoke ``` The `dynamicSecret` field is used to specify which dynamic secret to create leases for. The required fields are `secretName`, `projectId`, `secretsPath`, and `environmentSlug`. ```yaml theme={"dark"} spec: dynamicSecret: secretName: # Use either projectId OR projectSlug, not both projectId: # Either projectId or projectSlug is required # projectSlug: environmentSlug: secretsPath: ``` {" "} The name of the dynamic secret. {" "} The project ID of where the dynamic secret is stored in Infisical. Please note that you can only use either `projectId` or `projectSlug` in the `dynamicSecret` field. The project slug of where the dynamic secret is stored in Infisical. Please note that you can only use either `projectId` or `projectSlug` in the `dynamicSecret` field. {" "} The environment slug of where the dynamic secret is stored in Infisical. {" "} The path of where the dynamic secret is stored in Infisical. The root path is `/`. The `authentication` field dictates which authentication method to use when pushing secrets to Infisical. The available authentication methods are `universalAuth`, `kubernetesAuth`, `awsIamAuth`, `azureAuth`, `gcpIdTokenAuth`, and `gcpIamAuth`. The universal authentication method is one of the easiest ways to get started with Infisical. Universal Auth works anywhere and is not tied to any specific cloud provider. [Read more about Universal Auth](/documentation/platform/identities/universal-auth). Valid fields: * `identityId`: The identity ID of the machine identity you created. * `credentialsRef`: The name and namespace of the Kubernetes secret that stores the service token. * `credentialsRef.secretName`: The name of the Kubernetes secret. * `credentialsRef.secretNamespace`: The namespace of the Kubernetes secret. Example: ```yaml theme={"dark"} # infisical-push-secret.yaml spec: universalAuth: credentialsRef: secretName: secretNamespace: ``` ```yaml theme={"dark"} # machine-identity-credentials.yaml apiVersion: v1 kind: Secret metadata: name: universal-auth-credentials type: Opaque stringData: clientId: clientSecret: ``` The Kubernetes machine identity authentication method is used to authenticate with Infisical. The identity ID is stored in a field in the InfisicalSecret resource. This authentication method can only be used within a Kubernetes environment. [Read more about Kubernetes Auth](/documentation/platform/identities/kubernetes-auth). Valid fields: * `identityId`: The identity ID of the machine identity you created. * `serviceAccountRef`: The name and namespace of the service account that will be used to authenticate with Infisical. * `serviceAccountRef.name`: The name of the service account. * `serviceAccountRef.namespace`: The namespace of the service account. * `autoCreateServiceAccountToken`: If set to `true`, the operator will automatically create a short-lived service account token on-demand for the service account. Defaults to `false`. * `serviceAccountTokenAudiences`: Optionally specify audience for the service account token. This field is only relevant if you have set `autoCreateServiceAccountToken` to `true`. No audience is specified by default. Example: ```yaml theme={"dark"} spec: kubernetesAuth: identityId: autoCreateServiceAccountToken: true # Automatically creates short-lived service account tokens for the service account. serviceAccountTokenAudiences: - # Optionally specify audience for the service account token. No audience is specified by default. serviceAccountRef: name: namespace: ``` The LDAP machine identity authentication method is used to authenticate with a configured LDAP directory. [Read more about LDAP Auth](/documentation/platform/identities/ldap-auth). Valid fields: * `identityId`: The identity ID of the machine identity you created. * `credentialsRef`: The name and namespace of the Kubernetes secret that stores the LDAP credentials. * `credentialsRef.secretName`: The name of the Kubernetes secret. * `credentialsRef.secretNamespace`: The namespace of the Kubernetes secret. Example: ```yaml theme={"dark"} # infisical-push-secret.yaml spec: ldapAuth: identityId: credentialsRef: secretName: secretNamespace: ``` ```yaml theme={"dark"} # machine-identity-credentials.yaml apiVersion: v1 kind: Secret metadata: name: ldap-auth-credentials type: Opaque stringData: username: password: ``` The AWS IAM machine identity authentication method is used to authenticate with Infisical. [Read more about AWS IAM Auth](/documentation/platform/identities/aws-auth). Valid fields: * `identityId`: The identity ID of the machine identity you created. Example: ```yaml theme={"dark"} spec: authentication: awsIamAuth: identityId: ``` The AWS IAM machine identity authentication method is used to authenticate with Infisical. Azure Auth can only be used from within an Azure environment. [Read more about Azure Auth](/documentation/platform/identities/azure-auth). Valid fields: * `identityId`: The identity ID of the machine identity you created. Example: ```yaml theme={"dark"} spec: authentication: azureAuth: identityId: ``` The GCP IAM machine identity authentication method is used to authenticate with Infisical. The identity ID is stored in a field in the InfisicalSecret resource. This authentication method can only be used both within and outside GCP environments. [Read more about Azure Auth](/documentation/platform/identities/gcp-auth). Valid fields: * `identityId`: The identity ID of the machine identity you created. * `serviceAccountKeyFilePath`: The path to the GCP service account key file. Example: ```yaml theme={"dark"} spec: gcpIamAuth: identityId: serviceAccountKeyFilePath: ``` The GCP ID Token machine identity authentication method is used to authenticate with Infisical. The identity ID is stored in a field in the InfisicalSecret resource. This authentication method can only be used within GCP environments. [Read more about Azure Auth](/documentation/platform/identities/gcp-auth). Valid fields: * `identityId`: The identity ID of the machine identity you created. Example: ```yaml theme={"dark"} spec: gcpIdTokenAuth: identityId: ``` This block defines the TLS settings to use for connecting to the Infisical instance. Fields: This block defines the reference to the CA certificate to use for connecting to the Infisical instance with SSL/TLS. Valid fields: * `secretName`: The name of the Kubernetes secret containing the CA certificate to use for connecting to the Infisical instance with SSL/TLS. * `secretNamespace`: The namespace of the Kubernetes secret containing the CA certificate to use for connecting to the Infisical instance with SSL/TLS. * `key`: The name of the key in the Kubernetes secret which contains the value of the CA certificate to use for connecting to the Infisical instance with SSL/TLS. Example: ```yaml theme={"dark"} tls: caRef: secretName: custom-ca-certificate secretNamespace: default key: ca.crt ``` ### Applying the InfisicalDynamicSecret CRD to your cluster Once you have configured the `InfisicalDynamicSecret` CRD with the required fields, you can apply it to your cluster. After applying, you should notice that a lease has been created in Infisical and synced to your Kubernetes cluster. ```bash theme={"dark"} kubectl apply -f dynamic-secret-crd.yaml ``` ## Auto redeployment Deployments referring to Kubernetes secrets containing Infisical dynamic secrets don't automatically reload when the dynamic secret lease expires. This means your deployment may use expired dynamic secrets unless manually redeployed. To address this, we've added functionality to automatically redeploy your deployment when the associated Kubernetes secret containing your Infisical dynamic secret updates. #### Enabling auto redeploy To enable auto redeployment you simply have to add the following annotation to the deployment, statefulset, or daemonset that consumes a managed secret. ```yaml theme={"dark"} secrets.infisical.com/auto-reload: "true" ``` ```yaml theme={"dark"} apiVersion: apps/v1 kind: Deployment metadata: name: nginx-deployment labels: app: nginx annotations: secrets.infisical.com/auto-reload: "true" # <- redeployment annotation spec: replicas: 1 selector: matchLabels: app: nginx template: metadata: labels: app: nginx spec: containers: - name: nginx image: nginx:1.14.2 envFrom: - secretRef: name: managed-secret # The name of your managed secret, the same that you're using in your InfisicalDynamicSecret CRD (spec.managedSecretReference.secretName) ports: - containerPort: 80 ``` #### How it works When the lease changes, the operator will check to see which deployments are using the operator-managed Kubernetes secret that received the update. Then, for each deployment that has this annotation present, a rolling update will be triggered. A redeployment won't happen if the lease is renewed, only if it's recreated. --- # Source: https://infisical.com/docs/integrations/platforms/infisical-proxy.md > ## Documentation Index > Fetch the complete documentation index at: https://infisical.com/docs/llms.txt > Use this file to discover all available pages before exploring further. # Infisical Proxy > Learn how to use the Infisical Proxy to proxy requests to Infisical with built-in caching for high availability. ## Overview Infisical Proxy is a client-side daemon that acts as an API proxy for Infisical, providing caching capabilities for high availability. Applications connect to the proxy instead of directly to Infisical, and the proxy handles request forwarding, response caching, and automatic cache refresh. **Key features:** * **API Proxy**: Forwards all requests to your Infisical instance transparently * **Caching**: Caches secret responses in-memory with automatic refresh * **High Availability**: Continues serving cached secrets even when Infisical is unreachable (optimistic eviction strategy) * **Automatic Cache Invalidation**: Purges stale cache entries when secrets are mutated through the proxy * **Token Validation**: Periodically validates access tokens and evicts entries for revoked tokens * **TLS Support**: Supports TLS encryption for secure communication The Infisical Proxy is ideal for scenarios where you need to reduce load on your Infisical instance, improve response times, or ensure secret availability during network disruptions. ## How It Works ```mermaid theme={"dark"} %%{init: {'theme': 'base', 'themeVariables': { 'edgeLabelBackground':'#ffffff', 'lineColor': '#333'}}}%% flowchart LR A[Application] -->|Request| B[Infisical Proxy] B -->|Cache Hit| A B -->|Cache Miss| C[Infisical] C -->|Response| B B -->|Cache & Return| A style A fill:#ECF26D,stroke:#333,color:#000 style B fill:#ECF26D,stroke:#333,color:#000 style C fill:#ECF26D,stroke:#333,color:#000 ``` The Infisical Proxy sits between your applications and your Infisical instance, acting as a transparent intermediary. Applications make requests to the proxy using the same API endpoints they would use with Infisical directly, simply replace your Infisical host URL with the proxy's address. The proxy handles authentication headers transparently, forwarding them to Infisical as needed. When a request arrives, the proxy first checks its in-memory cache for a matching response. Cache lookups are based on the request method, path, query parameters, and authentication token, ensuring that different users and query variations are cached separately. If a matching entry exists, the proxy returns the cached response immediately without contacting Infisical, significantly reducing latency and load on your Infisical instance. For requests that aren't in the cache, the proxy forwards them to Infisical, waits for the response, and then stores the response in its cache before returning it to the application. This means the first request for any unique combination of parameters will have normal latency, but subsequent identical requests will be served from cache. To keep cached data fresh, the proxy runs two background processes. The first periodically validates that cached access tokens are still valid by making test requests to Infisical. If a token has been revoked, all cache entries associated with that token are immediately evicted. The second process refreshes cached secrets on a configurable interval, re-fetching data from Infisical and updating the cache with the latest values. Both processes use an optimistic strategy: if Infisical is unreachable, the proxy continues serving cached data rather than evicting entries, ensuring your applications remain operational during outages. ## Install the Infisical Proxy The Infisical Proxy is available through the Infisical CLI. Please refer to the [CLI installation documentation](/cli/overview) for more information on how to install the Infisical CLI. ## Quick Start Start the proxy with minimal configuration: ```bash theme={"dark"} infisical proxy start \ --domain=https://app.infisical.com \ --listen-address=localhost:8081 \ --tls-enabled=false ``` Then configure your application to use `http://localhost:8081` as the Infisical host instead of `https://app.infisical.com`. For production deployments, it is strongly recommended to enable TLS by providing `--tls-cert-file` and `--tls-key-file`, and setting `--tls-enabled` to `true`. ## Configuration ### Command Options Domain of your Infisical instance (e.g., [https://app.infisical.com](https://app.infisical.com)) Address and port for the proxy to listen on, e.g. `localhost:8081` Whether to enable TLS encryption for secure communication for the proxy. Defaults to `true`. Note that all communication between the proxy and Infisical is always encrypted by default. If you are self-hosting your Infisical instance, ensure that your Infisical instance is configured to use TLS. Path to the TLS certificate file to use for proxy TLS encryption. This field is required if `--tls-enabled` is `true`. Path to the TLS private key file. This field is required if `--tls-enabled` is `true`. The eviction strategy to use for cached secrets. Defaults to `optimistic`, and currently this is the only supported eviction strategy. The eviction strategy is used to determine when to evict cached secrets from the cache. * `optimistic` - Only evict cached secrets when the proxy is able to reach Infisical and verify that the underlying cached secret is stale. How often to validate that access tokens are still valid. If a token is deemed to be invalid *(such as if it has been revoked or has expired)*, the proxy will evict all cached secrets that are associated with that token. Supports duration formats like `60s|5m|1h|1d|1w|1y`. How often to refresh cached secrets from Infisical. Defaults to `1h`. Supports duration formats like `60s|5m|1h|1d|1w|1y`. # Caching Behavior ### What Gets Cached The proxy selectively caches responses to optimize for the most common secret retrieval patterns. Only `GET` requests to secret endpoints are cached. This includes the list and retrieve endpoints across both API versions (`/api/v3/secrets` and `/api/v4/secrets`), as well as their raw variants and any sub-paths. These endpoints represent read operations where caching provides the most benefit: reducing latency for frequently accessed secrets and decreasing load on your Infisical instance. All other requests pass through the proxy without caching. This includes mutation operations like creating, updating, or deleting secrets (`POST`, `PATCH`, `DELETE`), as well as requests to non-secret endpoints such as authentication, project management, or user operations. These requests are forwarded directly to Infisical and their responses are returned to the application without being stored. This design ensures that write operations always reach Infisical immediately and that the cache only contains secret data that benefits from being cached. ### Request Uniqueness Each cache entry is uniquely identified by a SHA-256 hash of the request's method, path, query parameters, and authentication token. This ensures that different query combinations and users are cached separately. The cache key is constructed as follows: ``` sha256(method + path + query + access_token) ``` ### Automatic Cache Refresh The proxy automatically refreshes cached secrets and validates cached access tokens to ensure the data in the cache remains fresh and valid. #### Access Token Validation The proxy periodically validates that cached access tokens are still valid, running every 5 minutes by default. For each unique token in the cache, the proxy makes a test request to Infisical using one of that token's cached requests. If Infisical returns `401 Unauthorized` or `403 Forbidden`, all cache entries associated with that token are immediately evicted. **When the proxy is configured with the optimistic eviction strategy**: If Infisical is unreachable during token validation (network errors or `5xx` responses), the proxy keeps cached entries intact rather than evicting them. This ensures that your applications remain operational even if Infisical is temporarily unavailable. #### Static Secrets Refresh The proxy automatically refreshes cached secrets to ensure data stays current, running every hour by default. During each refresh cycle, the proxy identifies all cache entries that were last updated longer ago than the refresh interval, then re-fetches each one from Infisical. Successful responses update the cached data with fresh values. Entries that return `401`, `403`, or `404` during refresh are evicted from the cache, as these indicate the token has lost access or the resource no longer exists. **When the proxy is configured with the `optimistic` eviction strategy**: If Infisical is unreachable during the refresh cycle (network errors or `5xx` responses), the proxy keeps cached entries intact rather than evicting them. This ensures that your applications remain operational even if Infisical is temporarily unavailable. ### Mutation-Based Cache Invalidation When a mutation request is processed through the proxy (`POST`, `PATCH`, or `DELETE` requests), the proxy extracts the `projectId`, `environment`, and `secretPath` from the request body and purges all cache entries that match these criteria—regardless of which token was used to cache them. This cross-token purging ensures that all users see consistent data after a secret is modified. The proxy also supports wildcard path matching, so a mutation to `/production/database` will invalidate cache entries for both exact path matches and recursive queries that included that path. For immediate cache invalidation, perform secret mutations through the proxy rather than directly to Infisical. For optimal performance it's recommended to use the proxy for all API requests. ### Eviction Strategy The eviction strategy is used to determine when to evict cached entries from the cache. Currently the Infisical Proxy only supports the `optimistic` eviction strategy. #### Optimistic Eviction * Keeps cached data when Infisical is unreachable (network errors, or `5xx` responses) * Ensures high availability when your Infisical instance is unreachable * Cache entries are only evicted on: * Token invalidation (`401`/`403` response) * Resource not found (`404` response) * Explicit mutation through the proxy * Proxy restart *(when the proxy is restarted, all cached entries are evicted because the cache is stored in memory)* The `optimistic` eviction strategy prioritizes availability. Applications will continue receiving cached secrets even if Infisical is down, at the cost of potentially serving slightly stale data. ## TLS Configuration By default, TLS is enabled. For production deployments, provide your TLS certificate and key: ```bash theme={"dark"} infisical proxy start \ --domain=https://app.infisical.com \ --listen-address=0.0.0.0:8081 \ --tls-cert-file=/path/to/cert.pem \ --tls-key-file=/path/to/key.pem ``` To disable TLS (**not recommended for production**): ```bash theme={"dark"} infisical proxy start \ --domain=https://app.infisical.com \ --listen-address=localhost:8081 \ --tls-enabled=false ``` ## Examples ### Using the Proxy with SDKs Configure your Infisical SDK to point to the proxy instead of Infisical directly: #### Node.js ```javascript theme={"dark"} import { InfisicalSDK } from '@infisical/sdk' const client = new InfisicalSDK({ siteUrl: "http://localhost:8081", // Proxy address instead of Infisical // ... other configuration options }); ``` #### Python SDK ```python theme={"dark"} from infisical_sdk import InfisicalSDKClient client = InfisicalSDKClient(host="http://localhost:8081") # Proxy address instead of Infisical ``` ### Direct API Calls ```bash theme={"dark"} # Instead of calling Infisical directly: # curl https://app.infisical.com/api/v3/secrets/raw?... # Call the proxy: curl -G http://localhost:8081/api/v4/secrets \ -H "Authorization: Bearer " \ --data-urlencode "projectId=" \ --data-urlencode "environment=dev" \ --data-urlencode "secretPath=/" \ --data-urlencode "recursive=true" ``` ## Security Considerations ### Cache Encryption All cached secret data is encrypted at rest in memory using AES-256 with GCM authentication. Secrets are only decrypted momentarily when serving a response to a client, and are otherwise stored in encrypted form. The encryption key is randomly generated at proxy startup and persists only for the lifetime of the process, and restarting the proxy generates a new key and clears all cached data. The encryption key itself is protected in memory, using multiple layers of memory protection techniques. * **Memory locking via `mlock()`:** prevents the key from being swapped to disk * **Memory protection via `mprotect()`:** guards against buffer overflows and unauthorized access * **Secure allocation via `mmap()`:** ensures the memory region is allocated safely * **In-memory encryption using XSalsa20-Poly1305:** protects the key even within RAM ### Network Security Enable TLS in production to encrypt traffic between your applications and the proxy. Without TLS, secrets are transmitted in plaintext over the network between your applications and the proxy. ### Access Control Restrict network access to the proxy's listen address to prevent unauthorized clients from querying cached secrets. The proxy should only be accessible to trusted applications within your infrastructure. ### Token Isolation The proxy caches responses separately for each authentication token. If a token is compromised, only the cache entries associated with that specific token are exposed. Other tokens' cached data remains isolated and protected. ## Troubleshooting If you're updating secrets directly in Infisical (not through the proxy), the proxy will not automatically invalidate the cache. You will need to manually purge the cache by restarting the proxy, or by waiting for the next `static-secrets-refresh-interval` cycle. The `static-secrets-refresh-interval` is the interval at which the proxy will refresh cached secrets from Infisical. For immediate invalidation, perform mutations through the proxy. --- # Source: https://infisical.com/docs/integrations/platforms/kubernetes/infisical-push-secret-crd.md > ## Documentation Index > Fetch the complete documentation index at: https://infisical.com/docs/llms.txt > Use this file to discover all available pages before exploring further. # Using the InfisicalPushSecret CRD > Learn how to use the InfisicalPushSecret CRD to push and manage secrets in Infisical. ## Overview The **InfisicalPushSecret** CRD allows you to create secrets in your Kubernetes cluster and push them to Infisical. This CRD offers the following features: * **Push Secrets** from a Kubernetes secret into Infisical. * **Manage secret lifecycle** of pushed secrets in Infisical. When the Kubernetes secret is updated, the operator will automatically update the secrets in Infisical. Optionally, when the Kubernetes secret is deleted, the operator will delete the secrets in Infisical automatically. ### Prerequisites * A project within Infisical. * A [machine identity](/documentation/platform/identities/machine-identities) ready for use in Infisical that has permissions to create secrets in your project. * The operator is installed on to your Kubernetes cluster. ## Example usage Below is a sample InfisicalPushSecret CRD that pushes secrets defined in a Kubernetes secret to Infisical. After filling out the fields in the InfisicalPushSecret CRD, you can apply it directly to your cluster. Before applying the InfisicalPushSecret CRD, you need to create a Kubernetes secret containing the secrets you want to push to Infisical. An example can be seen below the InfisicalPushSecret CRD. ```yaml infisical-push-secret.yaml theme={"dark"} apiVersion: secrets.infisical.com/v1alpha1 kind: InfisicalPushSecret metadata: name: infisical-push-secret-demo spec: resyncInterval: 1m # Remove this field to disable automatic reconciliation of the InfisicalPushSecret CRD. hostAPI: https://app.infisical.com/api # Optional, defaults to no replacement. updatePolicy: Replace # If set to replace, existing secrets inside Infisical will be replaced by the value of the PushSecret on sync. # Optional, defaults to no deletion. deletionPolicy: Delete # If set to delete, the secret(s) inside Infisical managed by the operator, will be deleted if the InfisicalPushSecret CRD is deleted. destination: projectId: # Either projectId or projectSlug is required projectSlug: environmentSlug: secretsPath: push: secret: secretName: push-secret-demo # Secret CRD secretNamespace: default # Only have one authentication method defined or you are likely to run into authentication issues. # Remove all except one authentication method. authentication: awsIamAuth: identityId: azureAuth: identityId: gcpIamAuth: identityId: serviceAccountKeyFilePath: gcpIdTokenAuth: identityId: kubernetesAuth: identityId: serviceAccountRef: name: namespace: ldapAuth: identityId: credentialsRef: secretName: # ldap-auth-credentials secretNamespace: # default universalAuth: credentialsRef: secretName: # universal-auth-credentials secretNamespace: # default ``` ```yaml source-secret.yaml theme={"dark"} apiVersion: v1 kind: Secret metadata: name: push-secret-demo namespace: default stringData: # can also be "data", but needs to be base64 encoded API_KEY: some-api-key DATABASE_URL: postgres://127.0.0.1:5432 ENCRYPTION_KEY: fabcc12-a22-facbaa4-11aa568aab ``` ```bash theme={"dark"} kubectl apply -f source-secret.yaml ``` After applying the soruce-secret.yaml file, you are ready to apply the InfisicalPushSecret CRD. ```bash theme={"dark"} kubectl apply -f infisical-push-secret.yaml ``` After applying the InfisicalPushSecret CRD, you should notice that the secrets you have defined in your source-secret.yaml file have been pushed to your specified destination in Infisical. ## InfisicalPushSecret CRD properties If you are fetching secrets from a self-hosted instance of Infisical set the value of `hostAPI` to `https://your-self-hosted-instace.com/api` When `hostAPI` is not defined the operator fetches secrets from Infisical Cloud. If you have installed your Infisical instance within the same cluster as the Infisical operator, you can optionally access the Infisical backend's service directly without having to route through the public internet. To achieve this, use the following address for the hostAPI field: ```bash theme={"dark"} http://..svc.cluster.local:4000/api ``` Make sure to replace `` and `` with the appropriate values for your backend service and namespace. The `resyncInterval` is a string-formatted duration that defines the time between each resync. The field is optional, and will default to no automatic resync if not defined. If you don't want to automatically reconcile the InfisicalPushSecret CRD on an interval, you can remove the `resyncInterval` field entirely from your InfisicalPushSecret CRD. The format of the field is `[duration][unit]` where `duration` is a number and `unit` is a string representing the unit of time. The following units are supported: * `s` for seconds (must be at least 5 seconds) * `m` for minutes * `h` for hours * `d` for days * `w` for weeks The default value is `1m` (1 minute). Valid intervals examples: ```yaml theme={"dark"} resyncInterval: 5s # 10 seconds resyncInterval: 10s # 10 seconds resyncInterval: 5m # 5 minutes resyncInterval: 1h # 1 hour resyncInterval: 1d # 1 day ``` The field is optional and will default to `None` if not defined. The update policy defines how the operator should handle conflicting secrets when pushing secrets to Infisical. Valid values are `None` and `Replace`. Behavior of each policy: * `None`: The operator will not override existing secrets in Infisical. If a secret with the same key already exists, the operator will skip pushing that secret, and the secret will not be managed by the operator. * `Replace`: The operator will replace existing secrets in Infisical with the new secrets. If a secret with the same key already exists, the operator will update the secret with the new value. ```yaml theme={"dark"} spec: updatePolicy: Replace ``` This field is optional and will default to `None` if not defined. The deletion policy defines what the operator should do in case the InfisicalPushSecret CRD is deleted. Valid values are `None` and `Delete`. Behavior of each policy: * `None`: The operator will not delete the secrets in Infisical when the InfisicalPushSecret CRD is deleted. * `Delete`: The operator will delete the secrets in Infisical that are managed by the operator when the InfisicalPushSecret CRD is deleted. ```yaml theme={"dark"} spec: deletionPolicy: Delete ``` The `destination` field is used to specify where you want to create the secrets in Infisical. The required fields are `projectId`, `environmentSlug`, and `secretsPath`. ```yaml theme={"dark"} spec: destination: projectId: environmentSlug: secretsPath: ``` The project ID where you want to create the secrets in Infisical. Please note that you can only use either `projectId` or `projectSlug` in the `destination` field. The project slug where you want to create the secrets in Infisical. Please note that you can only use either `projectId` or `projectSlug` in the `destination` field. The environment slug where you want to create the secrets in Infisical. The path where you want to create the secrets in Infisical. The root path is `/`. The `push` field is used to define what you want to push to Infisical. Currently the operator only supports pushing Kubernetes secrets to Infisical. An example of the `push` field is shown below. The `secret` field is used to define the Kubernetes secret you want to push to Infisical. The required fields are `secretName` and `secretNamespace`. Example usage of the `push.secret` field: ```yaml infisical-push-secret.yaml theme={"dark"} push: secret: secretName: push-secret-demo secretNamespace: default ``` ```yaml push-secret-demo.yaml theme={"dark"} apiVersion: v1 kind: Secret metadata: name: push-secret-demo namespace: default # Pass in the secrets you wish to push to Infisical stringData: API_KEY: some-api-key DATABASE_URL: postgres://127.0.0.1:5432 ENCRYPTION_KEY: fabcc12-a22-facbaa4-11aa568aab ``` The `generators[]` field is used to define the generators you want to use for your InfisicalPushSecret CRD. You can follow the guide for [using generators to push secrets](#using-generators-to-push-secrets) for more information. Example: ```yaml theme={"dark"} push: generators: - destinationSecretName: password-generator-test generatorRef: kind: Password name: password-generator ``` The `authentication` field dictates which authentication method to use when pushing secrets to Infisical. The available authentication methods are `universalAuth`, `kubernetesAuth`, `awsIamAuth`, `azureAuth`, `gcpIdTokenAuth`, and `gcpIamAuth`. The universal authentication method is one of the easiest ways to get started with Infisical. Universal Auth works anywhere and is not tied to any specific cloud provider. [Read more about Universal Auth](/documentation/platform/identities/universal-auth). Valid fields: * `identityId`: The identity ID of the machine identity you created. * `credentialsRef`: The name and namespace of the Kubernetes secret that stores the service token. * `credentialsRef.secretName`: The name of the Kubernetes secret. * `credentialsRef.secretNamespace`: The namespace of the Kubernetes secret. Example: ```yaml theme={"dark"} # infisical-push-secret.yaml spec: universalAuth: credentialsRef: secretName: secretNamespace: ``` ```yaml theme={"dark"} # machine-identity-credentials.yaml apiVersion: v1 kind: Secret metadata: name: universal-auth-credentials type: Opaque stringData: clientId: clientSecret: ``` The Kubernetes machine identity authentication method is used to authenticate with Infisical. The identity ID is stored in a field in the InfisicalPushSecret resource. This authentication method can only be used within a Kubernetes environment. [Read more about Kubernetes Auth](/documentation/platform/identities/kubernetes-auth). Valid fields: * `identityId`: The identity ID of the machine identity you created. * `serviceAccountRef`: The name and namespace of the service account that will be used to authenticate with Infisical. * `serviceAccountRef.name`: The name of the service account. * `serviceAccountRef.namespace`: The namespace of the service account. * `autoCreateServiceAccountToken`: If set to `true`, the operator will automatically create a short-lived service account token on-demand for the service account. Defaults to `false`. * `serviceAccountTokenAudiences`: Optionally specify audience for the service account token. This field is only relevant if you have set `autoCreateServiceAccountToken` to `true`. No audience is specified by default. Example: ```yaml theme={"dark"} spec: kubernetesAuth: identityId: autoCreateServiceAccountToken: true # Automatically creates short-lived service account tokens for the service account. serviceAccountTokenAudiences: - # Optionally specify audience for the service account token. No audience is specified by default. serviceAccountRef: name: namespace: ``` The LDAP machine identity authentication method is used to authenticate with a configured LDAP directory. [Read more about LDAP Auth](/documentation/platform/identities/ldap-auth). Valid fields: * `identityId`: The identity ID of the machine identity you created. * `credentialsRef`: The name and namespace of the Kubernetes secret that stores the LDAP credentials. * `credentialsRef.secretName`: The name of the Kubernetes secret. * `credentialsRef.secretNamespace`: The namespace of the Kubernetes secret. Example: ```yaml theme={"dark"} # infisical-push-secret.yaml spec: ldapAuth: identityId: credentialsRef: secretName: secretNamespace: ``` ```yaml theme={"dark"} # machine-identity-credentials.yaml apiVersion: v1 kind: Secret metadata: name: ldap-auth-credentials type: Opaque stringData: username: password: ``` The AWS IAM machine identity authentication method is used to authenticate with Infisical. [Read more about AWS IAM Auth](/documentation/platform/identities/aws-auth). Valid fields: * `identityId`: The identity ID of the machine identity you created. Example: ```yaml theme={"dark"} spec: authentication: awsIamAuth: identityId: ``` The AWS IAM machine identity authentication method is used to authenticate with Infisical. Azure Auth can only be used from within an Azure environment. [Read more about Azure Auth](/documentation/platform/identities/azure-auth). Valid fields: * `identityId`: The identity ID of the machine identity you created. Example: ```yaml theme={"dark"} spec: authentication: azureAuth: identityId: ``` The GCP IAM machine identity authentication method is used to authenticate with Infisical. The identity ID is stored in a field in the InfisicalPushSecret resource. This authentication method can only be used both within and outside GCP environments. [Read more about Azure Auth](/documentation/platform/identities/gcp-auth). Valid fields: * `identityId`: The identity ID of the machine identity you created. * `serviceAccountKeyFilePath`: The path to the GCP service account key file. Example: ```yaml theme={"dark"} spec: gcpIamAuth: identityId: serviceAccountKeyFilePath: ``` The GCP ID Token machine identity authentication method is used to authenticate with Infisical. The identity ID is stored in a field in the InfisicalPushSecret resource. This authentication method can only be used within GCP environments. [Read more about Azure Auth](/documentation/platform/identities/gcp-auth). Valid fields: * `identityId`: The identity ID of the machine identity you created. Example: ```yaml theme={"dark"} spec: gcpIdTokenAuth: identityId: ``` This block defines the TLS settings to use for connecting to the Infisical instance. Fields: This block defines the reference to the CA certificate to use for connecting to the Infisical instance with SSL/TLS. Valid fields: * `secretName`: The name of the Kubernetes secret containing the CA certificate to use for connecting to the Infisical instance with SSL/TLS. * `secretNamespace`: The namespace of the Kubernetes secret containing the CA certificate to use for connecting to the Infisical instance with SSL/TLS. * `key`: The name of the key in the Kubernetes secret which contains the value of the CA certificate to use for connecting to the Infisical instance with SSL/TLS. Example: ```yaml theme={"dark"} tls: caRef: secretName: custom-ca-certificate secretNamespace: default key: ca.crt ``` ## Using templating to push secrets Pushing secrets to Infisical from the operator may not always be enough. Templating is a useful utility of the Infisical secrets operator that allows you to use Go Templating to template the secrets you want to push to Infisical. Using Go templates, you can format, combine, and create new key-value pairs of secrets that you want to push to Infisical. This property controls what secrets are included in your push to Infisica. When set to `true`, all secrets included in the `push.secret.secretName` Kubernetes secret will be pushed to Infisical. **Use this option when you would like to push all secrets to Infisical from the secrets operator, but want to template a subset of them.** When set to `false`, only secrets defined in the `push.secret.template.data` field of the template will be pushed to Infisical. Use this option when you would like to push **only** a subset of secrets from the Kubernetes secret to Infisical. Define secret keys and their corresponding templates. Each data value uses a Golang template with access to all secrets defined in the `push.secret.secretName` Kubernetes secret. Secrets are structured as follows: ```go theme={"dark"} type TemplateSecret struct { Value string `json:"value"` SecretPath string `json:"secretPath"` } ``` #### Example template configuration: ```yaml theme={"dark"} # This example assumes that the `push-secret-demo` Kubernetes secret contains the following secrets: # SITE_URL = "https://example.com" # REGION = "us-east-1" # OTHER_SECRET = "other-secret" push: secret: secretName: push-secret-demo secretNamespace: default template: includeAllSecrets: true # Includes all secrets from the `push-secret-demo` Kubernetes secret data: SITE_URL: "{{ .SITE_URL.Value }}" API_URL: "https://api.{{.SITE_URL.Value}}.{{.REGION.Value}}.com" # Will create a new secret in Infisical with the key `API_URL` with the value of the `SITE_URL` and `REGION` secrets ``` To help transform your config map data further, the operator provides a set of built-in functions that you can use in your templates. ### Available templating functions Please refer to the [templating functions documentation](/integrations/platforms/kubernetes/overview#available-helper-functions) for more information. ## Using generators to push secrets Generators allow secrets to be dynamically generated during each reconciliation cycle and then pushed to Infisical. They are useful for use cases where a new secret value is needed on every sync, such as ephemeral credentials or one-time-use tokens. A generator is defined as a custom resource (`ClusterGenerator`) within the cluster, which specifies the logic for generating secret values. Generators are stateless, each invocation triggers the creation of a new set of values, with no tracking or persistence of previously generated data. Because of this behavior, you may want to disable automatic syncing for the `InfisicalPushSecret` resource to avoid continuous regeneration of secrets. This can be done by omitting the `resyncInterval` field from the InfisicalPushSecret CRD. ### Example usage ```yaml theme={"dark"} push: secret: secretName: push-secret-source-secret secretNamespace: dev generators: - destinationSecretName: password-generator # Name of the secret that will be created in Infisical generatorRef: kind: Password # Kind of the resource, must match the generator kind. name: custom-generator # Name of the generator resource ``` To use a generator, you must specify at least one generator in the `push.generators[]` field. This field holds an array of the generators you want to use for your InfisicalPushSecret CRD. The name of the secret that will be created in Infisical. The reference to the generator resource. Valid fields: * `kind`: The kind of the generator resource, must match the generator kind. * `name`: The name of the generator resource. The kind of the generator resource, must match the generator kind. Valid values: * `Password` * `UUID` The name of the generator resource. ### Supported Generators Below are the currently supported generators for the InfisicalPushSecret CRD. Each generator is a `ClusterGenerator` custom resource that can be used to customize the generated secret. ### Password Generator The Password generator is a custom resource that is installed on the cluster that defines the logic for generating a password. * `kind`: The kind of the generator resource, must match the generator kind. For the Password generator, the kind is `Password`. * `generator.passwordSpec`: The spec of the password generator. The `generator.kind` field must match the kind of the generator resource. For the Password generator, the kind should always be set to `Password`. * `length`: The length of the password. * `digits`: The number of digits in the password. * `symbols`: The number of symbols in the password. * `symbolCharacters`: The characters to use for the symbols in the password. * `noUpper`: Whether to include uppercase letters in the password. * `allowRepeat`: Whether to allow repeating characters in the password. ```yaml password-cluster-generator.yaml theme={"dark"} apiVersion: secrets.infisical.com/v1alpha1 kind: ClusterGenerator metadata: name: password-generator spec: kind: Password generator: passwordSpec: length: 10 digits: 5 symbols: 5 symbolCharacters: "-_$@" noUpper: false allowRepeat: true ``` Example InfisicalPushSecret CRD using the Password generator: ```yaml infisical-push-secret-crd.yaml theme={"dark"} push: generators: - destinationSecretName: password-generator-test generatorRef: kind: Password name: password-generator ``` ### UUID Generator The UUID generator is a custom resource that is installed on the cluster that defines the logic for generating a UUID. * `kind`: The kind of the generator resource, must match the generator kind. For the UUID generator, the kind is `UUID`. * `generator.uuidSpec`: The spec of the UUID generator. For UUID's, this can be left empty. The `generator.kind` field must match the kind of the generator resource. For the UUID generator, the kind should always be set to `UUID`. The spec of the UUID generator. For UUID's, this can be left empty. ```yaml uuid-cluster-generator.yaml theme={"dark"} apiVersion: secrets.infisical.com/v1alpha1 kind: ClusterGenerator metadata: name: uuid-generator spec: kind: UUID generator: uuidSpec: ``` Example InfisicalPushSecret CRD using the UUID generator: ```yaml infisical-push-secret-crd.yaml theme={"dark"} push: generators: - destinationSecretName: uuid-generator-test generatorRef: kind: UUID name: uuid-generator ``` ## Applying the InfisicalPushSecret CRD to your cluster Once you have configured the `InfisicalPushSecret` CRD with the required fields, you can apply it to your cluster. After applying, you should notice that the secrets have been pushed to Infisical. ```bash theme={"dark"} kubectl apply -f source-push-secret.yaml # The secret that you're referencing in the InfisicalPushSecret CRD push.secret field kubectl apply -f example-infisical-push-secret-crd.yaml # The InfisicalPushSecret CRD itself ``` --- # Source: https://infisical.com/docs/integrations/platforms/kubernetes/infisical-secret-crd.md > ## Documentation Index > Fetch the complete documentation index at: https://infisical.com/docs/llms.txt > Use this file to discover all available pages before exploring further. # Using the InfisicalSecret CRD > Learn how to use the InfisicalSecret CRD to fetch secrets from Infisical and store them as native Kubernetes secret resource Once you have installed the operator to your cluster, you'll need to create a `InfisicalSecret` custom resource definition (CRD). In this CRD, you'll define the authentication method to use, the secrets to fetch, and the target location to store the secrets within your cluster. ```yaml example-infisical-secret-crd.yaml theme={"dark"} apiVersion: secrets.infisical.com/v1alpha1 kind: InfisicalSecret metadata: name: infisicalsecret-sample labels: label-to-be-passed-to-managed-secret: sample-value annotations: example.com/annotation-to-be-passed-to-managed-secret: "sample-value" spec: hostAPI: https://app.infisical.com/api resyncInterval: 10 authentication: kubernetesAuth: identityId: serviceAccountRef: name: namespace: managedKubeSecretReferences: - secretName: managed-secret secretNamespace: default creationPolicy: "Orphan" template: includeAllSecrets: true data: NEW_KEY_NAME: "{{ .KEY.SecretPath }} {{ .KEY.Value }}" KEY_WITH_BINARY_VALUE: "{{ .KEY.SecretPath }} {{ .KEY.Value }}" ``` ## CRD properties ### Generic The following properties help define what instance of Infisical the operator will interact with, the interval it will sync secrets and any CA certificates that may be required to connect. If you are fetching secrets from a self-hosted instance of Infisical set the value of `hostAPI` to ` https://your-self-hosted-instace.com/api` When `hostAPI` is not defined the operator fetches secrets from Infisical Cloud. If you have installed your Infisical instance within the same cluster as the Infisical operator, you can optionally access the Infisical backend's service directly without having to route through the public internet. To achieve this, use the following address for the hostAPI field: ```bash theme={"dark"} http://..svc.cluster.local:4000/api ``` Make sure to replace `` and `` with the appropriate values for your backend service and namespace. This property defines the time in seconds between each secret re-sync from Infisical. Shorter time between re-syncs will require higher rate limits only available on paid plans. Default re-sync interval is every 1 minute. This property enables instant updates from Infisical. When set to true, changes made to secrets in Infisical will be immediately pushed to the operator, triggering a configuration update. This reduces the need for periodic re-syncs. Note that `Instant Updates` is a paid feature. If you're using Infisical Cloud, then it is available under the **Pro**, and **Enterprise Tier** with varying retention periods. If you're self-hosting Infisical, then you should contact [sales@infisical.com](mailto:sales@infisical.com) to purchase an enterprise license to use it. This block defines the TLS settings to use for connecting to the Infisical instance. This block defines the reference to the CA certificate to use for connecting to the Infisical instance with SSL/TLS. The name of the Kubernetes secret containing the CA certificate to use for connecting to the Infisical instance with SSL/TLS. The namespace of the Kubernetes secret containing the CA certificate to use for connecting to the Infisical instance with SSL/TLS. The name of the key in the Kubernetes secret which contains the value of the CA certificate to use for connecting to the Infisical instance with SSL/TLS. ### Authentication Methods To retrieve the requested secrets, the operator must first authenticate with Infisical. The list of available authentication methods are shown below. The universal machine identity authentication method is used to authenticate with Infisical. The client ID and client secret needs to be stored in a Kubernetes secret. This block defines the reference to the name and namespace of secret that stores these credentials. You need to create a machine identity, and give it access to the project(s) you want to interact with. You can [read more about machine identities here](/documentation/platform/identities/universal-auth). Once you have created your machine identity and added it to your project(s), you will need to create a Kubernetes secret containing the identity credentials. To quickly create a Kubernetes secret containing the identity credentials, you can run the command below. Make sure you replace `` with the identity client ID and `` with the identity client secret. ```bash theme={"dark"} kubectl create secret generic universal-auth-credentials --from-literal=clientId="" --from-literal=clientSecret="" ``` Once the secret is created, add the `secretName` and `secretNamespace` of the secret that was just created under `authentication.universalAuth.credentialsRef` field in the InfisicalSecret resource. Make sure to also populate the `secretsScope` field with the project slug *`projectSlug`*, environment slug *`envSlug`*, and secrets path *`secretsPath`* that you want to fetch secrets from. Please see the example below. ## Example ```yaml theme={"dark"} apiVersion: secrets.infisical.com/v1alpha1 kind: InfisicalSecret metadata: name: infisicalsecret-sample-crd spec: authentication: universalAuth: secretsScope: # either projectSlug or projectId is required projectSlug: # <-- project slug projectId: # <-- project id secretName: # OPTIONAL: If you want to fetch a single Infisical secret, you can specify the secret name here. If not specified, all secrets in the specified scope will be fetched. envSlug: # "dev", "staging", "prod", etc.. secretsPath: "" # Root is "/" credentialsRef: secretName: universal-auth-credentials # <-- name of the Kubernetes secret that stores our machine identity credentials secretNamespace: default # <-- namespace of the Kubernetes secret that stores our machine identity credentials ... ``` The Kubernetes machine identity authentication method is used to authenticate with Infisical. The identity ID is stored in a field in the InfisicalSecret resource. This authentication method can only be used within a Kubernetes environment. Short-lived service account tokens are automatically created by the operator and are valid only for a short period of time. This is the recommended approach for using Kubernetes auth in the Infisical Secrets Operator. **1.1.** Start by creating a reviewer service account in your Kubernetes cluster that will be used by Infisical to authenticate with the Kubernetes API Server. ```yaml infisical-reviewer-service-account.yaml theme={"dark"} apiVersion: v1 kind: ServiceAccount metadata: name: infisical-token-reviewer namespace: default ``` ```bash theme={"dark"} kubectl apply -f infisical-reviewer-service-account.yaml ``` **1.2.** Bind the reviewer service account to the `system:auth-delegator` cluster role. As described [here](https://kubernetes.io/docs/reference/access-authn-authz/rbac/#other-component-roles), this role allows delegated authentication and authorization checks, specifically for Infisical to access the [TokenReview API](https://kubernetes.io/docs/reference/kubernetes-api/authentication-resources/token-review-v1/). You can apply the following configuration file: ```yaml infisical-reviewer-cluster-role-binding.yaml theme={"dark"} apiVersion: rbac.authorization.k8s.io/v1 kind: ClusterRoleBinding metadata: name: infisical-token-reviewer-role-binding namespace: default roleRef: apiGroup: rbac.authorization.k8s.io kind: ClusterRole name: system:auth-delegator subjects: - kind: ServiceAccount name: infisical-token-reviewer namespace: default ``` ```bash theme={"dark"} kubectl apply -f infisical-reviewer-cluster-role-binding.yaml ``` **1.3.** Next, create a long-lived service account JWT token (i.e. the token reviewer JWT token) for the service account using this configuration file for a new `Secret` resource: ```yaml service-account-reviewer-token.yaml theme={"dark"} apiVersion: v1 kind: Secret type: kubernetes.io/service-account-token metadata: name: infisical-token-reviewer-token annotations: kubernetes.io/service-account.name: "infisical-token-reviewer" ``` ```bash theme={"dark"} kubectl apply -f service-account-reviewer-token.yaml ``` **1.4.** Link the secret in step 1.3 to the service account in step 1.1: ```bash theme={"dark"} kubectl patch serviceaccount infisical-token-reviewer -p '{"secrets": [{"name": "infisical-token-reviewer-token"}]}' -n default ``` **1.5.** Finally, retrieve the token reviewer JWT token from the secret. ```bash theme={"dark"} kubectl get secret infisical-token-reviewer-token -n default -o=jsonpath='{.data.token}' | base64 --decode ``` Keep this JWT token handy as you will need it for the **Token Reviewer JWT** field when configuring the Kubernetes Auth authentication method for the identity in step 2. To create an identity, head to your Organization Settings > Access Control > Identities and press **Create identity**. identities organization When creating an identity, you specify an organization level [role](/documentation/platform/access-controls/role-based-access-controls) for it to assume; you can configure roles in Organization Settings > Access Control > Organization Roles. identities organization create Now input a few details for your new identity. Here's some guidance for each field: * Name (required): A friendly name for the identity. * Role (required): A role from the **Organization Roles** tab for the identity to assume. The organization role assigned will determine what organization level resources this identity can have access to. Once you've created an identity, you'll be prompted to configure the authentication method for it. Here, select **Kubernetes Auth**. To learn more about each field of the Kubernetes native authentication method, see step 2 of [guide](/documentation/platform/identities/kubernetes-auth#guide). identities organization create auth method To allow the operator to use the given identity to access secrets, you will need to add the identity to project(s) that you would like to grant it access to. To do this, head over to the project you want to add the identity to and go to Project Settings > Access Control > Machine Identities and press **Add identity**. Next, select the identity you want to add to the project and the project level role you want to allow it to assume. The project role assigned will determine what project level resources this identity can have access to. identities project identities project create You have already created the reviewer service account in step **1.1**. Now, create a new Kubernetes service account that will be used to authenticate with Infisical. This service account will create short-lived tokens that will be used to authenticate with Infisical. The operator itself will handle the creation of these tokens automatically. ```yaml infisical-service-account.yaml theme={"dark"} kind: ServiceAccount apiVersion: v1 metadata: name: infisical-service-account ``` ```bash theme={"dark"} kubectl apply -f infisical-service-account.yaml -n default ``` Once you have created your machine identity and added it to your project(s), you will need to add the identity ID to your InfisicalSecret resource. In the `authentication.kubernetesAuth.identityId` field, add the identity ID of the machine identity you created. See the example below for more details. Add the service account details from the previous steps under `authentication.kubernetesAuth.serviceAccountRef`. Here you will need to enter the name and namespace of the service account. The example below shows a complete InfisicalSecret resource with all required fields defined. Make sure you set `authentication.kubernetesAuth.autoCreateServiceAccountToken` to `true` to automatically create short-lived service account tokens for the service account. Make sure to also populate the `secretsScope` field with the project slug *`projectSlug`*, environment slug *`envSlug`*, and secrets path *`secretsPath`* that you want to fetch secrets from. Please see the example below. ## Example ```yaml example-kubernetes-auth.yaml theme={"dark"} apiVersion: secrets.infisical.com/v1alpha1 kind: InfisicalSecret metadata: name: infisicalsecret-sample-crd spec: authentication: kubernetesAuth: identityId: autoCreateServiceAccountToken: true # Automatically creates short-lived service account tokens for the service account. serviceAccountTokenAudiences: - # Optionally specify audience for the service account token. No audience is specified by default. serviceAccountRef: name: infisical-service-account # The service account we just created in the previous step. namespace: # secretsScope is identical to the secrets scope in the universalAuth field in this sample. secretsScope: projectSlug: your-project-slug envSlug: prod secretsPath: "/path" secretName: # OPTIONAL: If you want to fetch a single Infisical secret, you can specify the secret name here. If not specified, all secrets in the specified scope will be fetched. recursive: true ... ``` Manual long-lived service account tokens are manually created by the user and are valid indefinitely unless deleted or rotated. In most cases, you should be using the automatic short-lived service account tokens as they are more secure and easier to use. **1.1.** Start by creating a reviewer service account in your Kubernetes cluster that will be used by Infisical to authenticate with the Kubernetes API Server. ```yaml infisical-reviewer-service-account.yaml theme={"dark"} apiVersion: v1 kind: ServiceAccount metadata: name: infisical-token-reviewer namespace: default ``` ```bash theme={"dark"} kubectl apply -f infisical-reviewer-service-account.yaml ``` **1.2.** Bind the reviewer service account to the `system:auth-delegator` cluster role. As described [here](https://kubernetes.io/docs/reference/access-authn-authz/rbac/#other-component-roles), this role allows delegated authentication and authorization checks, specifically for Infisical to access the [TokenReview API](https://kubernetes.io/docs/reference/kubernetes-api/authentication-resources/token-review-v1/). You can apply the following configuration file: ```yaml infisical-reviewer-cluster-role-binding.yaml theme={"dark"} apiVersion: rbac.authorization.k8s.io/v1 kind: ClusterRoleBinding metadata: name: infisical-token-reviewer-role-binding namespace: default roleRef: apiGroup: rbac.authorization.k8s.io kind: ClusterRole name: system:auth-delegator subjects: - kind: ServiceAccount name: infisical-token-reviewer namespace: default ``` ```bash theme={"dark"} kubectl apply -f infisical-reviewer-cluster-role-binding.yaml ``` **1.3.** Next, create a long-lived service account JWT token (i.e. the token reviewer JWT token) for the service account using this configuration file for a new `Secret` resource: ```yaml service-account-reviewer-token.yaml theme={"dark"} apiVersion: v1 kind: Secret type: kubernetes.io/service-account-token metadata: name: infisical-token-reviewer-token annotations: kubernetes.io/service-account.name: "infisical-token-reviewer" ``` ```bash theme={"dark"} kubectl apply -f service-account-reviewer-token.yaml ``` **1.4.** Link the secret in step 1.3 to the service account in step 1.1: ```bash theme={"dark"} kubectl patch serviceaccount infisical-token-reviewer -p '{"secrets": [{"name": "infisical-token-reviewer-token"}]}' -n default ``` **1.5.** Finally, retrieve the token reviewer JWT token from the secret. ```bash theme={"dark"} kubectl get secret infisical-token-reviewer-token -n default -o=jsonpath='{.data.token}' | base64 --decode ``` Keep this JWT token handy as you will need it for the **Token Reviewer JWT** field when configuring the Kubernetes Auth authentication method for the identity in step 2. To create an identity, head to your Organization Settings > Access Control > Identities and press **Create identity**. identities organization When creating an identity, you specify an organization level [role](/documentation/platform/access-controls/role-based-access-controls) for it to assume; you can configure roles in Organization Settings > Access Control > Organization Roles. identities organization create Now input a few details for your new identity. Here's some guidance for each field: * Name (required): A friendly name for the identity. * Role (required): A role from the **Organization Roles** tab for the identity to assume. The organization role assigned will determine what organization level resources this identity can have access to. Once you've created an identity, you'll be prompted to configure the authentication method for it. Here, select **Kubernetes Auth**. To learn more about each field of the Kubernetes native authentication method, see step 2 of [guide](/documentation/platform/identities/kubernetes-auth#guide). identities organization create auth method To allow the operator to use the given identity to access secrets, you will need to add the identity to project(s) that you would like to grant it access to. To do this, head over to the project you want to add the identity to and go to Project Settings > Access Control > Machine Identities and press **Add identity**. Next, select the identity you want to add to the project and the project level role you want to allow it to assume. The project role assigned will determine what project level resources this identity can have access to. identities project identities project create You have already created the reviewer service account in step **1.1**. Now, create a new Kubernetes service account that will be used to authenticate with Infisical. ```yaml infisical-service-account.yaml theme={"dark"} kind: ServiceAccount apiVersion: v1 metadata: name: infisical-service-account ``` ```bash theme={"dark"} kubectl apply -f infisical-service-account.yaml -n default ``` Create a service account token for the newly created Kubernetes service account from the previous step. ```yaml infisical-service-account-token.yaml theme={"dark"} apiVersion: v1 kind: Secret type: kubernetes.io/service-account-token metadata: name: infisical-service-account-token annotations: kubernetes.io/service-account.name: "infisical-service-account" ``` ```bash theme={"dark"} kubectl apply -f infisical-service-account-token.yaml -n default ``` Patch the service account with the newly created service account token. ```bash theme={"dark"} kubectl patch serviceaccount infisical-service-account -p '{"secrets": [{"name": "infisical-service-account-token"}]}' -n default ``` Once you have created your machine identity and added it to your project(s), you will need to add the identity ID to your InfisicalSecret resource. In the `authentication.kubernetesAuth.identityId` field, add the identity ID of the machine identity you created. See the example below for more details. Add the service account details from the previous steps under `authentication.kubernetesAuth.serviceAccountRef`. Here you will need to enter the name and namespace of the service account. The example below shows a complete InfisicalSecret resource with all required fields defined. Make sure to also populate the `secretsScope` field with the project slug *`projectSlug`*, or project ID *`projectId`*, environment slug *`envSlug`*, and secrets path *`secretsPath`* that you want to fetch secrets from. Please see the example below. Please note that you can only use either `projectSlug` or `projectId` in the `secretsScope` field. ## Example ```yaml example-kubernetes-auth.yaml theme={"dark"} apiVersion: secrets.infisical.com/v1alpha1 kind: InfisicalSecret metadata: name: infisicalsecret-sample-crd spec: authentication: kubernetesAuth: identityId: serviceAccountRef: name: infisical-service-account # The service account we just created in the previous step. (*not* the reviewer service account) namespace: # secretsScope is identical to the secrets scope in the universalAuth field in this sample. secretsScope: projectSlug: your-project-slug envSlug: prod secretsPath: "/path" secretName: # OPTIONAL: If you want to fetch a single Infisical secret, you can specify the secret name here. If not specified, all secrets in the specified scope will be fetched. recursive: true ... ``` The AWS IAM machine identity authentication method is used to authenticate with Infisical. The identity ID is stored in a field in the InfisicalSecret resource. This authentication method can only be used within an AWS environment like an EC2 or a Lambda function. You need to create a machine identity, and give it access to the project(s) you want to interact with. You can [read more about AWS machine identities here](/documentation/platform/identities/aws-auth). Once you have created your machine identity and added it to your project(s), you will need to add the identity ID to your InfisicalSecret resource. In the `authentication.awsIamAuth.identityId` field, add the identity ID of the machine identity you created. See the example below for more details. Make sure to also populate the `secretsScope` field with the project slug *`projectSlug`*, or project ID *`projectId`*, environment slug *`envSlug`*, and secrets path *`secretsPath`* that you want to fetch secrets from. Please see the example below. Please note that you can only use either `projectSlug` or `projectId` in the `secretsScope` field. ## Example ```yaml example-aws-iam-auth.yaml theme={"dark"} apiVersion: secrets.infisical.com/v1alpha1 kind: InfisicalSecret metadata: name: infisicalsecret-sample-crd spec: authentication: awsIamAuth: identityId: # secretsScope is identical to the secrets scope in the universalAuth field in this sample. secretsScope: projectSlug: your-project-slug envSlug: prod secretsPath: "/path" secretName: # OPTIONAL: If you want to fetch a single Infisical secret, you can specify the secret name here. If not specified, all secrets in the specified scope will be fetched. recursive: true ... ``` The Azure machine identity authentication method is used to authenticate with Infisical. The identity ID is stored in a field in the InfisicalSecret resource. This authentication method can only be used within an Azure environment. You need to create a machine identity, and give it access to the project(s) you want to interact with. You can [read more about Azure machine identities here](/documentation/platform/identities/azure-auth). Once you have created your machine identity and added it to your project(s), you will need to add the identity ID to your InfisicalSecret resource. In the `authentication.azureAuth.identityId` field, add the identity ID of the machine identity you created. See the example below for more details. Make sure to also populate the `secretsScope` field with the project slug *`projectSlug`*, or project ID *`projectId`*, environment slug *`envSlug`*, and secrets path *`secretsPath`* that you want to fetch secrets from. Please see the example below. Please note that you can only use either `projectSlug` or `projectId` in the `secretsScope` field. ## Example ```yaml example-azure-auth.yaml theme={"dark"} apiVersion: secrets.infisical.com/v1alpha1 kind: InfisicalSecret metadata: name: infisicalsecret-sample-crd spec: authentication: azureAuth: identityId: # secretsScope is identical to the secrets scope in the universalAuth field in this sample. secretsScope: projectSlug: your-project-slug envSlug: prod secretsPath: "/path" secretName: # OPTIONAL: If you want to fetch a single Infisical secret, you can specify the secret name here. If not specified, all secrets in the specified scope will be fetched. recursive: true ... ``` The GCP ID Token machine identity authentication method is used to authenticate with Infisical. The identity ID is stored in a field in the InfisicalSecret resource. This authentication method can only be used within GCP environments. You need to create a machine identity, and give it access to the project(s) you want to interact with. You can [read more about GCP machine identities here](/documentation/platform/identities/gcp-auth). Once you have created your machine identity and added it to your project(s), you will need to add the identity ID to your InfisicalSecret resource. In the `authentication.gcpIdTokenAuth.identityId` field, add the identity ID of the machine identity you created. See the example below for more details. Make sure to also populate the `secretsScope` field with the project slug *`projectSlug`*, or project ID *`projectId`*, environment slug *`envSlug`*, and secrets path *`secretsPath`* that you want to fetch secrets from. Please see the example below. Please note that you can only use either `projectSlug` or `projectId` in the `secretsScope` field. ## Example ```yaml example-gcp-id-token-auth.yaml theme={"dark"} apiVersion: secrets.infisical.com/v1alpha1 kind: InfisicalSecret metadata: name: infisicalsecret-sample-crd spec: authentication: gcpIdTokenAuth: identityId: # secretsScope is identical to the secrets scope in the universalAuth field in this sample. secretsScope: projectSlug: your-project-slug envSlug: prod secretsPath: "/path" secretName: # OPTIONAL: If you want to fetch a single Infisical secret, you can specify the secret name here. If not specified, all secrets in the specified scope will be fetched. recursive: true ... ``` The GCP IAM machine identity authentication method is used to authenticate with Infisical. The identity ID is stored in a field in the InfisicalSecret resource. This authentication method can only be used both within and outside GCP environments. You need to create a machine identity, and give it access to the project(s) you want to interact with. You can [read more about GCP machine identities here](/documentation/platform/identities/gcp-auth). Once you have created your machine identity and added it to your project(s), you will need to add the identity ID to your InfisicalSecret resource. In the `authentication.gcpIamAuth.identityId` field, add the identity ID of the machine identity you created. You'll also need to add the service account key file path to your InfisicalSecret resource. In the `authentication.gcpIamAuth.serviceAccountKeyFilePath` field, add the path to your service account key file path. Please see the example below for more details. Make sure to also populate the `secretsScope` field with the project slug *`projectSlug`*, or project ID *`projectId`*, environment slug *`envSlug`*, and secrets path *`secretsPath`* that you want to fetch secrets from. Please see the example below. Please note that you can only use either `projectSlug` or `projectId` in the `secretsScope` field. ## Example ```yaml example-gcp-id-token-auth.yaml theme={"dark"} apiVersion: secrets.infisical.com/v1alpha1 kind: InfisicalSecret metadata: name: infisicalsecret-sample-crd spec: authentication: gcpIamAuth: identityId: serviceAccountKeyFilePath: "/path/to-service-account-key-file-path.json" # secretsScope is identical to the secrets scope in the universalAuth field in this sample. secretsScope: projectSlug: your-project-slug envSlug: prod secretsPath: "/path" secretName: # OPTIONAL: If you want to fetch a single Infisical secret, you can specify the secret name here. If not specified, all secrets in the specified scope will be fetched. recursive: true ... ``` The LDAP machine identity authentication method is used to authenticate with Infisical using the configured LDAP directory. The username and password needs to be stored in a Kubernetes secret. This block defines the reference to the name and namespace of secret that stores these credentials. You need to create a machine identity, and give it access to the project(s) you want to interact with. You can [read more about machine identities here](/documentation/platform/identities/universal-auth). Once you have created your machine identity and added it to your project(s), you will need to create a Kubernetes secret containing the identity credentials. To quickly create a Kubernetes secret containing the identity credentials, you can run the command below. Make sure you replace `` with the identity LDAP username and `` with the identity LDAP password. ```bash theme={"dark"} kubectl create secret generic ldap-auth-credentials --from-literal=username="" --from-literal=password="" ``` Once the secret is created, add the `secretName` and `secretNamespace` of the secret that was just created under `authentication.ldapAuth.credentialsRef` field in the InfisicalSecret resource. Make sure to also populate the `secretsScope` field with the project slug *`projectSlug`*, or project ID *`projectId`*, environment slug *`envSlug`*, and secrets path *`secretsPath`* that you want to fetch secrets from. Please see the example below. Please note that you can only use either `projectSlug` or `projectId` in the `secretsScope` field. ## Example ```yaml theme={"dark"} apiVersion: secrets.infisical.com/v1alpha1 kind: InfisicalSecret metadata: name: infisicalsecret-sample-crd spec: authentication: ldapAuth: secretsScope: projectSlug: # <-- project slug envSlug: # "dev", "staging", "prod", etc.. secretsPath: "" # Root is "/" secretName: # OPTIONAL: If you want to fetch a single Infisical secret, you can specify the secret name here. If not specified, all secrets in the specified scope will be fetched. identityId: credentialsRef: secretName: ldap-auth-credentials # <-- name of the Kubernetes secret that stores our machine identity credentials secretNamespace: default # <-- namespace of the Kubernetes secret that stores our machine identity credentials ``` The service token required to authenticate with Infisical needs to be stored in a Kubernetes secret. This block defines the reference to the name and namespace of secret that stores this service token. Follow the instructions below to create and store the service token in a Kubernetes secrets and reference it in your CRD. #### 1. Generate service token You can generate a [service token](/documentation/platform/token) for an Infisical project by heading over to the Infisical dashboard then to Project Settings. #### 2. Create Kubernetes secret containing service token Once you have generated the service token, you will need to create a Kubernetes secret containing the service token you generated. To quickly create a Kubernetes secret containing the generated service token, you can run the command below. Make sure you replace `` with your service token. ```bash theme={"dark"} kubectl create secret generic service-token --from-literal=infisicalToken="" ``` #### 3. Add reference for the Kubernetes secret containing service token Once the secret is created, add the name and namespace of the secret that was just created under `authentication.serviceToken.serviceTokenSecretReference` field in the InfisicalSecret resource. {" "} Make sure to also populate the `secretsScope` field with the, environment slug *`envSlug`*, and secrets path *`secretsPath`* that you want to fetch secrets from. Please see the example below. ## Example ```yaml theme={"dark"} apiVersion: secrets.infisical.com/v1alpha1 kind: InfisicalSecret metadata: name: infisicalsecret-sample-crd spec: authentication: serviceToken: serviceTokenSecretReference: secretName: service-token # <-- name of the Kubernetes secret that stores our service token secretNamespace: option # <-- namespace of the Kubernetes secret that stores our service token secretsScope: envSlug: # "dev", "staging", "prod", etc.. secretsPath: # Root is "/" ... ``` ### Operator Managed Secrets The managed secret properties specify where to store the secrets retrieved from your Infisical project. This includes defining the name and namespace of the Kubernetes secret that will hold these secrets. The Infisical operator will automatically create the Kubernetes secret in the specified name/namespace and ensure it stays up-to-date. The `managedSecretReference` field is deprecated and will be removed in a future release. Replace it with `managedKubeSecretReferences`, which now accepts an array of references to support multiple managed secrets in a single InfisicalSecret CRD. Example: ```yaml theme={"dark"} managedKubeSecretReferences: - secretName: managed-secret secretNamespace: default creationPolicy: "Orphan" ``` The name of the managed Kubernetes secret to be created The namespace of the managed Kubernetes secret to be created. Override the default Opaque type for managed secrets with this field. Useful for creating kubernetes.io/dockerconfigjson secrets. Creation policies allow you to control whether or not owner references should be added to the managed Kubernetes secret that is generated by the Infisical operator. This is useful for tools such as ArgoCD, where every resource requires an owner reference; otherwise, it will be pruned automatically. #### Available options * `Orphan` (default) * `Owner` When creation policy is set to `Owner`, the `InfisicalSecret` CRD must be in the same namespace as where the managed kubernetes secret. #### Managed Secret Templating Fetching secrets from Infisical as is via the operator may not be enough. This is where templating functionality may be helpful. Using Go templates, you can format, combine, and create new key-value pairs from secrets fetched from Infisical before storing them as Kubernetes Secrets. This property controls what secrets are included in your managed secret when using templates. When set to `true`, all secrets fetched from your Infisical project will be added into your managed Kubernetes secret resource. **Use this option when you would like to sync all secrets from Infisical to Kubernetes but want to template a subset of them.** When set to `false`, only secrets defined in the `managedKubeSecretReferences[].template.data` field of the template will be included in the managed secret. Use this option when you would like to sync **only** a subset of secrets from Infisical to Kubernetes. Define secret keys and their corresponding templates. Each data value uses a Golang template with access to all secrets retrieved from the specified scope. Secrets are structured as follows: ```golang theme={"dark"} type TemplateSecret struct { Value string `json:"value"` SecretPath string `json:"secretPath"` } ``` #### Example template configuration: ```yaml theme={"dark"} managedKubeSecretReferences: - secretName: managed-secret secretNamespace: default template: includeAllSecrets: true data: # Create new secret key that doesn't exist in your Infisical project using values of other secrets NEW_KEY: "{{ .DB_PASSWORD.Value }}" # Override an existing secret key in Infisical project with a new value using values of other secrets API_URL: "https://api.{{.COMPANY_NAME.Value}}.{{.REGION.Value}}.com" ``` For this example, let's assume the following secrets exist in your Infisical project: ``` DB_PASSWORD = "secret123" COMPANY_NAME = "acme" REGION = "us-east-1" API_URL = "old-url" # This will be overridden ``` The resulting managed Kubernetes secret will then contain: ``` # Original secrets (from includeAllSecrets: true) DB_PASSWORD = "secret123" COMPANY_NAME = "acme" REGION = "us-east-1" # New and overridden templated secrets NEW_KEY = "secret123" # New secret created from template API_URL = "https://api.acme.us-east-1.com" # Existing secret overridden by template ``` To help transform your secrets further, the operator provides a set of built-in functions that you can use in your templates. ### Available templating functions Please refer to the [templating functions documentation](/integrations/platforms/kubernetes/overview#available-helper-functions) for more information. Define custom labels and annotations for the managed Kubernetes secret. This allows you to specify metadata that should be applied to the managed secret separately from the InfisicalSecret itself. For detailed information on how metadata propagation works and examples, see the [Propagating Labels & Annotations](#propagating-labels-&-annotations) section. ### Operator Managed ConfigMaps The managed config map properties specify where to store the secrets retrieved from your Infisical project. Config maps can be used to store **non-sensitive** data, such as application configuration variables. The properties includes defining the name and namespace of the Kubernetes config map that will hold the data retrieved from your Infisical project. The Infisical operator will automatically create the Kubernetes config map in the specified name/namespace and ensure it stays up-to-date. If a config map already exists in the specified namespace, the operator will update the existing config map with the new data. The usage of config maps is only intended for storing non-sensitive data. If you are looking to store sensitive data, please use the [managed secret](#operator-managed-secrets) property instead. The name of the managed Kubernetes config map that your Infisical data will be stored in. The namespace of the managed Kubernetes config map that your Infisical data will be stored in. Creation policies allow you to control whether or not owner references should be added to the managed Kubernetes config map that is generated by the Infisical operator. This is useful for tools such as ArgoCD, where every resource requires an owner reference; otherwise, it will be pruned automatically. #### Available options * `Orphan` (default) * `Owner` When creation policy is set to `Owner`, the `InfisicalSecret` CRD must be in the same namespace as where the managed kubernetes config map. #### Managed ConfigMap Templating Fetching secrets from Infisical as is via the operator may not be enough. This is where templating functionality may be helpful. Using Go templates, you can format, combine, and create new key-value pairs from secrets fetched from Infisical before storing them as Kubernetes Config Maps. This property controls what secrets are included in your managed config map when using templates. When set to `true`, all secrets fetched from your Infisical project will be added into your managed Kubernetes config map resource. **Use this option when you would like to sync all secrets from Infisical to Kubernetes but want to template a subset of them.** When set to `false`, only secrets defined in the `managedKubeConfigMapReferences[].template.data` field of the template will be included in the managed config map. Use this option when you would like to sync **only** a subset of secrets from Infisical to Kubernetes. Define secret keys and their corresponding templates. Each data value uses a Golang template with access to all secrets retrieved from the specified scope. Secrets are structured as follows: ```golang theme={"dark"} type TemplateSecret struct { Value string `json:"value"` SecretPath string `json:"secretPath"` } ``` #### Example template configuration: ```yaml theme={"dark"} managedKubeConfigMapReferences: - configMapName: managed-configmap configMapNamespace: default template: includeAllSecrets: true data: # Create new key that doesn't exist in your Infisical project using values of other secrets SITE_URL: "{{ .SITE_URL.Value }}" # Override an existing key in Infisical project with a new value using values of other secrets API_URL: "https://api.{{.SITE_URL.Value}}.{{.REGION.Value}}.com" ``` For this example, let's assume the following secrets exist in your Infisical project: ``` SITE_URL = "https://example.com" REGION = "us-east-1" API_URL = "old-url" # This will be overridden ``` The resulting managed Kubernetes config map will then contain: ``` # Original config map data (from includeAllSecrets: true) SITE_URL = "https://example.com" REGION = "us-east-1" # New and overridden config map data SITE_URL = "https://example.com" API_URL = "https://api.example.com.us-east-1.com" # Existing secret overridden by template ``` To help transform your config map data further, the operator provides a set of built-in functions that you can use in your templates. ### Available templating functions Please refer to the [templating functions documentation](/integrations/platforms/kubernetes/overview#available-helper-functions) for more information. Define custom labels and annotations for the managed Kubernetes ConfigMap. This allows you to specify metadata that should be applied to the managed ConfigMap separately from the InfisicalSecret itself. This field works the same way as `template.metadata` for managed secrets. For detailed information on how metadata propagation works and examples, see the [Propagating Labels & Annotations](#propagating-labels-&-annotations) section. ## Applying CRD Once you have configured the InfisicalSecret CRD with the required fields, you can apply it to your cluster. After applying, you should notice that the managed secret has been created in the desired namespace your specified. ``` kubectl apply -f example-infisical-secret-crd.yaml ``` To verify that the operator has successfully created the managed secret, you can check the secrets in the namespace that was specified. ```bash theme={"dark"} # Verify managed secret is created kubectl get secrets -n ``` The Infisical secrets will be synced and stored into the managed secret every 1 minute unless configured otherwise. ```bash theme={"dark"} # Verify managed config map is created kubectl get configmaps -n ``` The Infisical config map data will be synced and stored into the managed config map every 1 minute unless configured otherwise. ## Using Managed Secret In Your Deployment To make use of the managed secret created by the operator into your deployment can be achieved through several methods. Here, we will highlight three of the most common ways to utilize it. Learn more about Kubernetes secrets [here](https://kubernetes.io/docs/concepts/configuration/secret/) This will take all the secrets from your managed secret and expose them to your container ````yaml theme={"dark"} envFrom: - secretRef: name: managed-secret # managed secret name ``` Example usage in a deployment ```yaml apiVersion: apps/v1 kind: Deployment metadata: name: nginx-deployment labels: app: nginx spec: replicas: 1 selector: matchLabels: app: nginx template: metadata: labels: app: nginx spec: containers: - name: nginx image: nginx:1.14.2 envFrom: - secretRef: name: managed-secret # <- name of managed secret ports: - containerPort: 80 ```` This will allow you to select individual secrets by key name from your managed secret and expose them to your container ```yaml theme={"dark"} env: - name: SECRET_NAME # The environment variable's name which is made available in the container valueFrom: secretKeyRef: name: managed-secret # managed secret name key: SOME_SECRET_KEY # The name of the key which exists in the managed secret ``` Example usage in a deployment ```yaml theme={"dark"} apiVersion: apps/v1 kind: Deployment metadata: name: nginx-deployment labels: app: nginx spec: replicas: 1 selector: matchLabels: app: nginx template: metadata: labels: app: nginx spec: containers: - name: nginx image: nginx:1.14.2 env: - name: STRIPE_API_SECRET valueFrom: secretKeyRef: name: managed-secret # <- name of managed secret key: STRIPE_API_SECRET ports: - containerPort: 80 ``` This will allow you to create a volume on your container which comprises of files holding the secrets in your managed kubernetes secret ```yaml theme={"dark"} volumes: - name: secrets-volume-name # The name of the volume under which secrets will be stored secret: secretName: managed-secret # managed secret name ``` You can then mount this volume to the container's filesystem so that your deployment can access the files containing the managed secrets ```yaml theme={"dark"} volumeMounts: - name: secrets-volume-name mountPath: /etc/secrets readOnly: true ``` Example usage in a deployment ```yaml theme={"dark"} apiVersion: apps/v1 kind: Deployment metadata: name: nginx-deployment labels: app: nginx spec: replicas: 1 selector: matchLabels: app: nginx template: metadata: labels: app: nginx spec: containers: - name: nginx image: nginx:1.14.2 volumeMounts: - name: secrets-volume-name mountPath: /etc/secrets readOnly: true ports: - containerPort: 80 volumes: - name: secrets-volume-name secret: secretName: managed-secret # <- managed secrets ``` The definition file of the Kubernetes secret for the CA certificate can be structured like the following: ```yaml theme={"dark"} apiVersion: v1 kind: Secret metadata: name: custom-ca-certificate type: Opaque stringData: ca.crt: | -----BEGIN CERTIFICATE----- MIIEZzCCA0+gAwIBAgIUDk9+HZcMHppiNy0TvoBg8/aMEqIwDQYJKoZIhvcNAQEL ... BQAwDTELMAkGA1UEChMCUEgwHhcNMjQxMDI1MTU0MjAzWhcNMjUxMDI1MjE0MjAz -----END CERTIFICATE----- ``` ### Automatic Redeployment Deployments using managed secrets don't reload automatically on updates, so they may use outdated secrets unless manually redeployed. To address this, we added functionality to automatically redeploy your deployment when its managed secret updates. #### Enabling Automatic Redeployment To enable auto redeployment you simply have to add the following annotation to the Deployment, StatefulSet, or DaemonSet that consumes a managed secret. ```yaml theme={"dark"} secrets.infisical.com/auto-reload: "true" ``` ```yaml theme={"dark"} apiVersion: apps/v1 kind: Deployment metadata: name: nginx-deployment labels: app: nginx annotations: secrets.infisical.com/auto-reload: "true" # <- redeployment annotation spec: replicas: 1 selector: matchLabels: app: nginx template: metadata: labels: app: nginx spec: containers: - name: nginx image: nginx:1.14.2 envFrom: - secretRef: name: managed-secret ports: - containerPort: 80 ``` ```yaml theme={"dark"} apiVersion: apps/v1 kind: DaemonSet metadata: name: log-agent labels: app: log-agent annotations: secrets.infisical.com/auto-reload: "true" # <- redeployment annotation spec: selector: matchLabels: app: log-agent template: metadata: labels: app: log-agent spec: containers: - name: log-agent image: mycompany/log-agent:latest envFrom: - secretRef: name: managed-secret # <- name of the managed secret volumeMounts: - name: config-volume mountPath: /etc/config readOnly: true volumes: - name: config-volume secret: secretName: managed-secret ``` ```yaml theme={"dark"} apiVersion: apps/v1 kind: StatefulSet metadata: name: db-worker labels: app: db-worker annotations: secrets.infisical.com/auto-reload: "true" # <- redeployment annotation spec: selector: matchLabels: app: db-worker serviceName: "db-worker" replicas: 2 template: metadata: labels: app: db-worker spec: containers: - name: db-worker image: mycompany/db-worker:stable env: - name: DATABASE_PASSWORD valueFrom: secretKeyRef: name: managed-secret key: DB_PASSWORD ports: - containerPort: 5432 ``` #### How it works When a managed secret is updated, the operator checks for any Deployments, DaemonSets, or StatefulSets that consume the updated secret and have the annotation `secrets.infisical.com/auto-reload: "true"`. For each matching workload, the operator triggers a rolling restart to ensure it picks up the latest secret values. ## Using Managed ConfigMap In Your Deployment To make use of the managed ConfigMap created by the operator into your deployment can be achieved through several methods. Here, we will highlight three of the most common ways to utilize it. Learn more about Kubernetes ConfigMaps [here](https://kubernetes.io/docs/concepts/configuration/configmap/) Automatic redeployment of deployments using managed ConfigMaps is not yet supported. This will take all the secrets from your managed ConfigMap and expose them to your container ````yaml theme={"dark"} envFrom: - configMapRef: name: managed-configmap # managed configmap name ``` Example usage in a deployment ```yaml apiVersion: apps/v1 kind: Deployment metadata: name: nginx-deployment labels: app: nginx spec: replicas: 1 selector: matchLabels: app: nginx template: metadata: labels: app: nginx spec: containers: - name: nginx image: nginx:1.14.2 envFrom: - configMapRef: name: managed-configmap # <- name of managed configmap ports: - containerPort: 80 ```` This will allow you to select individual secrets by key name from your managed ConfigMap and expose them to your container ```yaml theme={"dark"} env: - name: CONFIG_NAME # The environment variable's name which is made available in the container valueFrom: configMapKeyRef: name: managed-configmap # managed configmap name key: SOME_CONFIG_KEY # The name of the key which exists in the managed configmap ``` Example usage in a deployment ```yaml theme={"dark"} apiVersion: apps/v1 kind: Deployment metadata: name: nginx-deployment labels: app: nginx spec: replicas: 1 selector: matchLabels: app: nginx template: metadata: labels: app: nginx spec: containers: - name: nginx image: nginx:1.14.2 env: - name: STRIPE_API_SECRET valueFrom: configMapKeyRef: name: managed-configmap # <- name of managed configmap key: STRIPE_API_SECRET ports: - containerPort: 80 ``` This will allow you to create a volume on your container which comprises of files holding the secrets in your managed kubernetes secret ```yaml theme={"dark"} volumes: - name: configmaps-volume-name # The name of the volume under which configmaps will be stored configMap: name: managed-configmap # managed configmap name ``` You can then mount this volume to the container's filesystem so that your deployment can access the files containing the managed secrets ```yaml theme={"dark"} volumeMounts: - name: configmaps-volume-name mountPath: /etc/config readOnly: true ``` Example usage in a deployment ```yaml theme={"dark"} apiVersion: apps/v1 kind: Deployment metadata: name: nginx-deployment labels: app: nginx spec: replicas: 1 selector: matchLabels: app: nginx template: metadata: labels: app: nginx spec: containers: - name: nginx image: nginx:1.14.2 volumeMounts: - name: configmaps-volume-name mountPath: /etc/config readOnly: true ports: - containerPort: 80 volumes: - name: configmaps-volume-name configMap: name: managed-configmap # <- managed configmap ``` The definition file of the Kubernetes secret for the CA certificate can be structured like the following: ```yaml theme={"dark"} apiVersion: v1 kind: Secret metadata: name: custom-ca-certificate type: Opaque stringData: ca.crt: | -----BEGIN CERTIFICATE----- MIIEZzCCA0+gAwIBAgIUDk9+HZcMHppiNy0TvoBg8/aMEqIwDQYJKoZIhvcNAQEL ... BQAwDTELMAkGA1UEChMCUEgwHhcNMjQxMDI1MTU0MjAzWhcNMjUxMDI1MjE0MjAz -----END CERTIFICATE----- ``` ## Propagating Labels & Annotations The operator provides flexible options for managing labels and annotations on managed Kubernetes secrets. By default, the operator will transfer all labels & annotations present on the `InfisicalSecret` to the managed Kubernetes secret to be created. ### Example ```yaml theme={"dark"} apiVersion: secrets.infisical.com/v1alpha1 kind: InfisicalSecret metadata: name: infisicalsecret-sample labels: label-to-be-passed-to-managed-secret: sample-value annotations: example.com/annotation-to-be-passed-to-managed-secret: "sample-value" spec: authentication: # ... auth config ... managedKubeSecretReferences: - secretName: managed-token secretNamespace: default ``` This would result in the following managed secret to be created: ```yaml theme={"dark"} apiVersion: v1 data: ... kind: Secret metadata: annotations: example.com/annotation-to-be-passed-to-managed-secret: sample-value secrets.infisical.com/version: W/"3f1-ZyOSsrCLGSkAhhCkY2USPu2ivRw" labels: label-to-be-passed-to-managed-secret: sample-value name: managed-token namespace: default type: Opaque ``` When you specify `template.metadata` in your template configuration, you have full control over which labels and annotations are applied to the managed secret: * Labels and annotations from `template.metadata` are used exclusively on the managed secret * InfisicalSecret labels and annotations are NOT propagated to the managed secret * This allows you to keep InfisicalSecret-specific metadata separate from the managed secret metadata To prevent any propagation while using `template.metadata`, pass empty objects for labels and/or annotations. This will ensure no labels or annotations are propagated to the managed secret, even from the InfisicalSecret CRD's own labels/annotations: ```yaml theme={"dark"} template: metadata: labels: {} annotations: {} ``` ### Example ```yaml theme={"dark"} apiVersion: secrets.infisical.com/v1alpha1 kind: InfisicalSecret metadata: name: infisicalsecret-with-template-metadata labels: managed-by: infisical-operator annotations: example.com/cr-specific: "metadata" spec: authentication: # ... auth config ... managedKubeSecretReferences: - secretName: managed-secret-with-custom-metadata secretNamespace: default template: includeAllSecrets: true metadata: labels: app: my-application environment: production tier: backend annotations: secret.example.com/description: "Production database credentials" secret.example.com/owner: "platform-team" ``` This would result in the following managed secret to be created: ```yaml theme={"dark"} apiVersion: v1 data: ... kind: Secret metadata: annotations: secret.example.com/description: "Production database credentials" secret.example.com/owner: "platform-team" labels: app: my-application environment: production tier: backend name: managed-secret-with-custom-metadata namespace: default type: Opaque ``` --- # Source: https://infisical.com/docs/cli/commands/init.md > ## Documentation Index > Fetch the complete documentation index at: https://infisical.com/docs/llms.txt > Use this file to discover all available pages before exploring further. # infisical init > Switch between Infisical projects within CLI ```bash theme={"dark"} infisical init ``` ## Description Link a local project to your Infisical project. Once connected, you can then access the secrets locally from the connected Infisical project. This command creates a `infisical.json` file containing your Project ID. --- # Source: https://infisical.com/docs/self-hosting/deployment-options/native/linux-package/installation.md > ## Documentation Index > Fetch the complete documentation index at: https://infisical.com/docs/llms.txt > Use this file to discover all available pages before exploring further. # Installation > Learn how to deploy Infisical using the Linux package Infisical can be deployed on Linux virtual machines without the need for containers using our standalone Linux packages. These packages are available in both .deb (for Debian-based systems) and .rpm (for RHEL-based systems) formats. The installation includes the Infisical service, along with a CLI tool (infisical-ctl) to help you manage configurations, startup, and application logging. This approach is ideal for environments where containerization isn't desired, while still providing a lightweight deployment option. ## Prerequisites This installation method only provides the Infisical application. You are responsible for configuring both PostgreSQL and Redis, either by using managed services (e.g., AWS RDS, Azure Database, GCP Cloud SQL/Memorystore) or by deploying them manually in your on-prem environment. Please ensure you have the following before beginning installation of Infisical: * A Linux server running a Debian/Ubuntu or RHEL-based distribution * A running PostgreSQL database instance (version 14 and up) * A running Redis database instance (versions 6.x or 7.x) ## Installation Steps Select your Linux distribution to get started. Only AMD64-based systems are supported at this time, ARM support is coming soon. As of October 10, 2025, all future releases for Debian/Ubuntu will be distributed via the official Infisical repository at [https://artifacts-infisical-core.infisical.com](https://artifacts-infisical-core.infisical.com). No new releases will be published for Debian/Ubuntu on Cloudsmith going forward. Add the Infisical repository: ```bash theme={"dark"} curl -1sLf 'https://artifacts-infisical-core.infisical.com/setup.deb.sh' | sudo -E bash ``` Install Infisical: ```bash theme={"dark"} sudo apt-get update && sudo apt-get install -y infisical-core ``` > **Note**: For production use, we recommend locking to a specific version to ensure consistency. [View available versions](https://github.com/Infisical/infisical/releases). All versions from `infisical-core-0.150.0~nightly~20251005` and above are supported. As of October 10, 2025, all future releases for Red Hat/CentOS/Amazon Linux will be distributed via the official Infisical repository at [https://artifacts-infisical-core.infisical.com](https://artifacts-infisical-core.infisical.com). No new releases will be published for Red Hat/CentOS/Amazon Linux on Cloudsmith going forward. Add the Infisical repository: ```bash theme={"dark"} curl -1sLf 'https://artifacts-infisical-core.infisical.com/setup.rpm.sh' | sudo -E bash ``` Install Infisical: ```bash theme={"dark"} sudo yum install infisical-core ``` > **Note**: For production use, we recommend locking to a specific version to ensure consistency. [View available versions](https://github.com/Infisical/infisical/releases). All versions from `infisical-core-0.150.0~nightly~20251005` and above are supported. Verify the installation: ```bash theme={"dark"} infisical-ctl help ``` Create an `infisical.rb` file at `/etc/infisical`. This file contains your database connection strings and other runtime settings. ```ruby theme={"dark"} # Important: Replace with secure values in production infisical_core['ENCRYPTION_KEY'] = '6c1fe4e407b8911c104518103505b218' infisical_core['AUTH_SECRET'] = '5lrMXKKWCVocS/uerPsl7V+TX/aaUaI7iDkgl3tSmLE=' # Example database connection strings infisical_core['DB_CONNECTION_URI'] = 'postgres://:@:/' infisical_core['REDIS_URL'] = 'redis://:' ``` See the full list of options in our [configuration documentation](/self-hosting/configuration/envars). 1. Start the Infisical service: ```bash theme={"dark"} infisical-ctl reconfigure ``` The server runs on port `8080` by default (customizable in `infisical.rb`). 2. Check the service status: ```bash theme={"dark"} infisical-ctl status ``` View the service logs in real-time: ```bash theme={"dark"} infisical-ctl tail ``` ## Platform Support ### Microsoft Windows Infisical is built for Linux-based systems. It is not supported on Microsoft Windows, and we do not plan to support it in the near future. For Windows users, consider running Infisical in a virtual machine or WSL2 environment. ### Unsupported Linux Distributions and Unix-like Systems Infisical is not tested or officially supported on the following: * Arch Linux * Fedora * FreeBSD * Gentoo * macOS We recommend sticking to officially supported distributions for the best experience. ## Linux vs Containerized Deployments Infisical is a stateless application, which means it can be easily scaled and redeployed without maintaining internal state between instances. If your use case requires rolling updates, self-healing, or auto-scaling, we recommend deploying Infisical in a containerized environment such as Kubernetes/OpenShift, or using managed container orchestration services like AWS ECS or Google Cloud Run. These platforms offer built-in capabilities for high availability and help simplify operational overhead for your deployment. --- # Source: https://infisical.com/docs/api-reference/overview/examples/integration.md # Configure native integrations via API > How to use Infisical API to sync secrets to external secret managers The Infisical API allows you to create programmatic integrations that connect with third-party secret managers to synchronize secrets from Infisical. This guide will primarily demonstrate the process using AWS Secret Store Manager (AWS SSM), but the steps are generally applicable to other secret management integrations. For details on setting up AWS SSM synchronization and understanding its prerequisites, refer to the [AWS SSM integration setup documentation](../../../integrations/cloud/aws-secret-manager). Authentication is required for all integrations. Use the [Integration Auth API](../../endpoints/integrations/create-auth) with the following parameters to authenticate. Set this parameter to **aws-secret-manager**. The Infisical project ID for the integration. The AWS IAM User Access ID. The AWS IAM User Access Secret Key. ```bash Request theme={"dark"} curl --request POST \ --url https://app.infisical.com/api/v1/integration-auth/access-token \ --header 'Authorization: ' \ --header 'Content-Type: application/json' \ --data '{ "workspaceId": "", "integration": "aws-secret-manager", "accessId": "", "accessToken": "" }' ``` Once authentication between AWS SSM and Infisical is established, you can configure the synchronization behavior. This involves specifying the source (environment and secret path in Infisical) and the destination in SSM to which the secrets will be synchronized. Use the [integration API](../../endpoints/integrations/create) with the following parameters to configure the sync source and destination. The ID of the integration authentication object used with AWS, obtained from the previous API response. Indicates whether the integration should be active or inactive. The secret name for saving in AWS SSM, which can be arbitrarily chosen. The AWS region where the SSM is located, e.g., `us-east-1`. The Infisical environment slug from which secrets will be synchronized, e.g., `dev`. The Infisical folder path from which secrets will be synchronized, e.g., `/some/path`. The root path is `/`. ```bash Request theme={"dark"} curl --request POST \ --url https://app.infisical.com/api/v1/integration \ --header 'Authorization: ' \ --header 'Content-Type: application/json' \ --data '{ "integrationAuthId": "", "sourceEnvironment": "", "secretPath": "", "app": "", "region": "" }' ``` Congratulations! You have successfully set up an integration to synchronize secrets from Infisical with AWS SSM. For more information, [view the integration API reference](../../endpoints/integrations). --- # Source: https://infisical.com/docs/documentation/guides/introduction.md # Source: https://infisical.com/docs/documentation/getting-started/introduction.md # Source: https://infisical.com/docs/api-reference/overview/introduction.md > ## Documentation Index > Fetch the complete documentation index at: https://infisical.com/docs/llms.txt > Use this file to discover all available pages before exploring further. # API Reference Infisical's Public (REST) API provides users an alternative way to programmatically access and manage secrets via HTTPS requests. This can be useful for automating tasks, such as rotating credentials, or for integrating secret management into a larger system. With the Public API, you can create, read, update, and delete secrets, as well as manage access control, query audit logs, and more. ## API Versioning The API is versioned on a per-resource basis. A resource's version is only incremented for breaking changes, so different endpoints may have different version numbers (e.g., `/api/v4/secrets` vs. `/api/v1/secret-syncs`). As a best practice, always use the latest available version for each endpoint to ensure access to the most recent features and improvements. ## Rate Limits Infisical enforces several different types of rate limits: * **Read**: For GET and LIST operations. * **Write**: For CREATE, UPDATE, and DELETE operations. * **Secret**: Specifically for secret management operations such as getting and creating secrets. * **Identity Creation**: For creating new identities within an organization. * **Project Creation**: For creating new projects within an organization. **Self-hosted** instances have no limits, these limits apply only to **Infisical Cloud**. * **Read**: 200/minute * **Write**: 90/minute * **Secret**: 120/minute * **Identity Creation**: 30/minute * **Project Creation**: 30/minute * **Read**: 350/minute * **Write**: 200/minute * **Secret**: 300/minute * **Identity Creation**: 30/minute * **Project Creation**: 30/minute Custom rate limits are available for Enterprise customers. If you need higher rate limits, please contact [sales@infisical.com](mailto:sales@infisical.com). --- # Source: https://infisical.com/docs/api-reference/endpoints/project-users/invite-member-to-project.md # Source: https://infisical.com/docs/api-reference/endpoints/deprecated/project-users/invite-member-to-project.md > ## Documentation Index > Fetch the complete documentation index at: https://infisical.com/docs/llms.txt > Use this file to discover all available pages before exploring further. # Invite Member > Invite members to project ## OpenAPI ````yaml POST /api/v2/workspace/{projectId}/memberships openapi: 3.0.3 info: title: Infisical API description: List of all available APIs that can be consumed version: 0.0.1 servers: - url: https://us.infisical.com description: Production server (US) - url: https://eu.infisical.com description: Production server (EU) - url: http://localhost:8080 description: Local server security: [] paths: /api/v2/workspace/{projectId}/memberships: post: tags: - Project Users description: Invite members to project parameters: - schema: type: string in: path name: projectId required: true description: The ID of the project to invite the member to. requestBody: content: application/json: schema: type: object properties: emails: type: array items: type: string format: email default: [] description: >- A list of organization member emails to invite to the project. usernames: type: array items: type: string default: [] description: A list of usernames to invite to the project. roleSlugs: type: array items: type: string minItems: 1 description: >- A list of role slugs to assign to the newly created project membership. If nothing is provided, it will default to the Member role. additionalProperties: false responses: '200': description: Default Response content: application/json: schema: type: object properties: memberships: type: array items: type: object properties: id: type: string format: uuid createdAt: type: string format: date-time updatedAt: type: string format: date-time userId: type: string format: uuid projectId: type: string required: - id - createdAt - updatedAt - userId - projectId additionalProperties: false required: - memberships additionalProperties: false '400': description: Default Response content: application/json: schema: type: object properties: reqId: type: string statusCode: type: number enum: - 400 message: type: string error: type: string details: {} required: - reqId - statusCode - message - error additionalProperties: false '401': description: Default Response content: application/json: schema: type: object properties: reqId: type: string statusCode: type: number enum: - 401 message: type: string error: type: string required: - reqId - statusCode - message - error additionalProperties: false '403': description: Default Response content: application/json: schema: type: object properties: reqId: type: string statusCode: type: number enum: - 403 message: type: string details: {} error: type: string required: - reqId - statusCode - message - error additionalProperties: false '404': description: Default Response content: application/json: schema: type: object properties: reqId: type: string statusCode: type: number enum: - 404 message: type: string error: type: string required: - reqId - statusCode - message - error additionalProperties: false '422': description: Default Response content: application/json: schema: type: object properties: reqId: type: string statusCode: type: number enum: - 422 message: {} error: type: string required: - reqId - statusCode - error additionalProperties: false '500': description: Default Response content: application/json: schema: type: object properties: reqId: type: string statusCode: type: number enum: - 500 message: type: string error: type: string required: - reqId - statusCode - message - error additionalProperties: false security: - bearerAuth: [] components: securitySchemes: bearerAuth: type: http scheme: bearer bearerFormat: JWT description: An access token in Infisical ```` --- # Source: https://infisical.com/docs/api-reference/endpoints/certificates/issue-certificate.md # Issue Certificate ## OpenAPI ````yaml POST /api/v3/pki/certificates/issue-certificate paths: path: /api/v3/pki/certificates/issue-certificate method: post servers: - url: https://us.infisical.com description: Production server (US) - url: https://eu.infisical.com description: Production server (EU) - url: http://localhost:8080 description: Local server request: security: [] parameters: path: {} query: {} header: {} cookie: {} body: application/json: schemaArray: - type: object properties: profileId: allOf: - type: string format: uuid commonName: allOf: - type: string minLength: 1 maxLength: 100 ttl: allOf: - type: string minLength: 1 keyUsages: allOf: - type: array items: type: string enum: - digital_signature - key_encipherment - non_repudiation - data_encipherment - key_agreement - key_cert_sign - crl_sign - encipher_only - decipher_only extendedKeyUsages: allOf: - type: array items: type: string enum: - client_auth - server_auth - code_signing - email_protection - ocsp_signing - time_stamping notBefore: allOf: - type: string notAfter: allOf: - type: string altNames: allOf: - type: array items: type: object properties: type: type: string enum: - dns_name - ip_address - email - uri value: type: string minLength: 1 required: - type - value additionalProperties: false signatureAlgorithm: allOf: - type: string enum: - RSA-SHA256 - RSA-SHA384 - RSA-SHA512 - ECDSA-SHA256 - ECDSA-SHA384 - ECDSA-SHA512 keyAlgorithm: allOf: - type: string enum: - RSA_2048 - RSA_3072 - RSA_4096 - EC_prime256v1 - EC_secp384r1 - EC_secp521r1 required: true requiredProperties: - profileId - ttl - signatureAlgorithm - keyAlgorithm additionalProperties: false examples: example: value: profileId: 3c90c3cc-0d44-4b50-8888-8dd25736052a commonName: ttl: keyUsages: - digital_signature extendedKeyUsages: - client_auth notBefore: notAfter: altNames: - type: dns_name value: signatureAlgorithm: RSA-SHA256 keyAlgorithm: RSA_2048 response: '200': application/json: schemaArray: - type: object properties: certificate: allOf: - type: string issuingCaCertificate: allOf: - type: string certificateChain: allOf: - type: string privateKey: allOf: - type: string serialNumber: allOf: - type: string certificateId: allOf: - type: string requiredProperties: - certificate - issuingCaCertificate - certificateChain - serialNumber - certificateId additionalProperties: false examples: example: value: certificate: issuingCaCertificate: certificateChain: privateKey: serialNumber: certificateId: description: Default Response '400': application/json: schemaArray: - type: object properties: reqId: allOf: - type: string statusCode: allOf: - type: number enum: - 400 message: allOf: - type: string error: allOf: - type: string requiredProperties: - reqId - statusCode - message - error additionalProperties: false examples: example: value: reqId: statusCode: 400 message: error: description: Default Response '401': application/json: schemaArray: - type: object properties: reqId: allOf: - type: string statusCode: allOf: - type: number enum: - 401 message: allOf: - type: string error: allOf: - type: string requiredProperties: - reqId - statusCode - message - error additionalProperties: false examples: example: value: reqId: statusCode: 401 message: error: description: Default Response '403': application/json: schemaArray: - type: object properties: reqId: allOf: - type: string statusCode: allOf: - type: number enum: - 403 message: allOf: - type: string details: allOf: - {} error: allOf: - type: string requiredProperties: - reqId - statusCode - message - error additionalProperties: false examples: example: value: reqId: statusCode: 403 message: details: error: description: Default Response '404': application/json: schemaArray: - type: object properties: reqId: allOf: - type: string statusCode: allOf: - type: number enum: - 404 message: allOf: - type: string error: allOf: - type: string requiredProperties: - reqId - statusCode - message - error additionalProperties: false examples: example: value: reqId: statusCode: 404 message: error: description: Default Response '422': application/json: schemaArray: - type: object properties: reqId: allOf: - type: string statusCode: allOf: - type: number enum: - 422 message: allOf: - {} error: allOf: - type: string requiredProperties: - reqId - statusCode - error additionalProperties: false examples: example: value: reqId: statusCode: 422 message: error: description: Default Response '500': application/json: schemaArray: - type: object properties: reqId: allOf: - type: string statusCode: allOf: - type: number enum: - 500 message: allOf: - type: string error: allOf: - type: string requiredProperties: - reqId - statusCode - message - error additionalProperties: false examples: example: value: reqId: statusCode: 500 message: error: description: Default Response deprecated: false type: path components: schemas: {} ```` --- # Source: https://infisical.com/docs/api-reference/endpoints/ssh/certificates/issue-credentials.md # Issue SSH Credentials > Issue SSH credentials (certificate + key) ## OpenAPI ````yaml POST /api/v1/ssh/certificates/issue paths: path: /api/v1/ssh/certificates/issue method: post servers: - url: https://us.infisical.com description: Production server (US) - url: https://eu.infisical.com description: Production server (EU) - url: http://localhost:8080 description: Local server request: security: [] parameters: path: {} query: {} header: {} cookie: {} body: application/json: schemaArray: - type: object properties: certificateTemplateId: allOf: - type: string minLength: 1 description: >- The ID of the SSH certificate template to issue the SSH credentials with. keyAlgorithm: allOf: - type: string enum: - RSA_2048 - RSA_4096 - EC_prime256v1 - EC_secp384r1 - ED25519 default: ED25519 description: >- The type of public key algorithm and size, in bits, of the key pair for the SSH CA. certType: allOf: - type: string enum: - user - host default: user description: >- The type of certificate to issue. This can be one of user or host. principals: allOf: - type: array items: type: string minItems: 1 description: >- The list of principals (usernames, hostnames) to include in the certificate. ttl: allOf: - type: string description: >- The time to live for the certificate such as 1m, 1h, 1d, ... If not specified, the default TTL for the template will be used. keyId: allOf: - type: string maxLength: 50 description: >- The key ID to include in the certificate. If not specified, a default key ID will be generated. required: true requiredProperties: - certificateTemplateId - principals additionalProperties: false examples: example: value: certificateTemplateId: keyAlgorithm: ED25519 certType: user principals: - ttl: keyId: response: '200': application/json: schemaArray: - type: object properties: serialNumber: allOf: - type: string description: The serial number of the issued SSH certificate. signedKey: allOf: - type: string description: The SSH certificate or signed SSH public key. privateKey: allOf: - type: string description: >- The private key corresponding to the issued SSH certificate. publicKey: allOf: - type: string description: The public key of the issued SSH certificate. keyAlgorithm: allOf: - type: string enum: - RSA_2048 - RSA_4096 - EC_prime256v1 - EC_secp384r1 - ED25519 description: >- The type of public key algorithm and size, in bits, of the key pair for the SSH CA. requiredProperties: - serialNumber - signedKey - privateKey - publicKey - keyAlgorithm additionalProperties: false examples: example: value: serialNumber: signedKey: privateKey: publicKey: keyAlgorithm: RSA_2048 description: Default Response '400': application/json: schemaArray: - type: object properties: reqId: allOf: - type: string statusCode: allOf: - type: number enum: - 400 message: allOf: - type: string error: allOf: - type: string requiredProperties: - reqId - statusCode - message - error additionalProperties: false examples: example: value: reqId: statusCode: 400 message: error: description: Default Response '401': application/json: schemaArray: - type: object properties: reqId: allOf: - type: string statusCode: allOf: - type: number enum: - 401 message: allOf: - type: string error: allOf: - type: string requiredProperties: - reqId - statusCode - message - error additionalProperties: false examples: example: value: reqId: statusCode: 401 message: error: description: Default Response '403': application/json: schemaArray: - type: object properties: reqId: allOf: - type: string statusCode: allOf: - type: number enum: - 403 message: allOf: - type: string details: allOf: - {} error: allOf: - type: string requiredProperties: - reqId - statusCode - message - error additionalProperties: false examples: example: value: reqId: statusCode: 403 message: details: error: description: Default Response '404': application/json: schemaArray: - type: object properties: reqId: allOf: - type: string statusCode: allOf: - type: number enum: - 404 message: allOf: - type: string error: allOf: - type: string requiredProperties: - reqId - statusCode - message - error additionalProperties: false examples: example: value: reqId: statusCode: 404 message: error: description: Default Response '422': application/json: schemaArray: - type: object properties: reqId: allOf: - type: string statusCode: allOf: - type: number enum: - 422 message: allOf: - {} error: allOf: - type: string requiredProperties: - reqId - statusCode - error additionalProperties: false examples: example: value: reqId: statusCode: 422 message: error: description: Default Response '500': application/json: schemaArray: - type: object properties: reqId: allOf: - type: string statusCode: allOf: - type: number enum: - 500 message: allOf: - type: string error: allOf: - type: string requiredProperties: - reqId - statusCode - message - error additionalProperties: false examples: example: value: reqId: statusCode: 500 message: error: description: Default Response deprecated: false type: path components: schemas: {} ```` --- # Source: https://infisical.com/docs/api-reference/endpoints/ssh/hosts/issue-host-cert.md # Issue Host Certificate > Issue SSH certificate for host ## OpenAPI ````yaml POST /api/v1/ssh/hosts/{sshHostId}/issue-host-cert paths: path: /api/v1/ssh/hosts/{sshHostId}/issue-host-cert method: post servers: - url: https://us.infisical.com description: Production server (US) - url: https://eu.infisical.com description: Production server (EU) - url: http://localhost:8080 description: Local server request: security: [] parameters: path: sshHostId: schema: - type: string required: true description: The ID of the SSH host to issue the SSH certificate for. query: {} header: {} cookie: {} body: application/json: schemaArray: - type: object properties: publicKey: allOf: - type: string description: The SSH public key to issue the SSH certificate for. required: true requiredProperties: - publicKey additionalProperties: false examples: example: value: publicKey: response: '200': application/json: schemaArray: - type: object properties: serialNumber: allOf: - type: string description: The serial number of the issued SSH certificate. signedKey: allOf: - type: string description: The SSH certificate or signed SSH public key. requiredProperties: - serialNumber - signedKey additionalProperties: false examples: example: value: serialNumber: signedKey: description: Default Response '400': application/json: schemaArray: - type: object properties: reqId: allOf: - type: string statusCode: allOf: - type: number enum: - 400 message: allOf: - type: string error: allOf: - type: string requiredProperties: - reqId - statusCode - message - error additionalProperties: false examples: example: value: reqId: statusCode: 400 message: error: description: Default Response '401': application/json: schemaArray: - type: object properties: reqId: allOf: - type: string statusCode: allOf: - type: number enum: - 401 message: allOf: - type: string error: allOf: - type: string requiredProperties: - reqId - statusCode - message - error additionalProperties: false examples: example: value: reqId: statusCode: 401 message: error: description: Default Response '403': application/json: schemaArray: - type: object properties: reqId: allOf: - type: string statusCode: allOf: - type: number enum: - 403 message: allOf: - type: string details: allOf: - {} error: allOf: - type: string requiredProperties: - reqId - statusCode - message - error additionalProperties: false examples: example: value: reqId: statusCode: 403 message: details: error: description: Default Response '404': application/json: schemaArray: - type: object properties: reqId: allOf: - type: string statusCode: allOf: - type: number enum: - 404 message: allOf: - type: string error: allOf: - type: string requiredProperties: - reqId - statusCode - message - error additionalProperties: false examples: example: value: reqId: statusCode: 404 message: error: description: Default Response '422': application/json: schemaArray: - type: object properties: reqId: allOf: - type: string statusCode: allOf: - type: number enum: - 422 message: allOf: - {} error: allOf: - type: string requiredProperties: - reqId - statusCode - error additionalProperties: false examples: example: value: reqId: statusCode: 422 message: error: description: Default Response '500': application/json: schemaArray: - type: object properties: reqId: allOf: - type: string statusCode: allOf: - type: number enum: - 500 message: allOf: - type: string error: allOf: - type: string requiredProperties: - reqId - statusCode - message - error additionalProperties: false examples: example: value: reqId: statusCode: 500 message: error: description: Default Response deprecated: false type: path components: schemas: {} ```` --- # Source: https://infisical.com/docs/api-reference/endpoints/ssh/hosts/issue-user-cert.md # Issue User Certificate > Issue SSH certificate for user ## OpenAPI ````yaml POST /api/v1/ssh/hosts/{sshHostId}/issue-user-cert paths: path: /api/v1/ssh/hosts/{sshHostId}/issue-user-cert method: post servers: - url: https://us.infisical.com description: Production server (US) - url: https://eu.infisical.com description: Production server (EU) - url: http://localhost:8080 description: Local server request: security: [] parameters: path: sshHostId: schema: - type: string required: true description: The ID of the SSH host to issue the SSH credentials for. query: {} header: {} cookie: {} body: application/json: schemaArray: - type: object properties: loginUser: allOf: - type: string description: The login user to issue the SSH credentials for. required: true requiredProperties: - loginUser additionalProperties: false examples: example: value: loginUser: response: '200': application/json: schemaArray: - type: object properties: serialNumber: allOf: - type: string description: The serial number of the issued SSH certificate. signedKey: allOf: - type: string description: The SSH certificate or signed SSH public key. privateKey: allOf: - type: string description: >- The private key corresponding to the issued SSH certificate. publicKey: allOf: - type: string description: The public key of the issued SSH certificate. keyAlgorithm: allOf: - type: string enum: - RSA_2048 - RSA_4096 - EC_prime256v1 - EC_secp384r1 - ED25519 description: >- The type of public key algorithm and size, in bits, of the key pair for the SSH host. requiredProperties: - serialNumber - signedKey - privateKey - publicKey - keyAlgorithm additionalProperties: false examples: example: value: serialNumber: signedKey: privateKey: publicKey: keyAlgorithm: RSA_2048 description: Default Response '400': application/json: schemaArray: - type: object properties: reqId: allOf: - type: string statusCode: allOf: - type: number enum: - 400 message: allOf: - type: string error: allOf: - type: string requiredProperties: - reqId - statusCode - message - error additionalProperties: false examples: example: value: reqId: statusCode: 400 message: error: description: Default Response '401': application/json: schemaArray: - type: object properties: reqId: allOf: - type: string statusCode: allOf: - type: number enum: - 401 message: allOf: - type: string error: allOf: - type: string requiredProperties: - reqId - statusCode - message - error additionalProperties: false examples: example: value: reqId: statusCode: 401 message: error: description: Default Response '403': application/json: schemaArray: - type: object properties: reqId: allOf: - type: string statusCode: allOf: - type: number enum: - 403 message: allOf: - type: string details: allOf: - {} error: allOf: - type: string requiredProperties: - reqId - statusCode - message - error additionalProperties: false examples: example: value: reqId: statusCode: 403 message: details: error: description: Default Response '404': application/json: schemaArray: - type: object properties: reqId: allOf: - type: string statusCode: allOf: - type: number enum: - 404 message: allOf: - type: string error: allOf: - type: string requiredProperties: - reqId - statusCode - message - error additionalProperties: false examples: example: value: reqId: statusCode: 404 message: error: description: Default Response '422': application/json: schemaArray: - type: object properties: reqId: allOf: - type: string statusCode: allOf: - type: number enum: - 422 message: allOf: - {} error: allOf: - type: string requiredProperties: - reqId - statusCode - error additionalProperties: false examples: example: value: reqId: statusCode: 422 message: error: description: Default Response '500': application/json: schemaArray: - type: object properties: reqId: allOf: - type: string statusCode: allOf: - type: number enum: - 500 message: allOf: - type: string error: allOf: - type: string requiredProperties: - reqId - statusCode - message - error additionalProperties: false examples: example: value: reqId: statusCode: 500 message: error: description: Default Response deprecated: false type: path components: schemas: {} ```` --- # Source: https://infisical.com/docs/sdks/languages/java.md > ## Documentation Index > Fetch the complete documentation index at: https://infisical.com/docs/llms.txt > Use this file to discover all available pages before exploring further. # Infisical Java SDK If you're working with Java, the official Infisical Java SDK package is the easiest way to fetch and work with secrets for your application. ## Installation Replace `{version}` with the version of the SDK you wish to use. This documentation covers version >=3.0.0. ### Maven ```xml theme={"dark"} com.infisical sdk {version} ``` ### Gradle ```gradle theme={"dark"} implementation group: 'com.infisical', name: 'sdk', version: '{version}' ``` ### Others For other build tools, please check our [package snippets](https://central.sonatype.com/artifact/com.infisical/sdk), and select the build tool you're using for your project. ## Getting Started ```java theme={"dark"} package com.example.example; import com.infisical.sdk.InfisicalSdk; import com.infisical.sdk.SdkConfig; public class Example { public static void main(String[] args) { var sdk = new InfisicalSdk( new SdkConfig.Builder() // Optional, will default to https://app.infisical.com .withSiteUrl("https://your-infisical-instance.com") .build() ); sdk.Auth().UniversalAuthLogin( "CLIENT_ID", "CLIENT_SECRET" ); var secret = sdk.Secrets().GetSecret( "", "", "", "", null, // Expand Secret References (boolean, optional) null, // Include Imports (boolean, optional) null // Secret Type (shared/personal, defaults to shared, optional) ); System.out.println(secret); } } ``` ## Core Methods The SDK methods are organized into the following high-level categories: 1. `Auth()`: Handles authentication methods. 2. `Secrets()`: Manages CRUD operations for secrets. ### `Auth` The `Auth` component provides methods for authentication: ### Universal Auth #### Authenticating ```java theme={"dark"} public void UniversalAuthLogin( String clientId, String clientSecret ) throws InfisicalException ``` ```java theme={"dark"} sdk.Auth().UniversalAuthLogin( "CLIENT_ID", "CLIENT_SECRET" ); ``` **Parameters:** * `clientId` (string): The client ID of your Machine Identity. * `clientSecret` (string): The client secret of your Machine Identity. ### AWS Auth ```java theme={"dark"} public void AwsAuthLogin( String identityId ) throws InfisicalException ``` ```java theme={"dark"} sdk.Auth().AwsAuthLogin(""); ``` **Parameters:** * `identityId` (String): The ID of the machine identity to authenticate with. ### LDAP Auth ```java theme={"dark"} public void LdapAuthLogin( LdapAuthLoginInput input ) throws InfisicalException ``` ```java theme={"dark"} var input = LdapAuthLoginInput .builder() .identityId("") .username("") .password("") .build(); sdk.Auth().LdapAuthLogin(input); ``` **Parameters:** * `input` (LdapAuthLoginInput): The input for authenticating with LDAP. * `identityId` (String): The ID of the machine identity to authenticate with. * `username` (String): The LDAP username. * `password` (String): The LDAP password. ### Access Token Auth #### Authenticating ```java theme={"dark"} public void SetAccessToken( String accessToken ) throws InfisicalException ``` ```java theme={"dark"} sdk.Auth().SetAccessToken("ACCESS_TOKEN"); ``` **Parameters:** * `accessToken` (string): The access token you want to use for authentication. ### `Secrets` This sub-class handles operations related to secrets: #### List Secrets ```java theme={"dark"} public List ListSecrets( String projectId, String environmentSlug, String secretPath, Boolean expandSecretReferences, Boolean recursive, Boolean includeImports, Boolean setSecretsOnSystemProperties ) throws InfisicalException ``` ```java theme={"dark"} List secrets = sdk.Secrets().ListSecrets( "", "", // dev, prod, staging, etc. "/secret/path", // `/` is the root folder false, // Should expand secret references false, // Should get secrets recursively from sub folders false, // Should include imports false // Should set the fetched secrets as key/value pairs on the system properties. Makes the secrets accessible as System.getProperty("") ); ``` **Parameters:** * `projectId` (string): The ID of your project. * `environmentSlug` (string): The environment in which to list secrets (e.g., "dev"). * `secretPath` (string): The path to the secrets. * `expandSecretReferences` (boolean): Whether to expand secret references. * `recursive` (boolean): Whether to list secrets recursively. * `includeImports` (boolean): Whether to include imported secrets. * `setSecretsOnSystemProperties` (boolean): Set the retrieved secrets as key/value pairs on the system properties, making them accessible through `System.getProperty("")` **Returns:** * `List`: The response containing the list of secrets. #### Create Secret ```java theme={"dark"} public Secret CreateSecret( String secretName, String secretValue, String projectId, String environmentSlug, String secretPath ) throws InfisicalException ``` ```java theme={"dark"} Secret newSecret = sdk.Secrets().CreateSecret( "NEW_SECRET_NAME", "secret-value", "", "", // dev, prod, staging, etc. "/secret/path", // `/` is the root folder ); ``` **Parameters:** * `secretName` (string): The name of the secret to create * `secretValue` (string): The value of the secret. * `projectId` (string): The ID of your project. * `environmentSlug` (string): The environment in which to create the secret. * `secretPath` (string, optional): The path to the secret. **Returns:** * `Secret`: The created secret. #### Update Secret ```java theme={"dark"} public Secret UpdateSecret( String secretName, String projectId, String environmentSlug, String secretPath, String newSecretValue, String newSecretName ) throws InfisicalException ``` ```java theme={"dark"} Secret updatedSecret = sdk.Secrets().UpdateSecret( "SECRET_NAME", "", "", // dev, prod, staging, etc. "/secret/path", // `/` is the root folder "NEW_SECRET_VALUE", // nullable "NEW_SECRET_NAME" // nullable ); ``` **Parameters:** * `secretName` (string): The name of the secret to update. * `projectId` (string): The ID of your project. * `environmentSlug` (string): The environment in which to update the secret. * `secretPath` (string): The path to the secret. * `newSecretValue` (string, nullable): The new value of the secret. * `newSecretName` (string, nullable): A new name for the secret. **Returns:** * `Secret`: The updated secret. #### Get Secret by Name ```java theme={"dark"} public Secret GetSecret( String secretName, String projectId, String environmentSlug, String secretPath, Boolean expandSecretReferences, Boolean includeImports, String secretType ) throws InfisicalException ``` ```java theme={"dark"} Secret secret = sdk.Secrets().GetSecret( "SECRET_NAME", "", "", // dev, prod, staging, etc. "/secret/path", // `/` is the root folder false, // Should expand secret references false, // Should get secrets recursively from sub folders false, // Should include imports "shared" // Optional Secret Type (defaults to "shared") ); ``` **Parameters:** * `secretName` (string): The name of the secret to get\` * `projectId` (string): The ID of your project. * `environmentSlug` (string): The environment in which to retrieve the secret. * `secretPath` (string): The path to the secret. * `expandSecretReferences` (boolean, optional): Whether to expand secret references. * `includeImports` (boolean, optional): Whether to include imported secrets. * `secretType` (personal | shared, optional): The type of secret to fetch. **Returns:** * `Secret`: The fetched secret. #### Delete Secret by Name ```java theme={"dark"} public Secret DeleteSecret( String secretName, String projectId, String environmentSlug, String secretPath ) throws InfisicalException ``` ```java theme={"dark"} Secret deletedSecret = sdk.Secrets().DeleteSecret( "SECRET_NAME", "", "", // dev, prod, staging, etc. "/secret/path", // `/` is the root folder ); ``` **Parameters:** * `secretName` (string): The name of the secret to delete. * `projectId` (string): The ID of your project. * `environmentSlug` (string): The environment in which to delete the secret. * `secretPath` (string, optional): The path to the secret. **Returns:** * `Secret`: The deleted secret. ### `Folders` #### Get Folder By Name ```java theme={"dark"} public Folder Get( String folderId ); throws InfisicalException ``` ```java theme={"dark"} Folder folder = sdk.Folders().Get(""); ``` **Parameters:** * `folderId` (String): The ID of the folder to retrieve. **Returns:** * `Folder`: The retrieved folder. #### List Folders ```java theme={"dark"} public List List( ListFoldersInput input ) throws InfisicalException ``` ```java theme={"dark"} ListFoldersInput input = ListFoldersInput .builder() .projectId("") .environmentSlug("") .folderPath("/") .recursive(false) .build(); List folders = sdk.Folders().List(input); ``` **Parameters:** * `input` (ListFoldersInput): The input for listing folders. * `projectId` (String): The ID of the project to list folders from. * `environmentSlug` (String): The slug of the environment to list folders from. * `folderPath` (String): The path to list folders from. Defaults to `/`. * `recursive` (Boolean): Whether or not to list sub-folders recursively from the specified folder path and downwards. Defaults to `false`. **Returns:** * `List`: The retrieved folders. #### Create Folder ```java theme={"dark"} public Folder Create( CreateFolderInput input ) throws InfisicalException ``` ```java theme={"dark"} var input = CreateFolderInput .builder() .projectId("") .environmentSlug("") .folderName("") .folderPath("/") .description("Optional folder description") .build(); Folder createdFolder = sdk.Folders().Create(input); ``` **Parameters:** * `input` (CreateFolderInput): The input for creating a folder. * `projectId` (String): The ID of the project to create the folder in. * `environmentSlug` (String): The slug of the environment to create the folder in. * `folderPath` (String): The path to create the folder in. Defaults to `/`. * `folderName` (String): The name of the folder to create. * `description` (String): The description of the folder to create. This is optional. **Returns:** * `Folder`: The created folder. #### Update Folder ```java theme={"dark"} public Folder Update( UpdateFolderInput input ) throws InfisicalException ``` ```java theme={"dark"} var input = UpdateFolderInput .builder() .projectId("") .environmentSlug("") .folderId("") .newFolderName("") .folderPath("/") .build(); Folder updatedFolder = sdk.Folders().Update(input); ``` **Parameters:** * `input` (UpdateFolderInput): The input for updating a folder. * `projectId` (String): The ID of the project where the folder exists. * `environmentSlug` (String): The slug of the environment where the folder exists. * `folderPath` (String): The path of the folder to update. * `folderId` (String): The ID of the folder to update. * `newFolderName` (String): The new folder name. **Returns:** * `Folder`: The updated folder. #### Delete Folder ```java theme={"dark"} public Folder Delete( DeleteFolderInput input ) throws InfisicalException ``` ```java theme={"dark"} var input = DeleteFolderInput .builder() .folderId("") .environmentSlug("") .projectId("") .build(); Folder deletedFolder = sdk.Folders().Delete(input); ``` **Parameters:** * `input` (DeleteFolderInput): The input for deleting a folder. * `projectId` (String): The ID of the project where the folder exists. * `environmentSlug` (String): The slug of the environment where the folder exists. * `folderId` (String): The ID of the folder to delete. **Returns:** * `Folder`: The deleted folder. --- # Source: https://infisical.com/docs/documentation/platform/pki/integration-guides/jboss-certbot.md > ## Documentation Index > Fetch the complete documentation index at: https://infisical.com/docs/llms.txt > Use this file to discover all available pages before exploring further. # JBoss/WildFly > Learn how to issue TLS certificates from Infisical using ACME enrollment on JBoss/WildFly with Certbot This guide demonstrates how to use Infisical to issue TLS certificates for your [JBoss](https://www.jboss.org/)/[WildFly](https://wildfly.org/) application server. It uses [Certbot](https://certbot.eff.org/), an installable [ACME](https://en.wikipedia.org/wiki/Automatic_Certificate_Management_Environment) client, to request and renew certificates from Infisical using the [ACME enrollment method](/documentation/platform/pki/enrollment-methods/acme) configured on a [certificate profile](/documentation/platform/pki/certificates/profiles). JBoss/WildFly requires certificates in Java keystore format, which this guide addresses through the certificate conversion process. ## Prerequisites Before you begin, make sure you have: * A [JBoss](https://www.jboss.org/)/[WildFly](https://wildfly.org/) application server running on a Linux system with administrative access. * A [certificate profile](/documentation/platform/pki/certificates/profiles) configured with the [ACME enrollment method](/documentation/platform/pki/enrollment-methods/acme) in Infisical. * Network connectivity from your JBoss/WildFly server to Infisical. * Port 80 open and reachable for ACME [HTTP-01](https://letsencrypt.org/docs/challenge-types/#http-01-challenge) validation. * [Java Development Kit (JDK)](https://openjdk.org/) installed for keystore management tools. ## Guide Navigate to your certificate management project in Infisical and locate your [certificate profile](/documentation/platform/pki/certificates/profiles) configured with the [ACME enrollment method](/documentation/platform/pki/enrollment-methods/acme). Certificate profile with ACME enrollment option Click the **Reveal ACME EAB** option to view the ACME configuration details. ACME configuration modal showing directory URL and EAB credentials From the ACME configuration, gather the following values: * ACME Directory URL: The URL that Certbot will use to communicate with Infisical's ACME server. This takes the form `https://your-infisical-instance.com/api/v1/cert-manager/certificate-profiles/{profile-id}/acme/directory`. * EAB Key Identifier (KID): A unique identifier that tells Infisical which ACME account is making the request. * EAB Secret: A secret key that authenticates your ACME client with Infisical. Keep your EAB credentials secure as they authenticate your ACME client with Infisical PKI. These credentials are unique to each [certificate profile](/documentation/platform/pki/certificates/profiles) and should not be shared. Install Certbot on the server where JBoss/WildFly is running by following the official Certbot [installation guide](https://certbot.eff.org/instructions). The installation guide provides up-to-date instructions for various Linux distributions and package managers, ensuring you get the most current version of Certbot. After installation, you can verify that Certbot has been installed correctly by running: ```bash theme={"dark"} certbot --version ``` Since JBoss/WildFly doesn't have a native Certbot plugin, use the standalone authenticator to obtain certificates. **Important**: You must stop JBoss/WildFly before running this command as Certbot needs to bind to port 80 for the [HTTP-01](https://letsencrypt.org/docs/challenge-types/#http-01-challenge) challenge. Stop your JBoss/WildFly server: ```bash theme={"dark"} sudo systemctl stop wildfly # or for older JBoss versions # sudo systemctl stop jboss ``` Run the following command to request a certificate from Infisical: ```bash theme={"dark"} sudo certbot certonly \ --standalone \ --server "https://your-infisical-instance.com/api/v1/cert-manager/certificate-profiles/{profile-id}/acme/directory" \ --eab-kid "your-eab-key-identifier" \ --eab-hmac-key "your-eab-secret" \ -d example.infisical.com \ --email admin@example.com \ --agree-tos \ --non-interactive ``` For guidance on each parameter: * `certonly`: Instructs Certbot to request a certificate without modifying your JBoss/WildFly configuration; this mode is recommended because JBoss/WildFly requires certificates in Java keystore format rather than the PEM format that Certbot provides. * `--standalone`: Uses Certbot's standalone authenticator to solve the [HTTP-01](https://letsencrypt.org/docs/challenge-types/#http-01-challenge) challenge by starting a temporary web server on port 80. * `--server`: The Infisical ACME directory URL from Step 1. This instructs Certbot to communicate with Infisical's ACME server instead of Let's Encrypt. * `--eab-kid`: Your External Account Binding (EAB) Key Identifier from Step 1. * `--eab-hmac-key`: The EAB secret associated with the KID from Step 1. * `-d`: Specifies the domain name for which the certificate is being requested. * `--email`: The contact email for expiration notices and account recovery. * `--agree-tos`: Accepts the ACME server's Terms of Service. * `--non-interactive`: Runs Certbot without prompting for user input (recommended for automation). The Certbot command generates a private key on your server, creates a Certificate Signing Request (CSR) using that key, and sends the CSR to Infisical for certificate issuance. Certbot stores the private key and resulting leaf certificate and full certificate chain in `/etc/letsencrypt/live/{domain-name}/`. Because JBoss/WildFly requires certificates in Java keystore format, you'll need to convert the PEM certificates provided by Certbot in the next step. JBoss/WildFly requires certificates in Java keystore format rather than the PEM format provided by Certbot. Convert the PEM certificates to PKCS#12 format, which is supported by modern JBoss/WildFly versions. Create a PKCS#12 keystore from the PEM files: ```bash theme={"dark"} sudo openssl pkcs12 -export \ -out /opt/wildfly/standalone/configuration/keystore.p12 \ -inkey /etc/letsencrypt/live/example.infisical.com/privkey.pem \ -in /etc/letsencrypt/live/example.infisical.com/cert.pem \ -certfile /etc/letsencrypt/live/example.infisical.com/chain.pem \ -passout pass:changeit ``` Set appropriate file permissions for security: ```bash theme={"dark"} sudo chown wildfly:wildfly /opt/wildfly/standalone/configuration/keystore.p12 sudo chmod 600 /opt/wildfly/standalone/configuration/keystore.p12 ``` You will need to configure JBoss/WildFly to use the new keystore. This process varies depending on your JBoss/WildFly version and security configuration (legacy security realms vs. Elytron subsystem). Refer to your [JBoss](https://access.redhat.com/documentation/en-us/red_hat_jboss_enterprise_application_platform)/[WildFly](https://docs.wildfly.org/) administration guide for specific SSL/TLS configuration steps. Replace `changeit` with a strong password and adjust the WildFly installation path based on your environment. Modern WildFly versions support PKCS#12 keystores directly, while older versions may require conversion to JKS format using the [keytool](https://docs.oracle.com/javase/8/docs/technotes/tools/unix/keytool.html) utility. After configuring JBoss/WildFly SSL, verify that your certificate was issued correctly and the keystore was created properly. Check that the certificate files were created by Certbot: ```bash theme={"dark"} sudo ls -la /etc/letsencrypt/live/example.infisical.com/ ``` You should see files like: * `cert.pem` (your certificate) * `chain.pem` (certificate chain) * `fullchain.pem` (certificate + chain) * `privkey.pem` (private key) Verify the PKCS#12 keystore was created: ```bash theme={"dark"} sudo ls -la /opt/wildfly/standalone/configuration/keystore.p12 ``` Test the keystore contents (optional): ```bash theme={"dark"} sudo keytool -list -storetype PKCS12 -keystore /opt/wildfly/standalone/configuration/keystore.p12 -storepass changeit ``` Once you've configured JBoss/WildFly to use the keystore and restarted the service, you can verify HTTPS is working by accessing your application over SSL. Unlike standard web servers, JBoss/WildFly certificate renewal requires additional steps because certificates must be converted to Java keystore format and the application server must be restarted to use the new certificates. To test the renewal process without affecting your live certificates, run the following command: ```bash theme={"dark"} sudo certbot renew --dry-run ``` This command simulates the full renewal process without modifying your active certificate. If the dry run succeeds, the renewal mechanism itself will work as expected. For actual renewal, since JBoss/WildFly requires the standalone authenticator, you'll need to stop the server, perform the renewal, convert the certificate, and restart: ```bash theme={"dark"} # Stop JBoss/WildFly sudo systemctl stop wildfly # Renew the certificate sudo certbot renew --quiet # Convert to keystore format sudo openssl pkcs12 -export \ -out /opt/wildfly/standalone/configuration/keystore.p12 \ -inkey /etc/letsencrypt/live/example.infisical.com/privkey.pem \ -in /etc/letsencrypt/live/example.infisical.com/cert.pem \ -certfile /etc/letsencrypt/live/example.infisical.com/chain.pem \ -passout pass:changeit # Set permissions sudo chown wildfly:wildfly /opt/wildfly/standalone/configuration/keystore.p12 sudo chmod 600 /opt/wildfly/standalone/configuration/keystore.p12 # Start JBoss/WildFly sudo systemctl start wildfly ``` To automate this process, you can create a renewal script. Create `/etc/letsencrypt/renewal-hooks/deploy/jboss-renewal.sh`: ```bash theme={"dark"} #!/bin/bash # JBoss/WildFly certificate renewal hook DOMAIN="example.infisical.com" KEYSTORE_PATH="/opt/wildfly/standalone/configuration/keystore.p12" KEYSTORE_PASSWORD="changeit" # Convert certificate to keystore format openssl pkcs12 -export \ -out "$KEYSTORE_PATH" \ -inkey "/etc/letsencrypt/live/$DOMAIN/privkey.pem" \ -in "/etc/letsencrypt/live/$DOMAIN/cert.pem" \ -certfile "/etc/letsencrypt/live/$DOMAIN/chain.pem" \ -passout "pass:$KEYSTORE_PASSWORD" # Set permissions chown wildfly:wildfly "$KEYSTORE_PATH" chmod 600 "$KEYSTORE_PATH" # Restart WildFly to load new certificate systemctl restart wildfly ``` Make the hook executable: ```bash theme={"dark"} sudo chmod +x /etc/letsencrypt/renewal-hooks/deploy/jboss-renewal.sh ``` Certbot automatically renews certificates when they are within 30 days of expiration using its built-in systemd timer. The deploy hook above will run after each successful renewal, handling the keystore conversion and service restart automatically. Because JBoss/WildFly requires the standalone authenticator (which stops the service temporarily), plan for brief service interruptions during renewal. --- # Source: https://infisical.com/docs/integrations/cicd/jenkins.md > ## Documentation Index > Fetch the complete documentation index at: https://infisical.com/docs/llms.txt > Use this file to discover all available pages before exploring further. # Jenkins Plugin > How to effectively and securely manage secrets in Jenkins using Infisical **Objective**: Fetch secrets from Infisical to Jenkins pipelines In this guide, we'll outline the steps to deliver secrets from Infisical to Jenkins via the Infisical CLI. At a high level, the Infisical CLI will be executed within your build environment and use a machine identity to authenticate with Infisical. This token must be added as a Jenkins Credential and then passed to the Infisical CLI as an environment variable, enabling it to access and retrieve secrets within your workflows. Prerequisites: * Set up and add secrets to [Infisical](https://app.infisical.com). * Create a [machine identity](/documentation/platform/identities/machine-identities) (Recommended), or a service token in Infisical. * You have a working Jenkins installation with the [credentials plugin](https://plugins.jenkins.io/credentials/) installed. * You have the [Infisical CLI](/cli/overview) installed on your Jenkins executor nodes or container images. ## Jenkins Infisical Plugin This plugin adds a build wrapper to set environment variables from [Infisical](https://infisical.com). Secrets are generally masked in the build log, so you can't accidentally print them. ## Installation To install the plugin, navigate to `Manage Jenkins -> Plugins -> Available plugins` and search for `Infisical`. Install the plugin and restart Jenkins. Install Plugin ## Infisical Authentication Authenticating with Infisical is done through the use of [Machine Identities](https://infisical.com/docs/documentation/platform/identities/machine-identities). Currently the Jenkins plugin only supports [Universal Auth](https://infisical.com/docs/documentation/platform/identities/universal-auth) for authentication. More methods will be added soon. ### How does Universal Auth work? To use Universal Auth, you'll need to create a new Credential *(Infisical Universal Auth Credential)*. The credential should contain your Universal Auth client ID, and your Universal Auth client secret. Please [read more here](https://infisical.com/docs/documentation/platform/identities/universal-auth) on how to setup a Machine Identity to use universal auth. ### Creating a Universal Auth credential Creating a universal auth credential inside Jenkins is very straight forward. Simply navigate to
`Dashboard -> Manage Jenkins -> Credentials -> System -> Global credentials (unrestricted)`. Press the `Add Credentials` button and select `Infisical Universal Auth Credential` in the `Kind` field. The `ID` and `Description` field doesn't matter much in this case, as they won't be read anywhere. The description field will be displayed as the credential name during the plugin configuration. Infisical Universal Auth Credential ## Plugin Usage ### Configuration Configuration takes place on a job-level basis. Inside your job, you simply tick the `Infisical Plugin` checkbox under "Build Environment". After enabling the plugin, you'll see a new section appear where you'll have to configure the plugin. Plugin enabled You'll be prompted with 4 options to fill: * Infisical URL * This defaults to [https://app.infisical.com](https://app.infisical.com). This field is only relevant if you're running a managed or self-hosted instance. If you are using Infisical Cloud, leave this as-is, otherwise enter the URL of your Infisical instance. * Infisical Credential * This is where you select your Infisical credential to use for authentication. In the step above [Creating a Universal Auth credential](#creating-a-universal-auth-credential), you can read on how to configure the credential. Simply select the credential you have created for this field. * Infisical Project Slug * This is the slug of the project you wish to fetch secrets from. You can find this in your project settings on Infisical by clicking "Copy project slug". * Environment Slug * This is the slug of the environment to fetch secrets from. In most cases it's either `dev`, `staging`, or `prod`. You can however create custom environments in Infisical. If you are using custom environments, you need to enter the slug of the custom environment you wish to fetch secrets from. That's it! Now you're ready to select which secrets you want to fetch into Jenkins. By clicking the `Add an Infisical secret` in the Jenkins UI like seen in the screenshot below. Add Infisical secret You need to select which secrets that should be pulled into Jenkins. You start by specifying a [folder path from Infisical](https://infisical.com/docs/documentation/platform/folder#comparing-folders). The root path is simply `/`. You also need to select wether or not you want to [include imports](https://infisical.com/docs/documentation/platform/secret-reference#secret-imports). Now you can add secrets the secret keys that you want to pull from Infisical into Jenkins. If you want to add multiple secrets, press the "Add key/value pair". If you wish to pull secrets from multiple paths, you can press the "Add an Infisical secret" button at the bottom, and configure a new set of secrets to pull. ## Pipeline usage ### Generating pipeline block Using the Infisical Plugin in a Jenkins pipeline is very straight forward. To generate a block to use the Infisical Plugin in a Pipeline, simply to go `{JENKINS_URL}/jenkins/job/{JOB_ID}/pipeline-syntax/`. You can find a direct link on the Pipeline configuration page in the very bottom of the page, see image below. Pipeline Syntax Highlight On the Snippet Generator page, simply configure the Infisical Plugin like it's documented in the [Configuration documentation](#configuration) step. Once you have filled out the configuration, press `Generate Pipeline Script`, and it will generate a block you can use in your pipeline. Pipeline Configuration ### Using Infisical in a Pipeline Using the generated block in a pipeline is very straight forward. There's a few approaches on how to implement the block in a Pipeline script. Here's an example of using the generated block in a pipeline script. Make sure to replace the placeholder values with your own values. The script is formatted for clarity. All these fields will be pre-filled for you if you use the `Snippet Generator` like described in the [step above](#generating-pipeline-block). ```groovy theme={"dark"} node { withInfisical( configuration: [ infisicalCredentialId: 'YOUR_CREDENTIAL_ID', infisicalEnvironmentSlug: 'PROJECT_ENV_SLUG', infisicalProjectSlug: 'PROJECT_SLUG', infisicalUrl: 'https://app.infisical.com' // Change this to your Infisical instance URL if you aren't using Infisical Cloud. ], infisicalSecrets: [ infisicalSecret( includeImports: true, path: '/', secretValues: [ [infisicalKey: 'DATABASE_URL'], [infisicalKey: "API_URL"], [infisicalKey: 'THIS_KEY_MIGHT_NOT_EXIST', isRequired: false], ] ) ] ) { // Code runs here sh "printenv" } } ```
## Add Infisical Service Token to Jenkins After setting up your project in Infisical and installing the Infisical CLI to the environment where your Jenkins builds will run, you will need to add the Infisical Service Token to Jenkins. To generate a Infisical service token, follow the guide [here](/documentation/platform/token). Once you have generated the token, navigate to **Manage Jenkins > Manage Credentials** in your Jenkins instance. Jenkins step 1 Click on the credential store you want to store the Infisical Service Token in. In this case, we're using the default Jenkins global store. Each of your projects will have a different `INFISICAL_TOKEN`. As a result, it may make sense to spread these out into separate credential domains depending on your use case. Jenkins step 2 Now, click Add Credentials. Jenkins step 3 Choose **Secret text** for the **Kind** option from the dropdown list and enter the Infisical Service Token in the **Secret** field. Although the **ID** can be any value, we'll set it to `infisical-service-token` for the sake of this guide. The description is optional and can be any text you prefer. Jenkins step 4 When you're done, you should see a credential similar to the one below: Jenkins step 5 ## Use Infisical in a Freestyle Project To fetch secrets with Infisical in a Freestyle Project job, you'll need to expose the credential you created above as an environment variable to the Infisical CLI. To do so, first click **New Item** from the dashboard navigation sidebar: Jenkins step 6 Enter the name of the job, choose the **Freestyle Project** option, and click **OK**. Jenkins step 7 Scroll down to the **Build Environment** section and enable the **Use secret text(s) or file(s)** option. Then click **Add** under the **Bindings** section and choose **Secret text** from the dropdown menu. Jenkins step 8 Enter `INFISICAL_TOKEN` in the **Variable** field then click the **Specific credentials** option from the Credentials section and select the credential you created earlier. In this case, we saved it as `Infisical service token` so we'll choose that from the dropdown menu. Jenkins step 9 Scroll down to the **Build** section and choose **Execute shell** from the **Add build step** menu. Jenkins step 10 In the command field, you can now use the Infisical CLI to fetch secrets. The example command below will print the secrets using the service token passed as a credential. When done, click **Save**. ``` infisical secrets --env=dev --path=/ ``` Jenkins step 11 Finally, click **Build Now** from the navigation sidebar to run your new job. Running into issues? Join Infisical's [community Slack](https://infisical.com/slack) for quick support. ## Use Infisical in a Jenkins Pipeline To fetch secrets using Infisical in a Pipeline job, you'll need to expose the Jenkins credential you created above as an environment variable. To do so, click **New Item** from the dashboard navigation sidebar: Jenkins step 6 Enter the name of the job, choose the **Pipeline** option, and click OK. Jenkins step 12 Scroll down to the **Pipeline** section, paste the following into the **Script** field, and click **Save**. ``` pipeline { agent any environment { INFISICAL_TOKEN = credentials('infisical-service-token') } stages { stage('Run Infisical') { steps { sh("infisical secrets --env=dev --path=/") // doesn't work // sh("docker run --rm test-container infisical secrets") // works // sh("docker run -e INFISICAL_TOKEN=${INFISICAL_TOKEN} --rm test-container infisical secrets --env=dev --path=/") // doesn't work // sh("docker-compose up -d") // works // sh("INFISICAL_TOKEN=${INFISICAL_TOKEN} docker-compose up -d") } } } } ```
The example provided above serves as an initial guide. It shows how Jenkins adds the `INFISICAL_TOKEN` environment variable, which is configured in the pipeline, into the shell for executing commands. There may be instances where this doesn't work as expected in the context of running Docker commands. However, the list of working examples should provide some insight into how this can be handled properly. --- # Source: https://infisical.com/docs/documentation/platform/sso/jumpcloud.md # Source: https://infisical.com/docs/documentation/platform/scim/jumpcloud.md # Source: https://infisical.com/docs/documentation/platform/ldap/jumpcloud.md # Source: https://infisical.com/docs/documentation/platform/identities/ldap-auth/jumpcloud.md > ## Documentation Index > Fetch the complete documentation index at: https://infisical.com/docs/llms.txt > Use this file to discover all available pages before exploring further. # JumpCloud > Learn how to authenticate with Infisical using LDAP with JumpCloud. **LDAP Auth** is an LDAP based authentication method that allows you to authenticate with Infisical using a machine identity configured with an [LDAP](https://en.wikipedia.org/wiki/Lightweight_Directory_Access_Protocol) directory. ## Guide In JumpCloud, head to USER MANAGEMENT > Users and create a new user via the Manual user entry option. This user will be used as a privileged service account to facilitate Infisical's ability to bind/search the LDAP directory. Next after creating the user, under User Security Settings and Permissions > Permission Settings, check the box next to Enable as LDAP Bind DN. User management To create an identity, head to your Organization Settings > Access Control > Identities and press **Create identity**. Create identity When creating an identity, you specify an organization level role for it to assume; you can configure roles in Organization Settings > Access Control > Organization Roles. Create identity modal Now input a few details for your new identity. Here's some guidance for each field: * Name (required): A friendly name for the identity. * Role (required): A role from the Organization Roles tab for the identity to assume. The organization role assigned will determine what organization level resources this identity can have access to. Once you've created an identity, you'll be redirected to a page where you can manage the identity. To configure LDAP auth for your identity, press the **Add Auth Method** button on the identity's page. Add auth method Now select **LDAP Auth** from the list of available auth methods for the identity. Select LDAP auth After selecting **LDAP Auth**, you'll see the form you need to fill out to configure LDAP auth for your identity. The following fields are available: * `URL`: The LDAP server to connect to (`ldaps://ldap.jumpcloud.com:636`). * `Bind DN`: The distinguished name of object to bind when performing the user search (`uid=,ou=Users,o=,dc=jumpcloud,dc=com`). * `Bind Pass`: The password to use along with Bind DN when performing the user search. This is the password for the user created in the previous step. * `Search Base / DN`: Base DN under which to perform user search (`ou=Users,o=,dc=jumpcloud,dc=com`). * `User Search Filter`: Template used to construct the LDAP user search filter (`(uid={{username}})`). * `Required Attributes`: A key/value pair of attributes that must be present in the LDAP user entry for them to be authenticated. As an example, if you set key `uid` to value `user1,user2,user3`, then only users with `uid` of `user1`, `user2`, or `user3` will be able to login with this identity. Each value is a comma separated list of attributes. * `CA Certificate`: The CA certificate to use when verifying the LDAP server certificate (instructions to obtain the certificate for JumpCloud [here](https://jumpcloud.com/support/connect-to-ldap-with-tls-ssl)). * `Access Token TTL` *(default is 2592000 equivalent to 30 days)*: The lifetime for an access token in seconds. This value will be referenced at renewal time. * `Access Token Max TTL` *(default is 2592000 equivalent to 30 days)*: The maximum lifetime for an access token in seconds. This value will be referenced at renewal time. * `Access Token Max Number of Uses` *(default is 0)*: The maximum number of times that an access token can be used; a value of 0 implies infinite number of uses. * `Access Token Trusted IPs`: The IPs or CIDR ranges that access tokens can be used from. By default, each token is given the 0.0.0.0/0, allowing usage from any network address. Once you've filled out the form, press **Add** to save your changes. Configure LDAP auth After configuring LDAP auth for your identity, you can authenticate with the identity and obtain an access token using your LDAP credentials. ```bash theme={"dark"} curl --request POST \ --url https://app.infisical.com/api/v1/auth/ldap-auth/login \ --header 'Content-Type: application/json' \ --data '{ "identityId": "", "username": "", "password": "" }' ``` For EU Cloud and Self-Hosted users, make sure to replace `https://app.infisical.com` with `https://eu.infisical.com` or your self-hosted instance's URL in the request URL. If successful, you'll receive an access token in the response body. ```json theme={"dark"} { "accessToken": "your-access-token", "expiresIn": 2592000, "accessTokenMaxTTL": 2592000, "tokenType": "Bearer" } ``` You can read more about the login API endpoint [here](/api-reference/endpoints/ldap-auth/login). --- # Source: https://infisical.com/docs/documentation/platform/identities/jwt-auth.md > ## Documentation Index > Fetch the complete documentation index at: https://infisical.com/docs/llms.txt > Use this file to discover all available pages before exploring further. # JWT Auth > Learn how to authenticate with Infisical using JWT-based authentication. **JWT Auth** is a platform-agnostic authentication method that validates JSON Web Tokens (JWTs) issued by your JWT issuer or authentication system, allowing secure authentication from any platform or environment that can obtain valid JWTs. ## Diagram The following sequence diagram illustrates the JWT Auth workflow for authenticating with Infisical. ```mermaid theme={"dark"} sequenceDiagram participant Client as Client Application participant Issuer as JWT Issuer participant Infis as Infisical Client->>Issuer: Step 1: Request JWT token Issuer-->>Client: Return signed JWT with claims Note over Client,Infis: Step 2: Login Operation Client->>Infis: Send signed JWT to /api/v1/auth/jwt-auth/login Note over Infis: Step 3: JWT Validation Infis->>Infis: Validate JWT signature using configured public keys or JWKS Infis->>Infis: Verify required claims (aud, sub, iss) Note over Infis: Step 4: Token Generation Infis->>Client: Return short-lived access token Note over Client,Infis: Step 5: Access Infisical API with Token Client->>Infis: Make authenticated requests using the short-lived access token ``` ## Concept At a high-level, Infisical authenticates a client by verifying the JWT and checking that it meets specific requirements (e.g. it is signed by a trusted key) at the `/api/v1/auth/jwt-auth/login` endpoint. If successful, then Infisical returns a short-lived access token that can be used to make authenticated requests to the Infisical API. To be more specific: 1. The client requests a JWT from their JWT issuer. 2. The fetched JWT is sent to Infisical at the `/api/v1/auth/jwt-auth/login` endpoint. 3. Infisical validates the JWT signature using either: * Pre-configured public keys (Static configuration) * Public keys fetched from a JWKS endpoint (JWKS configuration) 4. Infisical verifies that the configured claims match in the token. This includes standard claims like subject, audience, and issuer, as well as any additional custom claims specified in the configuration. 5. If all is well, Infisical returns a short-lived access token that the client can use to make authenticated requests to the Infisical API. For JWKS configuration, Infisical needs network-level access to the configured JWKS endpoint. ## Guide In the following steps, we explore how to create and use identities to access the Infisical API using the JWT authentication method. To create an identity, head to your Organization Settings > Access Control > Identities and press **Create identity**. identities organization When creating an identity, you specify an organization level [role](/documentation/platform/access-controls/role-based-access-controls) for it to assume; you can configure roles in Organization Settings > Access Control > Organization Roles. identities organization create Now input a few details for your new identity. Here's some guidance for each field: * Name (required): A friendly name for the identity. * Role (required): A role from the **Organization Roles** tab for the identity to assume. The organization role assigned will determine what organization level resources this identity can have access to. Once you've created an identity, you'll be redirected to a page where you can manage the identity. identities page Since the identity has been configured with Universal Auth by default, you should re-configure it to use JWT Auth instead. To do this, press to edit the **Authentication** section, remove the existing Universal Auth configuration, and add a new JWT Auth configuration onto the identity. identities page remove default auth identities create jwt auth method identities create jwt auth method Restrict access by properly configuring the JWT validation settings. Here's some more guidance for each field: **Static configuration**: * Public Keys: One or more PEM-encoded public keys (RSA or ECDSA) used to verify JWT signatures. Each key must include the proper BEGIN/END markers. **JWKS configuration**: * JWKS URL: The endpoint URL that serves your JSON Web Key Sets (JWKS). This endpoint must provide the public keys used for JWT signature verification. * JWKS CA Certificate: Optional PEM-encoded CA certificate used for validating the TLS connection to the JWKS endpoint. **Common fields for both configurations**: * Issuer: The unique identifier of the JWT provider. This value is used to verify the iss (issuer) claim in the JWT. * Audiences: A list of intended recipients. This value is checked against the aud (audience) claim in the token. * Subject: The expected principal that is the subject of the JWT. This value is checked against the sub (subject) claim in the token. * Claims: Additional claims that must be present in the JWT for it to be valid. You can specify required claim names and their expected values. * Access Token TTL (default is `2592000` equivalent to 30 days): The lifetime for an access token in seconds. This value will be referenced at renewal time. * Access Token Max TTL (default is `2592000` equivalent to 30 days): The maximum lifetime for an access token in seconds. This value will be referenced at renewal time. * Access Token Max Number of Uses (default is `0`): The maximum number of times that an access token can be used; a value of `0` implies infinite number of uses. * Access Token Trusted IPs: The IPs or CIDR ranges that access tokens can be used from. By default, each token is given the `0.0.0.0/0`, allowing usage from any network address. The `subject`, `audiences`, and `claims` fields support glob pattern matching; however, we highly recommend using hardcoded values whenever possible. To enable the identity to access project-level resources such as secrets within a specific project, you should add it to that project. To do this, head over to the project you want to add the identity to and go to Project Settings > Access Control > Machine Identities and press **Add identity**. Next, select the identity you want to add to the project and the project level role you want to allow it to assume. The project role assigned will determine what project level resources this identity can have access to. identities project identities project create To access the Infisical API as the identity, you will need to obtain a JWT from your JWT issuer that meets the validation requirements configured in step 2. Once you have obtained a valid JWT, you can use it to authenticate with Infisical at the `/api/v1/auth/jwt-auth/login` endpoint. We provide a code example below of how you might use the JWT to authenticate with Infisical to gain access to the [Infisical API](/api-reference/overview/introduction). The shown example uses Node.js but you can use any other language to authenticate with Infisical using your JWT. ```javascript theme={"dark"} try { // Obtain JWT from your issuer const jwt = ""; const infisicalUrl = "https://app.infisical.com"; // or your self-hosted Infisical URL const identityId = ""; const { data } = await axios.post( `{infisicalUrl}/api/v1/auth/jwt-auth/login`, { identityId, jwt, } ); console.log("result data: ", data); // access token here } catch(err) { console.error(err); } ``` We recommend using one of Infisical's clients like SDKs or the Infisical Agent to authenticate with Infisical using JWT Auth as they handle the authentication process for you. Each identity access token has a time-to-live (TTL) which you can infer from the response of the login operation; the default TTL is `2592000` seconds (30 days) which can be adjusted in the configuration. If an identity access token exceeds its max TTL or maximum number of uses, it can no longer authenticate with the Infisical API. In this case, a new access token should be obtained by performing another login operation with a valid JWT. --- # Source: https://infisical.com/docs/documentation/platform/pki/k8s-cert-manager.md > ## Documentation Index > Fetch the complete documentation index at: https://infisical.com/docs/llms.txt > Use this file to discover all available pages before exploring further. # Kubernetes cert-manager > Learn how to automatically provision and manage TLS certificates in Kubernetes using Infisical ## Concept This guide demonstrates how to use Infisical to issue TLS certificates back to your Kubernetes environment using [cert-manager](https://cert-manager.io/). It uses the [ACME issuer type](https://cert-manager.io/docs/configuration/acme/) to request and renew certificates automatically from Infisical using the [ACME enrollment method](/documentation/platform/pki/enrollment-methods/acme) configured on a [certificate profile](/documentation/platform/pki/certificates/profiles). The issuer is perfect at obtaining X.509 certificates for Ingresses and other Kubernetes resources and can automatically renew them before expiration. The typical workflow involves installing `cert-manager` and configuring resources that represent the connection details to Infisical as well as the certificates you want to issue. Each issued certificate and its corresponding private key are stored in a Kubernetes `Secret`. We recommend reading the official [cert-manager documentation](https://cert-manager.io/docs/) for a complete overview. For the ACME-specific configuration, refer to the [ACME section](https://cert-manager.io/docs/configuration/acme/). ## Workflow A typical workflow for using cert-manager with Infisical via ACME consists of the following steps: 1. Create a [certificate profile](/documentation/platform/pki/certificates/profiles) in Infisical with the [ACME enrollment method](/documentation/platform/pki/enrollment-methods/acme) configured on it. 2. Install `cert-manager` in your Kubernetes cluster. 3. Create a Kubernetes `Secret` containing the EAB (External Account Binding) credentials for the ACME certificate profile. 4. Create an `Issuer` or `ClusterIssuer` resource that connects to the desired Infisical [certificate profile](/documentation/platform/pki/certificates/profiles). 5. Create a `Certificate` resource defining the certificate you wish to issue and the target `Secret` where the certificate and private key will be stored. 6. Use the resulting Kubernetes `Secret` in your Ingresses or other resources. ## Guide The following steps show how to install cert-manager (using `kubectl`) and obtain certificates from Infisical. Follow the instructions [here](/documentation/platform/pki/enrollment-methods/acme) to create a certificate profile that uses ACME enrollment. After completion, you will have the following values: * **ACME Directory URL** * **EAB Key ID (KID)** * **EAB Secret** These will be needed in later steps. Currently, the Infisical ACME enrollment method only supports authentication via dedicated EAB credentials generated per certificate profile. Support for [Kubernetes Auth](/documentation/platform/identities/kubernetes-auth) is planned for the near future. Install cert-manager in your Kubernetes cluster by following the official guide [here](https://cert-manager.io/docs/installation/) or by applying the manifest directly: ```bash theme={"dark"} kubectl apply -f https://github.com/cert-manager/cert-manager/releases/download/v1.19.1/cert-manager.yaml ``` Create a Kubernetes `Secret` that contains the **EAB Secret (HMAC key)** obtained in step 1. The cert-manager uses this secret to authenticate with the Infisical ACME server. ```bash theme={"dark"} kubectl create secret generic infisical-acme-eab-secret \ --namespace \ --from-literal=eabSecret= ``` ```yaml acme-eab-secret.yaml theme={"dark"} apiVersion: v1 kind: Secret metadata: name: infisical-acme-eab-secret namespace: data: eabSecret: ``` ```bash theme={"dark"} kubectl apply -f acme-eab-secret.yaml ``` Next, create a cert-manager `Issuer` (or `ClusterIssuer`) by replacing the placeholders ``, ``, and `` in the configuration below and applying it. This resource configures cert-manager to use your Infisical PKI collection's ACME server for certificate issuance. ```yaml issuer-infisical.yaml theme={"dark"} apiVersion: cert-manager.io/v1 kind: Issuer metadata: name: issuer-infisical namespace: spec: acme: # ACME server URL from your Infisical certificate profile (Step 1) server: # Email address for ACME account # (any valid email works; currently ignored by Infisical) email: # Required to honor the duration field in Certificate resources enableDurationFeature: true externalAccountBinding: # EAB Key ID from Step 1 keyID: # Reference to the Kubernetes Secret containing the EAB # HMAC key (created in Step 3) keySecretRef: name: infisical-acme-eab-secret key: eabSecret privateKeySecretRef: name: issuer-infisical-account-key solvers: - http01: ingress: # Replace with your actual ingress class if different className: nginx ``` ``` kubectl apply -f issuer-infisical.yaml ``` You can check that the issuer was created successfully by running the following command: ```bash theme={"dark"} kubectl get issuers.cert-manager.io -n -o wide ``` ```bash theme={"dark"} NAME AGE issuer-infisical 21h ``` * Currently, the [ACME enrollment method](/documentation/platform/pki/enrollment-methods/acme) only supports the [HTTP-01 challenge](https://letsencrypt.org/docs/challenge-types/#http-01-challenge) method. Support for the [DNS-01 challenge](https://letsencrypt.org/docs/challenge-types/#dns-01-challenge) method is planned for a future release. If domain ownership validation is not desired, you can disable it by enabling the **Skip DNS ownership validation** option in your ACME certificate profile configuration. * An `Issuer` is namespace-scoped. Certificates can only be issued using an `Issuer` that exists in the same namespace as the `Certificate` resource. * If you need to issue certificates across multiple namespaces with a single resource, create a `ClusterIssuer` instead. The configuration is identical except `kind: ClusterIssuer` and no `metadata.namespace`. * More details: [https://cert-manager.io/docs/configuration/acme/](https://cert-manager.io/docs/configuration/acme/) Finally, request a certificate from Infisical ACME server by creating a cert-manager `Certificate` resource. This configuration file specifies the details of the (end-entity/leaf) certificate to be issued. ```yaml certificate-issuer.yaml theme={"dark"} apiVersion: cert-manager.io/v1 kind: Certificate metadata: name: certificate-by-issuer namespace: spec: dnsNames: - certificate-by-issuer.example.com # name of the resulting Kubernetes Secret secretName: certificate-by-issuer # total validity period of the certificate duration: 48h # cert-manager will attempt renewal 12 hours before expiry renewBefore: 12h # set to true to issue a CA certificate (policy must allow/require CA) isCA: false privateKey: algorithm: ECDSA # uses NIST P-256 curve size: 256 issuerRef: name: issuer-infisical ``` The above sample configuration file specifies a certificate to be issued with the dns name `certificate-by-issuer.example.com` and ECDSA private key using the P-256 curve, valid for 48 hours; the certificate will be automatically renewed by `cert-manager` 12 hours before expiry. The certificate is issued by the issuer `issuer-infisical` created in the previous step and the resulting certificate and private key will be stored in a secret named `certificate-by-issuer`. Note that the full list of the fields supported on the `Certificate` resource can be found in the API reference documentation [here](https://cert-manager.io/docs/reference/api-docs/#cert-manager.io/v1.CertificateSpec). The `enableDurationFeature: true` flag in the Issuer configuration (Step 4) is required for cert-manager to honor the `duration` field. Without it, certificates default to 47 days regardless of what you specify. This flag is disabled by default in cert-manager because public ACME servers like Let's Encrypt don't support custom durations. cert-manager does not currently support specifying a `pathLen` in the Certificate resource. When issuing CA certificates with `isCA: true`, ensure your Infisical certificate policy does not set a **Maximum Allowed Path Length** restriction, otherwise the request will fail validation. You can check that the certificate was created successfully by running the following command: ```bash theme={"dark"} kubectl get certificates -n -o wide ``` ```bash theme={"dark"} NAME READY SECRET ISSUER STATUS AGE certificate-by-issuer True certificate-by-issuer issuer-infisical Certificate is up to date and has not expired 20h ``` Since the actual certificate and private key are stored in a Kubernetes secret, we can check that the secret was created successfully by running the following command: ```bash theme={"dark"} kubectl get secret certificate-by-issuer -n ``` ```bash theme={"dark"} NAME TYPE DATA AGE certificate-by-issuer kubernetes.io/tls 2 26h ``` We can `describe` the secret to get more information about it: ```bash theme={"dark"} kubectl describe secret certificate-by-issuer -n default ``` ```bash theme={"dark"} Name: certificate-by-issuer Namespace: default Labels: controller.cert-manager.io/fao=true Annotations: cert-manager.io/alt-names: cert-manager.io/certificate-name: certificate-by-issuer cert-manager.io/common-name: cert-manager.io/alt-names: certificate-by-issuer.example.com cert-manager.io/ip-sans: cert-manager.io/issuer-group: cert-manager.io cert-manager.io/issuer-kind: Issuer cert-manager.io/issuer-name: issuer-infisical cert-manager.io/uri-sans: Type: kubernetes.io/tls Data ==== ca.crt: 1306 bytes tls.crt: 2380 bytes tls.key: 227 bytes ``` Here, `ca.crt` is the Root CA certificate, `tls.crt` is the requested certificate followed by the certificate chain, and `tls.key` is the private key for the certificate. We can decode the certificate and print it out using `openssl`: ```bash theme={"dark"} kubectl get secret certificate-by-issuer -n default -o jsonpath='{.data.tls\.crt}' | base64 --decode | openssl x509 -text -noout ``` In any case, the certificate is ready to be used as Kubernetes Secret by your Kubernetes resources. ## Injecting CA Certificate into Secrets with trust-manager By default, cert-manager's ACME issuer does not populate the `ca.crt` field in the generated Kubernetes Secret ([see GitHub issue](https://github.com/cert-manager/cert-manager/issues/1571)). The secret will only contain `tls.crt` (the leaf certificate and chain) and `tls.key` (the private key). If your application requires the CA certificate to be present in the secret (e.g., for mTLS or certificate verification), you can use [trust-manager](https://cert-manager.io/docs/trust/trust-manager/) to automatically inject the `ca.crt` field. ### Installing trust-manager Install trust-manager with Secret targets enabled. This allows trust-manager to automatically inject the `ca.crt` field into secrets generated by cert-manager — whenever cert-manager creates or renews a certificate, trust-manager will ensure the CA certificate chain is included. ```bash theme={"dark"} helm repo add jetstack https://charts.jetstack.io --force-update helm upgrade trust-manager jetstack/trust-manager \ --install \ --namespace cert-manager \ --wait \ --set secretTargets.enabled=true \ --set secretTargets.authorizedSecretsAll=true ``` The `secretTargets.authorizedSecretsAll=true` option grants trust-manager permission to write to all secrets in the cluster. For production environments, consider using `secretTargets.authorizedSecrets` to specify only the secrets that trust-manager should manage. Refer to the [trust-manager Helm chart documentation](https://cert-manager.io/docs/trust/trust-manager/installation/) for more details. ### Creating the CA Certificate Secret Create a Kubernetes Secret containing your CA certificate chain. To obtain the certificate chain from Infisical: 1. Navigate to your project in Infisical 2. Go to the **Certificate Authorities** tab 3. Select the CA that is issuing your certificates 4. Click the menu (three dots) next to the CA certificate and select **Download CA Certificate Chain** This will download the full certificate chain from the selected CA up to the Root CA. ```yaml infisical-ca-cert.yaml theme={"dark"} apiVersion: v1 kind: Secret metadata: name: infisical-ca-cert namespace: cert-manager type: Opaque stringData: ca.crt: | -----BEGIN CERTIFICATE----- -----END CERTIFICATE----- ``` ```bash theme={"dark"} kubectl apply -f infisical-ca-cert.yaml ``` ### Creating the trust-manager Bundle Create a trust-manager `Bundle` resource that copies the CA certificate from the source secret into your certificate secrets. ```yaml trust-bundle.yaml theme={"dark"} apiVersion: trust.cert-manager.io/v1alpha1 kind: Bundle metadata: name: certificate-by-issuer spec: sources: - secret: name: infisical-ca-cert key: ca.crt target: secret: key: ca.crt namespaceSelector: matchLabels: kubernetes.io/metadata.name: default ``` ```bash theme={"dark"} kubectl apply -f trust-bundle.yaml ``` * The `metadata.name` of the Bundle must match the `secretName` specified in your `Certificate` resource. * Update the `namespaceSelector` to match the namespace(s) where your certificate secrets are located. * The Bundle is cluster-scoped and can target secrets across multiple namespaces using `namespaceSelector`. ### Verifying the CA Certificate Injection After applying the Bundle, verify that the `ca.crt` field has been added to your certificate secret: ```bash theme={"dark"} kubectl get secret certificate-by-issuer -o yaml ``` You should see output similar to: ```yaml theme={"dark"} apiVersion: v1 data: ca.crt: tls.crt: tls.key: kind: Secret metadata: annotations: cert-manager.io/certificate-name: certificate-by-issuer cert-manager.io/issuer-name: issuer-infisical trust.cert-manager.io/hash: labels: controller.cert-manager.io/fao: "true" trust.cert-manager.io/bundle: certificate-by-issuer name: certificate-by-issuer namespace: default type: Opaque ``` ## FAQ The full list of the fields supported on the `Certificate` resource can be found in the API reference documentation [here](https://cert-manager.io/docs/reference/api-docs/#cert-manager.io/v1.CertificateSpec). Currently, not all fields are supported by the Infisical PKI ACME server. Make sure your Issuer or ClusterIssuer has `enableDurationFeature: true` set under the `acme` block (see Step 4). Without this flag, cert-manager defaults to 47 days regardless of the `duration` field in your Certificate resource. This flag is disabled by default in cert-manager because public ACME servers like Let's Encrypt don't support custom durations. For more details, see the [cert-manager v1.1 release notes](https://cert-manager.io/docs/releases/release-notes/release-notes-1.1/). Yes. `cert-manager` will automatically renew certificates according to the `renewBefore` threshold of expiry as specified in the corresponding `Certificate` resource. You can read more about the `renewBefore` field [here](https://cert-manager.io/docs/reference/api-docs/#cert-manager.io/v1.CertificateSpec). --- # Source: https://infisical.com/docs/documentation/platform/sso/keycloak-saml.md > ## Documentation Index > Fetch the complete documentation index at: https://infisical.com/docs/llms.txt > Use this file to discover all available pages before exploring further. # Keycloak SAML > Learn how to configure Keycloak SAML for Infisical SSO. Keycloak SAML SSO is a paid feature. If you're using Infisical Cloud, then it is available under the **Pro Tier**. If you're self-hosting Infisical, then you should contact [sales@infisical.com](mailto:sales@infisical.com) to purchase an enterprise license to use it. In Infisical, head to the **Single Sign-On (SSO)** page and select the **General** tab. Click **Connect** for **SAML** under the Connect to an Identity Provider section. Select **Keycloak**, then click **Connect** again. SSO connect section Next, copy the **Valid redirect URI** and **SP Entity ID** to use when configuring the Keycloak SAML application. Keycloak SAML initial configuration 2.1. In your realm, navigate to the **Clients** tab and click **Create client** to create a new client application. SAML keycloak list of clients You don’t typically need to make a realm dedicated to Infisical. We recommend adding Infisical as a client to your primary realm. In the General Settings step, set **Client type** to **SAML**, the **Client ID** field to `https://app.infisical.com`, and the **Name** field to a friendly name like **Infisical**. SAML keycloak create client general settings If you’re self-hosting Infisical, then you will want to replace [https://app.infisical.com](https://app.infisical.com) with your own domain. Next, in the Login Settings step, set both the **Home URL** field and **Valid redirect URIs** field to the **Valid redirect URI** from step 1 and press **Save**. SAML keycloak create client login settings 2.2. Once you've created the client, under its **Settings** tab, make sure to set the following values: * Under **SAML Capabilities**: * Name ID format: email (or username). * Force name ID format: On. * Force POST binding: On. * Include AuthnStatement: On. * Under **Signature and Encryption**: * Sign documents: On. * Sign assertions: On. * Signature algorithm: RSA\_SHA256. SAML keycloak client SAML capabilities SAML keycloak client signature encryption 2.3. Next, navigate to the **Client scopes** tab select the client's dedicated scope. SAML keycloak client scopes list Next click **Add predefined mapper**. SAML keycloak client mappers empty Select the **X500 email**, **X500 givenName**, and **X500 surname** attributes and click **Add**. SAML keycloak client mappers predefined Now click on the **X500 email** mapper and set the **SAML Attribute Name** field to **email**. SAML keycloak client mappers email Repeat the same for **X500 givenName** and **X500 surname** mappers, setting the **SAML Attribute Name** field to **firstName** and **lastName** respectively. Next, back in the client scope's **Mappers**, click **Add mapper** and select **by configuration**. SAML keycloak client mappers by configuration Select **User Property**. SAML keycloak client mappers user property Set the the **Name** field to **Username**, the **Property** field to **username**, and the **SAML Attribute Name** to **username**. SAML keycloak client mappers username Repeat the same for the `id` attribute, setting the **Name** field to **ID**, the **Property** field to **id**, and the **SAML Attribute Name** to **id**. SAML keycloak client mappers id Once you've completed the above steps, the list of mappers should look like this: SAML keycloak client mappers completed Back in Keycloak, navigate to Configure > Realm settings > General tab > Endpoints > SAML 2.0 Identity Provider Metadata and copy the IDP URL. This should appear in various places and take the form: `https://keycloak-mysite.com/realms/myrealm/protocol/saml`. SAML keycloak realm SAML metadata Also, in the **Keys** tab, locate the RS256 key and copy the certificate to use when finishing configuring Keycloak SAML in Infisical. SAML keycloak realm settings keys Back in Infisical, set **IDP URL** and **Certificate** to the items from step 3. Also, set the **Client ID** to the `https://app.infisical.com`. Once you've done that, press **Update** to complete the required configuration. SAML Okta paste values into Infisical Enabling SAML SSO allows members in your organization to log into Infisical via Keycloak. SAML keycloak enable SAML Enforcing SAML SSO ensures that members in your organization can only access Infisical by logging into the organization via Keycloak. To enforce SAML SSO, you're required to test out the SAML connection by successfully authenticating at least one Keycloak user with Infisical; Once you've completed this requirement, you can toggle the **Enforce SAML SSO** button to enforce SAML SSO. We recommend ensuring that your account is provisioned the application in Keycloak prior to enforcing SAML SSO to prevent any unintended issues. In case of a lockout, an organization admin can use the [Admin Login Portal](https://infisical.com/docs/documentation/platform/sso/overview#admin-login-portal) in the `/login/admin` path e.g. [https://app.infisical.com/login/admin](https://app.infisical.com/login/admin). If you are only using one organization on your Infisical instance, you can configure a default organization in the [Server Admin Console](../admin-panel/server-admin#default-organization) to expedite SAML login. If you're configuring SAML SSO on a self-hosted instance of Infisical, make sure to set the `AUTH_SECRET` and `SITE_URL` environment variable for it to work:
* `AUTH_SECRET`: A secret key used for signing and verifying JWT. This can be a random 32-byte base64 string generated with `openssl rand -base64 32`.
* `SITE_URL`: The absolute URL of your self-hosted instance of Infisical including the protocol (e.g. [https://app.infisical.com](https://app.infisical.com)) --- # Source: https://infisical.com/docs/documentation/platform/kms/kmip.md > ## Documentation Index > Fetch the complete documentation index at: https://infisical.com/docs/llms.txt > Use this file to discover all available pages before exploring further. # KMIP Integration > Learn more about integrating with Infisical KMS using KMIP (Key Management Interoperability Protocol). KMIP integration is an Enterprise-only feature. Please reach out to [sales@infisical.com](mailto:sales@infisical.com) if you have any questions. Infisical KMS provides Key Management Interoperability Protocol (KMIP) support for integration with KMIP-compatible clients. This allows for enhanced key management across various applications that support the KMIP 1.4 protocol. ## How KMIP Works with Infisical At a high level, the KMIP integration follows this architecture: KMIP Architecture Diagram At a high level, the KMIP integration works as follows: 1. KMIP clients (your applications or tools) communicate with the KMIP server 2. The KMIP server acts as a proxy and forwards requests to Infisical KMS 3. The KMIP server authenticates to Infisical using a machine identity The KMIP server itself is deployed using the Infisical CLI (`infisical kmip start` command) and serves as an intermediary between your KMIP clients and Infisical's key management system. ### Supported Operations The Infisical KMIP server supports the following operations for symmetric keys: * **Create** - Generate symmetric keys * **Register** - Register externally created keys * **Locate** - Find keys using attributes * **Get** - Retrieve keys securely * **Activate** - Enable keys for usage * **Revoke** - Revoke existing keys * **Destroy** - Permanently remove keys * **Get Attributes** - Retrieve metadata associated with keys * **Query** - Query server capabilities and supported operations ### Compatibility Infisical KMIP supports KMIP versions 1.0 to 1.4, ensuring compatibility with a wide range of clients and security tools. ### Network Requirements Ensure the following network connectivity is in place: * **KMIP Client → KMIP Server**: KMIP clients must be able to reach the KMIP server on port 5696 (or your configured port). Ensure firewalls allow this traffic and DNS resolution works if using hostnames. * **KMIP Server → Infisical Platform**: The KMIP server needs outbound HTTP access to Infisical. For self-hosted instances, ensure connectivity to your custom domain. ## Configure and Deploy the KMIP Server Follow these steps in order to set up KMIP integration with Infisical: First, you need to enable KMIP for your entire Infisical organization and set up its PKI infrastructure. Navigate to **Organization Settings > KMIP** and click **Setup KMIP**. KMIP org navigate In the modal, select the desired key algorithm to use for the KMIP PKI of your organization, then click **Continue**. KMIP org PKI setup This generates the KMIP PKI for your organization, creating the cryptographic foundation that will be used for secure KMIP communications. You do not need to manage these certificates yourself; Infisical handles the PKI infrastructure for you. The KMIP server needs a machine identity to authenticate with Infisical and proxy requests on behalf of clients. Configure a [machine identity](/documentation/platform/identities/machine-identities#machine-identities) by heading to your organization's **Access Control** and switching over to the **identities** tab. From there you can click **Create Identity**. This guide assumes you'll be using the [Universal Auth](/documentation/platform/identities/universal-auth) method for the machine identity but you can choose any supported authentication method. KMIP create machine identity This machine identity will be used by the KMIP server to authenticate and forward client requests to Infisical KMS. The machine identity needs permission to proxy KMIP requests. Create a custom organization role and give it the **Proxy KMIP** permission. KMIP create custom role KMIP assign proxy to role This permission allows the KMIP server to act as an intermediary between KMIP clients and Infisical. Now connect the machine identity to the role you just created. Assign the machine identity to the custom organization role. KMIP assign role to machine identity This grants the machine identity the ability to serve KMIP client requests and forward them from your KMIP server to Infisical. Now you're ready to deploy the KMIP server. You can run the KMIP server on any infrastructure that can reach the Infisical platform, such as a VM or container. Once you have your infrastructure ready, you'll need to install the Infisical CLI on the server where you want to run the KMIP server. To install the latest Infisical CLI visit [Infisical CLI instructions](https://infisical.com/docs/cli/overview). If you need to install specific versions of the CLI, you can find them on the [Infisical CLI GitHub Releases](https://github.com/Infisical/cli/releases). Then, launch the KMIP server with the following command: ```bash theme={"dark"} infisical kmip start \ --identity-client-id=example-client-id \ --identity-client-secret=example-client-secret \ --domain=https://my-infisical-instance.com \ --listen-address="0.0.0.0:5696" \ --hostnames-or-ips="my-kmip-server.com" ``` **Available flags:** * **listen-address** (default: localhost:5696): The address the KMIP server listens on. In most cases you'll want to listen on all interfaces (0.0.0.0:5696) * **identity-auth-method** (default: universal-auth): The authentication method for the machine identity * **identity-client-id**: The client ID of the machine identity (can be set via `INFISICAL_UNIVERSAL_AUTH_CLIENT_ID` env var) * **identity-client-secret**: The client secret of the machine identity (can be set via `INFISICAL_UNIVERSAL_AUTH_CLIENT_SECRET` env var) * **server-name** (default: "kmip-server"): The name of the KMIP server * **certificate-ttl** (default: "1y"): The duration for which the server certificate is valid * **hostnames-or-ips**: The IP address or the hostname of the server where you have deployed the KMIP server. Once started, your KMIP server is now running and ready to accept client connections. It will authenticate to Infisical using the machine identity and proxy all KMIP operations. Now that the KMIP server is running, you need to register KMIP clients that will connect to it. Navigate to the desired KMS project if you already have one or create a new project of type KMS, then select **KMIP** once inside the project, and click **Add KMIP Client**. KMIP client overview Define the client and its permissions. In the modal, provide the details of your client. The selected permissions determine what KMIP operations (Create, Get, Revoke, etc.) can be performed in your KMS project. KMIP client modal This creates a KMIP client entity in Infisical that will be authenticated via mTLS certificates. Each KMIP client needs its own certificate for mTLS authentication. Click **Generate Certificate** for your newly created client. KMIP generate client cert Provide the desired TTL (time-to-live) and key algorithm, then click **Generate Client Certificate**. KMIP client cert config Download the generated client certificate, certificate chain, and private key. KMIP client cert modal Configure your KMIP-compatible applications or tools to use these credentials when connecting to the KMIP server. The client will now authenticate via mTLS and perform authorized key management operations through the KMIP server, which proxies requests to Infisical KMS. ## Connecting your KMIP Client to Infisical After completing the setup, configure your KMIP compatible application to connect to the KMIP server. While exact configuration steps vary by application, you'll generally need to provide: 1. **KMIP Server Address**: The hostname or IP and port where your KMIP server is listening (e.g., `my-kmip-server.com:5696`) 2. **Client Certificates**: The certificate credentials generated from your Infisical KMS project: * **Client Certificate** (`client-cert.pem`) - Identifies your KMIP client * **Client Private Key** (`client-key.pem`) - Used for mTLS authentication * **Certificate Chain** (`cert-chain.pem`) - Verifies the KMIP server ### General Configuration Steps Determine the address where your KMIP server is accessible. This should match one of the hostnames or IPs you specified when starting the KMIP server with the `--hostnames-or-ips` flag. **Example endpoints:** * `my-kmip-server.com:5696` * `10.0.1.50:5696` * `kmip.example.com:5696` The default port is `5696`, but this can be changed using the `--listen-address` flag when starting the server. Organize the certificate materials you downloaded when generating the client certificate from the Infisical KMS project. You should have three files: * **client-cert.pem** - The client certificate * **cert-chain.pem** - The certificate chain (includes intermediate and root CA certificates) * **client-key.pem** - The private key Most KMIP clients require these files in PEM format, which is what Infisical provides by default. The exact configuration steps vary depending on your KMIP client application. Generally, you'll need to specify: **Common configuration parameters:** * **Server hostname/IP**: Your KMIP server address (e.g., `my-kmip-server.com`) * **Server port**: Default is `5696` * **Client certificate**: Path to `client-cert.pem` * **Client private key**: Path to `client-key.pem` * **CA certificate**: Path to `cert-chain.pem` (used to verify the server) * **Protocol version**: KMIP 1.0 through 1.4 are supported **Example configuration for PyKMIP:** ```ini theme={"dark"} [client] host=my-kmip-server.com port=5696 certfile=/path/to/client-cert.pem keyfile=/path/to/client-key.pem ca_certs=/path/to/cert-chain.pem ``` Once configured, test the connection by performing a simple KMIP operation, such as: * Querying server capabilities * Creating a test key * Listing available keys If the connection is successful, your KMIP client is now integrated with Infisical KMS and can perform key management operations according to the permissions you assigned. **Troubleshooting connection issues:** * Verify network connectivity between your KMIP client and the KMIP server * Check that certificate files are readable and in the correct format * Ensure the KMIP server is running and accessible * Review KMIP server logs for authentication errors * Confirm the client certificate has not expired If you require further verification of your certificate details and connectivity to the KMIP server from your KMIP client, you can use the following command from your client machine: ```bash theme={"dark"} openssl s_client -connect kmip-server-ip-here:5696 --cert /path/to/client-cert.pem --key /path/to/client-cert.pem --CAfile /path/to/cert-chain.pem --tls1_2 --showcerts --state --debug ``` This command attempts to establish a TLS connection to the KMIP server using your client certificate and key, displaying detailed information about the handshake process. If the connection is successful, you'll see the server's certificate chain and a message indicating that the handshake was completed. --- # Source: https://infisical.com/docs/documentation/platform/identities/kubernetes-auth.md > ## Documentation Index > Fetch the complete documentation index at: https://infisical.com/docs/llms.txt > Use this file to discover all available pages before exploring further. # Kubernetes Auth > Learn how to authenticate with Infisical in Kubernetes **Kubernetes Auth** is a Kubernetes-native authentication method for applications (e.g. pods) to access Infisical. ## Diagram The following sequence diagram illustrates the Kubernetes Auth workflow for authenticating applications running in pods with Infisical. ```mermaid theme={"dark"} sequenceDiagram participant Pod as Pod participant Infis as Infisical participant KubernetesServer as K8s API Server Note over Pod: Step 1: Service Account JWT Token Retrieval Note over Pod,Infis: Step 2: JWT Token Login Operation Pod->>Infis: Send JWT token to /api/v1/auth/kubernetes-auth/login Infis->>KubernetesServer: Forward JWT token for validation KubernetesServer-->>Infis: Return identity info for JWT Note over Infis: Step 3: Identity Property Verification Infis->>Pod: Return short-lived access token Note over Pod,Infis: Step 4: Access Infisical API with Token Pod->>Infis: Make authenticated requests using the short-lived access token ``` ## Concept At a high-level, Infisical authenticates an application in Kubernetes by verifying its identity and checking that it meets specific requirements (e.g. it is bound to an allowed service account) at the `/api/v1/auth/kubernetes-auth/login` endpoint. If successful, then Infisical returns a short-lived access token that can be used to make authenticated requests to the Infisical API. To be more specific: 1. The application deployed on Kubernetes retrieves its [service account credential](https://kubernetes.io/docs/tasks/configure-pod-container/configure-service-account/#opt-out-of-api-credential-automounting) that is a JWT token at the `/var/run/secrets/kubernetes.io/serviceaccount/token` pod path. 2. The application sends the JWT token to Infisical at the `/api/v1/auth/kubernetes-auth/login` endpoint after which Infisical forwards the JWT token to the Kubernetes API Server at the TokenReview API for verification and to obtain the service account information associated with the JWT token. Infisical is able to authenticate and interact with the TokenReview API by using either the long lived JWT token set while configuring this authentication method or by using the incoming token itself. The JWT token mentioned in this context is referred as the token reviewer JWT token. 3. Infisical checks the service account properties against set criteria such **Allowed Service Account Names** and **Allowed Namespaces**. 4. If all is well, Infisical returns a short-lived access token that the application can use to make authenticated requests to the Infisical API. We recommend using one of Infisical's clients like SDKs or the Infisical Agent to authenticate with Infisical using Kubernetes Auth as they handle the authentication process including service account credential retrieval for you. ## Guide In the following steps, we explore how to create and use identities for your applications in Kubernetes to access the Infisical API using the Kubernetes Auth authentication method. **When to use this option**: Choose this approach when you want centralized authentication management. Only one service account needs special permissions, and your application service accounts remain unchanged. 1.1. Start by creating a service account in your Kubernetes cluster that will be used by Infisical to authenticate with the Kubernetes API Server. ```yaml infisical-service-account.yaml theme={"dark"} apiVersion: v1 kind: ServiceAccount metadata: name: infisical-auth namespace: default ``` ``` kubectl apply -f infisical-service-account.yaml ``` 1.2. Bind the service account to the `system:auth-delegator` cluster role. As described [here](https://kubernetes.io/docs/reference/access-authn-authz/rbac/#other-component-roles), this role allows delegated authentication and authorization checks, specifically for Infisical to access the [TokenReview API](https://kubernetes.io/docs/reference/kubernetes-api/authentication-resources/token-review-v1/). You can apply the following configuration file: ```yaml cluster-role-binding.yaml theme={"dark"} apiVersion: rbac.authorization.k8s.io/v1 kind: ClusterRoleBinding metadata: name: role-tokenreview-binding namespace: default roleRef: apiGroup: rbac.authorization.k8s.io kind: ClusterRole name: system:auth-delegator subjects: - kind: ServiceAccount name: infisical-auth namespace: default ``` ``` kubectl apply -f cluster-role-binding.yaml ``` 1.3. Next, create a long-lived service account JWT token (i.e. the token reviewer JWT token) for the service account using this configuration file for a new `Secret` resource: ```yaml service-account-token.yaml theme={"dark"} apiVersion: v1 kind: Secret type: kubernetes.io/service-account-token metadata: name: infisical-auth-token annotations: kubernetes.io/service-account.name: "infisical-auth" ``` ``` kubectl apply -f service-account-token.yaml ``` 1.4. Link the secret in step 1.3 to the service account in step 1.1: ```bash theme={"dark"} kubectl patch serviceaccount infisical-auth -p '{"secrets": [{"name": "infisical-auth-token"}]}' -n default ``` 1.5. Finally, retrieve the token reviewer JWT token from the secret. ```bash theme={"dark"} kubectl get secret infisical-auth-token -n default -o=jsonpath='{.data.token}' | base64 --decode ``` Keep this JWT token handy as you will need it for the **Token Reviewer JWT** field when configuring the Kubernetes Auth authentication method for the identity in step 2. **When to use this option**: Choose this approach to eliminate long-lived tokens. This option simplifies Infisical configuration but requires each application service account to have elevated permissions. The self-validation method eliminates the need for a separate long-lived reviewer JWT by using the same token for both authentication and validation. Instead of creating a dedicated reviewer service account, you'll grant the necessary permissions to each application service account. For each service account that needs to authenticate with Infisical, add the `system:auth-delegator` role: ```yaml client-role-binding.yaml theme={"dark"} apiVersion: rbac.authorization.k8s.io/v1 kind: ClusterRoleBinding metadata: name: infisical-client-binding-[your-app-name] roleRef: apiGroup: rbac.authorization.k8s.io kind: ClusterRole name: system:auth-delegator subjects: - kind: ServiceAccount name: [your-app-service-account] namespace: [your-app-namespace] ``` ``` kubectl apply -f client-role-binding.yaml ``` When configuring Kubernetes Auth in Infisical, leave the **Token Reviewer JWT** field empty. Infisical will use the client's own token for validation. **When to use this option**: Choose this approach when you have a gateway deployed in your Kubernetes Cluster and wish to eliminate long-lived tokens. This approach simplifies Infisical Kubernetes Auth configuration, and only one service account will need to have the elevated `system:auth-delegator` ClusterRole binding. **Note:** Gateway is a paid feature. - **Infisical Cloud users:** Gateway is available under the **Enterprise Tier**. - **Self-Hosted Infisical:** Please contact [sales@infisical.com](mailto:sales@infisical.com) to purchase an enterprise license. To deploy a gateway in your Kubernetes cluster, follow our [Gateway deployment guide using helm](/documentation/platform/gateways/overview). To grant the gateway the `system:auth-delegator` ClusterRole binding, you can use the following command: ```yaml gateway-role-binding.yaml theme={"dark"} apiVersion: rbac.authorization.k8s.io/v1 kind: ClusterRoleBinding metadata: name: infisical-token-reviewer-role-binding namespace: default # Replace with your namespace if not default roleRef: apiGroup: rbac.authorization.k8s.io kind: ClusterRole name: system:auth-delegator subjects: - kind: ServiceAccount name: infisical-gateway # The name of the gateway service account namespace: default # Replace with your namespace if not default ``` ```bash theme={"dark"} kubectl apply -f gateway-role-binding.yaml ``` The gateway service account name is `infisical-gateway` by default if deployed using Helm. To configure your Kubernetes Auth method to use the gateway as the token reviewer, set the `Review Method` to "Gateway as Reviewer", and select the gateway you want to use as the token reviewer. identities organization create kubernetes auth method To create an identity, head to your Organization Settings > Access Control > Identities and press **Create identity**. identities organization When creating an identity, you specify an organization level [role](/documentation/platform/access-controls/role-based-access-controls) for it to assume; you can configure roles in Organization Settings > Access Control > Organization Roles. identities organization create Now input a few details for your new identity. Here's some guidance for each field: * Name (required): A friendly name for the identity. * Role (required): A role from the **Organization Roles** tab for the identity to assume. The organization role assigned will determine what organization level resources this identity can have access to. Once you've created an identity, you'll be redirected to a page where you can manage the identity. identities page Since the identity has been configured with Universal Auth by default, you should re-configure it to use Kubernetes Auth instead. To do this, press to edit the **Authentication** section, remove the existing Universal Auth configuration, and add a new Kubernetes Auth configuration onto the identity. identities page remove default auth identities organization create kubernetes auth method Here's some more guidance on each field: * Kubernetes Host / Base Kubernetes API URL: The host string, host:port pair, or URL to the base of the Kubernetes API server. This can usually be obtained by running `kubectl cluster-info`. * Token Reviewer JWT: A long-lived service account JWT token for Infisical to access the [TokenReview API](https://kubernetes.io/docs/reference/kubernetes-api/authentication-resources/token-review-v1/) to validate other service account JWT tokens submitted by applications/pods. This is the JWT token obtained from step 1.5(Reviewer Tab). If omitted, the client's own JWT will be used instead, which requires the client to have the `system:auth-delegator` ClusterRole binding. This is shown in step 1, option 2. * Allowed Service Account Names: A comma-separated list of trusted service account names that are allowed to authenticate with Infisical. * Allowed Namespaces: A comma-separated list of trusted namespaces that service accounts must belong to authenticate with Infisical. * Allowed Audience: An optional audience claim that the service account JWT token must have to authenticate with Infisical. * CA Certificate: The PEM-encoded CA cert for the Kubernetes API server. This is used by the TLS client for secure communication with the Kubernetes API server. * Access Token TTL (default is `2592000` equivalent to 30 days): The lifetime for an acccess token in seconds. This value will be referenced at renewal time. * Access Token Max TTL (default is `2592000` equivalent to 30 days): The maximum lifetime for an acccess token in seconds. This value will be referenced at renewal time. * Access Token Max Number of Uses (default is `0`): The maximum number of times that an access token can be used; a value of `0` implies infinite number of uses. * Access Token Trusted IPs: The IPs or CIDR ranges that access tokens can be used from. By default, each token is given the `0.0.0.0/0`, allowing usage from any network address. To enable the identity to access project-level resources such as secrets within a specific project, you should add it to that project. To do this, head over to the project you want to add the identity to and go to Project Settings > Access Control > Machine Identities and press **Add identity**. Next, select the identity you want to add to the project and the project level role you want to allow it to assume. The project role assigned will determine what project level resources this identity can have access to. identities project identities project create To access the Infisical API as the identity, you should first make sure that the pod running your application is bound to a service account specified in the **Allowed Service Account Names** field of the identity's Kubernetes Auth authentication method configuration in step 2. Once bound, the pod will receive automatically mounted service account credentials that is a JWT token at the `/var/run/secrets/kubernetes.io/serviceaccount/token` path. This token should be used to authenticate with Infisical at the `/api/v1/auth/kubernetes-auth/login` endpoint. For information on how to configure sevice accounts for pods, refer to the guide [here](https://kubernetes.io/docs/tasks/configure-pod-container/configure-service-account/). We provide a code example below of how you might retrieve the JWT token and use it to authenticate with Infisical to gain access to the [Infisical API](/api-reference/overview/introduction). The shown example uses Node.js but you can use any other language to retrieve the service account JWT token and use it to authenticate with Infisical. ```javascript theme={"dark"} const fs = require("fs"); try { const tokenPath = "/var/run/secrets/kubernetes.io/serviceaccount/token"; const jwtToken = fs.readFileSync(tokenPath, "utf8"); const infisicalUrl = "https://app.infisical.com"; // or your self-hosted Infisical URL const identityId = ""; const { data } = await axios.post( `{infisicalUrl}/api/v1/auth/kubernetes-auth/login`, { identityId, jwt, } ); console.log("result data: ", data); // access token here } catch(err) { console.error(err); } ``` We recommend using one of Infisical's clients like SDKs or the Infisical Agent to authenticate with Infisical using Kubernetes Auth as they handle the authentication process including service account credential retrieval for you. Each identity access token has a time-to-live (TTL) which you can infer from the response of the login operation; the default TTL is `7200` seconds which can be adjusted. If an identity access token exceeds its max ttl, it can no longer authenticate with the Infisical API. In this case, a new access token should be obtained by performing another login operation. **FAQ** There are a few reasons for why this might happen: * The Kubernetes Auth authentication method configuration is invalid. * The service account JWT token has expired is malformed or invalid. * The service account associated with the JWT token does not meet the criteria set forth in the Kubernetes Auth authentication method configuration such as **Allowed Service Account Names** and **Allowed Namespaces**. There are a few reasons for why this might happen: * The access token has expired. * The identity is insufficiently permissioned to interact with the resources you wish to access. * The client access token is being used from an untrusted IP. A identity access token can have a time-to-live (TTL) or incremental lifetime after which it expires. In certain cases, you may want to extend the lifespan of an access token; to do so, you must set a max TTL parameter. A token can be renewed any number of times where each call to renew it can extend the token's lifetime by increments of the access token's TTL. Regardless of how frequently an access token is renewed, its lifespan remains bound to the maximum TTL determined at its creation. --- # Source: https://infisical.com/docs/integrations/platforms/kubernetes-csi.md > ## Documentation Index > Fetch the complete documentation index at: https://infisical.com/docs/llms.txt > Use this file to discover all available pages before exploring further. # Kubernetes CSI > How to use the Infisical Kubernetes CSI provider to inject secrets directly into Kubernetes pods. ## Overview The Infisical CSI provider allows you to use Infisical with the [Secrets Store CSI driver](https://secrets-store-csi-driver.sigs.k8s.io) to inject secrets directly into your Kubernetes pods through a volume mount. In contrast to the [Infisical Kubernetes Operator](https://infisical.com/docs/integrations/platforms/kubernetes), the Infisical CSI provider will allow you to sync Infisical secrets directly to pods as files, removing the need for Kubernetes secret resources. ```mermaid theme={"dark"} flowchart LR subgraph Secrets Management SS(Infisical) --> CSP(Infisical CSI Provider) CSP --> CSD(Secrets Store CSI Driver) end subgraph Pod CSD --> V(Volume) V <--> P(Application) end ``` ## Features The following features are supported by the Infisical CSI Provider: * Integration with Secrets Store CSI Driver for direct pod mounting * Authentication using Kubernetes service accounts via machine identities * Auto-syncing secrets when enabled via CSI Driver * Configurable secret paths and file mounting locations * Installation via Helm ## Prerequisites The Infisical CSI provider is only supported for Kubernetes clusters with version >= 1.20. ## Limitations Currently, the Infisical CSI provider only supports static secrets. ## Deploy to Kubernetes cluster ### Install Secrets Store CSI Driver In order to use the Infisical CSI provider, you will first have to install the [Secrets Store CSI driver](https://secrets-store-csi-driver.sigs.k8s.io/getting-started/installation) to your cluster. #### Standard Installation For most Kubernetes clusters, use the following installation: ```bash theme={"dark"} helm repo add secrets-store-csi-driver https://kubernetes-sigs.github.io/secrets-store-csi-driver/charts ``` ```bash theme={"dark"} helm install csi secrets-store-csi-driver/secrets-store-csi-driver \ --namespace=kube-system \ --set "tokenRequests[0].audience=infisical" \ --set enableSecretRotation=true \ --set rotationPollInterval=2m \ --set "syncSecret.enabled=true" \ ``` The flags configure the following: * `tokenRequests[0].audience=infisical`: Sets the audience value for service account token authentication (recommended for environments that support custom audiences) * `enableSecretRotation=true`: Enables automatic secret updates from Infisical * `rotationPollInterval=2m`: Checks for secret updates every 2 minutes * `syncSecret.enabled=true`: Enables syncing secrets to Kubernetes secrets If you do not wish to use the auto-syncing feature of the secrets store CSI driver, you can omit the `enableSecretRotation` and the `rotationPollInterval` flags. Do note that by default, secrets from Infisical are only fetched and mounted during pod creation. If there are any changes made to the secrets in Infisical, they will not propagate to the pods unless auto-syncing is enabled for the CSI driver. #### Installation for Environments Without Custom Audience Support Some Kubernetes environments (such as AWS EKS) don't support custom audiences and will reject tokens with non-default audiences. For these environments, use this installation instead: ```bash theme={"dark"} helm install csi secrets-store-csi-driver/secrets-store-csi-driver \ --namespace=kube-system \ --set enableSecretRotation=true \ --set rotationPollInterval=2m \ --set "syncSecret.enabled=true" \ ``` **Environments without custom audience support**: Do not set a custom audience when installing the CSI driver in environments that reject custom audiences. Instead, use the installation above and set `useDefaultAudience: "true"` in your SecretProviderClass configuration. ### Install Infisical CSI Provider You would then have to install the Infisical CSI provider to your cluster. **Install the latest Infisical Helm repository** ```bash theme={"dark"} helm repo add infisical-helm-charts 'https://dl.cloudsmith.io/public/infisical/helm-charts/helm/charts/' helm repo update ``` **Install the Helm Chart** ```bash theme={"dark"} helm install infisical-csi-provider infisical-helm-charts/infisical-csi-provider ``` For a list of all supported arguments for the helm installation, you can run the following: ```bash theme={"dark"} helm show values infisical-helm-charts/infisical-csi-provider ``` ### Authentication In order for the Infisical CSI provider to pull secrets from your Infisical project, you will have to configure a machine identity with [Kubernetes authentication](https://infisical.com/docs/documentation/platform/identities/kubernetes-auth) configured with your cluster. You can refer to the documentation for setting it up [here](https://infisical.com/docs/documentation/platform/identities/kubernetes-auth#guide). **Important**: The "Allowed Audience" field in your machine identity's Kubernetes authentication settings must match your CSI driver installation. If you used the standard installation with `tokenRequests[0].audience=infisical`, set the "Allowed Audience" field to `infisical`. If you used the installation for environments without custom audience support, leave the "Allowed Audience" field empty. ### Creating Secret Provider Class With the Secrets Store CSI driver and the Infisical CSI provider installed, create a Kubernetes [SecretProviderClass](https://secrets-store-csi-driver.sigs.k8s.io/concepts.html#secretproviderclass) resource to establish the connection between the CSI driver and the Infisical CSI provider for secret retrieval. You can create as many Secret Provider Classes as needed for your cluster. #### Standard Configuration ```yaml theme={"dark"} apiVersion: secrets-store.csi.x-k8s.io/v1 kind: SecretProviderClass metadata: name: my-infisical-app-csi-provider spec: provider: infisical parameters: infisicalUrl: "https://app.infisical.com" authMethod: "kubernetes" identityId: "ad2f8c67-cbe2-417a-b5eb-1339776ec0b3" projectId: "09eda1f8-85a3-47a9-8a6f-e27f133b2a36" envSlug: "prod" secrets: | - secretPath: "/" fileName: "dbPassword" secretKey: "DB_PASSWORD" - secretPath: "/app" fileName: "appSecret" secretKey: "APP_SECRET" ``` #### Configuration for Environments Without Custom Audience Support For environments that don't support custom audiences (such as AWS EKS), use this configuration instead: ```yaml theme={"dark"} apiVersion: secrets-store.csi.x-k8s.io/v1 kind: SecretProviderClass metadata: name: my-infisical-app-csi-provider spec: provider: infisical parameters: infisicalUrl: "https://app.infisical.com" authMethod: "kubernetes" useDefaultAudience: "true" identityId: "ad2f8c67-cbe2-417a-b5eb-1339776ec0b3" projectId: "09eda1f8-85a3-47a9-8a6f-e27f133b2a36" envSlug: "prod" secrets: | - secretPath: "/" fileName: "dbPassword" secretKey: "DB_PASSWORD" - secretPath: "/app" fileName: "appSecret" secretKey: "APP_SECRET" ``` **Key difference**: The only change from the standard configuration is the addition of `useDefaultAudience: "true"`. This parameter tells the CSI provider to use the default Kubernetes audience instead of a custom "infisical" audience, which is required for environments that reject custom audiences. The SecretProviderClass should be provisioned in the same namespace as the pod you intend to mount secrets to. #### Supported Parameters The base URL of your Infisical instance. If you're using Infisical Cloud US, this should be set to `https://app.infisical.com`. If you're using Infisical Cloud EU, then this should be set to `https://eu.infisical.com`. The CA certificate of the Infisical instance in order to establish SSL/TLS when the instance uses a private or self-signed certificate. Unless necessary, this should be omitted. The auth method to use for authenticating the Infisical CSI provider with Infisical. For now, the only supported method is `kubernetes`. The ID of the machine identity to use for authenticating the Infisical CSI provider with your Infisical organization. This should be the machine identity configured with Kubernetes authentication. The project ID of the Infisical project to pull secrets from. The slug of the project environment to pull secrets from. An array that defines which secrets to retrieve and how to mount them. Each entry requires three properties: `secretPath` and `secretKey` work together to identify the source secret to fetch, while `fileName` specifies the path where the secret's value will be mounted within the pod's filesystem. The custom audience value configured for the CSI driver. This defaults to `infisical`. When set to `"true"`, the Infisical CSI provider will use the default Kubernetes audience instead of a custom audience. This is required for environments that don't support custom audiences (such as AWS EKS), which reject tokens with non-default audiences. When using this option, do not set a custom audience in the CSI driver installation. This defaults to `false`. When enabled, the CSI provider will dynamically create service account tokens on-demand using the default Kubernetes audience, rather than using pre-existing tokens from the CSI driver. ### Using Secret Provider Class A pod can use the Secret Provider Class by mounting it as a CSI volume: ```yaml theme={"dark"} apiVersion: v1 kind: Pod metadata: name: nginx-secrets-store labels: app: nginx spec: containers: - name: nginx image: nginx volumeMounts: - name: secrets-store-inline mountPath: "/mnt/secrets-store" readOnly: true volumes: - name: secrets-store-inline csi: driver: secrets-store.csi.k8s.io readOnly: true volumeAttributes: secretProviderClass: "my-infisical-app-csi-provider" ``` When the pod is created, the secrets are mounted as individual files in the /mnt/secrets-store directory. ### Verifying Secret Mounts To verify your secrets are mounted correctly: ```bash theme={"dark"} # Check pod status kubectl get pod nginx-secrets-store # View mounted secrets kubectl exec -it nginx-secrets-store -- ls -l /mnt/secrets-store ``` ### Troubleshooting To troubleshoot issues with the Infisical CSI provider, refer to the logs of the Infisical CSI provider running on the same node as your pod. ```bash theme={"dark"} kubectl logs infisical-csi-provider-7x44t ``` You can also refer to the logs of the secrets store CSI driver. Modify the command below with the appropriate pod and namespace of your secrets store CSI driver installation. ```bash theme={"dark"} kubectl logs csi-secrets-store-csi-driver-7h4jp -n=kube-system ``` **Common issues include:** * Mismatch in the audience value of the CSI driver with the machine identity's Kubernetes auth configuration * SecretProviderClass in the wrong namespace * Invalid machine identity configuration * Incorrect secret paths or keys **Issues in environments without custom audience support:** * **Token authentication failed with custom audience**: If you're seeing authentication errors in environments that don't support custom audiences (such as AWS EKS), ensure you're using the installation without custom audience and have set `useDefaultAudience: "true"` in your SecretProviderClass * **Audience not allowed errors**: Make sure the "Allowed Audience" field is left empty in your machine identity's Kubernetes authentication configuration when using environments that don't support custom audiences ## Best Practices For additional guidance on setting this up for your production cluster, you can refer to the Secrets Store CSI driver documentation [here](https://secrets-store-csi-driver.sigs.k8s.io/topics/best-practices). ## Frequently Asked Questions Yes, but it requires an indirect approach: 1. First enable syncing to Kubernetes secrets by setting `syncSecret.enabled=true` in the CSI driver installation 2. Configure the Secret Provider Class to sync specific secrets to Kubernetes secrets 3. Use the resulting Kubernetes secrets in your pod's environment variables This means secrets are first synced to Kubernetes secrets before they can be used as environment variables. You can find detailed examples in the [Secrets Store CSI driver documentation](https://secrets-store-csi-driver.sigs.k8s.io/topics/set-as-env-var). Yes, you will need to explicitly list each secret you want to sync in the Secret Provider Class configuration. This is a common requirement across all CSI providers as the Secrets Store CSI Driver architecture requires specific mapping of secrets to their mounted file locations. --- # Source: https://infisical.com/docs/self-hosting/deployment-options/kubernetes-helm.md > ## Documentation Index > Fetch the complete documentation index at: https://infisical.com/docs/llms.txt > Use this file to discover all available pages before exploring further. # Kubernetes via Helm Chart > Learn how to deploy Infisical on Kubernetes using our official Helm chart. Learn how to deploy **Infisical** on Kubernetes using the official Helm chart. This method is ideal for production environments that require scalability, high availability, and integration with existing Kubernetes infrastructure. ## Prerequisites * A running Kubernetes cluster (version 1.23+) * [Helm](https://helm.sh/) package manager (version 3.11.3+) * [kubectl](https://kubernetes.io/docs/reference/kubectl/) installed and configured to access your cluster * Basic understanding of Kubernetes concepts (pods, services, secrets, ingress) This guide assumes familiarity with Kubernetes. If you're new to Kubernetes, consider starting with the [Docker Compose guide](/self-hosting/deployment-options/docker-compose) for simpler deployments. ## System Requirements The following are minimum requirements for running Infisical on Kubernetes: | Component | Minimum | Recommended (Production) | | ------------- | ------- | ------------------------ | | Nodes | 1 node | 3+ nodes (for HA) | | CPU per node | 2 cores | 4 cores | | RAM per node | 4 GB | 8 GB | | Disk per node | 20 GB | 50 GB+ (SSD recommended) | **Per-pod resource defaults (configurable in values.yaml):** | Pod | CPU Request | Memory Limit | | ---------- | ----------- | ------------ | | Infisical | 350m | 1000Mi | | PostgreSQL | 250m | 512Mi | | Redis | 100m | 256Mi | For production deployments with many users or secrets, increase these values accordingly. ## Deployment Steps Create a dedicated namespace for Infisical to isolate resources: ```bash theme={"dark"} kubectl create namespace infisical ``` All subsequent commands will use this namespace. You can also add `-n infisical` to each kubectl command if you prefer not to set a default context. Add the Infisical Helm charts repository and update your local cache: ```bash theme={"dark"} helm repo add infisical-helm-charts 'https://dl.cloudsmith.io/public/infisical/helm-charts/helm/charts/' helm repo update ``` Infisical requires a Kubernetes secret named `infisical-secrets` containing essential configuration. Create this secret in the same namespace where you'll deploy the chart. For testing or proof-of-concept deployments, the Helm chart automatically provisions in-cluster PostgreSQL and Redis instances. You only need to provide the core secrets: ```bash theme={"dark"} kubectl create secret generic infisical-secrets \ --namespace infisical \ --from-literal=AUTH_SECRET="$(openssl rand -base64 32)" \ --from-literal=ENCRYPTION_KEY="$(openssl rand -hex 16)" \ --from-literal=SITE_URL="http://localhost" ``` The in-cluster PostgreSQL and Redis are not configured for high availability. Use this only for testing purposes. For production environments, use external managed services for PostgreSQL and Redis to ensure high availability: ```bash theme={"dark"} kubectl create secret generic infisical-secrets \ --namespace infisical \ --from-literal=AUTH_SECRET="$(openssl rand -base64 32)" \ --from-literal=ENCRYPTION_KEY="$(openssl rand -hex 16)" \ --from-literal=DB_CONNECTION_URI="postgresql://user:password@your-postgres-host:5432/infisical" \ --from-literal=REDIS_URL="redis://:password@your-redis-host:6379" \ --from-literal=SITE_URL="https://infisical.example.com" ``` Store your `ENCRYPTION_KEY` securely outside the cluster. Without this key, you cannot decrypt your secrets even if you restore the database. For AWS RDS with SSL, add the `DB_ROOT_CERT` environment variable. See [environment variables documentation](/self-hosting/configuration/envars#aws-rds) for details. Create a `values.yaml` file to configure your deployment. Start with a minimal configuration: ```yaml values.yaml theme={"dark"} infisical: image: repository: infisical/infisical tag: "v0.151.0" # Check https://hub.docker.com/r/infisical/infisical/tags for latest pullPolicy: IfNotPresent replicaCount: 2 ingress: enabled: true hostName: "infisical.example.com" # Replace with your domain ingressClassName: nginx nginx: enabled: true ``` Do not use the `latest` tag in production. Always pin to a specific version to avoid unexpected changes during upgrades. For all available configuration options, see the [full values.yaml reference](https://raw.githubusercontent.com/Infisical/infisical/main/helm-charts/infisical-standalone-postgres/values.yaml). Deploy Infisical using Helm: ```bash theme={"dark"} helm upgrade --install infisical infisical-helm-charts/infisical-standalone \ --namespace infisical \ --values values.yaml ``` This command installs Infisical if it doesn't exist, or upgrades it if it does. Check that all pods are running: ```bash theme={"dark"} kubectl get pods -n infisical ``` You should see output similar to: ``` NAME READY STATUS RESTARTS AGE infisical-5d4f8b7c9-abc12 1/1 Running 0 2m infisical-5d4f8b7c9-def34 1/1 Running 0 2m postgresql-0 1/1 Running 0 2m redis-master-0 1/1 Running 0 2m ``` Verify the ingress is configured: ```bash theme={"dark"} kubectl get ingress -n infisical ``` Test the health endpoint (port-forward if ingress isn't ready): ```bash theme={"dark"} kubectl port-forward -n infisical svc/infisical 8080:8080 & curl http://localhost:8080/api/status ``` The first user to sign up becomes the instance administrator. Complete this step before exposing Infisical to others. *** ## Managing Your Deployment ### Viewing Pod Logs To view logs from Infisical pods: ```bash theme={"dark"} # View logs from all Infisical pods kubectl logs -n infisical -l component=infisical -f # View logs from a specific pod kubectl logs -n infisical -f # View last 100 lines kubectl logs -n infisical --tail=100 # View logs from the previous container instance (useful after crashes) kubectl logs -n infisical --previous ``` To view logs from PostgreSQL or Redis: ```bash theme={"dark"} kubectl logs -n infisical -l app.kubernetes.io/name=postgresql -f kubectl logs -n infisical -l app.kubernetes.io/name=redis -f ``` ### Scaling the Deployment Infisical's application layer is stateless, so you can scale horizontally: ```bash theme={"dark"} # Scale to 4 replicas kubectl scale deployment -n infisical infisical --replicas=4 ``` Or update your `values.yaml` and re-apply: ```yaml values.yaml theme={"dark"} infisical: replicaCount: 4 ``` ```bash theme={"dark"} helm upgrade infisical infisical-helm-charts/infisical-standalone \ --namespace infisical \ --values values.yaml ``` ### Upgrading Infisical To upgrade to a new version: 1. **Back up your database** before upgrading: ```bash theme={"dark"} kubectl exec -n infisical postgresql-0 -- pg_dump -U infisical infisicalDB > backup_$(date +%Y%m%d).sql ``` 2. **Update the image tag** in your `values.yaml`: ```yaml theme={"dark"} infisical: image: tag: "v0.152.0" # New version ``` 3. **Apply the upgrade**: ```bash theme={"dark"} helm upgrade infisical infisical-helm-charts/infisical-standalone \ --namespace infisical \ --values values.yaml ``` 4. **Monitor the rollout**: ```bash theme={"dark"} kubectl rollout status deployment/infisical -n infisical ``` ### Uninstalling Infisical To completely remove Infisical from your cluster: ```bash theme={"dark"} # Uninstall the Helm release helm uninstall infisical -n infisical # Delete the namespace (removes all resources including secrets and PVCs) kubectl delete namespace infisical ``` Deleting the namespace removes all data including persistent volume claims. Back up your database before uninstalling if you need to preserve data. To uninstall but preserve data: ```bash theme={"dark"} # Uninstall only the Helm release (keeps PVCs and secrets) helm uninstall infisical -n infisical # Verify PVCs are retained kubectl get pvc -n infisical ``` *** ## Persistent Volume Claims The Helm chart creates Persistent Volume Claims (PVCs) for PostgreSQL and Redis data storage when using in-cluster databases. ### Default PVCs | PVC Name | Purpose | Default Size | | --------------------------- | --------------- | ------------ | | `data-postgresql-0` | PostgreSQL data | 8Gi | | `redis-data-redis-master-0` | Redis data | 8Gi | ### Viewing PVCs ```bash theme={"dark"} kubectl get pvc -n infisical ``` ### Customizing Storage To customize storage in your `values.yaml`: ```yaml values.yaml theme={"dark"} postgresql: primary: persistence: size: 20Gi storageClass: "your-storage-class" redis: master: persistence: size: 10Gi storageClass: "your-storage-class" ``` The PostgreSQL PVC contains all your encrypted secrets. Never delete this PVC unless you intend to lose all data. Always back up before any maintenance operations. *** ## Additional Configuration Infisical uses email for user invitations, password resets, and notifications. Add SMTP configuration to your secrets: ```bash theme={"dark"} kubectl create secret generic infisical-secrets \ --namespace infisical \ --from-literal=AUTH_SECRET="your-auth-secret" \ --from-literal=ENCRYPTION_KEY="your-encryption-key" \ --from-literal=SITE_URL="https://infisical.example.com" \ --from-literal=SMTP_HOST="smtp.example.com" \ --from-literal=SMTP_PORT="587" \ --from-literal=SMTP_USERNAME="your-smtp-username" \ --from-literal=SMTP_PASSWORD="your-smtp-password" \ --from-literal=SMTP_FROM_ADDRESS="infisical@example.com" \ --from-literal=SMTP_FROM_NAME="Infisical" \ --dry-run=client -o yaml | kubectl apply -f - ``` **Common SMTP providers:** | Provider | Host | Port | | -------- | --------------------------------- | ---- | | AWS SES | email-smtp.{region}.amazonaws.com | 587 | | SendGrid | smtp.sendgrid.net | 587 | | Gmail | smtp.gmail.com | 587 | After updating secrets, restart the Infisical pods: ```bash theme={"dark"} kubectl rollout restart deployment/infisical -n infisical ``` To configure a custom domain with HTTPS: **1. Using cert-manager (recommended):** First, install cert-manager if not already installed: ```bash theme={"dark"} kubectl apply -f https://github.com/cert-manager/cert-manager/releases/download/v1.14.0/cert-manager.yaml ``` Create a ClusterIssuer for Let's Encrypt: ```yaml cluster-issuer.yaml theme={"dark"} apiVersion: cert-manager.io/v1 kind: ClusterIssuer metadata: name: letsencrypt-prod spec: acme: server: https://acme-v02.api.letsencrypt.org/directory email: your-email@example.com privateKeySecretRef: name: letsencrypt-prod solvers: - http01: ingress: class: nginx ``` ```bash theme={"dark"} kubectl apply -f cluster-issuer.yaml ``` Update your `values.yaml`: ```yaml values.yaml theme={"dark"} ingress: enabled: true hostName: "infisical.example.com" ingressClassName: nginx annotations: cert-manager.io/cluster-issuer: "letsencrypt-prod" tls: - secretName: infisical-tls hosts: - infisical.example.com ``` **2. Using existing TLS certificate:** Create a TLS secret with your certificate: ```bash theme={"dark"} kubectl create secret tls infisical-tls \ --namespace infisical \ --cert=path/to/tls.crt \ --key=path/to/tls.key ``` Update your `values.yaml`: ```yaml values.yaml theme={"dark"} ingress: enabled: true hostName: "infisical.example.com" ingressClassName: nginx tls: - secretName: infisical-tls hosts: - infisical.example.com ``` Apply the changes: ```bash theme={"dark"} helm upgrade infisical infisical-helm-charts/infisical-standalone \ --namespace infisical \ --values values.yaml ``` For enhanced security, implement network policies to restrict traffic between pods: ```yaml network-policy.yaml theme={"dark"} apiVersion: networking.k8s.io/v1 kind: NetworkPolicy metadata: name: infisical-network-policy namespace: infisical spec: podSelector: matchLabels: component: infisical policyTypes: - Ingress - Egress ingress: - from: - namespaceSelector: matchLabels: name: ingress-nginx ports: - protocol: TCP port: 8080 egress: - to: - podSelector: matchLabels: app.kubernetes.io/name: postgresql ports: - protocol: TCP port: 5432 - to: - podSelector: matchLabels: app.kubernetes.io/name: redis ports: - protocol: TCP port: 6379 - to: - namespaceSelector: {} podSelector: matchLabels: k8s-app: kube-dns ports: - protocol: UDP port: 53 - to: - ipBlock: cidr: 0.0.0.0/0 ports: - protocol: TCP port: 443 - protocol: TCP port: 587 ``` ```bash theme={"dark"} kubectl apply -f network-policy.yaml ``` Network policies require a CNI plugin that supports them (e.g., Calico, Cilium, Weave Net). Verify your cluster supports network policies before applying. For production, use external managed services instead of in-cluster databases. **Disable in-cluster databases in values.yaml:** ```yaml values.yaml theme={"dark"} postgresql: enabled: false redis: enabled: false ``` **Add connection strings to your secrets:** ```bash theme={"dark"} kubectl create secret generic infisical-secrets \ --namespace infisical \ --from-literal=AUTH_SECRET="your-auth-secret" \ --from-literal=ENCRYPTION_KEY="your-encryption-key" \ --from-literal=DB_CONNECTION_URI="postgresql://user:password@your-rds-endpoint:5432/infisical?sslmode=require" \ --from-literal=REDIS_URL="rediss://:password@your-elasticache-endpoint:6379" \ --from-literal=SITE_URL="https://infisical.example.com" \ --dry-run=client -o yaml | kubectl apply -f - ``` **Recommended managed services:** | Cloud | PostgreSQL | Redis | | ----- | ----------------------------- | --------------------- | | AWS | RDS for PostgreSQL | ElastiCache | | GCP | Cloud SQL | Memorystore | | Azure | Azure Database for PostgreSQL | Azure Cache for Redis | Infisical exposes Prometheus metrics when enabled. **1. Add telemetry configuration to your secrets:** Include these in your `infisical-secrets`: ```bash theme={"dark"} --from-literal=OTEL_TELEMETRY_COLLECTION_ENABLED="true" \ --from-literal=OTEL_EXPORT_TYPE="prometheus" ``` **2. Create a ServiceMonitor (if using Prometheus Operator):** ```yaml servicemonitor.yaml theme={"dark"} apiVersion: monitoring.coreos.com/v1 kind: ServiceMonitor metadata: name: infisical namespace: infisical spec: selector: matchLabels: component: infisical endpoints: - port: metrics interval: 30s ``` ```bash theme={"dark"} kubectl apply -f servicemonitor.yaml ``` See the [Monitoring Guide](/self-hosting/guides/monitoring-telemetry) for full setup instructions. For production high availability: **1. Multiple Infisical replicas:** ```yaml values.yaml theme={"dark"} infisical: replicaCount: 3 topologySpreadConstraints: - maxSkew: 1 topologyKey: topology.kubernetes.io/zone whenUnsatisfiable: ScheduleAnyway labelSelector: matchLabels: component: infisical ``` **2. Pod Disruption Budget:** ```yaml pdb.yaml theme={"dark"} apiVersion: policy/v1 kind: PodDisruptionBudget metadata: name: infisical-pdb namespace: infisical spec: minAvailable: 1 selector: matchLabels: component: infisical ``` ```bash theme={"dark"} kubectl apply -f pdb.yaml ``` **3. External HA database:** Use managed PostgreSQL with multi-AZ deployment (e.g., AWS RDS Multi-AZ, GCP Cloud SQL HA). **4. External HA Redis:** Use managed Redis with replication (e.g., AWS ElastiCache with cluster mode, GCP Memorystore). *** ## Troubleshooting **Check pod events:** ```bash theme={"dark"} kubectl describe pod -n infisical ``` **Common causes:** * Insufficient cluster resources: Check node capacity with `kubectl describe nodes` * PVC not bound: Check PVC status with `kubectl get pvc -n infisical` * Image pull errors: Verify image name and check for ImagePullBackOff errors **Solutions:** * Scale up your cluster or reduce resource requests * Ensure a StorageClass is available for dynamic provisioning * Check image registry credentials if using a private registry **View pod logs:** ```bash theme={"dark"} kubectl logs -n infisical --previous ``` **Common causes:** * Missing or invalid secrets: Verify `infisical-secrets` exists and contains required keys * Database connection failed: Check `DB_CONNECTION_URI` is correct and accessible * Invalid configuration: Check for typos in environment variables **Verify secrets:** ```bash theme={"dark"} kubectl get secret infisical-secrets -n infisical -o yaml ``` **Check ingress status:** ```bash theme={"dark"} kubectl get ingress -n infisical kubectl describe ingress -n infisical infisical ``` **Check ingress controller logs:** ```bash theme={"dark"} kubectl logs -n ingress-nginx -l app.kubernetes.io/name=ingress-nginx ``` **Verify service is accessible:** ```bash theme={"dark"} kubectl port-forward -n infisical svc/infisical 8080:8080 curl http://localhost:8080/api/status ``` **Common causes:** * Ingress controller not installed * DNS not pointing to ingress IP * TLS certificate issues **Check PostgreSQL pod:** ```bash theme={"dark"} kubectl get pods -n infisical -l app.kubernetes.io/name=postgresql kubectl logs -n infisical postgresql-0 ``` **Test database connectivity:** ```bash theme={"dark"} kubectl exec -it -n infisical postgresql-0 -- psql -U infisical -d infisicalDB -c "SELECT 1" ``` **For external databases:** * Verify the connection string in `infisical-secrets` * Check network policies and security groups allow traffic * Ensure SSL certificates are configured if required **Check Redis pod:** ```bash theme={"dark"} kubectl get pods -n infisical -l app.kubernetes.io/name=redis kubectl logs -n infisical redis-master-0 ``` **Test Redis connectivity:** ```bash theme={"dark"} kubectl exec -it -n infisical redis-master-0 -- redis-cli ping ``` **For external Redis:** * Verify the `REDIS_URL` in `infisical-secrets` * Check if TLS is required (use `rediss://` instead of `redis://`) **Check Helm release status:** ```bash theme={"dark"} helm status infisical -n infisical helm history infisical -n infisical ``` **Rollback to previous version:** ```bash theme={"dark"} helm rollback infisical -n infisical ``` **Force upgrade (use with caution):** ```bash theme={"dark"} helm upgrade infisical infisical-helm-charts/infisical-standalone \ --namespace infisical \ --values values.yaml \ --force ``` **Check resource usage:** ```bash theme={"dark"} kubectl top pods -n infisical kubectl top nodes ``` **Check for resource throttling:** ```bash theme={"dark"} kubectl describe pod -n infisical | grep -A5 "Limits\|Requests" ``` **Solutions:** * Increase resource limits in `values.yaml` * Scale horizontally by increasing `replicaCount` * Use external managed databases for better performance * Enable connection pooling for PostgreSQL *** ## Full Values Reference ```yaml values.yaml theme={"dark"} # -- Overrides the default release name nameOverride: "" # -- Overrides the full name of the release, affecting resource names fullnameOverride: "" infisical: # -- Enable Infisical chart deployment enabled: true # -- Sets the name of the deployment within this chart name: infisical autoBootstrap: # -- Enable auto-bootstrap of the Infisical instance enabled: false image: # -- Infisical Infisical CLI image tag version tag: "0.41.86" # -- Template for the data/stringData section of the Kubernetes secret. Available functions: encodeBase64 secretTemplate: '{"data":{"token":"{{.Identity.Credentials.Token}}"}}' secretDestination: # -- Name of the bootstrap secret to create in the Kubernetes cluster which will store the formatted root identity credentials name: "infisical-bootstrap-secret" # -- Namespace to create the bootstrap secret in. If not provided, the secret will be created in the same namespace as the release. namespace: "default" # -- Infisical organization to create in the Infisical instance during auto-bootstrap organization: "default-org" credentialSecret: # -- Name of the Kubernetes secret containing the credentials for the auto-bootstrap workflow name: "infisical-bootstrap-credentials" databaseSchemaMigrationJob: image: # -- Image repository for migration wait job repository: ghcr.io/groundnuty/k8s-wait-for # -- Image tag version tag: no-root-v2.0 # -- Pulls image only if not present on the node pullPolicy: IfNotPresent serviceAccount: # -- Creates a new service account if true, with necessary permissions for this chart. If false and `serviceAccount.name` is not defined, the chart will attempt to use the Default service account create: true # -- Custom annotations for the auto-created service account annotations: {} # -- Optional custom service account name, if existing service account is used name: null # -- Override for the full name of Infisical resources in this deployment fullnameOverride: "" # -- Custom annotations for Infisical pods podAnnotations: {} # -- Custom annotations for Infisical deployment deploymentAnnotations: {} # -- Number of pod replicas for high availability replicaCount: 2 image: # -- Image repository for the Infisical service repository: infisical/infisical # -- Specific version tag of the Infisical image. View the latest version here https://hub.docker.com/r/infisical/infisical tag: "v0.151.0" # -- Pulls image only if not already present on the node pullPolicy: IfNotPresent # -- Secret references for pulling the image, if needed imagePullSecrets: [] # -- Node affinity settings for pod placement affinity: {} # -- Tolerations definitions tolerations: [] # -- Node selector for pod placement nodeSelector: {} # -- Topology spread constraints for multi-zone deployments # -- Ref: https://kubernetes.io/docs/concepts/workloads/pods/pod-topology-spread-constraints/ topologySpreadConstraints: [] # -- Kubernetes Secret reference containing Infisical root credentials kubeSecretRef: "infisical-secrets" service: # -- Custom annotations for Infisical service annotations: {} # -- Service type, can be changed based on exposure needs (e.g., LoadBalancer) type: ClusterIP # -- Optional node port for service when using NodePort type nodePort: "" resources: limits: # -- Memory limit for Infisical container memory: 1000Mi requests: # -- CPU request for Infisical container cpu: 350m ingress: # -- Enable or disable ingress configuration enabled: true # -- Hostname for ingress access, e.g., app.example.com hostName: "" # -- Specifies the ingress class, useful for multi-ingress setups ingressClassName: nginx nginx: # -- Enable NGINX-specific settings, if using NGINX ingress controller enabled: true # -- Custom annotations for ingress resource annotations: {} # -- TLS settings for HTTPS access tls: [] # -- TLS secret name for HTTPS # - secretName: letsencrypt-prod # -- Domain name to associate with the TLS certificate # hosts: # - some.domain.com postgresql: # -- Enables an in-cluster PostgreSQL deployment. To achieve HA for Postgres, we recommend deploying https://github.com/zalando/postgres-operator instead. enabled: true # -- PostgreSQL resource name name: "postgresql" # -- Full name override for PostgreSQL resources fullnameOverride: "postgresql" image: # -- Image registry for PostgreSQL registry: mirror.gcr.io # -- Image repository for PostgreSQL repository: bitnamilegacy/postgresql auth: # -- Database username for PostgreSQL username: infisical # -- Password for PostgreSQL database access password: root # -- Database name for Infisical database: infisicalDB useExistingPostgresSecret: # -- Set to true if using an existing Kubernetes secret that contains PostgreSQL connection string enabled: false existingConnectionStringSecret: # -- Kubernetes secret name containing the PostgreSQL connection string name: "" # -- Key name in the Kubernetes secret that holds the connection string key: "" redis: # -- Enables an in-cluster Redis deployment enabled: true # -- Redis resource name name: "redis" # -- Full name override for Redis resources fullnameOverride: "redis" image: # -- Image registry for Redis registry: mirror.gcr.io # -- Image repository for Redis repository: bitnamilegacy/redis cluster: # -- Clustered Redis deployment enabled: false # -- Requires a password for Redis authentication usePassword: true auth: # -- Redis password password: "mysecretpassword" # -- Redis deployment type (e.g., standalone or cluster) architecture: standalone ``` *** Your Infisical instance should now be running on Kubernetes. Access it via the ingress hostname you configured, or use `kubectl port-forward` for local testing. self-hosted sign up --- # Source: https://infisical.com/docs/integrations/platforms/kubernetes-injector.md > ## Documentation Index > Fetch the complete documentation index at: https://infisical.com/docs/llms.txt > Use this file to discover all available pages before exploring further. # Kubernetes Agent Injector > How to use the Infisical Kubernetes Agent Injector to inject secrets directly into Kubernetes pods. ## Overview The Infisical Kubernetes Agent Injector allows you to inject secrets directly into your Kubernetes pods. The Injector will create a [Infisical Agent](/integrations/platforms/infisical-agent) container within your pod that syncs secrets from Infisical into a shared volume mount within your pod. The Infisical Agent Injector will patch and modify your pod's deployment to contain an [Infisical Agent](/integrations/platforms/infisical-agent) container which renders your Infisical secrets into a shared volume mount within your pod. The Infisical Agent Injector is built on [Kubernetes Mutating Admission Webhooks](https://kubernetes.io/docs/reference/access-authn-authz/admission-controllers), and will watch for `CREATE` and `UPDATE` events on pods in your cluster. The injector is namespace-agnostic, and will watch for pods in any namespace, but will only patch pods that have the `org.infisical.com/inject` annotation set to `true`. ```mermaid theme={"dark"} flowchart LR subgraph Secrets Management SS(Infisical) --> INJ(Infisical Injector) end subgraph Pod INJ --> INIT(Agent Init Container) INIT --> V(Volume) V <--> P(Application) end ``` ## Install the Infisical Agent Injector To install the Infisical Agent Injector, you will need to install our helm charts using [Helm](https://helm.sh/). ```bash theme={"dark"} helm repo add infisical-helm-charts 'https://dl.cloudsmith.io/public/infisical/helm-charts/helm/charts/' helm repo update helm install --generate-name infisical-helm-charts/infisical-agent-injector ``` After installing the helm chart you can verify that the injector is running and working as intended by checking the logs of the injector pod. ```bash theme={"dark"} $ kubectl logs deployment/infisical-agent-injector 2025/05/19 14:20:05 Starting infisical-agent-injector... 2025/05/19 14:20:05 Generating self-signed certificate... 2025/05/19 14:20:06 Creating directory: /tmp/tls 2025/05/19 14:20:06 Writing cert to: /tmp/tls/tls.crt 2025/05/19 14:20:06 Writing key to: /tmp/tls/tls.key 2025/05/19 14:20:06 Starting HTTPS server on port 8585... 2025/05/19 14:20:06 Attempting to update webhook config (attempt 1)... 2025/05/19 14:20:06 Successfully updated webhook configuration with CA bundle ``` ## Windows support By default the agent injector is built for Linux-based pods, but supports injecting into Windows-based pods. **To inject into Windows-based pods, no extra configuration is needed.** The agent injector will automatically detect and handle injections into Windows-based pods. However, if you are trying to run the agent injector itself on a Windows-based pod, you'll need to configure your helm values.yaml file to point to a Windows-based image. The Agent Injector will only run on and inject into Windows-based pods that are running on the supported Windows versions: * **Windows Server 2022** * **Windows Server 2019** We're looking to add support for other Windows versions in the future. If you're using a different Windows version, please let us know by opening [an issue](https://github.com/Infisical/infisical-agent-injector/issues/new), and we'll look into adding support for your desired version as soon as possible. You will need to set the `nodeSelector.kubernetes.io/os` label to `windows` and set the image tag to a Windows-based image. Below are two examples for Windows Server 2019 and Windows Server 2022. Create your `values.yaml` file and add the following: ```yaml values.yaml theme={"dark"} image: repository: infisical/infisical-agent-injector tag: "v0.1.4-windows-server-2019" nodeSelector: kubernetes.io/os: windows ``` Install the agent injector using the values.yaml file you created above. ```bash theme={"dark"} helm install --generate-name infisical-helm-charts/infisical-agent-injector -f values.yaml ``` Create your `values.yaml` file and add the following: ```yaml values.yaml theme={"dark"} image: repository: infisical/infisical-agent-injector tag: "v0.1.4-windows-server-2022" nodeSelector: kubernetes.io/os: windows ``` Install the agent injector using the values.yaml file you created above. ```bash theme={"dark"} helm install --generate-name infisical-helm-charts/infisical-agent-injector -f values.yaml ``` Note that Windows support is only supported in version `v0.1.4` and above. If you are using an older version, you will need to upgrade to `v0.1.4` or above to use Windows support. ## Supported annotations The Infisical Agent Injector supports the following annotations: The inject annotation is used to enable the injector on a pod. Set the value to `true` and the pod will be patched with an Infisical Agent container on update or create. The inject mode annotation is used to specify the mode to use to inject the secrets into the pod. * `init`: The init method will create an init container for the pod that will render the secrets into a shared volume mount within the pod. The agent init container will run before any other containers in the pod runs, including other init containers. * `sidecar`: The sidecar method will create a sidecar container for the pod that will render the secrets into a shared volume mount within the pod. The agent sidecar container will run alongside the main container in the pod. This means that the secrets rendered will always be in sync with your Infisical secrets. * `sidecar-init`: The sidecar-init method will create the init container and the sidecar container from the other two methods. The init container will run before any other container and fetch the secrets from the start and the sidecar container will keep the secrets in sync throughout the lifecycle of the deployment. The agent config map annotation is used to specify the name of the config map that contains the configuration for the injector. The config map must be in the same namespace as the pod. Whether to enable client-side caching of dynamic secret leases. Defaults to `false`. If you set this to `true`, the agent will persist any dynamic secret leases across restarts of the agent. This is especially useful when using the `sidecar-init` inject mode, to pass the dynamic secret leases created in the init container to the sidecar container. This will ensure that no new leases are created except those initially created in the init container. The sidecar container will register the leases created in the init container and start managing them from that point onwards. Specify a custom agent image to use for the agent sidecar / init container(s). Example: `infisical/cli:0.43.32`. If not specified, the most recent stable version of the Infisical Agent will be used. Whether to revoke all managed dynamic secret leases and machine identity access tokens on shutdown. Defaults to `false`. If you set this to `true`, all managed dynamic secret leases and machine identity access tokens will be revoked when a `SIGTERM` signal is sent to the agents container *(such as when a pod is terminated or when the pod is restarted)*. **Note:** In disaster events such as cluster power outages, a `SIGTERM` signal won't be sent to the agents container, and the credentials will not be revoked. How many times to retry failed API requests such as authentication, secret retrieval, etc. Defaults to `3` retries. Refer to the [Retrying mechanism](/integrations/platforms/infisical-agent#retrying-mechanism) documentation for more information on how to configure the retry strategy. The maximum delay between retries. Defaults to `5s` (5 seconds). Refer to the [Retrying mechanism](/integrations/platforms/infisical-agent#retrying-mechanism) documentation for more information on how to configure the retry strategy. The base delay between retries. Defaults to `200ms` (200 milliseconds). Refer to the [Retrying mechanism](/integrations/platforms/infisical-agent#retrying-mechanism) documentation for more information on how to configure the retry strategy. The maximum CPU limit for the agent containers. Linux Pods: Defaults to `500m` (500 milliCPUs). Windows Pods: Defaults to `500m` (500 milliCPUs). The minimum CPU request for the agent containers. Linux Pods: Defaults to `100m` (100 milliCPUs). Windows Pods: Defaults to `100m` (100 milliCPUs). The maximum memory limit for the agent containers. Linux Pods: Defaults to `128Mi` (128 megabytes). Windows Pods: Defaults to `512Mi` (512 megabytes). The minimum memory request for the agent containers. Linux Pods: Defaults to `64Mi` (64 megabytes). Windows Pods: Defaults to `256Mi` (256 megabytes). The maximum ephemeral storage limit for the agent containers. Doesn't have an explicit default value. The default value will conform to the default ephemeral storage limit for the pod. The minimum ephemeral storage request for the agent containers. Doesn't have an explicit default value. The default value will conform to the default ephemeral storage request for the pod. Whether to set a security context on the injected agent containers. Defaults to `false`. When set to `true`, the agent containers will be configured with a hardened security context. The default security context applied is: ```yaml theme={"dark"} securityContext: allowPrivilegeEscalation: false capabilities: drop: - ALL privileged: false readOnlyRootFilesystem: true runAsGroup: 2000 runAsNonRoot: true runAsUser: 1000 ``` You can customize individual security context settings using the other `agent-security-context-*` annotations. The user ID to run the agent containers as. Defaults to `1000`. If set to `0`, `runAsNonRoot` will automatically be set to `false` to allow the container to run as root. This annotation is only applicable when `org.infisical.com/agent-set-security-context` is set to `true`. The group ID to run the agent containers as. Defaults to `2000`. If set to `0`, `runAsNonRoot` will automatically be set to `false` to allow the container to run as the root group. This annotation is only applicable when `org.infisical.com/agent-set-security-context` is set to `true`. Whether to mount the root filesystem as read-only. Defaults to `true`. This setting only applies to Linux-based pods. Windows containers do not support read-only root filesystems. This annotation is only applicable when `org.infisical.com/agent-set-security-context` is set to `true`. Whether to run the agent containers in privileged mode. Defaults to `false`. Running containers in privileged mode grants full access to the host and should only be used when absolutely necessary. This annotation is only applicable when `org.infisical.com/agent-set-security-context` is set to `true`. Whether to allow privilege escalation for the agent containers. Defaults to `false`. When set to `false`, the container cannot gain more privileges than its parent process. This is a recommended security hardening measure. This annotation is only applicable when `org.infisical.com/agent-set-security-context` is set to `true`. ## ConfigMap Configuration ### Supported Fields When you are configuring a pod to use the injector, you must create a config map in the same namespace as the pod you want to inject secrets into. The entire config needs to be of string format and needs to be assigned to the `config.yaml` key in the config map. You can find a full example of the config at the end of this section. The address of your Infisical instance. This field is optional and will default to `https://app.infisical.com` if not provided. Whether to revoke all managed dynamic secret leases and machine identity access tokens on shutdown. Default: `"false"`. If this is set to `true`, all managed dynamic secret leases and machine identity access tokens will be revoked when a `SIGTERM` signal is sent to the agents container *(such as when a pod is terminated or when the pod is restarted)*. **Note:** In disaster events such as cluster power outages, a `SIGTERM` signal won't be sent to the agents container, and the credentials will not be revoked. This is currently unsupported on Windows-based pods, and will only work when injecting into Linux-based pods. It's recommended to use the annotation `org.infisical.com/agent-revoke-on-shutdown: "true"` instead of configuring the revoke on shutdown on the config map. Refer to the [Supported annotations](/integrations/platforms/kubernetes-injector#supported-annotations) documentation for more information on how to configure the revoke on shutdown through annotations. The authentication type to use to connect to Infisical. Currently only the `kubernetes` authentication type is supported. You can refer to our [Kubernetes Auth](/documentation/platform/identities/kubernetes-auth) documentation for more information on how to create a machine identity for Kubernetes Auth. Please note that the pod's default service account will be used to authenticate with Infisical. The ID of the machine identity to use for Kubernetes or LDAP authentication. This field is required if the `infisical.auth.type` is set to `kubernetes`. The LDAP username to use for LDAP authentication. This field is required if the `infisical.auth.type` is set to `ldap-auth`. The LDAP password to use for LDAP authentication. This field is required if the `infisical.auth.type` is set to `ldap-auth`. How many times to retry failed API requests such as authentication, secret retrieval, etc. Defaults to `3` retries. Refer to the [Retrying mechanism](/integrations/platforms/infisical-agent#retrying-mechanism) documentation for more information on how to configure the retry strategy. You can also configure the max retries through annotations. Refer to the [Supported annotations](/integrations/platforms/kubernetes-injector#supported-annotations) documentation for more information on how to configure the max retries through annotations. The maximum delay between retries. Defaults to `5s` (5 seconds). Refer to the [Retrying mechanism](/integrations/platforms/infisical-agent#retrying-mechanism) documentation for more information on how to configure the retry strategy. You can also configure the max delay through annotations. Refer to the [Supported annotations](/integrations/platforms/kubernetes-injector#supported-annotations) documentation for more information on how to configure the max delay through annotations. The base delay between retries. Defaults to `200ms` (200 milliseconds). Refer to the [Retrying mechanism](/integrations/platforms/infisical-agent#retrying-mechanism) documentation for more information on how to configure the retry strategy. You can also configure the base delay through annotations. Refer to the [Supported annotations](/integrations/platforms/kubernetes-injector#supported-annotations) documentation for more information on how to configure the base delay through annotations. The type of persistent caching to use. Currently only `kubernetes` is available, and will only work within Kubernetes environments. It is recommended to use the annotation `org.infisical.com/agent-cache-enabled: "true"` instead of configuring the cache on the config map. Refer to the [Supported annotations](/integrations/platforms/kubernetes-injector#supported-annotations) documentation for more information on how to configure the cache through annotations. The path to the Kubernetes service account token to use for encrypting the persistent cache. Required when using `kubernetes` cache type. Defaults to `/var/run/secrets/kubernetes.io/serviceaccount/token`. It is recommended to use the annotation `org.infisical.com/agent-cache-enabled: "true"` instead of configuring the cache on the config map. Refer to the [Supported annotations](/integrations/platforms/kubernetes-injector#supported-annotations) documentation for more information on how to configure the cache through annotations. The templates hold an array of templates that will be rendered and injected into the pod. The path to inject the secrets into within the pod. If not specified, this will default to `/shared/infisical-secrets`. If you have multiple templates and don't provide a destination path, the destination paths will default to `/shared/infisical-secrets-1`, `/shared/infisical-secrets-2`, etc. The content of the template to render. This will be rendered as a [Go Template](https://pkg.go.dev/text/template) and will have access to the following variables. It follows the templating format and supports the same functions as the [Infisical Agent](/integrations/platforms/infisical-agent#quick-start-infisical-agent) ### Authentication The Infisical Agent Injector supports Machine Identity [Kubernetes Auth](/documentation/platform/identities/kubernetes-auth) and [LDAP Auth](/documentation/platform/identities/ldap-auth) authentication. To configure Kubernetes Auth, you need to set the `auth.type` field to `kubernetes` and set the `auth.config.identity-id` to the ID of the machine identity you wish to use for authentication. ```yaml theme={"dark"} auth: type: "kubernetes" config: identity-id: "" ``` ### Example ConfigMap ```yaml config-map.yaml theme={"dark"} apiVersion: v1 kind: ConfigMap metadata: name: demo-config-map data: config.yaml: | infisical: address: "https://app.infisical.com" auth: type: "kubernetes" config: identity-id: "" templates: - destination-path: "/path/to/save/secrets/file.txt" template-content: | {{- with secret "" "dev" "/" }} {{- range . }} {{ .Key }}={{ .Value }} {{- end }} {{- end }} ``` ```bash theme={"dark"} kubectl apply -f config-map.yaml ``` To configure LDAP Auth, you need to set the `auth.type` field to `ldap-auth` and set the `auth.config.identity-id` to the ID of the machine identity you wish to use for authentication. Configure the `auth.config.username` and `auth.config.password` to the username and password of the LDAP user to authenticate with. ```yaml theme={"dark"} auth: type: "ldap-auth" config: identity-id: "" username: "" password: "" ``` ### Example ConfigMap ```yaml config-map.yaml theme={"dark"} apiVersion: v1 kind: ConfigMap metadata: name: demo-config-map data: config.yaml: | infisical: address: "https://app.infisical.com" auth: type: "ldap-auth" config: identity-id: "" username: "" password: "" templates: - destination-path: "/path/to/save/secrets/file.txt" template-content: | {{- with secret "" "dev" "/" }} {{- range . }} {{ .Key }}={{ .Value }} {{- end }} {{- end }} ``` ```bash theme={"dark"} kubectl apply -f config-map.yaml ``` To use the config map in your pod, you will need to add the `org.infisical.com/agent-config-map` annotation to your pod's deployment. The value of the annotation is the name of the config map you created above. The config map must be in the same namespace as the pod you're injecting into. ```yaml theme={"dark"} apiVersion: v1 kind: Pod metadata: name: demo labels: app: demo annotations: org.infisical.com/inject: "true" # Set to true for the injector to patch the pod on create/update events org.infisical.com/inject-mode: "init" # The mode to use to inject the secrets into the pod. init|sidecar org.infisical.com/agent-config-map: "name-of-config-map" # The name of the config map that you created above, which contains all the settings for injecting the secrets into the pod spec: # ... ``` ## Quick Start In this section we'll walk through a full example of how to inject secrets into a pod using the Infisical Agent Injector. In this example we'll create a basic nginx deployment and print a Infisical secret called `API_KEY` to the container logs. ### Create secrets in Infisical First you'll need to create the secret in Infisical. * `API_KEY`: The API key to use for the nginx deployment. Once you've created the secret, save your project ID, environment slug, and secret path, as these will be used in the next step. ### Configuration To use the injector you must create a config map in the same namespace as the pod you want to inject secrets into. In this example we'll create a config map in the `test-namespace` namespace. The agent injector will authenticate with Infisical using a [Kubernetes Auth](/documentation/platform/identities/kubernetes-auth) machine identity. Please follow the [instructions](/documentation/platform/identities/kubernetes-auth) to create a machine identity configured for Kubernetes Auth. The agent injector will use the service account token of the pod to authenticate with Infisical. The `template-content` will be rendered as a [Go Template](https://pkg.go.dev/text/template) and will have access to the following variables. It follows the templating format and supports the same functions as the [Infisical Agent](/integrations/platforms/infisical-agent#quick-start-infisical-agent) The `destination-path` refers to the path within the pod that the secrets will be injected into. In this case we're injecting the secrets into a file called `/infisical/secrets`. Replace the ``, ``, with your project ID and the environment slug of where you created your secrets in Infisical. Replace `` with the ID of your machine identity configured for Kubernetes Auth. ```yaml config-map.yaml theme={"dark"} apiVersion: v1 kind: ConfigMap metadata: name: nginx-infisical-config-map namespace: test-namespace data: config.yaml: | infisical: address: "https://app.infisical.com" auth: type: "kubernetes" config: identity-id: "" templates: - destination-path: "/infisical/secrets" template-content: | {{- with secret "" "" "/" }} {{- range . }} {{ .Key }}={{ .Value }} {{- end }} {{- end }} ``` Now apply the config map: ```bash theme={"dark"} kubectl apply -f config-map.yaml ``` ### Injecting secrets into your pod To inject secrets into your pod, you will need to add the `org.infisical.com/inject: "true"` annotation to your pod's deployment. The `org.infisical.com/agent-config-map` annotation will point to the config map we created in the previous step. It's important that the config map is in the same namespace as the pod. We are creating a nginx deployment with a PVC to store the database data. ```yaml nginx.yaml theme={"dark"} --- apiVersion: v1 kind: Pod metadata: name: nginx-pod namespace: test-namespace labels: app: nginx annotations: org.infisical.com/inject: "true" org.infisical.com/inject-mode: "init" org.infisical.com/agent-config-map: "nginx-infisical-config-map" spec: containers: - name: simple-app-demo image: nginx:alpine command: ["/bin/sh", "-c"] args: - | export $(cat /infisical/secrets | xargs) echo "API_KEY is set to: $API_KEY" nginx -g "daemon off;" ``` ### Applying the deployment To apply the deployment, you can use the following command: ```bash theme={"dark"} kubectl apply -f nginx.yaml ``` It may take a few minutes for the pod to be ready and for the Infisical secrets to be injected. You can check the status of the pod by running: ```bash theme={"dark"} kubectl get pods -n test-namespace ``` ### Verifying the secrets are injected To verify the secrets are injected, you can check the pod's logs: ```bash theme={"dark"} $ kubectl exec -it pod/nginx-pod -n test-namespace -- cat /infisical/secrets Defaulted container "simple-app-demo" out of: simple-app-demo, infisical-agent-init (init) API_KEY=sk_api_... # The secret you created in Infisical ``` Additionally you can now check that the `API_KEY` secret is being logged to the nginx container logs: ```bash theme={"dark"} $ kubectl logs pod/nginx-pod -n test-namespace Defaulted container "simple-app-demo" out of: simple-app-demo, infisical-agent-init (init) API_KEY is set to: sk_api_... # The secret you created in Infisical ``` ## Troubleshooting If the pod is stuck in `Init` state, it means the Agent init container is failing to start or is stuck in a restart loop. This could be due to a number of reasons, such as the machine identity not having the correct permissions, or trying to fetch secrets from a non-existent project/environment. You can check the logs of the infisical init container by running: ```bash theme={"dark"} # For deployments kubectl logs deployment/your-deployment-name -c infisical-agent-init -n "" # For pods kubectl logs pod/your-pod-name -c infisical-agent-init -n "" ``` You can also check the logs of the pod by running: ```bash theme={"dark"} kubectl logs deployment/postgres-deployment -n test-namespace ``` When checking the logs of the agent init container, you may see something like the following: ```bash theme={"dark"} Starting infisical agent... 11:10AM INF starting Infisical agent... 11:10AM INF Infisical instance address set to https://daniel1.tunn.dev 11:10AM INF template engine started for template 1... 11:10AM INF attempting to authenticate... 11:10AM INF new access token saved to file at path '/home/infisical/config/identity-access-token' 11:10AM ERR unable to process template because template: literalTemplate:1:9: executing "literalTemplate" at : error calling secret: CallGetRawSecretsV3: Unsuccessful response [GET https://daniel1.tunn.dev/api/v3/secrets/raw?environment=dev&expandSecretReferences=true&include_imports=true&secretPath=%2F&workspaceId=3c0d3ff6-165c-4dc9-b52c-ff3ffaedfce311111] [status-code=404] [response={"reqId":"req-ljqNq567jchFrK","statusCode":404,"message":"Project with ID '3c0d3ff6-165c-4dc9-b52c-ff3ffaedfce311111' not found during bot lookup. Are you sure you are using the correct project ID?","error":"NotFound"}] + echo 'Agent failed with exit code 1' + exit 1 Agent failed with exit code 1 ``` In the above error, the project ID was invalid in the config map. --- # Source: https://infisical.com/docs/documentation/guides/kubernetes-operator.md > ## Documentation Index > Fetch the complete documentation index at: https://infisical.com/docs/llms.txt > Use this file to discover all available pages before exploring further. # Managing Secrets With Kubernetes Operator > How to use the Infisical Kubernetes Operator to Push Secrets, Pull Secrets, and Generate Dynamic Secrets within your clusters. Infisical's Kubernetes Operator provides a seamless, secure, and automated way to synchronize secrets between your Infisical instance and your Kubernetes clusters. The Operator's three Custom Resource Definitions (CRDs) make this possible. In this guide, we provide the necessary CRDs and configurations for your kubernetes cluster, but you can customize them to fit your use-case. In this guide, we'll walk through how to: 1. **Install the Infisical Operator on your Kubernetes cluster**. 2. **Configure Authentication using Kubernetes Service Accounts**. 3. **Use Each of the three CRDs**. * **InfisicalSecret** \[Sync secrets from Infisical to Kubernetes] * **InfisicalPushSecret** \[Sync secrets from Kubernetes to Infisical] * **InfisicalDynamicSecret** \[Manage Dynamic Secrets and automatically create time-bound leases] ## Prerequisites Before we begin, make sure your environment is ready 1. Installed tools * [helm](https://helm.sh/docs/intro/install/), [git](https://git-scm.com/downloads), [kubectl](https://kubernetes.io/docs/tasks/tools/) 2. Kubernetes Cluster * Ensure you have access to a running cluster and connect with kubectl 3. PostgreSQL Cluster (for InfisicalDynamicSecret) * Ensure you have a running database that you have access to 4. Clone [infisical-guides-source-code](https://github.com/Infisical/infisical-guides-source-code) repository 5. Access to an Infisical instance (cloud or self-hosted) ## Step-By-Step Guide The [Infisical Operator](https://infisical.com/docs/integrations/platforms/kubernetes/overview) runs inside your cluster and is responsible for handling secret synchronization events. ```console theme={"dark"} helm repo add infisical-helm-charts 'https://dl.cloudsmith.io/public/infisical/helm-charts/helm/charts/' helm repo update helm install infisical-operator infisical-helm-charts/secrets-operator ``` Verify the operator pod is running: ```console theme={"dark"} kubectl get pods -n default ``` The operator uses a [Machine Identity](https://infisical.com/docs/documentation/platform/identities/machine-identities) to authenticate with Infisical through the Kubernetes Auth Method 1. Login to [Infisical](https://app.infisical.com/) 2. Select **Organization Access** from the left navigational pane 3. Create an Identity and give it a name and a role 4. Once the Machine Identity is created, copy the **Identity ID** (will be used later) 5. Select the created Machine Identity, and add a [Kubernetes Authentication Method](https://infisical.com/docs/documentation/platform/identities/kubernetes-auth). Use these configurations: * **Allowed Service Account Names**: infisical-service-account, default * **Allowed Namespaces**: default * **Kubernetes Host URL** can be found by running `kubectl cluster-info` * **Token Reviewer JWT / CA Certificate**: We will be generating these two later and adding them in later, leave it blank for now 6. Once the Machine Identity has been created, navigate back to **Overview** 7. Now select **Add New Project** * Add a **Project Name**, and select **Secrets Management** as the product type * Add a description (Optional). 8. Once the Project is created, navigate into the Project to **Add Secrets**. You can add any key-value pair for this example, however if you want to use the InfisicalSecret CRD example provided in this demo, use the following configurations: * **Key**: SMTP\_HOST * **Value**: [smtp@gmail.com](mailto:smtp@gmail.com) * **Tags**: N/A (Not needed for this demonstration) * **Environments**: Production 9. Now lets navigate to the **Project Access** tab on the left hand navigation pane. * Add the machine identity we created, and give it Admin permissions (just for demonstration purposes) Now we will be interacting with the local repository you cloned earlier. Make sure you are in the directory that contains the yaml configurations. Assuming you are in your root user directory: ```console theme={"dark"} cd infisical-guides-source-code/kubernetes-operator-demo ``` 1. Create the `infisical-token-reviewer` service account. This Manifest creates a **service account** that the Infisical Operator uses to authenticate with Kubernetes for token reviews. It allows Infisical to validate Kubernetes tokens securely during the Machine Identity authentication process. ```console theme={"dark"} kubectl apply -f infisical-reviewer-service-account.yaml ``` 2. Create the token for the reviewer service account. This Yaml defines a **service account token secret** linked to the reviewer account created above. It generates a JWT token that Infisical uses for the Kubernetes Auth Method in your Machine Identity configuration. ```console theme={"dark"} kubectl apply -f service-account-reviewer-token.yaml ``` 3. This file binds the `infisical-token-reviewer` service account to the built-in `system:auth-delegator` ClusterRole. That role allows the service account to perform **token review** and **authentication delegation** requests on behalf of other service accounts - a key part of Kubernetes-based identity verification. Without this binding, the Infisical Operator wouldn't have permission to validate tokens. ```console theme={"dark"} kubectl apply -f cluster-role-binding.yaml ``` 4. Create the service account that will be used by the InfisicalSecret. This file creates a **dedicated service account** `infisical-service-account` that the Infisical Operator uses to access and sync secrets within your cluster. It operates as the Operator's working identity in your cluster, separate from the token reviewer. ```console theme={"dark"} kubectl apply -f infisical-service-account.yaml ``` 5. Create the token for the Infisical service account. This manifest defines a **token secret** for the `infisical-service-account`. It allows the Infisical operator to authenticate against Infisical's API when syncing secrets. The token will then be manually patched and associated with the service account to make sure Kubernetes mains it persistently. ```console theme={"dark"} kubectl apply -f infisical-service-account-token.yaml ``` 6. Apply the patch to manually associate the token secret ```console theme={"dark"} kubectl patch serviceaccount infisical-service-account -p '{"secrets": [{"name": "infisical-service-account-token"}]}' -n default ``` 7. Create the **JWT Token** and **Certificate** and add it to the **Machine Identity** we created under **Kubernetes Auth**. For the generated CA, navigate to the **Advanced** tab to paste the certificate: * JWT Command ```console theme={"dark"} kubectl get secret infisical-token-reviewer-token -n default -o jsonpath='{.data.token}' | base64 -d ``` * CA Command ```console theme={"dark"} kubectl get secret infisical-token-reviewer-token -n default -o jsonpath='{.data.ca\.crt}' | base64 -d ``` 1. Check to see if the service accounts were created ```console theme={"dark"} kubectl get serviceaccount -n default | grep infisical ``` 2. Verify the tokens were created and linked ```console theme={"dark"} kubectl get secrets -n default | grep infisical ``` The [InfisicalSecret](https://infisical.com/docs/integrations/platforms/kubernetes/infisical-secret-crd) CRD tells the operator to sync secrets from Infisical to Kubernetes. By referencing your `identityID`, `projectSlug`, and `envSlug`, this CRD tells the Infisical Operator which Infisical secrets to fetch and how to format them into a Kubernetes Secret. Make sure to edit the provided CRD to match your specific Machine Identity ID, Project ID, and which environment your secrets are being pulled from (default is prod). * **Project Slug**: Can be found when you select your project and navigate to settings * **Identity ID**: Can be found when you select your machine identity from your organization's access control 1. After editing the `example-infisical-secret-crd.yaml` to contain your demo-specific values, apply the yaml in your cluster ```console theme={"dark"} kubectl apply -f example-infisical-secret-crd.yaml ``` 1. Check that the `InfisicalSecret` was created successfully ```console theme={"dark"} kubectl get infisicalsecret -n default ``` 2. Check that the operator created the `managed-secret` ```console theme={"dark"} kubectl get secret managed-secret -n default ``` 3. View the secret contents (base64 encoded) ```console theme={"dark"} kubectl get secret managed-secret -n default -o jsonpath='{.data}' | jq ``` 1. Deploy the nginx demo deployment that will use the managed secret. ```console theme={"dark"} kubectl apply -f demo-deployment.yaml ``` 2. Wait 15-20 seconds and then verify the deployments ```console theme={"dark"} kubectl get deployments kubectl get pods -l app=nginx ``` 1. Check that the environment variable is in the running pod. If everything was successful, at this point you should be able to see the secret populate in the kubernetes pod and have a successful **sync** from Infisical to Kubernetes. ```console theme={"dark"} kubectl exec -it $(kubectl get pod -l app=nginx -o jsonpath='{.items[0].metadata.name}') -- env | grep SMTP ``` Now that we have successfully synced secrets from Infisical to Kubernetes, lets explore how we can push **Kubernetes Secrets** to Infisical. 1. Either create a **Kubernetes Secret** via yaml, or use the one in the repository. ```console theme={"dark"} kubectl apply -f source-secret.yaml ``` 2. Verify creation of the secret ```console theme={"dark"} kubectl get secret push-secret-demo -n default -o yaml ``` The [InfisicalPushSecret](https://infisical.com/docs/integrations/platforms/kubernetes/infisical-push-secret-crd) CRD tells the operator to sync secrets from Kubernetes to Infisical. Make sure you edit the CRD to include the specific **Project Slug**, and **Identity ID**. The other values present in `example-push-secret.yaml` should be configured based on the previously committed yaml configurations. 1. Apply the InfisicalPushSecret CRD provided after making the necessary changes ```console theme={"dark"} kubectl apply -f example-push-secret-crd.yaml ``` 2. Once your CRD has been configured, go back to your project within Infisical and check to see if your secrets have populated there. secrets dashboard The [InfisicalDynamicSecret](https://infisical.com/docs/integrations/platforms/kubernetes/infisical-dynamic-secret-crd) CRD allows you to sync dynamic secrets and create leases automatically in Kubernetes as native **Kubernetes Secret** resources Any Pod, Deployment, or other Kubernetes resource can make use of dynamic secrets from Infisical just like any other Kubernetes secret. 1. Navigate to your Infisical **Project** and click on the dropdown next to **Add Secret**. From here you will select **Add Dynamic Secret** * Select **SQL Database** as the service you would like to connect to. * Select **PostegreSQL** as the database service. Enter in the connection details for your database, specifically the **Host**, **Port**, **User**, **Password**, and **Database Name**. * For the **Secret Name**, if you want to use the same name as the one in the cloned **InfisicalDynamicSecret** CRD, use the name **dynamic-secret-lease**. Otherwise you will need to change the **dynamicSecret.secretName** config in the InfisicalDynamicSecret CRD to whatever you name the secret here. * In the CA (SSL) section, make sure to upload the **CA Certificate** for your database. * Finally, select **Prod** as the environment (we are keeping this configuration as part of the demonstration). secrets dashboard dynamic 2. Edit the `dynamic-secret-crd` with the proper machine **Identity ID**, **Project Slug**, **dynamicSecret.secretName** (same as the **Secret Name** you gave to the dynamic secret in Infisical), and managedSecretReference.secretName (name of the kubernetes secret that Infisical Operator will create/populate in the cluster). * If you want to keep the **managedSecretReference.secretName** then you can leave it as **dynamic-secret-test** 3. Once the changes have been saved, apply the yaml: ```console theme={"dark"} kubectl apply -f dynamic-secret-crd.yaml ``` 4. After applying the CRD, you should notice that the dynamic secret lease has been created and synced with your cluster. Verify by running: ```console theme={"dark"} kubectl get secret dynamic-secret-test -n default -o yaml ``` 5. Once the dynamic secret lease has been created, you should see that the secret has data that contains the lease credentials. dynamic secrets output **Congratulations! You successfully managed secrets with Kubernetes.** --- # Source: https://infisical.com/docs/documentation/platform/pam/getting-started/resources/kubernetes.md # Source: https://infisical.com/docs/documentation/platform/dynamic-secrets/kubernetes.md > ## Documentation Index > Fetch the complete documentation index at: https://infisical.com/docs/llms.txt > Use this file to discover all available pages before exploring further. # Kubernetes > Learn how to dynamically generate Kubernetes service account tokens. The Infisical Kubernetes dynamic secret allows you to generate short-lived service account tokens on demand. ## Overview The Kubernetes dynamic secret feature enables you to generate short-lived service account tokens for your Kubernetes clusters. This is particularly useful for: * **Secure Access Management**: Instead of using long-lived service account tokens, you can generate short-lived tokens that automatically expire, reducing the risk of token exposure. * **Temporary Access**: Generate tokens with specific TTLs (Time To Live) for temporary access to your Kubernetes clusters. * **Audit Trail**: Each token generation is tracked, providing better visibility into who accessed your cluster and when. * **Integration with Private Clusters**: Seamlessly work with private Kubernetes clusters using Infisical's Gateway feature. Kubernetes service account tokens cannot be revoked once issued. This is why it's important to use short TTLs and carefully manage token generation. The tokens will automatically expire after their TTL period. Kubernetes service account tokens are JWTs (JSON Web Tokens) with a fixed expiration time. Once a token is generated, its lifetime cannot be extended. If you need longer access, you'll need to generate a new token. This feature is ideal for scenarios where you need to: * Provide temporary access to developers or CI/CD pipelines * Rotate service account tokens frequently * Maintain a secure audit trail of cluster access * Manage access to multiple Kubernetes clusters ## Set up Dynamic Secrets with Kubernetes Open the Secret Overview dashboard and select the environment in which you would like to add a dynamic secret. Add Dynamic Secret Button Dynamic Secret Modal Before proceeding with the setup, you'll need to make two key decisions: 1. **Credential Type**: How you want to manage service accounts * **Static**: Use an existing service account with predefined permissions * **Dynamic**: Create temporary service accounts with specific role assignments 2. **Authentication Method**: How you want to authenticate with the cluster * **Token (API)**: Use a service account token for direct API access * **Gateway**: Use an Infisical Gateway deployed in your cluster Static credentials generate service account tokens for a predefined service account. This is useful when you want to: * Generate tokens for an existing service account * Maintain consistent permissions across token generations * Use a service account that already has the necessary RBAC permissions ### Prerequisites * A Kubernetes cluster with a service account * Cluster access token with permissions to create service account tokens * (Optional) [Gateway](/documentation/platform/gateways/overview) for private cluster access ### Authentication Setup Choose your authentication method: This method uses a service account token to authenticate with the Kubernetes cluster. It's suitable when: * You want to use a specific service account token that you've created * You're working with a public cluster or have network access to the cluster's API server * You want to explicitly control which service account is used for operations With Token (API) authentication, Infisical uses the provided service account token to make API calls to your Kubernetes cluster. This token must have the necessary permissions to generate tokens for the target service account. 1. Create a service account: ```yaml infisical-service-account.yaml theme={"dark"} apiVersion: v1 kind: ServiceAccount metadata: name: infisical-token-requester namespace: default ``` ```bash theme={"dark"} kubectl apply -f infisical-service-account.yaml ``` 2. Set up RBAC permissions: ```yaml rbac.yaml theme={"dark"} apiVersion: rbac.authorization.k8s.io/v1 kind: ClusterRole metadata: name: tokenrequest rules: - apiGroups: [""] resources: - "serviceaccounts/token" - "serviceaccounts" verbs: - "create" - "get" --- apiVersion: rbac.authorization.k8s.io/v1 kind: ClusterRoleBinding metadata: name: tokenrequest roleRef: apiGroup: rbac.authorization.k8s.io kind: ClusterRole name: tokenrequest subjects: - kind: ServiceAccount name: infisical-token-requester namespace: default ``` ```bash theme={"dark"} kubectl apply -f rbac.yaml ``` 3. Create and obtain the token: ```yaml service-account-token.yaml theme={"dark"} apiVersion: v1 kind: Secret type: kubernetes.io/service-account-token metadata: name: infisical-token-requester-token annotations: kubernetes.io/service-account.name: "infisical-token-requester" ``` ```bash theme={"dark"} kubectl apply -f service-account-token.yaml kubectl patch serviceaccount infisical-token-requester -p '{"secrets": [{"name": "infisical-token-requester-token"}]}' -n default kubectl get secret infisical-token-requester-token -n default -o=jsonpath='{.data.token}' | base64 --decode ``` This method uses an Infisical Gateway deployed in your Kubernetes cluster. It's ideal when: * You want to avoid storing static service account tokens * You prefer to use the Gateway's pre-configured service account * You want centralized management of cluster operations With Gateway authentication, Infisical communicates with the Gateway, which then uses its own service account to make API calls to the Kubernetes API server. The Gateway's service account must have the necessary permissions to generate tokens for the target service account. When using Gateway authentication, the Gateway will access the Kubernetes API server using its internal cluster URL (typically [https://kubernetes.default.svc](https://kubernetes.default.svc)) and TLS configuration. You don't need to specify these values separately in the dynamic secret configuration. 1. Deploy the Infisical Gateway in your cluster 2. Set up RBAC permissions for the Gateway's service account: ```yaml rbac.yaml theme={"dark"} apiVersion: rbac.authorization.k8s.io/v1 kind: ClusterRole metadata: name: tokenrequest rules: - apiGroups: [""] resources: - "serviceaccounts/token" - "serviceaccounts" verbs: - "create" - "get" --- apiVersion: rbac.authorization.k8s.io/v1 kind: ClusterRoleBinding metadata: name: tokenrequest roleRef: apiGroup: rbac.authorization.k8s.io kind: ClusterRole name: tokenrequest subjects: - kind: ServiceAccount name: infisical-gateway namespace: infisical ``` ```bash theme={"dark"} kubectl apply -f rbac.yaml ``` Dynamic credentials create a temporary service account, assign it to a defined role/cluster-role, and generate a service account token. This is useful when you want to: * Create temporary service accounts with specific permissions * Automatically clean up service accounts after token expiration * Assign different roles to different users or applications * Maintain strict control over service account permissions * Support multiple namespaces with a single dynamic secret configuration ### Prerequisites * A Kubernetes cluster with a service account * Cluster access token with permissions to create service accounts and manage RBAC * (Optional) [Gateway](/documentation/platform/gateways/overview) for private cluster access ### Namespace Support When configuring a dynamic secret, you can specify multiple allowed namespaces as a comma-separated list. During lease creation, you can then specify which namespace to use from this allowed list. This provides flexibility while maintaining security by: * Allowing a single dynamic secret configuration to support multiple namespaces * Restricting service account creation to only the specified allowed namespaces * Enabling fine-grained control over which namespaces can be used for each lease For example, if you configure a dynamic secret with allowed namespaces "default,kube-system,monitoring", you can create leases that use any of these namespaces while preventing access to other namespaces in your cluster. ### Authentication Setup Choose your authentication method: This method uses a service account token to authenticate with the Kubernetes cluster. It's suitable when: * You want to use a specific service account token that you've created * You're working with a public cluster or have network access to the cluster's API server * You want to explicitly control which service account is used for operations With Token (API) authentication, Infisical uses the provided service account token to make API calls to your Kubernetes cluster. This token must have the necessary permissions to create and manage service accounts, their tokens, and RBAC resources. 1. Create a service account: ```yaml service-account.yaml theme={"dark"} apiVersion: v1 kind: ServiceAccount metadata: name: infisical-token-requester namespace: default --- apiVersion: v1 kind: Secret type: kubernetes.io/service-account-token metadata: name: infisical-token-requester-token annotations: kubernetes.io/service-account.name: "infisical-token-requester" ``` ```bash theme={"dark"} kubectl apply -f service-account.yaml ``` 2. Set up RBAC permissions: ```yaml rbac.yaml theme={"dark"} apiVersion: rbac.authorization.k8s.io/v1 kind: ClusterRole metadata: name: tokenrequest rules: - apiGroups: [""] resources: - "serviceaccounts/token" - "serviceaccounts" verbs: - "create" - "get" - "delete" - apiGroups: ["rbac.authorization.k8s.io"] resources: - "rolebindings" - "clusterrolebindings" verbs: - "create" - "delete" --- apiVersion: rbac.authorization.k8s.io/v1 kind: ClusterRoleBinding metadata: name: tokenrequest roleRef: apiGroup: rbac.authorization.k8s.io kind: ClusterRole name: tokenrequest subjects: - kind: ServiceAccount name: infisical-token-requester namespace: default --- apiVersion: rbac.authorization.k8s.io/v1 kind: ClusterRoleBinding metadata: name: infisical-dynamic-role-binding-sa roleRef: apiGroup: rbac.authorization.k8s.io kind: ClusterRole name: infisical-dynamic-role subjects: - kind: ServiceAccount name: infisical-token-requester namespace: default ``` ```bash theme={"dark"} kubectl apply -f rbac.yaml ``` This method uses an Infisical Gateway deployed in your Kubernetes cluster. It's ideal when: * You want to avoid storing static service account tokens * You prefer to use the Gateway's pre-configured service account * You want centralized management of cluster operations With Gateway authentication, Infisical communicates with the Gateway, which then uses its own service account to make API calls to the Kubernetes API server. The Gateway's service account must have the necessary permissions to create and manage service accounts, their tokens, and RBAC resources. When using Gateway authentication, the Gateway will access the Kubernetes API server using its internal cluster URL (typically [https://kubernetes.default.svc](https://kubernetes.default.svc)) and TLS configuration. You don't need to specify these values separately in the dynamic secret configuration. 1. Deploy the Infisical Gateway in your cluster 2. Set up RBAC permissions for the Gateway's service account: ```yaml rbac.yaml theme={"dark"} apiVersion: rbac.authorization.k8s.io/v1 kind: ClusterRole metadata: name: tokenrequest rules: - apiGroups: [""] resources: - "serviceaccounts/token" - "serviceaccounts" verbs: - "create" - "get" - "delete" - apiGroups: ["rbac.authorization.k8s.io"] resources: - "rolebindings" - "clusterrolebindings" verbs: - "create" - "delete" --- apiVersion: rbac.authorization.k8s.io/v1 kind: ClusterRoleBinding metadata: name: tokenrequest roleRef: apiGroup: rbac.authorization.k8s.io kind: ClusterRole name: tokenrequest subjects: - kind: ServiceAccount name: infisical-gateway namespace: infisical --- apiVersion: rbac.authorization.k8s.io/v1 kind: ClusterRoleBinding metadata: name: infisical-dynamic-role-binding-sa roleRef: apiGroup: rbac.authorization.k8s.io kind: ClusterRole name: infisical-dynamic-role subjects: - kind: ServiceAccount name: infisical-gateway namespace: infisical ``` ```bash theme={"dark"} kubectl apply -f rbac.yaml ``` In Kubernetes RBAC, a service account can only create role bindings for resources that it has access to. This means that if you want to create dynamic service accounts with access to certain resources, the service account creating these bindings (either the token requester or Gateway service account) must also have access to those same resources. For example, if you want to create dynamic service accounts that can access secrets, the token requester service account must also have access to secrets. Name by which you want the secret to be referenced Default time-to-live for a generated secret (it is possible to modify this value after a secret is generated) Maximum time-to-live for a generated secret Select a gateway for private cluster access. If not specified, the Internet Gateway will be used. Kubernetes API server URL (e.g., [https://kubernetes.default.svc](https://kubernetes.default.svc)). Not required when using Gateway authentication as the Gateway will use its internal cluster URL. Whether to enable SSL verification for the Kubernetes API server connection. Not required when using Gateway authentication as the Gateway will use its internal TLS configuration. Custom CA certificate for the Kubernetes API server. Leave blank to use the system/public CA. Not required when using Gateway authentication as the Gateway will use its internal TLS configuration. Choose between Token (API) or Gateway authentication. If using Gateway, the Gateway must be deployed in your Kubernetes cluster. Token with permissions to create service accounts and manage RBAC (required when using Token authentication) Choose between Static (predefined service account) or Dynamic (temporary service accounts with role assignments) Name of the service account to generate tokens for Kubernetes namespace where the service account exists Kubernetes namespace(s) where the service accounts will be created. You can specify multiple namespaces as a comma-separated list (e.g., "default,kube-system"). During lease creation, you can specify which namespace to use from this allowed list. Type of role to assign (ClusterRole or Role) Name of the role to assign to the temporary service account Optional list of audiences to include in the generated token Dynamic Secret Setup Modal Dynamic Secret Setup Modal After submitting the form, you will see a dynamic secret created in the dashboard. ## Generate and Manage Tokens Once you've successfully configured the dynamic secret, you're ready to generate on-demand service account tokens. To do this, simply click on the 'Generate' button which appears when hovering over the dynamic secret item. Alternatively, you can initiate the creation of a new lease by selecting 'New Lease' from the dynamic secret lease list section. Dynamic Secret Dynamic Secret When generating these secrets, it's important to specify a Time-to-Live (TTL) duration. This will dictate how long the credentials are valid for. Provision Lease Ensure that the TTL for the lease falls within the maximum TTL defined when configuring the dynamic secret. Once you click the `Submit` button, a new secret lease will be generated and the service account token will be shown to you. Provision Lease ## Audit or Revoke Leases Once you have created one or more leases, you will be able to access them by clicking on the respective dynamic secret item on the dashboard. This will allow you to see the lease details and delete the lease ahead of its expiration time. While you can delete the lease from Infisical, the actual Kubernetes service account token cannot be revoked. The token will remain valid until its TTL expires. This is why it's crucial to use appropriate TTL values when generating tokens. Provision Lease --- # Source: https://infisical.com/docs/integrations/platforms/aws/lambda.md > ## Documentation Index > Fetch the complete documentation index at: https://infisical.com/docs/llms.txt > Use this file to discover all available pages before exploring further. # AWS Lambda > How to use Infisical secrets in AWS Lambda Learn how to sync Infisical secrets to AWS Lambda regardless of how you deploy your function. This guide covers the following strategies: * Infisical SDKs * AWS Secrets Manager integration * AWS Systems Manager Parameter Store integration * AWS CLI ## Choose your sync strategy ### 1. Fetch secrets at runtime with Infisical SDKs If you control the Lambda code, the simplest method is to fetch secrets directly from Infisical using one of our SDKs.\ You can read more about the Infisical SDKs [here](/sdks/overview). ### 2. Push via secret sync Configure a secret sync from your Infisical project, and Infisical will keep your Secrets Manager or Parameter Store values up to date. Your Lambda function can then reference those secrets directly.\ Learn more about the [AWS Secrets Manager integration](/integrations/secret-syncs/aws-secrets-manager) and the [AWS Parameter Store integration](/integrations/secret-syncs/aws-parameter-store). ### 3. Push environment variables directly using the AWS CLI For straightforward workflows or quick rotations, you can push Infisical secrets directly into Lambda environment variables using the AWS CLI. ## Prerequisites * AWS CLI v2 installed and authenticated * `jq` installed locally * An IAM principal with `lambda:UpdateFunctionConfiguration` * Infisical CLI (`infisical`) configured ### IAM permissions Attach a policy like the one below to the IAM user or role responsible for updating Lambda configuration: ```json theme={"dark"} { "Version": "2012-10-17", "Statement": [ { "Sid": "LambdaConfig", "Effect": "Allow", "Action": ["lambda:UpdateFunctionConfiguration"], "Resource": "*" } ] } ``` {" "} Replacing Lambda environment variables using the AWS CLI overwrites the entire `Variables` object. Make sure to export your current values so you can import them into Infisical.{" "} #### Push secrets to Lambda Use the Infisical CLI to export secrets as JSON and pass them to the AWS CLI. The example below targets a project by ID, but you can also use the `--project` and `--env` flags. Learn more about `infisical export` [here](/cli/commands/export#infisical-export). ```bash theme={"dark"} FUNCTION_NAME=infisical-env-test REGION=us-east-1 PROJECT_ID=1234567890 aws lambda update-function-configuration \ --function-name "$FUNCTION_NAME" \ --region "$REGION" \ --environment "$( infisical export \ --format=json \ --projectId="$PROJECT_ID" \ | jq 'map({(.key): .value}) | add | {Variables: .}' )" ``` On success, the updated `Environment.Variables` block will be returned. Verify the values in the Lambda console or by invoking the function. Automate this step in CI/CD. Run `infisical export` using an Infisical Token scoped to your project and environment, and trigger the sync as part of your deployment workflow. Learn more about the [Infisical Token](/cli/commands/export#infisical-export:infisical-token). We recommend using automatic secret syncs to AWS Secrets Manager or AWS Parameter Store to keep your secrets continuously in sync and avoid manually updating the Lambda configuration. --- # Source: https://infisical.com/docs/integrations/secret-syncs/laravel-forge.md # Source: https://infisical.com/docs/integrations/app-connections/laravel-forge.md > ## Documentation Index > Fetch the complete documentation index at: https://infisical.com/docs/llms.txt > Use this file to discover all available pages before exploring further. # Laravel Forge Connection > Learn how to configure a Laravel Forge Connection for Infisical. Infisical supports the use of [API Tokens](https://forge.laravel.com/docs/api#create-a-new-api-token) to connect with Laravel Forge. ## Create Laravel Forge API Token Laravel Forge User Settings Applications Tab Provide a name for your token and select the following permissions: * `user:view` * `organization:view` * `server:view` * `site:manage-environment` Then click 'Add token'. Token Form Make sure to copy the token now—you won’t be able to access it again. Token Generated ## Create a Laravel Forge Connection in Infisical In your Infisical dashboard, navigate to the **Integrations** tab in the desired project, then select **App Connections**. App Connections Tab Click **+ Add Connection** and choose **Laravel Forge** Connection from the list of integrations. Select Laravel Forge Connection Complete the form by providing: * A descriptive name for the connection * An optional description * The API Token from the previous step Laravel Forge Connection Modal After submitting the form, your **Laravel Forge Connection** will be successfully created and ready to use with your Infisical project. Laravel Forge Connection Created To create a Laravel Forge Connection via API, send a request to the [Create Laravel Forge Connection](/api-reference/endpoints/app-connections/laravel-forge/create) endpoint. ### Sample request ```bash Request theme={"dark"} curl --request POST \ --url https://app.infisical.com/api/v1/app-connections/laravel-forge \ --header 'Content-Type: application/json' \ --data '{ "name": "my-laravel-forge-connection", "method": "api-token", "projectId": "7ffbb072-2575-495a-b5b0-127f88caef78", "credentials": { "apiToken": "[API TOKEN]" } }' ``` ### Sample response ```bash Response theme={"dark"} { "appConnection": { "id": "a1b2c3d4-5678-90ab-cdef-1234567890ab", "name": "my-laravel-forge-connection", "description": null, "projectId": "7ffbb072-2575-495a-b5b0-127f88caef78", "version": 1, "orgId": "abcdef12-3456-7890-abcd-ef1234567890", "createdAt": "2025-10-13T10:15:00.000Z", "updatedAt": "2025-10-13T10:15:00.000Z", "isPlatformManagedCredentials": false, "credentialsHash": "d41d8cd98f00b204e9800998ecf8427e", "app": "laravel-forge", "method": "api-token", "credentials": {} } } ``` --- # Source: https://infisical.com/docs/integrations/frameworks/laravel.md > ## Documentation Index > Fetch the complete documentation index at: https://infisical.com/docs/llms.txt > Use this file to discover all available pages before exploring further. # Laravel > How to use Infisical to inject environment variables and secrets into a Laravel app. Prerequisites: * Set up and add envars to [Infisical Cloud](https://app.infisical.com) * [Install the CLI](/cli/overview) ## Initialize Infisical for your [Laravel](https://laravel.com/) app ```bash theme={"dark"} # navigate to the root of your of your project cd /path/to/project # then initialize Infisical infisical init ``` ## Start your application as usual but with Infisical ```bash theme={"dark"} infisical run -- # Example infisical run -- php artisan serve ``` --- # Source: https://infisical.com/docs/documentation/platform/secret-rotation/ldap-password.md > ## Documentation Index > Fetch the complete documentation index at: https://infisical.com/docs/llms.txt > Use this file to discover all available pages before exploring further. # LDAP Password Rotation > Learn how to automatically rotate LDAP passwords. Due to how LDAP passwords are rotated, retired credentials will not be able to authenticate with the LDAP provider during their [inactive period](./overview#how-rotation-works). This is a limitation of the LDAP provider and cannot be rectified by Infisical. ## Prerequisites * Create an [LDAP Connection](/integrations/app-connections/ldap) with the **Secret Rotation** requirements * Ensure your network security policies allow incoming requests from Infisical to this rotation provider, if network restrictions apply. ## Create an LDAP Password Rotation in Infisical 1. Navigate to your Secret Manager Project's Dashboard and select **Add Secret Rotation** from the actions dropdown. Secret Manager Dashboard 2. Select the **LDAP Password** option. Select LDAP Password 3. Select the **LDAP Connection** to use and configure the rotation behavior. Then click **Next**. Rotation Configuration * **LDAP Connection** - the connection that will perform the rotation of the configured principal's password. LDAP Password Rotations require an LDAP Connection that uses ldaps\:// protocol. * **Rotation Interval** - the interval, in days, that once elapsed will trigger a rotation. * **Rotate At** - the local time of day when rotation should occur once the interval has elapsed. * **Auto-Rotation Enabled** - whether secrets should automatically be rotated once the rotation interval has elapsed. Disable this option to manually rotate secrets or pause secret rotation. Due to LDAP Password Rotations rotating a single credential set, auto-rotation may result in service interruptions. If you need to ensure service continuity, we recommend disabling this option. 4. Configure the required Parameters for your rotation. Then click **Next**. Rotation Parameters * **Rotation Method** - The method to use when rotating the target principal's password. * **Connection Principal** - Infisical will use the LDAP Connection's binding principal to rotate the target principal's password. * **Target Principal** - Infisical will bind with the target Principal to rotate their own password. * **DN/UPN** - The Distinguished Name (DN), or User Principal Name (UPN) if supported, of the principal whose password you want to rotate. * **Password** - The target principal's password (if **Rotation Method** is set to **Target Principal**). * **Password Requirements** - The constraints to apply when generating new passwords. 5. Specify the secret names that the client credentials should be mapped to. Then click **Next**. Rotation Secrets Mapping * **DN/UPN** - the name of the secret that the principal's Distinguished Name (DN) or User Principal Name (UPN) will be mapped to. * **Password** - the name of the secret that the rotated password will be mapped to. 6. Give your rotation a name and description (optional). Then click **Next**. Rotation Details * **Name** - the name of the secret rotation configuration. Must be slug-friendly. * **Description** (optional) - a description of this rotation configuration. 7. Review your configuration, then click **Create Secret Rotation**. Rotation Review 8. Your **LDAP Password** credentials are now available for use via the mapped secrets. Rotation Created To create an LDAP Password Rotation, make an API request to the [Create LDAP Password Rotation](/api-reference/endpoints/secret-rotations/ldap-password/create) API endpoint. ### Sample request ```bash Request theme={"dark"} curl --request POST \ --url https://us.infisical.com/api/v2/secret-rotations/ldap-password \ --header 'Content-Type: application/json' \ --data '{ "name": "my-ldap-rotation", "projectId": "3c90c3cc-0d44-4b50-8888-8dd25736052a", "description": "my ldap password rotation", "connectionId": "3c90c3cc-0d44-4b50-8888-8dd25736052a", "environment": "dev", "secretPath": "/", "isAutoRotationEnabled": false, "rotationInterval": 30, "rotateAtUtc": { "hours": 0, "minutes": 0 }, "parameters": { "rotationMethod": "connection-principal", "dn": "CN=John,CN=Users,DC=example,DC=com", "passwordRequirements": { "length": 48, "required": { "digits": 2, "lowercase": 2, "uppercase": 2, "symbols": 2 }, "allowedSymbols": "-_.~!*" } }, "secretsMapping": { "dn": "LDAP_DN", "password": "LDAP_PASSWORD" } }' ``` Due to LDAP Password Rotations rotating a single credential set, auto-rotation may result in service interruptions. If you need to ensure service continuity, we recommend disabling this option. ### Sample response ```bash Response theme={"dark"} { "secretRotation": { "id": "3c90c3cc-0d44-4b50-8888-8dd25736052a", "name": "my-ldap-rotation", "description": "my ldap password rotation", "secretsMapping": { "dn": "LDAP_DN", "password": "LDAP_PASSWORD" }, "isAutoRotationEnabled": false, "activeIndex": 0, "folderId": "3c90c3cc-0d44-4b50-8888-8dd25736052a", "connectionId": "3c90c3cc-0d44-4b50-8888-8dd25736052a", "createdAt": "2023-11-07T05:31:56Z", "updatedAt": "2023-11-07T05:31:56Z", "rotationInterval": 30, "rotationStatus": "success", "lastRotationAttemptedAt": "2023-11-07T05:31:56Z", "lastRotatedAt": "2023-11-07T05:31:56Z", "lastRotationJobId": "3c90c3cc-0d44-4b50-8888-8dd25736052a", "nextRotationAt": "2023-11-07T05:31:56Z", "connection": { "app": "ldap", "name": "my-ldap-connection", "id": "3c90c3cc-0d44-4b50-8888-8dd25736052a" }, "environment": { "slug": "dev", "name": "Development", "id": "3c90c3cc-0d44-4b50-8888-8dd25736052a" }, "projectId": "3c90c3cc-0d44-4b50-8888-8dd25736052a", "folder": { "id": "3c90c3cc-0d44-4b50-8888-8dd25736052a", "path": "/" }, "rotateAtUtc": { "hours": 0, "minutes": 0 }, "lastRotationMessage": null, "type": "ldap-password", "parameters": { "rotationMethod": "connection-principal", "dn": "CN=John,CN=Users,DC=example,DC=com", "passwordRequirements": { "length": 48, "required": { "digits": 2, "lowercase": 2, "uppercase": 2, "symbols": 2 }, "allowedSymbols": "-_.~!*" } } } } ``` --- # Source: https://infisical.com/docs/integrations/app-connections/ldap.md # Source: https://infisical.com/docs/documentation/platform/dynamic-secrets/ldap.md > ## Documentation Index > Fetch the complete documentation index at: https://infisical.com/docs/llms.txt > Use this file to discover all available pages before exploring further. # LDAP > Learn how to dynamically generate user credentials via LDAP. The Infisical LDAP dynamic secret allows you to generate user credentials on demand via LDAP. The integration is general to any LDAP implementation but has been tested with OpenLDAP and Active directory as of now. ## Prerequisites 1. Create a user with the necessary permissions to create users in your LDAP server. 2. Ensure your LDAP server is reachable via Infisical instance. ## Create LDAP Credentials Open the Secret Overview dashboard and select the environment in which you would like to add a dynamic secret. Add Dynamic Secret Button Dynamic Secret Modal Name by which you want the secret to be referenced Default time-to-live for a generated secret (it is possible to modify this value after a secret is generated) Maximum time-to-live for a generated secret. LDAP url to connect to. *(Example: ldap\://your-ldap-ip:389 or ldaps\://domain:636)* DN to bind to. This should have permissions to create a new users. Password for the given DN. CA certificate to use for TLS in case of a secure connection. The type of LDAP credential - select Dynamic. LDIF to run while creating a user in LDAP. This can include extra steps to assign the user to groups or set permissions. Here `{{Username}}`, `{{Password}}` and `{{EncodedPassword}}` are templatized variables for the username and password generated by the dynamic secret. `{{EncodedPassword}}` is the encoded password required for the `unicodePwd` field in Active Directory as described [here](https://learn.microsoft.com/en-us/troubleshoot/windows-server/active-directory/change-windows-active-directory-user-password). **OpenLDAP** Example: ``` dn: uid={{Username}},dc=infisical,dc=com changetype: add objectClass: top objectClass: person objectClass: organizationalPerson objectClass: inetOrgPerson cn: John Doe sn: Doe uid: jdoe mail: jdoe@infisical.com userPassword: {{Password}} ``` **Active Directory** Example: ``` dn: CN={{Username}},OU=Test Create,DC=infisical,DC=com changetype: add objectClass: top objectClass: person objectClass: organizationalPerson objectClass: user userPrincipalName: {{Username}}@infisical.com sAMAccountName: {{Username}} unicodePwd::{{EncodedPassword}} userAccountControl: 66048 dn: CN=test-group,OU=Test Create,DC=infisical,DC=com changetype: modify add: member member: CN={{Username}},OU=Test Create,DC=infisical,DC=com - ``` LDIF to run while revoking a user in LDAP. This can include extra steps to remove the user from groups or set permissions. Here `{{Username}}` is a templatized variable for the username generated by the dynamic secret. **OpenLDAP / Active Directory** Example: ``` dn: CN={{Username}},OU=Test Create,DC=infisical,DC=com changetype: delete ``` LDIF to run incase Creation LDIF fails midway. For the creation example shown above, if the user is created successfully but not added to a group, this LDIF can be used to remove the user. Here `{{Username}}`, `{{Password}}` and `{{EncodedPassword}}` are templatized variables for the username generated by the dynamic secret. **OpenLDAP / Active Directory** Example: ``` dn: CN={{Username}},OU=Test Create,DC=infisical,DC=com changetype: delete ``` Specifies a template for generating usernames. This field allows customization of how usernames are automatically created. Allowed template variables are: * `{{randomUsername}}`: Random username string. * `{{unixTimestamp}}`: Current Unix timestamp at the time of lease creation. * `{{identity.name}}`: Name of the identity that is generating the lease. * `{{dynamicSecret.name}}`: Name of the associated dynamic secret. * `{{dynamicSecret.type}}`: Type of the associated dynamic secret. * `{{random N}}`: Random string of N characters. Allowed template functions are: * `truncate`: Truncates a string to a specified length. * `replace`: Replaces a substring with another value. * `uppercase`: Converts a string to uppercase. * `lowercase`: Converts a string to lowercase. Examples: ```yaml theme={"dark"} {{ randomUsername }} // 3POnzeFyK9gW2nioK0q2gMjr6CZqsRiX {{ unixTimestamp }} // 17490641580 {{ identity.name }} // {{ random 5 }} // x9K2m {{ truncate identity.name 4 }} // test {{ replace identity.name '' 'new-value' }} // new-value ``` After submitting the form, you will see a dynamic secret created in the dashboard. Once you've successfully configured the dynamic secret, you're ready to generate on-demand credentials. To do this, simply click on the 'Generate' button which appears when hovering over the dynamic secret item. Alternatively, you can initiate the creation of a new lease by selecting 'New Lease' from the dynamic secret lease list section. Dynamic Secret Dynamic Secret When generating these secrets, it's important to specify a Time-to-Live (TTL) duration. This will dictate how long the credentials are valid for. Provision Lease Ensure that the TTL for the lease falls within the maximum TTL defined when configuring the dynamic secret. Once you click the `Submit` button, a new secret lease will be generated and the credentials from it will be shown to you with an array of DN's altered depending on the Creation LDIF. Provision Lease Open the Secret Overview dashboard and select the environment in which you would like to add a dynamic secret. Add Dynamic Secret Button Dynamic Secret Modal Name by which you want the secret to be referenced Default time-to-live for a generated secret (it is possible to modify this value after a secret is generated) Maximum time-to-live for a generated secret. LDAP url to connect to. *(Example: ldap\://your-ldap-ip:389 or ldaps\://domain:636)* DN to bind to. This should have permissions to create a new users. Password for the given DN. CA certificate to use for TLS in case of a secure connection. The type of LDAP credential - select Static. LDIF to run for rotating the credentals of an LDAP user. This can include extra LDAP steps based on your needs. Here `{{Password}}` and `{{EncodedPassword}}` are templatized variables for the password generated by the dynamic secret. Note that the `-` characters and the empty lines found at the end of the examples are necessary based on the LDIF format. **OpenLDAP** Example: ``` dn: cn=sheencaps capadngan,ou=people,dc=acme,dc=com changetype: modify replace: userPassword password: {{Password}} - ``` **Active Directory** Example: ``` dn: cn=sheencaps capadngan,ou=people,dc=acme,dc=com changetype: modify replace: unicodePwd unicodePwd::{{EncodedPassword}} - ``` `{{EncodedPassword}}` is the encoded password required for the `unicodePwd` field in Active Directory as described [here](https://learn.microsoft.com/en-us/troubleshoot/windows-server/active-directory/change-windows-active-directory-user-password). After submitting the form, you will see a dynamic secret created in the dashboard. Once you've successfully configured the dynamic secret, you're ready to generate on-demand credentials. To do this, simply click on the 'Generate' button which appears when hovering over the dynamic secret item. Alternatively, you can initiate the creation of a new lease by selecting 'New Lease' from the dynamic secret lease list section. Dynamic Secret Dynamic Secret When generating these secrets, it's important to specify a Time-to-Live (TTL) duration. This will dictate how long the credentials are valid for. Provision Lease Ensure that the TTL for the lease falls within the maximum TTL defined when configuring the dynamic secret. Once you click the `Submit` button, a new secret lease will be generated and the credentials from it will be shown to you with an array of DN's altered depending on the Creation LDIF. Provision Lease ## Active Directory Integration * Passwords in Active Directory are set using the `unicodePwd` field. This must be proceeded by two colons `::` as shown in the example. [Source](https://learn.microsoft.com/en-us/troubleshoot/windows-server/active-directory/change-windows-active-directory-user-password) * Active directory uses the `userAccountControl` field to enable account. [Read More](https://learn.microsoft.com/en-us/troubleshoot/windows-server/active-directory/useraccountcontrol-manipulate-account-properties) * `userAccountControl` set to `512` enables a user. * To disable AD's password expiration for this dynamic user account. The `userAccountControl` value for this is: `65536`. * Since `userAccountControl` flag is cumulative set it to `512 + 65536` = `66048` to do both. * Active Directory does not permit direct modification of a user's `memberOf` attribute. The member attribute of a group and the `memberOf` attribute of a user are [linked attributes](https://learn.microsoft.com/en-us/windows/win32/ad/linked-attributes), where the member attribute represents the forward link, which can be modified. In the context of AD group membership, the group's `member` attribute serves as the forward link. Therefore, to add a newly created dynamic user to a group, a modification request must be issued to the desired group, updating its membership to include the new user. ## LDIF Entries User account management is handled through **LDIF entries**. #### Things to Remember * **No trailing spaces:** Ensure there are no trailing spaces on any line, including blank lines. * **Empty lines before modify blocks:** Every modify block must be preceded by an empty line. * **Multiple modifications:** You can define multiple modifications for a DN within a single modify block. Each modification should end with a single dash (`-`). --- # Source: https://infisical.com/docs/documentation/platform/pki/ca/lets-encrypt.md > ## Documentation Index > Fetch the complete documentation index at: https://infisical.com/docs/llms.txt > Use this file to discover all available pages before exploring further. # Let's Encrypt > Learn how to connect Infisical to Let's Encrypt to issue certificates. ## Concept Infisical can connect to [Let's Encrypt](https://letsencrypt.org/) using the [ACME-compatible CA integration](/documentation/platform/pki/ca/acme-ca) to issue certificates back to your end-entities. ## Guide to Connecting Infisical to Let's Encrypt CA To connect Infisical to Let's Encrypt, follow the steps in the [ACME-compatible CA integration](/documentation/platform/pki/ca/acme-ca) guide but use the Let's Encrypt **ACME Directory URL**: `https://acme-v02.api.letsencrypt.org/directory`. Note that Let’s Encrypt issues 90-day certificates and enforces a limit of 50 certificates per registered domain per week. We strongly recommend testing your setup against the Let's Encrypt staging environment first at the **ACME Directory URL** `https://acme-staging-v02.api.letsencrypt.org/directory` prior to switching to the production environment. This allows you to verify your DNS configuration and certificate issuance process without consuming production rate limits. --- # Source: https://infisical.com/docs/self-hosting/reference-architectures/linux-deployment-ha.md > ## Documentation Index > Fetch the complete documentation index at: https://infisical.com/docs/llms.txt > Use this file to discover all available pages before exploring further. # Linux (HA) > Infisical High Availability Deployment architecture for Linux This guide describes how to achieve a highly available deployment of Infisical on Linux machines without containerization. The architecture provided serves as a foundation for minimum high availability, which you can scale based on your specific requirements. ## Architecture Overview High availability stack The deployment consists of the following key components: | Service | Nodes | Recommended Specs | GCP Instance | AWS Instance | | ---------------------- | ----- | ------------------- | ------------- | ------------ | | External Load Balancer | 1 | 4 vCPU, 4 GB memory | n1-highcpu-4 | c5n.xlarge | | Internal Load Balancer | 1 | 4 vCPU, 4 GB memory | n1-highcpu-4 | c5n.xlarge | | Etcd Cluster | 3 | 4 vCPU, 4 GB memory | n1-highcpu-4 | c5n.xlarge | | PostgreSQL Cluster | 3 | 2 vCPU, 8 GB memory | n1-standard-2 | m5.large | | Redis + Sentinel | 3+3 | 2 vCPU, 8 GB memory | n1-standard-2 | m5.large | | Infisical Core | 3 | 2 vCPU, 4 GB memory | n1-highcpu-2 | c5.large | ### Network Architecture All servers operate within the 52.1.0.0/24 private network range with the following IP assignments: | Service | IP Address | | ---------------------- | ---------- | | External Load Balancer | 52.1.0.1 | | Internal Load Balancer | 52.1.0.2 | | Etcd Node 1 | 52.1.0.3 | | Etcd Node 2 | 52.1.0.4 | | Etcd Node 3 | 52.1.0.5 | | PostgreSQL Node 1 | 52.1.0.6 | | PostgreSQL Node 2 | 52.1.0.7 | | PostgreSQL Node 3 | 52.1.0.8 | | Redis Node 1 | 52.1.0.9 | | Redis Node 2 | 52.1.0.10 | | Redis Node 3 | 52.1.0.11 | | Sentinel Node 1 | 52.1.0.12 | | Sentinel Node 2 | 52.1.0.13 | | Sentinel Node 3 | 52.1.0.14 | | Infisical Core 1 | 52.1.0.15 | | Infisical Core 2 | 52.1.0.16 | | Infisical Core 3 | 52.1.0.17 | ## Component Setup Guide ### 1. Configure Etcd Cluster The Etcd cluster is needed for leader election in the PostgreSQL HA setup. Skip this step if using managed PostgreSQL. 1. Install Etcd on each node: ```bash theme={"dark"} sudo apt update sudo apt install etcd ``` 2. Configure each node with unique identifiers and cluster membership. Example configuration for Node 1 (`/etc/etcd/etcd.conf`): ```yaml theme={"dark"} name: etcd1 data-dir: /var/lib/etcd initial-cluster-state: new initial-cluster-token: etcd-cluster-1 initial-cluster: etcd1=http://52.1.0.3:2380,etcd2=http://52.1.0.4:2380,etcd3=http://52.1.0.5:2380 initial-advertise-peer-urls: http://52.1.0.3:2380 listen-peer-urls: http://52.1.0.3:2380 listen-client-urls: http://52.1.0.3:2379,http://127.0.0.1:2379 advertise-client-urls: http://52.1.0.3:2379 ``` ### 2. Configure PostgreSQL For production deployments, you have two options for highly available PostgreSQL: #### Option A: Managed PostgreSQL Service (Recommended for Most Users) Use cloud provider managed services: * AWS: Amazon RDS for PostgreSQL with Multi-AZ * GCP: Cloud SQL for PostgreSQL with HA configuration * Azure: Azure Database for PostgreSQL with zone redundant HA These services handle replication, failover, and maintenance automatically. #### Option B: Self-Managed PostgreSQL Cluster Full HA installation guide of PostgreSQL is beyond the scope of this document. However, we have provided an overview of resources and code snippets below to guide your deployment. 1. Required Components: * PostgreSQL 14+ on each node * Patroni for cluster management * Etcd for distributed consensus 2. Documentation we recommend you read: * [Complete Patroni Setup Guide](https://patroni.readthedocs.io/en/latest/README.html) * [PostgreSQL Replication Documentation](https://www.postgresql.org/docs/current/high-availability.html) 3. Key Steps Overview: ```bash theme={"dark"} # 1. Install requirements on each PostgreSQL node sudo apt update sudo apt install -y postgresql-14 postgresql-contrib-14 python3-pip pip3 install patroni[etcd] psycopg2-binary # 2. Create Patroni config directory sudo mkdir /etc/patroni sudo chown postgres:postgres /etc/patroni # 3. Create Patroni configuration (example for first node) # /etc/patroni/config.yml - REQUIRES CAREFUL CUSTOMIZATION ``` ```yaml theme={"dark"} scope: infisical-cluster namespace: /db/ name: postgresql1 restapi: listen: 52.1.0.6:8008 connect_address: 52.1.0.6:8008 etcd: hosts: 52.1.0.3:2379,52.1.0.4:2379,52.1.0.5:2379 bootstrap: dcs: ttl: 30 loop_wait: 10 retry_timeout: 10 maximum_lag_on_failover: 1048576 postgresql: use_pg_rewind: true parameters: max_connections: 1000 shared_buffers: 2GB work_mem: 8MB max_worker_processes: 8 max_parallel_workers_per_gather: 4 max_parallel_workers: 8 wal_level: replica hot_standby: "on" max_wal_senders: 10 max_replication_slots: 10 hot_standby_feedback: "on" ``` 4. Important considerations: * Proper disk configuration for WAL and data directories * Network latency between nodes * Backup strategy and point-in-time recovery * Monitoring and alerting setup * Connection pooling configuration * Security and network access controls 5. Recommended readings: * [PostgreSQL Backup and Recovery](https://www.postgresql.org/docs/current/backup.html) * [PostgreSQL Monitoring](https://www.postgresql.org/docs/current/monitoring.html) ### 3. Configure Redis and Sentinel Similar to PostgreSQL, a full HA Redis setup guide is beyond the scope of this document. Below are the key resources and considerations for your deployment. #### Option A: Managed Redis Service (Recommended for Most Users) Use cloud provider managed Redis services: * AWS: ElastiCache for Redis with Multi-AZ * GCP: Memorystore for Redis with HA * Azure: Azure Cache for Redis with zone redundancy Follow your cloud provider's documentation: * [AWS ElastiCache Documentation](https://docs.aws.amazon.com/AmazonElastiCache/latest/red-ug/WhatIs.html) * [GCP Memorystore Documentation](https://cloud.google.com/memorystore/docs/redis) * [Azure Redis Cache Documentation](https://learn.microsoft.com/en-us/azure/azure-cache-for-redis/) #### Option B: Self-Managed Redis Cluster Setting up a production Redis HA cluster requires understanding several components. Refer to these linked resources: 1. Required Reading: * [Redis Sentinel Documentation](https://redis.io/docs/management/sentinel/) * [Redis Replication Guide](https://redis.io/topics/replication) * [Redis Security Guide](https://redis.io/topics/security) 2. Key Steps Overview: ```bash theme={"dark"} # 1. Install Redis on all nodes sudo apt update sudo apt install redis-server # 2. Configure master node (52.1.0.9) # /etc/redis/redis.conf ``` ```conf theme={"dark"} bind 52.1.0.9 port 6379 dir /var/lib/redis maxmemory 3gb maxmemory-policy noeviction requirepass "your_redis_password" masterauth "your_redis_password" ``` 3. Configure replica nodes (`52.1.0.10`, `52.1.0.11`): ```conf theme={"dark"} bind 52.1.0.10 # Change for each replica port 6379 dir /var/lib/redis replicaof 52.1.0.9 6379 masterauth "your_redis_password" requirepass "your_redis_password" ``` 4. Configure Sentinel nodes (`52.1.0.12`, `52.1.0.13`, `52.1.0.14`): ```conf theme={"dark"} port 26379 sentinel monitor mymaster 52.1.0.9 6379 2 sentinel auth-pass mymaster "your_redis_password" sentinel down-after-milliseconds mymaster 5000 sentinel failover-timeout mymaster 60000 sentinel parallel-syncs mymaster 1 ``` 5. Recommended Additional Reading: * [Redis High Availability Tools](https://redis.io/topics/high-availability) * [Redis Sentinel Client Implementation](https://redis.io/topics/sentinel-clients) ### 4. Configure HAProxy Load Balancer Install and configure HAProxy for internal load balancing: ```conf ha-proxy-config theme={"dark"} global maxconn 10000 log stdout format raw local0 defaults log global mode tcp retries 3 timeout client 30m timeout connect 10s timeout server 30m timeout check 5s listen stats mode http bind *:7000 stats enable stats uri / resolvers hostdns nameserver dns 127.0.0.11:53 resolve_retries 3 timeout resolve 1s timeout retry 1s hold valid 5s frontend postgres_master bind *:5000 default_backend postgres_master_backend frontend postgres_replicas bind *:5001 default_backend postgres_replica_backend backend postgres_master_backend option httpchk GET /master http-check expect status 200 default-server inter 3s fall 3 rise 2 on-marked-down shutdown-sessions server postgres-1 52.1.0.6:5432 check port 8008 server postgres-2 52.1.0.7:5432 check port 8008 server postgres-3 52.1.0.8:5432 check port 8008 backend postgres_replica_backend option httpchk GET /replica http-check expect status 200 default-server inter 3s fall 3 rise 2 on-marked-down shutdown-sessions server postgres-1 52.1.0.6:5432 check port 8008 server postgres-2 52.1.0.7:5432 check port 8008 server postgres-3 52.1.0.8:5432 check port 8008 frontend redis_master_frontend bind *:6379 default_backend redis_master_backend backend redis_master_backend option tcp-check tcp-check send AUTH\ 123456\r\n tcp-check expect string +OK tcp-check send PING\r\n tcp-check expect string +PONG tcp-check send info\ replication\r\n tcp-check expect string role:master tcp-check send QUIT\r\n tcp-check expect string +OK server redis-1 52.1.0.9:6379 check inter 1s server redis-2 52.1.0.10:6379 check inter 1s server redis-3 52.1.0.11:6379 check inter 1s frontend infisical_frontend bind *:80 default_backend infisical_backend backend infisical_backend option httpchk GET /api/status http-check expect status 200 server infisical-1 52.1.0.15:8080 check inter 1s server infisical-2 52.1.0.16:8080 check inter 1s server infisical-3 52.1.0.17:8080 check inter 1s ``` ### 5. Deploy Infisical Core First, add the Infisical repository: ```bash theme={"dark"} curl -1sLf \ 'https://dl.cloudsmith.io/public/infisical/infisical-core/setup.deb.sh' \ | sudo -E bash ``` Then install Infisical: ```bash theme={"dark"} sudo apt-get update && sudo apt-get install -y infisical-core ``` For production environments, we strongly recommend installing a specific version of the package to maintain consistency across reinstalls. View available versions at [Infisical Package Versions](https://cloudsmith.io/~infisical/repos/infisical-core/packages/). First, add the Infisical repository: ```bash theme={"dark"} curl -1sLf \ 'https://dl.cloudsmith.io/public/infisical/infisical-core/setup.rpm.sh' \ | sudo -E bash ``` Then install Infisical: ```bash theme={"dark"} sudo yum install infisical-core ``` For production environments, we strongly recommend installing a specific version of the package to maintain consistency across reinstalls. View available versions at [Infisical Package Versions](https://cloudsmith.io/~infisical/repos/infisical-core/packages/). Next, create configuration file `/etc/infisical/infisical.rb` with the following: ```ruby theme={"dark"} infisical_core['ENCRYPTION_KEY'] = 'your-secure-encryption-key' infisical_core['AUTH_SECRET'] = 'your-secure-auth-secret' infisical_core['DB_CONNECTION_URI'] = 'postgres://user:pass@52.1.0.2:5000/infisical' infisical_core['REDIS_URL'] = 'redis://52.1.0.2:6379' infisical_core['PORT'] = 8080 ``` To generate `ENCRYPTION_KEY` and `AUTH_SECRET` view the [following configurations documentation here](/self-hosting/configuration/envars). If you are using managed services for either Postgres or Redis, please replace the values of the secrets accordingly. Lastly, start and verify each node running infisical-core: ```bash theme={"dark"} sudo infisical-ctl reconfigure sudo infisical-ctl status ``` ## Monitoring and Maintenance 1. Monitor HAProxy stats: `http://52.1.0.2:7000/haproxy?stats` 2. Monitor Infisical logs: `sudo infisical-ctl tail` 3. Check cluster health: * Etcd: `etcdctl cluster-health` * PostgreSQL: `patronictl list` * Redis: `redis-cli info replication` --- # Source: https://infisical.com/docs/self-hosting/deployment-options/linux-upgrade.md > ## Documentation Index > Fetch the complete documentation index at: https://infisical.com/docs/llms.txt > Use this file to discover all available pages before exploring further. # Upgrading > How to upgrade Infisical deployment using linux package This guide explains how to upgrade Infisical Linux package installations to newer versions. The Infisical Linux package includes only the Infisical service component itself, as PostgreSQL and Redis databases are managed separately. Upgrades for PostgreSQL and Redis are not covered in this guide as they depend on your specific database deployment method. ## Upgrade Options There are two primary methods to upgrade Infisical: 1. **Standard Upgrade (with brief downtime)**: The simplest approach that briefly takes Infisical offline during the upgrade. 2. **Minimal-Downtime Upgrade**: For multi-node deployments where high availability is required. ## Before You Begin ### Checking Your Current Version Before upgrading, note your current Infisical version: ```bash theme={"dark"} cat /opt/infisical-core/version-manifest.txt ``` Look for `infisical` component. This will be the version of Infisical currently installed. ### Prerequisites * Verify that your PostgreSQL and Redis instances are up and running * Back up your PostgreSQL database before proceeding with any upgrade * Review release notes for the version you're upgrading to ### Creating a Database Backup We strongly recommend backing up your database before upgrading. Your backup approach may look different depending on how you configured PostgreSQL and whether it's self-managed or using a managed service. Here is a sample of how you would perform a manual backup: ```bash theme={"dark"} # Example PostgreSQL backup command (adjust parameters as needed) pg_dump -U -h -d > infisical_backup.sql ``` ### Database Migrations During Upgrade By default, Infisical runs database migrations automatically on startup. * It uses database locks to ensure only one instance runs migrations at a time * Other instances will wait for the lock to be released before continuing startup * This prevents race conditions and database conflicts ## Standard Upgrade (with Downtime) This method is suitable for single-node deployments or situations where a brief downtime is acceptable. ```bash theme={"dark"} infisical-ctl stop ``` To upgrade to the latest version: ```bash theme={"dark"} sudo apt-get update && sudo apt-get install -y infisical-core ``` ```bash theme={"dark"} sudo yum update infisical-core ``` To upgrade to a specific version: ```bash theme={"dark"} sudo apt-get install -y infisical-core= ``` ```bash theme={"dark"} sudo yum install infisical-core- ``` ```bash theme={"dark"} infisical-ctl reconfigure ``` ```bash theme={"dark"} infisical-ctl start ``` ```bash theme={"dark"} infisical-ctl status ``` Check the logs for any issues: ```bash theme={"dark"} infisical-ctl tail ``` ## Minimal-Downtime Upgrade For multi-node setups where you need to maintain availability during upgrades, follow this procedure. This approach requires at least two Infisical nodes behind a load balancer. ### Understanding Traffic Draining "Draining" a server means gracefully removing it from the pool of active servers without disrupting existing connections. When you drain a server: 1. The load balancer stops sending new requests to the server 2. Existing connections are allowed to complete naturally 3. Once all connections finish, the server can be safely taken offline for maintenance This approach ensures users/machines do not experience sudden connection errors during the upgrade process. ### Preparing for the Upgrade 1. **Designate a deploy node**: Choose any single node that will run migrations. This node will be upgraded first. 2. **Configure your load balancer**: Ensure your load balancer can perform health checks against Infisical's `api/status` endpoint. ### Upgrade Process #### On the deploy node: Drain the traffic on this node gracefully. You can do this in a number of ways depending on the load balancer you have configured. Approaches for some common load balancers are provided below: If using NGINX as a load balancer, you can remove the server from the upstream pool temporarily: ```bash theme={"dark"} # Edit your NGINX configuration to comment out or remove the server sudo nano /path/to/your/nginx-config.conf # Reload NGINX to apply changes sudo nginx -s reload ``` If using HAProxy, you can put the server in maintenance mode: ```bash theme={"dark"} # Using the HAProxy socket command echo "disable server infisical_backend/infisical-node1" | socat stdio /var/lib/haproxy/stats ``` Deregister the instance from the load balancer using the AWS console or CLI Follow your load balancer's documentation for instructions on draining procedure Verify no new traffic is arriving before proceeding with the upgrade. ```bash theme={"dark"} infisical-ctl stop ``` To upgrade to the latest version: ```bash theme={"dark"} sudo apt-get update && sudo apt-get install -y infisical-core ``` ```bash theme={"dark"} sudo yum update infisical-core ``` To upgrade to a specific version: ```bash theme={"dark"} sudo apt-get install -y infisical-core= ``` ```bash theme={"dark"} sudo yum install infisical-core- ``` ```bash theme={"dark"} infisical-ctl reconfigure ``` ```bash theme={"dark"} infisical-ctl tail ``` Look for successful migration messages in the logs. Re-enable the server in your load balancer using the same method you used to remove it. #### On all remaining nodes (one at a time): Follow the same draining procedure as described for the deploy node: * Remove the server from your load balancer's active pool * Wait for existing connections to complete * Verify the node is no longer receiving traffic ```bash theme={"dark"} infisical-ctl stop ``` To upgrade to the latest version: ```bash theme={"dark"} sudo apt-get update && sudo apt-get install -y infisical-core ``` ```bash theme={"dark"} sudo yum update infisical-core ``` To upgrade to a specific version: ```bash theme={"dark"} sudo apt-get install -y infisical-core= ``` ```bash theme={"dark"} sudo yum install infisical-core- ``` ```bash theme={"dark"} infisical-ctl reconfigure ``` ```bash theme={"dark"} infisical-ctl status infisical-ctl tail ``` * Check logs to ensure the service has started successfully * Verify it can connect to the database and Redis Re-enable the server in your load balancer using the same method you used to remove it. Check logs and monitoring to ensure traffic is flowing correctly. Repeat steps 1-7 for each remaining node, one at a time. After all nodes are upgraded, verify that the application is functioning correctly: * Test core functionality * Check logs for any errors ## Rolling Back If you need to roll back to a previous version of Infisical, follow steps below. ```bash theme={"dark"} infisical-ctl stop ``` For Debian/Ubuntu: ```bash theme={"dark"} sudo apt-get install -y infisical-core= ``` For RHEL/CentOS/Amazon Linux: ```bash theme={"dark"} sudo yum downgrade infisical-core- ``` Restore your Postgres/Redis database from backup. ```bash theme={"dark"} infisical-ctl reconfigure ``` ```bash theme={"dark"} infisical-ctl status ``` ## Troubleshooting If you encounter database migration issues: 1. Check the logs: ```bash theme={"dark"} infisical-ctl tail ``` 2. Ensure the database user has sufficient privileges to create/modify tables. 3. If migrations fail repeatedly, consider restoring from the backup you took prior to upgrading. 1. Check for configuration errors: ```bash theme={"dark"} infisical-ctl tail infisical-ctl status ``` 2. Verify all required environment variables are set in your `/etc/infisical/infisical.rb` file. --- # Source: https://infisical.com/docs/api-reference/endpoints/integrations/list-auth.md # List Auth > List integration auth objects for a workspace. ## OpenAPI ````yaml GET /api/v1/workspace/{workspaceId}/authorizations paths: path: /api/v1/workspace/{workspaceId}/authorizations method: get servers: - url: https://us.infisical.com description: Production server (US) - url: https://eu.infisical.com description: Production server (EU) - url: http://localhost:8080 description: Local server request: security: - title: bearerAuth parameters: query: {} header: Authorization: type: http scheme: bearer description: An access token in Infisical cookie: {} parameters: path: workspaceId: schema: - type: string required: true description: The ID of the project to list integration auths for. query: {} header: {} cookie: {} body: {} response: '200': application/json: schemaArray: - type: object properties: authorizations: allOf: - type: array items: type: object properties: id: type: string format: uuid projectId: type: string integration: type: string teamId: type: string nullable: true url: type: string nullable: true namespace: type: string nullable: true accountId: type: string nullable: true metadata: nullable: true createdAt: type: string format: date-time updatedAt: type: string format: date-time required: - id - projectId - integration - createdAt - updatedAt additionalProperties: false requiredProperties: - authorizations additionalProperties: false examples: example: value: authorizations: - id: 3c90c3cc-0d44-4b50-8888-8dd25736052a projectId: integration: teamId: url: namespace: accountId: metadata: createdAt: '2023-11-07T05:31:56Z' updatedAt: '2023-11-07T05:31:56Z' description: Default Response '400': application/json: schemaArray: - type: object properties: reqId: allOf: - type: string statusCode: allOf: - type: number enum: - 400 message: allOf: - type: string error: allOf: - type: string requiredProperties: - reqId - statusCode - message - error additionalProperties: false examples: example: value: reqId: statusCode: 400 message: error: description: Default Response '401': application/json: schemaArray: - type: object properties: reqId: allOf: - type: string statusCode: allOf: - type: number enum: - 401 message: allOf: - type: string error: allOf: - type: string requiredProperties: - reqId - statusCode - message - error additionalProperties: false examples: example: value: reqId: statusCode: 401 message: error: description: Default Response '403': application/json: schemaArray: - type: object properties: reqId: allOf: - type: string statusCode: allOf: - type: number enum: - 403 message: allOf: - type: string details: allOf: - {} error: allOf: - type: string requiredProperties: - reqId - statusCode - message - error additionalProperties: false examples: example: value: reqId: statusCode: 403 message: details: error: description: Default Response '404': application/json: schemaArray: - type: object properties: reqId: allOf: - type: string statusCode: allOf: - type: number enum: - 404 message: allOf: - type: string error: allOf: - type: string requiredProperties: - reqId - statusCode - message - error additionalProperties: false examples: example: value: reqId: statusCode: 404 message: error: description: Default Response '422': application/json: schemaArray: - type: object properties: reqId: allOf: - type: string statusCode: allOf: - type: number enum: - 422 message: allOf: - {} error: allOf: - type: string requiredProperties: - reqId - statusCode - error additionalProperties: false examples: example: value: reqId: statusCode: 422 message: error: description: Default Response '500': application/json: schemaArray: - type: object properties: reqId: allOf: - type: string statusCode: allOf: - type: number enum: - 500 message: allOf: - type: string error: allOf: - type: string requiredProperties: - reqId - statusCode - message - error additionalProperties: false examples: example: value: reqId: statusCode: 500 message: error: description: Default Response deprecated: false type: path components: schemas: {} ```` --- # Source: https://infisical.com/docs/api-reference/endpoints/certificate-authorities/internal/list-ca-certs.md > ## Documentation Index > Fetch the complete documentation index at: https://infisical.com/docs/llms.txt > Use this file to discover all available pages before exploring further. # List CA certificates > Get list of past and current CA certificates for a CA ## OpenAPI ````yaml GET /api/v1/cert-manager/ca/internal/{caId}/ca-certificates openapi: 3.0.3 info: title: Infisical API description: List of all available APIs that can be consumed version: 0.0.1 servers: - url: https://us.infisical.com description: Production server (US) - url: https://eu.infisical.com description: Production server (EU) - url: http://localhost:8080 description: Local server security: [] paths: /api/v1/cert-manager/ca/internal/{caId}/ca-certificates: get: tags: - PKI Certificate Authorities description: Get list of past and current CA certificates for a CA operationId: getCaCertificates parameters: - schema: type: string in: path name: caId required: true description: The ID of the CA to get the CA certificates for. responses: '200': description: Default Response content: application/json: schema: type: array items: type: object properties: certificate: type: string description: The certificate body of the CA certificate. certificateChain: type: string description: The certificate chain of the CA certificate. serialNumber: type: string description: The serial number of the CA certificate. certId: type: string description: Certificate ID version: type: number description: >- The version of the CA certificate. The version is incremented for each CA renewal operation. required: - certificate - certificateChain - serialNumber - certId - version additionalProperties: false '400': description: Default Response content: application/json: schema: type: object properties: reqId: type: string statusCode: type: number enum: - 400 message: type: string error: type: string details: {} required: - reqId - statusCode - message - error additionalProperties: false '401': description: Default Response content: application/json: schema: type: object properties: reqId: type: string statusCode: type: number enum: - 401 message: type: string error: type: string required: - reqId - statusCode - message - error additionalProperties: false '403': description: Default Response content: application/json: schema: type: object properties: reqId: type: string statusCode: type: number enum: - 403 message: type: string details: {} error: type: string required: - reqId - statusCode - message - error additionalProperties: false '404': description: Default Response content: application/json: schema: type: object properties: reqId: type: string statusCode: type: number enum: - 404 message: type: string error: type: string required: - reqId - statusCode - message - error additionalProperties: false '422': description: Default Response content: application/json: schema: type: object properties: reqId: type: string statusCode: type: number enum: - 422 message: {} error: type: string required: - reqId - statusCode - error additionalProperties: false '500': description: Default Response content: application/json: schema: type: object properties: reqId: type: string statusCode: type: number enum: - 500 message: type: string error: type: string required: - reqId - statusCode - message - error additionalProperties: false ```` --- # Source: https://infisical.com/docs/api-reference/endpoints/ssh/ca/list-certificate-templates.md # List templates > Get list of certificate templates for the SSH CA ## OpenAPI ````yaml GET /api/v1/ssh/ca/{sshCaId}/certificate-templates paths: path: /api/v1/ssh/ca/{sshCaId}/certificate-templates method: get servers: - url: https://us.infisical.com description: Production server (US) - url: https://eu.infisical.com description: Production server (EU) - url: http://localhost:8080 description: Local server request: security: [] parameters: path: sshCaId: schema: - type: string required: true description: The ID of the SSH CA to get the certificate templates for. query: {} header: {} cookie: {} body: {} response: '200': application/json: schemaArray: - type: object properties: certificateTemplates: allOf: - type: array items: type: object properties: id: type: string format: uuid sshCaId: type: string format: uuid status: type: string name: type: string ttl: type: string maxTTL: type: string allowedUsers: type: array items: type: string allowedHosts: type: array items: type: string allowCustomKeyIds: type: boolean allowUserCertificates: type: boolean allowHostCertificates: type: boolean required: - id - sshCaId - status - name - ttl - maxTTL - allowedUsers - allowedHosts - allowCustomKeyIds - allowUserCertificates - allowHostCertificates additionalProperties: false requiredProperties: - certificateTemplates additionalProperties: false examples: example: value: certificateTemplates: - id: 3c90c3cc-0d44-4b50-8888-8dd25736052a sshCaId: 3c90c3cc-0d44-4b50-8888-8dd25736052a status: name: ttl: maxTTL: allowedUsers: - allowedHosts: - allowCustomKeyIds: true allowUserCertificates: true allowHostCertificates: true description: Default Response '400': application/json: schemaArray: - type: object properties: reqId: allOf: - type: string statusCode: allOf: - type: number enum: - 400 message: allOf: - type: string error: allOf: - type: string requiredProperties: - reqId - statusCode - message - error additionalProperties: false examples: example: value: reqId: statusCode: 400 message: error: description: Default Response '401': application/json: schemaArray: - type: object properties: reqId: allOf: - type: string statusCode: allOf: - type: number enum: - 401 message: allOf: - type: string error: allOf: - type: string requiredProperties: - reqId - statusCode - message - error additionalProperties: false examples: example: value: reqId: statusCode: 401 message: error: description: Default Response '403': application/json: schemaArray: - type: object properties: reqId: allOf: - type: string statusCode: allOf: - type: number enum: - 403 message: allOf: - type: string details: allOf: - {} error: allOf: - type: string requiredProperties: - reqId - statusCode - message - error additionalProperties: false examples: example: value: reqId: statusCode: 403 message: details: error: description: Default Response '404': application/json: schemaArray: - type: object properties: reqId: allOf: - type: string statusCode: allOf: - type: number enum: - 404 message: allOf: - type: string error: allOf: - type: string requiredProperties: - reqId - statusCode - message - error additionalProperties: false examples: example: value: reqId: statusCode: 404 message: error: description: Default Response '422': application/json: schemaArray: - type: object properties: reqId: allOf: - type: string statusCode: allOf: - type: number enum: - 422 message: allOf: - {} error: allOf: - type: string requiredProperties: - reqId - statusCode - error additionalProperties: false examples: example: value: reqId: statusCode: 422 message: error: description: Default Response '500': application/json: schemaArray: - type: object properties: reqId: allOf: - type: string statusCode: allOf: - type: number enum: - 500 message: allOf: - type: string error: allOf: - type: string requiredProperties: - reqId - statusCode - message - error additionalProperties: false examples: example: value: reqId: statusCode: 500 message: error: description: Default Response deprecated: false type: path components: schemas: {} ```` --- # Source: https://infisical.com/docs/api-reference/endpoints/pki/syncs/list-certificates.md # Source: https://infisical.com/docs/api-reference/endpoints/certificate-profiles/list-certificates.md > ## Documentation Index > Fetch the complete documentation index at: https://infisical.com/docs/llms.txt > Use this file to discover all available pages before exploring further. # List Certificates ## OpenAPI ````yaml GET /api/v1/cert-manager/certificate-profiles/{id}/certificates openapi: 3.0.3 info: title: Infisical API description: List of all available APIs that can be consumed version: 0.0.1 servers: - url: https://us.infisical.com description: Production server (US) - url: https://eu.infisical.com description: Production server (EU) - url: http://localhost:8080 description: Local server security: [] paths: /api/v1/cert-manager/certificate-profiles/{id}/certificates: get: tags: - PKI Certificate Profiles operationId: listCertificateProfileCertificates parameters: - schema: type: number minimum: 0 default: 0 in: query name: offset required: false - schema: type: number minimum: 1 maximum: 100 default: 20 in: query name: limit required: false - schema: type: string enum: - active - expired - revoked in: query name: status required: false - schema: type: string in: query name: search required: false - schema: type: string format: uuid in: path name: id required: true responses: '200': description: Default Response content: application/json: schema: type: object properties: certificates: type: array items: type: object properties: id: type: string serialNumber: type: string cn: type: string status: type: string notBefore: type: string format: date-time notAfter: type: string format: date-time revokedAt: type: string format: date-time nullable: true createdAt: type: string format: date-time required: - id - serialNumber - cn - status - notBefore - notAfter - createdAt additionalProperties: false required: - certificates additionalProperties: false '400': description: Default Response content: application/json: schema: type: object properties: reqId: type: string statusCode: type: number enum: - 400 message: type: string error: type: string details: {} required: - reqId - statusCode - message - error additionalProperties: false '401': description: Default Response content: application/json: schema: type: object properties: reqId: type: string statusCode: type: number enum: - 401 message: type: string error: type: string required: - reqId - statusCode - message - error additionalProperties: false '403': description: Default Response content: application/json: schema: type: object properties: reqId: type: string statusCode: type: number enum: - 403 message: type: string details: {} error: type: string required: - reqId - statusCode - message - error additionalProperties: false '404': description: Default Response content: application/json: schema: type: object properties: reqId: type: string statusCode: type: number enum: - 404 message: type: string error: type: string required: - reqId - statusCode - message - error additionalProperties: false '422': description: Default Response content: application/json: schema: type: object properties: reqId: type: string statusCode: type: number enum: - 422 message: {} error: type: string required: - reqId - statusCode - error additionalProperties: false '500': description: Default Response content: application/json: schema: type: object properties: reqId: type: string statusCode: type: number enum: - 500 message: type: string error: type: string required: - reqId - statusCode - message - error additionalProperties: false ```` --- # Source: https://infisical.com/docs/api-reference/endpoints/universal-auth/list-client-secrets.md > ## Documentation Index > Fetch the complete documentation index at: https://infisical.com/docs/llms.txt > Use this file to discover all available pages before exploring further. # List Client Secrets > List Universal Auth Client Secrets for machine identity ## OpenAPI ````yaml GET /api/v1/auth/universal-auth/identities/{identityId}/client-secrets openapi: 3.0.3 info: title: Infisical API description: List of all available APIs that can be consumed version: 0.0.1 servers: - url: https://us.infisical.com description: Production server (US) - url: https://eu.infisical.com description: Production server (EU) - url: http://localhost:8080 description: Local server security: [] paths: /api/v1/auth/universal-auth/identities/{identityId}/client-secrets: get: tags: - Universal Auth description: List Universal Auth Client Secrets for machine identity operationId: listUniversalAuthClientSecrets parameters: - schema: type: string in: path name: identityId required: true description: The ID of the machine identity to list client secrets for. responses: '200': description: Default Response content: application/json: schema: type: object properties: clientSecretData: type: array items: type: object properties: id: type: string createdAt: type: string format: date-time updatedAt: type: string format: date-time description: type: string clientSecretPrefix: type: string clientSecretNumUses: type: number default: 0 clientSecretNumUsesLimit: type: number default: 0 clientSecretTTL: type: number default: 0 identityUAId: type: string format: uuid isClientSecretRevoked: type: boolean default: false required: - id - createdAt - updatedAt - description - clientSecretPrefix - identityUAId additionalProperties: false required: - clientSecretData additionalProperties: false '400': description: Default Response content: application/json: schema: type: object properties: reqId: type: string statusCode: type: number enum: - 400 message: type: string error: type: string details: {} required: - reqId - statusCode - message - error additionalProperties: false '401': description: Default Response content: application/json: schema: type: object properties: reqId: type: string statusCode: type: number enum: - 401 message: type: string error: type: string required: - reqId - statusCode - message - error additionalProperties: false '403': description: Default Response content: application/json: schema: type: object properties: reqId: type: string statusCode: type: number enum: - 403 message: type: string details: {} error: type: string required: - reqId - statusCode - message - error additionalProperties: false '404': description: Default Response content: application/json: schema: type: object properties: reqId: type: string statusCode: type: number enum: - 404 message: type: string error: type: string required: - reqId - statusCode - message - error additionalProperties: false '422': description: Default Response content: application/json: schema: type: object properties: reqId: type: string statusCode: type: number enum: - 422 message: {} error: type: string required: - reqId - statusCode - error additionalProperties: false '500': description: Default Response content: application/json: schema: type: object properties: reqId: type: string statusCode: type: number enum: - 500 message: type: string error: type: string required: - reqId - statusCode - message - error additionalProperties: false security: - bearerAuth: [] components: securitySchemes: bearerAuth: type: http scheme: bearer bearerFormat: JWT description: An access token in Infisical ```` --- # Source: https://infisical.com/docs/api-reference/endpoints/groups/list-group-machine-identities.md > ## Documentation Index > Fetch the complete documentation index at: https://infisical.com/docs/llms.txt > Use this file to discover all available pages before exploring further. # List Group Machine Identities ## OpenAPI ````yaml GET /api/v1/groups/{id}/machine-identities openapi: 3.0.3 info: title: Infisical API description: List of all available APIs that can be consumed version: 0.0.1 servers: - url: https://us.infisical.com description: Production server (US) - url: https://eu.infisical.com description: Production server (EU) - url: http://localhost:8080 description: Local server security: [] paths: /api/v1/groups/{id}/machine-identities: get: tags: - Groups operationId: listGroupMachineIdentities parameters: - schema: type: number minimum: 0 default: 0 in: query name: offset required: false description: >- The offset to start from. If you enter 10, it will start from the 10th identity. - schema: type: number minimum: 1 maximum: 100 default: 10 in: query name: limit required: false description: The number of identities to return. - schema: type: string in: query name: search required: false description: The text string that machine identity name will be filtered by. - schema: type: string enum: - assignedMachineIdentities - nonAssignedMachineIdentities in: query name: filter required: false description: >- Whether to filter the list of returned identities. 'assignedMachineIdentities' will only return identities assigned to the group, 'nonAssignedMachineIdentities' will only return identities not assigned to the group, undefined will return all identities in the organization. - schema: type: string in: path name: id required: true description: The ID of the group to list identities for. responses: '200': description: Default Response content: application/json: schema: type: object properties: machineIdentities: type: array items: type: object properties: id: type: string format: uuid name: type: string isPartOfGroup: type: boolean joinedGroupAt: type: string format: date-time nullable: true required: - id - name - isPartOfGroup - joinedGroupAt additionalProperties: false totalCount: type: number required: - machineIdentities - totalCount additionalProperties: false '400': description: Default Response content: application/json: schema: type: object properties: reqId: type: string statusCode: type: number enum: - 400 message: type: string error: type: string details: {} required: - reqId - statusCode - message - error additionalProperties: false '401': description: Default Response content: application/json: schema: type: object properties: reqId: type: string statusCode: type: number enum: - 401 message: type: string error: type: string required: - reqId - statusCode - message - error additionalProperties: false '403': description: Default Response content: application/json: schema: type: object properties: reqId: type: string statusCode: type: number enum: - 403 message: type: string details: {} error: type: string required: - reqId - statusCode - message - error additionalProperties: false '404': description: Default Response content: application/json: schema: type: object properties: reqId: type: string statusCode: type: number enum: - 404 message: type: string error: type: string required: - reqId - statusCode - message - error additionalProperties: false '422': description: Default Response content: application/json: schema: type: object properties: reqId: type: string statusCode: type: number enum: - 422 message: {} error: type: string required: - reqId - statusCode - error additionalProperties: false '500': description: Default Response content: application/json: schema: type: object properties: reqId: type: string statusCode: type: number enum: - 500 message: type: string error: type: string required: - reqId - statusCode - message - error additionalProperties: false ```` --- # Source: https://infisical.com/docs/api-reference/endpoints/groups/list-group-members.md > ## Documentation Index > Fetch the complete documentation index at: https://infisical.com/docs/llms.txt > Use this file to discover all available pages before exploring further. # List Group Members ## OpenAPI ````yaml GET /api/v1/groups/{id}/members openapi: 3.0.3 info: title: Infisical API description: List of all available APIs that can be consumed version: 0.0.1 servers: - url: https://us.infisical.com description: Production server (US) - url: https://eu.infisical.com description: Production server (EU) - url: http://localhost:8080 description: Local server security: [] paths: /api/v1/groups/{id}/members: get: tags: - Groups operationId: listGroupMembers parameters: - schema: type: number minimum: 0 default: 0 in: query name: offset required: false description: >- The offset to start from. If you enter 10, it will start from the 10th member. - schema: type: number minimum: 1 maximum: 100 default: 10 in: query name: limit required: false description: The number of members to return. - schema: type: string in: query name: search required: false description: >- The text string that member email(in case of users) or name(in case of machine identities) will be filtered by. - schema: type: string enum: - name default: name in: query name: orderBy required: false description: The column to order members by. - schema: type: string enum: - asc - desc in: query name: orderDirection required: false description: The direction to order members in. - schema: anyOf: - type: string enum: - users - machineIdentities - type: array items: type: string enum: - users - machineIdentities in: query name: memberTypeFilter required: false description: >- Filter members by type. Can be a single value ('users' or 'machineIdentities') or an array of values. If not specified, both users and machine identities will be returned. - schema: type: string in: path name: id required: true description: The ID of the group to list members for. responses: '200': description: Default Response content: application/json: schema: type: object properties: members: type: array items: anyOf: - type: object properties: id: type: string joinedGroupAt: type: string format: date-time nullable: true type: type: string enum: - user user: type: object properties: id: type: string format: uuid firstName: type: string nullable: true lastName: type: string nullable: true email: type: string nullable: true username: type: string required: - id - username additionalProperties: false required: - id - joinedGroupAt - type - user additionalProperties: false - type: object properties: id: type: string joinedGroupAt: type: string format: date-time nullable: true type: type: string enum: - machineIdentity machineIdentity: type: object properties: id: type: string format: uuid name: type: string required: - id - name additionalProperties: false required: - id - joinedGroupAt - type - machineIdentity additionalProperties: false totalCount: type: number required: - members - totalCount additionalProperties: false '400': description: Default Response content: application/json: schema: type: object properties: reqId: type: string statusCode: type: number enum: - 400 message: type: string error: type: string details: {} required: - reqId - statusCode - message - error additionalProperties: false '401': description: Default Response content: application/json: schema: type: object properties: reqId: type: string statusCode: type: number enum: - 401 message: type: string error: type: string required: - reqId - statusCode - message - error additionalProperties: false '403': description: Default Response content: application/json: schema: type: object properties: reqId: type: string statusCode: type: number enum: - 403 message: type: string details: {} error: type: string required: - reqId - statusCode - message - error additionalProperties: false '404': description: Default Response content: application/json: schema: type: object properties: reqId: type: string statusCode: type: number enum: - 404 message: type: string error: type: string required: - reqId - statusCode - message - error additionalProperties: false '422': description: Default Response content: application/json: schema: type: object properties: reqId: type: string statusCode: type: number enum: - 422 message: {} error: type: string required: - reqId - statusCode - error additionalProperties: false '500': description: Default Response content: application/json: schema: type: object properties: reqId: type: string statusCode: type: number enum: - 500 message: type: string error: type: string required: - reqId - statusCode - message - error additionalProperties: false ```` --- # Source: https://infisical.com/docs/api-reference/endpoints/groups/list-group-projects.md > ## Documentation Index > Fetch the complete documentation index at: https://infisical.com/docs/llms.txt > Use this file to discover all available pages before exploring further. # List Group Projects ## OpenAPI ````yaml GET /api/v1/groups/{id}/projects openapi: 3.0.3 info: title: Infisical API description: List of all available APIs that can be consumed version: 0.0.1 servers: - url: https://us.infisical.com description: Production server (US) - url: https://eu.infisical.com description: Production server (EU) - url: http://localhost:8080 description: Local server security: [] paths: /api/v1/groups/{id}/projects: get: tags: - Groups operationId: listGroupProjects parameters: - schema: type: number minimum: 0 default: 0 in: query name: offset required: false description: >- The offset to start from. If you enter 10, it will start from the 10th project. - schema: type: number minimum: 1 maximum: 100 default: 10 in: query name: limit required: false description: The number of projects to return. - schema: type: string in: query name: search required: false description: The text string that project name or slug will be filtered by. - schema: type: string enum: - assignedProjects - unassignedProjects in: query name: filter required: false description: >- Whether to filter the list of returned projects. 'assignedProjects' will only return projects assigned to the group, 'unassignedProjects' will only return projects not assigned to the group, undefined will return all projects in the organization. - schema: type: string enum: - name default: name in: query name: orderBy required: false description: The column to order projects by. - schema: type: string enum: - asc - desc default: asc in: query name: orderDirection required: false description: The direction to order projects in. - schema: type: string in: path name: id required: true description: The ID of the group to list projects for. responses: '200': description: Default Response content: application/json: schema: type: object properties: projects: type: array items: type: object properties: id: type: string name: type: string slug: type: string description: type: string nullable: true type: type: string joinedGroupAt: type: string format: date-time nullable: true required: - id - name - slug - type - joinedGroupAt additionalProperties: false totalCount: type: number required: - projects - totalCount additionalProperties: false '400': description: Default Response content: application/json: schema: type: object properties: reqId: type: string statusCode: type: number enum: - 400 message: type: string error: type: string details: {} required: - reqId - statusCode - message - error additionalProperties: false '401': description: Default Response content: application/json: schema: type: object properties: reqId: type: string statusCode: type: number enum: - 401 message: type: string error: type: string required: - reqId - statusCode - message - error additionalProperties: false '403': description: Default Response content: application/json: schema: type: object properties: reqId: type: string statusCode: type: number enum: - 403 message: type: string details: {} error: type: string required: - reqId - statusCode - message - error additionalProperties: false '404': description: Default Response content: application/json: schema: type: object properties: reqId: type: string statusCode: type: number enum: - 404 message: type: string error: type: string required: - reqId - statusCode - message - error additionalProperties: false '422': description: Default Response content: application/json: schema: type: object properties: reqId: type: string statusCode: type: number enum: - 422 message: {} error: type: string required: - reqId - statusCode - error additionalProperties: false '500': description: Default Response content: application/json: schema: type: object properties: reqId: type: string statusCode: type: number enum: - 500 message: type: string error: type: string required: - reqId - statusCode - message - error additionalProperties: false ```` --- # Source: https://infisical.com/docs/api-reference/endpoints/groups/list-group-users.md > ## Documentation Index > Fetch the complete documentation index at: https://infisical.com/docs/llms.txt > Use this file to discover all available pages before exploring further. # List Group Users ## OpenAPI ````yaml GET /api/v1/groups/{id}/users openapi: 3.0.3 info: title: Infisical API description: List of all available APIs that can be consumed version: 0.0.1 servers: - url: https://us.infisical.com description: Production server (US) - url: https://eu.infisical.com description: Production server (EU) - url: http://localhost:8080 description: Local server security: [] paths: /api/v1/groups/{id}/users: get: tags: - Groups operationId: listGroupUsers parameters: - schema: type: number minimum: 0 default: 0 in: query name: offset required: false description: >- The offset to start from. If you enter 10, it will start from the 10th user. - schema: type: number minimum: 1 maximum: 100 default: 10 in: query name: limit required: false description: The number of users to return. - schema: type: string in: query name: username required: false description: The username to search for. - schema: type: string in: query name: search required: false description: The text string that user email or name will be filtered by. - schema: type: string enum: - existingMembers - nonMembers in: query name: filter required: false description: >- Whether to filter the list of returned users. 'existingMembers' will only return existing users in the group, 'nonMembers' will only return users not in the group, undefined will return all users in the organization. - schema: type: string in: path name: id required: true description: The ID of the group to list users for. responses: '200': description: Default Response content: application/json: schema: type: object properties: users: type: array items: type: object properties: email: type: string nullable: true username: type: string firstName: type: string nullable: true lastName: type: string nullable: true id: type: string format: uuid isPartOfGroup: type: boolean joinedGroupAt: type: string format: date-time nullable: true required: - username - id - isPartOfGroup - joinedGroupAt additionalProperties: false totalCount: type: number required: - users - totalCount additionalProperties: false '400': description: Default Response content: application/json: schema: type: object properties: reqId: type: string statusCode: type: number enum: - 400 message: type: string error: type: string details: {} required: - reqId - statusCode - message - error additionalProperties: false '401': description: Default Response content: application/json: schema: type: object properties: reqId: type: string statusCode: type: number enum: - 401 message: type: string error: type: string required: - reqId - statusCode - message - error additionalProperties: false '403': description: Default Response content: application/json: schema: type: object properties: reqId: type: string statusCode: type: number enum: - 403 message: type: string details: {} error: type: string required: - reqId - statusCode - message - error additionalProperties: false '404': description: Default Response content: application/json: schema: type: object properties: reqId: type: string statusCode: type: number enum: - 404 message: type: string error: type: string required: - reqId - statusCode - message - error additionalProperties: false '422': description: Default Response content: application/json: schema: type: object properties: reqId: type: string statusCode: type: number enum: - 422 message: {} error: type: string required: - reqId - statusCode - error additionalProperties: false '500': description: Default Response content: application/json: schema: type: object properties: reqId: type: string statusCode: type: number enum: - 500 message: type: string error: type: string required: - reqId - statusCode - message - error additionalProperties: false ```` --- # Source: https://infisical.com/docs/api-reference/endpoints/ssh/groups/list-hosts.md # List Hosts > Get SSH Hosts in a Host Group ## OpenAPI ````yaml GET /api/v1/ssh/host-groups/{sshHostGroupId}/hosts paths: path: /api/v1/ssh/host-groups/{sshHostGroupId}/hosts method: get servers: - url: https://us.infisical.com description: Production server (US) - url: https://eu.infisical.com description: Production server (EU) - url: http://localhost:8080 description: Local server request: security: [] parameters: path: sshHostGroupId: schema: - type: string required: true description: The ID of the SSH host group to get. query: filter: schema: - type: enum enum: - group-members - non-group-members required: false description: The filter to apply to the SSH hosts in the SSH host group. header: {} cookie: {} body: {} response: '200': application/json: schemaArray: - type: object properties: hosts: allOf: - type: array items: type: object properties: id: type: string format: uuid hostname: type: string alias: type: string nullable: true isPartOfGroup: type: boolean joinedGroupAt: type: string format: date-time nullable: true required: - id - hostname - isPartOfGroup - joinedGroupAt additionalProperties: false totalCount: allOf: - type: number requiredProperties: - hosts - totalCount additionalProperties: false examples: example: value: hosts: - id: 3c90c3cc-0d44-4b50-8888-8dd25736052a hostname: alias: isPartOfGroup: true joinedGroupAt: '2023-11-07T05:31:56Z' totalCount: 123 description: Default Response '400': application/json: schemaArray: - type: object properties: reqId: allOf: - type: string statusCode: allOf: - type: number enum: - 400 message: allOf: - type: string error: allOf: - type: string requiredProperties: - reqId - statusCode - message - error additionalProperties: false examples: example: value: reqId: statusCode: 400 message: error: description: Default Response '401': application/json: schemaArray: - type: object properties: reqId: allOf: - type: string statusCode: allOf: - type: number enum: - 401 message: allOf: - type: string error: allOf: - type: string requiredProperties: - reqId - statusCode - message - error additionalProperties: false examples: example: value: reqId: statusCode: 401 message: error: description: Default Response '403': application/json: schemaArray: - type: object properties: reqId: allOf: - type: string statusCode: allOf: - type: number enum: - 403 message: allOf: - type: string details: allOf: - {} error: allOf: - type: string requiredProperties: - reqId - statusCode - message - error additionalProperties: false examples: example: value: reqId: statusCode: 403 message: details: error: description: Default Response '404': application/json: schemaArray: - type: object properties: reqId: allOf: - type: string statusCode: allOf: - type: number enum: - 404 message: allOf: - type: string error: allOf: - type: string requiredProperties: - reqId - statusCode - message - error additionalProperties: false examples: example: value: reqId: statusCode: 404 message: error: description: Default Response '422': application/json: schemaArray: - type: object properties: reqId: allOf: - type: string statusCode: allOf: - type: number enum: - 422 message: allOf: - {} error: allOf: - type: string requiredProperties: - reqId - statusCode - error additionalProperties: false examples: example: value: reqId: statusCode: 422 message: error: description: Default Response '500': application/json: schemaArray: - type: object properties: reqId: allOf: - type: string statusCode: allOf: - type: number enum: - 500 message: allOf: - type: string error: allOf: - type: string requiredProperties: - reqId - statusCode - message - error additionalProperties: false examples: example: value: reqId: statusCode: 500 message: error: description: Default Response deprecated: false type: path components: schemas: {} ```` --- # Source: https://infisical.com/docs/api-reference/endpoints/project-identities-membership/list-identity-memberships.md # Source: https://infisical.com/docs/api-reference/endpoints/organizations/list-identity-memberships.md # Source: https://infisical.com/docs/api-reference/endpoints/deprecated/project-identities-v2/list-identity-memberships.md > ## Documentation Index > Fetch the complete documentation index at: https://infisical.com/docs/llms.txt > Use this file to discover all available pages before exploring further. # List Identity Memberships > Return project identity memberships ## OpenAPI ````yaml GET /api/v1/projects/{projectId}/identity-memberships openapi: 3.0.3 info: title: Infisical API description: List of all available APIs that can be consumed version: 0.0.1 servers: - url: https://us.infisical.com description: Production server (US) - url: https://eu.infisical.com description: Production server (EU) - url: http://localhost:8080 description: Local server security: [] paths: /api/v1/projects/{projectId}/identity-memberships: get: tags: - Project Identities description: Return project identity memberships parameters: - schema: type: number minimum: 0 default: 0 in: query name: offset required: false description: >- The offset to start from. If you enter 10, it will start from the 10th identity membership. - schema: type: number minimum: 1 maximum: 20000 default: 100 in: query name: limit required: false description: The number of identity memberships to return. - schema: type: string enum: - name default: name in: query name: orderBy required: false description: The column to order identity memberships by. - schema: type: string enum: - asc - desc default: asc in: query name: orderDirection required: false description: The direction identity memberships will be sorted in. - schema: type: string in: query name: search required: false description: The text string that identity membership names will be filtered by. - schema: type: string in: path name: projectId required: true description: The ID of the project to get identity memberships from. responses: '200': description: Default Response content: application/json: schema: type: object properties: identityMemberships: type: array items: type: object properties: id: type: string identityId: type: string createdAt: type: string format: date-time updatedAt: type: string format: date-time roles: type: array items: type: object properties: id: type: string role: type: string customRoleId: type: string nullable: true customRoleName: type: string nullable: true customRoleSlug: type: string nullable: true isTemporary: type: boolean temporaryMode: type: string nullable: true temporaryRange: type: string nullable: true temporaryAccessStartTime: type: string format: date-time nullable: true temporaryAccessEndTime: type: string format: date-time nullable: true required: - id - role - isTemporary additionalProperties: false identity: type: object properties: name: type: string id: type: string format: uuid projectId: type: string nullable: true orgId: type: string format: uuid authMethods: type: array items: type: string required: - name - id - orgId - authMethods additionalProperties: false project: type: object properties: name: type: string id: type: string required: - name - id additionalProperties: false required: - id - identityId - createdAt - updatedAt - roles - identity - project additionalProperties: false totalCount: type: number required: - identityMemberships - totalCount additionalProperties: false '400': description: Default Response content: application/json: schema: type: object properties: reqId: type: string statusCode: type: number enum: - 400 message: type: string error: type: string details: {} required: - reqId - statusCode - message - error additionalProperties: false '401': description: Default Response content: application/json: schema: type: object properties: reqId: type: string statusCode: type: number enum: - 401 message: type: string error: type: string required: - reqId - statusCode - message - error additionalProperties: false '403': description: Default Response content: application/json: schema: type: object properties: reqId: type: string statusCode: type: number enum: - 403 message: type: string details: {} error: type: string required: - reqId - statusCode - message - error additionalProperties: false '404': description: Default Response content: application/json: schema: type: object properties: reqId: type: string statusCode: type: number enum: - 404 message: type: string error: type: string required: - reqId - statusCode - message - error additionalProperties: false '422': description: Default Response content: application/json: schema: type: object properties: reqId: type: string statusCode: type: number enum: - 422 message: {} error: type: string required: - reqId - statusCode - error additionalProperties: false '500': description: Default Response content: application/json: schema: type: object properties: reqId: type: string statusCode: type: number enum: - 500 message: type: string error: type: string required: - reqId - statusCode - message - error additionalProperties: false security: - bearerAuth: [] components: securitySchemes: bearerAuth: type: http scheme: bearer bearerFormat: JWT description: An access token in Infisical ```` --- # Source: https://infisical.com/docs/api-reference/endpoints/project-identities/list-identity.md > ## Documentation Index > Fetch the complete documentation index at: https://infisical.com/docs/llms.txt > Use this file to discover all available pages before exploring further. # List Identities > List identities in a project ## OpenAPI ````yaml GET /api/v1/projects/{projectId}/identities openapi: 3.0.3 info: title: Infisical API description: List of all available APIs that can be consumed version: 0.0.1 servers: - url: https://us.infisical.com description: Production server (US) - url: https://eu.infisical.com description: Production server (EU) - url: http://localhost:8080 description: Local server security: [] paths: /api/v1/projects/{projectId}/identities: get: tags: - Identities description: List identities in a project operationId: listProjectMachineIdentities parameters: - schema: type: number minimum: 0 default: 0 in: query name: offset required: false description: >- The offset to start from. If you enter 10, it will start from the 10th identity. - schema: type: number minimum: 1 maximum: 1000 default: 20 in: query name: limit required: false description: The number of identities to return. - schema: type: string in: query name: search required: false description: The text string that identity names will be filtered by. - schema: type: string in: path name: projectId required: true description: The ID of the project responses: '200': description: Default Response content: application/json: schema: type: object properties: identities: type: array items: type: object properties: id: type: string format: uuid name: type: string orgId: type: string format: uuid projectId: type: string nullable: true createdAt: type: string format: date-time updatedAt: type: string format: date-time hasDeleteProtection: type: boolean default: false activeLockoutAuthMethods: type: array items: type: string authMethods: type: array items: type: string metadata: type: array items: type: object properties: key: type: string value: type: string id: type: string required: - key - value - id additionalProperties: false required: - id - name - orgId - createdAt - updatedAt additionalProperties: false totalCount: type: number required: - identities - totalCount additionalProperties: false '400': description: Default Response content: application/json: schema: type: object properties: reqId: type: string statusCode: type: number enum: - 400 message: type: string error: type: string details: {} required: - reqId - statusCode - message - error additionalProperties: false '401': description: Default Response content: application/json: schema: type: object properties: reqId: type: string statusCode: type: number enum: - 401 message: type: string error: type: string required: - reqId - statusCode - message - error additionalProperties: false '403': description: Default Response content: application/json: schema: type: object properties: reqId: type: string statusCode: type: number enum: - 403 message: type: string details: {} error: type: string required: - reqId - statusCode - message - error additionalProperties: false '404': description: Default Response content: application/json: schema: type: object properties: reqId: type: string statusCode: type: number enum: - 404 message: type: string error: type: string required: - reqId - statusCode - message - error additionalProperties: false '422': description: Default Response content: application/json: schema: type: object properties: reqId: type: string statusCode: type: number enum: - 422 message: {} error: type: string required: - reqId - statusCode - error additionalProperties: false '500': description: Default Response content: application/json: schema: type: object properties: reqId: type: string statusCode: type: number enum: - 500 message: type: string error: type: string required: - reqId - statusCode - message - error additionalProperties: false security: - bearerAuth: [] components: securitySchemes: bearerAuth: type: http scheme: bearer bearerFormat: JWT description: An access token in Infisical ```` --- # Source: https://infisical.com/docs/api-reference/endpoints/pki-collections/list-items.md # Retrieve > Get items in PKI collection ## OpenAPI ````yaml GET /api/v1/pki/collections/{collectionId}/items paths: path: /api/v1/pki/collections/{collectionId}/items method: get servers: - url: https://us.infisical.com description: Production server (US) - url: https://eu.infisical.com description: Production server (EU) - url: http://localhost:8080 description: Local server request: security: [] parameters: path: collectionId: schema: - type: string required: true description: The ID of the PKI collection to list items from. query: type: schema: - type: enum enum: - certificate - ca required: false description: The type of the PKI collection item to list. offset: schema: - type: number required: false description: The offset to start from. maximum: 100 minimum: 0 default: 0 limit: schema: - type: number required: false description: The number of items to return. maximum: 100 minimum: 1 default: 25 header: {} cookie: {} body: {} response: '200': application/json: schemaArray: - type: object properties: collectionItems: allOf: - type: array items: type: object properties: id: type: string format: uuid createdAt: type: string format: date-time updatedAt: type: string format: date-time pkiCollectionId: type: string format: uuid type: type: string enum: - certificate - ca itemId: type: string notBefore: type: string format: date-time notAfter: type: string format: date-time friendlyName: type: string required: - id - createdAt - updatedAt - pkiCollectionId - type - itemId - notBefore - notAfter - friendlyName additionalProperties: false totalCount: allOf: - type: number requiredProperties: - collectionItems - totalCount additionalProperties: false examples: example: value: collectionItems: - id: 3c90c3cc-0d44-4b50-8888-8dd25736052a createdAt: '2023-11-07T05:31:56Z' updatedAt: '2023-11-07T05:31:56Z' pkiCollectionId: 3c90c3cc-0d44-4b50-8888-8dd25736052a type: certificate itemId: notBefore: '2023-11-07T05:31:56Z' notAfter: '2023-11-07T05:31:56Z' friendlyName: totalCount: 123 description: Default Response '400': application/json: schemaArray: - type: object properties: reqId: allOf: - type: string statusCode: allOf: - type: number enum: - 400 message: allOf: - type: string error: allOf: - type: string requiredProperties: - reqId - statusCode - message - error additionalProperties: false examples: example: value: reqId: statusCode: 400 message: error: description: Default Response '401': application/json: schemaArray: - type: object properties: reqId: allOf: - type: string statusCode: allOf: - type: number enum: - 401 message: allOf: - type: string error: allOf: - type: string requiredProperties: - reqId - statusCode - message - error additionalProperties: false examples: example: value: reqId: statusCode: 401 message: error: description: Default Response '403': application/json: schemaArray: - type: object properties: reqId: allOf: - type: string statusCode: allOf: - type: number enum: - 403 message: allOf: - type: string details: allOf: - {} error: allOf: - type: string requiredProperties: - reqId - statusCode - message - error additionalProperties: false examples: example: value: reqId: statusCode: 403 message: details: error: description: Default Response '404': application/json: schemaArray: - type: object properties: reqId: allOf: - type: string statusCode: allOf: - type: number enum: - 404 message: allOf: - type: string error: allOf: - type: string requiredProperties: - reqId - statusCode - message - error additionalProperties: false examples: example: value: reqId: statusCode: 404 message: error: description: Default Response '422': application/json: schemaArray: - type: object properties: reqId: allOf: - type: string statusCode: allOf: - type: number enum: - 422 message: allOf: - {} error: allOf: - type: string requiredProperties: - reqId - statusCode - error additionalProperties: false examples: example: value: reqId: statusCode: 422 message: error: description: Default Response '500': application/json: schemaArray: - type: object properties: reqId: allOf: - type: string statusCode: allOf: - type: number enum: - 500 message: allOf: - type: string error: allOf: - type: string requiredProperties: - reqId - statusCode - message - error additionalProperties: false examples: example: value: reqId: statusCode: 500 message: error: description: Default Response deprecated: false type: path components: schemas: {} ```` --- # Source: https://infisical.com/docs/api-reference/endpoints/dynamic-secrets/list-leases.md > ## Documentation Index > Fetch the complete documentation index at: https://infisical.com/docs/llms.txt > Use this file to discover all available pages before exploring further. # List Leases ## OpenAPI ````yaml GET /api/v1/dynamic-secrets/{name}/leases openapi: 3.0.3 info: title: Infisical API description: List of all available APIs that can be consumed version: 0.0.1 servers: - url: https://us.infisical.com description: Production server (US) - url: https://eu.infisical.com description: Production server (EU) - url: http://localhost:8080 description: Local server security: [] paths: /api/v1/dynamic-secrets/{name}/leases: get: tags: - Dynamic Secrets parameters: - schema: type: string minLength: 1 in: query name: projectSlug required: true description: The slug of the project to create dynamic secret in. - schema: type: string default: / in: query name: path required: false description: The path to list folders from. - schema: type: string minLength: 1 in: query name: environmentSlug required: true description: The slug of the environment to list folders from. - schema: type: string minLength: 1 in: path name: name required: true description: The name of the dynamic secret. responses: '200': description: Default Response content: application/json: schema: type: object properties: leases: type: array items: type: object properties: id: type: string format: uuid version: type: number externalEntityId: type: string expireAt: type: string format: date-time status: type: string nullable: true statusDetails: type: string nullable: true dynamicSecretId: type: string format: uuid createdAt: type: string format: date-time updatedAt: type: string format: date-time config: nullable: true required: - id - version - externalEntityId - expireAt - dynamicSecretId - createdAt - updatedAt additionalProperties: false required: - leases additionalProperties: false '400': description: Default Response content: application/json: schema: type: object properties: reqId: type: string statusCode: type: number enum: - 400 message: type: string error: type: string details: {} required: - reqId - statusCode - message - error additionalProperties: false '401': description: Default Response content: application/json: schema: type: object properties: reqId: type: string statusCode: type: number enum: - 401 message: type: string error: type: string required: - reqId - statusCode - message - error additionalProperties: false '403': description: Default Response content: application/json: schema: type: object properties: reqId: type: string statusCode: type: number enum: - 403 message: type: string details: {} error: type: string required: - reqId - statusCode - message - error additionalProperties: false '404': description: Default Response content: application/json: schema: type: object properties: reqId: type: string statusCode: type: number enum: - 404 message: type: string error: type: string required: - reqId - statusCode - message - error additionalProperties: false '422': description: Default Response content: application/json: schema: type: object properties: reqId: type: string statusCode: type: number enum: - 422 message: {} error: type: string required: - reqId - statusCode - error additionalProperties: false '500': description: Default Response content: application/json: schema: type: object properties: reqId: type: string statusCode: type: number enum: - 500 message: type: string error: type: string required: - reqId - statusCode - message - error additionalProperties: false ```` --- # Source: https://infisical.com/docs/api-reference/endpoints/ssh/hosts/list-my.md # List My Hosts ## OpenAPI ````yaml GET /api/v1/ssh/hosts paths: path: /api/v1/ssh/hosts method: get servers: - url: https://us.infisical.com description: Production server (US) - url: https://eu.infisical.com description: Production server (EU) - url: http://localhost:8080 description: Local server request: security: [] parameters: path: {} query: {} header: {} cookie: {} body: {} response: '200': application/json: schemaArray: - type: array items: allOf: - type: object properties: id: type: string format: uuid projectId: type: string hostname: type: string alias: type: string nullable: true userCertTtl: type: string hostCertTtl: type: string userSshCaId: type: string format: uuid hostSshCaId: type: string format: uuid loginMappings: type: array items: type: object properties: loginUser: type: string allowedPrincipals: type: object properties: usernames: type: array items: type: string groups: type: array items: type: string additionalProperties: false source: type: string enum: - host - hostGroup required: - loginUser - allowedPrincipals - source additionalProperties: false required: - id - projectId - hostname - userCertTtl - hostCertTtl - userSshCaId - hostSshCaId - loginMappings additionalProperties: false examples: example: value: - id: 3c90c3cc-0d44-4b50-8888-8dd25736052a projectId: hostname: alias: userCertTtl: hostCertTtl: userSshCaId: 3c90c3cc-0d44-4b50-8888-8dd25736052a hostSshCaId: 3c90c3cc-0d44-4b50-8888-8dd25736052a loginMappings: - loginUser: allowedPrincipals: usernames: - groups: - source: host description: Default Response '400': application/json: schemaArray: - type: object properties: reqId: allOf: - type: string statusCode: allOf: - type: number enum: - 400 message: allOf: - type: string error: allOf: - type: string requiredProperties: - reqId - statusCode - message - error additionalProperties: false examples: example: value: reqId: statusCode: 400 message: error: description: Default Response '401': application/json: schemaArray: - type: object properties: reqId: allOf: - type: string statusCode: allOf: - type: number enum: - 401 message: allOf: - type: string error: allOf: - type: string requiredProperties: - reqId - statusCode - message - error additionalProperties: false examples: example: value: reqId: statusCode: 401 message: error: description: Default Response '403': application/json: schemaArray: - type: object properties: reqId: allOf: - type: string statusCode: allOf: - type: number enum: - 403 message: allOf: - type: string details: allOf: - {} error: allOf: - type: string requiredProperties: - reqId - statusCode - message - error additionalProperties: false examples: example: value: reqId: statusCode: 403 message: details: error: description: Default Response '404': application/json: schemaArray: - type: object properties: reqId: allOf: - type: string statusCode: allOf: - type: number enum: - 404 message: allOf: - type: string error: allOf: - type: string requiredProperties: - reqId - statusCode - message - error additionalProperties: false examples: example: value: reqId: statusCode: 404 message: error: description: Default Response '422': application/json: schemaArray: - type: object properties: reqId: allOf: - type: string statusCode: allOf: - type: number enum: - 422 message: allOf: - {} error: allOf: - type: string requiredProperties: - reqId - statusCode - error additionalProperties: false examples: example: value: reqId: statusCode: 422 message: error: description: Default Response '500': application/json: schemaArray: - type: object properties: reqId: allOf: - type: string statusCode: allOf: - type: number enum: - 500 message: allOf: - type: string error: allOf: - type: string requiredProperties: - reqId - statusCode - message - error additionalProperties: false examples: example: value: reqId: statusCode: 500 message: error: description: Default Response deprecated: false type: path components: schemas: {} ```` --- # Source: https://infisical.com/docs/api-reference/endpoints/integrations/list-project-integrations.md # List Project Integrations > List integrations for a project. ## OpenAPI ````yaml GET /api/v1/workspace/{workspaceId}/integrations paths: path: /api/v1/workspace/{workspaceId}/integrations method: get servers: - url: https://us.infisical.com description: Production server (US) - url: https://eu.infisical.com description: Production server (EU) - url: http://localhost:8080 description: Local server request: security: - title: bearerAuth parameters: query: {} header: Authorization: type: http scheme: bearer description: An access token in Infisical cookie: {} parameters: path: workspaceId: schema: - type: string required: true description: The ID of the project to list integrations for. query: {} header: {} cookie: {} body: {} response: '200': application/json: schemaArray: - type: object properties: integrations: allOf: - type: array items: type: object properties: id: type: string format: uuid isActive: type: boolean url: type: string nullable: true app: type: string nullable: true appId: type: string nullable: true targetEnvironment: type: string nullable: true targetEnvironmentId: type: string nullable: true targetService: type: string nullable: true targetServiceId: type: string nullable: true owner: type: string nullable: true path: type: string nullable: true region: type: string nullable: true scope: type: string nullable: true integration: type: string metadata: nullable: true integrationAuthId: type: string format: uuid envId: type: string format: uuid secretPath: type: string default: / createdAt: type: string format: date-time updatedAt: type: string format: date-time lastUsed: type: string format: date-time nullable: true isSynced: type: boolean nullable: true syncMessage: type: string nullable: true lastSyncJobId: type: string nullable: true environment: type: object properties: id: type: string name: type: string slug: type: string required: - id - name - slug additionalProperties: false required: - id - isActive - integration - integrationAuthId - envId - createdAt - updatedAt - environment additionalProperties: false requiredProperties: - integrations additionalProperties: false examples: example: value: integrations: - id: 3c90c3cc-0d44-4b50-8888-8dd25736052a isActive: true url: app: appId: targetEnvironment: targetEnvironmentId: targetService: targetServiceId: owner: path: region: scope: integration: metadata: integrationAuthId: 3c90c3cc-0d44-4b50-8888-8dd25736052a envId: 3c90c3cc-0d44-4b50-8888-8dd25736052a secretPath: / createdAt: '2023-11-07T05:31:56Z' updatedAt: '2023-11-07T05:31:56Z' lastUsed: '2023-11-07T05:31:56Z' isSynced: true syncMessage: lastSyncJobId: environment: id: name: slug: description: Default Response '400': application/json: schemaArray: - type: object properties: reqId: allOf: - type: string statusCode: allOf: - type: number enum: - 400 message: allOf: - type: string error: allOf: - type: string requiredProperties: - reqId - statusCode - message - error additionalProperties: false examples: example: value: reqId: statusCode: 400 message: error: description: Default Response '401': application/json: schemaArray: - type: object properties: reqId: allOf: - type: string statusCode: allOf: - type: number enum: - 401 message: allOf: - type: string error: allOf: - type: string requiredProperties: - reqId - statusCode - message - error additionalProperties: false examples: example: value: reqId: statusCode: 401 message: error: description: Default Response '403': application/json: schemaArray: - type: object properties: reqId: allOf: - type: string statusCode: allOf: - type: number enum: - 403 message: allOf: - type: string details: allOf: - {} error: allOf: - type: string requiredProperties: - reqId - statusCode - message - error additionalProperties: false examples: example: value: reqId: statusCode: 403 message: details: error: description: Default Response '404': application/json: schemaArray: - type: object properties: reqId: allOf: - type: string statusCode: allOf: - type: number enum: - 404 message: allOf: - type: string error: allOf: - type: string requiredProperties: - reqId - statusCode - message - error additionalProperties: false examples: example: value: reqId: statusCode: 404 message: error: description: Default Response '422': application/json: schemaArray: - type: object properties: reqId: allOf: - type: string statusCode: allOf: - type: number enum: - 422 message: allOf: - {} error: allOf: - type: string requiredProperties: - reqId - statusCode - error additionalProperties: false examples: example: value: reqId: statusCode: 422 message: error: description: Default Response '500': application/json: schemaArray: - type: object properties: reqId: allOf: - type: string statusCode: allOf: - type: number enum: - 500 message: allOf: - type: string error: allOf: - type: string requiredProperties: - reqId - statusCode - message - error additionalProperties: false examples: example: value: reqId: statusCode: 500 message: error: description: Default Response deprecated: false type: path components: schemas: {} ```` --- # Source: https://infisical.com/docs/api-reference/endpoints/projects/list-projects.md > ## Documentation Index > Fetch the complete documentation index at: https://infisical.com/docs/llms.txt > Use this file to discover all available pages before exploring further. # List Projects > List projects ## OpenAPI ````yaml GET /api/v1/projects openapi: 3.0.3 info: title: Infisical API description: List of all available APIs that can be consumed version: 0.0.1 servers: - url: https://us.infisical.com description: Production server (US) - url: https://eu.infisical.com description: Production server (EU) - url: http://localhost:8080 description: Local server security: [] paths: /api/v1/projects: get: tags: - Projects description: List projects operationId: listProjects parameters: - schema: type: string enum: - 'true' - 'false' default: 'false' in: query name: includeRoles required: false - schema: type: string enum: - secret-manager - cert-manager - kms - ssh - secret-scanning - pam - ai in: query name: type required: false responses: '200': description: Default Response content: application/json: schema: type: object properties: projects: type: array items: type: object properties: id: type: string name: type: string description: type: string nullable: true type: type: string defaultProduct: type: string nullable: true slug: type: string autoCapitalization: type: boolean default: false nullable: true orgId: type: string format: uuid createdAt: type: string format: date-time updatedAt: type: string format: date-time version: type: number default: 1 upgradeStatus: type: string nullable: true pitVersionLimit: type: number default: 10 kmsCertificateKeyId: type: string format: uuid nullable: true auditLogsRetentionDays: type: number nullable: true hasDeleteProtection: type: boolean default: false nullable: true secretSharing: type: boolean default: true showSnapshotsLegacy: type: boolean default: false secretDetectionIgnoreValues: type: array items: type: string nullable: true enforceEncryptedSecretManagerSecretMetadata: type: boolean nullable: true _id: type: string environments: type: array items: type: object properties: name: type: string slug: type: string id: type: string required: - name - slug - id additionalProperties: false roles: type: array items: type: object properties: id: type: string format: uuid name: type: string description: type: string nullable: true slug: type: string permissions: {} createdAt: type: string format: date-time updatedAt: type: string format: date-time projectId: type: string version: type: number default: 1 required: - id - name - slug - createdAt - updatedAt - projectId additionalProperties: false required: - id - name - type - slug - orgId - createdAt - updatedAt - _id - environments additionalProperties: false required: - projects additionalProperties: false '400': description: Default Response content: application/json: schema: type: object properties: reqId: type: string statusCode: type: number enum: - 400 message: type: string error: type: string details: {} required: - reqId - statusCode - message - error additionalProperties: false '401': description: Default Response content: application/json: schema: type: object properties: reqId: type: string statusCode: type: number enum: - 401 message: type: string error: type: string required: - reqId - statusCode - message - error additionalProperties: false '403': description: Default Response content: application/json: schema: type: object properties: reqId: type: string statusCode: type: number enum: - 403 message: type: string details: {} error: type: string required: - reqId - statusCode - message - error additionalProperties: false '404': description: Default Response content: application/json: schema: type: object properties: reqId: type: string statusCode: type: number enum: - 404 message: type: string error: type: string required: - reqId - statusCode - message - error additionalProperties: false '422': description: Default Response content: application/json: schema: type: object properties: reqId: type: string statusCode: type: number enum: - 422 message: {} error: type: string required: - reqId - statusCode - error additionalProperties: false '500': description: Default Response content: application/json: schema: type: object properties: reqId: type: string statusCode: type: number enum: - 500 message: type: string error: type: string required: - reqId - statusCode - message - error additionalProperties: false security: - bearerAuth: [] components: securitySchemes: bearerAuth: type: http scheme: bearer bearerFormat: JWT description: An access token in Infisical ```` --- # Source: https://infisical.com/docs/api-reference/endpoints/secret-scanning/data-sources/gitlab/list-resources.md # Source: https://infisical.com/docs/api-reference/endpoints/secret-scanning/data-sources/github/list-resources.md # Source: https://infisical.com/docs/api-reference/endpoints/secret-scanning/data-sources/bitbucket/list-resources.md > ## Documentation Index > Fetch the complete documentation index at: https://infisical.com/docs/llms.txt > Use this file to discover all available pages before exploring further. # List Resources > Get the resources associated with the specified Bitbucket Data Source by ID. ## OpenAPI ````yaml GET /api/v2/secret-scanning/data-sources/bitbucket/{dataSourceId}/resources openapi: 3.0.3 info: title: Infisical API description: List of all available APIs that can be consumed version: 0.0.1 servers: - url: https://us.infisical.com description: Production server (US) - url: https://eu.infisical.com description: Production server (EU) - url: http://localhost:8080 description: Local server security: [] paths: /api/v2/secret-scanning/data-sources/bitbucket/{dataSourceId}/resources: get: tags: - Secret Scanning description: >- Get the resources associated with the specified Bitbucket Data Source by ID. operationId: listBitbucketDataSourceResources parameters: - schema: type: string format: uuid in: path name: dataSourceId required: true description: The ID of the Bitbucket Data Source to list resources from. responses: '200': description: Default Response content: application/json: schema: type: object properties: resources: type: array items: type: object properties: id: type: string format: uuid externalId: type: string name: type: string type: type: string dataSourceId: type: string format: uuid createdAt: type: string format: date-time updatedAt: type: string format: date-time required: - id - externalId - name - type - dataSourceId - createdAt - updatedAt additionalProperties: false required: - resources additionalProperties: false '400': description: Default Response content: application/json: schema: type: object properties: reqId: type: string statusCode: type: number enum: - 400 message: type: string error: type: string details: {} required: - reqId - statusCode - message - error additionalProperties: false '401': description: Default Response content: application/json: schema: type: object properties: reqId: type: string statusCode: type: number enum: - 401 message: type: string error: type: string required: - reqId - statusCode - message - error additionalProperties: false '403': description: Default Response content: application/json: schema: type: object properties: reqId: type: string statusCode: type: number enum: - 403 message: type: string details: {} error: type: string required: - reqId - statusCode - message - error additionalProperties: false '404': description: Default Response content: application/json: schema: type: object properties: reqId: type: string statusCode: type: number enum: - 404 message: type: string error: type: string required: - reqId - statusCode - message - error additionalProperties: false '422': description: Default Response content: application/json: schema: type: object properties: reqId: type: string statusCode: type: number enum: - 422 message: {} error: type: string required: - reqId - statusCode - error additionalProperties: false '500': description: Default Response content: application/json: schema: type: object properties: reqId: type: string statusCode: type: number enum: - 500 message: type: string error: type: string required: - reqId - statusCode - message - error additionalProperties: false ```` --- # Source: https://infisical.com/docs/api-reference/endpoints/secret-scanning/data-sources/gitlab/list-scans.md # Source: https://infisical.com/docs/api-reference/endpoints/secret-scanning/data-sources/github/list-scans.md # Source: https://infisical.com/docs/api-reference/endpoints/secret-scanning/data-sources/bitbucket/list-scans.md > ## Documentation Index > Fetch the complete documentation index at: https://infisical.com/docs/llms.txt > Use this file to discover all available pages before exploring further. # List Scans > Get the scans associated with the specified Bitbucket Data Source by ID. ## OpenAPI ````yaml GET /api/v2/secret-scanning/data-sources/bitbucket/{dataSourceId}/scans openapi: 3.0.3 info: title: Infisical API description: List of all available APIs that can be consumed version: 0.0.1 servers: - url: https://us.infisical.com description: Production server (US) - url: https://eu.infisical.com description: Production server (EU) - url: http://localhost:8080 description: Local server security: [] paths: /api/v2/secret-scanning/data-sources/bitbucket/{dataSourceId}/scans: get: tags: - Secret Scanning description: Get the scans associated with the specified Bitbucket Data Source by ID. operationId: listBitbucketDataSourceScans parameters: - schema: type: string format: uuid in: path name: dataSourceId required: true description: The ID of the Bitbucket Data Source to list scans for. responses: '200': description: Default Response content: application/json: schema: type: object properties: scans: type: array items: type: object properties: id: type: string format: uuid status: type: string default: queued statusMessage: type: string nullable: true type: type: string resourceId: type: string format: uuid createdAt: type: string format: date-time nullable: true required: - id - type - resourceId additionalProperties: false required: - scans additionalProperties: false '400': description: Default Response content: application/json: schema: type: object properties: reqId: type: string statusCode: type: number enum: - 400 message: type: string error: type: string details: {} required: - reqId - statusCode - message - error additionalProperties: false '401': description: Default Response content: application/json: schema: type: object properties: reqId: type: string statusCode: type: number enum: - 401 message: type: string error: type: string required: - reqId - statusCode - message - error additionalProperties: false '403': description: Default Response content: application/json: schema: type: object properties: reqId: type: string statusCode: type: number enum: - 403 message: type: string details: {} error: type: string required: - reqId - statusCode - message - error additionalProperties: false '404': description: Default Response content: application/json: schema: type: object properties: reqId: type: string statusCode: type: number enum: - 404 message: type: string error: type: string required: - reqId - statusCode - message - error additionalProperties: false '422': description: Default Response content: application/json: schema: type: object properties: reqId: type: string statusCode: type: number enum: - 422 message: {} error: type: string required: - reqId - statusCode - error additionalProperties: false '500': description: Default Response content: application/json: schema: type: object properties: reqId: type: string statusCode: type: number enum: - 500 message: type: string error: type: string required: - reqId - statusCode - message - error additionalProperties: false ```` --- # Source: https://infisical.com/docs/api-reference/endpoints/secrets/list.md # Source: https://infisical.com/docs/api-reference/endpoints/secret-tags/list.md # Source: https://infisical.com/docs/api-reference/endpoints/secret-syncs/zabbix/list.md # Source: https://infisical.com/docs/api-reference/endpoints/secret-syncs/windmill/list.md # Source: https://infisical.com/docs/api-reference/endpoints/secret-syncs/vercel/list.md # Source: https://infisical.com/docs/api-reference/endpoints/secret-syncs/terraform-cloud/list.md # Source: https://infisical.com/docs/api-reference/endpoints/secret-syncs/teamcity/list.md # Source: https://infisical.com/docs/api-reference/endpoints/secret-syncs/supabase/list.md # Source: https://infisical.com/docs/api-reference/endpoints/secret-syncs/render/list.md # Source: https://infisical.com/docs/api-reference/endpoints/secret-syncs/railway/list.md # Source: https://infisical.com/docs/api-reference/endpoints/secret-syncs/octopus-deploy/list.md # Source: https://infisical.com/docs/api-reference/endpoints/secret-syncs/oci-vault/list.md # Source: https://infisical.com/docs/api-reference/endpoints/secret-syncs/northflank/list.md # Source: https://infisical.com/docs/api-reference/endpoints/secret-syncs/netlify/list.md # Source: https://infisical.com/docs/api-reference/endpoints/secret-syncs/list.md # Source: https://infisical.com/docs/api-reference/endpoints/secret-syncs/laravel-forge/list.md # Source: https://infisical.com/docs/api-reference/endpoints/secret-syncs/humanitec/list.md # Source: https://infisical.com/docs/api-reference/endpoints/secret-syncs/heroku/list.md # Source: https://infisical.com/docs/api-reference/endpoints/secret-syncs/hashicorp-vault/list.md # Source: https://infisical.com/docs/api-reference/endpoints/secret-syncs/gitlab/list.md # Source: https://infisical.com/docs/api-reference/endpoints/secret-syncs/github/list.md # Source: https://infisical.com/docs/api-reference/endpoints/secret-syncs/gcp-secret-manager/list.md # Source: https://infisical.com/docs/api-reference/endpoints/secret-syncs/flyio/list.md # Source: https://infisical.com/docs/api-reference/endpoints/secret-syncs/digital-ocean-app-platform/list.md # Source: https://infisical.com/docs/api-reference/endpoints/secret-syncs/databricks/list.md # Source: https://infisical.com/docs/api-reference/endpoints/secret-syncs/cloudflare-workers/list.md # Source: https://infisical.com/docs/api-reference/endpoints/secret-syncs/cloudflare-pages/list.md # Source: https://infisical.com/docs/api-reference/endpoints/secret-syncs/circleci/list.md # Source: https://infisical.com/docs/api-reference/endpoints/secret-syncs/chef/list.md # Source: https://infisical.com/docs/api-reference/endpoints/secret-syncs/checkly/list.md # Source: https://infisical.com/docs/api-reference/endpoints/secret-syncs/camunda/list.md # Source: https://infisical.com/docs/api-reference/endpoints/secret-syncs/bitbucket/list.md # Source: https://infisical.com/docs/api-reference/endpoints/secret-syncs/azure-key-vault/list.md # Source: https://infisical.com/docs/api-reference/endpoints/secret-syncs/azure-devops/list.md # Source: https://infisical.com/docs/api-reference/endpoints/secret-syncs/azure-app-configuration/list.md # Source: https://infisical.com/docs/api-reference/endpoints/secret-syncs/aws-secrets-manager/list.md # Source: https://infisical.com/docs/api-reference/endpoints/secret-syncs/aws-parameter-store/list.md # Source: https://infisical.com/docs/api-reference/endpoints/secret-syncs/1password/list.md # Source: https://infisical.com/docs/api-reference/endpoints/secret-scanning/findings/list.md # Source: https://infisical.com/docs/api-reference/endpoints/secret-scanning/data-sources/list.md # Source: https://infisical.com/docs/api-reference/endpoints/secret-scanning/data-sources/gitlab/list.md # Source: https://infisical.com/docs/api-reference/endpoints/secret-scanning/data-sources/github/list.md # Source: https://infisical.com/docs/api-reference/endpoints/secret-scanning/data-sources/bitbucket/list.md # Source: https://infisical.com/docs/api-reference/endpoints/secret-rotations/windows-local-account/list.md # Source: https://infisical.com/docs/api-reference/endpoints/secret-rotations/unix-linux-local-account/list.md # Source: https://infisical.com/docs/api-reference/endpoints/secret-rotations/redis-credentials/list.md # Source: https://infisical.com/docs/api-reference/endpoints/secret-rotations/postgres-credentials/list.md # Source: https://infisical.com/docs/api-reference/endpoints/secret-rotations/oracledb-credentials/list.md # Source: https://infisical.com/docs/api-reference/endpoints/secret-rotations/okta-client-secret/list.md # Source: https://infisical.com/docs/api-reference/endpoints/secret-rotations/mysql-credentials/list.md # Source: https://infisical.com/docs/api-reference/endpoints/secret-rotations/mssql-credentials/list.md # Source: https://infisical.com/docs/api-reference/endpoints/secret-rotations/mongodb-credentials/list.md # Source: https://infisical.com/docs/api-reference/endpoints/secret-rotations/list.md # Source: https://infisical.com/docs/api-reference/endpoints/secret-rotations/ldap-password/list.md # Source: https://infisical.com/docs/api-reference/endpoints/secret-rotations/databricks-service-principal-secret/list.md # Source: https://infisical.com/docs/api-reference/endpoints/secret-rotations/azure-client-secret/list.md # Source: https://infisical.com/docs/api-reference/endpoints/secret-rotations/aws-iam-user-secret/list.md # Source: https://infisical.com/docs/api-reference/endpoints/secret-rotations/auth0-client-secret/list.md # Source: https://infisical.com/docs/api-reference/endpoints/secret-imports/list.md # Source: https://infisical.com/docs/api-reference/endpoints/project-templates/list.md # Source: https://infisical.com/docs/api-reference/endpoints/project-roles/list.md # Source: https://infisical.com/docs/api-reference/endpoints/project-groups/list.md # Source: https://infisical.com/docs/api-reference/endpoints/pki/syncs/list.md # Source: https://infisical.com/docs/api-reference/endpoints/pki/syncs/chef/list.md # Source: https://infisical.com/docs/api-reference/endpoints/pki/syncs/azure-key-vault/list.md # Source: https://infisical.com/docs/api-reference/endpoints/pki/syncs/aws-secrets-manager/list.md # Source: https://infisical.com/docs/api-reference/endpoints/pki/syncs/aws-certificate-manager/list.md # Source: https://infisical.com/docs/api-reference/endpoints/organizations/scim/group-org-role-mappings/list.md # Source: https://infisical.com/docs/api-reference/endpoints/organization-roles/list.md # Source: https://infisical.com/docs/api-reference/endpoints/kms/keys/list.md # Source: https://infisical.com/docs/api-reference/endpoints/identity-specific-privilege/v2/list.md # Source: https://infisical.com/docs/api-reference/endpoints/identity-specific-privilege/v1/list.md # Source: https://infisical.com/docs/api-reference/endpoints/identities/list.md # Source: https://infisical.com/docs/api-reference/endpoints/folders/list.md # Source: https://infisical.com/docs/api-reference/endpoints/dynamic-secrets/list.md # Source: https://infisical.com/docs/api-reference/endpoints/deprecated/secrets/list.md # Source: https://infisical.com/docs/api-reference/endpoints/deprecated/secret-tags/list.md # Source: https://infisical.com/docs/api-reference/endpoints/deprecated/secret-imports/list.md # Source: https://infisical.com/docs/api-reference/endpoints/deprecated/project-roles/list.md # Source: https://infisical.com/docs/api-reference/endpoints/deprecated/project-groups/list.md # Source: https://infisical.com/docs/api-reference/endpoints/deprecated/folders/list.md # Source: https://infisical.com/docs/api-reference/endpoints/certificates/list.md # Source: https://infisical.com/docs/api-reference/endpoints/certificate-profiles/list.md # Source: https://infisical.com/docs/api-reference/endpoints/certificate-policies/list.md # Source: https://infisical.com/docs/api-reference/endpoints/certificate-authorities/internal/list.md # Source: https://infisical.com/docs/api-reference/endpoints/certificate-authorities/acme/list.md # Source: https://infisical.com/docs/api-reference/endpoints/app-connections/zabbix/list.md # Source: https://infisical.com/docs/api-reference/endpoints/app-connections/windmill/list.md # Source: https://infisical.com/docs/api-reference/endpoints/app-connections/vercel/list.md # Source: https://infisical.com/docs/api-reference/endpoints/app-connections/terraform-cloud/list.md # Source: https://infisical.com/docs/api-reference/endpoints/app-connections/teamcity/list.md # Source: https://infisical.com/docs/api-reference/endpoints/app-connections/supabase/list.md # Source: https://infisical.com/docs/api-reference/endpoints/app-connections/ssh/list.md # Source: https://infisical.com/docs/api-reference/endpoints/app-connections/smb/list.md # Source: https://infisical.com/docs/api-reference/endpoints/app-connections/render/list.md # Source: https://infisical.com/docs/api-reference/endpoints/app-connections/redis/list.md # Source: https://infisical.com/docs/api-reference/endpoints/app-connections/railway/list.md # Source: https://infisical.com/docs/api-reference/endpoints/app-connections/postgres/list.md # Source: https://infisical.com/docs/api-reference/endpoints/app-connections/oracledb/list.md # Source: https://infisical.com/docs/api-reference/endpoints/app-connections/openrouter/list.md # Source: https://infisical.com/docs/api-reference/endpoints/app-connections/okta/list.md # Source: https://infisical.com/docs/api-reference/endpoints/app-connections/octopus-deploy/list.md # Source: https://infisical.com/docs/api-reference/endpoints/app-connections/oci/list.md # Source: https://infisical.com/docs/api-reference/endpoints/app-connections/northflank/list.md # Source: https://infisical.com/docs/api-reference/endpoints/app-connections/netlify/list.md # Source: https://infisical.com/docs/api-reference/endpoints/app-connections/mysql/list.md # Source: https://infisical.com/docs/api-reference/endpoints/app-connections/mssql/list.md # Source: https://infisical.com/docs/api-reference/endpoints/app-connections/mongodb/list.md # Source: https://infisical.com/docs/api-reference/endpoints/app-connections/list.md # Source: https://infisical.com/docs/api-reference/endpoints/app-connections/ldap/list.md # Source: https://infisical.com/docs/api-reference/endpoints/app-connections/laravel-forge/list.md # Source: https://infisical.com/docs/api-reference/endpoints/app-connections/humanitec/list.md # Source: https://infisical.com/docs/api-reference/endpoints/app-connections/heroku/list.md # Source: https://infisical.com/docs/api-reference/endpoints/app-connections/hashicorp-vault/list.md # Source: https://infisical.com/docs/api-reference/endpoints/app-connections/gitlab/list.md # Source: https://infisical.com/docs/api-reference/endpoints/app-connections/github/list.md # Source: https://infisical.com/docs/api-reference/endpoints/app-connections/github-radar/list.md # Source: https://infisical.com/docs/api-reference/endpoints/app-connections/gcp/list.md # Source: https://infisical.com/docs/api-reference/endpoints/app-connections/flyio/list.md # Source: https://infisical.com/docs/api-reference/endpoints/app-connections/digital-ocean/list.md # Source: https://infisical.com/docs/api-reference/endpoints/app-connections/databricks/list.md # Source: https://infisical.com/docs/api-reference/endpoints/app-connections/cloudflare/list.md # Source: https://infisical.com/docs/api-reference/endpoints/app-connections/circleci/list.md # Source: https://infisical.com/docs/api-reference/endpoints/app-connections/chef/list.md # Source: https://infisical.com/docs/api-reference/endpoints/app-connections/checkly/list.md # Source: https://infisical.com/docs/api-reference/endpoints/app-connections/camunda/list.md # Source: https://infisical.com/docs/api-reference/endpoints/app-connections/bitbucket/list.md # Source: https://infisical.com/docs/api-reference/endpoints/app-connections/azure-key-vault/list.md # Source: https://infisical.com/docs/api-reference/endpoints/app-connections/azure-devops/list.md # Source: https://infisical.com/docs/api-reference/endpoints/app-connections/azure-client-secret/list.md # Source: https://infisical.com/docs/api-reference/endpoints/app-connections/azure-app-configuration/list.md # Source: https://infisical.com/docs/api-reference/endpoints/app-connections/azure-adcs/list.md # Source: https://infisical.com/docs/api-reference/endpoints/app-connections/aws/list.md # Source: https://infisical.com/docs/api-reference/endpoints/app-connections/auth0/list.md # Source: https://infisical.com/docs/api-reference/endpoints/app-connections/1password/list.md > ## Documentation Index > Fetch the complete documentation index at: https://infisical.com/docs/llms.txt > Use this file to discover all available pages before exploring further. # List > List the 1Password Connections for the current organization or project. ## OpenAPI ````yaml GET /api/v1/app-connections/1password openapi: 3.0.3 info: title: Infisical API description: List of all available APIs that can be consumed version: 0.0.1 servers: - url: https://us.infisical.com description: Production server (US) - url: https://eu.infisical.com description: Production server (EU) - url: http://localhost:8080 description: Local server security: [] paths: /api/v1/app-connections/1password: get: tags: - App Connections description: List the 1Password Connections for the current organization or project. operationId: listOnePasswordAppConnections parameters: - schema: type: string in: query name: projectId required: false description: The ID of the project to list 1Password Connections from. responses: '200': description: Default Response content: application/json: schema: type: object properties: appConnections: type: array items: anyOf: - type: object properties: id: type: string format: uuid name: type: string description: type: string nullable: true version: type: number default: 1 orgId: type: string format: uuid createdAt: type: string format: date-time updatedAt: type: string format: date-time isPlatformManagedCredentials: type: boolean default: false nullable: true gatewayId: type: string format: uuid nullable: true projectId: type: string nullable: true credentialsHash: type: string project: type: object properties: name: type: string id: type: string type: type: string slug: type: string required: - name - id - type - slug additionalProperties: false nullable: true app: type: string enum: - 1password method: type: string enum: - api-token credentials: type: object properties: instanceUrl: type: string format: uri minLength: 1 description: >- The URL of the 1Password Connect Server instance to authenticate with. required: - instanceUrl additionalProperties: false required: - id - name - orgId - createdAt - updatedAt - app - method - credentials additionalProperties: false title: 1Password (API Token) required: - appConnections additionalProperties: false '400': description: Default Response content: application/json: schema: type: object properties: reqId: type: string statusCode: type: number enum: - 400 message: type: string error: type: string details: {} required: - reqId - statusCode - message - error additionalProperties: false '401': description: Default Response content: application/json: schema: type: object properties: reqId: type: string statusCode: type: number enum: - 401 message: type: string error: type: string required: - reqId - statusCode - message - error additionalProperties: false '403': description: Default Response content: application/json: schema: type: object properties: reqId: type: string statusCode: type: number enum: - 403 message: type: string details: {} error: type: string required: - reqId - statusCode - message - error additionalProperties: false '404': description: Default Response content: application/json: schema: type: object properties: reqId: type: string statusCode: type: number enum: - 404 message: type: string error: type: string required: - reqId - statusCode - message - error additionalProperties: false '422': description: Default Response content: application/json: schema: type: object properties: reqId: type: string statusCode: type: number enum: - 422 message: {} error: type: string required: - reqId - statusCode - error additionalProperties: false '500': description: Default Response content: application/json: schema: type: object properties: reqId: type: string statusCode: type: number enum: - 500 message: type: string error: type: string required: - reqId - statusCode - message - error additionalProperties: false ```` --- # Source: https://infisical.com/docs/documentation/guides/local-development.md > ## Documentation Index > Fetch the complete documentation index at: https://infisical.com/docs/llms.txt > Use this file to discover all available pages before exploring further. # Secret Management in Development Environments > Learn how to manage secrets in local development environments. ## Problem at hand There are a number of issues that arise with secret management in local development environment: 1. **Getting secrets onto local machines**. When new developers join or a new project is created, the process of getting the development set of secrets onto local machines is often unclear. As a result, developers end up spending a lot of time onboarding and risk potentially following insecure practices when sharing secrets from one developer to another. 2. **Syncing secrets with teammates**. One of the problems with .env files is that they become unsynced when one of the developers updates a secret or configuration. Even if the rest of the team is notified, developers don't make all the right changes immediately, and later on end up spending a lot of time debugging an issue due to missing environment variables. This leads to a lot of inefficiencies and lost time. 3. **Accidentally leaking secrets**. When developing locally, it's common for developers to accidentally leak a hardcoded secret as part of a commit. As soon as the secret is part of the git history, it becomes hard to get it removed and create a security vulnerability. ## Solution One of the main benefits of Infisical is the facilitation of secret management workflows in local development use cases. In particular, Infisical heavily follows the "Security Shift Left" principle to enable developers to effortlessly follow secure practices when coding. ### CLI [Infisical CLI](/cli/overview) is the most frequently used Infisical tool for secret management in local development environments. It makes it easy to inject secrets right into the local application environments based on the permissions given to corresponding developers. ### Dashboard On top of that, Infisical provides a great [Web Dashboard](https://app.infisical.com/signup) that can be used to making quick secret updates. project dashboard ### Personal Overrides By default, all the secrets in the Infisical environments are shared among project members who have the permission to access those environment. At the same time, when doing local development, it is often desirable to change the value of a certain secret only for a particular self. For such use cases, Infisical supports the functionality of **Personal Overrides** – which allow developers to override values of any secrets without affecting the workflows of the rest of the team. Personal Overrides can be created both in the dashboard or via [Infisical CLI](/cli/overview). ### Secret Scanning In addition, Infisical also provides a set of tools to automatically prevent secret leaks to git history. This functionality can be set up on the level of [Infisical CLI using pre-commit hooks](/cli/scanning-overview#automatically-scan-changes-before-you-commit) or through a direct integration with platforms like GitHub. --- # Source: https://infisical.com/docs/cli/commands/login.md # Source: https://infisical.com/docs/api-reference/endpoints/universal-auth/login.md # Source: https://infisical.com/docs/api-reference/endpoints/tls-cert-auth/login.md # Source: https://infisical.com/docs/api-reference/endpoints/oidc-auth/login.md # Source: https://infisical.com/docs/api-reference/endpoints/oci-auth/login.md # Source: https://infisical.com/docs/api-reference/endpoints/ldap-auth/login.md # Source: https://infisical.com/docs/api-reference/endpoints/kubernetes-auth/login.md # Source: https://infisical.com/docs/api-reference/endpoints/jwt-auth/login.md # Source: https://infisical.com/docs/api-reference/endpoints/gcp-auth/login.md # Source: https://infisical.com/docs/api-reference/endpoints/azure-auth/login.md # Source: https://infisical.com/docs/api-reference/endpoints/aws-auth/login.md # Source: https://infisical.com/docs/api-reference/endpoints/alicloud-auth/login.md > ## Documentation Index > Fetch the complete documentation index at: https://infisical.com/docs/llms.txt > Use this file to discover all available pages before exploring further. # Login > Login with Alibaba Cloud Auth for machine identity ## OpenAPI ````yaml POST /api/v1/auth/alicloud-auth/login openapi: 3.0.3 info: title: Infisical API description: List of all available APIs that can be consumed version: 0.0.1 servers: - url: https://us.infisical.com description: Production server (US) - url: https://eu.infisical.com description: Production server (EU) - url: http://localhost:8080 description: Local server security: [] paths: /api/v1/auth/alicloud-auth/login: post: tags: - Alibaba Cloud Auth description: Login with Alibaba Cloud Auth for machine identity operationId: loginWithAlicloudAuth requestBody: content: application/json: schema: type: object properties: identityId: type: string description: The ID of the machine identity to login. Action: type: string enum: - GetCallerIdentity description: >- The Alibaba Cloud API action. For STS GetCallerIdentity, this should be 'GetCallerIdentity'. Format: type: string enum: - JSON description: >- The response format. For STS GetCallerIdentity, this should be 'JSON'. Version: type: string description: >- The API version. This should be in 'YYYY-MM-DD' format (e.g., '2015-04-01'). AccessKeyId: type: string description: The AccessKey ID of the RAM user or STS token. organizationSlug: type: string minLength: 1 maxLength: 64 description: >- When set, this will scope the login session to the specified organization the machine identity has access to. If omitted, the session defaults to the organization where the machine identity was created in. SignatureMethod: type: string enum: - HMAC-SHA1 description: >- The signature algorithm. For STS GetCallerIdentity, this should be 'HMAC-SHA1'. Timestamp: type: string format: date-time description: >- The timestamp of the request in UTC, formatted as 'YYYY-MM-DDTHH:mm:ssZ'. SignatureVersion: type: string enum: - '1.0' description: >- The signature version. For STS GetCallerIdentity, this should be '1.0'. SignatureNonce: type: string description: A unique random string to prevent replay attacks. Signature: type: string description: >- The signature string calculated based on the request parameters and AccessKey Secret. required: - identityId - Action - Format - Version - AccessKeyId - SignatureMethod - Timestamp - SignatureVersion - SignatureNonce - Signature additionalProperties: false required: true responses: '200': description: Default Response content: application/json: schema: type: object properties: accessToken: type: string expiresIn: type: number accessTokenMaxTTL: type: number tokenType: type: string enum: - Bearer required: - accessToken - expiresIn - accessTokenMaxTTL - tokenType additionalProperties: false '400': description: Default Response content: application/json: schema: type: object properties: reqId: type: string statusCode: type: number enum: - 400 message: type: string error: type: string details: {} required: - reqId - statusCode - message - error additionalProperties: false '401': description: Default Response content: application/json: schema: type: object properties: reqId: type: string statusCode: type: number enum: - 401 message: type: string error: type: string required: - reqId - statusCode - message - error additionalProperties: false '403': description: Default Response content: application/json: schema: type: object properties: reqId: type: string statusCode: type: number enum: - 403 message: type: string details: {} error: type: string required: - reqId - statusCode - message - error additionalProperties: false '404': description: Default Response content: application/json: schema: type: object properties: reqId: type: string statusCode: type: number enum: - 404 message: type: string error: type: string required: - reqId - statusCode - message - error additionalProperties: false '422': description: Default Response content: application/json: schema: type: object properties: reqId: type: string statusCode: type: number enum: - 422 message: {} error: type: string required: - reqId - statusCode - error additionalProperties: false '500': description: Default Response content: application/json: schema: type: object properties: reqId: type: string statusCode: type: number enum: - 500 message: type: string error: type: string required: - reqId - statusCode - message - error additionalProperties: false ```` --- # Source: https://infisical.com/docs/integrations/machine-authentication.md > ## Documentation Index > Fetch the complete documentation index at: https://infisical.com/docs/llms.txt > Use this file to discover all available pages before exploring further. # Machine Authentication > Browse and search through all available machine authentication methods for Infisical. export const MachineAuthenticationBrowser = () => { const [searchTerm, setSearchTerm] = useState(''); const [selectedCategory, setSelectedCategory] = useState('All'); const categories = ['All', 'Token-based', 'Cloud Provider', 'Kubernetes', 'Certificate-based', 'Directory-based']; const authMethods = [{ "name": "Universal Auth", "slug": "universal-auth", "path": "/documentation/platform/identities/universal-auth", "description": "Learn how to authenticate machines using Universal Auth tokens with client ID and secret.", "category": "Token-based" }, { "name": "Token Auth", "slug": "token-auth", "path": "/documentation/platform/identities/token-auth", "description": "Learn how to authenticate machines using long-lived access tokens.", "category": "Token-based" }, { "name": "JWT Auth", "slug": "jwt-auth", "path": "/documentation/platform/identities/jwt-auth", "description": "Learn how to authenticate machines using JSON Web Tokens (JWT).", "category": "Token-based" }, { "name": "AWS Auth", "slug": "aws-iam-auth", "path": "/documentation/platform/identities/aws-auth", "description": "Learn how to authenticate AWS services and resources using IAM roles.", "category": "Cloud Provider" }, { "name": "Azure Auth", "slug": "azure-auth", "path": "/documentation/platform/identities/azure-auth", "description": "Learn how to authenticate Azure services using managed identities.", "category": "Cloud Provider" }, { "name": "GCP Auth", "slug": "gcp-auth", "path": "/documentation/platform/identities/gcp-auth", "description": "Learn how to authenticate GCP services using service accounts.", "category": "Cloud Provider" }, { "name": "Alibaba Cloud Auth", "slug": "alicloud-auth", "path": "/documentation/platform/identities/alicloud-auth", "description": "Learn how to authenticate Alibaba Cloud services using RAM roles.", "category": "Cloud Provider" }, { "name": "OCI Auth", "slug": "oci-auth", "path": "/documentation/platform/identities/oci-auth", "description": "Learn how to authenticate Oracle Cloud Infrastructure services.", "category": "Cloud Provider" }, { "name": "Kubernetes Auth", "slug": "kubernetes-auth", "path": "/documentation/platform/identities/kubernetes-auth", "description": "Learn how to authenticate Kubernetes workloads using service account tokens.", "category": "Kubernetes" }, { "name": "OIDC Auth", "slug": "oidc-auth-general", "path": "/documentation/platform/identities/oidc-auth/general", "description": "Learn how to authenticate machines using OpenID Connect (OIDC) providers.", "category": "Token-based" }, { "name": "OIDC Auth for GitHub Actions", "slug": "oidc-auth-github", "path": "/documentation/platform/identities/oidc-auth/github", "description": "Learn how to authenticate GitHub Actions using OIDC.", "category": "Token-based" }, { "name": "OIDC Auth for GitLab CI/CD", "slug": "oidc-auth-gitlab", "path": "/documentation/platform/identities/oidc-auth/gitlab", "description": "Learn how to authenticate GitLab CI/CD using OIDC.", "category": "Token-based" }, { "name": "OIDC Auth for Azure", "slug": "oidc-auth-azure", "path": "/documentation/platform/identities/oidc-auth/azure", "description": "Learn how to authenticate Azure services using OIDC.", "category": "Token-based" }, { "name": "OIDC Auth for CircleCI", "slug": "oidc-auth-circleci", "path": "/documentation/platform/identities/oidc-auth/circleci", "description": "Learn how to authenticate CircleCI workflows using OIDC.", "category": "Token-based" }, { "name": "OIDC Auth for Terraform Cloud", "slug": "oidc-auth-terraform", "path": "/documentation/platform/identities/oidc-auth/terraform-cloud", "description": "Learn how to authenticate Terraform Cloud using OIDC.", "category": "Token-based" }, { "name": "OIDC Auth for SPIRE", "slug": "oidc-auth-spire", "path": "/documentation/platform/identities/oidc-auth/spire", "description": "Learn how to authenticate workloads using SPIFFE/SPIRE OIDC.", "category": "Token-based" }, { "name": "TLS Certificate Auth", "slug": "tls-cert-auth", "path": "/documentation/platform/identities/tls-cert-auth", "description": "Learn how to authenticate machines using TLS client certificates.", "category": "Certificate-based" }, { "name": "LDAP Auth", "slug": "ldap-auth-general", "path": "/documentation/platform/identities/ldap-auth/general", "description": "Learn how to authenticate machines using LDAP credentials.", "category": "Directory-based" }, { "name": "LDAP Auth for JumpCloud", "slug": "ldap-auth-jumpcloud", "path": "/documentation/platform/identities/ldap-auth/jumpcloud", "description": "Learn how to authenticate machines using JumpCloud LDAP.", "category": "Directory-based" }].sort(function (a, b) { return a.name.toLowerCase().localeCompare(b.name.toLowerCase()); }); const filteredAuthMethods = useMemo(() => { let filtered = authMethods; if (selectedCategory !== 'All') { filtered = filtered.filter(method => method.category === selectedCategory); } if (searchTerm) { filtered = filtered.filter(method => method.name.toLowerCase().includes(searchTerm.toLowerCase()) || method.description.toLowerCase().includes(searchTerm.toLowerCase()) || method.category.toLowerCase().includes(searchTerm.toLowerCase())); } return filtered; }, [searchTerm, selectedCategory]); return
{}
setSearchTerm(e.target.value)} />
{}
{categories.map(category => )}
{}

{filteredAuthMethods.length} authentication method{filteredAuthMethods.length !== 1 ? 's' : ''} found {selectedCategory !== 'All' && ` in ${selectedCategory}`} {searchTerm && ` for "${searchTerm}"`}

{} {filteredAuthMethods.length > 0 ?
{filteredAuthMethods.map((method, index) =>

{method.name}

{method.category}

{method.description}

)}
:

No authentication methods found matching your criteria

{searchTerm &&

Try adjusting your search terms or filters

}
}
; }; --- # Source: https://infisical.com/docs/documentation/platform/identities/machine-identities.md > ## Documentation Index > Fetch the complete documentation index at: https://infisical.com/docs/llms.txt > Use this file to discover all available pages before exploring further. # Machine Identities > Learn how to use Machine Identities to programmatically interact with Infisical. ## Concept An Infisical machine identity is an entity that represents a workload or application that require access to various resources in Infisical. This is conceptually similar to an IAM user in AWS or service account in Google Cloud Platform (GCP). Each identity must authenticate with the Infisical API using a supported authentication method like [Token Auth](/documentation/platform/identities/token-auth), [Universal Auth](/documentation/platform/identities/universal-auth), [Kubernetes Auth](/documentation/platform/identities/kubernetes-auth), [AWS Auth](/documentation/platform/identities/aws-auth), [Azure Auth](/documentation/platform/identities/azure-auth), or [GCP Auth](/documentation/platform/identities/gcp-auth) to get back a short-lived access token to be used in subsequent requests. Organization Identities Key Features: * Role Assignment: Identities must be assigned [roles](/documentation/platform/access-controls/role-based-access-controls). These roles determine the scope of access to resources, either at the organization level or project level. * Auth/Token Configuration: Identities must be configured with corresponding authentication methods and access token properties to securely interact with the Infisical API. ## Scopes Identities can be created either at the organization-level or the project-level. Outside of identity management and scope of operation, organization and project identities are functionally identical. * Project identities are managed at the project-level and can only operate within their respective project. Project-level identities are useful for organizations that delegate responsibility to autonomous teams via projects. * Organization identities are managed at the organization-level and can be assigned to one or more projects, as well as perform organization-level operations. Organization-level identities are useful for organizations that have cross-project operations. ## Workflow A typical workflow for using project identities consists of three steps: 1. Creating the identity with a name and [role](/documentation/platform/access-controls/role-based-access-controls) in Project > Access Control > Machine Identities. This step also involves configuring an authentication method for it. 2. Authenticating the identity with the Infisical API based on the configured authentication method on it and receiving a short-lived access token back. 3. Authenticating subsequent requests with the Infisical API using the short-lived access token. A typical workflow for using organization identities consists of four steps: 1. Creating the identity with a name and [role](/documentation/platform/access-controls/role-based-access-controls) in Organization > Access Control > Machine Identities. This step also involves configuring an authentication method for it. 2. Adding the identity to the project(s) you want it to have access to. 3. Authenticating the identity with the Infisical API based on the configured authentication method on it and receiving a short-lived access token back. 4. Authenticating subsequent requests with the Infisical API using the short-lived access token. ## Authentication Methods To interact with various resources in Infisical, Machine Identities can authenticate with the Infisical API using: * [Token Auth](/documentation/platform/identities/token-auth): A platform-agnostic, simple authentication method suitable to authenticate with Infisical using a token. * [Universal Auth](/documentation/platform/identities/universal-auth): A platform-agnostic authentication method suitable to authenticate with Infisical using a Client ID and Client Secret. * [Kubernetes Auth](/documentation/platform/identities/kubernetes-auth): A Kubernetes-native authentication method for applications (e.g. pods). * [AWS Auth](/documentation/platform/identities/aws-auth): An AWS-native authentication method for AWS services (e.g. EC2, Lambda functions, etc.). * [Azure Auth](/documentation/platform/identities/azure-auth): An Azure-native authentication method for Azure resources (e.g. Azure VMs, Azure App Services, Azure Functions, Azure Kubernetes Service, etc.). * [GCP Auth](/documentation/platform/identities/gcp-auth): A GCP-native authentication method for GCP resources (e.g. Compute Engine, App Engine, Cloud Run, Google Kubernetes Engine, IAM service accounts, etc.). * [OIDC Auth](/documentation/platform/identities/oidc-auth): A platform-agnostic, JWT-based authentication method for workloads using an OpenID Connect identity provider. ## Identity Lockout Lockout is a feature that prevents brute-force attacks on identity login endpoints. Auth methods that support lockout include: [Universal Auth](/documentation/platform/identities/universal-auth), [LDAP Auth](/documentation/platform/identities/ldap-auth/general). Supported auth methods have lockout enabled by default. If triggered, lockout temporarily disables the login endpoint for 5 minutes after 3 consecutive failed login attempts within a 30-second window. Lockout can be configured and disabled in the identity auth method settings. ## FAQ Yes - Identities can be used with the CLI. You can learn more about how to do this in the CLI quickstart [here](/cli/usage). A service token is a project-level authentication method that is being deprecated in favor of identities. The service token method will be removed in the future in accordance with the deprecation notice and timeline stated [here](https://infisical.com/blog/deprecating-api-keys). Amongst many differences, identities provide broader access over the Infisical API, utilizes the same permission system as user identities, and come with a significantly larger number of configurable authentication and security features. If you're looking for a simple authentication method, similar to service tokens, that can be bound onto an identity, we recommend checking out [Token Auth](/documentation/platform/identities/token-auth). There are a few reasons for why this might happen: * You have insufficient organization permissions to create, read, update, delete identities. * The identity you are trying to read, update, or delete is more privileged than yourself. * The role you are trying to create an identity for or update an identity to is more privileged than yours. --- # Source: https://infisical.com/docs/documentation/platform/access-controls/abac/managing-machine-identity-attributes.md > ## Documentation Index > Fetch the complete documentation index at: https://infisical.com/docs/llms.txt > Use this file to discover all available pages before exploring further. # Machine identities > Learn how to set metadata and leverage authentication attributes for machine identities. Machine identities can have metadata set manually, just like users. In addition, during the machine authentication process (e.g., via OIDC), extra attributes called claims—are provided, which can be used in your ABAC policies. #### Setting Metadata on Machine Identities #### Accessing Attributes From Machine Identity Login When machine identities authenticate, they may receive additional payloads/attributes from the service provider. For methods like OIDC, these come as claims in the token and can be made available in your policies. 1. Navigate to the Identity Authentication settings and select the OIDC Auth Method. 2. In the **Advanced section**, locate the Claim Mapping configuration. 3. Map the OIDC claims to permission attributes by specifying: * **Attribute Name:** The identifier to be used in your policies (e.g., department). * **Claim Path:** The dot notation path to the claim in the OIDC token (e.g., user.department). For example, if your OIDC provider returns: ```json theme={"dark"} { "sub": "machine456", "name": "Service A", "user": { "department": "engineering", "role": "service" } } ``` You might map: * **department:** to `user.department` * **role:** to `user.role` Once configured, these attributes become available in your policies using the following format: ``` {{ identity.auth.oidc.claims. }} ``` For identities authenticated using Kubernetes, the service account's namespace and name are available in their policy and can be accessed as follows: ``` {{ identity.auth.kubernetes.namespace }} {{ identity.auth.kubernetes.name }} ``` For identities authenticated using AWS Auth, several attributes can be accessed. On top of the 3 base attributes, there's 4 derived from the ARN. The example below includes comments showing how each derived attribute looks like based on this ARN: `arn:aws:iam::123456789012:user/example-user` ``` {{ identity.auth.aws.accountId }} {{ identity.auth.aws.arn }} {{ identity.auth.aws.userId }} // Derived from ARN {{ identity.auth.aws.partition }} // aws {{ identity.auth.aws.service }} // iam {{ identity.auth.aws.resourceType }} // user {{ identity.auth.aws.resourceName }} // example-user ``` At the moment we only support OIDC claims, Kubernetes attributes, and AWS attributes. Payloads on other authentication methods are not yet accessible. --- # Source: https://infisical.com/docs/documentation/platform/access-controls/abac/managing-user-metadata.md > ## Documentation Index > Fetch the complete documentation index at: https://infisical.com/docs/llms.txt > Use this file to discover all available pages before exploring further. # Users identities > How to set and use metadata attributes on user identities for ABAC. User identities can have metadata attributes assigned directly. These attributes (such as location or department) are used to define dynamic access policies. #### Setting Metadata on Users For organizations using SAML for **user logins**, Infisical automatically maps metadata attributes from SAML assertions to user identities on every login. This enables dynamic policies based on the user's SAML attributes. #### Applying ABAC Policies with User Metadata Attribute-based access controls are currently only available for policies defined on Secrets Manager projects. You can set ABAC permissions to dynamically set access to environments, folders, secrets, and secret tags. In your policies, metadata values are accessed as follows: * **User ID:** `{{ identity.id }}` (always available) * **Username:** `{{ identity.username }}` (always available) * **Metadata Attributes:** `{{ identity.metadata. }}` (available if set) --- # Source: https://infisical.com/docs/documentation/platform/agent-sentinel/mcp-endpoints.md > ## Documentation Index > Fetch the complete documentation index at: https://infisical.com/docs/llms.txt > Use this file to discover all available pages before exploring further. # MCP Endpoints > Learn how to create and manage MCP endpoints for AI clients. ## Concept MCP Endpoints are the entry points that AI clients (like Claude, ChatGPT, or custom agents) use to access your configured MCP Servers. Instead of connecting AI clients directly to individual MCP servers, you connect them to an Infisical MCP Endpoint which acts as a secure gateway. This architecture provides several benefits: Combine tools from multiple MCP servers behind a single endpoint. Control exactly which tools are available through each endpoint. Manage who can use each endpoint. All tool invocations are logged regardless of which MCP server they target. Automatically redact sensitive data from requests and responses. Handle OAuth and token-based authentication for connected servers. ## How It Works ```mermaid theme={"dark"} graph LR A[AI Client
Claude, ChatGPT, etc.] --> B[MCP Endpoint
Infisical] B --> C[MCP Server 1
Notion] B --> D[MCP Server 2
GitHub] ``` When you create an MCP endpoint, Infisical generates a unique URL that you can add to your AI client's MCP configuration. The AI client connects to this URL and can access all enabled tools from the connected MCP servers. ## Guide to Creating an MCP Endpoint In the following steps, we explore how to create an MCP endpoint and connect it to an AI client. Head to your Agent Sentinel project and select **MCP Endpoints** from the sidebar, then click **Create Endpoint**. mcp endpoints list Enter the following details for your endpoint: * **Name**: A friendly name to identify this endpoint (e.g., "Engineering Team Endpoint") * **Description (Optional)**: A description of the endpoint's purpose * **Connected Servers**: A selection of the MCP servers to make available through this endpoint mcp endpoint create After creating the endpoint, you'll be taken to the endpoint details page. Here you can configure which tools from each connected server are available through this endpoint. For each connected MCP server, you'll see a list of available tools. Toggle tools on or off to control what AI clients can access. mcp endpoint tools By default, no tools are enabled. You must explicitly enable the tools you want to make available. The endpoint details page displays the **Endpoint URL**. Copy this URL—you'll need it to configure your AI client. mcp endpoint url ## Connecting AI Clients Once you have your endpoint URL, you can connect AI clients to it. Add the endpoint to your Claude MCP configuration: 1. Open Claude settings 2. Navigate to the MCP section 3. Add a new server with your Infisical endpoint URL 4. Click **Connect** When connecting for the first time, Claude will open an authorization page where you grant access to the endpoint. You can configure: * **Access Duration**: How long the AI client can use the endpoint (e.g., 30 days) After authorization, Claude can use all enabled tools from your endpoint. Any MCP-compatible AI client can connect to your endpoint using the endpoint URL. The general process is: 1. Locate the MCP server configuration in your AI client 2. Add your Infisical endpoint URL as a new server 3. Complete the authorization flow when prompted Refer to your AI client's documentation for specific configuration steps. ## Personal Credentials Authentication When an MCP endpoint includes servers configured with **Personal Credentials** mode, users must authenticate with each of those servers before they can connect to the endpoint. ### Authentication Flow When a user connects to an endpoint with servers requiring personal credentials: 1. **Authentication Prompt**: After authorizing access to the endpoint, users are shown a list of all MCP servers that require their personal credentials. mcp endpoints finalize personal incomplete 2. **Authenticate Each Server**: Users must authenticate with each server in the list. The authentication method depends on how the server was configured: * **OAuth**: Users are redirected to the service (e.g., GitHub, Notion) to authorize access * **Bearer Token**: Users enter their personal access token directly mcp endpoints finalize personal bearer 3. **Re-authentication**: Users can update their credentials for servers they've already authenticated with by clicking the **Re-authenticate** button. This is useful when tokens expire or when users want to switch accounts. 4. **Complete All Authentications**: Users must authenticate with **all** servers requiring personal credentials before they can proceed. The connection will only be established once all required authentications are complete. mcp endpoints finalize personal complete ## Access Control with Permission Conditions MCP endpoints support granular role-based access control through permission conditions. This allows you to restrict access to specific endpoints based on their name. ### Example Use Cases * **Team-specific endpoints**: Create a role that only allows access to endpoints matching `engineering-*` * **Environment separation**: Restrict production endpoints (`prod-*`) to senior team members ### Configuring Permission Conditions When creating or editing a project role, you can add conditions to MCP endpoint permissions: 1. Navigate to **Access Control** > **Roles** 2. Edit or create a role 3. Under **MCP Endpoints** permissions, click **Add Condition** 4. Select the **Endpoint Name** property 5. Choose an operator (`equal`, `not equal`, `glob match`, or `in`) 6. Enter the value(s) to match ### Supported Operators | Operator | Description | Example | | ------------ | ------------------- | ------------------------------ | | `equal` | Exact match | `engineering-tools` | | `not equal` | Does not match | `prod-endpoint` | | `glob match` | Pattern matching | `prod-*`, `*-internal` | | `in` | Matches any in list | `["endpoint-1", "endpoint-2"]` | ## PII Filtering MCP Endpoints support automatic PII (Personally Identifiable Information) filtering to redact sensitive data from requests sent to MCP servers and responses returned to AI clients. This helps maintain compliance and prevent accidental exposure of sensitive information through AI tool interactions. ### Supported PII Types | Type | Description | Redacted As | | ----------- | ------------------------- | ------------------------ | | Email | Email addresses | `[REDACTED_EMAIL]` | | Phone | Phone numbers (US format) | `[REDACTED_PHONE]` | | SSN | Social Security Numbers | `[REDACTED_SSN]` | | Credit Card | Credit card numbers | `[REDACTED_CREDIT_CARD]` | | IP Address | IPv4 and IPv6 addresses | `[REDACTED_IP]` | ### Configuring PII Filters Open your MCP endpoint and locate the **Filters** section in the left column. pii filters section Click the edit icon to open the PII filter configuration modal. pii filter config modal Configure the following options: * **Filter Requests**: Enable to redact PII from requests sent to MCP servers * **Filter Responses**: Enable to redact PII from responses returned to AI clients * **PII Detection**: Select which types of PII to detect and redact Click **Save** to apply your PII filter settings. Changes take effect immediately for new tool invocations. ## FAQ When PII filtering is enabled, Infisical scans request and/or response payloads using pattern matching to detect sensitive data. Detected PII is replaced with redaction placeholders (e.g., `[REDACTED_EMAIL]`) before the data is passed through. The original data is never stored or logged when filtering is enabled. Yes, you can enable PII filtering independently for requests (data sent to MCP servers) and responses (data returned to AI clients). This gives you granular control over where redaction is applied. Infisical currently supports detection and redaction of: email addresses, phone numbers (US format), Social Security Numbers, credit card numbers, and IP addresses (both IPv4 and IPv6). No. The selected PII types apply to both request and response filtering. If you need different filtering rules, consider creating separate endpoints. Yes, you can connect an MCP server to as many endpoints as needed. Each endpoint can have different tools enabled, allowing you to create different access profiles. When you disable a tool, AI clients connected to the endpoint will no longer be able to use it. The tool won't appear in the client's available tools list. When an AI client connects to an endpoint, the user chooses an access duration (e.g., 30 days). After this period, the client will need to re-authorize. Yes, you can revoke access by managing authorized sessions in the endpoint settings. This immediately disconnects the AI client. If a connected MCP server uses personal credentials, users will be prompted to authenticate when they first connect to the endpoint. The authentication method depends on how the server was configured: * **OAuth servers**: Users complete an OAuth authorization flow * **Bearer Token servers**: Users enter their personal access token directly This is a one-time process per server, and users can re-authenticate at any time if needed. --- # Source: https://infisical.com/docs/documentation/platform/agent-sentinel/concepts/mcp-overview.md > ## Documentation Index > Fetch the complete documentation index at: https://infisical.com/docs/llms.txt > Use this file to discover all available pages before exploring further. # Model Context Protocol > Learn what the Model Context Protocol is and how Infisical helps you manage it securely. ## What is the Model Context Protocol? The [Model Context Protocol (MCP)](https://modelcontextprotocol.io) is an open standard that enables AI assistants and agents to securely connect to external data sources and tools. It provides a unified way for AI systems to interact with services like Notion, GitHub, Slack, databases, and more. Think of MCP as a universal adapter between AI systems and the tools they need. Instead of building custom integrations for each AI platform and each tool, MCP provides a standardized protocol that any AI client can use to connect to any MCP-compatible server. ## How Does MCP Work? MCP follows a client-server architecture: * **MCP Clients**: AI applications like Claude, ChatGPT, or custom AI agents that need to access external tools. * **MCP Servers**: Services that expose tools and capabilities through the MCP protocol. These can be first-party servers (like Notion's official MCP server) or custom servers you build. When an AI assistant needs to perform an action—like searching Notion, creating a GitHub issue, or querying a database—it communicates with the appropriate MCP server using the standardized protocol. ## Why Do You Need Agent Sentinel? While MCP provides the protocol for AI-tool communication, it doesn't solve the governance and security challenges that organizations face: ### The Challenge * **Credential Sprawl**: Each user connecting AI tools to MCP servers manages their own credentials, creating security blind spots. * **No Visibility**: Organizations have no insight into what tools AI agents are using or what data they're accessing. * **Ungoverned Access**: Without centralized control, AI agents may access tools and data they shouldn't. * **Compliance Risk**: Audit requirements demand logging and monitoring of AI system activities. ### The Solution Infisical Agent Sentinel acts as a secure gateway between AI clients and MCP servers: ```mermaid theme={"dark"} graph LR A[AI Client] --> B[Infisical MCP Endpoint] B --> C[Notion] B --> D[GitHub] B --> E[Slack] ``` This architecture provides: 1. **Centralized Credential Management**: Store and manage MCP server credentials in one place. Choose between **shared credentials** (one credential for all users) or **personal credentials** (each user authenticates individually) based on your security and compliance needs. 2. **Tool Governance**: Control exactly which tools from each MCP server are available through your endpoints. 3. **Complete Audit Trail**: Every tool invocation is logged with full request/response details, user attribution, and timestamps. 4. **Access Control**: Leverage Infisical's existing access control mechanisms to manage who can use which endpoints. Learn more about [credential modes](/documentation/platform/agent-sentinel/mcp-servers#credential-modes) when configuring MCP servers. --- # Source: https://infisical.com/docs/documentation/platform/agent-sentinel/mcp-servers.md > ## Documentation Index > Fetch the complete documentation index at: https://infisical.com/docs/llms.txt > Use this file to discover all available pages before exploring further. # MCP Servers > Learn how to connect and manage MCP servers in Infisical. ## Concept MCP Servers are external services that expose tools and capabilities through the Model Context Protocol. By connecting MCP servers to Infisical, you can centrally manage access to tools like Notion, GitHub, Slack, and more. When you add an MCP server to Infisical, the platform discovers all available tools from that server and allows you to make them accessible through [MCP Endpoints](/documentation/platform/agent-sentinel/mcp-endpoints). ## Supported MCP Servers Infisical supports connecting to any remote MCP server that implements the Model Context Protocol over HTTP with OAuth or Bearer Token authentication. Popular MCP servers include: * **Notion** - Search, create, and manage Notion pages and databases * **GitHub** - Manage repositories, issues, pull requests, and more * **Slack** - Send messages, manage channels, and interact with workspaces * **Google Drive** - Access and manage files and documents * **Linear** - Manage issues and projects Infisical connects to MCP servers over HTTP using the standard remote MCP protocol. ## Authentication MCP servers require authentication to access their tools. Infisical supports two authentication methods: The server uses OAuth 2.0 for authentication. Users are redirected to the service to authorize access. **Best for:** Services with full OAuth support like Notion, GitHub, Google. Users provide their own API token or access token directly. **Best for:** Services where users have existing API tokens, or services without OAuth support. Some MCP servers with OAuth support **Dynamic Client Registration**, which means Infisical can automatically register as an OAuth client. For servers that don't support this (like GitHub), you'll need to manually create an OAuth application and provide the client credentials. ## Credential Modes When adding an MCP server, you choose how credentials are managed: You (the administrator) authorize the MCP server once, and all users who access tools through this server use your credentials. **Best for:** Shared service accounts, servers without per-user permissions, simplified management. Each user must authenticate with the MCP server individually before using its tools. Their credentials are stored securely by Infisical. **Best for:** Per-user audit trails, user-specific permissions, compliance requirements. When using **Personal Credentials** mode, the administrator setting up the MCP server must still authenticate during setup. This initial authentication is required to fetch and discover the available tools from the server. ## Gateway Support By default, Infisical connects directly to MCP servers over the internet. For MCP servers hosted on private networks (internal APIs, self-hosted services), you can route connections through a [Gateway](/documentation/platform/gateways/overview). OAuth is not supported when using a gateway. Only Bearer Token authentication is available. Gateways enable you to: * Connect to MCP servers on private networks without exposing them to the internet * Access self-hosted MCP servers within VPCs or on-premises infrastructure * Maintain network isolation while enabling AI tool access ## Guide to Adding an MCP Server In the following steps, we explore how to add an MCP server to your Agent Sentinel project. Head to your Agent Sentinel project and select **MCP Servers** from the sidebar, then click **Add MCP Server**. mcp servers list Enter the following details for your MCP server: * **Name**: A friendly name to identify this server (e.g., "Notion", "GitHub") * **URL**: The MCP server endpoint URL (e.g., `https://mcp.notion.com/mcp`) * **Gateway** (optional): Select a gateway to route connections through a private network. Leave as "Internet Gateway" for public MCP servers * **Credential Mode**: Choose between **Shared Credentials** or **Personal Credentials** mcp server add Choose the authentication method for your MCP server: * For servers with Dynamic Client Registration (e.g., Notion): Click **Authorize** to complete the OAuth flow * For servers without Dynamic Client Registration (e.g., GitHub): Enter the **Client ID** and **Client Secret**, then click **Authorize** mcp server auth * Select **Bearer Token** as the authentication method * Users will be prompted to enter their personal access token when connecting to endpoints that include this server mcp server add bearer After authorization, Infisical discovers and displays all tools available from the MCP server. You can view each tool's name and description. These tools can now be enabled in [MCP Endpoints](/documentation/platform/agent-sentinel/mcp-endpoints). mcp server tools ## FAQ Each MCP server provider publishes their endpoint URL. Common examples: * **Notion**: `https://mcp.notion.com/mcp` * **GitHub**: `https://api.githubcopilot.com/mcp/` Check the service's MCP documentation for the correct URL. 1. Go to GitHub Settings → Developer settings → OAuth Apps 2. Click "New OAuth App" 3. Set the Authorization callback URL to your Infisical instance 4. Copy the Client ID and generate a Client Secret 5. Use these credentials when adding the GitHub MCP server Yes, you can update the credential mode by editing the MCP server configuration. Note that changing from shared to personal credentials will require users to re-authenticate. If an MCP server becomes unavailable, tool invocations through endpoints connected to that server will fail. The Activity Logs will capture these failures for troubleshooting. Use **OAuth** when: * The MCP server supports OAuth 2.0 * You want automatic token refresh * The service has a native OAuth integration Use **Bearer Token** when: * Users already have API tokens they want to use * The MCP server doesn't support OAuth * You need a simpler authentication flow Use a gateway when your MCP server is: * Hosted on a private network (VPC, on-premises) * Not accessible from the public internet * A self-hosted service that should not be exposed externally For public MCP servers like Notion or GitHub, use the default "Internet Gateway" option. No, only Bearer Token authentication is supported when using a gateway. If you choose Personal Credentials mode, each user can provide their own token when connecting to an MCP endpoint. --- # Source: https://infisical.com/docs/api-reference/endpoints/project-users/memberships.md # Source: https://infisical.com/docs/api-reference/endpoints/organizations/memberships.md # Source: https://infisical.com/docs/api-reference/endpoints/deprecated/project-users/memberships.md > ## Documentation Index > Fetch the complete documentation index at: https://infisical.com/docs/llms.txt > Use this file to discover all available pages before exploring further. # Get User Memberships > Return project user memberships ## OpenAPI ````yaml GET /api/v1/workspace/{workspaceId}/memberships openapi: 3.0.3 info: title: Infisical API description: List of all available APIs that can be consumed version: 0.0.1 servers: - url: https://us.infisical.com description: Production server (US) - url: https://eu.infisical.com description: Production server (EU) - url: http://localhost:8080 description: Local server security: [] paths: /api/v1/workspace/{workspaceId}/memberships: get: tags: - Project Users description: Return project user memberships parameters: - schema: type: string in: path name: workspaceId required: true description: The ID of the project to get memberships from. responses: '200': description: Default Response content: application/json: schema: type: object properties: memberships: type: array items: type: object properties: id: type: string format: uuid createdAt: type: string format: date-time userId: type: string format: uuid projectId: type: string user: type: object properties: email: type: string nullable: true firstName: type: string nullable: true lastName: type: string nullable: true id: type: string format: uuid username: type: string publicKey: type: string nullable: true required: - id - username additionalProperties: false roles: type: array items: type: object properties: id: type: string role: type: string customRoleId: type: string nullable: true customRoleName: type: string nullable: true customRoleSlug: type: string nullable: true isTemporary: type: boolean temporaryMode: type: string nullable: true temporaryRange: type: string nullable: true temporaryAccessStartTime: type: string format: date-time nullable: true temporaryAccessEndTime: type: string format: date-time nullable: true required: - id - role - isTemporary additionalProperties: false required: - id - createdAt - userId - projectId - user - roles additionalProperties: false required: - memberships additionalProperties: false '400': description: Default Response content: application/json: schema: type: object properties: reqId: type: string statusCode: type: number enum: - 400 message: type: string error: type: string details: {} required: - reqId - statusCode - message - error additionalProperties: false '401': description: Default Response content: application/json: schema: type: object properties: reqId: type: string statusCode: type: number enum: - 401 message: type: string error: type: string required: - reqId - statusCode - message - error additionalProperties: false '403': description: Default Response content: application/json: schema: type: object properties: reqId: type: string statusCode: type: number enum: - 403 message: type: string details: {} error: type: string required: - reqId - statusCode - message - error additionalProperties: false '404': description: Default Response content: application/json: schema: type: object properties: reqId: type: string statusCode: type: number enum: - 404 message: type: string error: type: string required: - reqId - statusCode - message - error additionalProperties: false '422': description: Default Response content: application/json: schema: type: object properties: reqId: type: string statusCode: type: number enum: - 422 message: {} error: type: string required: - reqId - statusCode - error additionalProperties: false '500': description: Default Response content: application/json: schema: type: object properties: reqId: type: string statusCode: type: number enum: - 500 message: type: string error: type: string required: - reqId - statusCode - message - error additionalProperties: false security: - bearerAuth: [] components: securitySchemes: bearerAuth: type: http scheme: bearer bearerFormat: JWT description: An access token in Infisical ```` --- # Source: https://infisical.com/docs/documentation/platform/mfa.md > ## Documentation Index > Fetch the complete documentation index at: https://infisical.com/docs/llms.txt > Use this file to discover all available pages before exploring further. # Multi-factor Authentication > Learn how to secure your Infisical account with MFA. MFA requires users to provide multiple forms of identification to access their account. ## Email 2FA If 2-factor authentication is enabled in the Personal settings page, email will be used for MFA by default. Email-based MFA ## Mobile Authenticator 2FA You can use any mobile authenticator app (Authy, Google Authenticator, Duo, etc.) to secure your account. After registration with an authenticator, select **Mobile Authenticator** as your 2FA method. Authenticator-based MFA ## Entra ID / Azure AD MFA Before proceeding make sure you've enabled [SAML SSO for Entra ID / Azure AD](./sso/azure). We also encourage you to have your team download and setup the [Microsoft Authenticator App](https://www.microsoft.com/en-us/security/mobile-authenticator-app) prior to enabling MFA. Entra Infisical
    app conditional
    access create policy require MFA and review
    policy By default all users except the configuring admin will be setup to require MFA. Microsoft encourages keeping at least one admin excluded from MFA to prevent accidental lockout. enable policy and
    confirm mfa login If users have not setup MFA for Entra / Azure they will be prompted to do so at this time. --- # Source: https://infisical.com/docs/documentation/guides/microsoft-power-apps.md > ## Documentation Index > Fetch the complete documentation index at: https://infisical.com/docs/llms.txt > Use this file to discover all available pages before exploring further. # Microsoft Power Apps > Learn how to manage secrets in Microsoft Power Apps with Infisical. In recent years, there has been a shift towards so-called low-code and no-code platforms. These platforms are particularly appealing to businesses without internal development capabilities, yet teams often discover that some coding is necessary to fully satisfy their business needs. Low-code platforms have become increasingly sophisticated and useful, leading to a rise in their adoption by businesses. A prime example is Microsoft Power Apps, which offers a range of data sources and service integrations right out of the box. However, even with advanced tools, you might not always find a ready-made solution for every challenge. This means that low-code doesn't equate to no-code, as some coding and customization are still required to cater to specific needs. Consider the need for data integrations where an HTTP-based call to a web service might be necessary, typically requiring authentication through an API key or another type of secret. Importantly, it's crucial to avoid hardcoding these secrets, as they would then be accessible to anyone with collaboration rights to the code. This underscores the importance of using a secret management solution like Infisical. In this article, we'll demonstrate how to retrieve app secrets from Infisical for use in a Power Apps application. We'll create a simple application with a dedicated data connector to illustrate the ease of integrating Infisical with Power Apps. This tutorial assumes some prior programming experience in C#. Prerequisites: * Created Microsoft Power App. First, let’s create a new Azure Function using the Azure Management Portal. Get the [Function App](https://azuremarketplace.microsoft.com/en-us/marketplace/apps/Microsoft.FunctionApp?tab=Overview) from the [Azure Marketplace](https://azuremarketplace.microsoft.com/en-us/). function app Place it in a subscription using any resource group. The name of the function is arbitrary. We'll use .NET as a runtime stack, but you can use whatever you're most comfortable with. The OS choice is also up to you. While Linux may look like a lightweight solution, Windows actually has more Azure Functions support. For instance, you cannot edit a Linux-based Azure Function within the Azure management portal. By using a consumption plan, we'll only pay for the resources we use when they are requested. This is the classic “serverless” approach, where you do not pay for running servers, only for interactivity. Once the new Azure Functions instance is ready, we add a function. In this case, we can do that already from the Azure Management Portal. Use the “HTTP trigger” template and choose the “function” authorization level. The code for the first function can be as simple as: ``` using System.Net; public static async Task Run(HttpRequestMessage req, TraceWriter log) { log.Info("C# HTTP trigger function processed a request."); return req.CreateResponse(HttpStatusCode.OK, "Hello World"); } ``` The code above is written for the older runtime. As a result, you may need to change the runtime version to 1 for the Azure Power Apps integration to work. If we start at a newer version (for example, 3) this triggers a warning before the migration. Finally, we also need to publish the Swagger (or API) definitions and enable cross-origin resource sharing (CORS). While the API definitions are rather easy to set up, the correct CORS value may be tricky. For now, we can use the wildcard option to allow all hosts. Once we set all this up, it’s time to create the custom connector. You can create the custom connector via the data pane. When we use “Create from Azure Service (Preview)”, this yields a dialog similar to the following: custom-connector We can now fill out the fields using the information for our created function. The combination boxes are automatically filled in order. Once we select one of the reachable subscriptions (tied to the same account we’ve used to log in to create a Power App), the available services are displayed. Once we select our Azure Functions service, we select the function for retrieving the secret. You can add Infisical in an Azure Function quite easily using the [Infisical SDK for .NET](https://infisical.com/docs/sdks/languages/csharp) (or other languages). This enables the function to communicate with Infisical to obtain secrets, among other things. In short, we can simply bring all the necessary classes over and start using the Client class. Essentially, this enables us to write code like this: ``` var settings = new ClientSettings { ClientId = "CLIENT_ID", ClientSecret = "CLIENT_SECRET", // SiteUrl = "http://localhost:8080", <-- This line can be omitted if you're using Infisical Cloud. }; var infisical = new InfisicalClient(settings); var options = new GetSecretOptions { SecretName = "TEST", ProjectId = "PROJECT_ID", Environment = "dev", }; var secret = infisical.GetSecret(options); ``` Knowing the URL of Infisical as well as the Client Id and Client Secret, we can now access the desired values. Now it’s time to actually use the secret within a Power App. There are two ways to request a desired target service with a secret retrieved from the function: 1. Call the function first, retrieve the secret, then call the target service, for example, via another custom connector with the secret as input. 2. Perform the final API request within the function call — not returning a secret at all, just the response from invoking the target service. While the first option is more flexible (and presumably cheaper!), the second option is definitely easier. In the end, you should mostly decide based on whether the function should be reused for other purposes. If the single Power App is the only consumer of the function, it may make more sense to go with the second option. Otherwise, you should use the first option. For our simple example, we don’t need to reuse the function. We also don’t want the additional complexity of maintaining two different custom connectors, where we only use one to pass data to the other one. Based on the previous snippet, we create the following code (for proxying a GET request from an API accessible via the URL specified in the apiEndpoint variable). ``` using (var client = new HttpClient()) { client.DefaultRequestHeaders .Accept .Add(new MediaTypeWithQualityHeaderValue("application/json")); client.DefaultRequestHeaders.Add("X-API-KEY", secret); var result = await client.GetAsync(apiEndpoint); var resultContent = await result.Content.ReadAsStringAsync(); req.CreateResponse(HttpStatusCode.OK, resultContent); } ``` This creates a request to the resource protected by an API key that is retrieved from Infisical. --- # Source: https://infisical.com/docs/documentation/platform/workflow-integrations/microsoft-teams-integration.md > ## Documentation Index > Fetch the complete documentation index at: https://infisical.com/docs/llms.txt > Use this file to discover all available pages before exploring further. # Microsoft Teams Integration > Learn how to setup the Microsoft Teams integration This guide will provide step by step instructions on how to configure Microsoft Teams integration for your Infisical projects. ## Setting up Microsoft Teams integration in your projects ### Create Microsoft Teams workflow integration Currently, Infisical requires you to install a custom Microsoft Teams app into your Microsoft Teams tenant. You can download the Infisical Microsoft Teams app package here: * [Infisical Microsoft Teams app package](https://infisical-microsoft-teams-app.s3.us-east-1.amazonaws.com/Infisical.zip) **Important for self-hosted users:** If you're self-hosting Infisical, you can skip the download step. Instead you should use the app package file you downloaded from the Microsoft Teams Developer Portal when you followed the Self-hosted guide. Once you've downloaded the app package, you can install the app in your Microsoft Teams tenant by navigating to the **Apps** > **Upload a custom app** page, and selecting the "Upload an app" button. microsoft-teams-install-app microsoft-teams-submit-app Once the app has been submitted, your Microsoft Teams tenant admin will need to approve the app in the [Microsoft Teams Admin Center](https://admin.teams.microsoft.com/policies/manage-apps). After the app has been approved, it can take a few hours *(up to 24 hours in some cases)* for Microsoft Teams to reflect the new app. During this period, the Infisical app will not be visible in Microsoft Teams, and won't be usable. Once the app has been approved, you will be able to use the Infisical Microsoft Teams integration in your projects. Once the app has been approved and installed in your Microsoft Teams tenant, you can add the app to your Microsoft Teams teams. microsoft-teams-add-app Navigate to **Apps** > **Built for your org**, select the "Infisical" app, and press the "Add" button to select the teams and channels you wish to add the app to. This can also be done later through the [Microsoft Teams Admin Center](https://admin.teams.microsoft.com/policies/manage-apps), or through the Microsoft Teams client itself by navigating to the individual team's app settings. Once the app has been added to the team, you will be able to use the Infisical Microsoft Teams integration in the team. After installing the Microsoft Teams app, you are now ready to configure the Microsoft Teams integration within Infisical. Navigate to the **Workflow Integrations** tab in your organization settings, and press the "Add" button. org-integrations-overview In order to use the Infisical Microsoft Teams integration, you will need to grant admin consent to the app. Once the consent is granted, the Microsoft Teams workflow integration will be created in your Infisical organization. Press the "Add" button and select the "Microsoft Teams" platform option. add-microsoft-teams-integration Select the Microsoft Teams integration you wish to configure, and press the "Configure" button. Here you will be prompted to enter an alias, tenant ID, and an optional description for your workflow integration. The tenant ID is the ID of the Microsoft 365 / Azure AD tenant that you installed the Infisical Microsoft Teams app in, in the previous steps. configure-microsoft-teams-integration Press the "Create Microsoft Teams Integration" button, and you'll be navigated to the Azure AD consent page. microsoft-consent-page Please note that you must be a privileged administrator user of your Microsoft 365 / Azure AD tenant in order to grant admin consent to the app. Once you've granted admin consent, you'll be navigated back to the Infisical organization settings, where you can now select the Microsoft Teams integration you just created. microsoft-teams-workflow-integration-created ### Configure project to use Microsoft Teams workflow integration To add a new Microsoft Teams workflow integration, navigate to **Project Settings** > **Workflow Integrations** and press the "Add". project-settings-workflow-integrations Select the "Microsoft Teams" option from the list of available workflow integrations. Your project will send notifications to the connected Microsoft Teams team of the selected Microsoft Teams integration when the configured events are triggered. Press the "Save" button to save your Microsoft Teams workflow integration. infisical-project-microsoft-teams-integration-save Once you've created the project Microsoft Teams workflow integration, you will now receive Access Requests and Secret Approval Requests notifications in Microsoft Teams according to your configuration. ### Configure Azure Resources To create a Microsoft Teams bot, you must first create an Azure Bot from the Azure Marketplace, an app registration, and a Microsoft Teams app. The steps below document in detail how to create and configure these resources. Navigate to the [Microsoft Teams Developer Portal](https://dev.teams.microsoft.com/). Once you're on the Microsoft Teams Developer Portal, press the "Create a new app" button on the overview page. Give the bot a name and press the "Add" button. microsoft-dev-portal After creating the Microsoft Teams app, you'll need to create a Microsoft Teams bot. Navigate to the app's bot settings page and click "Create a new bot". microsoft-dev-portal-create-bot microsoft-dev-portal-create-bot-2 After clicking the "Create a new bot" button, you'll be navigated to the Teams Developer Portal for bot management. Press the "New bot" button, and enter the name of the bot. Please keep in mind that the name of the bot can only contain alphanumeric characters, dashes, and underscores. microsoft-dev-portal-create-bot-3 After creating the bot, you'll need to add a message endpoint to the bot. Navigate to the "Configure" tab, and input the following endpoint under "Endpoint address": `https:///api/v1/workflow-integrations/microsoft-teams/message-endpoint` Replace `` with the URL of your Infisical instance. Press the "Save" button to save the changes. microsoft-dev-portal-create-bot-4 When you create a bot through the Teams Developer Portal, an Azure App Registration is also created. Open your [Azure Portal](https://portal.azure.com/) and navigate to the "App Registrations" section to find the newly created app registration. The name of the app registration will be the same as the name of the bot you created in the previous step. Press the app registration to open the app registration overview page. azure-app-registrations Navigate to the "API Permissions" section of the app registration, and add the following permissions: * `AppCatalog.Read.All` * `ChannelSettings.Read.All` * `MultiTenantOrganization.Read.All` * `Organization.Read.All` * `Team.ReadBasic.All` * `TeamsAppInstallation.Read.All` After adding the API permissions, press the "Grant admin consent" button to grant the permissions. azure-app-registration-api-permissions Navigate to the "Authentication" section of the App Registration, and press the "Add a platform" button. Select the "Web" platform and enter the following redirect URI: `https:///organization/settings/oauth/callback`. Replace `` with the URL of your Infisical instance. azure-app-registration-register-callback Next we need to get the application client ID and create a new client secret. **Save these values for later, as they're required to configure the Microsoft Teams integration in Infisical.** **Get the Application (Client) ID** To get the Application (Client) ID, press the "Copy" button next to the "Application (client) ID" field. copy-client-id **Create a new client secret** Create a new client secret within the app registration. Navigate to the "Certificates & Secrets" section of the app registration, and press the "New client secret" button. create-client-secret Remember to rotate your client secret before it expires. Consider setting up a reminder or automated process to replace the secret and update your Infisical configuration before expiration. Navigate back to the [Microsoft Teams Developer Portal](https://dev.teams.microsoft.com/), and press the "Apps" tab and select the app you created earlier. Here you can find the Microsoft Teams App ID in the overview page, which you need to copy and save for later. microsoft-teams-app-id You need to link the Microsoft Teams App with the bot/app registration you created earlier. Inside the [Microsoft Teams Developer Portal](https://dev.teams.microsoft.com/), navigate to the "Bot" tab and select the bot you created earlier. Navigate to the "App Features" section, and press the "Bot" button. Under the "What can your bot do?" section, enable `Only send notifications (one-way conversations)`. Under the "Select the scopes where people can use your bot" section, select `Personal`, `Team`, and `Group Chat`. Finally, press the "Save" button to save the changes. microsoft-teams-app-features microsoft-teams-configure-bot To ensure that the Microsoft Teams App is working correctly, you can run an app validation test. This step is optional, but recommended to ensure the app is working correctly. You should expect to see two errors related to sending welcome messages, because we haven't configured the Microsoft Teams App inside Infisical yet, which is required for proactive messages. microsoft-teams-app-validation-test You may see manifest validation errors. Before running an app validation test, you must ensure that your app has all errors resolved, such as having a description and a valid name. microsoft-teams-app-validation-test-results If you see two errors for bot welcome messages, you can ignore them. This is expected until you configure the Microsoft Teams App inside Infisical. Once the Microsoft Teams App is working correctly, you can download the app package by navigating to the "Publish to Store" page, and pressing the "Download app package" button. microsoft-teams-download-app-package ### Configure Microsoft Teams Bot in Infisical After creating the Microsoft Teams App and Bot, you are ready to configure the Microsoft Teams integration in Infisical. Please note that you must be an instance admin in order to configure the Microsoft Teams instance-wide settings. server-admin-console-tab infisical-instance-configure-microsoft-teams Enter the values you saved from the earlier steps into the respective fields. * **Application (Client) ID**: The Client ID of the App Registration from the previous steps. * **Client Secret**: The Client Secret of the App Registration from the previous steps. * **Microsoft Teams App ID**: The App ID of the Microsoft Teams App from the previous steps. Once completed, press the "Save" button to save your changes. ### Create Microsoft Teams workflow integration Currently, Infisical requires you to install a custom Microsoft Teams app into your Microsoft Teams tenant. You can download the Infisical Microsoft Teams app package here: * [Infisical Microsoft Teams app package](https://infisical-microsoft-teams-app.s3.us-east-1.amazonaws.com/Infisical.zip) **Important for self-hosted users:** If you're self-hosting Infisical, you can skip the download step. Instead you should use the app package file you downloaded from the Microsoft Teams Developer Portal when you followed the Self-hosted guide. Once you've downloaded the app package, you can install the app in your Microsoft Teams tenant by navigating to the **Apps** > **Upload a custom app** page, and selecting the "Upload an app" button. microsoft-teams-install-app microsoft-teams-submit-app Once the app has been submitted, your Microsoft Teams tenant admin will need to approve the app in the [Microsoft Teams Admin Center](https://admin.teams.microsoft.com/policies/manage-apps). After the app has been approved, it can take a few hours *(up to 24 hours in some cases)* for Microsoft Teams to reflect the new app. During this period, the Infisical app will not be visible in Microsoft Teams, and won't be usable. Once the app has been approved, you will be able to use the Infisical Microsoft Teams integration in your projects. Once the app has been approved and installed in your Microsoft Teams tenant, you can add the app to your Microsoft Teams teams. microsoft-teams-add-app Navigate to **Apps** > **Built for your org**, select the "Infisical" app, and press the "Add" button to select the teams and channels you wish to add the app to. This can also be done later through the [Microsoft Teams Admin Center](https://admin.teams.microsoft.com/policies/manage-apps), or through the Microsoft Teams client itself by navigating to the individual team's app settings. Once the app has been added to the team, you will be able to use the Infisical Microsoft Teams integration in the team. After installing the Microsoft Teams app, you are now ready to configure the Microsoft Teams integration within Infisical. Navigate to the **Workflow Integrations** tab in your organization settings, and press the "Add" button. org-integrations-overview In order to use the Infisical Microsoft Teams integration, you will need to grant admin consent to the app. Once the consent is granted, the Microsoft Teams workflow integration will be created in your Infisical organization. Press the "Add" button and select the "Microsoft Teams" platform option. add-microsoft-teams-integration Select the Microsoft Teams integration you wish to configure, and press the "Configure" button. Here you will be prompted to enter an alias, tenant ID, and an optional description for your workflow integration. The tenant ID is the ID of the Microsoft 365 / Azure AD tenant that you installed the Infisical Microsoft Teams app in, in the previous steps. configure-microsoft-teams-integration Press the "Create Microsoft Teams Integration" button, and you'll be navigated to the Azure AD consent page. microsoft-consent-page Please note that you must be a privileged administrator user of your Microsoft 365 / Azure AD tenant in order to grant admin consent to the app. Once you've granted admin consent, you'll be navigated back to the Infisical organization settings, where you can now select the Microsoft Teams integration you just created. microsoft-teams-workflow-integration-created ### Configure project to use Microsoft Teams workflow integration To add a new Microsoft Teams workflow integration, navigate to **Project Settings** > **Workflow Integrations** and press the "Add". project-settings-workflow-integrations Select the "Microsoft Teams" option from the list of available workflow integrations. Your project will send notifications to the connected Microsoft Teams team of the selected Microsoft Teams integration when the configured events are triggered. Press the "Save" button to save your Microsoft Teams workflow integration. infisical-project-microsoft-teams-integration-save Once you've created the project Microsoft Teams workflow integration, you will now receive Access Requests and Secret Approval Requests notifications in Microsoft Teams according to your configuration. ## Troubleshooting If you recently added the Microsoft Teams app to your tenant, **it may take up to 24 hours for Microsoft Teams to propagate the changes.** A common indication of propagation issues is that the workflow integration is shown as "Installed", and you're able to view the teams and channels when configuring the workflow integration on your project, but no notification is being sent. The workflow integration can get stuck on Pending if you created the workflow integration before the Infisical Microsoft Teams bot was installed in the tenant. To resolve this, make sure you have installed the Infisical Microsoft Teams app in your tenant. You can manually recheck the installation status by pressing the "Check Installation Status" button in the workflow organization settings. microsoft-teams-check-installation-status --- # Source: https://infisical.com/docs/internals/permissions/migration.md > ## Documentation Index > Fetch the complete documentation index at: https://infisical.com/docs/llms.txt > Use this file to discover all available pages before exploring further. # Migration Guide > Guide for migrating permissions in Infisical # Migrating from Permission V1 to Permission V2 This guide provides instructions for upgrading from the legacy V1 permissions system to the more powerful V2 permissions system in Infisical. ## Why Upgrade to V2? The V2 permissions system offers several advantages over V1: * **More granular control**: Separate permissions for different secret-related resources * **Explicit deny rules**: Support for permission inversion * **Conditional permissions**: Apply permissions based on specific criteria * **Array-based actions**: Cleaner syntax for multiple actions ## Migration Steps When upgrading to V2 permissions (i.e., when moving from using the `permissions` to `permissions_v2` field in your Terraform configurations, or upgrading to the V2 permission API), you'll need to update your permission structure as follows: ### 1. Expand Secret Permissions Any permissions for `secrets` should be expanded to include equivalent permissions for: * `secret-imports` * `secret-folders` (except for read permissions) * `dynamic-secrets` ### 2. Map Dynamic Secret Actions For dynamic secrets, the actions need to be mapped differently: | V1 Action | V2 Action | | --------- | ----------------------------------------------------- | | `read` | `read-root-credential` | | `create` | `create-root-credential` | | `edit` | `edit-root-credential` (also adds `lease` permission) | | `delete` | `delete-root-credential` | ### 3. Update Configuration Format V2 permissions use a different syntax, with actions stored in arrays and an optional `inverted` flag: ```typescript theme={"dark"} // V1 format (single action) { subject: "secrets", action: "read" } // V2 format (array of actions) { subject: "secrets", action: ["read"], inverted: false // Optional, defaults to false } ``` ## Example Migration Here's a complete example showing how to migrate a role from V1 to V2: ```hcl theme={"dark"} # Old V1 configuration resource "infisical_project_role" "example" { name = "example" permissions = [ { subject = "secrets" action = "read" }, { subject = "secrets" action = "edit" } ] } # New V2 configuration resource "infisical_project_role" "example" { name = "example" permissions_v2 = [ # Original secrets permission { subject = "secrets" action = ["read", "edit"] inverted = false }, # Add equivalent secret-imports permission { subject = "secret-imports" action = ["read", "edit"] inverted = false }, # Add secret-folders permission (without read) { subject = "secret-folders" action = ["edit"] inverted = false }, # Add dynamic-secrets permission with mapped actions { subject = "dynamic-secrets" action = ["read-root-credential", "edit-root-credential", "lease"] inverted = false } ] } ``` ## Important Considerations * When moving to V2 permissions, make sure to include all the necessary expanded permissions based on your original `secrets` permissions. * V2 permissions give you the ability to use conditions and inversion, which are not available in V1. * During migration, review your existing roles and consider if more granular permissions would better fit your security requirements. * Test your migrated permissions thoroughly in a non-production environment before deploying to production. --- # Source: https://infisical.com/docs/documentation/platform/dynamic-secrets/mongo-atlas.md > ## Documentation Index > Fetch the complete documentation index at: https://infisical.com/docs/llms.txt > Use this file to discover all available pages before exploring further. # Mongo Atlas > Learn how to dynamically generate Mongo Atlas Database user credentials. The Infisical Mongo Atlas dynamic secret allows you to generate Mongo Atlas Database credentials on demand based on configured role. ## Prerequisite Create a project scoped API Key with the required permission in your Mongo Atlas following the [official doc](https://www.mongodb.com/docs/atlas/configure-api-access/#grant-programmatic-access-to-a-project). The API Key must have permission to manage users in the project. ## Set up Dynamic Secrets with Mongo Atlas Open the Secret Overview dashboard and select the environment in which you would like to add a dynamic secret. Add Dynamic Secret Button Dynamic Secret Modal Name by which you want the secret to be referenced Default time-to-live for a generated secret (it is possible to modify this value after a secret is generated) Maximum time-to-live for a generated secret The public key of your generated Atlas API Key. This acts as a username. The private key of your generated Atlas API Key. This acts as a password. Unique 24-hexadecimal digit string that identifies your project. This is same as project id List that provides the pairings of one role with one applicable database. * **Database Name**: Database to which the user is granted access privileges. * **Collection**: Collection on which this role applies. * **Role Name**: Human-readable label that identifies a group of privileges assigned to a database user. This value can either be a built-in role or a custom role. * Enum: `atlasAdmin` `backup` `clusterMonitor` `dbAdmin` `dbAdminAnyDatabase` `enableSharding` `read` `readAnyDatabase` `readWrite` `readWriteAnyDatabase` ``. Dynamic Secret Setup Modal Modify Scope Modal Specifies a template for generating usernames. This field allows customization of how usernames are automatically created. Allowed template variables are: * `{{randomUsername}}`: Random username string. * `{{unixTimestamp}}`: Current Unix timestamp at the time of lease creation. * `{{identity.name}}`: Name of the identity that is generating the lease. * `{{dynamicSecret.name}}`: Name of the associated dynamic secret. * `{{dynamicSecret.type}}`: Type of the associated dynamic secret. * `{{random N}}`: Random string of N characters. Allowed template functions are: * `truncate`: Truncates a string to a specified length. * `replace`: Replaces a substring with another value. * `uppercase`: Converts a string to uppercase. * `lowercase`: Converts a string to lowercase. Examples: ```yaml theme={"dark"} {{ randomUsername }} // 3POnzeFyK9gW2nioK0q2gMjr6CZqsRiX {{ unixTimestamp }} // 17490641580 {{ identity.name }} // {{ random 5 }} // x9K2m {{ truncate identity.name 4 }} // test {{ replace identity.name '' 'new-value' }} // new-value ``` List that contains clusters, MongoDB Atlas Data Lakes, and MongoDB Atlas Streams Instances that this database user can access. If omitted, MongoDB Cloud grants the database user access to all the clusters, MongoDB Atlas Data Lakes, and MongoDB Atlas Streams Instances in the project. * **Label**: Human-readable label that identifies the cluster or MongoDB Atlas Data Lake that this database user can access. * **Type**: Category of resource that this database user can access. After submitting the form, you will see a dynamic secret created in the dashboard. If this step fails, you may have to add the CA certificate. Dynamic Secret Once you've successfully configured the dynamic secret, you're ready to generate on-demand credentials. To do this, simply click on the 'Generate' button which appears when hovering over the dynamic secret item. Alternatively, you can initiate the creation of a new lease by selecting 'New Lease' from the dynamic secret lease list section. Dynamic Secret Dynamic Secret When generating these secrets, it's important to specify a Time-to-Live (TTL) duration. This will dictate how long the credentials are valid for. Provision Lease Ensure that the TTL for the lease falls within the maximum TTL defined when configuring the dynamic secret. Once you click the `Submit` button, a new secret lease will be generated and the credentials for it will be shown to you. Provision Lease ## Audit or Revoke Leases Once you have created one or more leases, you will be able to access them by clicking on the respective dynamic secret item on the dashboard. This will allow you to see the expiration time of the lease or delete a lease before it's set time to live. Provision Lease ## Renew Leases To extend the life of the generated dynamic secret leases past its initial time to live, simply click on the **Renew** button as illustrated below. Provision Lease Lease renewals cannot exceed the maximum TTL set when configuring the dynamic secret --- # Source: https://infisical.com/docs/documentation/platform/dynamic-secrets/mongo-db.md > ## Documentation Index > Fetch the complete documentation index at: https://infisical.com/docs/llms.txt > Use this file to discover all available pages before exploring further. # Mongo DB > Learn how to dynamically generate Mongo DB Database user credentials. The Infisical Mongo DB dynamic secret allows you to generate Mongo DB Database credentials on demand based on configured role. If your using Mongo Atlas, please use [Atlas Dynamic Secret](./mongo-atlas) as MongoDB commands are not supported by atlas. ## Prerequisite Create a user with the required permission in your MongoDB instance. This user will be used to create new accounts on-demand. ## Set up Dynamic Secrets with Mongo DB Open the Secret Overview dashboard and select the environment in which you would like to add a dynamic secret. Add Dynamic Secret Button Dynamic Secret Modal Name by which you want the secret to be referenced Default time-to-live for a generated secret (it is possible to modify this value after a secret is generated) Maximum time-to-live for a generated secret Database host URL. Database port number. If your Mongo DB is cluster you can omit this. Username of the admin user that will be used to create dynamic secrets Password of the admin user that will be used to create dynamic secrets Name of the database for which you want to create dynamic secrets Human-readable label that identifies a group of privileges assigned to a database user. This value can either be a built-in role or a custom role. * Enum: `atlasAdmin` `backup` `clusterMonitor` `dbAdmin` `dbAdminAnyDatabase` `enableSharding` `read` `readAnyDatabase` `readWrite` `readWriteAnyDatabase` ``. A CA may be required if your DB requires it for incoming connections. Specifies a template for generating usernames. This field allows customization of how usernames are automatically created. Allowed template variables are: * `{{randomUsername}}`: Random username string. * `{{unixTimestamp}}`: Current Unix timestamp at the time of lease creation. * `{{identity.name}}`: Name of the identity that is generating the lease. * `{{dynamicSecret.name}}`: Name of the associated dynamic secret. * `{{dynamicSecret.type}}`: Type of the associated dynamic secret. * `{{random N}}`: Random string of N characters. Allowed template functions are: * `truncate`: Truncates a string to a specified length. * `replace`: Replaces a substring with another value. * `uppercase`: Converts a string to uppercase. * `lowercase`: Converts a string to lowercase. Examples: ```yaml theme={"dark"} {{ randomUsername }} // 3POnzeFyK9gW2nioK0q2gMjr6CZqsRiX {{ unixTimestamp }} // 17490641580 {{ identity.name }} // {{ random 5 }} // x9K2m {{ truncate identity.name 4 }} // test {{ replace identity.name '' 'new-value' }} // new-value ``` Dynamic Secret Setup Modal After submitting the form, you will see a dynamic secret created in the dashboard. If this step fails, you may have to add the CA certificate. Once you've successfully configured the dynamic secret, you're ready to generate on-demand credentials. To do this, simply click on the 'Generate' button which appears when hovering over the dynamic secret item. Alternatively, you can initiate the creation of a new lease by selecting 'New Lease' from the dynamic secret lease list section. Dynamic Secret Dynamic Secret When generating these secrets, it's important to specify a Time-to-Live (TTL) duration. This will dictate how long the credentials are valid for. Provision Lease Ensure that the TTL for the lease falls within the maximum TTL defined when configuring the dynamic secret. Once you click the `Submit` button, a new secret lease will be generated and the credentials from it will be shown to you. Provision Lease ## Audit or Revoke Leases Once you have created one or more leases, you will be able to access them by clicking on the respective dynamic secret item on the dashboard. This will allow you to see the expiration time of the lease or delete a lease before it's set time to live. Provision Lease ## Renew Leases To extend the life of the generated dynamic secret leases past its initial time to live, simply click on the **Renew** button as illustrated below. Provision Lease Lease renewals cannot exceed the maximum TTL set when configuring the dynamic secret --- # Source: https://infisical.com/docs/self-hosting/guides/mongo-to-postgres.md > ## Documentation Index > Fetch the complete documentation index at: https://infisical.com/docs/llms.txt > Use this file to discover all available pages before exploring further. # Migrate Mongo to Postgres > Learn how to migrate Infisical from MongoDB to PostgreSQL. This guide will provide step by step instructions on migrating your Infisical instance running on MongoDB to the newly released PostgreSQL version of Infisical. The newly released Postgres version of Infisical is the only version of Infisical that will receive feature updates and patches going forward. If you have a small set of secrets, we recommend you to download the secrets and upload them to your new instance of Infisical instead of running the migration script. ## Prerequisites Before starting the migration, ensure you have the following command line tools installed: * [git](https://git-scm.com/book/en/v2/Getting-Started-Installing-Git) * [pg\_dump](https://www.postgresql.org/docs/current/app-pgrestore.html) * [pg\_restore](https://www.postgresql.org/docs/current/app-pgdump.html) * [mongodump](https://www.mongodb.com/docs/database-tools/mongodump/) * [mongorestore](https://www.mongodb.com/docs/database-tools/mongorestore/) * [Docker](https://docs.docker.com/engine/install/) ## Prepare for migration While the migration script will not mutate any MongoDB production data, we recommend you to take a backup of your MongoDB instance if possible. To prevent new data entries during the migration, set your Infisical instance to migration mode by setting the environment variable `MIGRATION_MODE=true` and redeploying your instance. This mode will block all write operations, only allowing GET requests. It also disables user logins and sets up a migration page to prevent UI interactions. migration mode Start local instances of MongoDB and Postgres. This will be used in later steps to process and transform the data locally. To start local instances of the two databases, create a file called `docker-compose.yaml` as shown below. ```yaml docker-compose.yaml theme={"dark"} version: '3.1' services: mongodb: image: mongo restart: always environment: MONGO_INITDB_ROOT_USERNAME: root MONGO_INITDB_ROOT_PASSWORD: example ports: - "27017:27017" volumes: - mongodb_data:/data/db postgres: image: postgres restart: always environment: POSTGRES_PASSWORD: example ports: - "5432:5432" volumes: - postgres_data:/var/lib/postgresql/data volumes: mongodb_data: postgres_data: ``` Next, run the command below in the same working directory where the `docker-compose.yaml` file resides to start both services. ``` docker-compose up ``` ## Dump MongoDB To speed up the data transformation process, the first step involves transferring the production data from Infisical's MongoDB to a local machine. This is achieved by creating a dump of the production database and then uploading this dumped data into a local Mongo instance. By having a running local instance of the production database, we will significantly reduce the time it takes to run the migration script. ``` mongodump --uri= --archive="mongodump-db" --db= --excludeCollection=auditlogs ``` ``` mongorestore --uri=mongodb://root:example@localhost:27017/ --archive="mongodump-db" ``` ## Start the migration Once started, the migration script will transform MongoDB data into an equivalent PostgreSQL format. Clone the Infisical MongoDB repository. ``` git clone -b infisical/v0.46.11-postgres https://github.com/Infisical/infisical.git ``` ``` cd backend ``` ``` npm install ``` ``` cd pg-migrator ``` ``` npm install ``` ``` npm run migration ``` When executing the above command, you'll be asked to provide the MongoDB connection string for the database containing your production Infisical data. Since our production Mongo data is transferred to a local Mongo instance, you should input the connection string for this local instance. ``` mongodb://root:example@localhost:27017/?authSource=admin ``` Remember to replace `` with the name of the MongoDB database. If you are not sure the name, you can use [Compass](https://www.mongodb.com/products/tools/compass) to view the available databases. Next, you will be asked to enter the Postgres connection string for the database where the transformed data should be stored. Input the connection string of the local Postgres instance that was set up earlier in the guide. ``` postgres://infisical:infisical@localhost/infisical?sslmode=disable ``` Once the script has completed, you will notice a new folder has been created called `db` in the `pg-migrator` folder. This folder contains meta data for schema mapping and can be helpful when debugging migration related issues. We highly recommend you to make a copy of this folder in case you need assistance from the Infisical team during your migration process. The `db` folder does not contain any sensitive data ## Finalizing Migration At this stage, the data from the Mongo instance of Infisical should have been successfully converted into its Postgres equivalent. The remaining step involves transferring the local Postgres database, which now contains all the migrated data, to your chosen production Postgres environment. Rather than transferring the data row-by-row from your local machine to the production Postgres database, we will first create a dump file from the local Postgres and then upload this file to your production Postgres instance. ``` pg_dump -h localhost -U infisical -Fc -b -v -f dumpfilelocation.sql -d infisical ``` ``` pg_restore --clean -v -h -U -d -j 2 dumpfilelocation.sql ``` Remember to replace ``, ``, `` with the corresponding details of your production Postgres database. Use a tool like Beekeeper Studio to confirm that the data has been successfully transferred to your production Postgres DB. ## Post-Migration Steps Once the data migration to PostgreSQL is complete, you're ready to deploy Infisical using the deployment method of your choice. For guidance on deployment options, please visit the [self-hosting documentation](/self-hosting/overview). Remember to transfer the necessary [environment variables](/self-hosting/configuration/envars) from the MongoDB version of Infisical to the new Postgres based Infisical; rest assured, they are fully compatible. The first deployment of Postgres based Infisical must be deployed with Docker image tag `v0.46.11-postgres`. After deploying this version, you can proceed to update to any subsequent versions. ## Important Notes Infisical's [Docker Hub repository](https://hub.docker.com/r/infisical/infisical) uses different tagging conventions to indicate which database backend is used: * **Before v0.46.11** * Infisical ran on MongoDB backend * **After v0.46.11** * Version tags started to be suffixed with `-postgres` * Infisical transitioned to PostgreSQL backend * **After v0.147.0** * Infisical remains on PostgreSQL backend * The `-postgres` suffix was removed from tags for brevity --- # Source: https://infisical.com/docs/documentation/platform/secret-rotation/mongodb-credentials.md > ## Documentation Index > Fetch the complete documentation index at: https://infisical.com/docs/llms.txt > Use this file to discover all available pages before exploring further. # MongoDB Credentials Rotation > Learn how to automatically rotate MongoDB credentials. ## Prerequisites 1. Create a [MongoDB Connection](/integrations/app-connections/mongodb) with the required **Secret Rotation** permissions 2. Create two designated database users for Infisical to rotate the credentials for. Be sure to grant each user login permissions for the desired database with the necessary privileges their use case will require. An example creation statement might look like: ```bash theme={"dark"} // Switch to the target database use my_database // Create first user db.createUser({ user: "infisical_user_1", pwd: "temporary_password", roles: [] }) // Create second user db.createUser({ user: "infisical_user_2", pwd: "temporary_password", roles: [] }) // Grant necessary permissions to both users db.grantRolesToUser("infisical_user_1", [ { role: "readWrite", db: "my_database" } ]) db.grantRolesToUser("infisical_user_2", [ { role: "readWrite", db: "my_database" } ]) ``` To learn more about MongoDB's permission system, please visit their [documentation](https://www.mongodb.com/docs/manual/core/security-built-in-roles/). 3. Ensure your network security policies allow incoming requests from Infisical to this rotation provider, if network restrictions apply. ## Create a MongoDB Credentials Rotation in Infisical 1. Navigate to your Secret Manager Project's Dashboard and select **Add Secret Rotation** from the actions dropdown. Secret Manager Dashboard 2. Select the **MongoDB Credentials** option. Select MongoDB Credentials 3. Select the **MongoDB Connection** to use and configure the rotation behavior. Then click **Next**. Rotation Configuration * **MongoDB Connection** - the connection that will perform the rotation of the configured database user credentials. * **Rotation Interval** - the interval, in days, that once elapsed will trigger a rotation. * **Rotate At** - the local time of day when rotation should occur once the interval has elapsed. * **Auto-Rotation Enabled** - whether secrets should automatically be rotated once the rotation interval has elapsed. Disable this option to manually rotate secrets or pause secret rotation. 4. Input the usernames of the database users created above that will be used for rotation. Then click **Next**. Rotation Parameters * **Database Username 1** - the username of the first user that will be used for rotation. * **Database Username 2** - the username of the second user that will be used for rotation. 5. Specify the secret names that the active credentials should be mapped to. Then click **Next**. Rotation Secrets Mapping * **Username** - the name of the secret that the active username will be mapped to. * **Password** - the name of the secret that the active password will be mapped to. 6. Give your rotation a name and description (optional). Then click **Next**. Rotation Details * **Name** - the name of the secret rotation configuration. Must be slug-friendly. * **Description** (optional) - a description of this rotation configuration. 7. Review your configuration, then click **Create Secret Rotation**. Rotation Review 8. Your **MongoDB Credentials** are now available for use via the mapped secrets. Rotation Created To create a MongoDB Credentials Rotation, make an API request to the [Create MongoDB Credentials Rotation](/api-reference/endpoints/secret-rotations/mongodb-credentials/create) API endpoint. ### Sample request ```bash Request theme={"dark"} curl --request POST \ --url https://us.infisical.com/api/v2/secret-rotations/mongodb-credentials \ --header 'Content-Type: application/json' \ --data '{ "name": "my-mongodb-rotation", "projectId": "3c90c3cc-0d44-4b50-8888-8dd25736052a", "description": "my database credentials rotation", "connectionId": "11c76f38-cd13-4137-b1a3-ecd6a429952c", "environment": "dev", "secretPath": "/", "isAutoRotationEnabled": true, "rotationInterval": 30, "rotateAtUtc": { "hours": 0, "minutes": 0 }, "parameters": { "username1": "infisical_user_1", "username2": "infisical_user_2" }, "secretsMapping": { "username": "MONGODB_DB_USERNAME", "password": "MONGODB_DB_PASSWORD" } }' ``` ### Sample response ```bash Response theme={"dark"} { "secretRotation": { "id": "3c90c3cc-0d44-4b50-8888-8dd25736052a", "name": "my-mongodb-rotation", "description": "my database credentials rotation", "secretsMapping": { "username": "MONGODB_DB_USERNAME", "password": "MONGODB_DB_PASSWORD" }, "isAutoRotationEnabled": true, "activeIndex": 0, "folderId": "b3257e1f-8d32-4e86-8bfd-b1f1bc1bf2c3", "connectionId": "11c76f38-cd13-4137-b1a3-ecd6a429952c", "createdAt": "2023-11-07T05:31:56Z", "updatedAt": "2023-11-07T05:31:56Z", "rotationInterval": 30, "rotationStatus": "success", "lastRotationAttemptedAt": "2023-11-07T05:31:56Z", "lastRotatedAt": "2023-11-07T05:31:56Z", "lastRotationJobId": null, "nextRotationAt": "2023-11-07T05:31:56Z", "isLastRotationManual": true, "connection": { "app": "mongodb", "name": "my-mongodb-connection", "id": "11c76f38-cd13-4137-b1a3-ecd6a429952c" }, "environment": { "slug": "dev", "name": "Development", "id": "170a40f1-1b48-4cc7-addf-e563aa9fbe37" }, "projectId": "3c90c3cc-0d44-4b50-8888-8dd25736052a", "folder": { "id": "b3257e1f-8d32-4e86-8bfd-b1f1bc1bf2c3", "path": "/" }, "rotateAtUtc": { "hours": 0, "minutes": 0 }, "lastRotationMessage": null, "type": "mongodb-credentials", "parameters": { "username1": "infisical_user_1", "username2": "infisical_user_2" } } } ``` --- # Source: https://infisical.com/docs/integrations/app-connections/mongodb.md > ## Documentation Index > Fetch the complete documentation index at: https://infisical.com/docs/llms.txt > Use this file to discover all available pages before exploring further. # MongoDB Connection > Learn how to configure a MongoDB Connection for Infisical. Infisical supports the use of Username & Password authentication to connect with MongoDB databases. ## Configure a MongoDB user for Infisical Infisical recommends creating a designated user in your MongoDB database for your connection. ```bash theme={"dark"} use [TARGET-DATABASE] db.createUser({ user: "infisical_manager", pwd: "[ENTER-YOUR-USER-PASSWORD]", roles: [] }) ``` Depending on how you intend to use your MongoDB connection, you'll need to grant one or more of the following permissions. To learn more about MongoDB's permission system, please visit their [documentation](https://www.mongodb.com/docs/manual/core/security-built-in-roles/). For Secret Rotations, your Infisical user will require the ability to create, update, and delete users in the target database: ```bash theme={"dark"} use [TARGET-DATABASE] db.grantRolesToUser("infisical_manager", [ { role: "userAdmin", db: "[TARGET-DATABASE]" } ]) ``` The `userAdmin` role allows managing users (create, update passwords, delete) within the specified database. ## Create MongoDB Connection in Infisical In your Infisical dashboard, navigate to the **Integrations** tab in the desired project, then select **App Connections**. App Connections Tab Click the **+ Add Connection** button and select the **MongoDB Connection** option from the available integrations. Select MongoDB Connection Complete the MongoDB Connection form by entering: * A descriptive name for the connection * An optional description for future reference * The MongoDB host URL for your database * The MongoDB port for your database * The MongoDB username for your database * The MongoDB password for your database * The MongoDB database name to connect to You can optionally configure SSL/TLS for your MongoDB connection in the **SSL** section. MongoDB Connection Modal After clicking Create, your **MongoDB Connection** is established and ready to use with your Infisical project. MongoDB Connection Created To create a MongoDB Connection, make an API request to the [Create MongoDB Connection](/api-reference/endpoints/app-connections/mongodb/create) API endpoint. ### Sample request ```bash Request theme={"dark"} curl --request POST \ --url https://app.infisical.com/api/v1/app-connections/mongodb \ --header 'Content-Type: application/json' \ --data '{ "name": "my-mongodb-connection", "method": "username-and-password", "projectId": "7ffbb072-2575-495a-b5b0-127f88caef78", "credentials": { "host": "[MONGODB HOST]", "port": 27017, "username": "[MONGODB USERNAME]", "password": "[MONGODB PASSWORD]", "database": "[MONGODB DATABASE]" } }' ``` ### Sample response ```bash Response theme={"dark"} { "appConnection": { "id": "e5d18aca-86f7-4026-a95e-efb8aeb0d8e6", "name": "my-mongodb-connection", "projectId": "7ffbb072-2575-495a-b5b0-127f88caef78", "description": null, "version": 1, "orgId": "6f03caa1-a5de-43ce-b127-95a145d3464c", "createdAt": "2025-04-23T19:46:34.831Z", "updatedAt": "2025-04-23T19:46:34.831Z", "isPlatformManagedCredentials": false, "credentialsHash": "d41d8cd98f00b204e9800998ecf8427e", "app": "mongodb", "method": "username-and-password", "credentials": { "host": "[MONGODB HOST]", "port": 27017, "username": "[MONGODB USERNAME]", "database": "[MONGODB DATABASE]", "sslEnabled": false, "sslRejectUnauthorized": false, "sslCertificate": "" } } } ``` --- # Source: https://infisical.com/docs/self-hosting/guides/monitoring-telemetry.md > ## Documentation Index > Fetch the complete documentation index at: https://infisical.com/docs/llms.txt > Use this file to discover all available pages before exploring further. # Monitoring and Telemetry Setup > Learn how to set up monitoring and telemetry for your self-hosted Infisical instance using Grafana, Prometheus, and OpenTelemetry. Infisical provides comprehensive monitoring and telemetry capabilities to help you monitor the health, performance, and usage of your self-hosted instance. This guide covers setting up monitoring using Grafana with two different telemetry collection approaches. ## Overview Infisical exports metrics in **OpenTelemetry (OTEL) format**, which provides maximum flexibility for your monitoring infrastructure. While this guide focuses on Grafana, the OTEL format means you can easily integrate with: * **Cloud-native monitoring**: AWS CloudWatch, Google Cloud Monitoring, Azure Monitor * **Observability platforms**: Datadog, New Relic, Splunk, Dynatrace * **Custom backends**: Any system that supports OTEL ingestion * **Traditional monitoring**: Prometheus, Grafana (as covered in this guide) Infisical supports two telemetry collection methods: 1. **Pull-based (Prometheus)**: Exposes metrics on a dedicated endpoint for Prometheus to scrape 2. **Push-based (OTLP)**: Sends metrics to an OpenTelemetry Collector via OTLP protocol Both approaches provide the same metrics data in OTEL format, so you can choose the one that best fits your infrastructure and monitoring strategy. ## Prerequisites * Self-hosted Infisical instance running * Access to deploy monitoring services (Prometheus, Grafana, etc.) * Basic understanding of Prometheus and Grafana ## Setup ### Environment Variables Configure the following environment variables in your Infisical backend: ```bash theme={"dark"} # Enable telemetry collection OTEL_TELEMETRY_COLLECTION_ENABLED=true # Choose export type: "prometheus" or "otlp" OTEL_EXPORT_TYPE=prometheus ``` This approach exposes metrics on port 9464 at the `/metrics` endpoint, allowing Prometheus to scrape the data. The metrics are exposed in Prometheus format but originate from OpenTelemetry instrumentation. ### Configuration ```bash theme={"dark"} OTEL_TELEMETRY_COLLECTION_ENABLED=true OTEL_EXPORT_TYPE=prometheus ``` Expose the metrics port in your Infisical backend: * **Docker**: Expose port 9464 * **Kubernetes**: Create a service exposing port 9464 * **Other**: Ensure port 9464 is accessible to your monitoring stack Create `prometheus.yml`: ```yaml theme={"dark"} global: scrape_interval: 30s evaluation_interval: 30s scrape_configs: - job_name: "infisical" scrape_interval: 30s static_configs: - targets: ["infisical-backend:9464"] # Adjust hostname/port based on your deployment metrics_path: "/metrics" ``` Replace `infisical-backend:9464` with the actual hostname and port where your Infisical backend is running. This could be: * **Docker Compose**: `infisical-backend:9464` (service name) * **Kubernetes**: `infisical-backend.default.svc.cluster.local:9464` (service name) * **Bare Metal**: `192.168.1.100:9464` (actual IP address) * **Cloud**: `your-infisical.example.com:9464` (domain name) ### Deployment Options Once you've configured Infisical to expose metrics, you'll need to deploy Prometheus to scrape and store them. Below are examples for different deployment environments. Choose the option that matches your infrastructure. ```yaml theme={"dark"} services: prometheus: image: prom/prometheus:latest ports: - "9090:9090" volumes: - ./prometheus.yml:/etc/prometheus/prometheus.yml:ro command: - "--config.file=/etc/prometheus/prometheus.yml" grafana: image: grafana/grafana:latest ports: - "3000:3000" environment: - GF_SECURITY_ADMIN_USER=admin - GF_SECURITY_ADMIN_PASSWORD=admin ``` ```yaml theme={"dark"} # prometheus-deployment.yaml apiVersion: apps/v1 kind: Deployment metadata: name: prometheus spec: replicas: 1 selector: matchLabels: app: prometheus template: metadata: labels: app: prometheus spec: containers: - name: prometheus image: prom/prometheus:latest ports: - containerPort: 9090 volumeMounts: - name: config mountPath: /etc/prometheus volumes: - name: config configMap: name: prometheus-config --- # prometheus-service.yaml apiVersion: v1 kind: Service metadata: name: prometheus spec: selector: app: prometheus ports: - port: 9090 targetPort: 9090 type: ClusterIP ``` ```bash theme={"dark"} helm repo add prometheus-community https://prometheus-community.github.io/helm-charts helm install prometheus prometheus-community/prometheus \ --set server.config.global.scrape_interval=30s \ --set server.config.scrape_configs[0].job_name=infisical \ --set server.config.scrape_configs[0].static_configs[0].targets[0]=infisical-backend:9464 ``` This approach sends metrics directly to an OpenTelemetry Collector via the OTLP protocol. This gives you the most flexibility as you can configure the collector to export to multiple backends simultaneously. ### Configuration ```bash theme={"dark"} OTEL_TELEMETRY_COLLECTION_ENABLED=true OTEL_EXPORT_TYPE=otlp OTEL_EXPORT_OTLP_ENDPOINT=http://otel-collector:4318/v1/metrics OTEL_COLLECTOR_BASIC_AUTH_USERNAME=infisical OTEL_COLLECTOR_BASIC_AUTH_PASSWORD=infisical OTEL_OTLP_PUSH_INTERVAL=30000 ``` Create `otel-collector-config.yaml`: ```yaml theme={"dark"} extensions: health_check: pprof: zpages: basicauth/server: htpasswd: inline: | your_username:your_password receivers: otlp: protocols: http: endpoint: 0.0.0.0:4318 auth: authenticator: basicauth/server prometheus: config: scrape_configs: - job_name: otel-collector scrape_interval: 30s static_configs: - targets: [infisical-backend:9464] metric_relabel_configs: - action: labeldrop regex: "service_instance_id|service_name" processors: batch: exporters: prometheus: endpoint: "0.0.0.0:8889" auth: authenticator: basicauth/server resource_to_telemetry_conversion: enabled: true service: extensions: [basicauth/server, health_check, pprof, zpages] pipelines: metrics: receivers: [otlp] processors: [batch] exporters: [prometheus] ``` Replace `your_username:your_password` with your chosen credentials. These must match the values you set in Infisical's `OTEL_COLLECTOR_BASIC_AUTH_USERNAME` and `OTEL_COLLECTOR_BASIC_AUTH_PASSWORD` environment variables. Create Prometheus configuration for the collector: ```yaml theme={"dark"} global: scrape_interval: 30s evaluation_interval: 30s scrape_configs: - job_name: "otel-collector" scrape_interval: 30s static_configs: - targets: ["otel-collector:8889"] # Adjust hostname/port based on your deployment metrics_path: "/metrics" ``` Replace `otel-collector:8889` with the actual hostname and port where your OpenTelemetry Collector is running. This could be: * **Docker Compose**: `otel-collector:8889` (service name) * **Kubernetes**: `otel-collector.default.svc.cluster.local:8889` (service name) * **Bare Metal**: `192.168.1.100:8889` (actual IP address) * **Cloud**: `your-collector.example.com:8889` (domain name) ### Deployment Options After configuring Infisical and the OpenTelemetry Collector, you'll need to deploy the collector to receive metrics from Infisical. Below are examples for different deployment environments. Choose the option that matches your infrastructure. ```yaml theme={"dark"} services: otel-collector: image: otel/opentelemetry-collector-contrib:latest ports: - 4318:4318 # OTLP http receiver - 8889:8889 # Prometheus exporter metrics volumes: - ./otel-collector-config.yaml:/etc/otelcol-contrib/config.yaml:ro command: - "--config=/etc/otelcol-contrib/config.yaml" ``` ```yaml theme={"dark"} # otel-collector-deployment.yaml apiVersion: apps/v1 kind: Deployment metadata: name: otel-collector spec: replicas: 1 selector: matchLabels: app: otel-collector template: metadata: labels: app: otel-collector spec: containers: - name: otel-collector image: otel/opentelemetry-collector-contrib:latest ports: - containerPort: 4318 - containerPort: 8889 volumeMounts: - name: config mountPath: /etc/otelcol-contrib volumes: - name: config configMap: name: otel-collector-config ``` ```bash theme={"dark"} helm repo add open-telemetry https://open-telemetry.github.io/opentelemetry-helm-charts helm install otel-collector open-telemetry/opentelemetry-collector \ --set config.receivers.otlp.protocols.http.endpoint=0.0.0.0:4318 \ --set config.exporters.prometheus.endpoint=0.0.0.0:8889 ``` ## Available Metrics Infisical exposes the following key metrics in OpenTelemetry format: ### Core API Metrics These metrics track all HTTP API requests to Infisical, including request counts, latency, and errors. Use these to monitor overall API health, identify performance bottlenecks, and track usage patterns across users and machine identities. **Metric Name**: `infisical.http.server.request.count` **Type**: Counter **Unit**: `{request}` **Description**: Total number of API requests to Infisical (covers both human users and machine identities) **Attributes**: * `infisical.organization.id` (string): Organization ID * `infisical.organization.name` (string): Organization name (e.g., "Platform Engineering Team") * `infisical.user.id` (string, optional): User ID if human user * `infisical.user.email` (string, optional): User email (e.g., "[jane.doe@cisco.com](mailto:jane.doe@cisco.com)") * `infisical.identity.id` (string, optional): Machine identity ID * `infisical.identity.name` (string, optional): Machine identity name (e.g., "prod-k8s-operator") * `infisical.auth.method` (string, optional): Auth method used * `http.request.method` (string): HTTP method (GET, POST, PUT, DELETE) * `http.route` (string): API endpoint route pattern * `http.response.status_code` (int): HTTP status code * `infisical.project.id` (string, optional): Project ID * `infisical.project.name` (string, optional): Project name * `user_agent.original` (string, optional): User agent string * `client.address` (string, optional): IP address **Metric Name**: `infisical.http.server.request.duration` **Type**: Histogram **Unit**: `s` (seconds) **Description**: API request latency **Buckets**: \[0.005, 0.01, 0.025, 0.05, 0.1, 0.25, 0.5, 1, 2.5, 5, 10] **Attributes**: * `infisical.organization.id` (string): Organization ID * `infisical.organization.name` (string): Organization name * `infisical.user.id` (string, optional): User ID if human user * `infisical.user.email` (string, optional): User email * `infisical.identity.id` (string, optional): Machine identity ID * `infisical.identity.name` (string, optional): Machine identity name * `http.request.method` (string): HTTP method * `http.route` (string): API endpoint route pattern * `http.response.status_code` (int): HTTP status code * `infisical.project.id` (string, optional): Project ID * `infisical.project.name` (string, optional): Project name **Metric Name**: `infisical.http.server.error.count` **Type**: Counter **Unit**: `{error}` **Description**: API errors grouped by actor (for identifying misconfigured services) **Attributes**: * `infisical.organization.id` (string): Organization ID * `infisical.organization.name` (string): Organization name * `infisical.user.id` (string, optional): User ID if human * `infisical.user.email` (string, optional): User email * `infisical.identity.id` (string, optional): Identity ID if machine * `infisical.identity.name` (string, optional): Identity name * `http.route` (string): API endpoint where error occurred * `http.request.method` (string): HTTP method * `error.type` (string): Error category/type (client\_error, server\_error, auth\_error, rate\_limit\_error, etc.) * `infisical.project.id` (string, optional): Project ID * `infisical.project.name` (string, optional): Project name * `client.address` (string, optional): IP address * `user_agent.original` (string, optional): User agent information ### Secret Operations Metrics These metrics provide visibility into secret access patterns, helping you understand which secrets are being accessed, by whom, and from where. Essential for security auditing and access pattern analysis. **Metric Name**: `infisical.secret.read.count` **Type**: Counter **Unit**: `{operation}` **Description**: Number of secret read operations **Attributes**: * `infisical.organization.id` (string): Organization ID * `infisical.organization.name` (string): Organization name * `infisical.project.id` (string): Project ID * `infisical.project.name` (string): Project name (e.g., "payment-service-secrets") * `infisical.environment` (string): Environment (dev, staging, prod) * `infisical.secret.path` (string): Path to secrets (e.g., "/microservice-a/database") * `infisical.secret.name` (string, optional): Name of secret * `infisical.user.id` (string, optional): User ID if human * `infisical.user.email` (string, optional): User email * `infisical.identity.id` (string, optional): Machine identity ID * `infisical.identity.name` (string, optional): Machine identity name * `user_agent.original` (string, optional): User agent/SDK information * `client.address` (string, optional): IP address ### Authentication Metrics These metrics track authentication attempts and outcomes, enabling you to monitor login success rates, detect potential security threats, and identify authentication issues. **Metric Name**: `infisical.auth.attempt.count` **Type**: Counter **Unit**: `{attempt}` **Description**: Authentication attempts (both successful and failed) **Attributes**: * `infisical.organization.id` (string): Organization ID * `infisical.organization.name` (string): Organization name * `infisical.user.id` (string, optional): User ID if human (if identifiable) * `infisical.user.email` (string, optional): User email (if identifiable) * `infisical.identity.id` (string, optional): Identity ID if machine (if identifiable) * `infisical.identity.name` (string, optional): Identity name (if identifiable) * `infisical.auth.method` (string): Authentication method attempted * `infisical.auth.result` (string): success or failure * `error.type` (string, optional): Reason for failure if failed (invalid\_credentials, expired\_token, invalid\_token, etc.) * `client.address` (string): IP address * `user_agent.original` (string, optional): User agent/client information * `infisical.auth.attempt.username` (string, optional): Attempted username/email (if available) ### Key Management Interoperability Protocol Metrics These metrics track Key Management Interoperability Protocol (KMIP) operations, providing visibility into key management activities including key creation, retrieval, activation, revocation, and destruction. **Metric Name**: `infisical.kmip.operation.count` **Type**: Counter **Unit**: `{operation}` **Description**: Number of KMIP operations performed **Attributes**: * `infisical.kmip.operation.type` (string): Operation type (`create`, `get`, `get_attributes`, `activate`, `revoke`, `destroy`, `locate`, `register`) * `infisical.organization.id` (string): Organization ID * `infisical.project.id` (string): Project ID * `infisical.kmip.client.id` (string): KMIP client ID performing the operation * `infisical.kmip.object.id` (string, optional): Managed object/key ID * `infisical.kmip.object.name` (string, optional): Managed object/key name * `infisical.identity.id` (string, optional): Machine identity ID * `infisical.identity.name` (string, optional): Machine identity name * `user_agent.original` (string, optional): User agent string * `client.address` (string, optional): Client IP address ### Integration & Secret Sync Metrics These metrics monitor secret synchronization operations between Infisical and external systems, helping you track sync health, identify integration failures, and troubleshoot connectivity issues. Integration secret sync error count * **Labels**: `version`, `integration`, `integrationId`, `type`, `status`, `name`, `projectId` * **Example**: Monitor integration sync failures across different services Secret sync operation error count * **Labels**: `version`, `destination`, `syncId`, `projectId`, `type`, `status`, `name` * **Example**: Track secret sync failures to external systems Secret import operation error count * **Labels**: `version`, `destination`, `syncId`, `projectId`, `type`, `status`, `name` * **Example**: Monitor secret import failures Secret removal operation error count * **Labels**: `version`, `destination`, `syncId`, `projectId`, `type`, `status`, `name` * **Example**: Track secret removal operation failures ### System Metrics These low-level HTTP metrics are automatically collected by OpenTelemetry's instrumentation layer, providing baseline performance data for all HTTP traffic. HTTP server request duration metrics (histogram buckets, count, sum) HTTP client request duration metrics (histogram buckets, count, sum) ## Troubleshooting If your metrics are not showing up in Prometheus or your monitoring system, check the following: * Verify `OTEL_TELEMETRY_COLLECTION_ENABLED=true` is set in your Infisical environment variables * Ensure the correct `OTEL_EXPORT_TYPE` is set (`prometheus` or `otlp`) * Check network connectivity between Infisical and your monitoring services (Prometheus or OTLP collector) * For pull-based monitoring: Verify port 9464 is exposed and accessible * For push-based monitoring: Verify the OTLP endpoint URL is correct and reachable * Check Infisical backend logs for any errors related to metrics export If you're experiencing authentication errors with the OpenTelemetry Collector: * Verify basic auth credentials in your OTLP configuration match between Infisical and the collector * Check that `OTEL_COLLECTOR_BASIC_AUTH_USERNAME` and `OTEL_COLLECTOR_BASIC_AUTH_PASSWORD` match the credentials in your `otel-collector-config.yaml` * Ensure the htpasswd format in the collector configuration is correct * Test the collector endpoint manually using curl with the same credentials to verify they work --- # Source: https://infisical.com/docs/documentation/platform/secret-rotation/mssql-credentials.md > ## Documentation Index > Fetch the complete documentation index at: https://infisical.com/docs/llms.txt > Use this file to discover all available pages before exploring further. # Microsoft SQL Server Credentials Rotation > Learn how to automatically rotate Microsoft SQL Server credentials. ## Prerequisites 1. Create a [Microsoft SQL Server Connection](/integrations/app-connections/mssql) with the required **Secret Rotation** permissions 2. Create two designated database users for Infisical to rotate the credentials for. Be sure to grant each user login permissions for the desired database with the necessary privileges their use case will require. An example creation statement might look like: ```SQL theme={"dark"} -- create server-level logins CREATE LOGIN [infisical_user_1] WITH PASSWORD = 'my-password'; CREATE LOGIN [infisical_user_2] WITH PASSWORD = 'my-password'; GRANT CONNECT SQL TO [infisical_user_1]; GRANT CONNECT SQL TO [infisical_user_2]; -- create database-level users with login from above USE my_database; CREATE USER [infisical_user_1] FOR LOGIN [infisical_user_1]; CREATE USER [infisical_user_2] FOR LOGIN [infisical_user_2]; -- grant relevant permissions GRANT SELECT, INSERT, UPDATE, DELETE ON SCHEMA::dbo TO [infisical_user_1]; GRANT SELECT, INSERT, UPDATE, DELETE ON SCHEMA::dbo TO [infisical_user_2]; ``` To learn more about Microsoft SQL Server's permission system, please visit their [documentation](https://learn.microsoft.com/en-us/sql/t-sql/statements/grant-transact-sql?view=sql-server-ver16). 3. Ensure your network security policies allow incoming requests from Infisical to this rotation provider, if network restrictions apply. ## Create a Microsoft SQL Server Credentials Rotation in Infisical 1. Navigate to your Secret Manager Project's Dashboard and select **Add Secret Rotation** from the actions dropdown. Secret Manager Dashboard 2. Select the **Microsoft SQL Server Credentials** option. Select Microsoft SQL Server Credentials 3. Select the **Microsoft SQL Server Connection** to use and configure the rotation behavior. Then click **Next**. Rotation Configuration * **Microsoft SQL Server Connection** - the connection that will perform the rotation of the configured database user credentials. * **Rotation Interval** - the interval, in days, that once elapsed will trigger a rotation. * **Rotate At** - the local time of day when rotation should occur once the interval has elapsed. * **Auto-Rotation Enabled** - whether secrets should automatically be rotated once the rotation interval has elapsed. Disable this option to manually rotate secrets or pause secret rotation. 4. Input the usernames of the database users created above that will be used for rotation. Then click **Next**. Rotation Parameters * **Database Username 1** - the username of the first user that will be used for rotation. * **Database Username 2** - the username of the second user that will be used for rotation. Rotation Advance Parameters * **Rotation Statement** - the template string query to generate password for the rotated user. * **Password Requirements** - the requirements for the password of the MySQL users that will be created for the rotation. 5. Specify the secret names that the active credentials should be mapped to. Then click **Next**. Rotation Secrets Mapping * **Username** - the name of the secret that the active username will be mapped to. * **Password** - the name of the secret that the active password will be mapped to. 6. Give your rotation a name and description (optional). Then click **Next**. Rotation Details * **Name** - the name of the secret rotation configuration. Must be slug-friendly. * **Description** (optional) - a description of this rotation configuration. 7. Review your configuration, then click **Create Secret Rotation**. Rotation Review 8. Your **Microsoft SQL Server Credentials** are now available for use via the mapped secrets. Rotation Created To create a Microsoft SQL Server Credentials Rotation, make an API request to the [Create Microsoft SQL Server Credentials Rotation](/api-reference/endpoints/secret-rotations/mssql-credentials/create) API endpoint. ### Sample request ```bash Request theme={"dark"} curl --request POST \ --url https://us.infisical.com/api/v2/secret-rotations/mssql-credentials \ --header 'Content-Type: application/json' \ --data '{ "name": "my-mssql-rotation", "projectId": "3c90c3cc-0d44-4b50-8888-8dd25736052a", "description": "my database credentials rotation", "connectionId": "3c90c3cc-0d44-4b50-8888-8dd25736052a", "environment": "dev", "secretPath": "/", "isAutoRotationEnabled": true, "rotationInterval": 30, "rotateAtUtc": { "hours": 0, "minutes": 0 }, "parameters": { "username1": "infisical_user_1", "username2": "infisical_user_2" }, "secretsMapping": { "username": "MSSQL_DB_USERNAME", "password": "MSSQL_DB_PASSWORD" } }' ``` ### Sample response ```bash Response theme={"dark"} { "secretRotation": { "id": "3c90c3cc-0d44-4b50-8888-8dd25736052a", "name": "my-mssql-rotation", "description": "my database credentials rotation", "secretsMapping": { "username": "MSSQL_DB_USERNAME", "password": "MSSQL_DB_PASSWORD" }, "isAutoRotationEnabled": true, "activeIndex": 0, "folderId": "3c90c3cc-0d44-4b50-8888-8dd25736052a", "connectionId": "3c90c3cc-0d44-4b50-8888-8dd25736052a", "createdAt": "2023-11-07T05:31:56Z", "updatedAt": "2023-11-07T05:31:56Z", "rotationInterval": 30, "rotationStatus": "success", "lastRotationAttemptedAt": "2023-11-07T05:31:56Z", "lastRotatedAt": "2023-11-07T05:31:56Z", "lastRotationJobId": "3c90c3cc-0d44-4b50-8888-8dd25736052a", "nextRotationAt": "2023-11-07T05:31:56Z", "connection": { "app": "mssql", "name": "my-mssql-connection", "id": "3c90c3cc-0d44-4b50-8888-8dd25736052a" }, "environment": { "slug": "dev", "name": "Development", "id": "3c90c3cc-0d44-4b50-8888-8dd25736052a" }, "projectId": "3c90c3cc-0d44-4b50-8888-8dd25736052a", "folder": { "id": "3c90c3cc-0d44-4b50-8888-8dd25736052a", "path": "/" }, "rotateAtUtc": { "hours": 0, "minutes": 0 }, "lastRotationMessage": null, "type": "mssql-credentials", "parameters": { "username1": "infisical_user_1", "username2": "infisical_user_2" } } } ``` --- # Source: https://infisical.com/docs/integrations/app-connections/mssql.md # Source: https://infisical.com/docs/documentation/platform/dynamic-secrets/mssql.md > ## Documentation Index > Fetch the complete documentation index at: https://infisical.com/docs/llms.txt > Use this file to discover all available pages before exploring further. # MS SQL > Learn how to dynamically generate MS SQL database user credentials. The Infisical MS SQL dynamic secret allows you to generate Microsoft SQL server database credentials on demand based on configured role. ## Prerequisite Create a user with the required permission in your SQL instance. This user will be used to create new accounts on-demand. ## Set up Dynamic Secrets with MS SQL Open the Secret Overview dashboard and select the environment in which you would like to add a dynamic secret. Add Dynamic Secret Button Dynamic Secret Modal Name by which you want the secret to be referenced Default time-to-live for a generated secret (it is possible to modify this value after a secret is generated) Maximum time-to-live for a generated secret List of key/value metadata pairs Choose the service you want to generate dynamic secrets for. This must be selected as **MS SQL**. Database host Database port Username that will be used to create dynamic secrets Password that will be used to create dynamic secrets Name of the database for which you want to create dynamic secrets A CA may be required if your DB requires it for incoming connections. AWS RDS instances with default settings will requires a CA which can be downloaded [here](https://docs.aws.amazon.com/AmazonRDS/latest/UserGuide/UsingWithRDS.SSL.html#UsingWithRDS.SSL.CertificatesAllRegions). Dynamic Secret Setup Modal Modify SQL Statements Modal Specifies a template for generating usernames. This field allows customization of how usernames are automatically created. Allowed template variables are: * `{{randomUsername}}`: Random username string. * `{{unixTimestamp}}`: Current Unix timestamp at the time of lease creation. * `{{identity.name}}`: Name of the identity that is generating the lease. * `{{dynamicSecret.name}}`: Name of the associated dynamic secret. * `{{dynamicSecret.type}}`: Type of the associated dynamic secret. * `{{random N}}`: Random string of N characters. Allowed template functions are: * `truncate`: Truncates a string to a specified length. * `replace`: Replaces a substring with another value. * `uppercase`: Converts a string to uppercase. * `lowercase`: Converts a string to lowercase. Examples: ```yaml theme={"dark"} {{ randomUsername }} // 3POnzeFyK9gW2nioK0q2gMjr6CZqsRiX {{ unixTimestamp }} // 17490641580 {{ identity.name }} // {{ random 5 }} // x9K2m {{ truncate identity.name 4 }} // test {{ replace identity.name '' 'new-value' }} // new-value ``` After submitting the form, you will see a dynamic secret created in the dashboard. If this step fails, you may have to add the CA certificate. Dynamic Secret Once you've successfully configured the dynamic secret, you're ready to generate on-demand credentials. To do this, simply click on the 'Generate' button which appears when hovering over the dynamic secret item. Alternatively, you can initiate the creation of a new lease by selecting 'New Lease' from the dynamic secret lease list section. Dynamic Secret Dynamic Secret When generating these secrets, it's important to specify a Time-to-Live (TTL) duration. This will dictate how long the credentials are valid for. Provision Lease Ensure that the TTL for the lease falls within the maximum TTL defined when configuring the dynamic secret. Once you click the `Submit` button, a new secret lease will be generated and the credentials for it will be shown to you. Provision Lease ## Audit or Revoke Leases Once you have created one or more leases, you will be able to access them by clicking on the respective dynamic secret item on the dashboard. This will allow you to see the expiration time of the lease or delete the lease before it's set time to live. Provision Lease ## Renew Leases To extend the life of the generated dynamic secret leases past its initial time to live, simply click on the **Renew** button as illustrated below. Provision Lease Lease renewals cannot exceed the maximum TTL set when configuring the dynamic secret --- # Source: https://infisical.com/docs/documentation/platform/secret-rotation/mysql-credentials.md > ## Documentation Index > Fetch the complete documentation index at: https://infisical.com/docs/llms.txt > Use this file to discover all available pages before exploring further. # MySQL Credentials Rotation > Learn how to automatically rotate MySQL credentials. ## Prerequisites 1. Create a [MySQL Connection](/integrations/app-connections/mysql) with the required **Secret Rotation** permissions 2. Create two designated database users for Infisical to rotate the credentials for. Be sure to grant each user login permissions for the desired database with the necessary privileges their use case will require. An example creation statement might look like: ```SQL theme={"dark"} -- create user roles CREATE USER 'infisical_user_1'@'%' IDENTIFIED BY 'temporary_password'; CREATE USER 'infisical_user_2'@'%' IDENTIFIED BY 'temporary_password'; -- grant all privileges GRANT ALL PRIVILEGES ON my_database.* TO 'infisical_user_1'@'%'; GRANT ALL PRIVILEGES ON my_database.* TO 'infisical_user_2'@'%'; -- apply the privilege changes FLUSH PRIVILEGES; ``` To learn more about the MySQL permission system, please visit their [documentation](https://dev.mysql.com/doc/refman/8.4/en/grant.html). 3. Ensure your network security policies allow incoming requests from Infisical to this rotation provider, if network restrictions apply. ## Create a MySQL Credentials Rotation in Infisical 1. Navigate to your Secret Manager Project's Dashboard and select **Add Secret Rotation** from the actions dropdown. Secret Manager Dashboard 2. Select the **MySQL Credentials** option. Select MySQL Credentials 3. Select the **MySQL Connection** to use and configure the rotation behavior. Then click **Next**. Rotation Configuration * **MySQL Connection** - the connection that will perform the rotation of the configured database user credentials. * **Rotation Interval** - the interval, in days, that once elapsed will trigger a rotation. * **Rotate At** - the local time of day when rotation should occur once the interval has elapsed. * **Auto-Rotation Enabled** - whether secrets should automatically be rotated once the rotation interval has elapsed. Disable this option to manually rotate secrets or pause secret rotation. 4. Input the usernames of the database users created above that will be used for rotation. Then click **Next**. Rotation Parameters * **Database Username 1** - the username of the first user that will be used for rotation. * **Database Username 2** - the username of the second user that will be used for rotation. Rotation Advance Parameters * **Rotation Statement** - the template string query to generate password for the rotated user. * **Password Requirements** - the requirements for the password of the MySQL users that will be created for the rotation. 5. Specify the secret names that the active credentials should be mapped to. Then click **Next**. Rotation Secrets Mapping * **Username** - the name of the secret that the active username will be mapped to. * **Password** - the name of the secret that the active password will be mapped to. 6. Give your rotation a name and description (optional). Then click **Next**. Rotation Details * **Name** - the name of the secret rotation configuration. Must be slug-friendly. * **Description** (optional) - a description of this rotation configuration. 7. Review your configuration, then click **Create Secret Rotation**. Rotation Review 8. Your **MySQL Credentials** are now available for use via the mapped secrets. Rotation Created To create a MySQL Credentials Rotation, make an API request to the [Create MySQL Credentials Rotation](/api-reference/endpoints/secret-rotations/mysql-credentials/create) API endpoint. ### Sample request ```bash Request theme={"dark"} curl --request POST \ --url https://us.infisical.com/api/v2/secret-rotations/mysql-credentials \ --header 'Content-Type: application/json' \ --data '{ "name": "my-mysql-rotation", "projectId": "3c90c3cc-0d44-4b50-8888-8dd25736052a", "description": "my database credentials rotation", "connectionId": "3c90c3cc-0d44-4b50-8888-8dd25736052a", "environment": "dev", "secretPath": "/", "isAutoRotationEnabled": true, "rotationInterval": 30, "rotateAtUtc": { "hours": 0, "minutes": 0 }, "parameters": { "username1": "infisical_user_1", "username2": "infisical_user_2" }, "secretsMapping": { "username": "MYSQL_USERNAME", "password": "MYSQL_PASSWORD" } }' ``` ### Sample response ```bash Response theme={"dark"} { "secretRotation": { "id": "3c90c3cc-0d44-4b50-8888-8dd25736052a", "name": "my-mysql-rotation", "description": "my database credentials rotation", "secretsMapping": { "username": "MYSQL_USERNAME", "password": "MYSQL_PASSWORD" }, "isAutoRotationEnabled": true, "activeIndex": 0, "folderId": "3c90c3cc-0d44-4b50-8888-8dd25736052a", "connectionId": "3c90c3cc-0d44-4b50-8888-8dd25736052a", "createdAt": "2023-11-07T05:31:56Z", "updatedAt": "2023-11-07T05:31:56Z", "rotationInterval": 30, "rotationStatus": "success", "lastRotationAttemptedAt": "2023-11-07T05:31:56Z", "lastRotatedAt": "2023-11-07T05:31:56Z", "lastRotationJobId": "3c90c3cc-0d44-4b50-8888-8dd25736052a", "nextRotationAt": "2023-11-07T05:31:56Z", "connection": { "app": "mysql", "name": "my-mysql-connection", "id": "3c90c3cc-0d44-4b50-8888-8dd25736052a" }, "environment": { "slug": "dev", "name": "Development", "id": "3c90c3cc-0d44-4b50-8888-8dd25736052a" }, "projectId": "3c90c3cc-0d44-4b50-8888-8dd25736052a", "folder": { "id": "3c90c3cc-0d44-4b50-8888-8dd25736052a", "path": "/" }, "rotateAtUtc": { "hours": 0, "minutes": 0 }, "lastRotationMessage": null, "type": "mysql-credentials", "parameters": { "username1": "infisical_user_1", "username2": "infisical_user_2" } } } ``` --- # Source: https://infisical.com/docs/integrations/app-connections/mysql.md # Source: https://infisical.com/docs/documentation/platform/dynamic-secrets/mysql.md > ## Documentation Index > Fetch the complete documentation index at: https://infisical.com/docs/llms.txt > Use this file to discover all available pages before exploring further. # MySQL > Learn how to dynamically generate MySQL Database user credentials. The Infisical MySQL dynamic secret allows you to generate MySQL Database credentials on demand based on configured role. ## Prerequisite Create a user with the required permission in your SQL instance. This user will be used to create new accounts on-demand. ## Set up Dynamic Secrets with MySQL Open the Secret Overview dashboard and select the environment in which you would like to add a dynamic secret. Add Dynamic Secret Button Dynamic Secret Modal Name by which you want the secret to be referenced Default time-to-live for a generated secret (it is possible to modify this value after a secret is generated) Maximum time-to-live for a generated secret List of key/value metadata pairs Choose the service you want to generate dynamic secrets for. This must be selected as **MySQL**. Database host Database port Username that will be used to create dynamic secrets Password that will be used to create dynamic secrets Name of the database for which you want to create dynamic secrets A CA may be required if your DB requires it for incoming connections. AWS RDS instances with default settings will requires a CA which can be downloaded [here](https://docs.aws.amazon.com/AmazonRDS/latest/UserGuide/UsingWithRDS.SSL.html#UsingWithRDS.SSL.CertificatesAllRegions). Modify SQL Statements Modal Specifies a template for generating usernames. This field allows customization of how usernames are automatically created. Allowed template variables are: * `{{randomUsername}}`: Random username string. * `{{unixTimestamp}}`: Current Unix timestamp at the time of lease creation. * `{{identity.name}}`: Name of the identity that is generating the lease. * `{{dynamicSecret.name}}`: Name of the associated dynamic secret. * `{{dynamicSecret.type}}`: Type of the associated dynamic secret. * `{{random N}}`: Random string of N characters. Allowed template functions are: * `truncate`: Truncates a string to a specified length. * `replace`: Replaces a substring with another value. * `uppercase`: Converts a string to uppercase. * `lowercase`: Converts a string to lowercase. Examples: ```yaml theme={"dark"} {{ randomUsername }} // 3POnzeFyK9gW2nioK0q2gMjr6CZqsRiX {{ unixTimestamp }} // 17490641580 {{ identity.name }} // {{ random 5 }} // x9K2m {{ truncate identity.name 4 }} // test {{ replace identity.name '' 'new-value' }} // new-value ``` After submitting the form, you will see a dynamic secret created in the dashboard. If this step fails, you may have to add the CA certificate. Dynamic Secret Once you've successfully configured the dynamic secret, you're ready to generate on-demand credentials. To do this, simply click on the 'Generate' button which appears when hovering over the dynamic secret item. Alternatively, you can initiate the creation of a new lease by selecting 'New Lease' from the dynamic secret lease list section. Dynamic Secret Dynamic Secret When generating these secrets, it's important to specify a Time-to-Live (TTL) duration. This will dictate how long the credentials are valid for. Provision Lease Ensure that the TTL for the lease falls within the maximum TTL defined when configuring the dynamic secret. Once you click the `Submit` button, a new secret lease will be generated and the credentials from it will be shown to you. Provision Lease ## Audit or Revoke Leases Once you have created one or more leases, you will be able to access them by clicking on the respective dynamic secret item on the dashboard. This will allow you to see the expiration time of the lease or delete a lease before it's set time to live. Provision Lease ## Renew Leases To extend the life of the generated dynamic secret leases past its initial time to live, simply click on the **Renew** button as illustrated below. Provision Lease Lease renewals cannot exceed the maximum TTL set when configuring the dynamic secret --- # Source: https://infisical.com/docs/integrations/frameworks/nestjs.md > ## Documentation Index > Fetch the complete documentation index at: https://infisical.com/docs/llms.txt > Use this file to discover all available pages before exploring further. # NestJS > How to use Infisical to inject environment variables and secrets into a NestJS app. Prerequisites: * Set up and add envars to [Infisical Cloud](https://app.infisical.com) * [Install the CLI](/cli/overview) ## Initialize Infisical for your [NestJS](https://nestjs.com) app ```bash theme={"dark"} # navigate to the root of your of your project cd /path/to/project # then initialize infisical infisical init ``` ## Start your application as usual but with Infisical ```bash theme={"dark"} infisical run -- # Example infisical run -- npm run start:dev ``` --- # Source: https://infisical.com/docs/integrations/secret-syncs/netlify.md # Source: https://infisical.com/docs/integrations/app-connections/netlify.md > ## Documentation Index > Fetch the complete documentation index at: https://infisical.com/docs/llms.txt > Use this file to discover all available pages before exploring further. # Netlify Connection > Learn how to configure a Netlify Connection for Infisical. Infisical supports the use of [Personal Access Tokens](https://docs.netlify.com/api/get-started/#get-access-tokens) to connect with Netlify. Netlify requires the token to have **full access** to enable secret management for your sites and services. ## Create a Netlify Personal Access Token Netlify User Settings Applications Tab Provide a name for your token and generate it. Token Form Make sure to copy the token now—you won’t be able to access it again. Token Generated ## Create a Netlify Connection in Infisical In your Infisical dashboard, navigate to the **Integrations** tab in the desired project, then select **App Connections**. App Connections Tab Click **+ Add Connection** and choose **Netlify Connection** from the list of integrations. Select Netlify Connection Complete the form by providing: * A descriptive name for the connection * An optional description * The API Token from the previous step Netlify Connection Modal After submitting the form, your **Netlify Connection** will be successfully created and ready to use with your Infisical project. Netlify Connection Created To create a Netlify Connection via API, send a request to the [Create Netlify Connection](/api-reference/endpoints/app-connections/netlify/create) endpoint. ### Sample request ```bash Request theme={"dark"} curl --request POST \ --url https://app.infisical.com/api/v1/app-connections/netlify \ --header 'Content-Type: application/json' \ --data '{ "name": "my-netlify-connection", "method": "access-token", "projectId": "7ffbb072-2575-495a-b5b0-127f88caef78", "credentials": { "accessToken": "[ACCESS TOKEN]" } }' ``` ### Sample response ```bash Response theme={"dark"} { "appConnection": { "id": "a1b2c3d4-5678-90ab-cdef-1234567890ab", "name": "my-netlify-connection", "description": null, "projectId": "7ffbb072-2575-495a-b5b0-127f88caef78", "version": 1, "orgId": "abcdef12-3456-7890-abcd-ef1234567890", "createdAt": "2025-07-19T10:15:00.000Z", "updatedAt": "2025-07-19T10:15:00.000Z", "isPlatformManagedCredentials": false, "credentialsHash": "d41d8cd98f00b204e9800998ecf8427e", "app": "netlify", "method": "access-token", "credentials": {} } } ``` --- # Source: https://infisical.com/docs/documentation/setup/networking.md > ## Documentation Index > Fetch the complete documentation index at: https://infisical.com/docs/llms.txt > Use this file to discover all available pages before exploring further. # Networking > Network configuration details for Infisical Cloud When integrating your infrastructure with Infisical Cloud, you may need to configure network access controls. This page provides the IP addresses that Infisical uses to communicate with your services. ## Infisical IP Addresses Infisical Cloud operates from multiple regions. If your infrastructure has strict network policies, you may need to allow traffic from Infisical by adding the following IP addresses to your ingress rules. These are the IP addresses that Infisical uses when making outbound requests to your services. ``` 3.213.63.16 54.164.68.7 ``` ``` 3.77.89.19 3.125.209.189 ``` For dedicated Infisical deployments, please contact your account manager for the specific IP addresses used in your dedicated environment. These IP addresses are static and managed by Infisical. Any changes will be communicated with 60-day advance notice. ## What These IP Addresses Are Used For These IP addresses represent the source IPs you'll see when Infisical Cloud makes connections to your infrastructure. All outbound traffic from Infisical Cloud originates from these IP addresses, ensuring predictable source IP addresses for your firewall rules. --- # Source: https://infisical.com/docs/documentation/guides/nextjs-vercel.md > ## Documentation Index > Fetch the complete documentation index at: https://infisical.com/docs/llms.txt > Use this file to discover all available pages before exploring further. # Next.js + Vercel This guide demonstrates how to use Infisical to manage secrets for your Next.js + Vercel stack from local development to production. It uses: * Infisical (you can use [Infisical Cloud](https://app.infisical.com) or a [self-hosted instance of Infisical](https://infisical.com/docs/self-hosting/overview)) to store your secrets. ## Project Setup To begin, we need to set up a project in Infisical and add secrets to an environment in it. ### Create a project 1. Create a new project in [Infisical](https://app.infisical.com/). 2. Add a secret to the development environment of this project so we can pull it back for local development. In the **Secrets Overview** page, press **Explore Development** and add a secret with the key `NEXT_PUBLIC_NAME` and value `YOUR_NAME`. 3. Add a secret to the production environment of this project so we can sync it to Vercel. Switch to the **Production** environment and add a secret with the key `NEXT_PUBLIC_NAME` and value `ANOTHER_NAME`. ## Create a Next.js app Initialize a new Node.js app. We can use `create-next-app` to initialize an app called `infisical-nextjs`. ```console theme={"dark"} npx create-next-app@latest --use-npm infisical-nextjs cd infisical-nextjs ``` ```console theme={"dark"} npx create-next-app@latest --ts --use-npm infisical-nextjs cd infisical-nextjs ``` Next, inside `pages/_app.js`, lets add a `console.log()` to print out the environment variable in the browser console. ```js theme={"dark"} import '@/styles/globals.css' export default function App({ Component, pageProps }) { console.log('Hello, ', process.env.NEXT_PUBLIC_NAME); return } ``` ```tsx theme={"dark"} import '@/styles/globals.css' import type { AppProps } from 'next/app' export default function App({ Component, pageProps }: AppProps) { console.log('Hello, ', process.env.NEXT_PUBLIC_NAME); return } ``` ## Infisical CLI for local development environment variables We'll now use the Infisical CLI to fetch secrets from Infisical into your Next.js app for local development. ### CLI Installation Follow the instructions for your operating system to install the Infisical CLI. Use [brew](https://brew.sh/) package manager ```console theme={"dark"} $ brew install infisical/get-cli/infisical ``` Use [Scoop](https://scoop.sh/) package manager ```console theme={"dark"} $ scoop bucket add org https://github.com/Infisical/scoop-infisical.git ``` ```console theme={"dark"} $ scoop install infisical ``` Install prerequisite ```console theme={"dark"} $ apk add --no-cache bash sudo ``` Add Infisical repository ```console theme={"dark"} $ curl -1sLf \ 'https://dl.cloudsmith.io/public/infisical/infisical-cli/setup.alpine.sh' \ | bash ``` Then install CLI ```console theme={"dark"} $ apk update && sudo apk add infisical ``` Add Infisical repository ```console theme={"dark"} $ curl -1sLf \ 'https://dl.cloudsmith.io/public/infisical/infisical-cli/setup.rpm.sh' \ | sudo -E bash ``` Then install CLI ```console theme={"dark"} $ sudo yum install infisical ``` Add Infisical repository ```console theme={"dark"} $ curl -1sLf \ 'https://dl.cloudsmith.io/public/infisical/infisical-cli/setup.deb.sh' \ | sudo -E bash ``` Then install CLI ```console theme={"dark"} $ sudo apt-get update && sudo apt-get install -y infisical ``` Use the `yay` package manager to install from the [Arch User Repository](https://aur.archlinux.org/packages/infisical-bin) ```console theme={"dark"} $ yay -S infisical-bin ``` ### Login Authenticate the CLI with the Infisical platform using your email and password. ```console theme={"dark"} $ infisical login ``` ### Initialization Run the `init` command at the root of the Next.js app. This step connects your local project to the project on the Infisical platform and creates a `infisical.json` file containing a reference to that latter project. ```console theme={"dark"} $ infisical init ``` ### Start the Next.js app with secrets injected as environment variables ```console theme={"dark"} $ infisical run -- npm run dev ``` If you open your browser console, **Hello, YOUR\_NAME** should be printed out. Here, the CLI fetched the secret from Infisical and injected it into the Next.js app upon starting up. By default, the CLI fetches secrets from the development environment which has the slug `dev`; you can inject secrets from different environments by modifying the `env` flag as per the [CLI documentation](/cli/usage). At this stage, you know how to use the Infisical CLI to inject secrets into your Next.js app for local development. ## Infisical-Vercel integration for production environment variables Use our [Vercel Secret Syncs](../../integrations/secret-syncs/vercel) guide to sync secrets from Infisical to Vercel as production environment variables. At this stage, you know how to use the Infisical-Vercel integration to sync production secrets from Infisical to Vercel. The following environment variable names are reserved by Vercel and cannot be synced: `AWS_SECRET_KEY`, `AWS_EXECUTION_ENV`, `AWS_LAMBDA_LOG_GROUP_NAME`, `AWS_LAMBDA_LOG_STREAM_NAME`, `AWS_LAMBDA_FUNCTION_NAME`, `AWS_LAMBDA_FUNCTION_MEMORY_SIZE`, `AWS_LAMBDA_FUNCTION_VERSION`, `NOW_REGION`, `TZ`, `LAMBDA_TASK_ROOT`, `LAMBDA_RUNTIME_DIR`, `AWS_ACCESS_KEY_ID`, `AWS_SECRET_ACCESS_KEY`, `AWS_SESSION_TOKEN`, `AWS_REGION`, and `AWS_DEFAULT_REGION`. ## FAQ Vercel does not specialize in secret management which means it lacks many useful features for effectively managing environment variables. Here are some features that teams benefit from by using Infisical together with Vercel: * Audit logs: See which team members are creating, reading, updating, and deleting environment variables across all environments. * Versioning and point in time recovery: Rolling back secrets and an entire project state. * Overriding secrets that should be unique amongst team members. And much more. Yes. Your secrets are still encrypted at rest. To note, most secret managers actually don't support end-to-end encryption. Check out the [security guide](/internals/security). See also: * [Documentation for the Infisical CLI](/cli/overview) * [Documentation for the Vercel Secret Sync](../../integrations/secret-syncs/vercel) --- # Source: https://infisical.com/docs/integrations/frameworks/nextjs.md > ## Documentation Index > Fetch the complete documentation index at: https://infisical.com/docs/llms.txt > Use this file to discover all available pages before exploring further. # Next.js > How to use Infisical to inject environment variables and secrets into a Next.js app. Prerequisites: * Set up and add envars to [Infisical Cloud](https://app.infisical.com) * [Install the CLI](/cli/overview) ## Initialize Infisical for your [Next.js](https://nextjs.org) app ```bash theme={"dark"} # navigate to the root of your of your project cd /path/to/project # then initialize infisical infisical init ``` ## Start your application as usual but with Infisical ```bash theme={"dark"} infisical run -- # Example infisical run -- npm run dev ``` Note that for environment variables to be exposed to the client, you'll have to prefix them with `NEXT_PUBLIC_`. Read more about that [here](https://nextjs.org/docs/basic-features/environment-variables). --- # Source: https://infisical.com/docs/documentation/platform/pki/integration-guides/nginx-certbot.md > ## Documentation Index > Fetch the complete documentation index at: https://infisical.com/docs/llms.txt > Use this file to discover all available pages before exploring further. # Nginx > Learn how to issue TLS certificates from Infisical using ACME enrollment on Nginx with Certbot This guide demonstrates how to use Infisical to issue TLS certificates for your [Nginx](https://nginx.org/) server. It uses [Certbot](https://certbot.eff.org/), an installable [ACME](https://en.wikipedia.org/wiki/Automatic_Certificate_Management_Environment) client, to request and renew certificates from Infisical using the [ACME enrollment method](/documentation/platform/pki/enrollment-methods/acme) configured on a [certificate profile](/documentation/platform/pki/certificates/profiles). ## Prerequisites Before you begin, make sure you have: * An [Nginx](https://nginx.org/) web server running on a Linux system with administrative access. * A [certificate profile](/documentation/platform/pki/certificates/profiles) configured with the [ACME enrollment method](/documentation/platform/pki/enrollment-methods/acme) in Infisical. * Network connectivity from your Nginx server to Infisical. * Port 80 open and reachable for ACME [HTTP-01](https://letsencrypt.org/docs/challenge-types/#http-01-challenge) validation. ## Guide Navigate to your certificate management project in Infisical and locate your [certificate profile](/documentation/platform/pki/certificates/profiles) configured with the [ACME enrollment method](/documentation/platform/pki/enrollment-methods/acme). Certificate profile with ACME enrollment option Click the **Reveal ACME EAB** option to view the ACME configuration details. ACME configuration modal showing directory URL and EAB credentials From the ACME configuration, gather the following values: * ACME Directory URL: The URL that Certbot will use to communicate with Infisical's ACME server. This takes the form `https://your-infisical-instance.com/api/v1/cert-manager/certificate-profiles/{profile-id}/acme/directory`. * EAB Key Identifier (KID): A unique identifier that tells Infisical which ACME account is making the request. * EAB Secret: A secret key that authenticates your ACME client with Infisical. Keep your EAB credentials secure as they authenticate your ACME client with Infisical PKI. These credentials are unique to each [certificate profile](/documentation/platform/pki/certificates/profiles) and should not be shared. Install Certbot on the server where Nginx is running by following the official Certbot [installation guide](https://certbot.eff.org/instructions). The installation guide provides up-to-date instructions for various Linux distributions and package managers, ensuring you get the most current version and proper Nginx plugin integration. After installation, you can verify that Certbot has been installed correctly by running: ```bash theme={"dark"} certbot --version ``` Run the following command to request a certificate from Infisical: ```bash theme={"dark"} sudo certbot certonly \ --nginx \ --server "https://your-infisical-instance.com/api/v1/cert-manager/certificate-profiles/{profile-id}/acme/directory" \ --eab-kid "your-eab-key-identifier" \ --eab-hmac-key "your-eab-secret" \ -d example.infisical.com \ --email admin@example.com \ --agree-tos \ --non-interactive ``` For guidance on each parameter: * `certonly`: Instructs Certbot to request a certificate without modifying and reloading your Nginx configuration file(s); this mode is recommended if you prefer to manage your Nginx TLS configuration manually, use automation tools, or integrate certificates into an existing deployment workflow. * `--nginx`: Specifies the Nginx plugin so Certbot can solve the [HTTP-01](https://letsencrypt.org/docs/challenge-types/#http-01-challenge) challenge by creating temporary files served by Nginx. * `--server`: The Infisical ACME directory URL from Step 1. This instructs Certbot to communicate with Infisical's ACME server instead of Let's Encrypt. * `--eab-kid`: Your External Account Binding (EAB) Key Identifier from Step 1. * `--eab-hmac-key`: The EAB secret associated with the KID from Step 1. * `-d`: Specifies the domain name for which the certificate is being requested. * `--email`: The contact email for expiration notices and account recovery. * `--agree-tos`: Accepts the ACME server’s Terms of Service. * `--non-interactive`: Runs Certbot without prompting for user input (recommended for automation). The Certbot command generates a private key on your server, creates a Certificate Signing Request (CSR) using that key, and sends the CSR to Infisical for certificate issuance. Certbot stores the private key and resulting leaf certificate and full certificate chain in `/etc/letsencrypt/live/{domain-name}/`. If `--certonly` is used: Certbot does **not** modify your Nginx configuration, so you must manually update your Nginx server block to reference the new certificate files and reload the server to apply the changes. Here's how you can configure your server block: ```nginx theme={"dark"} server { listen 443 ssl; server_name example.infisical.com; ssl_certificate /etc/letsencrypt/live/example.infisical.com/fullchain.pem; ssl_certificate_key /etc/letsencrypt/live/example.infisical.com/privkey.pem; # ...your existing configuration... } ``` After updating the server block, you should test and reload Nginx to apply the changes: ```bash theme={"dark"} sudo nginx -t sudo systemctl reload nginx ``` If `--certonly` was **not** used: Certbot uses Nginx installer mode, which attempts to automatically configure HTTPS by updating your Nginx server block and reloading the server if needed. At this point, your Nginx server should be successfully serving HTTPS using the certificate issued by Infisical. After configuring Nginx SSL, verify that your certificate was issued correctly and Nginx is serving it properly. Check that the certificate files were created by Certbot: ```bash theme={"dark"} sudo ls -la /etc/letsencrypt/live/example.infisical.com/ ``` You should see files like: * `cert.pem` (your certificate) * `chain.pem` (certificate chain) * `fullchain.pem` (certificate + chain) * `privkey.pem` (private key) Certbot automatically installs a `systemd` timer during installation. This timer runs twice per day and checks whether any certificates are due for renewal. Because Certbot stores the ACME server URL and EAB credentials from your initial request, renewal will automatically use the same Infisical ACME configuration—no additional settings are required. Note that Certbot automatically renews certificates when they are within 30 days of expiration; renewal settings can be adjusted in `/etc/letsencrypt/renewal/{domain-name}.conf`. ```ini theme={"dark"} # ... your existing configuration ... renew_before_expiry = 30 days ``` To test the renewal process, run the following command: ```bash theme={"dark"} sudo certbot renew --dry-run ``` This command simulates the full renewal process without modifying your active certificate. If the dry run succeeds, automatic renewal will work as expected. To trigger an actual renewal immediately, run the following command: ```bash theme={"dark"} sudo certbot renew --force-renewal ``` Note that after a certificate is renewed, Nginx must be reloaded so it can begin using the new certificate. To do this, run the following command: ```bash theme={"dark"} systemctl reload nginx ``` To automate the process of renewing a certificate and reloading Nginx, you can create a simple deploy hook that Certbot will run after every successful renewal. Inside `/etc/letsencrypt/renewal-hooks/deploy/reload-nginx.sh`, add the following: ```bash theme={"dark"} #!/bin/sh systemctl reload nginx ``` Then make the hook executable: ```bash theme={"dark"} sudo chmod +x /etc/letsencrypt/renewal-hooks/deploy/reload-nginx.sh ``` --- # Source: https://infisical.com/docs/sdks/languages/node.md # Source: https://infisical.com/docs/documentation/guides/node.md > ## Documentation Index > Fetch the complete documentation index at: https://infisical.com/docs/llms.txt > Use this file to discover all available pages before exploring further. # Node This guide demonstrates how to use Infisical to manage secrets for your Node stack from local development to production. It uses: * Infisical (you can use [Infisical Cloud](https://app.infisical.com) or a [self-hosted instance of Infisical](https://infisical.com/docs/self-hosting/overview)) to store your secrets. * The [@infisical/sdk](https://github.com/Infisical/node-sdk-v2) Node.js client SDK to fetch secrets back to your Node application on demand. ## Project Setup To begin, we need to set up a project in Infisical and add secrets to an environment in it. ### Create a project 1. Create a new project in [Infisical](https://app.infisical.com/). 2. Add a secret to the development environment of this project so we can pull it back for local development. In the **Secrets Overview** page, press **Explore Development** and add a secret with the key `NAME` and value `YOUR_NAME`. ### Create a Machine Identity Now that we've created a project and added a secret to its development environment, we need to configure an Infisical Machine Identity that our Node application can use to access the secret. * [How to setup machine identities](/documentation/platform/identities/overview) ## Create a Node app For this demonstration, we use a minimal Express application. However, the same principles will apply to any Node application such as those built on Koa or Fastify. ### Create an Express app Initialize a new Node.js project with a default `package.json` file. ```console theme={"dark"} npm init -y ``` Install `express` and [@infisical/sdk](https://www.npmjs.com/package/@infisical/sdk), the client Node SDK for Infisical. ```console theme={"dark"} npm install express @infisical/sdk ``` Finally, create an index.js file containing the application code. ```js theme={"dark"} const express = require('express'); const { InfisicalSDK } = require("@infisical/sdk"); const app = express(); const PORT = 3000; let client; const setupClient = () => { if (client) { return; } const infisicalSdk = new InfisicalSDK({ siteUrl: "your-infisical-instance.com" // Optional, defaults to https://app.infisical.com }); await infisicalSdk.auth().universalAuth.login({ clientId: "", clientSecret: "" }); // If authentication was successful, assign the client client = infisicalSdk; } app.get("/", async (req, res) => { const name = await client.secrets().getSecret({ environment: "dev", // dev, staging, prod, etc. projectId: "", secretPath: "/", secretName: "NAME" }); res.send(`Hello! My name is: ${name.secretValue}`); }); app.listen(PORT, async () => { // initialize http server and Infisical await setupClient(); console.log(`Server listening on port ${PORT}`); }); ``` Here, we initialized a `client` instance of the Infisical Node SDK with the [Machine Identity](/documentation/platform/identities/overview) that we created earlier, giving access to the secrets in the development environment of the project in Infisical that we created earlier. Finally, start the app and head to `http://localhost:3000` to see the message **Hello, Your Name**. ```console theme={"dark"} node index.js ``` The client fetched the secret with the key `NAME` from Infisical that we returned in the response of the endpoint. At this stage, you know how to fetch secrets from Infisical back to your Node application. By using Machine Identities scoped to different projects and environments, you can easily manage secrets across various stages of your project in Infisical, from local development to production. ## FAQ The SDK caches every secret and falls back to the cached value if a request fails. If no cached value ever-existed, the SDK falls back to whatever value is on `process.env`. The token enables the SDK to authenticate with Infisical to fetch back your secrets. Although the SDK requires you to pass in a token, it enables greater efficiency and security than if you managed dozens of secrets yourself without it. Here're some benefits: * You always pull in the right secrets because they're fetched on demand from a centralized source that is Infisical. * You can use the Infisical which comes with tons of benefits like secret versioning, access controls, audit logs, etc. * You now risk leaking one token that can be revoked instead of dozens of raw secrets. And much more. See also: * Explore the [Node SDK](https://github.com/Infisical/node-sdk-v2) --- # Source: https://infisical.com/docs/integrations/secret-syncs/northflank.md # Source: https://infisical.com/docs/integrations/app-connections/northflank.md > ## Documentation Index > Fetch the complete documentation index at: https://infisical.com/docs/llms.txt > Use this file to discover all available pages before exploring further. # Northflank Connection > Learn how to configure a Northflank Connection for Infisical. Infisical supports the use of [API Tokens](https://northflank.com/docs/v1/api/use-the-api) to connect with Northflank. Infisical recommends creating a specific API role for the app connection and only giving access to projects that will use the integration. ## Create a Northflank API Token Navigate to your team page and click **Create token**. Create API Role Click on **Create API role**. Create API Role Select all the projects you want this role to have access to, or leave this unchecked if you want to give access to all projects. Create API Role Add the **Projects** -> **Manage** -> **Read** permission. Create API Role Add the **Config & Secrets** -> **Secret Groups** -> **List**, **Update** and **Read Values** permissions. Create API Role Scroll to the bottom and save the API role. Click on the **API** -> **Tokens** menu on the left and then click the **Create API token** button. Create API Token Give a name to the API token and click the **Use role** button for the new API role you just created. Create API Token Click the **View API token** icon to view and copy your token. Create API Token ## Create a Northflank Connection in Infisical In your Infisical dashboard, navigate to the **Integrations** tab in the desired project, then select **App Connections**. App Connections Tab Click **+ Add Connection** and choose **Northflank Connection** from the list of integrations. Select Northflank Connection Complete the form by providing: * A descriptive name for the connection * An optional description * The API Token from the previous step Northflank Connection Modal After submitting the form, your **Northflank Connection** will be successfully created and ready to use with your Infisical project. Northflank Connection Created To create a Northflank Connection via API, send a request to the [Create Northflank Connection](/api-reference/endpoints/app-connections/northflank/create) endpoint. ### Sample request ```bash Request theme={"dark"} curl --request POST \ --url https://app.infisical.com/api/v1/app-connections/northflank \ --header 'Content-Type: application/json' \ --data '{ "name": "my-northflank-connection", "method": "api-token", "projectId": "abcdef12-3456-7890-abcd-ef1234567890", "credentials": { "apiToken": "[API TOKEN]" } }' ``` ### Sample response ```bash Response theme={"dark"} { "appConnection": { "id": "a1b2c3d4-5678-90ab-cdef-1234567890ab", "name": "my-northflank-connection", "description": null, "projectId": "abcdef12-3456-7890-abcd-ef1234567890", "version": 1, "orgId": "abcdef12-3456-7890-abcd-ef1234567890", "createdAt": "2025-01-23T10:15:00.000Z", "updatedAt": "2025-01-23T10:15:00.000Z", "isPlatformManagedCredentials": false, "credentialsHash": "d41d8cd98f00b204e9800998ecf8427e", "app": "northflank", "method": "api-token", "credentials": {} } } ``` --- # Source: https://infisical.com/docs/integrations/frameworks/nuxt.md > ## Documentation Index > Fetch the complete documentation index at: https://infisical.com/docs/llms.txt > Use this file to discover all available pages before exploring further. # Nuxt > How to use Infisical to inject environment variables and secrets into a Nuxt app. Prerequisites: * Set up and add envars to [Infisical Cloud](https://app.infisical.com) * [Install the CLI](/cli/overview) ## Initialize Infisical for your [Nuxt](https://nuxtjs.org) app ```bash theme={"dark"} # navigate to the root of your of your project cd /path/to/project # then initialize infisical infisical init ``` ## Start your application as usual but with Infisical ```bash theme={"dark"} infisical run -- # Example infisical run -- npm run dev ``` --- # Source: https://infisical.com/docs/documentation/platform/identities/oci-auth.md > ## Documentation Index > Fetch the complete documentation index at: https://infisical.com/docs/llms.txt > Use this file to discover all available pages before exploring further. # OCI Auth > Learn how to authenticate with Infisical using OCI user accounts. **OCI Auth** is an OCI-native authentication method that verifies Oracle Cloud Infrastructure users through signature validation, allowing secure access to Infisical resources. ## Diagram The following sequence diagram illustrates the OCI Auth workflow for authenticating OCI users with Infisical. ```mermaid theme={"dark"} sequenceDiagram participant Client participant Infisical participant OCI Note over Client,Client: Step 1: Sign user identity request Note over Client,Infisical: Step 2: Login Operation Client->>Infisical: Send signed request details to /api/v1/auth/oci-auth/login Note over Infisical,OCI: Step 3: Request verification Infisical->>OCI: Forward signed request OCI-->>Infisical: Return user details Note over Infisical: Step 4: Identity property validation Infisical->>Client: Return short-lived access token Note over Client,Infisical: Step 5: Access Infisical API with token Client->>Infisical: Make authenticated requests using the short-lived access token ``` ## Concept At a high level, Infisical authenticates an OCI user by verifying its identity and checking that it meets specific requirements (e.g., its username is authorized, its part of a tenancy) at the `/api/v1/auth/oci-auth/login` endpoint. If successful, then Infisical returns a short-lived access token that can be used to make authenticated requests to the Infisical API. To be more specific: 1. The client [signs](https://docs.oracle.com/en-us/iaas/Content/API/Concepts/signingrequests.htm) a `/20160918/users/{userId}` request using an OCI user's [private key](https://docs.oracle.com/en-us/iaas/Content/API/Concepts/apisigningkey.htm#Required_Keys_and_OCIDs); this is done using the [OCI SDK](https://infisical.com/docs/documentation/platform/identities/oci-auth#accessing-the-infisical-api-with-the-identity) or API. 2. The client sends the signed request's headers and their user OCID to Infisical at the `/api/v1/auth/oci-auth/login` endpoint. 3. Infisical reconstructs the request and sends it to OCI via the [Get User](https://docs.oracle.com/en/engineered-systems/private-cloud-appliance/3.0-latest/ceapi/op-20160918-users-user_id-get.html) endpoint for verification and obtains the identity associated with the OCI user. 4. Infisical checks the user's properties against set criteria such as **Allowed Usernames** and **Tenancy OCID**. 5. If all checks pass, Infisical returns a short-lived access token that the client can use to make authenticated requests to the Infisical API. ## Prerequisite In order to sign requests, you must have an OCI user with credentials such as the private key. If you're unaware of how to create a user and obtain the needed credentials, expand the menu below. Search Domains Select the domain in which you want to create the Infisical user account. Select Domain Select Users Click Create User The name, email, and username can be anything. Create User After you've created a user, you'll be redirected to the user's page. Navigate to 'API keys'. Select API Keys Click on 'Add API key' and then download or import the private key. After you've obtained the private key, click 'Add'. Add API Key At the end of the downloaded private key file, you'll see `OCI_API_KEY`. This is not apart of the private key, and should not be included when you use the private key to sign requests. After creating the API key, you'll be shown a modal with relevant information. Save the highlighted values (and the private key) for later steps. User Info ## Guide In the following steps, we explore how to create and use identities for your workloads and applications on OCI to access the Infisical API using the OCI request signing authentication method. ### Creating an identity To create an identity, head to your Organization Settings > Access Control > [Identities](https://app.infisical.com/organization/access-management?selectedTab=identities) and press **Create identity**. identities organization When creating an identity, you specify an organization-level [role](/documentation/platform/access-controls/role-based-access-controls) for it to assume; you can configure roles in Organization Settings > Access Control > [Organization Roles](https://app.infisical.com/organization/access-management?selectedTab=roles). identities organization create Input some details for your new identity: * **Name (required):** A friendly name for the identity. * **Role (required):** A role from the [**Organization Roles**](https://app.infisical.com/organization/access-management?selectedTab=roles) tab for the identity to assume. The organization role assigned will determine what organization-level resources this identity can have access to. Once you've created an identity, you'll be redirected to a page where you can manage the identity. identities page Since the identity has been configured with [Universal Auth](https://infisical.com/docs/documentation/platform/identities/universal-auth) by default, you should reconfigure it to use OCI Auth instead. To do this, click the cog next to **Universal Auth** and then select **Delete** in the options dropdown. identities press cog identities page remove default auth Now create a new OCI Auth Method. identities create oci auth method Here's some information about each field: * **Tenancy OCID:** The OCID of your tenancy. All users authenticating must be part of this Tenancy. * **Allowed Usernames:** A comma-separated list of trusted OCI users that are allowed to authenticate with Infisical. * **Access Token TTL (default is `2592000` equivalent to 30 days):** The lifetime for an access token in seconds. This value will be referenced at renewal time. * **Access Token Max TTL (default is `2592000` equivalent to 30 days):** The maximum lifetime for an access token in seconds. This value will be referenced at renewal time. * **Access Token Max Number of Uses (default is `0`):** The maximum number of times that an access token can be used; a value of `0` implies an infinite number of uses. * **Access Token Trusted IPs:** The IPs or CIDR ranges that access tokens can be used from. By default, each token is given the `0.0.0.0/0`, allowing usage from any network address. ### Adding an identity to a project In order to allow an identity to access project-level resources such as secrets, you must add it to the relevant projects. To do this, head over to the project you want to add the identity to and navigate to Project Settings > Access Control > Machine Identities and press **Add Identity**. identities project Select the identity you want to add to the project and the project-level role you want it to assume. The project role given to the identity will determine what project-level resources this identity can access. identities project create ### Accessing the Infisical API with the identity To access the Infisical API as the identity, you need to construct a signed [Get User](https://docs.oracle.com/en/engineered-systems/private-cloud-appliance/3.0-latest/ceapi/op-20160918-users-user_id-get.html) request using [OCI Signature v1](https://docs.oracle.com/en-us/iaas/Content/API/Concepts/signingrequests.htm#Request_Signatures) and then make a request to the `/api/v1/auth/oci-auth/login` endpoint passing the signed header data and user OCID. Below is an example of how you can authenticate with Infisical using the `oci-sdk` for NodeJS. ```typescript theme={"dark"} import { common } from "oci-sdk"; // Change these credentials to match your OCI user const tenancyId = "ocid1.tenancy.oc1..example"; const userId = "ocid1.user.oc1..example"; const fingerprint = "00:00:00:00:00:00:00:00:00:00:00:00:00:00:00:00"; const region = "us-ashburn-1"; const privateKey = "..."; // Must be PEM format const provider = new common.SimpleAuthenticationDetailsProvider( tenancyId, userId, fingerprint, privateKey, null, common.Region.fromRegionId(region), ); // Build request const headers = new Headers({ host: `identity.${region}.oraclecloud.com`, }); const request: common.HttpRequest = { method: "GET", uri: `/20160918/users/${userId}`, headers, body: null, }; // Sign request const signer = new common.DefaultRequestSigner(provider); await signer.signHttpRequest(request); // Forward signed request to Infisical const requestAsJson = { identityId: "2dd11664-68e3-471d-b366-907206ab1bff", userOcid: userId, headers: Object.fromEntries(request.headers.entries()), }; const res = await fetch("https://app.infisical.com/api/v1/auth/oci-auth/login", { method: "POST", headers: { "Content-Type": "application/json", }, body: JSON.stringify(requestAsJson), }); const json = await res.json(); console.log("Infisical Response:", json); ``` Each identity access token has a time-to-live (TTL) which you can infer from the response of the login operation; the default TTL is `7200` seconds, which can be adjusted. If an identity access token expires, it can no longer access the Infisical API. A new access token should be obtained by performing another login operation. --- # Source: https://infisical.com/docs/integrations/secret-syncs/oci-vault.md > ## Documentation Index > Fetch the complete documentation index at: https://infisical.com/docs/llms.txt > Use this file to discover all available pages before exploring further. # OCI Vault Sync > Learn how to configure an Oracle Cloud Infrastructure Vault Sync for Infisical. OCI Vault Sync 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 [team@infisical.com](mailto:team@infisical.com) to purchase an enterprise license to use it. **Prerequisites:** * Create an [OCI Connection](/integrations/app-connections/oci) with the required **Secret Sync** permissions * [Create](https://docs.oracle.com/en-us/iaas/Content/Identity/compartments/To_create_a_compartment.htm) or use an existing OCI Compartment (which the OCI Connection is authorized to access) * [Create](https://docs.oracle.com/en-us/iaas/Content/KeyManagement/Tasks/managingvaults_topic-To_create_a_new_vault.htm#createnewvault) or use an existing OCI Vault * Ensure your network security policies allow incoming requests from Infisical to this secret sync provider, if network restrictions apply. Navigate to **Project** > **Integrations** and select the **Secret Syncs** tab. Click on the **Add Sync** button. Secret Syncs Tab Select OCI Vault Configure the **Source** from where secrets should be retrieved, then click **Next**. Configure Source * **Environment**: The project environment to retrieve secrets from. * **Secret Path**: The folder path to retrieve secrets from. If you need to sync secrets from multiple folder locations, check out [secret imports](/documentation/platform/secret-reference#secret-imports). Configure the **Destination** to where secrets should be deployed, then click **Next**. Configure Destination * **OCI Connection**: The OCI Connection to authenticate with. * **Compartment**: The compartment where the vault is located. * **Vault**: The vault to sync secrets to. * **Encryption Key**: The encryption key to use when creating secrets in the vault. Configure the **Sync Options** to specify how secrets should be synced, then click **Next**. Configure Sync Options * **Initial Sync Behavior**: Determines how Infisical should resolve the initial sync. * **Overwrite Destination Secrets**: Removes any secrets at the destination endpoint not present in Infisical. * **Import Secrets (Prioritize Infisical)**: Imports secrets from the destination endpoint before syncing, prioritizing values from Infisical over OCI Vault when keys conflict. * **Import Secrets (Prioritize OCI Vault)**: Imports secrets from the destination endpoint before syncing, prioritizing values from OCI Vault over Infisical when keys conflict. * **Key Schema**: Template that determines how secret names are transformed when syncing, using `{{secretKey}}` as a placeholder for the original secret name and `{{environment}}` for the environment. We highly recommend using a Key Schema to ensure that Infisical only manages the specific keys you intend, keeping everything else untouched. * **Auto-Sync Enabled**: If enabled, secrets will automatically be synced from the source location when changes occur. Disable to enforce manual syncing only. * **Disable Secret Deletion**: If enabled, Infisical will not remove secrets from the sync destination. Enable this option if you intend to manage some secrets manually outside of Infisical. Configure the **Details** of your OCI Vault Sync, then click **Next**. Configure Details * **Name**: The name of your sync. Must be slug-friendly. * **Description**: An optional description for your sync. Review your OCI Vault Sync configuration, then click **Create Sync**. Review Configuration If enabled, your OCI Vault Sync will begin syncing your secrets to the destination endpoint. Sync Created To create an **OCI Vault Sync**, make an API request to the [Create OCI Vault Sync](/api-reference/endpoints/secret-syncs/oci-vault/create) API endpoint. ### Sample request ```bash Request theme={"dark"} curl --request POST \ --url https://app.infisical.com/api/v1/secret-syncs/oci-vault \ --header 'Content-Type: application/json' \ --data '{ "name": "my-oci-vault-sync", "projectId": "3c90c3cc-0d44-4b50-8888-8dd25736052a", "description": "an example sync", "connectionId": "3c90c3cc-0d44-4b50-8888-8dd25736052a", "environment": "dev", "secretPath": "/my-secrets", "isEnabled": true, "syncOptions": { "initialSyncBehavior": "overwrite-destination" }, "destinationConfig": { "compartmentOcid": "...", "vaultOcid": "...", "keyOcid": "..." } }' ``` ### Sample response ```bash Response theme={"dark"} { "secretSync": { "id": "3c90c3cc-0d44-4b50-8888-8dd25736052a", "name": "my-oci-vault-sync", "description": "an example sync", "isEnabled": true, "version": 1, "folderId": "3c90c3cc-0d44-4b50-8888-8dd25736052a", "connectionId": "3c90c3cc-0d44-4b50-8888-8dd25736052a", "createdAt": "2023-11-07T05:31:56Z", "updatedAt": "2023-11-07T05:31:56Z", "syncStatus": "succeeded", "lastSyncJobId": "123", "lastSyncMessage": null, "lastSyncedAt": "2023-11-07T05:31:56Z", "importStatus": null, "lastImportJobId": null, "lastImportMessage": null, "lastImportedAt": null, "removeStatus": null, "lastRemoveJobId": null, "lastRemoveMessage": null, "lastRemovedAt": null, "syncOptions": { "initialSyncBehavior": "overwrite-destination" }, "projectId": "3c90c3cc-0d44-4b50-8888-8dd25736052a", "connection": { "app": "oci", "name": "my-oci-connection", "id": "3c90c3cc-0d44-4b50-8888-8dd25736052a" }, "environment": { "slug": "dev", "name": "Development", "id": "3c90c3cc-0d44-4b50-8888-8dd25736052a" }, "folder": { "id": "3c90c3cc-0d44-4b50-8888-8dd25736052a", "path": "/my-secrets" }, "destination": "oci-vault", "destinationConfig": { "compartmentOcid": "...", "vaultOcid": "...", "keyOcid": "..." } } } ``` ## FAQ When Infisical attempts to sync secrets, the sync will fail and attempt to re-sync if **any secret** has one of the following lifecycle states: * SchedulingDeletion * CancellingDeletion * Deleting * Creating * Updating We do this to prevent any desync issues. In the case that a variable is created or updated while it's scheduled for deletion in OCI Vault, we cancel the deletion and update the variable. This action may take up to a minute since Infisical must wait for OCI to completely cancel the deletion and then update the variable. --- # Source: https://infisical.com/docs/integrations/app-connections/oci.md > ## Documentation Index > Fetch the complete documentation index at: https://infisical.com/docs/llms.txt > Use this file to discover all available pages before exploring further. # OCI Connection > Learn how to configure an Oracle Cloud Infrastructure Connection for Infisical. OCI App Connection 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 [team@infisical.com](mailto:team@infisical.com) to purchase an enterprise license to use it. Infisical supports the use of [API Signing Key Authentication](https://docs.oracle.com/en-us/iaas/Content/API/Concepts/apisigningkey.htm) to connect with OCI. ## Create OCI User Search Domains Select the domain in which you want to create the Infisical user account. Select Domain Select Users Click Create User The name, email, and username can be anything. Create User After you've created a user, you'll be redirected to the user's page. Navigate to 'API keys'. Select API Keys Click on 'Add API key' and then download or import the private key. After you've obtained the private key, click 'Add'. Add API Key After creating the API key, you'll be shown a modal with relevant information. Save the highlighted values (and the private key) for later steps. User Info ## Create OCI Group Search Domains Select the domain in which you want to create the Infisical user account. Select Domain Select Groups The name and description can be anything. **Ensure that you assign the user created in earlier steps to this group**. Create Group After creating the group, take note of its name. It will be used in later steps. ## Create OCI Policy Search Policies Click Create Policy The name and description can be anything. Click 'Show manual editor' and paste in the policy rules relevant to your task: ``` Allow group to manage secret-family in compartment Allow group to use keys in compartment Allow group to use vaults in compartment Allow group to inspect compartments in tenancy ``` * **Group Name:** The name of the group you created in earlier steps. * **Compartment Name:** The name of the compartment which has your secrets vault. If you'd like to grant Infisical access to all compartments, replace instances of `compartment ` with `tenancy`. Create Policy **You must create this policy on the root compartment**, otherwise some functionality may not work. ## Create OCI Connection in Infisical In your Infisical dashboard, navigate to the **Integrations** tab in the desired project, then select **App Connections**. App Connections Tab Click the **+ Add Connection** button and select the **OCI Connection** option from the available integrations. Select OCI Connection Complete the OCI Connection form by entering: * A descriptive name for the connection * An optional description for future reference * The User OCID from [earlier steps](https://infisical.com/docs/integrations/app-connections/oci#create-oci-user) * The Tenancy OCID from [earlier steps](https://infisical.com/docs/integrations/app-connections/oci#create-oci-user) * The Region from [earlier steps](https://infisical.com/docs/integrations/app-connections/oci#create-oci-user) * The Fingerprint from [earlier steps](https://infisical.com/docs/integrations/app-connections/oci#create-oci-user) * The Private Key PEM from [earlier steps](https://infisical.com/docs/integrations/app-connections/oci#create-oci-user) OCI Connection Modal After clicking Create, your **OCI Connection** is established and ready to use with your Infisical project. OCI Connection Created To create an OCI Connection, make an API request to the [Create OCI Connection](/api-reference/endpoints/app-connections/oci/create) API endpoint. ### Sample request ```bash Request theme={"dark"} curl --request POST \ --url https://app.infisical.com/api/v1/app-connections/oci \ --header 'Content-Type: application/json' \ --data '{ "name": "my-oci-connection", "method": "access-key", "projectId": "7ffbb072-2575-495a-b5b0-127f88caef78", "credentials": { "userOcid": "ocid1.user.oc1..aaaaaaaagrp35tbkvvad4y2j7sug7xonua7dl2gfp4at2u5i5xj4ghnitg3a", "tenancyOcid": "ocid1.tenancy.oc1..aaaaaaaaotfma465m4zumfe2ua64mj2m5dwmlw2llh4g4dnfttnakiifonta", "region": "us-ashburn-1", "fingerprint": "9c:f6:18:23:92:73:f8:e1:85:2c:6a:e3:2c:7d:ec:8f", "privateKey": "[PRIVATE KEY PEM]" } }' ``` ### Sample response ```bash Response theme={"dark"} { "appConnection": { "id": "e5d18aca-86f7-4026-a95e-efb8aeb0d8e6", "name": "my-oci-connection", "projectId": "7ffbb072-2575-495a-b5b0-127f88caef78", "description": null, "version": 1, "orgId": "6f03caa1-a5de-43ce-b127-95a145d3464c", "createdAt": "2025-04-23T19:46:34.831Z", "updatedAt": "2025-04-23T19:46:34.831Z", "isPlatformManagedCredentials": false, "credentialsHash": "7c2d371dec195f82a6a0d5b41c970a229cfcaf88e894a5b6395e2dbd0280661f", "app": "oci", "method": "access-key", "credentials": { "userOcid": "ocid1.user.oc1..aaaaaaaagrp35tbkvvad4y2j7sug7xonua7dl2gfp4at2u5i5xj4ghnitg3a", "tenancyOcid": "ocid1.tenancy.oc1..aaaaaaaaotfma465m4zumfe2ua64mj2m5dwmlw2llh4g4dnfttnakiifonta", "region": "us-ashburn-1", "fingerprint": "9c:f6:18:23:92:73:f8:e1:85:2c:6a:e3:2c:7d:ec:8f" } } } ``` --- # Source: https://infisical.com/docs/integrations/secret-syncs/octopus-deploy.md # Source: https://infisical.com/docs/integrations/app-connections/octopus-deploy.md > ## Documentation Index > Fetch the complete documentation index at: https://infisical.com/docs/llms.txt > Use this file to discover all available pages before exploring further. # Octopus Deploy Connection > Learn how to configure an Octopus Deploy Connection for Infisical. Infisical supports the use of [API Keys](https://octopus.com/docs/octopus-rest-api/how-to-create-an-api-key) to connect with Octopus Deploy. ## Create Octopus Deploy API Key Octopus Deploy supports two methods for creating API keys: via a user profile or via a service account. From your Octopus Deploy dashboard, go to **Configuration** > **Users** and click on the **Create Service Accounts** button. Service Accounts Provide: * Username: A name for the service account * Display Name: A display name for the service account Then click **Save**. Create Service Account Navigate to **Configuration** > **Teams** and click **Add Team**. Add Team Provide: * New Team Name: A name for the team * Team Description(optional): A description for the team * Select the team access type: * Accessible in the `current` space only * Accessible in all spaces(system team) Create Team Then click **Save**. After creating the team, you will be redirected to the team details page. Click on the **Add Members** button. Add Service Account to Team Select the service account you created in the previous step and click **Add**. Add Service Account to Team After adding the service account to the team, Click on the **User Roles** tab and click **Include User Role** button. Add User Role to Team Search for the **Project Contributor** role and click on the **Apply** button. Apply User Role to Team Click on the **Save** button. Save User Role to Team After saving the team settings, we have to create an API key for the service account. Go back to **Configuration** > **Users** and find your service account. Click on the service account to view its details. Click on the **API Keys** section and click **New API Key**. Create Service Account API Key Provide a purpose for the key and set an expiry date, then click **Generate New**. Generate API Key Make sure to copy the API key now, you won't be able to access it again. Service Account API Key Generated Infisical recommends using a service account for production integrations as they provide better security and are not tied to individual user accounts. From your Octopus Deploy dashboard, click on your profile in the bottom left corner and select **My profile**. Octopus Deploy User Profile In your profile settings, go to the **My API Keys** tab and click **New API Key**. API Keys Tab Provide a purpose for the key. Set an expiry date, then click **Generate New**. Create API Key Make sure to copy the API key now, you won't be able to access it again. API Key Generated ## Create an Octopus Deploy Connection in Infisical In your Infisical dashboard, navigate to the **Integrations** tab in the desired project, then select **App Connections**. App Connections Tab Click **+ Add Connection** and choose **Octopus Deploy** Connection from the list of integrations. Select Octopus Deploy Connection Complete the form by providing: * A descriptive name for the connection * An optional description * The Instance URL (e.g., [https://your-instance.octopus.app](https://your-instance.octopus.app)) * The API Key from the previous step Octopus Deploy Connection Modal After submitting the form, your **Octopus Deploy Connection** will be successfully created and ready to use with your Infisical project. Octopus Deploy Connection Created To create an Octopus Deploy Connection via API, send a request to the [Create Octopus Deploy Connection](/api-reference/endpoints/app-connections/octopus-deploy/create) endpoint. ### Sample request ```bash Request theme={"dark"} curl --request POST \ --url https://app.infisical.com/api/v1/app-connections/octopus-deploy \ --header 'Content-Type: application/json' \ --data '{ "name": "my-octopus-deploy-connection", "method": "api-key", "projectId": "abcdef12-3456-7890-abcd-ef1234567890", "credentials": { "instanceUrl": "https://your-instance.octopus.app", "apiKey": "[API KEY]" } }' ``` ### Sample response ```json Response theme={"dark"} { "appConnection": { "id": "a1b2c3d4-5678-90ab-cdef-1234567890ab", "name": "my-octopus-deploy-connection", "description": null, "projectId": "abcdef12-3456-7890-abcd-ef1234567890", "version": 1, "orgId": "abcdef12-3456-7890-abcd-ef1234567890", "createdAt": "2025-10-13T10:15:00.000Z", "updatedAt": "2025-10-13T10:15:00.000Z", "isPlatformManagedCredentials": false, "credentialsHash": "d41d8cd98f00b204e9800998ecf8427e", "app": "octopus-deploy", "method": "api-key", "credentials": { "instanceUrl": "https://your-instance.octopus.app", } } } ``` --- # Source: https://infisical.com/docs/documentation/platform/secret-rotation/okta-client-secret.md > ## Documentation Index > Fetch the complete documentation index at: https://infisical.com/docs/llms.txt > Use this file to discover all available pages before exploring further. # Okta Client Secret > Learn how to automatically rotate Okta Client Secrets. ## Prerequisites * Create an [Okta Connection](/integrations/app-connections/okta). ## Create an Okta Client Secret Rotation in Infisical 1. Navigate to your Secret Manager Project's Dashboard and select **Add Secret Rotation** from the actions dropdown. Secret Manager Dashboard 2. Select the **Okta Client Secret** option. Select Okta Client Secret 3. Configure the rotation behavior, then click **Next**. Rotation Configuration * **Okta Connection** - the connection that will perform the rotation of the specified application's Client Secret. * **Rotation Interval** - the interval, in days, that once elapsed will trigger a rotation. * **Rotate At** - the local time of day when rotation should occur once the interval has elapsed. * **Auto-Rotation Enabled** - whether secrets should automatically be rotated once the rotation interval has elapsed. Disable this option to manually rotate secrets or pause secret rotation. 4. Select the Okta application whose Client Secret you want to rotate. Then click **Next**. Rotation Parameters 5. Specify the secret names that the client credentials should be mapped to. Then click **Next**. Rotation Secrets Mapping * **Client ID** - the name of the secret that the application Client ID will be mapped to. * **Client Secret** - the name of the secret that the rotated Client Secret will be mapped to. 6. Give your rotation a name and description (optional). Then click **Next**. Rotation Details * **Name** - the name of the secret rotation configuration. Must be slug-friendly. * **Description** (optional) - a description of this rotation configuration. 7. Review your configuration, then click **Create Secret Rotation**. Rotation Review 8. Your **Okta Client Secret** credentials are now available for use via the mapped secrets. Rotation Created To create an Okta Client Secret Rotation, make an API request to the [Create Okta Client Secret Rotation](/api-reference/endpoints/secret-rotations/okta-client-secret/create) API endpoint. You will first need the **Client ID** of the Okta application you want to rotate the secret for. This can be obtained from the applications dashboard. Okta Client ID ### Sample request ```bash Request theme={"dark"} curl --request POST \ --url https://us.infisical.com/api/v2/secret-rotations/okta-client-secret \ --header 'Content-Type: application/json' \ --data '{ "name": "my-okta-rotation", "projectId": "3c90c3cc-0d44-4b50-8888-8dd25736052a", "description": "my client secret rotation", "connectionId": "3c90c3cc-0d44-4b50-8888-8dd25736052a", "environment": "dev", "secretPath": "/", "isAutoRotationEnabled": true, "rotationInterval": 30, "rotateAtUtc": { "hours": 0, "minutes": 0 }, "parameters": { "clientId": "...", }, "secretsMapping": { "clientId": "OKTA_CLIENT_ID", "clientSecret": "OKTA_CLIENT_SECRET" } }' ``` ### Sample response ```bash Response theme={"dark"} { "secretRotation": { "id": "3c90c3cc-0d44-4b50-8888-8dd25736052a", "name": "my-okta-rotation", "description": "my client secret rotation", "secretsMapping": { "clientId": "OKTA_CLIENT_ID", "clientSecret": "OKTA_CLIENT_SECRET" }, "isAutoRotationEnabled": true, "activeIndex": 0, "folderId": "3c90c3cc-0d44-4b50-8888-8dd25736052a", "connectionId": "3c90c3cc-0d44-4b50-8888-8dd25736052a", "createdAt": "2023-11-07T05:31:56Z", "updatedAt": "2023-11-07T05:31:56Z", "rotationInterval": 30, "rotationStatus": "success", "lastRotationAttemptedAt": "2023-11-07T05:31:56Z", "lastRotatedAt": "2023-11-07T05:31:56Z", "lastRotationJobId": "3c90c3cc-0d44-4b50-8888-8dd25736052a", "nextRotationAt": "2023-11-07T05:31:56Z", "connection": { "app": "okta", "name": "my-okta-connection", "id": "3c90c3cc-0d44-4b50-8888-8dd25736052a" }, "environment": { "slug": "dev", "name": "Development", "id": "3c90c3cc-0d44-4b50-8888-8dd25736052a" }, "projectId": "3c90c3cc-0d44-4b50-8888-8dd25736052a", "folder": { "id": "3c90c3cc-0d44-4b50-8888-8dd25736052a", "path": "/" }, "rotateAtUtc": { "hours": 0, "minutes": 0 }, "lastRotationMessage": null, "type": "okta-client-secret", "parameters": { "clientId": "..." } } } ``` --- # Source: https://infisical.com/docs/documentation/platform/sso/okta-oidc.md > ## Documentation Index > Fetch the complete documentation index at: https://infisical.com/docs/llms.txt > Use this file to discover all available pages before exploring further. # Okta OIDC > Learn how to configure Okta OIDC for Infisical SSO. Okta OIDC SSO is a paid feature. If you're using Infisical Cloud, then it is available under the **Pro Tier**. If you're self-hosting Infisical, then you should contact [sales@infisical.com](mailto:sales@infisical.com) to purchase a self-hosted license to use it. In the Okta Admin Portal, select Applications > Applications from the navigation. On the Applications screen, click the **Create App Integration** button. Okta Applications page In the Create a New Application Integration dialog, select **OIDC - OpenID Connect** as the Sign-in method and **Web Application** as the Application type, then click **Next**. Create OIDC app integration On the New Web App Integration screen, configure the following settings: * **App integration name**: Enter a name like `Infisical` * **Grant type**: Ensure **Authorization Code** is checked * **Sign-in redirect URIs**: Set to `https://app.infisical.com/api/v1/sso/oidc/callback` * **Sign-out redirect URIs**: (Optional) Set to `https://app.infisical.com` * **Controlled access**: Select the appropriate access level for your organization App settings configuration If you're self-hosting Infisical, replace `https://app.infisical.com` with your own domain in the redirect URIs. Click **Save** to create the application. After saving, scroll down to the **General Settings** section and click **Edit**. Ensure the **Proof of possession** setting labeled "Require Demonstrating Proof of Possession (DPoP) header in token requests" is **unchecked**. DPoP setting disabled Infisical does not currently support DPoP for OIDC authentication. After creating the application, you will be taken to the application's settings page. From the **General** tab, copy the **Client ID** and **Client Secret** values. Client credentials Next, you need to obtain the Discovery Document URL (also known as the OpenID Configuration URL). This URL follows the format: `https:///.well-known/openid-configuration`. To find your Okta domain, look at the URL in your browser's address bar while in the Okta Admin Portal. It typically looks like `https://your-company.okta.com` or `https://your-company.oktapreview.com`. Okta domain in browser Your Discovery Document URL will be: `https:///.well-known/openid-configuration` For example: `https://your-company.okta.com/.well-known/openid-configuration` Back in Infisical, on the OIDC configuration page, set the **Configuration Type** to **Discovery URL**. Fill in the following fields: Fill in the following fields: * **Discovery Document URL**: Enter the OpenID Configuration URL from step 2 (e.g., `https://your-company.okta.com/.well-known/openid-configuration`) * **Client ID**: Enter the Client ID from step 2 * **Client Secret**: Enter the Client Secret from step 2 * **JWT Signature Algorithm**: Select **RS256** (this is the default algorithm used by Okta) Infisical OIDC configuration Currently, the following JWT signature algorithms are supported: RS256, RS512, HS256, and EdDSA. Okta typically uses RS256. Optionally, you can define a whitelist of allowed email domains to restrict which users can authenticate. Once you've filled in all the required fields, click **Update** to save the configuration. Back in Okta, navigate to the **Assignments** tab of your Infisical application and click **Assign**. You can assign access to the application on a user-by-user basis using the **Assign to People** option, or in bulk using the **Assign to Groups** option. Okta user assignment At this point, you have configured everything you need within the context of the Okta Admin Portal. Enabling OIDC SSO allows members in your organization to log into Infisical via Okta. OIDC Okta enable OIDC Enforcing OIDC SSO ensures that members in your organization can only access Infisical by logging into the organization via Okta. To enforce OIDC SSO, you're required to test out the OpenID connection by successfully authenticating at least one Okta user with Infisical. Once you've completed this requirement, you can toggle the **Enforce OIDC SSO** button to enforce OIDC SSO. We recommend ensuring that your account is provisioned using the application in Okta prior to enforcing OIDC SSO to prevent any unintended issues. In case of a lockout, an organization admin can use the [Admin Login Portal](https://infisical.com/docs/documentation/platform/sso/overview#admin-login-portal) in the `/login/admin` path e.g. [https://app.infisical.com/login/admin](https://app.infisical.com/login/admin). If you are only using one organization on your Infisical instance, you can configure a default organization in the [Server Admin Console](../admin-panel/server-admin#default-organization) to expedite OIDC login. If you're configuring OIDC SSO on a self-hosted instance of Infisical, make sure to set the `AUTH_SECRET` and `SITE_URL` environment variable for it to work:
* `AUTH_SECRET`: A secret key used for signing and verifying JWT. This can be a random 32-byte base64 string generated with `openssl rand -base64 32`.
* `SITE_URL`: The absolute URL of your self-hosted instance of Infisical including the protocol (e.g. [https://app.infisical.com](https://app.infisical.com)) --- # Source: https://infisical.com/docs/integrations/app-connections/okta.md # Source: https://infisical.com/docs/documentation/platform/sso/okta.md # Source: https://infisical.com/docs/documentation/platform/scim/okta.md > ## Documentation Index > Fetch the complete documentation index at: https://infisical.com/docs/llms.txt > Use this file to discover all available pages before exploring further. # Okta SCIM > Learn how to configure SCIM provisioning with Okta for Infisical. Okta SCIM provisioning 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](mailto:sales@infisical.com) to purchase an enterprise license to use it. Prerequisites: * [Configure Okta SAML for Infisical](/documentation/platform/sso/okta) In Infisical, head to the **Single Sign-On (SSO)** page and select the **Provisioning** tab. Under SCIM Configuration, press the **Enable SCIM provisioning** toggle to allow Okta to provision/deprovision users and user groups for your organization. SCIM enable provisioning Next, press **Manage SCIM Tokens** and then **Create** to generate a SCIM token for Okta. SCIM create token Next, copy the **SCIM URL** and **New SCIM Token** to use when configuring SCIM in Okta. SCIM copy token In Okta, head to your Application > General > App Settings. Next, select **Edit** and check the box labled **Enable SCIM provisioning**. SCIM Okta Next, head to Provisioning > Integration and set the following SCIM connection fields: * SCIM connector base URL: Input the **SCIM URL** from Step 1. * Unique identifier field for users: Input `email`. * Supported provisioning actions: Select **Push New Users**, **Push Profile Updates**, and **Push Groups**. * Authentication Mode: `HTTP Header`. SCIM Okta Under HTTP Header > Authorization: Bearer, input the **New SCIM Token** from Step 1. SCIM Okta Next, press **Test Connector Configuration** to check that SCIM is configured properly. SCIM Okta Next, head to Provisioning > To App and check the boxes labeled **Enable** for **Create Users**, **Update User Attributes**, and **Deactivate Users**. SCIM Okta Now Okta can provision/deprovision users and user groups to/from your organization in Infisical. **FAQ** Infisical's SCIM implmentation accounts for retaining the end-to-end encrypted architecture of Infisical because we decouple the **authentication** and **decryption** steps in the platform. For this reason, SCIM-provisioned users are initialized but must finish setting up their account when logging in the first time by creating a master encryption/decryption key. With this implementation, IdPs and SCIM providers cannot and will not have access to the decryption key needed to decrypt your secrets. --- # Source: https://infisical.com/docs/self-hosting/reference-architectures/on-prem-k8s-ha.md > ## Documentation Index > Fetch the complete documentation index at: https://infisical.com/docs/llms.txt > Use this file to discover all available pages before exploring further. # Kubernetes (HA) > Reference architecture for self-hosting Infisical on Kubernetes (HA) Deploying Infisical on-premise with high availability requires expertise in networking, container orchestration, and database management. This guide serves as a reference architecture and a starting point. Actual deployments may vary depending on your organization's existing infrastructure and capabilities. ## Architecture Overview ```mermaid theme={"dark"} flowchart TB subgraph GLB["Global LB (HAProxy/NGINX)"] end subgraph OS["Object Storage"] direction LR store["S3/MinIO/Enterprise Storage"] subgraph store_contents["Storage Contents"] wal["PostgreSQL WAL"] pgbackup["PostgreSQL Backups"] redisbackup["Redis Backups"] end end subgraph DC1["Active Data Center"] direction TB subgraph k8s1["Kubernetes Cluster"] ing1["Ingress Controller"] app1["Infisical Deployment"] subgraph db1["CloudNativePG"] pg1p["PostgreSQL Primary"] pg1r["PostgreSQL Replicas"] end subgraph red1["Redis (Bitnami)"] rp1["Redis Primary"] end end end subgraph DC2["Passive Data Center"] direction TB subgraph k8s2["Kubernetes Cluster"] ing2["Ingress Controller"] app2["Infisical Deployment"] subgraph db2["CloudNativePG"] pg2["PostgreSQL Replicas"] end subgraph red2["Redis (Bitnami)"] r2["Redis Standby"] end end end %% Connections GLB --> ing1 GLB -.-> ing2 %% Database connections pg1p --> store store --> pg2 %% Redis backup flow rp1 --> store store -.-> r2 %% Intra-DC connections ing1 --> app1 app1 --> db1 app1 --> red1 ing2 --> app2 app2 --> db2 app2 --> red2 classDef primary fill:#f96,stroke:#333 classDef replica fill:#69f,stroke:#333 classDef storage fill:#9c6,stroke:#333 classDef lb fill:#c9f,stroke:#333 class pg1p,rp1 primary class pg1r,pg2,r2 replica class store,wal,pgbackup,redisbackup storage class GLB,ing1,ing2 lb ``` The architecture above makes use of Kubernetes for orchestrating both stateless and stateful components. The architecture spans multiple data centers for increased redundancy, availability and disaster recovery capabilities using an active-passive configuration. ### Stateful vs stateless workloads While managing databases within Kubernetes has typically been complex, modern operators like [CloudNativePG](https://cloudnative-pg.io/) simplify this process by handling storage provisioning, persistent volume management, and backup/recovery processes. However, if you lack deep expertise in Kubernetes operators or database management, we recommend a hybrid approach where the database is on a managed service for production deployments. Managing stateful components like databases can be challenging without deep expertise or a dedicated in-house database management team. To simplify operations and reduce complexity, we recommend offloading databases to managed services from AWS/GCP. These managed services automatically handle provisioning, scaling, failover, backups and rollbacks. ## Core Components ### Kubernetes Cluster Infisical is deployed on a Kubernetes cluster, which allows for container management, auto-scaling, and self-healing capabilities. A load balancer sits in front of the Kubernetes cluster, directing traffic and making sure there is an even load distribution across the application nodes. This is the entry point where all other services will interact with Infisical. ### Object Storage The architecture requires S3-compatible object storage for database backups and cross-datacenter replication. This can be provided by: * Existing enterprise object storage solution * Dedicated MinIO deployment * In-cluster MinIO deployment if neither option above is available The object storage must be accessible from all Kubernetes clusters and provides: * Storage for PostgreSQL WAL archiving and backups * Storage for Redis backups ### CloudNativePG for High Availability PostgreSQL The database layer is powered by PostgreSQL, managed by CloudNativePG operator for high availability: * **Redundancy:** CloudNativePG manages a primary-replica setup where the primary handles write operations and replicas handle read operations * **Failover:** The operator automatically handles failover within a cluster by promoting a replica to primary when needed * **Backup and Recovery:** Built-in support for backup to S3-compatible storage with point-in-time recovery capabilities ### Redis High Availability Redis is deployed using the [Bitnami Helm chart](https://github.com/bitnami/charts/tree/main/bitnami/redis) in a simple primary configuration: * Single Redis instance per cluster without streaming replication * Regular backups to object storage * Restore from backup during failover Infisical does not support Redis cluster mode, and since this is an active-passive setup, we use a simple Redis deployment with backup/restore for failover. #### PostgreSQL Backup and Restore PostgreSQL is the single source of truth for nearly all application data on Infisical. CloudNativePG provides well defined backup and restore capabilities: * **Continuous Backup:** The operator continuously archives WAL files to object storage * **Point-in-Time Recovery:** Supports restoring to any point in time using WAL archiving * **Regular Testing:** Periodically test backup restoration to exercise the full lifecycle of this process #### Redis Backup and Restore Each Redis instance is backed up through a Kubernetes CronJob that: 1. Executes the Redis `SAVE` command 2. Copies the resulting `dump.rdb` to object storage 3. Manages backup retention ```yaml theme={"dark"} apiVersion: batch/v1 kind: CronJob metadata: name: redis-backup spec: schedule: "0 * * * *" # Every hour jobTemplate: spec: template: spec: containers: - name: redis-backup image: bitnami/redis command: - /bin/sh - -c - | redis-cli -a $REDIS_PASSWORD save mc cp /data/dump.rdb object-store/redis-backups/ volumes: - name: redis-data persistentVolumeClaim: claimName: redis-data ``` During failover, the latest Redis backup is restored from object storage to the passive data center. This process is manual and requires operator intervention. ## Multi Data Center Deployment Infisical can be deployed across multiple data centers in an active-passive configuration for disaster recovery. In this setup, one data center serves as the active site while others remain as passive standbys. ### Active Data Center The active data center contains: * The primary PostgreSQL cluster managed by CloudNativePG handling all write operations * The active Redis instance handling all traffic * The active Infisical deployment serving all user traffic ### Passive Data Centers Passive data centers act as disaster recovery sites. Each contains: * A replica PostgreSQL cluster that replicates from the active site's primary cluster * A standby Redis instance (not receiving traffic) * A standby Infisical deployment (not receiving traffic) ### Traffic Management and Failover Traffic routing between data centers requires: 1. A global load balancer for traffic management. For on-premises deployments, this can be implemented using: * HAProxy or NGINX configured as a global load balancer * Any enterprise network routing solutions you may already have in place 2. Each data center should have its own ingress or load balancer The global load balancer should be deployed in a highly available configuration across multiple locations to avoid it becoming a single point of failure. During normal operation: * The global load balancer routes all traffic to the active data center * Replica PostgreSQL clusters continuously replicate from the primary cluster * Redis backups are regularly created and stored in object storage During failover: * A human operator must initiate the failover process * The operator promotes a replica PostgreSQL cluster in the target passive data center to become primary using CloudNativePG's promotion process * The latest Redis backup is restored from object storage to the passive data center's Redis instance * Once database failover is complete, the global load balancer is updated to direct traffic to the new active data center This is an active-passive setup where failover must be initiated manually by an operator. Automatic failover between data centers is not recommended as it can lead to split-brain scenarios. The operator should verify the state of both data centers before initiating failover. ## Data Replication Across Data Centers ### PostgreSQL Replication CloudNativePG manages replication across data centers: * **Replica Clusters:** Each data center runs a replica cluster that replicates from the primary cluster * **WAL Shipping:** Changes are replicated via WAL shipping to object storage * **Failover:** The operator can promote a replica cluster to primary during planned switchovers or failures ### Object Storage Configuration If using MinIO for object storage, ensure: * High availability deployment if running dedicated MinIO cluster * Proper access controls and encryption for data at rest * Regular monitoring of storage capacity and performance * Backup of object storage data itself if running your own MinIO deployment --- # Source: https://infisical.com/docs/documentation/platform/secret-rotation/openrouter-api-key.md > ## Documentation Index > Fetch the complete documentation index at: https://infisical.com/docs/llms.txt > Use this file to discover all available pages before exploring further. # OpenRouter API Key > Learn how to automatically rotate OpenRouter API keys. ## Prerequisites * Create an [OpenRouter Connection](/integrations/app-connections/openrouter) using a **Provisioning API key**. That connection is used to create and delete API keys on your behalf during rotation. ## Create an OpenRouter API Key Rotation in Infisical 1. Navigate to your Secret Manager Project's Dashboard and select **Add Secret Rotation** from the actions dropdown. Secret Manager Dashboard 2. Select the **OpenRouter API Key** option. Select OpenRouter API Key 3. Configure the rotation behavior, then click **Next**. Rotation Configuration * **OpenRouter Connection** – The connection (with a Provisioning API key) that will create and delete API keys during rotation. * **Rotation Interval** – The interval, in days, after which a rotation is triggered. * **Rotate At** – The local time of day when rotation runs once the interval has elapsed. * **Auto-Rotation Enabled** – Whether to rotate automatically on the interval. Turn off to rotate only manually or pause rotation. 4. Set the OpenRouter API key parameters, then click **Next**. Rotation Parameters * **Key name** – Display name for the key in OpenRouter (required). * **Limit** (optional) – Spending limit in USD for this key. * **Limit reset** (optional) – How often the limit resets: daily, weekly, or monthly. * **Include BYOK in limit** (optional) – When enabled, usage from your own provider keys ([BYOK](https://openrouter.ai/docs/guides/overview/auth/byok)—Bring Your Own Key) counts toward this key's spending limit. When disabled, only OpenRouter credits are counted. See [OpenRouter BYOK](https://openrouter.ai/docs/guides/overview/auth/byok) for details. 5. Specify the secret name that the rotated API key will be mapped to. Then click **Next**. Rotation Secrets Mapping * **API Key** – The name of the secret in Infisical where the rotated API key value will be stored. 6. Give your rotation a name and description (optional). Then click **Next**. Rotation Details * **Name** – A slug-friendly name for this rotation configuration. * **Description** (optional) – Notes about this rotation. 7. Review your configuration, then click **Create Secret Rotation**. Rotation Review 8. Your **OpenRouter API Key** rotation is created. The current API key is available as a secret at the mapped path. Rotations will create a new key, switch the active secret to it, then revoke the previous key for zero-downtime rotation. Rotation Created To create an OpenRouter API Key rotation, call the [Create OpenRouter API Key Rotation](/api-reference/endpoints/secret-rotations/openrouter-api-key/create) API endpoint. ### Sample request ```bash Request theme={"dark"} curl --request POST \ --url https://us.infisical.com/api/v2/secret-rotations/open-router-api-key \ --header 'Content-Type: application/json' \ --data '{ "name": "my-openrouter-rotation", "projectId": "", "description": "OpenRouter API key rotation", "connectionId": "", "environment": "dev", "secretPath": "/", "isAutoRotationEnabled": true, "rotationInterval": 30, "rotateAtUtc": { "hours": 0, "minutes": 0 }, "parameters": { "name": "my-app-key", "limit": 100, "limitReset": "monthly", "includeByokInLimit": false }, "secretsMapping": { "apiKey": "OPEN_ROUTER_API_KEY" } }' ``` ### Sample response ```bash Response theme={"dark"} { "secretRotation": { "id": "", "name": "my-openrouter-rotation", "description": "OpenRouter API key rotation", "secretsMapping": { "apiKey": "OPEN_ROUTER_API_KEY" }, "isAutoRotationEnabled": true, "activeIndex": 0, "connectionId": "", "rotationInterval": 30, "rotateAtUtc": { "hours": 0, "minutes": 0 }, "type": "openrouter-api-key", "parameters": { "name": "my-app-key", "limit": 100, "limitReset": "monthly", "includeByokInLimit": false } } } ``` ## Include BYOK in limit (optional) **BYOK** (Bring Your Own Key) on OpenRouter lets you use your own provider API keys (e.g. OpenAI, Anthropic) so you pay providers directly; OpenRouter charges a small fee on those requests. The **Include BYOK in limit** option controls whether that BYOK usage counts toward this key's spending limit: * **Enabled (Yes)** – Usage from your own provider keys is included in the limit. Once the limit is reached, the key is subject to OpenRouter's rate limits until the next reset. * **Disabled (No)** – Only OpenRouter credit usage counts toward the limit. BYOK usage is tracked separately and does not consume the limit. This is optional; if you don't use BYOK or don't set a limit, you can leave it off. For more details, see [OpenRouter BYOK](https://openrouter.ai/docs/guides/overview/auth/byok) and [OpenRouter limits](https://openrouter.ai/docs/api/reference/limits). --- # Source: https://infisical.com/docs/integrations/app-connections/openrouter.md > ## Documentation Index > Fetch the complete documentation index at: https://infisical.com/docs/llms.txt > Use this file to discover all available pages before exploring further. # OpenRouter Connection > Learn how to configure an OpenRouter (LLM router) connection for Infisical. [OpenRouter](https://openrouter.ai/) is a unified LLM router that gives you access to hundreds of large language models through a single API. Infisical supports connecting to OpenRouter using an **API Key** (Provisioning API key). This connection is used to manage and rotate OpenRouter API keys via [Secret Rotation](/documentation/platform/secret-rotation/openrouter-api-key). ## Prerequisites You need a **Provisioning API key** from OpenRouter. Provisioning keys are used only for key management (create, list, delete keys)—they cannot be used for model completion requests. ## Create an OpenRouter Provisioning API Key In [OpenRouter Settings](https://openrouter.ai/settings/provisioning-keys), go to **Provisioning API Keys** and click **Create New Key**. OpenRouter Provisioning Keys Complete the key creation flow and copy the generated Provisioning API key. Store it securely—you will use it when creating the Infisical connection. OpenRouter Key Created For more details on Provisioning API keys and key management, see [OpenRouter's documentation](https://openrouter.ai/docs/guides/overview/auth/provisioning-api-keys). ## Create OpenRouter Connection in Infisical In your Infisical dashboard, go to **Organization Settings** → **App Connections** (or the **Integrations** → **App Connections** tab in your project). App Connections Tab Click **Add Connection** and choose **OpenRouter** from the list of available connections. Select OpenRouter Connection Complete the form with: * A **name** for the connection (e.g. `openrouter-prod`) * An optional **description** * Your **OpenRouter Provisioning API Key** (from the steps above) OpenRouter Connection Form After clicking **Create**, Infisical validates the key against OpenRouter's API. Your **OpenRouter Connection** is then ready to use for [OpenRouter API Key Secret Rotation](/documentation/platform/secret-rotation/openrouter-api-key). OpenRouter Connection Created Create an OpenRouter connection via the [Create OpenRouter Connection](/api-reference/endpoints/app-connections/openrouter/create) API endpoint. ### Sample request ```bash Request theme={"dark"} curl --request POST \ --url https://app.infisical.com/api/v1/app-connections/open-router \ --header 'Content-Type: application/json' \ --data '{ "name": "my-openrouter-connection", "method": "api-key", "projectId": "7ffbb072-2575-495a-b5b0-127f88caef78", "credentials": { "apiKey": "" } }' ``` ### Sample response ```bash Response theme={"dark"} { "appConnection": { "id": "e5d18aca-86f7-4026-a95e-efb8aeb0d8e6", "name": "my-openrouter-connection", "projectId": "7ffbb072-2575-495a-b5b0-127f88caef78", "description": null, "version": 1, "orgId": "6f03caa1-a5de-43ce-b127-95a145d3464c", "createdAt": "2025-04-23T19:46:34.831Z", "updatedAt": "2025-04-23T19:46:34.831Z", "isPlatformManagedCredentials": false, "credentialsHash": "...", "app": "open-router", "method": "api-key", "credentials": {} } } ``` --- # Source: https://infisical.com/docs/api-reference/endpoints/secret-syncs/options.md # Source: https://infisical.com/docs/api-reference/endpoints/secret-scanning/data-sources/options.md # Source: https://infisical.com/docs/api-reference/endpoints/secret-rotations/options.md # Source: https://infisical.com/docs/api-reference/endpoints/pki/syncs/options.md # Source: https://infisical.com/docs/api-reference/endpoints/app-connections/options.md > ## Documentation Index > Fetch the complete documentation index at: https://infisical.com/docs/llms.txt > Use this file to discover all available pages before exploring further. # Options > List the available App Connection Options. ## OpenAPI ````yaml GET /api/v1/app-connections/options openapi: 3.0.3 info: title: Infisical API description: List of all available APIs that can be consumed version: 0.0.1 servers: - url: https://us.infisical.com description: Production server (US) - url: https://eu.infisical.com description: Production server (EU) - url: http://localhost:8080 description: Local server security: [] paths: /api/v1/app-connections/options: get: tags: - App Connections description: List the available App Connection Options. operationId: listAppConnectionOptions parameters: - schema: type: string enum: - secret-manager - cert-manager - kms - ssh - secret-scanning - pam - ai in: query name: projectType required: false responses: '200': description: Default Response content: application/json: schema: type: object properties: appConnectionOptions: type: array items: anyOf: - type: object properties: name: type: string enum: - AWS app: type: string enum: - aws methods: type: array items: type: string enum: - assume-role - access-key accessKeyId: type: string required: - name - app - methods additionalProperties: false title: AWS - type: object properties: name: type: string enum: - GitHub app: type: string enum: - github methods: type: array items: type: string enum: - oauth - github-app - pat oauthClientId: type: string appClientSlug: type: string required: - name - app - methods additionalProperties: false title: GitHub - type: object properties: name: type: string enum: - GitHub Radar app: type: string enum: - github-radar methods: type: array items: type: string enum: - github-app appClientSlug: type: string required: - name - app - methods additionalProperties: false title: GitHub Radar - type: object properties: name: type: string enum: - GCP app: type: string enum: - gcp methods: type: array items: type: string enum: - service-account-impersonation required: - name - app - methods additionalProperties: false title: GCP - type: object properties: name: type: string enum: - Azure Key Vault app: type: string enum: - azure-key-vault methods: type: array items: type: string enum: - oauth - client-secret oauthClientId: type: string required: - name - app - methods additionalProperties: false title: Azure Key Vault - type: object properties: name: type: string enum: - Azure App Configuration app: type: string enum: - azure-app-configuration methods: type: array items: type: string enum: - oauth - client-secret oauthClientId: type: string required: - name - app - methods additionalProperties: false title: Azure App Configuration - type: object properties: name: type: string enum: - Azure DevOps app: type: string enum: - azure-devops methods: type: array items: type: string enum: - oauth - access-token - client-secret oauthClientId: type: string required: - name - app - methods additionalProperties: false title: Azure DevOps - type: object properties: name: type: string enum: - Databricks app: type: string enum: - databricks methods: type: array items: type: string enum: - service-principal required: - name - app - methods additionalProperties: false title: Databricks - type: object properties: name: type: string enum: - Humanitec app: type: string enum: - humanitec methods: type: array items: type: string enum: - api-token required: - name - app - methods additionalProperties: false title: Humanitec - type: object properties: name: type: string enum: - Terraform Cloud app: type: string enum: - terraform-cloud methods: type: array items: type: string enum: - api-token required: - name - app - methods additionalProperties: false title: Terraform Cloud - type: object properties: name: type: string enum: - Vercel app: type: string enum: - vercel methods: type: array items: type: string enum: - api-token required: - name - app - methods additionalProperties: false title: Vercel - type: object properties: name: type: string enum: - PostgreSQL app: type: string enum: - postgres methods: type: array items: type: string enum: - username-and-password supportsPlatformManagement: type: boolean enum: - true required: - name - app - methods - supportsPlatformManagement additionalProperties: false title: PostgreSQL - type: object properties: name: type: string enum: - Microsoft SQL Server app: type: string enum: - mssql methods: type: array items: type: string enum: - username-and-password supportsPlatformManagement: type: boolean enum: - true required: - name - app - methods - supportsPlatformManagement additionalProperties: false title: Microsoft SQL Server - type: object properties: name: type: string enum: - MySQL app: type: string enum: - mysql methods: type: array items: type: string enum: - username-and-password supportsPlatformManagement: type: boolean enum: - true required: - name - app - methods - supportsPlatformManagement additionalProperties: false title: MySQL - type: object properties: name: type: string enum: - Camunda app: type: string enum: - camunda methods: type: array items: type: string enum: - client-credentials required: - name - app - methods additionalProperties: false title: Camunda - type: object properties: name: type: string enum: - Auth0 app: type: string enum: - auth0 methods: type: array items: type: string enum: - client-credentials required: - name - app - methods additionalProperties: false title: Auth0 - type: object properties: name: type: string enum: - HCVault app: type: string enum: - hashicorp-vault methods: type: array items: type: string enum: - access-token - app-role required: - name - app - methods additionalProperties: false title: Hashicorp Vault - type: object properties: name: type: string enum: - Azure Client Secrets app: type: string enum: - azure-client-secrets methods: type: array items: type: string enum: - oauth - client-secret - certificate oauthClientId: type: string required: - name - app - methods additionalProperties: false title: Azure Client Secrets - type: object properties: name: type: string enum: - Windmill app: type: string enum: - windmill methods: type: array items: type: string enum: - access-token required: - name - app - methods additionalProperties: false title: Windmill - type: object properties: name: type: string enum: - LDAP app: type: string enum: - ldap methods: type: array items: type: string enum: - simple-bind required: - name - app - methods additionalProperties: false title: LDAP - type: object properties: name: type: string enum: - TeamCity app: type: string enum: - teamcity methods: type: array items: type: string enum: - access-token required: - name - app - methods additionalProperties: false title: TeamCity - type: object properties: name: type: string enum: - OCI app: type: string enum: - oci methods: type: array items: type: string enum: - access-key required: - name - app - methods additionalProperties: false title: OCI - type: object properties: name: type: string enum: - OracleDB app: type: string enum: - oracledb methods: type: array items: type: string enum: - username-and-password supportsPlatformManagement: type: boolean enum: - true required: - name - app - methods - supportsPlatformManagement additionalProperties: false title: OracleDB - type: object properties: name: type: string enum: - 1Password app: type: string enum: - 1password methods: type: array items: type: string enum: - api-token required: - name - app - methods additionalProperties: false title: 1Password - type: object properties: name: type: string enum: - Heroku app: type: string enum: - heroku methods: type: array items: type: string enum: - auth-token - oauth oauthClientId: type: string required: - name - app - methods additionalProperties: false title: Heroku - type: object properties: name: type: string enum: - Render app: type: string enum: - render methods: type: array items: type: string enum: - api-key required: - name - app - methods additionalProperties: false title: Render - type: object properties: name: type: string enum: - Fly.io app: type: string enum: - flyio methods: type: array items: type: string enum: - access-token required: - name - app - methods additionalProperties: false title: Fly.io - type: object properties: name: type: string enum: - GitLab app: type: string enum: - gitlab methods: type: array items: type: string enum: - oauth - access-token oauthClientId: type: string required: - name - app - methods additionalProperties: false title: GitLab - type: object properties: name: type: string enum: - Cloudflare app: type: string enum: - cloudflare methods: type: array items: type: string enum: - api-token required: - name - app - methods additionalProperties: false title: Cloudflare - type: object properties: name: type: string enum: - Bitbucket app: type: string enum: - bitbucket methods: type: array items: type: string enum: - api-token required: - name - app - methods additionalProperties: false title: Bitbucket - type: object properties: name: type: string enum: - Zabbix app: type: string enum: - zabbix methods: type: array items: type: string enum: - api-token required: - name - app - methods additionalProperties: false title: Zabbix - type: object properties: name: type: string enum: - Railway app: type: string enum: - railway methods: type: array items: type: string enum: - account-token - project-token - team-token required: - name - app - methods additionalProperties: false title: Railway - type: object properties: name: type: string enum: - Checkly app: type: string enum: - checkly methods: type: array items: type: string enum: - api-key required: - name - app - methods additionalProperties: false title: Checkly - type: object properties: name: type: string enum: - CircleCI app: type: string enum: - circleci methods: type: array items: type: string enum: - api-token required: - name - app - methods additionalProperties: false title: CircleCI - type: object properties: name: type: string enum: - Supabase app: type: string enum: - supabase methods: type: array items: type: string enum: - access-token required: - name - app - methods additionalProperties: false title: Supabase - type: object properties: name: type: string enum: - Digital Ocean app: type: string enum: - digital-ocean methods: type: array items: type: string enum: - api-token required: - name - app - methods additionalProperties: false title: DigitalOcean App Platform - type: object properties: name: type: string enum: - Netlify app: type: string enum: - netlify methods: type: array items: type: string enum: - access-token required: - name - app - methods additionalProperties: false title: Netlify - type: object properties: name: type: string enum: - Northflank app: type: string enum: - northflank methods: type: array items: type: string enum: - api-token required: - name - app - methods additionalProperties: false title: Northflank - type: object properties: name: type: string enum: - Okta app: type: string enum: - okta methods: type: array items: type: string enum: - api-token required: - name - app - methods additionalProperties: false title: Okta - type: object properties: name: type: string enum: - Azure ADCS app: type: string enum: - azure-adcs methods: type: array items: type: string enum: - username-password required: - name - app - methods additionalProperties: false title: Azure ADCS - type: object properties: name: type: string enum: - Redis app: type: string enum: - redis methods: type: array items: type: string enum: - username-and-password supportsPlatformManagement: type: boolean enum: - false required: - name - app - methods - supportsPlatformManagement additionalProperties: false title: Redis - type: object properties: name: type: string enum: - MongoDB app: type: string enum: - mongodb methods: type: array items: type: string enum: - username-and-password supportsPlatformManagement: type: boolean enum: - false required: - name - app - methods - supportsPlatformManagement additionalProperties: false - type: object properties: name: type: string enum: - Laravel Forge app: type: string enum: - laravel-forge methods: type: array items: type: string enum: - api-token required: - name - app - methods additionalProperties: false title: Laravel Forge - type: object properties: name: type: string enum: - Chef app: type: string enum: - chef methods: type: array items: type: string enum: - user-key required: - name - app - methods additionalProperties: false title: Chef - type: object properties: name: type: string enum: - DNS Made Easy app: type: string enum: - dns-made-easy methods: type: array items: type: string enum: - api-key-secret required: - name - app - methods additionalProperties: false title: DNS Made Easy - type: object properties: name: type: string enum: - Octopus Deploy app: type: string enum: - octopus-deploy methods: type: array items: type: string enum: - api-key required: - name - app - methods additionalProperties: false title: Octopus Deploy - type: object properties: name: type: string enum: - Windows app: type: string enum: - smb methods: type: array items: type: string enum: - credentials required: - name - app - methods additionalProperties: false title: SMB - type: object properties: name: type: string enum: - SSH app: type: string enum: - ssh methods: type: array items: type: string enum: - password - ssh-key required: - name - app - methods additionalProperties: false title: SSH - type: object properties: name: type: string enum: - OpenRouter app: type: string enum: - open-router methods: type: array items: type: string enum: - api-key required: - name - app - methods additionalProperties: false title: OpenRouter required: - appConnectionOptions additionalProperties: false '400': description: Default Response content: application/json: schema: type: object properties: reqId: type: string statusCode: type: number enum: - 400 message: type: string error: type: string details: {} required: - reqId - statusCode - message - error additionalProperties: false '401': description: Default Response content: application/json: schema: type: object properties: reqId: type: string statusCode: type: number enum: - 401 message: type: string error: type: string required: - reqId - statusCode - message - error additionalProperties: false '403': description: Default Response content: application/json: schema: type: object properties: reqId: type: string statusCode: type: number enum: - 403 message: type: string details: {} error: type: string required: - reqId - statusCode - message - error additionalProperties: false '404': description: Default Response content: application/json: schema: type: object properties: reqId: type: string statusCode: type: number enum: - 404 message: type: string error: type: string required: - reqId - statusCode - message - error additionalProperties: false '422': description: Default Response content: application/json: schema: type: object properties: reqId: type: string statusCode: type: number enum: - 422 message: {} error: type: string required: - reqId - statusCode - error additionalProperties: false '500': description: Default Response content: application/json: schema: type: object properties: reqId: type: string statusCode: type: number enum: - 500 message: type: string error: type: string required: - reqId - statusCode - message - error additionalProperties: false ```` --- # Source: https://infisical.com/docs/documentation/platform/dynamic-secrets/oracle.md > ## Documentation Index > Fetch the complete documentation index at: https://infisical.com/docs/llms.txt > Use this file to discover all available pages before exploring further. # Oracle > Learn how to dynamically generate Oracle Database user credentials. The Infisical Oracle dynamic secret allows you to generate Oracle Database credentials on demand based on configured role. ## Prerequisite Create a user with the required permission in your SQL instance. This user will be used to create new accounts on-demand. ## Set up Dynamic Secrets with Oracle Open the Secret Overview dashboard and select the environment in which you would like to add a dynamic secret. Add Dynamic Secret Button Dynamic Secret Modal Name by which you want the secret to be referenced Default time-to-live for a generated secret (it is possible to modify this value after a secret is generated) Maximum time-to-live for a generated secret List of key/value metadata pairs Choose the service you want to generate dynamic secrets for. This must be selected as **Oracle**. Database host Database port Username that will be used to create dynamic secrets Password that will be used to create dynamic secrets Name of the database for which you want to create dynamic secrets A CA may be required if your DB requires it for incoming connections. AWS RDS instances with default settings will requires a CA which can be downloaded [here](https://docs.aws.amazon.com/AmazonRDS/latest/UserGuide/UsingWithRDS.SSL.html#UsingWithRDS.SSL.CertificatesAllRegions). Dynamic Secret Setup Modal Modify SQL Statements Modal Specifies a template for generating usernames. This field allows customization of how usernames are automatically created. Allowed template variables are: * `{{randomUsername}}`: Random username string. * `{{unixTimestamp}}`: Current Unix timestamp at the time of lease creation. * `{{identity.name}}`: Name of the identity that is generating the lease. * `{{dynamicSecret.name}}`: Name of the associated dynamic secret. * `{{dynamicSecret.type}}`: Type of the associated dynamic secret. * `{{random N}}`: Random string of N characters. Allowed template functions are: * `truncate`: Truncates a string to a specified length. * `replace`: Replaces a substring with another value. * `uppercase`: Converts a string to uppercase. * `lowercase`: Converts a string to lowercase. Examples: ```yaml theme={"dark"} {{ randomUsername }} // 3POnzeFyK9gW2nioK0q2gMjr6CZqsRiX {{ unixTimestamp }} // 17490641580 {{ identity.name }} // {{ random 5 }} // x9K2m {{ truncate identity.name 4 }} // test {{ replace identity.name '' 'new-value' }} // new-value ``` After submitting the form, you will see a dynamic secret created in the dashboard. If this step fails, you may have to add the CA certificate. Dynamic Secret Once you've successfully configured the dynamic secret, you're ready to generate on-demand credentials. To do this, simply click on the 'Generate' button which appears when hovering over the dynamic secret item. Alternatively, you can initiate the creation of a new lease by selecting 'New Lease' from the dynamic secret lease list section. Dynamic Secret Dynamic Secret When generating these secrets, it's important to specify a Time-to-Live (TTL) duration. This will dictate how long the credentials are valid for. Provision Lease Ensure that the TTL for the lease falls within the maximum TTL defined when configuring the dynamic secret. Once you click the `Submit` button, a new secret lease will be generated and the credentials for it will be shown to you. Provision Lease ## Audit or Revoke Leases Once you have created one or more leases, you will be able to access them by clicking on the respective dynamic secret item on the dashboard. This will allow you to see the expiration time of the lease or delete a lease before it's set time to live. Provision Lease ## Renew Leases To extend the life of the generated dynamic secret leases past its initial time to live, simply click on the **Renew** button as illustrated below. Provision Lease Lease renewals cannot exceed the maximum TTL set when configuring the dynamic secret --- # Source: https://infisical.com/docs/documentation/platform/secret-rotation/oracledb-credentials.md > ## Documentation Index > Fetch the complete documentation index at: https://infisical.com/docs/llms.txt > Use this file to discover all available pages before exploring further. # OracleDB Credentials Rotation > Learn how to automatically rotate Oracle Database credentials. When working with SQL in Oracle databases, any values not surrounded by "quotes" will become UPPERCASE. Keep this in mind when creating users. ## Prerequisites 1. Create a [OracleDB Connection](/integrations/app-connections/oracledb) with the required **Secret Rotation** permissions 2. Create two designated database users for Infisical to rotate the credentials for. Be sure to grant each user login permissions for the desired database with the necessary privileges their use case will require. An example creation statement might look like: ```SQL theme={"dark"} -- create user roles CREATE USER INFISICAL_USER_1 IDENTIFIED BY "temporary_password"; CREATE USER INFISICAL_USER_2 IDENTIFIED BY "temporary_password"; -- grant necessary privileges GRANT ALL PRIVILEGES TO INFISICAL_USER_1; GRANT ALL PRIVILEGES TO INFISICAL_USER_2; ``` Username must either be ALL UPPERCASE or not be surrounded by "quotes". Values not surrounded by quotes get automatically transformed to uppercase by Oracle Database. To learn more about the Oracle Database permission system, please visit their [documentation](https://docs.oracle.com/en/database/oracle/oracle-database/19/dbseg/configuring-privilege-and-role-authorization.html). 3. Ensure your network security policies allow incoming requests from Infisical to this rotation provider, if network restrictions apply. ## Create an Oracle Database Credentials Rotation in Infisical 1. Navigate to your Secret Manager Project's Dashboard and select **Add Secret Rotation** from the actions dropdown. Secret Manager Dashboard 2. Select the **OracleDB Credentials** option. Select OracleDB Credentials 3. Select the **OracleDB Connection** to use and configure the rotation behavior. Then click **Next**. Rotation Configuration * **OracleDB Connection** - the connection that will perform the rotation of the configured database user credentials. * **Rotation Interval** - the interval, in days, that once elapsed will trigger a rotation. * **Rotate At** - the local time of day when rotation should occur once the interval has elapsed. * **Auto-Rotation Enabled** - whether secrets should automatically be rotated once the rotation interval has elapsed. Disable this option to manually rotate secrets or pause secret rotation. 4. Input the usernames of the database users created above that will be used for rotation. Then click **Next**. Rotation Parameters * **Database Username 1** - the username of the first user that will be used for rotation. * **Database Username 2** - the username of the second user that will be used for rotation. If your Oracle usernames were created without "quotes", Oracle sees them as UPPERCASE. Please use UPPERCASE for those names in the fields above. Rotation Advance Parameters * **Rotation Statement** - the template string query to generate password for the rotated user. * **Password Requirements** - the requirements for the password of the MySQL users that will be created for the rotation. 5. Specify the secret names that the active credentials should be mapped to. Then click **Next**. Rotation Secrets Mapping * **Username** - the name of the secret that the active username will be mapped to. * **Password** - the name of the secret that the active password will be mapped to. 6. Give your rotation a name and description (optional). Then click **Next**. Rotation Details * **Name** - the name of the secret rotation configuration. Must be slug-friendly. * **Description** (optional) - a description of this rotation configuration. 7. Review your configuration, then click **Create Secret Rotation**. Rotation Review 8. Your **OracleDB Credentials** are now available for use via the mapped secrets. Rotation Created To create a OracleDB Credentials Rotation, make an API request to the [Create OracleDB Credentials Rotation](/api-reference/endpoints/secret-rotations/oracledb-credentials/create) API endpoint. ### Sample request ```bash Request theme={"dark"} curl --request POST \ --url https://us.infisical.com/api/v2/secret-rotations/oracledb-credentials \ --header 'Content-Type: application/json' \ --data '{ "name": "my-oracledb-rotation", "projectId": "3c90c3cc-0d44-4b50-8888-8dd25736052a", "description": "my database credentials rotation", "connectionId": "3c90c3cc-0d44-4b50-8888-8dd25736052a", "environment": "dev", "secretPath": "/", "isAutoRotationEnabled": true, "rotationInterval": 30, "rotateAtUtc": { "hours": 0, "minutes": 0 }, "parameters": { "username1": "INFISICAL_USER_1", "username2": "INFISICAL_USER_2" }, "secretsMapping": { "username": "ORACLEDB_USERNAME", "password": "ORACLEDB_PASSWORD" } }' ``` ### Sample response ```bash Response theme={"dark"} { "secretRotation": { "id": "3c90c3cc-0d44-4b50-8888-8dd25736052a", "name": "my-oracledb-rotation", "description": "my database credentials rotation", "secretsMapping": { "username": "ORACLEDB_USERNAME", "password": "ORACLEDB_PASSWORD" }, "isAutoRotationEnabled": true, "activeIndex": 0, "folderId": "3c90c3cc-0d44-4b50-8888-8dd25736052a", "connectionId": "3c90c3cc-0d44-4b50-8888-8dd25736052a", "createdAt": "2023-11-07T05:31:56Z", "updatedAt": "2023-11-07T05:31:56Z", "rotationInterval": 30, "rotationStatus": "success", "lastRotationAttemptedAt": "2023-11-07T05:31:56Z", "lastRotatedAt": "2023-11-07T05:31:56Z", "lastRotationJobId": "3c90c3cc-0d44-4b50-8888-8dd25736052a", "nextRotationAt": "2023-11-07T05:31:56Z", "connection": { "app": "oracledb", "name": "my-oracledb-connection", "id": "3c90c3cc-0d44-4b50-8888-8dd25736052a" }, "environment": { "slug": "dev", "name": "Development", "id": "3c90c3cc-0d44-4b50-8888-8dd25736052a" }, "projectId": "3c90c3cc-0d44-4b50-8888-8dd25736052a", "folder": { "id": "3c90c3cc-0d44-4b50-8888-8dd25736052a", "path": "/" }, "rotateAtUtc": { "hours": 0, "minutes": 0 }, "lastRotationMessage": null, "type": "oracledb-credentials", "parameters": { "username1": "INFISICAL_USER_1", "username2": "INFISICAL_USER_2" } } } ``` --- # Source: https://infisical.com/docs/integrations/app-connections/oracledb.md > ## Documentation Index > Fetch the complete documentation index at: https://infisical.com/docs/llms.txt > Use this file to discover all available pages before exploring further. # OracleDB Connection > Learn how to configure a Oracle Database Connection for Infisical. OracleDB App Connection 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 [team@infisical.com](mailto:team@infisical.com) to purchase an enterprise license to use it. Infisical supports connecting to OracleDB using a database user. ## Configure an Oracle Database User for Infisical Infisical recommends creating a designated user in your Oracle Database for your connection. ```SQL theme={"dark"} -- create user CREATE USER infisical IDENTIFIED BY "my-password"; -- grant create session privileges GRANT CREATE SESSION TO infisical; ``` Username must either be ALL UPPERCASE or not be surrounded by "quotes". Values not surrounded by quotes get automatically transformed to uppercase by Oracle Database. Depending on how you intend to use your OracleDB connection, you'll need to grant one or more of the following permissions. To learn more about the Oracle Database permission system, please visit their [documentation](https://docs.oracle.com/en/database/oracle/oracle-database/19/dbseg/configuring-privilege-and-role-authorization.html). For Secret Rotations, your Infisical user will require the ability to alter other users' passwords: ```SQL theme={"dark"} -- enable permissions to alter login credentials GRANT ALTER USER TO infisical; ``` You'll need the following information to create your Oracle Database connection: * `host` - The hostname or IP address of your Oracle Database server * `port` - The port number your Oracle Database server is listening on (default: 1521) * `database` - The Oracle Service Name or SID (System Identifier) for the database you are connecting to. For example: `ORCL`, `FREEPDB1`, `XEPDB1` * `username` - The user name of the login created in the steps above * `password` - The user password of the login created in the steps above * `sslCertificate` (optional) - The SSL certificate required for connection (if configured) If you are self-hosting Infisical and intend to connect to an internal/private IP address, be sure to set the `ALLOW_INTERNAL_IP_CONNECTIONS` environment variable to `true`. This configuration can only be done on self-hosted or dedicated instances of Infisical. Infisical includes Oracle Instant Client by default, enabling mTLS wallet-based connections without modifying the Docker image. You only need to mount your Oracle Wallet and configure the environment. When `TNS_ADMIN` is set and points to a valid wallet directory, **all Oracle Database connections** in your Infisical instance will use the wallet for authentication. **Gateway Limitation**: Wallet-based connections do not support [Infisical Gateway](/documentation/platform/gateways/overview). The connection details (host, port, protocol) are read directly from the `tnsnames.ora` file in the wallet, bypassing the gateway routing. ### Prerequisites Your Oracle Wallet folder should contain the following files: * `cwallet.sso` - Auto-login wallet (SSO wallet) * `tnsnames.ora` - Connection aliases for your Oracle Database * `sqlnet.ora` - Network configuration ### Configuration Steps Ensure your `sqlnet.ora` file points to the correct wallet directory. Update the `DIRECTORY` path to match where you'll mount the wallet in the container: ```ini theme={"dark"} WALLET_LOCATION = (SOURCE = (METHOD = FILE) (METHOD_DATA = (DIRECTORY = /app/wallet) ) ) SQLNET.AUTHENTICATION_SERVICES = (TCPS) SSL_CLIENT_AUTHENTICATION = TRUE ``` Mount your wallet directory and set the `TNS_ADMIN` environment variable to point to it. **Environment Variable (`.env` file):** ```ini theme={"dark"} TNS_ADMIN=/app/wallet ``` **Volume Mount Examples:** ```bash theme={"dark"} docker run -d \ -v /path/to/your/wallet:/app/wallet:ro \ --env-file .env \ # ... other Infisical configuration ... infisical/infisical:latest ``` ```yaml theme={"dark"} services: infisical: image: infisical/infisical:latest env_file: - .env volumes: - /path/to/your/wallet:/app/wallet:ro # ... other Infisical configuration ... ``` You'll need the following information to create the connection in Infisical: * `host` - The hostname or IP address of your Oracle Database server (required field, but not used for wallet connections). * `port` - The port number your Oracle Database server is listening on (required field, but not used for wallet connections). * `database` - The TNS alias for your Oracle Database from your `tnsnames.ora` file. * `username` - The user name of the login created in the steps above. * `password` - The user password of the login created in the steps above. When a wallet is detected (via the `TNS_ADMIN` environment variable), the connection uses the TNS alias from the `database` field to look up full connection details (host, port, protocol) from your `tnsnames.ora` file. The host and port fields in the connection form are required but ignored for wallet connections. Any SSL settings in the connection form are also ignored - the wallet's certificates are used instead. If you are self-hosting Infisical and intend to connect to an internal/private IP address, be sure to set the `ALLOW_INTERNAL_IP_CONNECTIONS` environment variable to `true`. ## Create Connection in Infisical 1. Navigate to the **Integrations** tab in the desired project, then select **App Connections**. App Connections Tab 2. Select the **OracleDB Connection** option. Select OracleDB Connection 3. Select the **Username & Password** method option and provide the details obtained from the previous section and press **Connect to OracleDB**. Optionally, if you'd like Infisical to manage the credentials of this connection, you can enable the Platform Managed Credentials option. If enabled, Infisical will update the password of the connection on creation to prevent external access to this database user. Create OracleDB Connection 4. Your **OracleDB Connection** is now available for use. Assume User OracleDB Connection To create an Oracle Database Connection, make an API request to the [Create OracleDB Connection](/api-reference/endpoints/app-connections/oracledb/create) API endpoint. Optionally, if you'd like Infisical to manage the credentials of this connection, you can set the `isPlatformManagedCredentials` option to `true`. If enabled, Infisical will update the password of the connection on creation to prevent external access to this database user. ### Sample request ```bash Request theme={"dark"} curl --request POST \ --url https://app.infisical.com/api/v1/app-connections/oracledb \ --header 'Content-Type: application/json' \ --data '{ "name": "my-oracledb-connection", "method": "username-and-password", "isPlatformManagedCredentials": true, "projectId": "7ffbb072-2575-495a-b5b0-127f88caef78", "credentials": { "host": "123.4.5.6", "port": 1521, "database": "FREEPDB1", "username": "infisical", "password": "my-password", "sslEnabled": true, "sslRejectUnauthorized": true }, }' ``` ### Sample response ```bash Response theme={"dark"} { "appConnection": { "id": "3c90c3cc-0d44-4b50-8888-8dd25736052a", "name": "my-oracledb-connection", "projectId": "7ffbb072-2575-495a-b5b0-127f88caef78", "version": 1, "orgId": "3c90c3cc-0d44-4b50-8888-8dd25736052a", "createdAt": "2023-11-07T05:31:56Z", "updatedAt": "2023-11-07T05:31:56Z", "app": "oracledb", "method": "username-and-password", "isPlatformManagedCredentials": true, "credentials": { "host": "123.4.5.6", "port": 1521, "database": "FREEPDB1", "username": "infisical", "sslEnabled": true, "sslRejectUnauthorized": true } } } ``` --- # Source: https://infisical.com/docs/internals/permissions/organization-permissions.md > ## Documentation Index > Fetch the complete documentation index at: https://infisical.com/docs/llms.txt > Use this file to discover all available pages before exploring further. # Organization Permissions > Comprehensive guide to Infisical's organization-level permissions ## Overview Infisical's organization permissions system follows a role-based access control (RBAC) model built on a subject-action-object framework. At the organization level, these permissions determine what actions users/machines can perform on various resources across the entire organization. Each permission consists of: * **Subject**: The resource the permission applies to (e.g., project, members, billing) * **Action**: The operation that can be performed (e.g., read, create, edit, delete) Some organization-level resources—specifically `app-connections`—support conditional permissions and permission inversion for more granular access control. ## Available Organization Permissions Below is a comprehensive list of all available organization-level subjects and their supported actions, organized by functional area. ### Project Management #### Subject: `project` (formerly workspace) | Action | Description | | -------- | ------------------ | | `create` | Create new project | ### Role Management #### Subject: `role` | Action | Description | | -------- | ------------------------------------------------------ | | `read` | View organization roles and their assigned permissions | | `create` | Create new organization roles | | `edit` | Modify existing organization roles | | `delete` | Remove organization roles | ### User Management #### Subject: `member` | Action | Description | | -------- | ------------------------------------ | | `read` | View organization members | | `create` | Add new members to the organization | | `edit` | Modify member details | | `delete` | Remove members from the organization | #### Subject: `groups` | Action | Description | | ------------------ | ------------------------------------------------ | | `read` | View organization groups | | `create` | Create new groups in the organization | | `edit` | Modify existing groups | | `delete` | Remove groups from the organization | | `grant-privileges` | Change permission levels for organization groups | | `add-members` | Add members to groups | | `remove-members` | Remove members from groups | #### Subject: `identity` | Action | Description | | ------------------ | --------------------------------------------------- | | `read` | View organization identities | | `create` | Add new identities to organization | | `edit` | Modify organization identities | | `delete` | Remove identities from organization | | `grant-privileges` | Change permission levels of organization identities | | `revoke-auth` | Revoke authentication for identities | | `create-token` | Create new authentication tokens | | `delete-token` | Delete authentication tokens | | `get-token` | Retrieve authentication tokens | ### Security & Compliance #### Subject: `secret-scanning` | Action | Description | | -------- | ----------------------------------------- | | `read` | View secret scanning results and settings | | `create` | Configure secret scanning | | `edit` | Modify secret scanning settings | | `delete` | Remove secret scanning configuration | #### Subject: `settings` | Action | Description | | -------- | ----------------------------------------- | | `read` | View organization settings | | `create` | Setup and configure organization settings | | `edit` | Modify organization settings | | `delete` | Remove organization settings | #### Subject: `incident-contact` | Action | Description | | -------- | -------------------------------- | | `read` | View incident contacts | | `create` | Set up new incident contacts | | `edit` | Modify incident contact settings | | `delete` | Remove incident contacts | #### Subject: `audit-logs` | Action | Description | | ------ | ---------------------------- | | `read` | View organization audit logs | ### Identity Provider Integration #### Subject: `sso` | Action | Description | | -------- | ---------------------------------- | | `read` | View Single Sign-On configurations | | `create` | Set up new SSO integrations | | `edit` | Modify existing SSO settings | | `delete` | Remove SSO configurations | #### Subject: `scim` | Action | Description | | -------- | ----------------------------- | | `read` | View SCIM configurations | | `create` | Set up new SCIM provisioning | | `edit` | Modify existing SCIM settings | | `delete` | Remove SCIM configurations | #### Subject: `ldap` | Action | Description | | -------- | ----------------------------- | | `read` | View LDAP configurations | | `create` | Set up new LDAP integrations | | `edit` | Modify existing LDAP settings | | `delete` | Remove LDAP configurations | ### Billing & Subscriptions #### Subject: `billing` | Action | Description | | ---------------- | ------------------------------------------------ | | `read` | View billing information and subscription status | | `manage-billing` | Manage billing details and subscription plans | ### Templates & Automation #### Subject: `project-templates` | Action | Description | | -------- | --------------------------------- | | `read` | View project templates | | `create` | Create new project templates | | `edit` | Modify existing project templates | | `delete` | Remove project templates | ### Integrations #### Subject: `app-connections` Supports conditions and permission inversion | Action | Description | | --------- | ---------------------------------- | | `read` | View app connection configurations | | `create` | Create new app connections | | `edit` | Modify existing app connections | | `delete` | Remove app connections | | `connect` | Use app connections | ### Key Management #### Subject: `kms` | Action | Description | | -------- | ------------------------------------ | | `read` | View organization KMS configurations | | `create` | Set up new KMS configurations | | `edit` | Modify KMS settings | | `delete` | Remove KMS configurations | #### Subject: `kmip` | Action | Description | | ------- | ---------------------------------- | | `setup` | Configure KMIP server settings | | `proxy` | Act as a proxy for KMIP operations | ### Admin Tools #### Subject: `organization-admin-console` | Action | Description | | --------------------- | ------------------------------------------- | | `access-all-projects` | Access all projects within the organization | ### Secure Share #### Subject: `secret-share` | Action | Description | | ----------------- | ---------------------------- | | `manage-settings` | Manage secret share settings | ### Gateway Management #### Subject: `gateway` | Action | Description | | ----------------- | --------------------------------- | | `list-gateways` | View all organization gateways | | `create-gateways` | Add new gateways to organization | | `edit-gateways` | Modify existing gateway settings | | `delete-gateways` | Remove gateways from organization | | `attach-gateways` | Attach gateways to resources | #### Subject: `relay` | Action | Description | | --------------- | ------------------------------- | | `list-relays` | View all organization relays | | `create-relays` | Add new relays to organization | | `edit-relays` | Modify existing relay settings | | `delete-relays` | Remove relays from organization | #### Subject: `machine-identity-auth-template` | Action | Description | | ------------------ | ---------------------------------------------- | | `list-templates` | View identity auth templates | | `create-templates` | Create new identity auth templates | | `edit-templates` | Modify existing identity auth templates | | `delete-templates` | Remove identity auth templates | | `unlink-templates` | Unlink identity auth templates from identities | | `attach-templates` | Attach identity auth templates to identities | --- # Source: https://infisical.com/docs/documentation/guides/organization-structure.md > ## Documentation Index > Fetch the complete documentation index at: https://infisical.com/docs/llms.txt > Use this file to discover all available pages before exploring further. # Infisical Organizational Structure Blueprint > Learn how to structure your projects, secrets, and other resources within Infisical. Infisical is designed to provide comprehensive, centralized, and efficient management of secrets, certificates, and encryption keys within organizations. Below is an overview of Infisical's structured components, which developers and administrators can leverage for optimal project management and security posture. ### 0. Cluster/Instance * **Best Practice**: In most cases, a single Infisical instance or cluster is sufficient. Multiple clusters are typically only necessary for large, globally distributed organizations. * **Use Cases**: * **Cloud-hosted** deployments typically use a single cluster. While technically possible, using multiple clusters is not a common practice and is generally unnecessary. * **Self-hosted** deployments can be configured with multiple clusters if needed. ### 1. Organization * **Definition**: An Infisical [organization](/documentation/platform/organization) is a set of projects that use the same billing. * **Use Cases**: * In **self-hosted** setups, you can create multiple organizations (e.g., one for each department or business unit). * In **cloud-hosted deployments**, it's standard to use a single organization. ### 2. Projects * **Definition and Role**: [Projects](/documentation/platform/project) are the highest-level construct within an [organization](/documentation/platform/organization) in Infisical. They serve as the primary container for all functionalities. * **Common Project Mappings**: Projects typically align with applications, services, or code repositories — each being a valid and common approach depending on your organizational structure. * **Functional Capabilities**: Each project encompasses features for managing secrets, certificates, and encryption keys, serving as the central hub for these resources. Projects are isolated from one another. Secrets, certificates, and other resources cannot be shared or referenced across different projects. Each project maintains its own separate set of resources. ### 3. Environments * **Purpose**: Environments are designed for organizing and compartmentalizing secrets within projects. * **Customization Options**: Environments can be tailored to align with existing infrastructure setups of any project. Default options include **Development**, **Staging**, and **Production**. * **Structure**: Each environment inherently has a root level for storing secrets, but additional sub-organizations can be created through [folders](/documentation/platform/folder) for better secret management. ### 4. Folders * **Use Case**: Folders are available for more advanced organizational needs, allowing logical separation of secrets. * **Typical Structure**: Folders can correspond to specific logical units, such as microservices or different layers of an application, providing refined control over secrets. ### 5. Imports * **Purpose and Benefits**: To promote reusability and avoid redundancy within a project, Infisical supports the use of imports and references. This allows secrets, folders, or entire environments to be referenced within the same project as needed. * **Project Isolation**: Imports and references only work within a single project. Secrets cannot be imported or referenced across different projects, as projects are isolated from one another. * **Best Practice**: Utilizing [secret imports](/documentation/platform/secret-reference#secret-imports) or [references](/documentation/platform/secret-reference#secret-referencing) ensures consistency and minimizes manual overhead when managing secrets within a project. ### 6. Approval Workflows * **Importance**: Implementing approval workflows is recommended for organizations aiming to enhance efficiency and strengthen their security posture. * **Types of Workflows**: * **[Access Requests](/documentation/platform/pr-workflows)**: This workflow allows developers to request access to sensitive resources. Such access can be configured for temporary use, a practice known as "just-in-time" access. * **[Change Requests](/documentation/platform/access-controls/access-requests)**: Facilitates reviews and approvals when changes are proposed for sensitive environments or specific folders, ensuring proper oversight. ### 7. Access Controls Infisical’s access control framework is unified for both human users and machine identities, ensuring consistent management across the board. ### 7.1 Roles * **2 Role Types**: * **Organization-Level Roles**: Provide broad access across the organization (e.g., ability to manage billing, configure settings, etc.). * **Project-Level Roles**: Essential for configuring access to specific secrets and other sensitive assets within a project. * **Granular Permissions**: While default roles are available, [custom roles](/documentation/platform/access-controls/role-based-access-controls#creating-custom-roles) can be created for more tailored access controls. * **Admin Considerations**: Note that admin users are able to access all projects. This role should be assigned judiciously to prevent unintended overreach. Project access is defined not via an organization-level role, but rather through specific project memberships of both human and machine identities. Admin roles bypass this by default. ### 7.2 Additional Privileges [Additional privileges](/documentation/platform/access-controls/additional-privileges) can be assigned to users and machines on an ad-hoc basis for specific scenarios where roles alone are insufficient. If you find yourself using additional privileges too much, it is recommended to create custom roles. Additional privileges can be temporary or permanent. ### 7.3 Attribute-Based Access Control (ABAC) [Attribute-based Access Controls](/documentation/platform/access-controls/abac/overview) allow restrictions based on tags or attributes linked to secrets. These can be integrated with SAML assertions and other security frameworks for dynamic access management. ### 7.4 User Groups * **Application**: Organizations should use users groups in situations when they have a lot of developers with the same level of access (e.g., separated by team, department, seniority, etc.). * **Synchronization**: [User groups](/documentation/platform/groups) can be synced with an identity provider to maintain consistency and reduce manual management. ### **Implementation Note** For larger-scale organizations, automating configurations through **Terraform** or other infrastructure-as-code (IaC) tools is advisable. Manual configurations may lead to errors, so leveraging IaC enhances reliability and consistency in managing Infisical's robust capabilities. This structured approach ensures that Infisical's functionalities are fully leveraged, providing both flexibility and rigorous control over an organization's sensitive information and access needs. --- # Source: https://infisical.com/docs/documentation/platform/organization.md > ## Documentation Index > Fetch the complete documentation index at: https://infisical.com/docs/llms.txt > Use this file to discover all available pages before exploring further. # Organizations > Learn more and understand the concept of Infisical organizations. Infisical is structured around organizations and [projects](/documentation/platform/project). ## Organizations An organization represents a company or high-level entity (e.g. Acme Corp) and acts as the root scope for managing members and machine identities, projects, usage and billing, global integrations and configuration (such as single sign-on, provisioning, etc), and more. Within an organization, you can create any number of projects—each tied to a specific product type such as Secrets Management or PKI that determines the functionality available. organization ## Projects The *Projects* tab shows a list of projects that you have access to. If you're an organization admin, you also have the option to view *All Projects*—a complete view of every project within the organization, including those you are not currently a member of— and gain access to any project. Admins can gain access to any project in the organization by opening the options menu (⋮) next to a project and selecting Access. This will add you to the project as an admin and allow full visibility and control. organization projects ## Roles and Access Control The *Access Control* tab lets you view and manage roles and permissions for users, machine identities, and groups across your organization. Users are invited to an organization and assigned organization-level roles such as `Admin` or `Member`. You can also define [custom roles](/documentation/platform/access-controls/role-based-access-controls#creating-custom-roles) at the organization level to fit your permission model. organization users Infisical supports [user identities](/documentation/platform/identities/user-identities) (representing people) and [machine identities](/documentation/platform/identities/machine-identities) (representing services, CI/CD pipelines, or agents). The same roles and permissions can be applied to either type of identity. To manage access at scale, Infisical also supports [user groups](/documentation/platform/groups) — roles assigned to a group apply to all of its members automatically. Note that Infisical distinguishes between organization-level and project-level access control: * [Organization-level access control](/documentation/platform/access-controls/role-based-access-controls#organization-level-access-controls): Roles and permissions governing access to organization-level resources and controls such as billing, member management, and identity provider configuration. * [Project-level access control](/documentation/platform/access-controls/role-based-access-controls#project-level-access-controls): Roles and permissions governing access to resources and workflows within a specific project (e.g., secrets, certificates, SSH hosts). organization roles To learn more about how permissions work in detail, refer to the [access control documentation](/documentation/platform/access-controls/overview). Infisical provides immutable roles such as `admin` and `member` for free. If you're using Infisical Cloud, the ability to create custom roles is available under the **Pro Tier**. If you're self-hosting Infisical, then you should contact [sales@infisical.com](mailto:sales@infisical.com) to purchase an enterprise license to use it. ## Usage & Billing The *Usage & Billing* tab provides an overview of your organization's billing information and platform usage. Infisical calculates usage at the organization level—aggregating activity across all projects and product types (e.g., Secrets Management, PAM, PKI). From this tab, you can track usage, view billing details, and manage your Infisical Cloud subscription. organization billing ## Audit Logs Infisical provides a unified view of [audit logs](/documentation/platform/audit-logs) at the organization level. All platform activity—including secret access, certificate issuance, platform logins across the organization —is recorded and searchable in a central log view. Audit logs are also viewable at the project level, where they are scoped to show only events relevant to that specific project. This allows project administrators to monitor activity and investigate changes without requiring organization-wide access. ## App Connections Infisical supports [app connections](/integrations/app-connections/overview) — integrations configured at the organization level with third-party platforms such as AWS, GCP, GitHub, and many others. Once configured, these connections can be reused across multiple projects as part of any feature that requires third-party integrations—such as [secret syncing](/integrations/secret-syncs/overview) or [dynamic credential generation](/documentation/platform/dynamic-secrets/overview). organization app connections To learn more, refer to the [app connections documentation](/integrations/app-connections/overview). ## Organization Settings The *Organization Settings* tab lets you configure global behavior and security controls for the organization. Key configuration areas include: * General: Manage the organization’s name, slug, and default role for newly invited members. * Single Sign-On (SSO): Enable [SAML](/documentation/platform/sso/overview), [LDAP](/documentation/platform/ldap/overview), or [OIDC-based](/documentation/platform/sso/general-oidc/overview) authentication for user login. * Provisioning: Enable [SCIM](/documentation/platform/scim/overview) to automatically provision and deprovision users and groups from an identity provider. * Security Policies: Enforce MFA and configure session duration limits. * Encryption: Integrate with external KMS systems or bring your own encryption keys (BYOK). * [Audit Log Streaming](/documentation/platform/audit-log-streams/audit-log-streams): Forward audit events to third-party logging tools like SIEMs or cloud storage. * Workflow Integrations: Trigger [Slack](/documentation/platform/workflow-integrations/slack-integration) or [Microsoft Teams](/documentation/platform/workflow-integrations/microsoft-teams-integration) notifications for events like access requests. * [Project Templates](/documentation/platform/project-templates): Define default environments, roles, and settings to standardize project creation. * KMIP (Enterprise): Connect to KMIP-compatible HSMs for hardware-backed key storage and operations. organization settings --- # Source: https://infisical.com/docs/self-hosting/overview.md # Source: https://infisical.com/docs/sdks/overview.md # Source: https://infisical.com/docs/internals/permissions/overview.md # Source: https://infisical.com/docs/internals/overview.md # Source: https://infisical.com/docs/integrations/secret-syncs/overview.md # Source: https://infisical.com/docs/integrations/platforms/kubernetes/overview.md # Source: https://infisical.com/docs/integrations/app-connections/overview.md # Source: https://infisical.com/docs/documentation/platform/sso/overview.md # Source: https://infisical.com/docs/documentation/platform/sso/keycloak-oidc/overview.md # Source: https://infisical.com/docs/documentation/platform/sso/general-oidc/overview.md # Source: https://infisical.com/docs/documentation/platform/secrets-mgmt/overview.md # Source: https://infisical.com/docs/documentation/platform/secret-scanning/overview.md # Source: https://infisical.com/docs/documentation/platform/secret-rotation/overview.md # Source: https://infisical.com/docs/documentation/platform/scim/overview.md # Source: https://infisical.com/docs/documentation/platform/pki/overview.md # Source: https://infisical.com/docs/documentation/platform/pki/enrollment-methods/overview.md # Source: https://infisical.com/docs/documentation/platform/pki/certificates/overview.md # Source: https://infisical.com/docs/documentation/platform/pki/certificate-syncs/overview.md # Source: https://infisical.com/docs/documentation/platform/pki/ca/overview.md # Source: https://infisical.com/docs/documentation/platform/pam/overview.md # Source: https://infisical.com/docs/documentation/platform/ldap/overview.md # Source: https://infisical.com/docs/documentation/platform/kms/overview.md # Source: https://infisical.com/docs/documentation/platform/kms-configuration/overview.md # Source: https://infisical.com/docs/documentation/platform/identities/overview.md # Source: https://infisical.com/docs/documentation/platform/gateways/relay-deployment/overview.md # Source: https://infisical.com/docs/documentation/platform/gateways/overview.md # Source: https://infisical.com/docs/documentation/platform/external-migrations/overview.md # Source: https://infisical.com/docs/documentation/platform/dynamic-secrets/overview.md # Source: https://infisical.com/docs/documentation/platform/agent-sentinel/overview.md # Source: https://infisical.com/docs/documentation/platform/access-controls/overview.md # Source: https://infisical.com/docs/documentation/platform/access-controls/abac/overview.md # Source: https://infisical.com/docs/documentation/getting-started/overview.md # Source: https://infisical.com/docs/contributing/getting-started/overview.md # Source: https://infisical.com/docs/cli/overview.md # Source: https://infisical.com/docs/changelog/overview.md > ## Documentation Index > Fetch the complete documentation index at: https://infisical.com/docs/llms.txt > Use this file to discover all available pages before exploring further. # Changelog The changelog below reflects new product developments and updates on a monthly basis. ## July 2025 * Improved speed performance of audit log filtering. * Revamped password reset flow pages. * Added support for [Bitbucket for Secret Scanning](https://infisical.com/docs/documentation/platform/secret-scanning/bitbucket). * Released Secret Sync for [Zabbix](https://infisical.com/docs/integrations/secret-syncs/zabbix). ## June 2025 * Released Secret Sync for [1Password](https://infisical.com/docs/integrations/secret-syncs/1password), [Heroku](https://infisical.com/docs/integrations/secret-syncs/heroku), [Fly.io](https://infisical.com/docs/integrations/secret-syncs/flyio), and [Render](https://infisical.com/docs/integrations/secret-syncs/render). * Added support for [Kubernetes dynamic secrets](https://infisical.com/docs/documentation/platform/dynamic-secrets/kubernetes) to generate service account tokens * Released Secret Rotation for [MySQL](https://infisical.com/docs/documentation/platform/secret-rotation/mysql-credentials) and [OracleDB](https://infisical.com/docs/documentation/platform/secret-rotation/oracledb-credentials) as well as Dynamic Secrets for [Vertica](https://infisical.com/docs/documentation/platform/dynamic-secrets/vertica) and [GitHub App Tokens](https://infisical.com/docs/documentation/platform/dynamic-secrets/github). * Added support for Azure Auth in ESO. * [Kubernetes auth](https://infisical.com/docs/documentation/platform/identities/kubernetes-auth) now supports gateway as a token reviewer. * Revamped [Infisical CLI](https://infisical.com/docs/cli/commands/login) to auto-open login link. * Rolled out [Infisical Packer integration](https://infisical.com/docs/integrations/frameworks/packer). * Released [AliCloud Authentication method](https://infisical.com/docs/documentation/platform/identities/alicloud-auth). * Added support for [multi-step approval workflows](https://infisical.com/docs/documentation/platform/pr-workflows). * Revamped UI for Access Controls, Access Tree, Policies, and Approval Workflows. * Released [TLS Certificate Authentication method](https://infisical.com/docs/documentation/platform/identities/tls-cert-auth). * Added ability to copy session tokens in the Infisical Dashboard. * Expanded resource support for [Infisical Terraform Provider](https://registry.terraform.io/providers/Infisical/infisical/latest/docs). ## May 2025 * Added support for [Microsoft Teams integration](https://infisical.com/docs/documentation/platform/workflow-integrations/microsoft-teams-integration). * Released [Infisical Gateway](https://infisical.com/docs/documentation/platform/gateways/overview) for accessing private network resources from Infisical. * Added support for [Host Groups](https://infisical.com/docs/documentation/platform/ssh/host-groups) in Infisical SSH. * Updated the designs of all emails send by Infisical. * Added secret rotation support for [Azure Client](https://infisical.com/docs/documentation/platform/secret-rotation/azure-client-secret). * Released secret sync for [HashiCorp Vault](https://infisical.com/docs/integrations/secret-syncs/hashicorp-vault). * Made significant improvements to [Infisical Secret Scanning](https://infisical.com/docs/documentation/platform/secret-scanning/overview). * Released [Infisical ACME Client](https://infisical.com/docs/documentation/platform/pki/acme-ca#certificates-with-acme-ca). * [Access requests](https://infisical.com/docs/documentation/platform/access-controls/access-requests) now support "break-glass" policies. * Updated [Point-in-time Recovery](https://infisical.com/docs/documentation/platform/pit-recovery) UI/UX. * Redesigned [Approval Workflows and Change Requests](https://infisical.com/docs/documentation/platform/pr-workflows) user interface. ## April 2025 * Released ability to [request access to projects](https://infisical.com/docs/documentation/platform/access-controls/project-access-requests#project-access-requests). * Updated UI for Audit Logs and Log Filtering. * Launched [Infisical SSH V2](https://infisical.com/docs/documentation/platform/ssh/overview). * Developer [Infisical MCP](https://github.com/Infisical/infisical-mcp-server). * Added support for [Spotify Backstage Infisical plugin](https://infisical.com/docs/integrations/external/backstage). * Added secret syncs for Terraform Cloud, Vercel, Windmill, TeamCity, and Camunda. * Released [Auth0 Client Secret Rotation](https://infisical.com/docs/documentation/platform/secret-rotation/auth0-client-secret). * Launched [Infisical C++ SDK](https://github.com/Infisical/infisical-cpp-sdk). * Service tokens will now get expiry notifications. * Added Infisical [Linux binary](https://infisical.com/docs/self-hosting/reference-architectures/linux-deployment-ha#linux-ha). * Released ability to perform user impersonation. * Added support for [LDAP password rotation](https://infisical.com/docs/documentation/platform/secret-rotation/ldap-password). ## March 2025 * Released [Infisical Gateway](https://infisical.com/docs/documentation/platform/gateways/overview) for secure access to private resources without needing direct inbound connections to private networks. * Enhanced [Terraform](https://registry.terraform.io/providers/Infisical/infisical/latest/docs) capabilities with token authentication, ability to import existing Infisical secrets as resources, and support for project templates. * Self-hosted improvements: Usage and billing visibility for enabled features, ability to delete users, and support for multiple super admins. * UI and UX updates: Improved secret import interface on the overview page, password reset without backup PDF. * CLI enhancements: Various improvements including multiline secret support and ability to pass headers. * Kubernetes operator updates: Auto-reloading for DaemonSets and StatefulSets (previously only Deployments), added support for ConfigMaps. * Implemented powerful [Access Control](https://infisical.com/docs/documentation/platform/access-controls/overview#access-controls) updates including "**Grant Privileges**" feature for designating specific users for policy management, **Access Tree** visualization for simulating permissions, and ability to restrict scope of secret sharing within organizations. * Released new **Secret Requests** feature under Secret Share, added support for reminders with webhook triggers and implementing password policies for dynamic secrets. * Enhanced secret version history to show who made changes. * New integrations and syncs: **Crossplane** provider, **Humanitec** secret sync, **Airflow** system integration * Performed significant performance optimizations including a 50% reduction in database usage and optimized client secret handling for universal auth. * Enhanced security features with ability to add custom instance banners (useful for regulated industries), short-lived tokens for Kubernetes auth, and OIDC claim passing from machine identity login to permissions. * [Golang SDK](https://infisical.com/docs/sdks/languages/go#infisical-go-sdk): New API added for enhanced functionality * Added capability to programmatically configure an Infisical instance from start to finish without UI interaction. ## February 2025 * Released [KMIP integration](https://infisical.com/docs/documentation/platform/kms/kmip) with PKI structure, auth model integration with machine identities, complete set of client operations, and client certificate authentication flow. * Added new [AWS App Connection](https://infisical.com/docs/integrations/app-connections/aws) and [Secret Sync](https://infisical.com/docs/integrations/secret-syncs/aws-secrets-manager) functionality for enhanced AWS integration. * Released new [Azure Key Vault App Connection](https://infisical.com/docs/integrations/app-connections/azure-key-vault) and [Secret Sync](https://infisical.com/docs/integrations/secret-syncs/azure-key-vault), plus Terraform provider support. * Introduced more comprehensive logging with detailed records for secret sharing and metadata in audit logs. * Introduced new [permission types](https://infisical.com/docs/internals/permissions/project-permissions#subject-secrets): "View Value" vs "Describe Value" for more granular access control over secrets. * Updated encryption logic with unified approach for all platform data, ensuring consistency across the system. * Added support for [OIDC group mapping](https://infisical.com/docs/documentation/platform/sso/general-oidc) to automatically map groups to Infisical for role-based access control. * Added [Terraform Cloud support for OIDC](https://infisical.com/docs/documentation/platform/identities/oidc-auth/terraform-cloud#terraform-cloud). ## January 2025 * Released new integration architecture with decoupled authentication, replacing native integrations with [App Connections](https://infisical.com/docs/integrations/app-connections/overview) and [Secret Syncs](https://infisical.com/docs/integrations/secret-syncs/overview). Initial support for AWS Parameter Store, GitHub, and GCP Secret Manager with improved API and Terraform integration capabilities. * Added support for OIDC group mapping in [Keycloak](https://infisical.com/docs/documentation/platform/sso/keycloak-oidc/overview), enabling automatic mapping of Keycloak groups to Infisical for role-based access control. * Enhanced [Kubernetes operator](https://infisical.com/docs/integrations/platforms/kubernetes/overview#kubernetes-operator) with namespaced group support, bi-directional secret sync (push to Infisical), [dynamic secrets](https://infisical.com/docs/documentation/platform/dynamic-secrets/overview#dynamic-secrets) capabilities, and support for multiple operator instances. * Restructured navigation with dedicated sections for Secrets Management, [Certificate Management (PKI)](https://infisical.com/docs/documentation/platform/pki/overview), [Key Management (KMS)](https://infisical.com/docs/documentation/platform/kms/overview#key-management-service-kms), and [SSH Key Management](https://infisical.com/docs/documentation/platform/ssh). * Added [ephemeral Terraform resource](https://registry.terraform.io/providers/Infisical/infisical/latest/docs) support and improved secret sync architecture. * Released [.NET provider](https://github.com/Infisical/infisical-dotnet-configuration) with first-party Azure authentication support and Azure CLI integration. * Implemented secret Access Visibility allowing users to view all entities with access to specific secrets in the secret side panel. * Added secret filtering by metadata and SSH assigned certificates (Version 1). ## December 2024 * Added [GCP KMS](https://infisical.com/docs/documentation/platform/kms/overview) integration support. * Added support for [K8s CSI integration](https://infisical.com/docs/integrations/platforms/kubernetes-csi) and ability to point K8s operator to specific secret versions. * Fixed [Java SDK](https://github.com/Infisical/java-sdk) compatibility issues with Alpine Linux. * Fixed SCIM group role assignment issues. * Added Group View Page for improved team management. * Added instance URL to email verification for Infisical accounts. * Added ability to copy full path of nested folders. * Added custom templating support for K8s operator, allowing flexible secret key mapping and additional fields. * Optimized secrets versions table performance. ## November 2024 * Improved EnvKey migration functionality with support for Blocks, Inheritance, and Branches. * Added [Hardware Security Module (HSM) Encryption](https://infisical.com/docs/documentation/platform/kms/hsm-integration) support. * Updated permissions handling in [Infisical Terraform Provider](https://registry.terraform.io/providers/Infisical/infisical/latest/docs) to use lists instead of sets. * Enhanced [SCIM](https://infisical.com/docs/documentation/platform/scim/overview) implementation to remove SAML dependency. * Enhanced [OIDC Authentication](https://infisical.com/docs/documentation/platform/identities/oidc-auth/general) implementation and added Default Org Slug support. * Added support for multiple authentication methods per identity. * Added AWS Parameter Store integration sync improvements. * Added new screen and API for managing additional privileges. * Added Dynamic Secrets support for SQL Server. ## October 2024 * Significantly improved performance of audit log operations in UI. * Released [Databricks integration](https://infisical.com/docs/integrations/cloud/databricks). * Added ability to enforce 2FA organization-wide. * Added multiple resource to the [Infisical Terraform Provider](https://registry.terraform.io/providers/Infisical/infisical/latest/docs), including AWS and GCP integrations. * Released [Infisical KMS](https://infisical.com/docs/documentation/platform/kms/overview). * Added support for [LDAP dynamic secrets](https://infisical.com/docs/documentation/platform/ldap/overview). * Enabled changing auth methods for machine identities in the UI. * Launched [Infisical EU Cloud](https://eu.infisical.com). ## September 2024 * Improved paginations for identities and secrets. * Significant improvements to the [Infisical Terraform Provider](https://registry.terraform.io/providers/Infisical/infisical/latest/docs). * Created [Slack Integration](https://infisical.com/docs/documentation/platform/workflow-integrations/slack-integration#slack-integration) for Access Requests and Approval Workflows. * Added Dynamic Secrets for [Elaticsearch](https://infisical.com/docs/documentation/platform/dynamic-secrets/elastic-search) and [MongoDB](https://infisical.com/docs/documentation/platform/dynamic-secrets/mongo-db). * More authentication methods are now supported by Infisical SDKs and Agent. * Integrations now have dedicated audit logs and an overview screen. * Added support for secret referencing in the Terraform Provider. * Released support for [older versions of .NET](https://www.nuget.org/packages/Infisical.Sdk#supportedframeworks-body-tab) via SDK. * Released Infisical PKI Issuer which works alongside `cert-manager` to manage certificates in Kubernetes. ## August 2024 * Added [Azure DevOps integration](https://infisical.com/docs/integrations/cloud/azure-devops). * Released ability to hot-reload variables in CLI ([--watch flag](https://infisical.com/docs/cli/commands/run#infisical-run:watch)). * Added Dynamic Secrets for [Redis](https://infisical.com/docs/documentation/platform/dynamic-secrets/redis). * Added [Alerting](https://infisical.com/docs/documentation/platform/pki/alerting) for Certificate Management. * You can now specify roles and project memberships when adding new users. * Approval workflows now have email notifications. * Access requests are now integrated with User Groups. * Released ability to use IAM Roles for AWS Integrations. ## July 2024 * Released the official [Ruby SDK](https://infisical.com/docs/sdks/languages/ruby). * Increased the speed and efficiency of secret operations. * Released AWS KMS wrapping (bring your own key). * Users can now log in to CLI via SSO in non-browser environments. * Released [Slack Webhooks](https://infisical.com/docs/documentation/platform/webhooks). * Added [Dynamic Secrets with MS SQL](https://infisical.com/docs/documentation/platform/dynamic-secrets/mssql). * Redesigned and simplified the Machine Identities page. * Added the ability to move secrets/folders to another location. * Added [OIDC](https://infisical.com/docs/documentation/platform/identities/oidc-auth/general) support to CLI, Go SDK, and more. * Released [Linux installer for Infisical](https://infisical.com/docs/self-hosting/deployment-options/native/standalone-binary). ## June 2024 * Released [Infisical PKI](https://infisical.com/docs/documentation/platform/pki/overview). * Released the official [Go SDK](https://infisical.com/docs/sdks/languages/go). * Released [OIDC Authentication method](https://infisical.com/docs/documentation/platform/identities/oidc-auth/general). * Allowed users to configure log retention periods on self-hosted instances. * Added [tags](https://registry.terraform.io/providers/Infisical/infisical/latest/docs/resources/secret_tag) to terraform provider. * Released [public secret sharing](https://share.infisical.com). * Built a [native integration with Rundeck](https://infisical.com/docs/integrations/cicd/rundeck). * Added list view for projects in the dashboard. * Fixed offline coding mode in CLI. * Users are now able to leave a particular project themselves. ## May 2024 * Released [AWS](https://infisical.com/docs/documentation/platform/identities/aws-auth), [GCP](https://infisical.com/docs/documentation/platform/identities/gcp-auth), [Azure](https://infisical.com/docs/documentation/platform/identities/azure-auth), and [Kubernetes](https://infisical.com/docs/documentation/platform/identities/kubernetes-auth) Native Auth Methods. * Added [Secret Sharing](https://infisical.com/docs/documentation/platform/secret-sharing) functionality for sharing sensitive data through encrypted links – within and outside of an organization. * Updated [Secret Referencing](https://infisical.com/docs/documentation/platform/secret-reference) to be supported in all Infisical clients. Infisical UI is now able to provide automatic reference suggestions when typing. * Released new [Infisical Jenkins Plugin](https://infisical.com/docs/integrations/cicd/jenkins). * Added statuses and manual sync option to integrations in the Dashboard UI. * Released universal [Audit Log Streaming](https://infisical.com/docs/documentation/platform/audit-log-streams). * Added [Dynamic Secret template for AWS IAM](https://infisical.com/docs/documentation/platform/dynamic-secrets/aws-iam). * Added support for syncing tags and custom KMS keys to [AWS Secrets Manager](https://infisical.com/docs/integrations/cloud/aws-secret-manager) and [Parameter Store](https://infisical.com/docs/integrations/cloud/aws-parameter-store) Integrations. * Officially released Infisical on [AWS Marketplace](https://infisical.com/blog/infisical-launches-on-aws-marketplace). ## April 2024 * Added [Access Requests](https://infisical.com/docs/documentation/platform/access-controls/access-requests) as part of self-serve secrets management workflows. * Added [Temporary Access Provisioning](https://infisical.com/docs/documentation/platform/access-controls/temporary-access) for roles and additional privileges. ## March 2024 * Released support for [Dynamic Secrets](https://infisical.com/docs/documentation/platform/dynamic-secrets/overview). * Released the concept of [Additional Privileges](https://infisical.com/docs/documentation/platform/access-controls/additional-privileges) on top of user/machine roles. ## Feb 2024 * Added org-scoped authentication enforcement for SAML * Added support for [SCIM](https://infisical.com/docs/documentation/platform/scim/overview) along with instructions for setting it up with [Okta](https://infisical.com/docs/documentation/platform/scim/okta), [Azure](https://infisical.com/docs/documentation/platform/scim/azure), and [JumpCloud](https://infisical.com/docs/documentation/platform/scim/jumpcloud). * Pushed out project update for non-E2EE w/ new endpoints like for project creation and member invitation. * Added API Integration testing for new backend. * Added capability to create projects in Terraform. * Added slug-based capabilities to both organizations and projects to gradually make the API more developer-friendly moving forward. * Fixed + improved various analytics/telemetry-related items. * Fixed various issues associated with the Python SDK: build during installation on Mac OS, Rust dependency. * Updated self-hosting documentation to reflect [new backend](https://infisical.com/docs/self-hosting/overview). * Released [Postgres-based Infisical helm chart](https://cloudsmith.io/~infisical/repos/helm-charts/packages/detail/helm/infisical-standalone/). * Added checks to ensure that breaking API changes don't get released. * Automated API reference documentation to be inline with latest releases of Infisical. ## Jan 2024 * Completed Postgres migration initiative with restructed Fastify-based backend. * Reduced size of Infisical Node.js SDK by ≈90%. * Added secret fallback support to all SDK's. * Added Machine Identity support to [Terraform Provider](https://registry.terraform.io/providers/Infisical/infisical/latest/docs). * Released [.NET SDK](https://infisical.com/docs/sdks/languages/csharp). * Added symmetric encryption support to all SDK's. * Fixed secret reminders bug, where reminders were not being updated correctly. ## Dec 2023 * Released [(machine) identities](https://infisical.com/docs/documentation/platform/identities/overview) and [universal auth](https://infisical.com/docs/documentation/platform/identities/universal-auth) features. * Created new cross-language SDKs for [Python](https://infisical.com/docs/sdks/languages/python), [Node](https://infisical.com/docs/sdks/languages/node), and [Java](https://infisical.com/docs/sdks/languages/java). * Released first version of the [Infisical Agent](https://infisical.com/docs/infisical-agent/overview) * Added ability to [manage folders via CLI](https://infisical.com/docs/cli/commands/secrets). ## Nov 2023 * Replaced internal [Winston](https://github.com/winstonjs/winston) with [Pino](https://github.com/pinojs/pino) logging library with external logging to AWS CloudWatch * Added admin panel to self-hosting experience. * Released [secret rotation](https://infisical.com/docs/documentation/platform/secret-rotation/overview) feature with preliminary support for rotating [SendGrid](https://infisical.com/docs/documentation/platform/secret-rotation/sendgrid), [PostgreSQL/CockroachDB](https://infisical.com/docs/documentation/platform/secret-rotation/postgres-credentials), and [MySQL/MariaDB](https://infisical.com/docs/documentation/platform/secret-rotation/mysql) credentials. * Released secret reminders feature. ## Oct 2023 * Added support for [GitLab SSO](https://infisical.com/docs/documentation/platform/sso/gitlab). * Became SOC 2 (Type II) certified. * Reduced required JWT configuration from 5-6 secrets to 1 secret for self-hosting Infisical. * Compacted Infisical into 1 Docker image. * Added native [Hasura Cloud integration](https://infisical.com/docs/integrations/cloud/hasura-cloud). * Updated resource deletion logic for user, organization, and project deletion. ## Sep 2023 * Released [secret approvals](https://infisical.com/docs/documentation/platform/pr-workflows) feature. * Released an update to access controls; every user role now clearly defines and enforces a certain set of conditions across Infisical. * Updated UI/UX for integrations. * Added a native integration with [Qovery](https://infisical.com/docs/integrations/cloud/qovery). * Added service token generation capability for the CLI. ## Aug 2023 * Release Audit Logs V2. * Add support for [GitHub SSO](https://infisical.com/docs/documentation/platform/sso/github). * Enable users to opt in for multiple authentication methods. * Improved password requirements including check against [Have I Been Pwnd Password API](https://haveibeenpwned.com/Passwords). * Added native [GCP Secret Manager integration](https://infisical.com/docs/integrations/cloud/gcp-secret-manager) ## July 2023 * Released [secret referencing and importing](https://infisical.com/docs/documentation/platform/secret-reference) across folders and environments. * Redesigned the project/organization experience. * Updated the secrets overview page; users are now able to edit secrets directly from it. * Added native [Laravel Forge integration](https://infisical.com/docs/integrations/cloud/laravel-forge). * Added native [Codefresh integration](https://infisical.com/docs/integrations/cicd/codefresh). * Added native [Bitbucket integration](https://infisical.com/docs/integrations/cicd/bitbucket). * Added native [DigitalOcean App Platform integration](https://infisical.com/docs/integrations/cloud/digital-ocean-app-platform). * Added native [Cloud66 integration](https://infisical.com/docs/integrations/cloud/cloud-66). * Added native [Terraform Cloud integration](https://infisical.com/docs/integrations/cloud/terraform-cloud). * Added native [Northflank integration](https://infisical.com/docs/integrations/cloud/northflank). * Added native [Windmill integration](https://infisical.com/docs/integrations/cloud/windmill). * Added support for [Google SSO](https://infisical.com/docs/documentation/platform/sso/google) * Added support for [Okta](https://infisical.com/docs/documentation/platform/sso/okta), [Azure AD](https://infisical.com/docs/documentation/platform/sso/azure), and [JumpCloud](https://infisical.com/docs/documentation/platform/sso/jumpcloud) [SAML](https://infisical.com/docs/documentation/platform/saml) authentication. * Released [folders / path-based secret storage](https://infisical.com/docs/documentation/platform/folder). * Released [webhooks](https://infisical.com/docs/documentation/platform/webhooks). ## June 2023 * Released the [Terraform Provider](https://registry.terraform.io/providers/Infisical/infisical/latest/docs). * Updated the usage and billing page. Added the free trial for the professional tier. * Added native integrations with [Checkly](https://infisical.com/docs/integrations/cloud/checkly), [Hashicorp Vault](https://infisical.com/docs/integrations/cloud/hashicorp-vault), and [Cloudflare Pages](https://infisical.com/docs/integrations/cloud/cloudflare-pages). * Completed a penetration test with a `very good` result. * Added support for multi-line secrets. ## May 2023 * Released secret scanning capability for the CLI. * Released customer / license service to manage customer billing information, cloud plans, and self-hosted enterprise licenses; all instances of Infisicals now fetch/relay information from this service. * Completed penetration test. * Released new landing page. * Started SOC 2 (Type II) compliance certification preparation. * Released new deployment options for Fly.io, Digital Ocean and Render. ## April 2023 * Upgraded secret-handling to include blind-indexing (can be thought of as a fingerprint). * Added Node SDK support for working with individual secrets. * Released preliminary Python SDK. * Released service accounts, a client type capable of accessing multiple projects. * Added native Supabase integration. * Added native Railway integration. * Improved dashboard speed / performance. * Released the Secrets Overview page for users to view and identify missing environment secrets within one dashboard. * Updated documentation to include quickstarts and guides; also updated `README.md`. ## March 2023 * Added support for global configs to the Kubernetes operator. * Added support for self-hosted deployments to operate without any attached email service / SMTP configuration. * Added native Azure Key Vault integration. * Released one-click AWS EC2 deployment method. * Released preliminary Node SDK. ## Feb 2023 * Upgraded private key encryption/decryption mechanism to use Argon2id and 256-bit protected keys. * Added preliminary email-based 2FA capability. * Added suspicious login alerting if user logs in via new device or IP address. * Added documentation for PM2 integration. * Added secret backups support for the CLI; it now fetches and caches secrets locally to be used in the event of future failed fetch. * Added support for comparing secret values across environments on each secret. * Added native AWS Parameter Store integration. * Added native AWS Secrets Manager integration. * Added native GitLab integration. * Added native CircleCI integration. * Added native Travis CI integration. * Added secret tagging capability for enhanced organizational structure/grouping. * Released new dashboard design allowing more actions to be performed within the dashboard itself. * Added capability to generate `.env.example` file. ## Jan 2023 * Added preliminary audit logging capability covering CRUD secret operations. * Added secret overriding capability for team members to have their own branch of a secret. * Added secret versioning capability. * Added secret snapshot and point-in-time recovery capabilities to track and roll back the full state of a project. * Added native Vercel integration. * Added native Netlify integration. * Added native GitHub Actions integration. * Added custom environment names. * Added auto-redeployment capability to the Kubernetes operator. * (Service Token 2.0) Shortened the length of service tokens. * Added a public-facing API. * Added preliminary access control capability for users to be provisioned read/write access to environments. * Performed various web UI optimizations. ## Nov 2022 * Infisical is open sourced. * Added Infisical CLI support for Docker and Docker Compose. * Rewrote the Infisical CLI in Golang to be platform-agnostic. * Rewrote the documentation. ## Oct 2022 * Added support for organizations; projects now belong to organizations. * Improved speed / performance of dashboard by 25x. * Added capability to change account password in settings. * Added persistence for logging into the organization and project that users left from in their previous session. * Added password recovery emergency kit with automatic download enforcement upon account creation. * Added capability to copy-to-clipboard capabilities. * Released first native integration between Infisical and Heroku; environment variables can now be sent and kept in sync with Heroku. ## Sep 2022 * Added capability to change user roles in projects. * Added capability to delete projects. * Added Stripe. * Added default environments (development, staging, production) for new users with example key-pairs. * Added loading indicators. * Moved from push/pull mode of secret operation to automatically pulling and injecting secrets into processes upon startup. * Added drag-and-drop capability for adding new .env files. * Improved security measures against common attacks (e.g. XSS, clickjacking, etc.). * Added support for personal secrets (later modified to be secret overrides in Jan 2023). * Improved account password validation and enforce minimum requirements. * Added sorting capability to sort keys by name alphabetically in dashboard. * Added downloading secrets back as `.env` file capability. ## Aug 2022 * Released first version of the Infisical platform with push/pull capability and end-to-end encryption. * Improved security handling of authentication tokens by storing refresh tokens in HttpOnly cookies. * Added hiding key values on client-side. * Added search bar to dashboard to query for keys on client-side. * Added capability to rename a project. * Added user roles for projects. * Added incident contacts. --- # Source: https://infisical.com/docs/integrations/frameworks/packer.md > ## Documentation Index > Fetch the complete documentation index at: https://infisical.com/docs/llms.txt > Use this file to discover all available pages before exploring further. # Packer > Learn how to fetch secrets from Infisical with Packer using a data source This guide demonstrates how to use the Infisical Packer plugin to fetch secret data using a data source. The Packer plugin supports both [Infisical Cloud](https://app.infisical.com) and [self-hosted instances of Infisical](https://infisical.com/docs/self-hosting/overview). ## Prerequisites Before you begin, make sure you have: * [Packer](https://developer.hashicorp.com/packer/install) installed * An Infisical account with access to a project * Basic understanding of Packer ## Project Setup ### Configure Provider First, specify the Infisical provider in your Packer configuration: ```hcl theme={"dark"} packer { required_plugins { infisical = { source = "github.com/infisical/infisical" version = ">=0.0.1" } } } ``` ### Authentication Using a Machine Identity, you can authenticate with [Universal Auth](https://infisical.com/docs/documentation/platform/identities/universal-auth). ```hcl theme={"dark"} data "infisical-secrets" "dev-secrets" { folder_path = "/" env_slug = "dev" # The environment to list secrets from (e.g. dev, staging, prod) project_id = "00000000-0000-0000-0000-000000000000" host = "https://app.infisical.com" # Optional for cloud, required for self-hosted universal_auth { client_id = "00000000-0000-0000-0000-000000000000" client_secret = "..." # Optional if using INFISICAL_UNIVERSAL_AUTH_CLIENT_SECRET env variable } } ``` Learn more about [machine identities](/documentation/platform/identities/machine-identities). ## Using Secrets in Packer You're able to fetch secrets from Infisical using the `infisical-secrets` Data Source: ```hcl theme={"dark"} # Fetch all secrets from a folder data "infisical-secrets" "dev-secrets" { folder_path = "/" env_slug = "dev" project_id = "00000000-0000-0000-0000-000000000000" universal_auth { ... } } locals { secrets = data.infisical-secrets.dev-secrets.secrets } source "null" "basic-example" { communicator = "none" } build { sources = [ "source.null.basic-example" ] provisioner "shell-local" { inline = [ "echo secret_key: ${local.secrets["SECRET_KEY"].secret_value}", ] } } ``` The `local.secrets` object maps secret keys to [secret objects](https://github.com/Infisical/packer-plugin-infisical/blob/main/docs/datasources/secrets.md#secret-object). See also: * [Packer Plugin Repository Example](https://github.com/Infisical/packer-plugin-infisical/blob/main/example/build.pkr.hcl) * [Packer Plugin Repository Docs](https://github.com/Infisical/packer-plugin-infisical/tree/main/docs) * [Machine Identity setup guide](/documentation/platform/identities/machine-identities) --- # Source: https://infisical.com/docs/sdks/languages/php.md > ## Documentation Index > Fetch the complete documentation index at: https://infisical.com/docs/llms.txt > Use this file to discover all available pages before exploring further. # Infisical PHP SDK If you're working with PHP, the official Infisical PHP SDK package is the easiest way to fetch and work with secrets for your application. ## Installation ```bash theme={"dark"} composer require infisical/php-sdk ``` ## Getting Started ```php theme={"dark"} auth()->universalAuth()->login( "your-machine-identity-client-id", "your-machine-identity-client-secret" ); // List secrets $params = new \Infisical\SDK\Models\ListSecretsParameters( environment: "dev", secretPath: "/", projectId: "your-project-id" ); $secrets = $sdk->secrets()->list($params); echo "Fetched secrets: " . count($secrets) . "\n"; ``` ## Core Methods The SDK methods are organized into the following high-level categories: 1. `auth`: Handles authentication methods. 2. `secrets`: Manages CRUD operations for secrets. ### `Auth` The `auth` component provides methods for authentication: #### Universal Auth **Authenticating** ```php theme={"dark"} $response = $sdk->auth()->universal_auth()->login( "your-machine-identity-client-id", "your-machine-identity-client-secret" ); ``` **Parameters:** * `clientId` (string): The client ID of your Machine Identity. * `clientSecret` (string): The client secret of your Machine Identity. We do not recommend hardcoding your [Machine Identity Tokens](/documentation/platform/identities/overview). Setting them as environment variables would be best. ### `Secrets` This sub-class handles operations related to secrets: #### List Secrets ```php theme={"dark"} use Infisical\SDK\Models\ListSecretsParameters; $params = new ListSecretsParameters( environment: "dev", secretPath: "/", projectId: "your-project-id", tagSlugs: ["tag1", "tag2"], // Optional recursive: true, // Optional expandSecretReferences: true, // Optional attachToProcessEnv: false, // Optional skipUniqueValidation: false // Optional ); $secrets = $sdk->secrets()->list($params); ``` **Parameters:** * `environment` (string): The environment in which to list secrets (e.g., "dev"). * `projectId` (string): The ID of your project. * `secretPath` (string, optional): The path to the secrets. * `tagSlugs` (array, optional): Tags to filter secrets. * `recursive` (bool, optional): Whether to list secrets recursively. * `expandSecretReferences` (bool, optional): Whether to expand secret references. * `attachToProcessEnv` (bool, optional): Whether to attach secrets to process environment variables. * `skipUniqueValidation` (bool, optional): Whether to skip unique validation. **Returns:** * `Secret[]`: An array of secret objects. #### Create Secret ```php theme={"dark"} use Infisical\SDK\Models\CreateSecretParameters; $params = new CreateSecretParameters( secretKey: "SECRET_NAME", secretValue: "SECRET_VALUE", environment: "dev", secretPath: "/", projectId: "your-project-id" ); $createdSecret = $sdk->secrets()->create($params); ``` **Parameters:** * `secretKey` (string): The name of the secret to create. * `secretValue` (string): The value of the secret. * `environment` (string): The environment in which to create the secret. * `projectId` (string): The ID of your project. * `secretPath` (string, optional): The path to the secret. **Returns:** * `Secret`: The created secret object. #### Get Secret ```php theme={"dark"} use Infisical\SDK\Models\GetSecretParameters; $params = new GetSecretParameters( secretKey: "SECRET_NAME", environment: "dev", secretPath: "/", projectId: "your-project-id" ); $secret = $sdk->secrets()->get($params); ``` **Parameters:** * `secretKey` (string): The name of the secret to retrieve. * `environment` (string): The environment in which to retrieve the secret. * `projectId` (string): The ID of your project. * `secretPath` (string, optional): The path to the secret. **Returns:** * `Secret`: The retrieved secret object. #### Update Secret ```php theme={"dark"} use Infisical\SDK\Models\UpdateSecretParameters; $params = new UpdateSecretParameters( secretKey: "SECRET_NAME", newSecretValue: "UPDATED_SECRET_VALUE", environment: "dev", secretPath: "/", projectId: "your-project-id" ); $updatedSecret = $sdk->secrets()->update($params); ``` **Parameters:** * `secretKey` (string): The name of the secret to update. * `newSecretValue` (string): The new value of the secret. * `environment` (string): The environment in which to update the secret. * `projectId` (string): The ID of your project. * `secretPath` (string, optional): The path to the secret. **Returns:** * `Secret`: The updated secret object. #### Delete Secret ```php theme={"dark"} use Infisical\SDK\Models\DeleteSecretParameters; $params = new DeleteSecretParameters( secretKey: "SECRET_NAME", environment: "dev", secretPath: "/", projectId: "your-project-id" ); $deletedSecret = $sdk->secrets()->delete($params); ``` **Parameters:** * `secretKey` (string): The name of the secret to delete. * `environment` (string): The environment in which to delete the secret. * `projectId` (string): The ID of your project. * `secretPath` (string, optional): The path to the secret. **Returns:** * `Secret`: The deleted secret object. --- # Source: https://infisical.com/docs/documentation/platform/sso/pingone-oidc.md > ## Documentation Index > Fetch the complete documentation index at: https://infisical.com/docs/llms.txt > Use this file to discover all available pages before exploring further. # PingOne OIDC > Learn how to configure PingOne OIDC for Infisical SSO. PingOne OIDC SSO is a paid feature. If you're using Infisical Cloud, then it is available under the **Pro Tier**. If you're self-hosting Infisical, then you should contact [sales@infisical.com](mailto:sales@infisical.com) to purchase a self-hosted license to use it. 1.1. From the Application's Page, create a new OIDC Web App application. OIDC pingone create application 1.2. Enable the application by pressing the "Enable" toggle. OIDC PingOne Enable Application 1.3. In the Application "Configuration" tab, press the "Edit" pencil icon to configure the application callback URI. OIDC PingOne Edit Application Configuration 1.4 Set the Redirect URL to `https://app.infisical.com/api/v1/sso/oidc/callback` and press the "Save" button. OIDC PingOne Edit Redirect URI If you're self-hosting Infisical, then you will want to replace [https://app.infisical.com](https://app.infisical.com) with your own domain. 1.5 After configuring the redirect URL, go to the "Attribute Mappings" tab and press the "Edit" pencil icon to configure the attribute mappings. OIDC PingOne Edit Attribute Mappings 1.6 Map the following attributes: * `email` -> `Email Address` * `name` -> `Username` OIDC PingOne Edit Attribute Mappings Once done, press the "Save" button. 2.1. Open the "Overview" tab and copy the **Client ID** and **Client Secret**. OIDC PingOne Application Credential 2.2. Still in the "Overview" tab, scroll down to the Connection Details section and retrieve the **OIDC Discovery Endpoint**. OIDC PingOne OIDC Discovery Endpoint Keep these values handy as we will need them in the next steps. 3.1. Back in Infisical, head to the **Single Sign-On (SSO)** page and select the **General** tab. Click **Connect** for **OIDC**. OIDC SSO Connect 3.2. For configuration type, select **Discovery URL**. Then, set **Discovery Document URL**, **Client ID**, and **Client Secret** from step 2.1 and 2.2. OIDC PingOne paste values into Infisical Currently, the following JWT signature algorithms are supported: RS256, RS512, HS256, and EdDSA Once you've done that, press **Update** to complete the required configuration. Enabling OIDC allows members in your organization to log into Infisical via PingOne OIDC PingOne enable OIDC Enforcing OIDC SSO ensures that members in your organization can only access Infisical by logging into the organization via PingOne. To enforce OIDC SSO, you're required to test out the OpenID connection by successfully authenticating at least one PingOne user with Infisical. Once you've completed this requirement, you can toggle the **Enforce OIDC SSO** button to enforce OIDC SSO. We recommend ensuring that your account is provisioned using the application in PingOne prior to enforcing OIDC SSO to prevent any unintended issues. In case of a lockout, an organization admin can use the [Admin Login Portal](https://infisical.com/docs/documentation/platform/sso/overview#admin-login-portal) in the `/login/admin` path e.g. [https://app.infisical.com/login/admin](https://app.infisical.com/login/admin). If you are only using one organization on your Infisical instance, you can configure a default organization in the [Server Admin Console](../admin-panel/server-admin#default-organization) to expedite OIDC login. If you're configuring OIDC SSO on a self-hosted instance of Infisical, make sure to set the `AUTH_SECRET` and `SITE_URL` environment variable for it to work:
* `AUTH_SECRET`: A secret key used for signing and verifying JWT. This can be a random 32-byte base64 string generated with `openssl rand -base64 32`.
* `SITE_URL`: The absolute URL of your self-hosted instance of Infisical including the protocol (e.g. [https://app.infisical.com](https://app.infisical.com)) --- # Source: https://infisical.com/docs/documentation/platform/scim/pingone.md > ## Documentation Index > Fetch the complete documentation index at: https://infisical.com/docs/llms.txt > Use this file to discover all available pages before exploring further. # PingOne SCIM > Learn how to configure SCIM provisioning with PingOne for Infisical. PingOne SCIM provisioning 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](mailto:sales@infisical.com) to purchase a self-hosted license to use it. Prerequisites: * [Configure PingOne OIDC for Infisical](/documentation/platform/sso/pingone-oidc) In Infisical, head to the **Single Sign-On (SSO)** page and select the **Provisioning** tab. Under SCIM Configuration, press the **Enable SCIM provisioning** toggle to allow PingOne to provision/deprovision users for your organization. SCIM enable provisioning Next, press **Manage SCIM Tokens** and then **Create** to generate a SCIM token for PingOne. SCIM create token Next, copy the **SCIM URL** and **New SCIM Token** to use when configuring SCIM in PingOne. SCIM copy token Inside your PingOne environment, navigate to Directory > Users. Add any users and/or groups to your application that you would like to be provisioned over to Infisical. SCIM PingOne Users and Groups **1. Create a new connection** In PingOne, head to Integrations > Provisioning, and inside provisioning, press the **Connections** tab. Here you'll see a plus icon to add a new connection. SCIM PingOne Connections SCIM PingOne Connections Select the "Identity Store" option. SCIM PingOne SCIM Outbound Search for the "SCIM Outbound" option to start the configuration process for SCIM. Finally, press the **Next** button. Give the connection a name and optionally add a description. **2. Configure the connection** Once you have selected the SCIM Outbound option, you'll be prompted to enter the authentication details that PingOne will use to authenticate with Infisical SCIM. This is the **SCIM URL** and **New SCIM Token** from the previous step. SCIM PingOne SCIM Outbound Set the following fields: * `SCIM BASE URL`: Input the **SCIM URL** from the previous step. * `Users Resource`: Leave as default, `/Users`. * `Groups Resource`: Leave as default, `/Groups`. * `SCIM Version`: Leave as default, `2.0`. * `Authentication Method`: Select `OAuth 2 Bearer Token`. * `Oauth Access Token`: Input the **New SCIM Token** from step 1. * `Auth Type Header`: Select `Bearer`. Once this is done, you can press the **Test Connection** button to check that SCIM is configured properly. You should see a success message saying "Connection Successful". If the connection is successful, press the "Next" button. In the final step, you'll be prompted to configure the mappings for the connection. Set the following fields: * `User Filter Expression`: `email.value Eq "%s"`. * `User Identifier`: `workEmail`. * `Deprovision on Rule Deletion:` Enabled. SCIM PingOne Connection Mappings Once this is configured, press the "Save" button. **3. Enable the connection** Finally, remember to enable the connection by pressing the enable toggle. SCIM PingOne Connection Enable **1. Create a new rule** After creating a connection, you can now access the "Rules" tab under the Provisioning section. Here you can configure the rules for the connection. SCIM PingOne Create New Rule 1 SCIM PingOne Create New Rule 2 Select the "New Rule" button and choose a name for the rule, then press the "Create Rule" button. **2. Configure the rule connection** Once you have created a rule, you now need to configure the connection to use for the rule. SCIM PingOne Create New Rule 3 Select the connection you created in the previous step and press the "Save" button. **3. Configure the rule user filter** SCIM PingOne Create New Rule 4 Select the Edit pencil icon to open the user filter configuration. This step dictates which users will be provisioned to Infisical. SCIM PingOne Create New Rule 5 In this case, we are provisioning all users that are enabled in PingOne. Configure your user filter to match your desired users, and then press the "Save" button. **4. Configure Groups** This step is optional and only relevant if you want to provision PingOne groups to Infisical. SCIM PingOne Create New Rule 6 Open the "Group Provisioning" tab and press the "Add Groups" button to select which groups will be provisioned to Infisical. SCIM PingOne Create New Rule 7 Select the groups you want to provision to Infisical and press the "Save" button. **5. Enable the rule** Once you have configured the rule, you can enable it by pressing the "Enable" toggle. SCIM PingOne Create New Rule 8 **FAQ** Infisical's SCIM implementation accounts for retaining the end-to-end encrypted architecture of Infisical because we decouple the **authentication** and **decryption** steps in the platform. For this reason, SCIM-provisioned users are initialized but must finish setting up their account when logging in the first time by creating a master encryption/decryption key. With this implementation, IdPs and SCIM providers cannot and will not have access to the decryption key needed to decrypt your secrets. --- # Source: https://infisical.com/docs/documentation/platform/pit-recovery.md > ## Documentation Index > Fetch the complete documentation index at: https://infisical.com/docs/llms.txt > Use this file to discover all available pages before exploring further. # Point-in-Time Recovery > Learn how to rollback secrets and configurations to any snapshot with Infisical. Point-in-Time Recovery is a paid feature. If you're using Infisical Cloud, then it is available under the **Pro Tier**. If you're self-hosting Infisical, then you should contact [sales@infisical.com](mailto:sales@infisical.com) to purchase an enterprise license to use it. Infisical's point-in-time recovery functionality allows secrets to be rolled back to any point in time for any given [folder](./folder) or [environment](/documentation/platform/project#project-environments). ## Understanding Commits Similar to Git, a commit in Infisical represents a snapshot of changes made to your project's resources at a specific point in time. Each commit is scoped to an environment and [folder](./folder) within it. Unlike the legacy snapshot system, the new commits interface provides granular tracking of individual changes, allowing you to see exactly what was modified, added, or removed in each commit. ### Accessing Commits From your secrets management interface, you can access the commits functionality by clicking the **Commits Button**. This button is located in the top-right area of your secrets view and shows the number of commits for the current folder (e.g., "4 Commits"). Commits Button ### Commits List View The commits page displays a comprehensive chronological history of all changes made to your environment and folders: Commits List View * **Chronological Sorting**: Commits are grouped by date * **Commit Information**: Each commit shows: * Commit message * Author information * Relative timestamp * Unique commit hash identifier * **Search Functionality**: Use the search bar to quickly find specific commits * **Sorting Options**: Sort commits by various criteria using the sort controls ### Detailed Commit Inspection Clicking on any commit from the list opens a detailed view showing the list of changes made in that commit. Detailed Commit Inspection #### Change Categories The commit changes details can be grouped into the following categories: **Folder Changes** * Shows folder additions, modifications, or deletions * Displays the folder properties changes in JSON format, including: * Folder name * Folder description **Secret Changes** * Lists all secrets that were added, updated, or removed * Shows the complete secret configuration including: * Secret key and value * Comments, tags and metadata * Encoding settings (e.g., skipMultilineEncoding) * Values are displayed with appropriate masking for security **Visual Indicators** * Green "+" indicators show additions * Red "-" indicators show deletions * Modified content shows both old and new states ### Restoration Options Each commit provides two distinct restoration methods accessible via the **Restore Options** dropdown: Restore Options #### Revert changes This option provides surgical precision for undoing specific modifications: * **Granular Control**: Reverts only the specific changes introduced in that individual commit * **Selective Restoration**: Preserves all other changes made after the commit * **Targeted Undo**: Perfect for reversing a specific problematic change without affecting other work * **Minimal Impact**: Only affects the resources that were modified in that particular commit * **Use Case**: Ideal when you want to undo a specific change while keeping all other modifications intact #### Roll back to this commit This option performs a complete restoration to the selected point in time: Rollback * **Complete State Restoration**: Returns the entire folder to its exact state at the time of this commit * **Restore All Child Folders**: If enabled, it'll also restore all nested folders to their exact state at the time of this commit. * **Destructive Operation**: Discards ALL changes made after the selected commit * **New Commit Creation**: Creates a new commit representing this rollback operation * **Use Case**: Ideal when you want to completely undo a series of changes and return to a known good state **Warning**: This operation will undo all modifications made after the selected commit, which may include multiple secrets and configuration changes. The snapshots interface is deprecated and will be removed in a future version. Please use the new Commits interface for more granular point-in-time recovery operations. ## Snapshots Similar to Git, a commit (also known as snapshot) in Infisical is the state of your project's secrets at a specific point in time scoped to an environment and [folder](./folder) within it. To view a list of snapshots for the current folder, press the **Commits** button. PIT commits This opens up a sidebar from which you can select to view a particular snapshot: PIT snapshots ## Rolling back After pressing on a snapshot from the sidebar, you can view it and roll back the state of the folder to that point in time by pressing the **Rollback** button. PIT snapshot Rolling back secrets to a past snapshot creates a snapshot at the top of the stack and updates secret versions. Rollbacks are localized to not affect other folders within the same environment. This means each [folder](./folder) maintains its own independent history of changes, offering precise and isolated control over rollback actions. Put differently, every [folder](./folder) possesses a distinct and separate timeline, providing granular control when managing your secrets. --- # Source: https://infisical.com/docs/documentation/platform/pki/pki-issuer.md # Kubernetes Issuer > Learn how to automatically provision and manage TLS certificates in Kubernetes using Infisical PKI ## Concept The Infisical PKI Issuer is an installable Kubernetes [cert-manager](https://cert-manager.io/) controller that uses Infisical PKI to sign certificate requests. The issuer is perfect for getting X.509 certificates for ingresses and other Kubernetes resources and capable of automatically renewing certificates as needed. As part of the workflow, you install `cert-manager`, the Infisical PKI Issuer, and configure resources to represent the connection details to your Infisical PKI and the certificates you wish to issue. Each issued certificate and corresponding private key is made available in a Kubernetes secret. We recommend reading the [cert-manager documentation](https://cert-manager.io/docs/) for a fuller understanding of all the moving parts. ## Workflow A typical workflow for using the Infisical PKI Issuer to issue certificates for your Kubernetes resources consists of the following steps: 1. Creating a machine identity in Infisical. 2. Creating a Kubernetes secret to store the credentials of the machine identity. 3. Installing `cert-manager` into your Kubernetes cluster. 4. Installing the Infisical PKI Issuer controller into your Kubernetes cluster. 5. Creating an `Issuer` or `ClusterIssuer` resource in your Kubernetes cluster to represent the Infisical PKI issuer you wish to use. 6. Create the approver policy to accept certificate request. 7. Creating a `Certificate` resource in your Kubernetes cluster to represent a certificate you wish to issue. As part of this step, you specify the Kubernetes `Secret` to create and store the issued certificate and private key. 8. Consuming the issued certificate across your Kubernetes resources from the specified Kubernetes `Secret`. ## Guide In the following steps, we explore how to install the Infisical PKI Issuer using [kubectl](https://github.com/kubernetes/kubectl) and use it to obtain certificates for your Kubernetes resources. Follow the instructions [here](/documentation/platform/identities/universal-auth) to configure a [machine identity](/documentation/platform/identities/machine-identities) in Infisical with Universal Auth. By the end of this step, you should have a **Client ID** and **Client Secret** on hand as part of the Universal Auth configuration for the Infisical PKI Issuer to authenticate with Infisical; this will be useful in steps 4 and 5. Currently, the Infisical PKI Issuer only supports authenticating with Infisical via the [Universal Auth](/documentation/platform/identities/universal-auth) authentication method. We're planning to add support for [Kubernetes Auth](/documentation/platform/identities/kubernetes-auth) in the near future. Install `cert-manager` into your Kubernetes cluster by following the instructions [here](https://cert-manager.io/docs/installation/) or by running the following command: ```bash theme={"dark"} kubectl apply -f https://github.com/cert-manager/cert-manager/releases/download/v1.15.3/cert-manager.yaml ``` Install the Infisical PKI Issuer controller into your Kubernetes cluster using one of the following methods: ```bash theme={"dark"} helm repo add infisical-helm-charts 'https://dl.cloudsmith.io/public/infisical/helm-charts/helm/charts/' helm install infisical-pki-issuer infisical-helm-charts/infisical-pki-issuer ``` ```bash theme={"dark"} kubectl apply -f https://raw.githubusercontent.com/Infisical/infisical-issuer/main/build/install.yaml ``` Start by creating a Kubernetes `Secret` containing the **Client Secret** from step 1. As mentioned previously, this will be used by the Infisical PKI issuer to authenticate with Infisical. ```bash theme={"dark"} kubectl create secret generic issuer-infisical-client-secret \ --namespace \ --from-literal=clientSecret= ``` ```yaml secret-issuer.yaml theme={"dark"} apiVersion: v1 kind: Secret metadata: name: issuer-infisical-client-secret namespace: data: clientSecret: ``` ```bash theme={"dark"} kubectl apply -f secret-issuer.yaml ``` Next, create the Infisical PKI Issuer by filling out `url`, `clientId`, `projectId` or `certificateTemplateName`, and applying the following configuration file for the `Issuer` resource. This configuration file specifies the connection details to your Infisical PKI CA to be used for issuing certificates. ```yaml infisical-issuer.yaml theme={"dark"} apiVersion: infisical-issuer.infisical.com/v1alpha1 kind: Issuer metadata: name: issuer-infisical namespace: spec: url: "https://app.infisical.com" # the URL of your Infisical instance projectId: # the ID of the project you want to use to issue certificates certificateTemplateName: # the name of the certificate template you want to use to issue certificates against authentication: universalAuth: clientId: # the Client ID from step 1 secretRef: # reference to the Secret created in step 4 name: "issuer-infisical-client-secret" key: "clientSecret" ``` ``` kubectl apply -f infisical-issuer.yaml ``` You can check that the issuer was created successfully by running the following command: ```bash theme={"dark"} kubectl get issuers.infisical-issuer.infisical.com -n -o wide ``` ```bash theme={"dark"} NAME AGE issuer-infisical 21h ``` An `Issuer` is a namespaced resource, and it is not possible to issue certificates from an `Issuer` in a different namespace. This means you will need to create an `Issuer` in each namespace you wish to obtain `Certificates` in. If you want to create a single `Issuer` that can be consumed in multiple namespaces, you should consider creating a `ClusterIssuer` resource. This is almost identical to the `Issuer` resource, however is non-namespaced so it can be used to issue `Certificates` across all namespaces. You can read more about the `Issuer` and `ClusterIssuer` resources [here](https://cert-manager.io/docs/configuration/). If you create a `CertificateRequest` now, you'll notice it's neither approved nor denied. This is expected because by default cert-manager approver controller requires an approver-policy. To enable approval, create the following YAML file and apply it: ```yaml infisical-approver-policy.yaml theme={"dark"} apiVersion: rbac.authorization.k8s.io/v1 kind: ClusterRole metadata: name: infisical-issuer-approver rules: # Permission to approve or deny CertificateRequests for signers in cert-manager.io API group - apiGroups: ['cert-manager.io'] resources: ['signers'] verbs: ['approve'] resourceNames: # Grant approval permissions for namespaced issuers - "issuers.infisical-issuer.infisical.com/default.issuer-infisical" # Grant approval permissions for cluster-scoped issuers - "clusterissuers.infisical-issuer.infisical.com/clusterissuer-infisical" --- # Bind the cert-manager service account to the new role apiVersion: rbac.authorization.k8s.io/v1 kind: ClusterRoleBinding metadata: name: infisical-issuer-approver-binding subjects: - kind: ServiceAccount name: cert-manager namespace: cert-manager roleRef: apiGroup: rbac.authorization.k8s.io kind: ClusterRole name: infisical-issuer-approver ``` ``` kubectl apply -f infisical-approver-policy.yaml ``` This configuration creates a `ClusterRole` named `infisical-issuer-approver` that grants approval permissions for specific Infisical issuer types. It then binds this role to the cert-manager service account, allowing it to approve certificate requests from your Infisical issuers. For information, check out [cert manager approval policy doc](https://cert-manager.io/docs/policy/approval/approver-policy/). Finally, create a `Certificate` by applying the following configuration file. This configuration file specifies the details of the (end-entity/leaf) certificate to be issued. ```yaml certificate-issuer.yaml theme={"dark"} apiVersion: cert-manager.io/v1 kind: Certificate metadata: name: certificate-by-issuer namespace: spec: commonName: certificate-by-issuer.example.com # the common name for the certificate secretName: certificate-by-issuer # the name of the Kubernetes Secret to create and store the certificate and private key in issuerRef: name: issuer-infisical group: infisical-issuer.infisical.com kind: Issuer privateKey: # the algorithm and key size to use algorithm: ECDSA size: 256 duration: 48h # the ttl for the certificate renewBefore: 12h # the time before the certificate expiry that the certificate should be automatically renewed ``` The above sample configuration file specifies a certificate to be issued with the common name `certificate-by-issuer.example.com` and ECDSA private key using the P-256 curve, valid for 48 hours; the certificate will be automatically renewed by `cert-manager` 12 hours before expiry. The certificate is issued by the issuer `issuer-infisical` created in the previous step and the resulting certificate and private key will be stored in a secret named `certificate-by-issuer`. Note that the full list of the fields supported on the `Certificate` resource can be found in the API reference documentation [here](https://cert-manager.io/docs/reference/api-docs/#cert-manager.io/v1.CertificateSpec). You can check that the certificate was created successfully by running the following command: ```bash theme={"dark"} kubectl get certificates -n -o wide ``` ```bash theme={"dark"} NAME READY SECRET ISSUER STATUS AGE certificate-by-issuer True certificate-by-issuer issuer-infisical Certificate is up to date and has not expired 20h ``` Since the actual certificate and private key are stored in a Kubernetes secret, we can check that the secret was created successfully by running the following command: ```bash theme={"dark"} kubectl get secret certificate-by-issuer -n ``` ```bash theme={"dark"} NAME TYPE DATA AGE certificate-by-issuer kubernetes.io/tls 2 26h ``` We can `describe` the secret to get more information about it: ```bash theme={"dark"} kubectl describe secret certificate-by-issuer -n default ``` ```bash theme={"dark"} Name: certificate-by-issuer Namespace: default Labels: controller.cert-manager.io/fao=true Annotations: cert-manager.io/alt-names: cert-manager.io/certificate-name: certificate-by-issuer cert-manager.io/common-name: certificate-by-issuer.example.com cert-manager.io/ip-sans: cert-manager.io/issuer-group: infisical-issuer.infisical.com cert-manager.io/issuer-kind: Issuer cert-manager.io/issuer-name: issuer-infisical cert-manager.io/uri-sans: Type: kubernetes.io/tls Data ==== ca.crt: 1306 bytes tls.crt: 2380 bytes tls.key: 227 bytes ``` Here, `ca.crt` is the Root CA certificate, `tls.crt` is the requested certificate followed by the certificate chain, and `tls.key` is the private key for the certificate. We can decode the certificate and print it out using `openssl`: ```bash theme={"dark"} kubectl get secret certificate-by-issuer -n default -o jsonpath='{.data.tls\.crt}' | base64 --decode | openssl x509 -text -noout ``` In any case, the certificate is ready to be used as Kubernetes Secret by your Kubernetes resources. ## FAQ The full list of the fields supported on the `Certificate` resource can be found in the API reference documentation [here](https://cert-manager.io/docs/reference/api-docs/#cert-manager.io/v1.CertificateSpec). Currently, not all fields are supported by the Infisical PKI Issuer. Yes. `cert-manager` will automatically renew certificates according to the `renewBefore` threshold of expiry as specified in the corresponding `Certificate` resource. You can read more about the `renewBefore` field [here](https://cert-manager.io/docs/reference/api-docs/#cert-manager.io/v1.CertificateSpec). If you see log messages similar to: ``` "CertificateRequest has not been approved yet. Ignoring.","controller":"certificaterequest","controllerGroup":"cert-manager.io","controllerKind":"CertificateRequest","CertificateRequest":{"name":"skynet-infisical-rta-rsa2048-1","namespace":"infisical-system"},"namespace":"infisical-system","name":"skynet-infisical-rta-rsa2048-1","reconcileID":"bfb7cad9-d867-45b5-b3a3-0139e731b7a6"} ``` This indicates that the `CertificateRequest` has been created, but `cert-manager` has not yet approved it. This typically occurs because a necessary approver policy is missing. Refer to the documentation above to create an approver policy. --- # Source: https://infisical.com/docs/documentation/getting-started/concepts/platform-hierarchy.md > ## Documentation Index > Fetch the complete documentation index at: https://infisical.com/docs/llms.txt > Use this file to discover all available pages before exploring further. # Platform Hierarchy > Understand how organizations and projects are structured in Infisical. Infisical is structured around organizations and projects, allowing teams to manage multiple products, access scopes, and use cases within a single account while keeping boundaries and responsibilities clearly defined. ## Organizations An [organization](/documentation/platform/organization) typically represents a company or high-level entity (e.g. Acme Corp). It acts as the umbrella for all projects, members, and billing settings. [Users](/documentation/platform/identities/user-identities) are invited to an organization and assigned [organization-level roles](/documentation/platform/access-controls/role-based-access-controls#organization-level-access-controls) that determine what they can manage—such as members, machine identities, and billing details. organization ## Projects A [project](/documentation/platform/project) belongs to an organization and defines a specific scope of work. Each project has a product type such as Secrets Management, PAM, or PKI that determines what features are available in that project. For example: * A Secrets Management project manages application secrets across environments. * A PAM project enables access management for infrastructure. * A PKI project manages certificate authorities and X.509 certificate workflows. Users are added to a project and assigned [project-level roles](/documentation/platform/access-controls/role-based-access-controls#project-level-access-controls) that determine what they can manage—such as secrets, access policies, or certificate authorities. A user can have different roles across projects, allowing for flexible and fine-grained access control that reflects how teams operate in practice. organization projects ## Key Characteristics * Projects are isolated in terms of configuration, permissions, and product workflows. * Access is managed independently at both the organization and project level. * All projects within an organization share the same billing and user directory. Teams can adopt Infisical incrementally—starting with one product and expanding as needed. --- # Source: https://infisical.com/docs/documentation/getting-started/concepts/platform-iam.md > ## Documentation Index > Fetch the complete documentation index at: https://infisical.com/docs/llms.txt > Use this file to discover all available pages before exploring further. # Platform Identity and Access Management > Understand how users, machine identities, roles, and permissions are managed. Infisical uses identity-based access control to govern how users and systems interact with secrets, certificates, infrastructure, and other resources on the platform. There are two types of identities: * [User identities](/documentation/platform/identities/user-identities): Represent individuals such as developers or administrators that typically access the platform via browser. * [Machine identities](/documentation/platform/identities/machine-identities): Represent systems such as CI pipelines or applications that programmatically interact with the platform. Each identity is granted access based on its assigned roles and permissions and must authenticate with the platform in order to access any resources. To learn more, refer to the [identities documentation](/documentation/platform/identities/overview). ## Roles and Access Infisical provides a robust and flexible access control system. The primary authorization mechanism is [role-based access control (RBAC)](/documentation/platform/access-controls/role-based-access-controls), where identities are assigned roles at two access control levels: * [Organization-level access control](/documentation/platform/access-controls/role-based-access-controls#organization-level-access-controls): Control billing, member management, and platform-wide settings * [Project-level access control](/documentation/platform/access-controls/role-based-access-controls#project-level-access-controls): Control access to specific product resources like secrets, SSH hosts, or certificates Beyond RBAC, Infisical also supports additional project-level permissioning features, [including attribute-based access control (ABAC)](/documentation/platform/access-controls/abac/overview), [temporary access grants](/documentation/platform/access-controls/temporary-access), and [additional privileges](/documentation/platform/access-controls/additional-privileges) for select project types. To learn more, refer to the [access control documentation](/documentation/platform/access-controls/overview). --- # Source: https://infisical.com/docs/integrations/platforms/pm2.md > ## Documentation Index > Fetch the complete documentation index at: https://infisical.com/docs/llms.txt > Use this file to discover all available pages before exploring further. # PM2 > How to use Infisical to inject environment variables and secrets with PM2 into a Node.js app Prerequisites: * Set up and add envars to [Infisical Cloud](https://app.infisical.com) * [Install the CLI](/cli/overview) ## Initialize Infisical for your Node.js app ```bash theme={"dark"} # navigate to the root of your of your project cd /path/to/project # then initialize infisical infisical init ``` ## Create a bash or js script ```bash infisical-run.sh theme={"dark"} infisical run -- npm start ``` ```js infisical-run.js theme={"dark"} const spawn = require("child_process").spawn; const infisical = spawn("infisical", ["run", "--", "npm", "start"]); infisical.stdout.on("data", (data) => console.log(`${data}`)); infisical.stderr.on("data", (data) => console.error(`${data}`)); ``` ## Start your application as usual but with the script ```bash infisical-run.sh theme={"dark"} pm2 start infisical-run.sh ``` ```bash infisical-run.js theme={"dark"} pm2 start infisical-run.js ``` --- # Source: https://infisical.com/docs/documentation/platform/pki/certificates/policies.md > ## Documentation Index > Fetch the complete documentation index at: https://infisical.com/docs/llms.txt > Use this file to discover all available pages before exploring further. # Certificate Policies ## Concept A certificate policy is a policy structure specifying permitted attributes for requested certificates. This includes constraints around subject naming conventions, SAN fields, key usages, and extended key usages. Each certificate requested against a [certificate profile](/documentation/platform/pki/certificates/profiles) is validated against the policy bound to that profile. If the request fails any criteria included in the policy, the certificate is not issued. This helps administrators enforce uniformity and security standards across all issued certificates. ## Guide to Creating a Certificate Policy To create a certificate policy, head to your Certificate Management Project > Certificate Manager > Certificate Policies and press **Create Policy**. pki certificate template pki certificate template modal Here's some guidance on each field: * Policy Name: A slug-friendly name for the policy such as `tls-server`. * Description: An optional description for the policy. * Subject Attributes: A list of common names that can be included in the certificate subject. Each row accepts a fixed value or pattern such as `example.com` or `*.example.com` and whether it is allowed or denied. * Subject Alternative Names (SANs): A list of SANs that can appear in the certificate. Each row accepts a SAN type (e.g. DNS, IP, Email, URI), a fixed value or pattern such as `example.com` or `*.example.com`, and an allow or deny flag. * Allowed Signature Algorithms: The set of signature algorithms permitted to sign certificates under this policy such as `SHA256-RSA`, `SHA512-RSA`, etc. * Allowed Key Algorithms: The set of public key algorithms permitted for certificate requests such as `RSA-2048`, `RSA-4096`, etc. * Key Usages: The cryptographic purposes of the certificate such as Digital Signature, Key Encipherment, etc. * Extended Key Usages: The higher-level intended uses of the certificate such as Server Authentication, Client Authentication, etc. * Certificate Validity: The maximum lifetime of certificates that can be requested for certificates validated against this policy. You can specify both a duration and unit (days, months, or years). * Basic Constraints: Defines the role of a certificate within a trust hierarchy. * **CA Certificate Property**: Determines if a certificate is permitted to sign and issue other certificates if `CA:TRUE` property is set. Options are: * **Forbid**: Issued certificates are restricted to "End-Entity" use. They cannot sign other certificates. * **Allow**: Certificates may be issued as either a CA or an End-Entity based on the specific signing request. * **Require**: Mandates that all issued certificates act as CAs. This is typically used for Root or Intermediate CA policies. * **Maximum Allowed Path Length**: Specifies the maximum number of non-self-issued intermediate certificates that may follow this certificate in a valid chain. * A value of 0 means the CA can only sign final end-entity certificates. * A value of 1 allows for one more level of CAs below it. * Leaving this empty imposes no limit on the chain depth. --- # Source: https://infisical.com/docs/documentation/platform/secret-rotation/postgres-credentials.md > ## Documentation Index > Fetch the complete documentation index at: https://infisical.com/docs/llms.txt > Use this file to discover all available pages before exploring further. # PostgreSQL Credentials Rotation > Learn how to automatically rotate PostgreSQL credentials. ## Prerequisites 1. Create a [PostgreSQL Connection](/integrations/app-connections/postgres) with the required **Secret Rotation** permissions 2. Create two designated database users for Infisical to rotate the credentials for. Be sure to grant each user login permissions for the desired database with the necessary privileges their use case will require. An example creation statement might look like: ```SQL theme={"dark"} -- create user roles CREATE USER infisical_user_1 WITH ENCRYPTED PASSWORD 'temporary_password'; CREATE USER infisical_user_2 WITH ENCRYPTED PASSWORD 'temporary_password'; -- grant database connection permissions GRANT CONNECT ON DATABASE my_database TO infisical_user_1; GRANT CONNECT ON DATABASE my_database TO infisical_user_2; -- grant relevant table permissions GRANT ALL PRIVILEGES ON ALL TABLES IN SCHEMA public TO infisical_user_1; GRANT ALL PRIVILEGES ON ALL TABLES IN SCHEMA public TO infisical_user_2; ``` To learn more about PostgreSQL's permission system, please visit their [documentation](https://www.postgresql.org/docs/current/sql-grant.html). 3. Ensure your network security policies allow incoming requests from Infisical to this rotation provider, if network restrictions apply. ## Create a PostgreSQL Credentials Rotation in Infisical 1. Navigate to your Secret Manager Project's Dashboard and select **Add Secret Rotation** from the actions dropdown. Secret Manager Dashboard 2. Select the **PostgreSQL Credentials** option. Select PostgreSQL Credentials 3. Select the **PostgreSQL Connection** to use and configure the rotation behavior. Then click **Next**. Rotation Configuration * **PostgreSQL Connection** - the connection that will perform the rotation of the configured database user credentials. * **Rotation Interval** - the interval, in days, that once elapsed will trigger a rotation. * **Rotate At** - the local time of day when rotation should occur once the interval has elapsed. * **Auto-Rotation Enabled** - whether secrets should automatically be rotated once the rotation interval has elapsed. Disable this option to manually rotate secrets or pause secret rotation. 4. Input the usernames of the database users created above that will be used for rotation. Then click **Next**. Rotation Parameters * **Database Username 1** - the username of the first user that will be used for rotation. * **Database Username 2** - the username of the second user that will be used for rotation. Rotation Advance Parameters * **Rotation Statement** - the template string query to generate password for the rotated user. * **Password Requirements** - the requirements for the password of the MySQL users that will be created for the rotation. 5. Specify the secret names that the active credentials should be mapped to. Then click **Next**. Rotation Secrets Mapping * **Username** - the name of the secret that the active username will be mapped to. * **Password** - the name of the secret that the active password will be mapped to. 6. Give your rotation a name and description (optional). Then click **Next**. Rotation Details * **Name** - the name of the secret rotation configuration. Must be slug-friendly. * **Description** (optional) - a description of this rotation configuration. 7. Review your configuration, then click **Create Secret Rotation**. Rotation Review 8. Your **PostgreSQL Credentials** are now available for use via the mapped secrets. Rotation Created To create a PostgreSQL Credentials Rotation, make an API request to the [Create PostgreSQL Credentials Rotation](/api-reference/endpoints/secret-rotations/postgres-credentials/create) API endpoint. ### Sample request ```bash Request theme={"dark"} curl --request POST \ --url https://us.infisical.com/api/v2/secret-rotations/postgres-credentials \ --header 'Content-Type: application/json' \ --data '{ "name": "my-pg-rotation", "projectId": "3c90c3cc-0d44-4b50-8888-8dd25736052a", "description": "my database credentials rotation", "connectionId": "3c90c3cc-0d44-4b50-8888-8dd25736052a", "environment": "dev", "secretPath": "/", "isAutoRotationEnabled": true, "rotationInterval": 30, "rotateAtUtc": { "hours": 0, "minutes": 0 }, "parameters": { "username1": "infisical_user_1", "username2": "infisical_user_2" }, "secretsMapping": { "username": "POSTGRES_DB_USERNAME", "password": "POSTGRES_DB_PASSWORD" } }' ``` ### Sample response ```bash Response theme={"dark"} { "secretRotation": { "id": "3c90c3cc-0d44-4b50-8888-8dd25736052a", "name": "my-pg-rotation", "description": "my database credentials rotation", "secretsMapping": { "username": "POSTGRES_DB_USERNAME", "password": "POSTGRES_DB_PASSWORD" }, "isAutoRotationEnabled": true, "activeIndex": 0, "folderId": "3c90c3cc-0d44-4b50-8888-8dd25736052a", "connectionId": "3c90c3cc-0d44-4b50-8888-8dd25736052a", "createdAt": "2023-11-07T05:31:56Z", "updatedAt": "2023-11-07T05:31:56Z", "rotationInterval": 30, "rotationStatus": "success", "lastRotationAttemptedAt": "2023-11-07T05:31:56Z", "lastRotatedAt": "2023-11-07T05:31:56Z", "lastRotationJobId": "3c90c3cc-0d44-4b50-8888-8dd25736052a", "nextRotationAt": "2023-11-07T05:31:56Z", "connection": { "app": "postgres", "name": "my-pg-connection", "id": "3c90c3cc-0d44-4b50-8888-8dd25736052a" }, "environment": { "slug": "dev", "name": "Development", "id": "3c90c3cc-0d44-4b50-8888-8dd25736052a" }, "projectId": "3c90c3cc-0d44-4b50-8888-8dd25736052a", "folder": { "id": "3c90c3cc-0d44-4b50-8888-8dd25736052a", "path": "/" }, "rotateAtUtc": { "hours": 0, "minutes": 0 }, "lastRotationMessage": null, "type": "postgres-credentials", "parameters": { "username1": "infisical_user_1", "username2": "infisical_user_2" } } } ``` --- # Source: https://infisical.com/docs/integrations/app-connections/postgres.md > ## Documentation Index > Fetch the complete documentation index at: https://infisical.com/docs/llms.txt > Use this file to discover all available pages before exploring further. # PostgreSQL Connection > Learn how to configure a PostgreSQL Connection for Infisical. Infisical supports connecting to PostgreSQL using a database role. ## Configure a PostgreSQL Role for Infisical Infisical recommends creating a designated role in your PostgreSQL database for your connection. ```SQL theme={"dark"} -- create user role CREATE ROLE infisical_role WITH LOGIN PASSWORD 'my-password'; -- grant login access to the specified database GRANT CONNECT ON DATABASE my_database TO infisical_role; ``` Depending on how you intend to use your PostgreSQL connection, you'll need to grant one or more of the following permissions. To learn more about PostgreSQL's permission system, please visit their [documentation](https://www.postgresql.org/docs/current/sql-grant.html). For Secret Rotations, your Infisical user will require the ability to alter other users' passwords: ```SQL theme={"dark"} -- enable permissions to alter login credentials ALTER ROLE infisical_role WITH CREATEROLE; ``` In some configurations, the role performing the rotation must be explicitly granted access to manage each user. To do this, grant the user's role to the rotation role with: ```SQL theme={"dark"} -- grant each user role to admin user for password rotation GRANT TO WITH ADMIN OPTION; ``` Replace `` with each specific username whose credentials will be rotated, and `` with the role that will perform the rotation. You'll need the following information to create your PostgreSQL connection: * `host` - The hostname or IP address of your PostgreSQL server * `port` - The port number your PostgreSQL server is listening on (default: 5432) * `database` - The name of the specific database you want to connect to * `username` - The role name of the login created in the steps above * `password` - The role password of the login created in the steps above * `sslCertificate` (optional) - The SSL certificate required for connection (if configured) If you are self-hosting Infisical and intend to connect to an internal/private IP address, be sure to set the `ALLOW_INTERNAL_IP_CONNECTIONS` environment variable to `true`. ## Create Connection in Infisical 1. Navigate to the **Integrations** tab in the desired project, then select **App Connections**. App Connections Tab 2. Select the **PostgreSQL Connection** option. Select PostgreSQL Connection 3. Select the **Username & Password** method option and provide the details obtained from the previous section and press **Connect to PostgreSQL**. Optionally, if you'd like Infisical to manage the credentials of this connection, you can enable the Platform Managed Credentials option. If enabled, Infisical will update the password of the connection on creation to prevent external access to this database role. Create PostgreSQL Connection 4. Your **PostgreSQL Connection** is now available for use. Assume Role PostgreSQL Connection To create a PostgreSQL Connection, make an API request to the [Create PostgreSQL Connection](/api-reference/endpoints/app-connections/postgres/create) API endpoint. Optionally, if you'd like Infisical to manage the credentials of this connection, you can set the `isPlatformManagedCredentials` option to `true`. If enabled, Infisical will update the password of the connection on creation to prevent external access to this database role. ### Sample request ```bash Request theme={"dark"} curl --request POST \ --url https://app.infisical.com/api/v1/app-connections/postgres \ --header 'Content-Type: application/json' \ --data '{ "name": "my-pg-connection", "method": "username-and-password", "isPlatformManagedCredentials": true, "projectId": "7ffbb072-2575-495a-b5b0-127f88caef78", "credentials": { "host": "123.4.5.6", "port": 5432, "database": "default", "username": "infisical_role", "password": "my-password", "sslEnabled": true, "sslRejectUnauthorized": true }, }' ``` ### Sample response ```bash Response theme={"dark"} { "appConnection": { "id": "3c90c3cc-0d44-4b50-8888-8dd25736052a", "name": "my-pg-connection", "projectId": "7ffbb072-2575-495a-b5b0-127f88caef78", "version": 1, "orgId": "3c90c3cc-0d44-4b50-8888-8dd25736052a", "createdAt": "2023-11-07T05:31:56Z", "updatedAt": "2023-11-07T05:31:56Z", "app": "postgres", "method": "username-and-password", "isPlatformManagedCredentials": true, "credentials": { "host": "123.4.5.6", "port": 5432, "database": "default", "username": "infisical_role", "sslEnabled": true, "sslRejectUnauthorized": true } } } ``` --- # Source: https://infisical.com/docs/documentation/platform/dynamic-secrets/postgresql.md > ## Documentation Index > Fetch the complete documentation index at: https://infisical.com/docs/llms.txt > Use this file to discover all available pages before exploring further. # PostgreSQL > Learn how to dynamically generate PostgreSQL database users. The Infisical PostgreSQL dynamic secret allows you to generate PostgreSQL database credentials on demand based on configured role. ## Prerequisite Create a user with the required permission in your SQL instance. This user will be used to create new accounts on-demand. ## Set up Dynamic Secrets with PostgreSQL Open the Secret Overview dashboard and select the environment in which you would like to add a dynamic secret. Add Dynamic Secret Button Dynamic Secret Modal Name by which you want the secret to be referenced Default time-to-live for a generated secret (it is possible to modify this value after a secret is generated) Maximum time-to-live for a generated secret List of key/value metadata pairs Choose the service you want to generate dynamic secrets for. This must be selected as **PostgreSQL**. Database host Database port Username that will be used to create dynamic secrets Password that will be used to create dynamic secrets Name of the database for which you want to create dynamic secrets A CA may be required if your DB requires it for incoming connections. AWS RDS instances with default settings will requires a CA which can be downloaded [here](https://docs.aws.amazon.com/AmazonRDS/latest/UserGuide/UsingWithRDS.SSL.html#UsingWithRDS.SSL.CertificatesAllRegions). Dynamic Secret Setup Modal Modify SQL Statements Modal Specifies a template for generating usernames. This field allows customization of how usernames are automatically created. Allowed template variables are: * `{{randomUsername}}`: Random username string. * `{{unixTimestamp}}`: Current Unix timestamp at the time of lease creation. * `{{identity.name}}`: Name of the identity that is generating the lease. * `{{dynamicSecret.name}}`: Name of the associated dynamic secret. * `{{dynamicSecret.type}}`: Type of the associated dynamic secret. * `{{random N}}`: Random string of N characters. Allowed template functions are: * `truncate`: Truncates a string to a specified length. * `replace`: Replaces a substring with another value. * `uppercase`: Converts a string to uppercase. * `lowercase`: Converts a string to lowercase. Examples: ```yaml theme={"dark"} {{ randomUsername }} // 3POnzeFyK9gW2nioK0q2gMjr6CZqsRiX {{ unixTimestamp }} // 17490641580 {{ identity.name }} // {{ random 5 }} // x9K2m {{ truncate identity.name 4 }} // test {{ replace identity.name '' 'new-value' }} // new-value ``` If you want to provide specific privileges for the generated dynamic credentials, you can modify the SQL statement to your needs. This is useful if you want to only give access to a specific table(s). After submitting the form, you will see a dynamic secret created in the dashboard. If this step fails, you may have to add the CA certificate. Dynamic Secret Once you've successfully configured the dynamic secret, you're ready to generate on-demand credentials. To do this, simply click on the 'Generate' button which appears when hovering over the dynamic secret item. Alternatively, you can initiate the creation of a new lease by selecting 'New Lease' from the dynamic secret lease list section. Dynamic Secret Dynamic Secret When generating these secrets, it's important to specify a Time-to-Live (TTL) duration. This will dictate how long the credentials are valid for. Provision Lease Ensure that the TTL for the lease falls within the maximum TTL defined when configuring the dynamic secret. Once you click the `Submit` button, a new secret lease will be generated and the credentials for it will be shown to you. Provision Lease ## Audit or Revoke Leases Once you have created one or more leases, you will be able to access them by clicking on the respective dynamic secret item on the dashboard. This will allow you to see the expiration time of the lease or delete the lease before it's set time to live. Provision Lease ## Renew Leases To extend the life of the generated dynamic secret leases past its initial time to live, simply click on the **Renew** button as illustrated below. Provision Lease Lease renewals cannot exceed the maximum TTL set when configuring the dynamic secret --- # Source: https://infisical.com/docs/documentation/platform/pr-workflows.md > ## Documentation Index > Fetch the complete documentation index at: https://infisical.com/docs/llms.txt > Use this file to discover all available pages before exploring further. # Approval Workflows > Learn how to enable a set of policies to manage changes to sensitive secrets and environments. Approval Workflows is a paid feature. If you're using Infisical Cloud, then it is available under the **Pro Tier** and **Enterprise Tier**. If you're self-hosting Infisical, then you should contact [sales@infisical.com](mailto:sales@infisical.com) to purchase an enterprise license to use it. ## Problem at hand Updating secrets in high-stakes environments (e.g., production) can have a number of problematic issues: * Most developers should not have access to secrets in production environments. Yet, they are the ones who often need to add new secrets or change the existing ones. Many organizations have in-house policies with regards to what person should be contacted in the case of needing to make changes to secrets. This slows down software development lifecycle and distracts engineers from working on things that matter the most. * As a general rule, before making changes in production environments, those changes have to be looked over by at least another person. An extra pair of eyes can help reduce the risk of human error and make sure that the change will not affect the application in an unintended way. * After making updates to secrets, the corresponding applications need to be redeployed with the right set of secrets and configurations. This process is often not automated and hence prone to human error. ## Solution As a wide-spread software engineering practice, developers have to submit their code as a PR that needs to be approved before the code is merged into the main branch. In a similar way, to solve the above-mentioned issues, Infisical provides a feature called `Approval Workflows` for secret management. This is a set of policies and workflows that help advance access controls, compliance procedures, and stability of a particular environment. In other words, **Approval Workflows** help you secure, stabilize, and streamline the change of secrets in high-stakes environments. ### Setting a policy First, you would need to create a set of policies for a certain environment. In the example below, a generic change policy for a production environment is shown. In this case, any user who submits a change to `prod` would first have to get an approval by a predefined approver (or multiple approvers). create secret update policy ### Policy enforcement levels The enforcement level determines how strict the policy is. A **Hard** enforcement level means that any change that matches the policy will need full approval prior merging. A **Soft** enforcement level allows for break glass functionality on the request. If a change request is bypassed, the approvers will be notified via email. Enabling the "Bypass Approvals" toggle during policy creation will create a **Soft** enforcement level. Disabling the toggle makes the enforcement level **Hard**. If you choose to allow approval bypasses (Soft Enforcement), you may select specific users or groups that can perform the bypass for that specific policy. Not choosing users or groups will allow anyone to bypass the policy. A policy bypasser cannot bypass requests from others; the bypass action can only be performed by the request creator. ### Self approvals If the **Self Approvals** option is enabled, users who are designated as approvers on the policy can approve requests that they themselves have submitted. ### Example of creating a change policy When creating a policy, you can choose the type of policy you want to create. In this case, we will be creating a `Change Policy`. Other types of policies include `Access Policy` that creates policies for **[Access Requests](/documentation/platform/access-controls/access-requests)**. create panel secret update policy ### Example of updating secrets with Approval workflows When a user submits a change to an environment that is under a particular policy, a corresponding change request will go to a predefined approver (or multiple approvers). secret update change requests Approvers are notified by email and/or Slack as soon as the request is initiated. In the Infisical Dashboard, they will be able to `approve` and `merge` (or `deny`) a request for a change in a particular environment. After that, depending on the workflows setup, the change will be automatically propagated to the right applications (e.g., using [Infisical Kubernetes Operator](https://infisical.com/docs/integrations/platforms/kubernetes)). secrets update pull request ## FAQ Yes, if you'd like to require an approval from an approver other than the one who created the request, then you can disable the **Self Approvals** feature inside of your target policy. --- # Source: https://infisical.com/docs/documentation/platform/pki/ca/private-ca.md > ## Documentation Index > Fetch the complete documentation index at: https://infisical.com/docs/llms.txt > Use this file to discover all available pages before exploring further. # Internal CA > Learn how to create a Private CA hierarchy with Infisical. ## Concept Infisical lets you build your Internal PKI through a Private Certificate Authority (CA) hierarchy, enabling you to issue and manage digital certificates for your end-entities.
```mermaid theme={"dark"} graph TD A[Root CA] A --> B[Intermediate CA] A --> C[Intermediate CA] ```
## Workflow A typical workflow for setting up a Private CA hierarchy consists of the following steps: 1. Configuring an Infisical root CA with details like name, validity period, and path length — This step is optional if you wish to use an external root CA with Infisical only serving the intermediate CAs. 2. Configuring and chaining intermediate CA(s) with details like name, validity period, path length, and imported certificate to your Root CA. 3. Managing the CA lifecycle events such as CA succession. Note that this workflow can be executed via the Infisical UI or manually such as via API. If manually executing the workflow, you may have to create a Certificate Signing Request (CSR) for the intermediate CA, create an intermediate certificate using the root CA private key and CSR, and import the intermediate certificate back to the intermediate CA as part of Step 2. ## Guide to Creating a CA Hierarchy In the following steps, we explore how to create a simple Private CA hierarchy consisting of an (optional) root CA and an intermediate CA. If you wish to use an external root CA, you can skip this step and head to step 2 to create an intermediate CA. To create a root CA, head to your Certificate Management Project > Certificate Authorities > Internal Certificate Authorities and press **Create CA**. pki create ca Here, set the **CA Type** to **Root** and fill out details for the root CA. pki create root ca Here's some guidance for each field: * Valid Until: The date until which the CA is valid in the date time string format specified [here](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Date#date_time_string_format). For example, the following formats would be valid: `YYYY`, `YYYY-MM`, `YYYY-MM-DD`, `YYYY-MM-DDTHH:mm:ss.sssZ`. * Path Length: The maximum number of intermediate CAs that can be chained to this CA. A path of `-1` implies no limit; a path of `0` implies no intermediate CAs can be chained. * Key Algorithm: The type of public key algorithm and size, in bits, of the key pair that the CA creates when it issues a certificate. Supported key algorithms are `RSA 2048`, `RSA 4096`, `ECDSA P-256`, and `ECDSA P-384` with the default being `RSA 2048`. * Name: A slug-friendly name for the CA. * Organization (O): The organization name. * Country (C): The country code. * State or Province Name: The state or province. * Locality Name: The city or locality. * Common Name: The name of the CA. The Organization, Country, State or Province Name, Locality Name, and Common Name make up the **Distinguished Name (DN)** or **subject** of the CA. At least one of these fields must be filled out. 2.1. To create an intermediate CA, press **Create CA** again but this time specifying the **CA Type** to be **Intermediate**. Fill out the details for the intermediate CA. pki create intermediate ca 2.2. Next, press the **Install Certificate** option on the intermediate CA from step 1.1. pki install cert opt 2.3a. If you created a root CA in step 1, select **Infisical CA** for the **Parent CA Type** field. Next, set the **Parent CA** to the root CA created in step 1 and configure the intended **Valid Until** and **Path Length** fields on the intermediate CA; feel free to use the prefilled values. pki install cert Here's some guidance on each field: * Parent CA: The parent CA to which this intermediate CA will be chained. In this case, it should be the root CA created in step 1. * Valid Until: The date until which the CA is valid in the date time string format specified [here](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Date#date_time_string_format). The date must be within the validity period of the parent CA. * Path Length: The maximum number of intermediate CAs that can be chained to this CA. The path length must be less than the path length of the parent CA. Finally, press **Install** to chain the intermediate CA to the root CA; this creates a Certificate Signing Request (CSR) for the intermediate CA, creates an intermediate certificate using the root CA private key and CSR, and imports the signed certificate back to the intermediate CA. pki cas Great! You've successfully created a Private CA hierarchy with a root CA and an intermediate CA. Now check out the [Certificates section](/documentation/platform/pki/certificates/overview) to learn more about how to issue X.509 certificates using the intermediate CA. 2.3b. If you have an external root CA, select **External CA** for the **Parent CA Type** field. Next, use the provided intermediate CSR to generate a certificate from your external root CA and paste the PEM-encoded certificate back into the **Certificate Body** field; the PEM-encoded external root CA certificate should be pasted under the **Certificate Chain** field. pki ca csr Finally, press **Install** to import the certificate and certificate chain as part of the installation step for the intermediate CA Great! You've successfully created a Private CA hierarchy with an intermediate CA chained to an external root CA. Now check out the [Certificates section](/documentation/platform/pki/certificates/overview) to learn more about how to issue X.509 certificates using the intermediate CA. If you wish to use an external root CA, you can skip this step and head to step 2 to create an intermediate CA. To create a root CA, make an API request to the [Create CA](/api-reference/endpoints/certificate-authorities/create) API endpoint, specifying the `type` as `root`. ### Sample request ```bash Request theme={"dark"} curl --location --request POST 'https://app.infisical.com/api/v1/cert-manager/ca/internal' \ --header 'Authorization: Bearer ' \ --header 'Content-Type: application/json' \ --data-raw '{ "projectSlug": "", "type": "root", "commonName": "My Root CA" }' ``` ### Sample response ```bash Response theme={"dark"} { ca: { id: "", type: "root", commonName: "My Root CA", ... } } ``` By default, Infisical creates a root CA with the `RSA_2048` key algorithm, validity period of 10 years, with no restrictions on path length; you may override these defaults by specifying your own options when making the API request. 2.1. To create an intermediate CA, make an API request to the [Create CA](/api-reference/endpoints/certificate-authorities/create) API endpoint, specifying the `type` as `intermediate`. ### Sample request ```bash Request theme={"dark"} curl --location --request POST 'https://app.infisical.com/api/v1/cert-manager/ca/internal' \ --header 'Authorization: Bearer ' \ --header 'Content-Type: application/json' \ --data-raw '{ "projectSlug": "", "type": "intermediate", "commonName": "My Intermediate CA" }' ``` ### Sample response ```bash Response theme={"dark"} { ca: { id: "", type: "intermediate", commonName: "My Intermediate CA", ... } } ``` 2.2. Next, get a certificate signing request from the intermediate CA by making an API request to the [Get CSR](/api-reference/endpoints/certificate-authorities/csr) API endpoint. ### Sample request ```bash Request theme={"dark"} curl --location --request GET 'https://app.infisical.com/api/v1/cert-manager/ca/internal//csr' \ --header 'Authorization: Bearer ' \ --data-raw '' ``` ### Sample response ```bash Response theme={"dark"} { csr: "..." } ``` If using an external root CA, then use the CSR to generate a certificate for the intermediate CA using your external root CA and skip to step 2.4. 2.3. Next, create an intermediate certificate by making an API request to the [Sign Intermediate](/api-reference/endpoints/certificate-authorities/sign-intermediate) API endpoint containing the CSR from step 2.2, referencing the root CA created in step 1. ### Sample request ```bash Request theme={"dark"} curl --location --request POST 'https://app.infisical.com/api/v1/cert-manager/ca/internal//sign-intermediate' \ --header 'Content-Type: application/json' \ --data-raw '{ "csr": "", "notAfter": "2029-06-12" }' ``` ### Sample response ```bash Response theme={"dark"} { certificate: "...", certificateChain: "...", issuingCaCertificate: "...", serialNumber: "...", } ``` The `notAfter` value must be within the validity period of the root CA that is if the root CA is valid until `2029-06-12`, the intermediate CA must be valid until a date before `2029-06-12`. 2.4. Finally, import the intermediate certificate and certificate chain from step 2.3 back to the intermediate CA by making an API request to the [Import Certificate](/api-reference/endpoints/certificate-authorities/import-cert) API endpoint. If using an external root CA, then import the generated certificate and root CA certificate under certificate chain back into the intermediate CA. ### Sample request ```bash Request theme={"dark"} curl --location --request POST 'https://app.infisical.com/api/v1/cert-manager/ca/internal//import-certificate' \ --header 'Authorization: Bearer ' \ --header 'Content-Type: application/json' \ --data-raw '{ "certificate": "", "certificateChain": "" }' ``` ### Sample response ```bash Response theme={"dark"} { message: "Successfully imported certificate to CA", caId: "..." } ``` Great! You’ve successfully created a Private CA hierarchy with a root CA and an intermediate CA. Now check out the [Subscribers](/documentation/platform/pki/subscribers) page to learn more about how to issue X.509 certificates using the intermediate CA. ## Guide to CA Renewal In the following steps, we explore how to renew a CA certificate. If renewing an intermediate CA chained to an Infisical CA, then Infisical will automate the process of generating a new certificate for the intermediate CA for you. If renewing an intermediate CA chained to an external parent CA, you'll be required to generate a new certificate from the external parent CA and manually import the certificate back to the intermediate CA. Head to the CA Page of the CA you wish you renew and press **Renew CA** on the left side. pki ca renewal
    page Input a new **Valid Until** date to be used for the renewed CA certificate and press **Renew** to renew the CA. pki ca renewal. modal The new **Valid Until** date must be within the validity period of the parent CA. To renew a CA certificate, make an API request to the [Renew CA](/api-reference/endpoints/certificate-authorities/renew) API endpoint, specifying the new `notAfter` date for the CA. ### Sample request ```bash Request theme={"dark"} curl --location --request POST 'https://app.infisical.com/api/v1/cert-manager/ca/internal//renew' \ --header 'Authorization: Bearer ' \ --header 'Content-Type: application/json' \ --data-raw '{ "type": "existing", "notAfter": "2029-06-12" }' ``` ### Sample response ```bash Response theme={"dark"} { certificate: "...", certificateChain: "...", serialNumber: "..." } ``` ## FAQ Infisical supports `RSA 2048`, `RSA 4096`, `ECDSA P-256`, `ECDSA P-384` key algorithms specified at the time of creating a CA. At the moment, Infisical only supports CA renewal via same key pair. We anticipate supporting CA renewal via new key pair in the coming month. Yes. You may obtain a CSR from the Intermediate CA and use it to generate a certificate from your external CA. The certificate, along with the external CA certificate chain, can be imported back to the Intermediate CA as part of the CA installation step. --- # Source: https://infisical.com/docs/api-reference/endpoints/kms/keys/private-key.md # Source: https://infisical.com/docs/api-reference/endpoints/certificates/private-key.md > ## Documentation Index > Fetch the complete documentation index at: https://infisical.com/docs/llms.txt > Use this file to discover all available pages before exploring further. # Get Certificate Private Key > Get certificate private key ## OpenAPI ````yaml GET /api/v1/cert-manager/certificates/{id}/private-key openapi: 3.0.3 info: title: Infisical API description: List of all available APIs that can be consumed version: 0.0.1 servers: - url: https://us.infisical.com description: Production server (US) - url: https://eu.infisical.com description: Production server (EU) - url: http://localhost:8080 description: Local server security: [] paths: /api/v1/cert-manager/certificates/{id}/private-key: get: tags: - PKI Certificates description: Get certificate private key operationId: getCertificatePrivateKey parameters: - schema: type: string in: path name: id required: true description: The ID of the certificate to get. responses: '200': description: Default Response content: application/json: schema: type: string '400': description: Default Response content: application/json: schema: type: object properties: reqId: type: string statusCode: type: number enum: - 400 message: type: string error: type: string details: {} required: - reqId - statusCode - message - error additionalProperties: false '401': description: Default Response content: application/json: schema: type: object properties: reqId: type: string statusCode: type: number enum: - 401 message: type: string error: type: string required: - reqId - statusCode - message - error additionalProperties: false '403': description: Default Response content: application/json: schema: type: object properties: reqId: type: string statusCode: type: number enum: - 403 message: type: string details: {} error: type: string required: - reqId - statusCode - message - error additionalProperties: false '404': description: Default Response content: application/json: schema: type: object properties: reqId: type: string statusCode: type: number enum: - 404 message: type: string error: type: string required: - reqId - statusCode - message - error additionalProperties: false '422': description: Default Response content: application/json: schema: type: object properties: reqId: type: string statusCode: type: number enum: - 422 message: {} error: type: string required: - reqId - statusCode - error additionalProperties: false '500': description: Default Response content: application/json: schema: type: object properties: reqId: type: string statusCode: type: number enum: - 500 message: type: string error: type: string required: - reqId - statusCode - message - error additionalProperties: false ```` --- # Source: https://infisical.com/docs/self-hosting/guides/production-hardening.md > ## Documentation Index > Fetch the complete documentation index at: https://infisical.com/docs/llms.txt > Use this file to discover all available pages before exploring further. # Production Hardening > Security hardening recommendations for production Infisical deployments This document provides specific security hardening recommendations for production Infisical deployments. These recommendations follow Infisical's security model and focus on defense in depth. Choose your deployment method below and follow the recommendations for your specific setup. Start with **Universal Security Fundamentals** that apply to all deployments, then follow your deployment-specific section. ## Universal Security Fundamentals These security configurations apply to **all** Infisical deployments regardless of how you deploy. ### Cryptographic Security #### Generate Secure Keys Generate strong cryptographic keys for your deployment: ```bash theme={"dark"} # Required - Generate secure encryption key ENCRYPTION_KEY=$(openssl rand -hex 16) # Required - Generate secure auth secret AUTH_SECRET=$(openssl rand -base64 32) ``` #### Configure Token Lifetimes Minimize exposure window for compromised tokens: ```bash theme={"dark"} # JWT token configuration (adjust based on security requirements) JWT_AUTH_LIFETIME=15m # Authentication tokens JWT_REFRESH_LIFETIME=24h # Refresh tokens JWT_SERVICE_LIFETIME=1h # Service tokens ``` ### Network Security #### TLS Configuration Configure HTTPS and secure database connections: ```bash theme={"dark"} # Enable HTTPS (recommended for production) HTTPS_ENABLED=true # Secure PostgreSQL connection with SSL DB_CONNECTION_URI="postgresql://user:pass@host:5432/db?sslmode=require" # For base64-encoded SSL certificate DB_ROOT_CERT="" ``` #### Redis Security Use authentication and TLS for Redis: ```bash theme={"dark"} # Redis with TLS (if supported by your Redis deployment) REDIS_URL="rediss://user:password@redis:6380" # Redis Sentinel configuration for high availability REDIS_SENTINEL_HOSTS="192.168.65.254:26379,192.168.65.254:26380" REDIS_SENTINEL_MASTER_NAME="mymaster" REDIS_SENTINEL_ENABLE_TLS=true REDIS_SENTINEL_USERNAME="sentinel_user" REDIS_SENTINEL_PASSWORD="sentinel_password" ``` #### Network Access Controls Configure network restrictions and firewall rules: ```bash theme={"dark"} # Limit CORS to specific domains CORS_ALLOWED_ORIGINS=["https://your-app.example.com"] # Prevent connections to internal/private IP addresses # This blocks access to internal services like metadata endpoints, # internal APIs, databases, and other sensitive infrastructure ALLOW_INTERNAL_IP_CONNECTIONS=false ``` **Implement network firewalls**. Restrict network access to only necessary services: * **Required ports**: Infisical API (8080) and HTTPS (if applicable) * **Database access**: Restrict PostgreSQL and Redis to authorized sources only * **Principle**: Default deny incoming, allow only required traffic * **Implementation**: See your deployment-specific section below for exact configuration ### Application Security #### Site Configuration Set proper site URL for your Infisical instance: ```bash theme={"dark"} # Required - Must be absolute URL with protocol SITE_URL="https://app.infisical.com" ``` #### SMTP Security Use TLS for email communications: ```bash theme={"dark"} # SMTP with TLS SMTP_HOST="smtp.example.com" SMTP_PORT="587" SMTP_USERNAME="your-smtp-user" SMTP_PASSWORD="your-smtp-password" SMTP_REQUIRE_TLS=true SMTP_IGNORE_TLS=false SMTP_FROM_ADDRESS="noreply@example.com" SMTP_FROM_NAME="Infisical" ``` #### Privacy Configuration Control telemetry and data collection: ```bash theme={"dark"} # Optional - Disable telemetry (enabled by default) TELEMETRY_ENABLED=false ``` ### Database Security #### High Availability Configuration Configure database read replicas for high availability PostgreSQL setups: ```bash theme={"dark"} # Read replica configuration (JSON format) DB_READ_REPLICAS='[{"DB_CONNECTION_URI":"postgresql://user:pass@replica:5432/db?sslmode=require"}]' ``` ### Operational Security #### User Access Management **Establish user off-boarding procedures**. Remove access promptly when users leave: 1. Remove user from organization 2. Revoke active service tokens 3. Remove from external identity providers 4. Audit access logs for the user's activity 5. Rotate any shared secrets the user had access to #### Maintenance and Updates **Keep frequent upgrade cadence**. Regularly update to the latest Infisical version for your deployment method. ## Deployment-Specific Hardening ### Docker Deployment These recommendations are specific to Docker deployments of Infisical. #### Container Security **Use read-only root filesystems**. Prevent runtime modifications while allowing necessary temporary access: ```bash theme={"dark"} # Run with read-only filesystem but allow /tmp access docker run --read-only \ --tmpfs /tmp:rw,exec,size=1G \ infisical/infisical:latest ``` **Note**: Infisical requires temporary directory access for: * Secret scanning operations * SSH certificate generation and validation The `--tmpfs` mounts provide secure, isolated temporary storage that is: * Automatically cleaned up on container restart * Limited in size to prevent disk exhaustion * Isolated from the host system * Wiped on container removal **Drop unnecessary capabilities**. Remove all Linux capabilities: ```bash theme={"dark"} # Drop all capabilities docker run --cap-drop=ALL infisical/infisical:latest ``` **Use specific image tags**. Never use `latest` tags in production: ```bash theme={"dark"} # Use specific version tags docker run infisical/infisical:v0.93.1-postgres ``` #### Resource Management **Set resource limits**. Prevent resource exhaustion attacks: ```bash theme={"dark"} # Set memory and CPU limits docker run --memory=1g --cpus=0.5 infisical/infisical:latest ``` #### Health Monitoring **Configure health checks**. Set up Docker health checks: ```dockerfile theme={"dark"} # In Dockerfile or docker-compose.yml HEALTHCHECK --interval=30s --timeout=3s --start-period=10s --retries=3 \ CMD curl -f http://localhost:8080/api/status || exit 1 ``` #### Network Security **Host firewall configuration**. Configure host-level firewall for Docker deployments: ```bash theme={"dark"} # Docker manages its own iptables rules, but configure host firewall sudo ufw default deny incoming sudo ufw default allow outgoing # Allow Docker-mapped ports (adjust based on your port mapping) sudo ufw allow 8080/tcp # If mapping container 8080 to host 8080 sudo ufw allow 443/tcp # If terminating HTTPS at host level # Enable firewall sudo ufw --force enable # Verify Docker iptables integration sudo iptables -L DOCKER ``` #### Maintenance **Regular updates**. Monitor [Docker Hub](https://hub.docker.com/r/infisical/infisical/tags) for new releases and update your image tags regularly. ### Kubernetes Deployment These recommendations are specific to Kubernetes deployments of Infisical. #### Pod Security **Use Pod Security Standards**. Apply restricted security profile: ```yaml theme={"dark"} # Namespace-level Pod Security Standards apiVersion: v1 kind: Namespace metadata: name: infisical labels: pod-security.kubernetes.io/enforce: restricted pod-security.kubernetes.io/audit: restricted pod-security.kubernetes.io/warn: restricted ``` **Configure security context**. Set comprehensive security context: ```yaml theme={"dark"} # Deployment security context apiVersion: apps/v1 kind: Deployment metadata: name: infisical spec: template: spec: securityContext: runAsNonRoot: true runAsUser: 1001 fsGroup: 1001 containers: - name: infisical image: infisical/infisical:v0.93.1-postgres securityContext: readOnlyRootFilesystem: true allowPrivilegeEscalation: false runAsNonRoot: true runAsUser: 1001 capabilities: drop: - ALL resources: limits: memory: 1000Mi cpu: 500m requests: cpu: 350m memory: 512Mi ``` #### Network Security **Configure network policies**. Restrict pod-to-pod communication: ```yaml theme={"dark"} # Example Kubernetes NetworkPolicy apiVersion: networking.k8s.io/v1 kind: NetworkPolicy metadata: name: infisical-netpol namespace: infisical spec: podSelector: matchLabels: app: infisical policyTypes: - Ingress - Egress ingress: - from: - namespaceSelector: matchLabels: name: ingress-system ports: - protocol: TCP port: 8080 egress: - to: - podSelector: matchLabels: app: postgres ports: - protocol: TCP port: 5432 - to: - podSelector: matchLabels: app: redis ports: - protocol: TCP port: 6379 ``` **Infrastructure firewall considerations**. In addition to the universal host firewalls, implement infrastructure-level security: For cloud deployments (AWS Security Groups, Azure NSGs, or GCP Firewall Rules): * Allow ingress from load balancer to NodePort/ClusterIP service * Allow egress to managed databases * Block all other traffic For on-premises deployments, ensure node-level firewalls allow: * Ingress traffic from ingress controllers * Egress traffic to external services (databases, SMTP) #### Access Control **Use dedicated service accounts**. Create service accounts with minimal permissions: ```yaml theme={"dark"} # Service account configuration apiVersion: v1 kind: ServiceAccount metadata: name: infisical namespace: infisical automountServiceAccountToken: false --- apiVersion: apps/v1 kind: Deployment metadata: name: infisical spec: template: spec: serviceAccountName: infisical ``` #### Ingress Security **Configure ingress with TLS**. Set up secure ingress: ```yaml theme={"dark"} # Secure ingress configuration apiVersion: networking.k8s.io/v1 kind: Ingress metadata: name: infisical-ingress namespace: infisical annotations: cert-manager.io/cluster-issuer: "letsencrypt-prod" nginx.ingress.kubernetes.io/force-ssl-redirect: "true" spec: ingressClassName: nginx tls: - secretName: infisical-tls hosts: - app.example.com rules: - host: app.example.com http: paths: - path: / pathType: Prefix backend: service: name: infisical port: number: 8080 ``` #### Secret Management **Use Kubernetes secrets**. Store sensitive configuration securely: ```yaml theme={"dark"} # Kubernetes secret for environment variables apiVersion: v1 kind: Secret metadata: name: infisical-secrets namespace: infisical type: Opaque stringData: AUTH_SECRET: "" ENCRYPTION_KEY: "" DB_CONNECTION_URI: "" REDIS_URL: "" SITE_URL: "" ``` **Note:** Kubernetes secrets are only base64-encoded by default and are not encrypted at rest unless you explicitly enable etcd encryption. For production environments, you should: * Enable [etcd encryption at rest](https://kubernetes.io/docs/tasks/administer-cluster/encrypt-data/) to protect secrets stored in the cluster * Limit access to etcd and Kubernetes API to only trusted administrators #### Health Monitoring **Set up health checks**. Configure readiness and liveness probes: ```yaml theme={"dark"} # Health check configuration containers: - name: infisical readinessProbe: httpGet: path: /api/status port: 8080 initialDelaySeconds: 10 periodSeconds: 5 livenessProbe: httpGet: path: /api/status port: 8080 initialDelaySeconds: 30 periodSeconds: 10 ``` #### Infrastructure Considerations **Use managed databases (if possible)**. For production deployments, consider using managed PostgreSQL and Redis services instead of in-cluster instances when feasible, as they typically provide better security, backup, and maintenance capabilities. #### Maintenance **Regular updates**. Monitor [Docker Hub](https://hub.docker.com/r/infisical/infisical/tags) for new releases and update your deployment manifests with new image tags regularly. ### Linux Binary Deployment These recommendations are specific to Linux binary deployments of Infisical. #### System User Management **Create dedicated user account**. Run Infisical under a dedicated service account: ```bash theme={"dark"} # Create dedicated user sudo useradd --system --shell /bin/false --home-dir /opt/infisical infisical # Create application directory sudo mkdir -p /opt/infisical sudo chown infisical:infisical /opt/infisical ``` #### Service Configuration **Configure systemd service**. Create a secure systemd service: ```ini theme={"dark"} # /etc/systemd/system/infisical.service [Unit] Description=Infisical Secret Management After=network.target [Service] Type=simple # IMPORTANT: Change from default 'root' user to dedicated service account User=infisical Group=infisical WorkingDirectory=/opt/infisical ExecStart=/opt/infisical/infisical-linux-amd64 Restart=always RestartSec=10 # Security settings NoNewPrivileges=true ProtectSystem=strict ProtectHome=true ReadWritePaths=/opt/infisical PrivateTmp=true ProtectKernelTunables=true ProtectKernelModules=true ProtectControlGroups=true RestrictSUIDSGID=true LimitCORE=0 MemorySwapMax=0 # Environment file EnvironmentFile=/etc/infisical/environment [Install] WantedBy=multi-user.target ``` #### Configuration Security **Secure environment configuration**. Store environment variables securely: ```bash theme={"dark"} # Create secure config directory sudo mkdir -p /etc/infisical sudo chmod 750 /etc/infisical sudo chown root:infisical /etc/infisical # Create environment file sudo touch /etc/infisical/environment sudo chmod 640 /etc/infisical/environment sudo chown root:infisical /etc/infisical/environment ``` #### System Security **Disable memory swapping**. Prevent sensitive data from being written to disk: ```bash theme={"dark"} # Disable swap immediately sudo swapoff -a # Disable swap permanently (comment out swap entries) sudo sed -i '/swap/d' /etc/fstab ``` **Disable core dumps**. Prevent potential exposure of encryption keys: ```bash theme={"dark"} # Set system-wide core dump limits echo "* hard core 0" | sudo tee -a /etc/security/limits.conf # Disable core dumps for current session ulimit -c 0 ``` #### File Permissions **Secure file permissions**. Set proper permissions on application files: ```bash theme={"dark"} # Set binary permissions sudo chmod 755 /opt/infisical/infisical-linux-amd64 sudo chown infisical:infisical /opt/infisical/infisical-linux-amd64 # Set config file permissions sudo chmod 640 /etc/infisical/environment sudo chown root:infisical /etc/infisical/environment ``` #### Network Security **Host firewall configuration**. Configure comprehensive firewall for Linux binary deployments: ```bash theme={"dark"} # Configure UFW firewall sudo ufw default deny incoming sudo ufw default allow outgoing # Allow Infisical API access sudo ufw allow 8080/tcp # Allow HTTPS (if terminating TLS at Infisical) sudo ufw allow 443/tcp # If running PostgreSQL locally, restrict to localhost sudo ufw allow from 127.0.0.1 to any port 5432 # If running Redis locally, restrict to localhost sudo ufw allow from 127.0.0.1 to any port 6379 # Enable firewall sudo ufw --force enable ``` #### System Maintenance **Synchronize system clocks**. Ensure accurate time for JWT tokens and audit logs: ```bash theme={"dark"} # Install and configure NTP sudo apt-get update sudo apt-get install -y ntp sudo systemctl enable ntp sudo systemctl start ntp # Verify time synchronization timedatectl status ``` **Regular updates**. Monitor [Cloudsmith releases](https://cloudsmith.io/~infisical/repos/infisical-core/packages) for new binary versions and update your installation regularly. ## Enterprise Security Features ### Hardware Security Module (HSM) Integration For the highest level of encryption security, integrate with Hardware Security Modules: HSM integration provides hardware-protected encryption keys stored on tamper-proof devices, offering superior security for encryption operations: * **Supported HSM Providers**: Thales Luna Cloud HSM, AWS CloudHSM, Fortanix HSM * **Root Key Protection**: HSM encrypts Infisical's root encryption keys using hardware-protected keys * **Enterprise Requirements**: Ideal for government, financial, and healthcare organizations ```bash theme={"dark"} # HSM Environment Variables (example for production) HSM_LIB_PATH="/path/to/hsm/library.so" HSM_PIN="your-hsm-pin" HSM_SLOT="0" HSM_KEY_LABEL="infisical-root-key" ``` For complete HSM setup instructions, see the [HSM Integration Guide](/documentation/platform/kms/hsm-integration). ### External Key Management Service (KMS) Integration Leverage cloud-native KMS providers for enhanced security and compliance: Infisical can integrate with external KMS providers to encrypt project secrets, providing enterprise-grade key management: * **Supported Providers**: AWS KMS, Google Cloud KMS, Azure Key Vault (coming soon) * **Workspace Key Protection**: Each project's encryption key is protected by your external KMS * **Envelope Encryption**: Infisical uses your cloud KMS to encrypt/decrypt project workspace keys, which in turn encrypt the actual secret data * **Compliance**: Leverage your cloud provider's compliance certifications (FedRAMP, SOC2, ISO 27001) #### Benefits for Production Deployments * **Separation of Concerns**: Keys managed in your cloud infrastructure, separate from Infisical * **Regulatory Compliance**: Use your existing compliance-certified KMS infrastructure * **Audit Integration**: KMS operations logged in your cloud provider's audit trails * **Disaster Recovery**: Keys backed by your cloud provider's HA and backup systems * **Access Controls**: Leverage your cloud IAM for KMS access management #### Configuration Resources For external KMS configuration, see: * [AWS KMS Integration](/documentation/platform/kms-configuration/aws-kms) * [GCP KMS Integration](/documentation/platform/kms-configuration/gcp-kms) * [External KMS Overview](/documentation/platform/kms-configuration/overview) ## Advanced Security Configurations ### Backup Security **Configure backup encryption**. Encrypt PostgreSQL backups: ```bash theme={"dark"} # PostgreSQL backup with encryption pg_dump $DB_CONNECTION_URI | gpg --cipher-algo AES256 --compress-algo 1 --symmetric --output backup.sql.gpg ``` ### Monitoring and Logging **Implement log monitoring**. Set up centralized logging for security analysis and audit trails. Configure your SIEM or logging platform to monitor Infisical operations. ### Security Updates **Regular security updates**. Monitor the [Infisical repository](https://github.com/Infisical/infisical) for security updates and apply them promptly. ## Compliance and Monitoring ### Enterprise Compliance Requirements For enterprise deployments requiring compliance certifications: * Implement audit log retention policies * Set up security event monitoring and alerting * Configure automated vulnerability scanning * Establish incident response procedures * Document security controls for compliance audits ### Standards Compliance #### FIPS 140-3 Compliance Infisical is compliant with FIPS 140-3, meeting U.S. and Canadian government cryptographic standards through validated cryptographic modules. This certification is designed for organizations that require government-approved encryption implementations. To deploy a FIPS-compliant instance, use the [infisical/infisical-fips](https://hub.docker.com/r/infisical/infisical-fips) Docker image, available to Enterprise customers. Our FIPS 140-3 attestation letter is available in the [Infisical Trust Center](https://trust.infisical.com/). #### SOC 2 Compliance Infisical is SOC 2 compliant, demonstrating adherence to rigorous security, availability, and confidentiality standards established by the American Institute of CPAs (AICPA). This certification validates our security controls and operational practices for organizations requiring third-party audited security assurance. Our SOC 2 report is available in the [Infisical Trust Center](https://trust.infisical.com/). #### HIPAA Compliance Infisical is HIPAA compliant, meeting the security and privacy requirements of the Health Insurance Portability and Accountability Act. This compliance framework ensures appropriate safeguards for protected health information (PHI) for healthcare organizations and their business associates. Our HIPAA certification is available in the [Infisical Trust Center](https://trust.infisical.com/). --- # Source: https://infisical.com/docs/documentation/platform/pki/certificates/profiles.md > ## Documentation Index > Fetch the complete documentation index at: https://infisical.com/docs/llms.txt > Use this file to discover all available pages before exploring further. # Certificate Profiles ## Concept A certificate profile is a configuration set specifying how leaf certificates should be issued for a group of end-entities including the [issuing CA](/documentation/platform/pki/ca/overview), a [certificate policy](/documentation/platform/pki/certificates/policies), and the [enrollment method](/documentation/platform/pki/enrollment-methods/overview) (e.g. ACME, EST, API, etc.) used to enroll certificates. You typically request certificates against a certificate profile through its associated enrollment method. Each method defines its own interaction flow which you can read more about in its respective documentation. ## Guide to Creating a Certificate Profile To create a certificate profile, head to your Certificate Management Project > Certificates > Certificate Profiles and press **Create Profile**. pki certificate profile pki certificate profile modal Here's some guidance on each field: * Name: A slug-friendly name for the profile such as `web-servers`. * Description: An optional description for the profile. * Issuer Type: The type of issuer that should be used to issue certificates for the profile; this can be either `Certificate Authority` or `Self-Signed`. If `Self-Signed` is selected, then the profile will only support the API enrollment method and be used to issue self-signed certificates over REST API. * Issuing CA: The [issuing CA](/documentation/platform/pki/ca/overview) that should be used to issue certificates for the profile when the **Issuer Type** is set to `Certificate Authority`. * Certificate Policy: The [certificate policy](/documentation/platform/pki/certificates/policies) that should be used to validate certificate requests for the profile. * Enrollment Method: The enrollment method that should be used to enroll certificates for the profile such as ACME, EST, API, etc. * Default Certificate TTL: An optional fallback validity period used when a TTL is not explicitly specified in the certificate request. The default TTL must not exceed the maximum validity defined in the associated [certificate policy](/documentation/platform/pki/certificates/policies). Depending on which enrollment method you choose, you may be presented with additional enrollment-specific configuration fields. --- # Source: https://infisical.com/docs/documentation/platform/access-controls/project-access-requests.md > ## Documentation Index > Fetch the complete documentation index at: https://infisical.com/docs/llms.txt > Use this file to discover all available pages before exploring further. # Project Access Requests > Learn how to request access to projects in Infisical. The Project Access Request feature allows users to view all projects within organization, including those they don't currently have access to. Users can request access to these projects by submitting a request that automatically notifies project administrators via email, along with any comments provided by the user. # Viewing Available Projects From the Infisical dashboard, users can view all projects within the organization: 1. Navigate to the main dashboard after logging in 2. The overview page for each product displays two tabs: * **My Projects**: Projects you currently have access to * **All Projects**: Complete list of projects in the organization all-project-view # Requesting Access to a Project To request access to a project you don't currently have access for: 1. Click the **Request Access** button next to the project name all-project-view 2. Add a comment explaining why you need access all-project-view 3. Click **Submit Request** Project administrators will receive email notification with details regarding the access request. --- # Source: https://infisical.com/docs/cli/project-config.md > ## Documentation Index > Fetch the complete documentation index at: https://infisical.com/docs/llms.txt > Use this file to discover all available pages before exploring further. # Project config file > Project config file & customization options To link your local project on your machine with an Infisical project, we suggest using the infisical init CLI command. This will generate a `.infisical.json` file in the root directory of your project. The `.infisical.json` file specifies various parameters, such as the Infisical project to retrieve secrets from, along with other configuration options. Furthermore, you can define additional properties in the file to further tailor your local development experience. ## Set default environment If you need to change environments while using the CLI, you can do so by including the `--env` flag in your command. However, this can be inconvenient if you typically work in just one environment. To simplify the process, you can establish a default environment, which will be used for every command unless you specify otherwise. ```json .infisical.json theme={"dark"} { "workspaceId": "63ee5410a45f7a1ed39ba118", "defaultEnvironment": "test", "gitBranchToEnvironmentMapping": null } ``` ### How it works If both `defaultEnvironment` and `gitBranchToEnvironmentMapping` are configured, `gitBranchToEnvironmentMapping` will take precedence over `defaultEnvironment`. However, if `gitBranchToEnvironmentMapping` is not set and `defaultEnvironment` is, then the `defaultEnvironment` will be used to execute your Infisical CLI commands. If you wish to override the `defaultEnvironment`, you can do so by using the `--env` flag explicitly. ## Set Infisical environment based on GitHub branch When fetching your secrets from Infisical, you can switch between environments by using the `--env` flag. However, in certain cases, you may prefer the environment to be automatically mapped based on the current GitHub branch you are working on. To achieve this, simply add the `gitBranchToEnvironmentMapping` property to your configuration file, as shown below. ```json .infisical.json theme={"dark"} { "workspaceId": "63ee5410a45f7a1ed39ba118", "gitBranchToEnvironmentMapping": { "branchName": "dev", "anotherBranchName": "staging" } } ``` ### How it works After configuring this property, every time you use the CLI with the specified configuration file, it will automatically verify if there is a corresponding environment mapping for the current Github branch you are on. If it exists, the CLI will use that environment to retrieve secrets. You can override this behavior by explicitly using the `--env` flag while interacting with the CLI. --- # Source: https://infisical.com/docs/api-reference/endpoints/events/project-events.md > ## Documentation Index > Fetch the complete documentation index at: https://infisical.com/docs/llms.txt > Use this file to discover all available pages before exploring further. # Project Events > Subscribe to project events ## OpenAPI ````yaml POST /api/v1/events/subscribe/project-events openapi: 3.0.3 info: title: Infisical API description: List of all available APIs that can be consumed version: 0.0.1 servers: - url: https://us.infisical.com description: Production server (US) - url: https://eu.infisical.com description: Production server (EU) - url: http://localhost:8080 description: Local server security: [] paths: /api/v1/events/subscribe/project-events: post: tags: - Event Subscriptions description: Subscribe to project events operationId: subscribeToProjectEvents requestBody: content: application/json: schema: type: object properties: projectId: type: string description: The ID of the project to subscribe to events for. register: type: array items: type: object properties: event: type: string enum: - secret:create - secret:update - secret:delete - secret:import-mutation conditions: type: object properties: secretPath: type: string default: / environmentSlug: type: string required: - environmentSlug additionalProperties: false required: - event additionalProperties: false minItems: 1 maxItems: 10 required: - projectId - register additionalProperties: false required: true responses: '200': description: Default Response ```` --- # Source: https://infisical.com/docs/internals/permissions/project-permissions.md > ## Documentation Index > Fetch the complete documentation index at: https://infisical.com/docs/llms.txt > Use this file to discover all available pages before exploring further. # Project Permissions > Comprehensive guide to Infisical's project-level permissions ## Overview Infisical's project permissions system follows a role-based access control (RBAC) model built on a subject-action-object framework. At the project level, these permissions determine what actions users/machines can perform on various resources within a specific project. Each permission consists of: * **Subject**: The resource the permission applies to (e.g., secrets, members, settings) * **Action**: The operation that can be performed (e.g., read, create, edit, delete) Some project-level resources—specifically `secrets`, `secret-folders`, `secret-imports`, `dynamic-secrets`, `secret-syncs`, and `secret-rotation`, support conditional permissions and permission inversion for more granular access control. Conditions allow you to specify criteria (like environment, secret path, tags, or app connection ID) that must be met for the permission to apply. ## Available Project Permissions Below is a comprehensive list of all available project-level subjects and their supported actions. ### Core Platform & Access Control #### Subject: `role` | Action | Description | | -------- | ------------------------------------------------- | | `read` | View project roles and their assigned permissions | | `create` | Create new project roles | | `edit` | Modify existing project roles | | `delete` | Remove project roles | #### Subject: `member` | Action | Description | | ------------------ | ------------------------------------------- | | `read` | View project members | | `create` | Add new members to the project | | `edit` | Modify member details | | `delete` | Remove members from the project | | `grant-privileges` | Change permission levels of project members | #### Subject: `groups` | Action | Description | | ------------------ | ------------------------------------------ | | `read` | View project groups | | `create` | Create new groups within the project | | `edit` | Modify existing groups | | `delete` | Remove groups from the project | | `grant-privileges` | Change permission levels of project groups | #### Subject: `identity` | Action | Description | | ------------------ | ---------------------------------------------- | | `read` | View project identities | | `create` | Add new identities to project | | `edit` | Modify project identities | | `delete` | Remove identities from project | | `grant-privileges` | Change permission levels of project identities | #### Subject: `settings` | Action | Description | | -------- | -------------------------------------- | | `read` | View project settings | | `create` | Add new project configuration settings | | `edit` | Modify project settings | | `delete` | Remove project settings | #### Subject: `environments` | Action | Description | | -------- | ------------------------------------ | | `read` | View project environments | | `create` | Add new environments to the project | | `edit` | Modify existing environments | | `delete` | Remove environments from the project | #### Subject: `tags` | Action | Description | | -------- | ---------------------------------------- | | `read` | View project tags | | `create` | Create new tags for organizing resources | | `edit` | Modify existing tags | | `delete` | Remove tags from the project | #### Subject: `project` | Action | Description | | -------- | ------------------------- | | `edit` | Modify workspace settings | | `delete` | Delete the workspace | #### Subject: `ip-allowlist` | Action | Description | | -------- | -------------------------------------------- | | `read` | View IP allowlists | | `create` | Add new IP addresses or ranges to allowlists | | `edit` | Modify existing IP allowlist entries | | `delete` | Remove IP addresses from allowlists | #### Subject: `audit-logs` | Action | Description | | ------ | ------------------------------------------------------- | | `read` | View audit logs of actions performed within the project | #### Subject: `integrations` | Action | Description | | -------- | -------------------------------- | | `read` | View configured integrations | | `create` | Add new third-party integrations | | `edit` | Modify integration settings | | `delete` | Remove integrations | #### Subject: `webhooks` | Action | Description | | -------- | ------------------------------------ | | `read` | View webhook configurations | | `create` | Add new webhooks | | `edit` | Modify webhook endpoints or triggers | | `delete` | Remove webhooks | #### Subject: `service-tokens` | Action | Description | | -------- | ---------------------------------------- | | `read` | View service tokens | | `create` | Create new service tokens for API access | | `edit` | Modify token properties | | `delete` | Revoke or remove service tokens | #### Subject: `app-connections` Supports conditions and permission inversion | Action | Description | | ------------------------- | ---------------------------------- | | `read-app-connections` | View app connection configurations | | `create-app-connections` | Create new app connections | | `edit-app-connections` | Modify existing app connections | | `delete-app-connections` | Remove app connections | | `connect-app-connections` | Use app connections | ### Secrets Management #### Subject: `secrets` Supports conditions and permission inversion | Action | Description | Notes | | ---------------- | --------------------------------------------------------------- | ---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | | `read` | View secrets and their values | This action is the equivalent of granting both `describeSecret` and `readValue`. The `read` action is considered **legacy**. You should use the `describeSecret` and/or `readValue` actions instead. | | `describeSecret` | View secret details such as key, path, metadata, tags, and more | If you are using the API, you can pass `viewSecretValue: false` to the API call to retrieve secrets without their values. | | `readValue` | View the value of a secret. | In order to read secret values, the `describeSecret` action must also be granted. | | `create` | Add new secrets to the project | | | `edit` | Modify existing secret values | | | `delete` | Remove secrets from the project | | #### Subject: `secret-folders` Supports conditions and permission inversion | Action | Description | | -------- | ------------------------ | | `read` | View secret folders | | `create` | Create new folders | | `edit` | Modify folder properties | | `delete` | Remove secret folders | #### Subject: `secret-imports` Supports conditions and permission inversion | Action | Description | | -------- | --------------------- | | `read` | View secret imports | | `create` | Create secret imports | | `edit` | Modify secret imports | | `delete` | Remove secret imports | #### Subject: `secret-event-subscriptions` | Action | Description | | ------------------------------------- | ------------------------------------------------------------- | | `subscribe-to-creation-events` | Subscribe to events when secrets are created | | `subscribe-to-update-events` | Subscribe to events when secrets are updated | | `subscribe-to-deletion-events` | Subscribe to events when secrets are deleted | | `subscribe-to-import-mutation-events` | Subscribe to events when secrets are modified through imports | #### Subject: `secret-rollback` | Action | Description | | -------- | ---------------------------------- | | `read` | View secret versions and snapshots | | `create` | Roll back secrets to snapshots | #### Subject: `commits` | Action | Description | | ------------------ | --------------------------------------------------------------- | | `read` | View commits and changes across folders | | `perform-rollback` | Roll back commits changes and restore folders to previous state | #### Subject: `secret-approval` | Action | Description | | --------------------- | ----------------------------------------------------------------------------------- | | `read` | View approval policies and requests | | `create` | Create new approval policies | | `edit` | Modify approval policies | | `delete` | Remove approval policies | | `allow-change-bypass` | Allow request creators to merge changes without approval in break-glass situations | | `allow-access-bypass` | Allow request creators to access secrets without approval in break-glass situations | #### Subject: `secret-rotation` Supports conditions and permission inversion | Action | Description | | ---------------------------- | ---------------------------------------------- | | `read` | View secret rotation configurations | | `read-generated-credentials` | View the generated credentials of a rotation | | `create` | Set up secret rotation configurations | | `edit` | Modify secret rotation configurations | | `rotate-secrets` | Rotate the generated credentials of a rotation | | `delete` | Remove secret rotation configurations | **Condition Properties:** * `environment` – Restrict by environment slug * `secretPath` – Restrict by secret path * `connectionId` – Restrict by app connection ID (e.g. to allow or deny access to rotations tied to a specific org-level app connection) #### Subject: `secret-syncs` Supports conditions and permission inversion. | Action | Description | | ---------------- | -------------------------------------------------- | | `read` | View secret synchronization configurations | | `create` | Create new sync configurations | | `edit` | Modify existing sync settings | | `delete` | Remove sync configurations | | `sync-secrets` | Execute synchronization of secrets between systems | | `import-secrets` | Import secrets from sync sources | | `remove-secrets` | Remove secrets from sync destinations | **Condition Properties:** * `environment` – Restrict by environment slug * `secretPath` – Restrict by secret path * `connectionId` – Restrict by app connection ID (e.g. to allow or deny access to syncs tied to a specific org-level app connection) #### Subject: `dynamic-secrets` Supports conditions and permission inversion | Action | Description | | ------------------------ | ---------------------------------- | | `read-root-credential` | View dynamic secret configurations | | `create-root-credential` | Create dynamic secrets | | `edit-root-credential` | Edit dynamic secrets | | `delete-root-credential` | Remove dynamic secrets | | `lease` | Create dynamic secret leases | ### Key Management Service (KMS) #### Subject: `kms` | Action | Description | | ------ | --------------------------- | | `edit` | Modify project KMS settings | #### Subject: `cmek` | Action | Description | | -------------------- | -------------------------------------------------------------------------- | | `read` | View Customer-Managed Encryption Keys | | `create` | Add new encryption keys | | `edit` | Modify key properties | | `delete` | Remove encryption keys | | `encrypt` | Use keys for encryption operations | | `decrypt` | Use keys for decryption operations | | `sign` | Use keys for signing operations | | `verify` | Use keys for signature verification operations | | `export-private-key` | Export key material (private key for asymmetric, secret key for symmetric) | ### Public Key Infrastructure (PKI) #### Subject: `certificate-authorities` | Action | Description | | -------- | ---------------------------------- | | `read` | View certificate authorities | | `create` | Create new certificate authorities | | `edit` | Modify CA configurations | | `delete` | Remove certificate authorities | #### Subject: `certificates` | Action | Description | | ------------------ | ----------------------------- | | `read` | View certificates | | `read-private-key` | Read certificate private key | | `create` | Issue new certificates | | `delete` | Revoke or remove certificates | #### Subject: `certificate-profiles` | Action | Description | | ------------ | ------------------------------- | | `read` | View certificate profiles | | `create` | Create new certificate profiles | | `edit` | Modify profile configurations | | `delete` | Remove certificate profiles | | `issue-cert` | Issue new certificates | #### Subject: `certificate-policies` | Action | Description | | -------- | ------------------------------- | | `read` | View certificate policies | | `create` | Create new certificate policies | | `edit` | Modify policy configurations | | `delete` | Remove certificate policies | #### Subject: `pki-alerts` | Action | Description | | -------- | ------------------------------------------------------------ | | `read` | View PKI alert configurations | | `create` | Create new alerts for certificate expiry or other PKI events | | `edit` | Modify alert settings | | `delete` | Remove PKI alerts | #### Subject: `pki-collections` | Action | Description | | -------- | --------------------------------------------------- | | `read` | View PKI resource collections | | `create` | Create new collections for organizing PKI resources | | `edit` | Modify collection properties | | `delete` | Remove PKI collections | ### Secret Scanning #### Subject: `secret-scanning-data-sources` | Action | Description | | ---------------------------- | -------------------------------- | | `read-data-sources` | View Data Sources | | `create-data-sources` | Create new Data Sources | | `edit-data-sources` | Modify Data Sources | | `delete-data-sources` | Remove Data Sources | | `read-data-source-resources` | View Data Source Resources | | `read-data-source-scans` | View Data Source Scans | | `trigger-data-source-scans` | Trigger Data Source Secret Scans | #### Subject: `secret-scanning-findings` | Action | Description | | ----------------- | ------------------------------- | | `read-findings` | View Secret Scanning Findings | | `update-findings` | Update Secret Scanning Findings | #### Subject: `secret-scanning-configs` | Action | Description | | ---------------- | -------------------------------------------- | | `read-configs` | View Secret Scanning Project Configuration | | `update-configs` | Update Secret Scanning Project Configuration | ### Agent Sentinel #### Subject: `mcp-endpoints` Supports conditions and permission inversion. | Action | Description | | --------- | ----------------------------------- | | `read` | View MCP endpoints | | `create` | Create new MCP endpoints | | `edit` | Modify MCP endpoint configurations | | `delete` | Remove MCP endpoints | | `connect` | Connect AI clients to MCP endpoints | **Condition Properties:** * `name`: Control access based on endpoint name --- # Source: https://infisical.com/docs/documentation/platform/project-templates.md > ## Documentation Index > Fetch the complete documentation index at: https://infisical.com/docs/llms.txt > Use this file to discover all available pages before exploring further. # Project Templates > Learn how to manage and apply project templates ## Concept Project Templates streamline your ability to set up projects by providing customizable templates to configure projects quickly with a predefined set of environments and roles. Project Templates 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 [team@infisical.com](mailto:team@infisical.com) to purchase an enterprise license to use it. ## Workflow The typical workflow for using Project Templates consists of the following steps: 1. Creating a project template: As part of this step, you will configure a set of environments and roles to be created when applying this template to a project. 2. Using a project template: When creating new projects, optionally specify a project template to provision the project with the configured roles and environments. Note that this workflow can be executed via the Infisical UI or through the API. ## Guide to Creating a Project Template In the following steps, we'll explore how to set up a project template. Navigate to the **Project Templates** tab on the Feature Settings page for the project type you want to create a template for and tap on the **Add Template** button. project template add button Specify your template details. Here's some guidance on each field: * Name: A slug-friendly name for the template. * Description: An optional description of the intended usage of this template. project template create modal Once your template is created, you'll be directed to the configuration section. project template edit form Customize the environments and roles to your needs. project template customized Be sure to save your environment and role changes. To create a project template, make an API request to the [Create Project Template](/api-reference/endpoints/project-templates/create) API endpoint. ### Sample request ```bash Request theme={"dark"} curl --request POST \ --url https://app.infisical.com/api/v1/project-templates \ --header 'Content-Type: application/json' \ --data '{ "name": "my-project-template", "type": "secret-manager", "description": "...", "environments": "[...]", "roles": "[...]", }' ``` ### Sample response ```bash Response theme={"dark"} { "projectTemplate": { "id": "", "name": "my-project-template", "description": "...", "environments": "[...]", "roles": "[...]", "orgId": "", "createdAt": "2023-11-07T05:31:56Z", "updatedAt": "2023-11-07T05:31:56Z", } } ``` ## Guide to Using a Project Template In the following steps, we'll explore how to use a project template when creating a project. When creating a new project, select the desired template from the dropdown menu in the create project modal. kms key options Your project will be provisioned with the configured template roles and environments. To use a project template, make an API request to the [Create Project](/api-reference/endpoints/projects/create-project) API endpoint with the specified template name included. ### Sample request ```bash Request theme={"dark"} curl --request POST \ --url https://app.infisical.com/api/v1/projects \ --header 'Authorization: Bearer ' \ --header 'Content-Type: application/json' \ --data '{ "projectName": "My Project", "template": "", // defaults to "default" }' ``` ### Sample response ```bash Response theme={"dark"} { "project": { "id": "", "environments": "[...]", // configured environments ... } } ``` Note that configured roles are not included in the project response. ## FAQ No. Project templates only apply at the time of project creation. --- # Source: https://infisical.com/docs/documentation/platform/secrets-mgmt/project.md # Source: https://infisical.com/docs/documentation/platform/project.md > ## Documentation Index > Fetch the complete documentation index at: https://infisical.com/docs/llms.txt > Use this file to discover all available pages before exploring further. # Overview > Learn more and understand the concept of Infisical projects. ## Projects A project defines a specific scope of work for a given product line in Infisical. Projects are created within an [organization](/documentation/platform/organization), and an organization can contain multiple projects across different product types. ## Project Types Infisical supports project types, each representing a different security product with its own dashboard, workflows, and capabilities. project types The supported project types are: * [Secrets Management](/documentation/platform/secrets-mgmt/overview): Securely store, access, and distribute secrets across environments with fine-grained controls, automatic rotation, and audit logging. * [Secrets Scanning](/documentation/platform/secret-scanning/overview): Detect hardcoded secrets in code, CI pipelines, and infrastructure—integrated with GitHub, GitLab, Bitbucket, and more. * [Infisical PKI](/documentation/platform/pki/overview): Issue and manage X.509 certificates using protocols like EST, with support for internal and external CAs. * [Infisical KMS](/documentation/platform/kms/overview): Encrypt and decrypt data using centrally managed keys with enforced access policies and full audit visibility. * [Infisical PAM](/documentation/platform/pam/overview): Manage access to resources like databases, servers, and accounts with policy-based controls and approvals. ## Roles and Access Control [Users](/documentation/platform/identities/user-identities) and [machine identities](/documentation/platform/identities/machine-identities) must be added to a project to access its resources. Each identity is assigned a [project-level role](/documentation/platform/access-controls/role-based-access-controls#project-level-access-controls) that defines what they can manage—such as secrets, certificates, or PAM access. These roles apply to both individuals and [user groups](/documentation/platform/groups), enabling scalable access across teams and environments. Project access is strictly scoped: only members of a project can view or manage its resources. If someone needs access but isn’t part of the project, they can submit an access request. Each project in Infisical has its own [access control model](/documentation/platform/access-controls/role-based-access-controls#project-level-access-controls), distinct from [organization-level access control](/documentation/platform/access-controls/role-based-access-controls#organization-level-access-controls). While organization roles govern broader administrative access, project-level roles control what users, groups, and machine identities can do within the boundaries of a specific project—such as managing secrets, issuing certificates, or configuring PAM access. Depending on the project type (e.g. Secrets Management, PKI, PAM), project-level access control supports advanced features like [temporary access](/documentation/platform/access-controls/temporary-access), [access requests](/documentation/platform/access-controls/access-requests), and [additional privileges](/documentation/platform/access-controls/additional-privileges). project roles To learn more about how permissions work in detail, refer to the [access control documentation](/documentation/platform/access-controls/overview). ## Audit Logs Infisical provides [audit logging](/documentation/platform/audit-logs) at the project level to help teams monitor activity and maintain accountability within a specific project. These logs capture all relevant events—such as secret access, certificate issuance, and PAM activity—that occur within the boundaries of that project. Unlike the organization-level audit view, which aggregates logs across all projects in one centralized interface, the project-level audit view is scoped to a single project. This enables relevant project admins and contributors to review activity relevant to their work without having broader access to audit logs in other projects that they are not part of. ## Project Settings Each project has its own settings panel, with options that vary depending on the selected product type. These may include setup and configuration for environments, tags, behaviors, encryption strategies, and other options. Project settings are fully independent and reflect the capabilities of the associated product. --- # Source: https://infisical.com/docs/api-reference/endpoints/deprecated/organizations/projects.md > ## Documentation Index > Fetch the complete documentation index at: https://infisical.com/docs/llms.txt > Use this file to discover all available pages before exploring further. # Get Projects > Return projects in organization that user is apart of ## OpenAPI ````yaml GET /api/v2/organizations/{organizationId}/workspaces openapi: 3.0.3 info: title: Infisical API description: List of all available APIs that can be consumed version: 0.0.1 servers: - url: https://us.infisical.com description: Production server (US) - url: https://eu.infisical.com description: Production server (EU) - url: http://localhost:8080 description: Local server security: [] paths: /api/v2/organizations/{organizationId}/workspaces: get: tags: - Organizations description: Return projects in organization that user is apart of operationId: listOrgProjects parameters: - schema: type: string in: path name: organizationId required: true description: The ID of the organization to get projects from. responses: '200': description: Default Response content: application/json: schema: type: object properties: workspaces: type: array items: type: object properties: id: type: string name: type: string slug: type: string organization: type: string environments: type: array items: type: object properties: name: type: string slug: type: string required: - name - slug additionalProperties: false required: - id - name - slug - organization - environments additionalProperties: false required: - workspaces additionalProperties: false '400': description: Default Response content: application/json: schema: type: object properties: reqId: type: string statusCode: type: number enum: - 400 message: type: string error: type: string details: {} required: - reqId - statusCode - message - error additionalProperties: false '401': description: Default Response content: application/json: schema: type: object properties: reqId: type: string statusCode: type: number enum: - 401 message: type: string error: type: string required: - reqId - statusCode - message - error additionalProperties: false '403': description: Default Response content: application/json: schema: type: object properties: reqId: type: string statusCode: type: number enum: - 403 message: type: string details: {} error: type: string required: - reqId - statusCode - message - error additionalProperties: false '404': description: Default Response content: application/json: schema: type: object properties: reqId: type: string statusCode: type: number enum: - 404 message: type: string error: type: string required: - reqId - statusCode - message - error additionalProperties: false '422': description: Default Response content: application/json: schema: type: object properties: reqId: type: string statusCode: type: number enum: - 422 message: {} error: type: string required: - reqId - statusCode - error additionalProperties: false '500': description: Default Response content: application/json: schema: type: object properties: reqId: type: string statusCode: type: number enum: - 500 message: type: string error: type: string required: - reqId - statusCode - message - error additionalProperties: false security: - bearerAuth: [] components: securitySchemes: bearerAuth: type: http scheme: bearer bearerFormat: JWT description: An access token in Infisical ```` --- # Source: https://infisical.com/docs/api-reference/endpoints/kms/keys/public-key.md > ## Documentation Index > Fetch the complete documentation index at: https://infisical.com/docs/llms.txt > Use this file to discover all available pages before exploring further. # Retrieve Public Key > Get the public key for a KMS key that is used for signing and verifying data. This endpoint is only available for asymmetric keys. ## OpenAPI ````yaml GET /api/v1/kms/keys/{keyId}/public-key openapi: 3.0.3 info: title: Infisical API description: List of all available APIs that can be consumed version: 0.0.1 servers: - url: https://us.infisical.com description: Production server (US) - url: https://eu.infisical.com description: Production server (EU) - url: http://localhost:8080 description: Local server security: [] paths: /api/v1/kms/keys/{keyId}/public-key: get: tags: - KMS Signing description: >- Get the public key for a KMS key that is used for signing and verifying data. This endpoint is only available for asymmetric keys. operationId: getKmsKeyPublicKey parameters: - schema: type: string format: uuid in: path name: keyId required: true description: >- The ID of the key to get the public key for. The key must be for signing and verifying. responses: '200': description: Default Response content: application/json: schema: type: object properties: publicKey: type: string required: - publicKey additionalProperties: false '400': description: Default Response content: application/json: schema: type: object properties: reqId: type: string statusCode: type: number enum: - 400 message: type: string error: type: string details: {} required: - reqId - statusCode - message - error additionalProperties: false '401': description: Default Response content: application/json: schema: type: object properties: reqId: type: string statusCode: type: number enum: - 401 message: type: string error: type: string required: - reqId - statusCode - message - error additionalProperties: false '403': description: Default Response content: application/json: schema: type: object properties: reqId: type: string statusCode: type: number enum: - 403 message: type: string details: {} error: type: string required: - reqId - statusCode - message - error additionalProperties: false '404': description: Default Response content: application/json: schema: type: object properties: reqId: type: string statusCode: type: number enum: - 404 message: type: string error: type: string required: - reqId - statusCode - message - error additionalProperties: false '422': description: Default Response content: application/json: schema: type: object properties: reqId: type: string statusCode: type: number enum: - 422 message: {} error: type: string required: - reqId - statusCode - error additionalProperties: false '500': description: Default Response content: application/json: schema: type: object properties: reqId: type: string statusCode: type: number enum: - 500 message: type: string error: type: string required: - reqId - statusCode - message - error additionalProperties: false ```` --- # Source: https://infisical.com/docs/contributing/getting-started/pull-requests.md > ## Documentation Index > Fetch the complete documentation index at: https://infisical.com/docs/llms.txt > Use this file to discover all available pages before exploring further. # Pull requests > This guide walks through the code submission process for Infisical. ## Making a pull request Once you are done making changes in local development, you can submit a pull request (PR) to the main repository branch. We require a few considerations on your part to ensure that PRs are easy to review and up to standard with the code. ### Title and content Start by providing a concise title addressing what your PR achieves such as "add pagination to retrieve environment variables for GitLab integration." You should follow the automatically-generated PR template to fill in the PR description. This includes a more detailed description of the changes in the PR, the type of PR, and an acknowledgement that you've read and agreed to the contributing guidelines. ### Feature PRs Give a functional overview of how your feature works, including how the user can use the feature. Then share any technical details in an overview of how the PR works. As of `06-01-2023`, all PRs created after this date are required to attach a video of you performing the described functionality. ### Bug Fix PRs Give an overview of the bug at hand and how your PR fixes the it at both a high and low level. Feel free to add a short video or screenshots of what your PR achieves. ## Getting your PR reviewed One or two relevant members of the Infisical team should review and approve the PR before it is merged. You can ping someone from the team in our [Slack](https://infisical.com/slack) to review your PR. The team member(s) will start by enabling baseline checks to ensure that there are no leaked secrets, new dependencies are clear, and the frontend/backend services start up. Afterward, they will review your PR thoroughly by testing the code and leave any feedback or work in with you to revise the PR up to standard. Once everything is good, the team member(s) will approve the PR to be merged into the `main` branch; all changes will be tested in CI/CD and our staging environment first before being deployed to production. Due to the high volume of issues, PRs, etc. from the community, and limited bandwidth on our end to address everything instantly, we prefer reviewing PRs once they are fully complete and well-tested. In the past, we've often had to review low-quality PRs up to 10 times which severely restricts our capacity to address other issues, PRs, and initiatives in the pipeline. As such, we ask of the community to submit higher-quality PRs that, for example, don't break existing code; in return we'll prioritize the first 3 reviews for PRs. --- # Source: https://infisical.com/docs/integrations/frameworks/pulumi.md > ## Documentation Index > Fetch the complete documentation index at: https://infisical.com/docs/llms.txt > Use this file to discover all available pages before exploring further. # Pulumi > Using Infisical with Pulumi via the Terraform Bridge Infisical can be integrated with Pulumi by leveraging Pulumi’s [Terraform Bridge](https://www.pulumi.com/blog/any-terraform-provider/), which allows Terraform providers to be used seamlessly within Pulumi projects. This enables infrastructure and platform teams to manage Infisical secrets and resources using Pulumi’s familiar programming languages (including TypeScript, Python, Go, and C#), without any change to existing workflows. The Terraform Bridge wraps the [Infisical Terraform provider](https://registry.terraform.io/providers/Infisical/infisical/latest/docs) and exposes its resources (such as `infisical_secret`, `infisical_project`, and `infisical_service_token`) in a Pulumi-compatible interface. This makes it easy to integrate secret management directly into Pulumi-based IaC pipelines, ensuring secrets stay in sync with the rest of your cloud infrastructure. Authentication is handled through the same methods as Terraform: using environment variables such as `INFISICAL_TOKEN` and `INFISICAL_SITE_URL`. By bridging the Infisical provider, teams using Pulumi can adopt secure, centralized secrets management without compromising on their toolchain or language preferences. --- # Source: https://infisical.com/docs/sdks/languages/python.md # Source: https://infisical.com/docs/documentation/guides/python.md > ## Documentation Index > Fetch the complete documentation index at: https://infisical.com/docs/llms.txt > Use this file to discover all available pages before exploring further. # Python This guide demonstrates how to use Infisical to manage secrets for your Python stack from local development to production. It uses: * Infisical (you can use [Infisical Cloud](https://app.infisical.com) or a [self-hosted instance of Infisical](https://infisical.com/docs/self-hosting/overview)) to store your secrets. * The [infisicalsdk](https://pypi.org/project/infisicalsdk/) Python client SDK to fetch secrets back to your Python application on demand. ## Project Setup To begin, we need to set up a project in Infisical and add secrets to an environment in it. ### Create a project 1. Create a new project in [Infisical](https://app.infisical.com/). 2. Add a secret to the development environment of this project so we can pull it back for local development. In the **Secrets Overview** page, press **Explore Development** and add a secret with the key `NAME` and value `YOUR_NAME`. ### Create a Machine Identity Now that we've created a project and added a secret to its development environment, we need to configure an Infisical Machine Identity that our Python application can use to access the secret. * [How to setup machine identities](/documentation/platform/identities/overview) ## Create a Python app For this demonstration, we use a minimal Flask application. However, the same principles will apply to any Python application such as those built with Django. ### Create a Flask app First, create a virtual environment and activate it. ```console theme={"dark"} python3 -m venv env source env/bin/activate ``` Install Flask and [infisicalsdk](https://pypi.org/project/infisicalsdk/), the client Python SDK for Infisical. ```console theme={"dark"} pip install flask infisicalsdk ``` Finally, create an `app.py` file containing the application code. ```py theme={"dark"} from flask import Flask from infisical_sdk import InfisicalSDKClient app = Flask(__name__) client = InfisicalSDKClient(host="https://app.infisical.com") # host is optional, defaults to https://app.infisical.com client.auth.universal_auth.login( "", "" ) @app.route("/") def hello_world(): # access value name = client.secrets.get_secret_by_name( secret_name="NAME", project_id="", environment_slug="dev", secret_path="/" ) return f"Hello! My name is: {name.secretValue}" ``` Here, we initialized a `client` instance of the Infisical Python SDK with the Infisical Token that we created earlier, giving access to the secrets in the development environment of the project in Infisical that we created earlier. Finally, start the app and head to `http://localhost:5000` to see the message **Hello, Your Name**. ```console theme={"dark"} flask run ``` The client fetched the secret with the key `NAME` from Infisical that we returned in the response of the endpoint. At this stage, you know how to fetch secrets from Infisical back to your Python application. By using Infisical Tokens scoped to different environments, you can easily manage secrets across various stages of your project in Infisical, from local development to production. ## FAQ The token enables the SDK to authenticate with Infisical to fetch back your secrets. Although the SDK requires you to pass in a token, it enables greater efficiency and security than if you managed dozens of secrets yourself without it. Here're some benefits: * You always pull in the right secrets because they're fetched on demand from a centralized source that is Infisical. * You can use the Infisical which comes with tons of benefits like secret versioning, access controls, audit logs, etc. * You now risk leaking one token that can be revoked instead of dozens of raw secrets. And much more. See also: * Explore the [Python SDK](https://github.com/Infisical/python-sdk-official) --- # Source: https://infisical.com/docs/integrations/cloud/qovery.md # Qovery > How to sync secrets from Infisical to Qovery Prerequisites: * Set up and add envars to [Infisical Cloud](https://app.infisical.com) Obtain a Qovery API Token in Settings > API Token. integrations qovery api token Navigate to your project's integrations tab in Infisical. integrations Press on the Qovery tile and input your Qovery API Token to grant Infisical access to your Qovery account. integrations qovery authorization Select which Infisical environment secrets you want to sync to Qovery and press create integration to start syncing secrets. integrations qovery create integrations qovery create Infisical supports syncing secrets to various Qovery scopes including applications, jobs, or containers. integrations qovery settings --- # Source: https://infisical.com/docs/documentation/platform/dynamic-secrets/rabbit-mq.md > ## Documentation Index > Fetch the complete documentation index at: https://infisical.com/docs/llms.txt > Use this file to discover all available pages before exploring further. # RabbitMQ > Learn how to dynamically generate RabbitMQ user credentials. The Infisical RabbitMQ dynamic secret allows you to generate RabbitMQ credentials on demand based on configured role. ## Prerequisites 1. Ensure that the `management` plugin is enabled on your RabbitMQ instance. This is required for the dynamic secret to work. ## Set up Dynamic Secrets with RabbitMQ Open the Secret Overview dashboard and select the environment in which you would like to add a dynamic secret. Add Dynamic Secret Button Dynamic Secret Modal Name by which you want the secret to be referenced Default time-to-live for a generated secret (it is possible to modify this value after a secret is generated) Maximum time-to-live for a generated secret. Your RabbitMQ host. This must be in HTTP format. *(Example: [http://your-cluster-ip](http://your-cluster-ip))* The port that the RabbitMQ management plugin is listening on. This is `15672` by default. The name of the virtual host that the user will be assigned to. This defaults to `/`. The permissions that the user will have on the virtual host. This defaults to `.*`. The three permission fields all take a regular expression *(regex)*, that should match resource names for which the user is granted read / write / configuration permissions The username of the user that will be used to provision new dynamic secret leases. The password of the user that will be used to provision new dynamic secret leases. Specifies a template for generating usernames. This field allows customization of how usernames are automatically created. Allowed template variables are: * `{{randomUsername}}`: Random username string. * `{{unixTimestamp}}`: Current Unix timestamp at the time of lease creation. * `{{identity.name}}`: Name of the identity that is generating the lease. * `{{dynamicSecret.name}}`: Name of the associated dynamic secret. * `{{dynamicSecret.type}}`: Type of the associated dynamic secret. * `{{random N}}`: Random string of N characters. Allowed template functions are: * `truncate`: Truncates a string to a specified length. * `replace`: Replaces a substring with another value. * `uppercase`: Converts a string to uppercase. * `lowercase`: Converts a string to lowercase. Examples: ```yaml theme={"dark"} {{ randomUsername }} // 3POnzeFyK9gW2nioK0q2gMjr6CZqsRiX {{ unixTimestamp }} // 17490641580 {{ identity.name }} // {{ random 5 }} // x9K2m {{ truncate identity.name 4 }} // test {{ replace identity.name '' 'new-value' }} // new-value ``` A CA may be required if your DB requires it for incoming connections. This is often the case when connecting to a managed service. Dynamic Secret Setup Modal After submitting the form, you will see a dynamic secret created in the dashboard. If this step fails, you may have to add the CA certificate. Once you've successfully configured the dynamic secret, you're ready to generate on-demand credentials. To do this, simply click on the 'Generate' button which appears when hovering over the dynamic secret item. Alternatively, you can initiate the creation of a new lease by selecting 'New Lease' from the dynamic secret lease list section. Dynamic Secret Dynamic Secret When generating these secrets, it's important to specify a Time-to-Live (TTL) duration. This will dictate how long the credentials are valid for. Provision Lease Ensure that the TTL for the lease falls within the maximum TTL defined when configuring the dynamic secret. Once you click the `Submit` button, a new secret lease will be generated and the credentials from it will be shown to you. Provision Lease ## Audit or Revoke Leases Once you have created one or more leases, you will be able to access them by clicking on the respective dynamic secret item on the dashboard. This will allow you to see the expiration time of the lease or delete a lease before it's set time to live. Provision Lease ## Renew Leases To extend the life of the generated dynamic secret leases past its initial time to live, simply click on the **Renew** button as illustrated below. Provision Lease Lease renewals cannot exceed the maximum TTL set when configuring the dynamic secret --- # Source: https://infisical.com/docs/integrations/frameworks/rails.md > ## Documentation Index > Fetch the complete documentation index at: https://infisical.com/docs/llms.txt > Use this file to discover all available pages before exploring further. # Ruby on Rails > How to use Infisical to inject environment variables and secrets into a Ruby on Rails app. Prerequisites: * Set up and add envars to [Infisical Cloud](https://app.infisical.com) * [Install the CLI](/cli/overview) ## Initialize Infisical for your [Rails](https://rubyonrails.org) app ```bash theme={"dark"} # navigate to the root of your of your project cd /path/to/project # then initialize Infisical infisical init ``` ## Start your application as usual but with Infisical ```bash theme={"dark"} infisical run -- # Example infisical run -- bin/rails server ``` --- # Source: https://infisical.com/docs/integrations/secret-syncs/railway.md # Source: https://infisical.com/docs/integrations/app-connections/railway.md > ## Documentation Index > Fetch the complete documentation index at: https://infisical.com/docs/llms.txt > Use this file to discover all available pages before exploring further. # Railway Connection > Learn how to configure a Railway Connection for Infisical. Infisical supports the use of [API Tokens](https://docs.railway.com/guides/public-api#creating-a-token) to connect with Railway. ## Create a Railway API Token A team token provides access to all resources within a team. It cannot be used to access personal resources in Railway. Dashboard Page Account Settings Page Make sure to provide a descriptive name and select the correct team. Enter Name and Select Team Create Token After clicking 'Create', your access token will be displayed. Save it securely for later use. Copy Token Modal If no team is selected, the token will be associated with your personal Railway account and will have access to all your individual and team resources. Dashboard Page Account Settings Page Provide a descriptive name and ensure no team is selected. This will create an account-level token. Enter Name Create Token After clicking 'Create', your access token will be shown. Save it for future use. Copy Token Modal Project tokens are limited to a specific environment within a project and can only be used to authenticate requests to that environment. Dashboard Page Project Settings Page Project Token Settings Page Provide a descriptive name and select the appropriate environment for the token. Enter Name and Select environment Create Token After clicking 'Create', the access token will be displayed. Be sure to save it for later use. Copy Token Modal ## Create a Railway Connection in Infisical In your Infisical dashboard, navigate to the **Integrations** tab in the desired project, then select **App Connections**. App Connections Tab Click **+ Add Connection** and choose **Railway Connection** from the list of integrations. Select Railway Connection Complete the form by providing: * A descriptive name for the connection * An optional description * The type of token you created earlier * The token value from the previous step Railway Connection Modal After submitting the form, your **Railway Connection** will be successfully created and ready to use with your Infisical project. Railway Connection Created To create a Railway Connection via API, send a request to the [Create Railway Connection](/api-reference/endpoints/app-connections/railway/create) endpoint. ### Sample request ```bash Request theme={"dark"} curl --request POST \ --url https://app.infisical.com/api/v1/app-connections/railway \ --header 'Content-Type: application/json' \ --data '{ "name": "my-railway-connection", "method": "team-token", "projectId": "7ffbb072-2575-495a-b5b0-127f88caef78", "credentials": { "apiToken": "[TEAM TOKEN]" } }' ``` ### Sample response ```bash Response theme={"dark"} { "appConnection": { "id": "e5d18aca-86f7-4026-a95e-efb8aeb0d8e6", "name": "my-railway-connection", "projectId": "7ffbb072-2575-495a-b5b0-127f88caef78", "description": null, "version": 1, "orgId": "6f03caa1-a5de-43ce-b127-95a145d3464c", "createdAt": "2025-04-23T19:46:34.831Z", "updatedAt": "2025-04-23T19:46:34.831Z", "isPlatformManagedCredentials": false, "credentialsHash": "7c2d371dec195f82a6a0d5b41c970a229cfcaf88e894a5b6395e2dbd0280661f", "app": "railway", "method": "team-token", "credentials": {} } } ``` --- # Source: https://infisical.com/docs/integrations/frameworks/react.md > ## Documentation Index > Fetch the complete documentation index at: https://infisical.com/docs/llms.txt > Use this file to discover all available pages before exploring further. # React > How to use Infisical to inject environment variables and secrets into a React app. Prerequisites: * Set up and add envars to [Infisical Cloud](https://app.infisical.com) * [Install the CLI](/cli/overview) ## Initialize Infisical for your [Create React App](https://create-react-app.dev) ```bash theme={"dark"} # navigate to the root of your of your project cd /path/to/project # then initialize infisical infisical init ``` ## Start your application as usual but with Infisical ```bash theme={"dark"} infisical run -- # Example infisical run -- npm run dev ``` React environment variables must be prefixed with `REACT_APP_` to show up within the application --- # Source: https://infisical.com/docs/api-reference/endpoints/ssh/hosts/read-host-ca-pk.md # Read Host CA Public Key > Get public key of the host SSH CA linked to the host ## OpenAPI ````yaml GET /api/v1/ssh/hosts/{sshHostId}/host-ca-public-key paths: path: /api/v1/ssh/hosts/{sshHostId}/host-ca-public-key method: get servers: - url: https://us.infisical.com description: Production server (US) - url: https://eu.infisical.com description: Production server (EU) - url: http://localhost:8080 description: Local server request: security: [] parameters: path: sshHostId: schema: - type: string required: true description: The ID of the SSH host to get the host SSH CA public key for. query: {} header: {} cookie: {} body: {} response: '200': application/json: schemaArray: - type: string description: The public key of the host SSH CA linked to the SSH host. examples: example: value: description: The public key of the host SSH CA linked to the SSH host. '400': application/json: schemaArray: - type: object properties: reqId: allOf: - type: string statusCode: allOf: - type: number enum: - 400 message: allOf: - type: string error: allOf: - type: string requiredProperties: - reqId - statusCode - message - error additionalProperties: false examples: example: value: reqId: statusCode: 400 message: error: description: Default Response '401': application/json: schemaArray: - type: object properties: reqId: allOf: - type: string statusCode: allOf: - type: number enum: - 401 message: allOf: - type: string error: allOf: - type: string requiredProperties: - reqId - statusCode - message - error additionalProperties: false examples: example: value: reqId: statusCode: 401 message: error: description: Default Response '403': application/json: schemaArray: - type: object properties: reqId: allOf: - type: string statusCode: allOf: - type: number enum: - 403 message: allOf: - type: string details: allOf: - {} error: allOf: - type: string requiredProperties: - reqId - statusCode - message - error additionalProperties: false examples: example: value: reqId: statusCode: 403 message: details: error: description: Default Response '404': application/json: schemaArray: - type: object properties: reqId: allOf: - type: string statusCode: allOf: - type: number enum: - 404 message: allOf: - type: string error: allOf: - type: string requiredProperties: - reqId - statusCode - message - error additionalProperties: false examples: example: value: reqId: statusCode: 404 message: error: description: Default Response '422': application/json: schemaArray: - type: object properties: reqId: allOf: - type: string statusCode: allOf: - type: number enum: - 422 message: allOf: - {} error: allOf: - type: string requiredProperties: - reqId - statusCode - error additionalProperties: false examples: example: value: reqId: statusCode: 422 message: error: description: Default Response '500': application/json: schemaArray: - type: object properties: reqId: allOf: - type: string statusCode: allOf: - type: number enum: - 500 message: allOf: - type: string error: allOf: - type: string requiredProperties: - reqId - statusCode - message - error additionalProperties: false examples: example: value: reqId: statusCode: 500 message: error: description: Default Response deprecated: false type: path components: schemas: {} ```` --- # Source: https://infisical.com/docs/api-reference/endpoints/ssh/hosts/read-user-ca-pk.md # Read User CA Public Key > Get public key of the user SSH CA linked to the host ## OpenAPI ````yaml GET /api/v1/ssh/hosts/{sshHostId}/user-ca-public-key paths: path: /api/v1/ssh/hosts/{sshHostId}/user-ca-public-key method: get servers: - url: https://us.infisical.com description: Production server (US) - url: https://eu.infisical.com description: Production server (EU) - url: http://localhost:8080 description: Local server request: security: [] parameters: path: sshHostId: schema: - type: string required: true description: The ID of the SSH host to get the user SSH CA public key for. query: {} header: {} cookie: {} body: {} response: '200': application/json: schemaArray: - type: string description: The public key of the user SSH CA linked to the SSH host. examples: example: value: description: The public key of the user SSH CA linked to the SSH host. '400': application/json: schemaArray: - type: object properties: reqId: allOf: - type: string statusCode: allOf: - type: number enum: - 400 message: allOf: - type: string error: allOf: - type: string requiredProperties: - reqId - statusCode - message - error additionalProperties: false examples: example: value: reqId: statusCode: 400 message: error: description: Default Response '401': application/json: schemaArray: - type: object properties: reqId: allOf: - type: string statusCode: allOf: - type: number enum: - 401 message: allOf: - type: string error: allOf: - type: string requiredProperties: - reqId - statusCode - message - error additionalProperties: false examples: example: value: reqId: statusCode: 401 message: error: description: Default Response '403': application/json: schemaArray: - type: object properties: reqId: allOf: - type: string statusCode: allOf: - type: number enum: - 403 message: allOf: - type: string details: allOf: - {} error: allOf: - type: string requiredProperties: - reqId - statusCode - message - error additionalProperties: false examples: example: value: reqId: statusCode: 403 message: details: error: description: Default Response '404': application/json: schemaArray: - type: object properties: reqId: allOf: - type: string statusCode: allOf: - type: number enum: - 404 message: allOf: - type: string error: allOf: - type: string requiredProperties: - reqId - statusCode - message - error additionalProperties: false examples: example: value: reqId: statusCode: 404 message: error: description: Default Response '422': application/json: schemaArray: - type: object properties: reqId: allOf: - type: string statusCode: allOf: - type: number enum: - 422 message: allOf: - {} error: allOf: - type: string requiredProperties: - reqId - statusCode - error additionalProperties: false examples: example: value: reqId: statusCode: 422 message: error: description: Default Response '500': application/json: schemaArray: - type: object properties: reqId: allOf: - type: string statusCode: allOf: - type: number enum: - 500 message: allOf: - type: string error: allOf: - type: string requiredProperties: - reqId - statusCode - message - error additionalProperties: false examples: example: value: reqId: statusCode: 500 message: error: description: Default Response deprecated: false type: path components: schemas: {} ```` --- # Source: https://infisical.com/docs/api-reference/endpoints/secrets/read.md # Source: https://infisical.com/docs/api-reference/endpoints/pki-alerts/read.md # Source: https://infisical.com/docs/api-reference/endpoints/deprecated/secrets/read.md # Source: https://infisical.com/docs/api-reference/endpoints/certificates/read.md # Source: https://infisical.com/docs/api-reference/endpoints/certificate-authorities/internal/read.md # Source: https://infisical.com/docs/api-reference/endpoints/certificate-authorities/acme/read.md > ## Documentation Index > Fetch the complete documentation index at: https://infisical.com/docs/llms.txt > Use this file to discover all available pages before exploring further. # Read ## OpenAPI ````yaml GET /api/v1/cert-manager/ca/acme/{id} openapi: 3.0.3 info: title: Infisical API description: List of all available APIs that can be consumed version: 0.0.1 servers: - url: https://us.infisical.com description: Production server (US) - url: https://eu.infisical.com description: Production server (EU) - url: http://localhost:8080 description: Local server security: [] paths: /api/v1/cert-manager/ca/acme/{id}: get: tags: - PKI Certificate Authorities operationId: getAcmeCertificateAuthorityV1 parameters: - schema: type: string in: path name: id required: true responses: '200': description: Default Response content: application/json: schema: type: object properties: projectId: type: string enableDirectIssuance: type: boolean default: true name: type: string id: type: string format: uuid status: type: string enum: - active - disabled - pending-certificate type: type: string enum: - acme configuration: type: object properties: dnsAppConnectionId: type: string format: uuid description: >- The ID of the App Connection to use for creating and managing DNS TXT records required for ACME domain validation. This connection must have permissions to create and delete TXT records in your DNS provider (e.g., Route53) for the ACME challenge process. dnsProviderConfig: type: object properties: provider: type: string enum: - route53 - cloudflare - dns-made-easy description: >- The DNS provider for the ACME Certificate Authority. hostedZoneId: type: string minLength: 1 description: >- The hosted zone ID for the ACME Certificate Authority. required: - provider - hostedZoneId additionalProperties: false directoryUrl: type: string format: uri minLength: 1 description: The directory URL for the ACME Certificate Authority. accountEmail: type: string minLength: 1 description: The email address for the ACME Certificate Authority. eabKid: type: string maxLength: 64 description: >- The External Account Binding (EAB) Key ID for the ACME Certificate Authority. Required if the ACME provider uses EAB. eabHmacKey: type: string maxLength: 512 description: >- The External Account Binding (EAB) HMAC key for the ACME Certificate Authority. Required if the ACME provider uses EAB. required: - dnsAppConnectionId - dnsProviderConfig - directoryUrl - accountEmail additionalProperties: false required: - projectId - name - id - status - type - configuration additionalProperties: false '400': description: Default Response content: application/json: schema: type: object properties: reqId: type: string statusCode: type: number enum: - 400 message: type: string error: type: string details: {} required: - reqId - statusCode - message - error additionalProperties: false '401': description: Default Response content: application/json: schema: type: object properties: reqId: type: string statusCode: type: number enum: - 401 message: type: string error: type: string required: - reqId - statusCode - message - error additionalProperties: false '403': description: Default Response content: application/json: schema: type: object properties: reqId: type: string statusCode: type: number enum: - 403 message: type: string details: {} error: type: string required: - reqId - statusCode - message - error additionalProperties: false '404': description: Default Response content: application/json: schema: type: object properties: reqId: type: string statusCode: type: number enum: - 404 message: type: string error: type: string required: - reqId - statusCode - message - error additionalProperties: false '422': description: Default Response content: application/json: schema: type: object properties: reqId: type: string statusCode: type: number enum: - 422 message: {} error: type: string required: - reqId - statusCode - error additionalProperties: false '500': description: Default Response content: application/json: schema: type: object properties: reqId: type: string statusCode: type: number enum: - 500 message: type: string error: type: string required: - reqId - statusCode - message - error additionalProperties: false ```` --- # Source: https://infisical.com/docs/api-reference/endpoints/secret-rotations/windows-local-account/reconcile.md # Source: https://infisical.com/docs/api-reference/endpoints/secret-rotations/unix-linux-local-account/reconcile.md > ## Documentation Index > Fetch the complete documentation index at: https://infisical.com/docs/llms.txt > Use this file to discover all available pages before exploring further. # Reconcile > Reconcile Unix/Linux Local Account rotation credentials. This operation uses the SSH app connection credentials to reset the password when credentials are out of sync. ## OpenAPI ````yaml POST /api/v2/secret-rotations/unix-linux-local-account/{rotationId}/reconcile openapi: 3.0.3 info: title: Infisical API description: List of all available APIs that can be consumed version: 0.0.1 servers: - url: https://us.infisical.com description: Production server (US) - url: https://eu.infisical.com description: Production server (EU) - url: http://localhost:8080 description: Local server security: [] paths: /api/v2/secret-rotations/unix-linux-local-account/{rotationId}/reconcile: post: tags: - Secret Rotations description: >- Reconcile Unix/Linux Local Account rotation credentials. This operation uses the SSH app connection credentials to reset the password when credentials are out of sync. parameters: - schema: type: string format: uuid in: path name: rotationId required: true description: The ID of the SSH Password Rotation to reconcile credentials for. responses: '200': description: Default Response content: application/json: schema: type: object properties: message: type: string reconciled: type: boolean secretRotation: type: object properties: id: type: string format: uuid name: type: string description: type: string nullable: true isAutoRotationEnabled: type: boolean default: true activeIndex: type: number default: 0 folderId: type: string format: uuid connectionId: type: string format: uuid createdAt: type: string format: date-time updatedAt: type: string format: date-time rotationInterval: type: number rotationStatus: type: string lastRotationAttemptedAt: type: string format: date-time lastRotatedAt: type: string format: date-time lastRotationJobId: type: string nullable: true nextRotationAt: type: string format: date-time nullable: true isLastRotationManual: type: boolean default: true connection: type: object properties: app: type: string enum: - ssh name: type: string id: type: string format: uuid required: - app - name - id additionalProperties: false environment: type: object properties: slug: type: string name: type: string id: type: string format: uuid required: - slug - name - id additionalProperties: false projectId: type: string folder: type: object properties: id: type: string path: type: string required: - id - path additionalProperties: false rotateAtUtc: type: object properties: hours: type: number minimum: 0 maximum: 23 minutes: type: number minimum: 0 maximum: 59 required: - hours - minutes additionalProperties: false lastRotationMessage: type: string nullable: true type: type: string enum: - unix-linux-local-account parameters: type: object properties: username: type: string minLength: 1 description: >- The username of the Unix/Linux user account to rotate the password for. passwordRequirements: type: object properties: length: type: number minimum: 1 maximum: 250 description: The length of the password to generate. required: type: object properties: digits: type: number minimum: 0 description: >- The amount of digits to require in the generated password. lowercase: type: number minimum: 0 description: >- The amount of lowercase characters to require in the generated password. uppercase: type: number minimum: 0 description: >- The amount of uppercase characters to require in the generated password. symbols: type: number minimum: 0 description: >- The amount of symbols to require in the generated password. required: - digits - lowercase - uppercase - symbols additionalProperties: false allowedSymbols: type: string pattern: '[!@#$%^&*()_+\-=\[\]{};'':"\\|,.<>\/?~]' description: >- The allowed symbols to use in the generated password (defaults to "-_.~!*"). required: - length - required additionalProperties: false description: >- The password requirements to use when generating the new password. rotationMethod: type: string enum: - login-as-target - login-as-root description: >- Whether the rotation should be performed using "login-as-target" (the target user's own credentials) or "login-as-root" (the SSH connection's admin credentials). Defaults to "login-as-target". required: - username additionalProperties: false secretsMapping: type: object properties: username: type: string minLength: 1 description: >- The name of the secret that the username will be mapped to. password: type: string minLength: 1 description: >- The name of the secret that the rotated password will be mapped to. required: - username - password additionalProperties: false required: - id - name - folderId - connectionId - createdAt - updatedAt - rotationInterval - rotationStatus - lastRotationAttemptedAt - lastRotatedAt - connection - environment - projectId - folder - rotateAtUtc - type - parameters - secretsMapping additionalProperties: false required: - message - reconciled - secretRotation additionalProperties: false '400': description: Default Response content: application/json: schema: type: object properties: reqId: type: string statusCode: type: number enum: - 400 message: type: string error: type: string details: {} required: - reqId - statusCode - message - error additionalProperties: false '401': description: Default Response content: application/json: schema: type: object properties: reqId: type: string statusCode: type: number enum: - 401 message: type: string error: type: string required: - reqId - statusCode - message - error additionalProperties: false '403': description: Default Response content: application/json: schema: type: object properties: reqId: type: string statusCode: type: number enum: - 403 message: type: string details: {} error: type: string required: - reqId - statusCode - message - error additionalProperties: false '404': description: Default Response content: application/json: schema: type: object properties: reqId: type: string statusCode: type: number enum: - 404 message: type: string error: type: string required: - reqId - statusCode - message - error additionalProperties: false '422': description: Default Response content: application/json: schema: type: object properties: reqId: type: string statusCode: type: number enum: - 422 message: {} error: type: string required: - reqId - statusCode - error additionalProperties: false '500': description: Default Response content: application/json: schema: type: object properties: reqId: type: string statusCode: type: number enum: - 500 message: type: string error: type: string required: - reqId - statusCode - message - error additionalProperties: false ```` --- # Source: https://infisical.com/docs/documentation/platform/secret-rotation/redis-credentials.md > ## Documentation Index > Fetch the complete documentation index at: https://infisical.com/docs/llms.txt > Use this file to discover all available pages before exploring further. # Redis Credentials Rotation > Learn how to automatically rotate Redis credentials. ## Prerequisites 1. Create a [Redis Connection](/integrations/app-connections/redis) with the required **Secret Rotation** permissions 2. Ensure your network security policies allow incoming requests from Infisical to this rotation provider, if network restrictions apply. Create a Redis Credentials Rotation in Infisical 1. Navigate to your Secret Manager Project's Dashboard and select **Add Secret Rotation** from the actions dropdown. Secret Manager Dashboard 2. Select the **Redis Credentials** option. Select Redis Credentials 3. Select the **Redis Connection** to use and configure the rotation behavior. Then click **Next**. Rotation Configuration * **Redis Connection** - the connection that will perform the rotation of the configured database user credentials. * **Rotation Interval** - the interval, in days, that once elapsed will trigger a rotation. * **Rotate At** - the local time of day when rotation should occur once the interval has elapsed. * **Auto-Rotation Enabled** - whether secrets should automatically be rotated once the rotation interval has elapsed. Disable this option to manually rotate secrets or pause secret rotation. 4. Input the password requirements and permission scope for the Redis users that will be created for the rotation. Then click **Next**. Rotation Parameters * **Permission Scope** - The scope of the Redis users that will be created for the rotation. This will default to `~* +@all` if not specified. * **Password Requirements** - The requirements for the password of the Redis users that will be created for the rotation. 5. Specify the secret names that the active credentials should be mapped to. Then click **Next**. Rotation Secrets Mapping * **Username** - the name of the secret that the active username will be mapped to. * **Password** - the name of the secret that the active password will be mapped to. 6. Give your rotation a name and description (optional). Then click **Next**. Rotation Details * **Name** - the name of the secret rotation configuration. Must be slug-friendly. * **Description** (optional) - a description of this rotation configuration. 7. Review your configuration, then click **Create Secret Rotation**. Rotation Review 8. Your **Redis Credentials** are now available for use via the mapped secrets. Rotation Created To create a Redis Credentials Rotation, make an API request to the [Create Redis Credentials Rotation](/api-reference/endpoints/secret-rotations/redis-credentials/create) API endpoint. ### Sample request ```bash Request theme={"dark"} curl --request POST \ --url https://us.infisical.com/api/v2/secret-rotations/redis-credentials \ --header 'Content-Type: application/json' \ --data '{ "name": my-redis-rotation", "projectId": "", "description": "", "connectionId": "", "environment": "dev|staging|prod", "secretPath": "", "isAutoRotationEnabled": true, "rotationInterval": 2, "rotateAtUtc": { "hours": 11.5, "minutes": 29.5 }, "parameters": { "passwordRequirements": { "length": 64, "required": { "digits": 1, "lowercase": 1, "uppercase": 1, "symbols": 1 }, "allowedSymbols": "@!+" }, "permissionScope": "~* +@all" }, "secretsMapping": { "username": "REDIS_USERNAME", "password": "REDIS_PASSWORD" } }' ``` ### Sample response ```bash Response theme={"dark"} { "secretRotation": { "id": "3c90c3cc-0d44-4b50-8888-8dd25736052a", "name": "my-redis-rotation", "description": "my database credentials rotation", "isAutoRotationEnabled": true, "activeIndex": 0, "folderId": "3c90c3cc-0d44-4b50-8888-8dd25736052a", "connectionId": "3c90c3cc-0d44-4b50-8888-8dd25736052a", "createdAt": "2023-11-07T05:31:56Z", "updatedAt": "2023-11-07T05:31:56Z", "rotationInterval": 30, "rotationStatus": "success", "lastRotationAttemptedAt": "2023-11-07T05:31:56Z", "lastRotatedAt": "2023-11-07T05:31:56Z", "lastRotationJobId": "3c90c3cc-0d44-4b50-8888-8dd25736052a", "nextRotationAt": "2023-11-07T05:31:56Z", "connection": { "app": "redis", "name": "my-redis-connection", "id": "3c90c3cc-0d44-4b50-8888-8dd25736052a" }, "environment": { "slug": "dev", "name": "Development", "id": "3c90c3cc-0d44-4b50-8888-8dd25736052a" }, "projectId": "3c90c3cc-0d44-4b50-8888-8dd25736052a", "folder": { "id": "3c90c3cc-0d44-4b50-8888-8dd25736052a", "path": "/" }, "rotateAtUtc": { "hours": 0, "minutes": 0 }, "lastRotationMessage": null, "type": "redis-credentials", "parameters": { "passwordRequirements": { "length": 64, "required": { "digits": 1, "lowercase": 1, "uppercase": 1, "symbols": 1 }, "allowedSymbols": "@!+" }, "permissionScope": "~* +@all" }, "secretsMapping": { "username": "REDIS_USERNAME", "password": "REDIS_PASSWORD" } } } ``` --- # Source: https://infisical.com/docs/integrations/app-connections/redis.md # Source: https://infisical.com/docs/documentation/platform/pam/getting-started/resources/redis.md # Source: https://infisical.com/docs/documentation/platform/dynamic-secrets/redis.md > ## Documentation Index > Fetch the complete documentation index at: https://infisical.com/docs/llms.txt > Use this file to discover all available pages before exploring further. # Redis > Learn how to dynamically generate Redis Database user credentials. The Infisical Redis dynamic secret allows you to generate Redis Database credentials on demand based on configured role. ## Prerequisite Create a user with the required permission in your Redis instance. This user will be used to create new accounts on-demand. ## Set up Dynamic Secrets with Redis Open the Secret Overview dashboard and select the environment in which you would like to add a dynamic secret. Add Dynamic Secret Button Dynamic Secret Modal Name by which you want the secret to be referenced Default time-to-live for a generated secret (it is possible to modify this value after a secret is generated) Maximum time-to-live for a generated secret. The database host, this can be an IP address or a domain name as long as Infisical can reach it. The database port, this is the port that the Redis instance is listening on. Redis username that will be used to create new users on-demand. This is often 'default' or 'admin'. Password that will be used to create dynamic secrets. This is required if your Redis instance is password protected. A CA may be required if your DB requires it for incoming connections. This is often the case when connecting to a managed service. Modify Redis Statements Modal Specifies a template for generating usernames. This field allows customization of how usernames are automatically created. Allowed template variables are: * `{{randomUsername}}`: Random username string. * `{{unixTimestamp}}`: Current Unix timestamp at the time of lease creation. * `{{identity.name}}`: Name of the identity that is generating the lease. * `{{dynamicSecret.name}}`: Name of the associated dynamic secret. * `{{dynamicSecret.type}}`: Type of the associated dynamic secret. * `{{random N}}`: Random string of N characters. Allowed template functions are: * `truncate`: Truncates a string to a specified length. * `replace`: Replaces a substring with another value. * `uppercase`: Converts a string to uppercase. * `lowercase`: Converts a string to lowercase. Examples: ```yaml theme={"dark"} {{ randomUsername }} // 3POnzeFyK9gW2nioK0q2gMjr6CZqsRiX {{ unixTimestamp }} // 17490641580 {{ identity.name }} // {{ random 5 }} // x9K2m {{ truncate identity.name 4 }} // test {{ replace identity.name '' 'new-value' }} // new-value ``` If you want to provide specific privileges for the generated dynamic credentials, you can modify the Redis statement to your needs. This is useful if you want to only give access to a specific table(s). After submitting the form, you will see a dynamic secret created in the dashboard. If this step fails, you may have to add the CA certificate. Once you've successfully configured the dynamic secret, you're ready to generate on-demand credentials. To do this, simply click on the 'Generate' button which appears when hovering over the dynamic secret item. Alternatively, you can initiate the creation of a new lease by selecting 'New Lease' from the dynamic secret lease list section. Dynamic Secret Dynamic Secret When generating these secrets, it's important to specify a Time-to-Live (TTL) duration. This will dictate how long the credentials are valid for. Provision Lease Ensure that the TTL for the lease falls within the maximum TTL defined when configuring the dynamic secret. Once you click the `Submit` button, a new secret lease will be generated and the credentials from it will be shown to you. Provision Lease ## Audit or Revoke Leases Once you have created one or more leases, you will be able to access them by clicking on the respective dynamic secret item on the dashboard. This will allow you to see the expiration time of the lease or delete a lease before it's set time to live. Provision Lease ## Renew Leases To extend the life of the generated dynamic secret leases past its initial time to live, simply click on the **Renew** button as illustrated below. Provision Lease Lease renewals cannot exceed the maximum TTL set when configuring the dynamic secret --- # Source: https://infisical.com/docs/cli/commands/relay.md > ## Documentation Index > Fetch the complete documentation index at: https://infisical.com/docs/llms.txt > Use this file to discover all available pages before exploring further. # infisical relay > Relay-related commands for Infisical ```bash theme={"dark"} infisical relay start --host= --name= --auth-method= ``` ```bash theme={"dark"} # Install systemd service sudo infisical relay systemd install --host= --name= --token= # Uninstall systemd service sudo infisical relay systemd uninstall ``` ## Description Relay-related commands for Infisical that provide identity-aware relay infrastructure for routing encrypted traffic. Relays are organization-deployed servers that route encrypted traffic between Infisical and your gateways. ## Subcommands & flags Run the Infisical relay component. The relay handles network traffic routing between Infisical and your gateways. ```bash theme={"dark"} infisical relay start --host= --name= --auth-method= ``` ### Flags The host (IP address or hostname) of the instance where the relay is deployed. This must be a static public IP or resolvable hostname that gateways can reach. ```bash theme={"dark"} # Example with IP address infisical relay start --host=203.0.113.100 --name=my-relay # Example with hostname infisical relay start --host=relay.example.com --name=my-relay ``` The name of the relay. This is an arbitrary identifier for your relay instance. ```bash theme={"dark"} # Example infisical relay start --name=my-relay --host=192.168.1.100 ``` ### Authentication Relays support all standard Infisical authentication methods. Choose the authentication method that best fits your environment and set the corresponding flags when starting the relay. ```bash theme={"dark"} # Example with Universal Auth infisical relay start --host=192.168.1.100 --name=my-relay --auth-method=universal-auth --client-id= --client-secret= ``` ### Available Authentication Methods The Infisical CLI supports multiple authentication methods for relays. Below are the available authentication methods, with their respective flags. The Universal Auth method is a simple and secure way to authenticate with Infisical. It requires a client ID and a client secret to authenticate with Infisical. Your machine identity client ID. Your machine identity client secret. The authentication method to use. Must be `universal-auth` when using Universal Auth. ```bash theme={"dark"} infisical relay start --auth-method=universal-auth --client-id= --client-secret= --host= --name= ``` The Native Kubernetes method is used to authenticate with Infisical when running in a Kubernetes environment. It requires a service account token to authenticate with Infisical. Your machine identity ID. Path to the Kubernetes service account token to use. Default: `/var/run/secrets/kubernetes.io/serviceaccount/token`. The authentication method to use. Must be `kubernetes` when using Native Kubernetes. ```bash theme={"dark"} infisical relay start --auth-method=kubernetes --machine-identity-id= --host= --name= ``` The Native Azure method is used to authenticate with Infisical when running in an Azure environment. Your machine identity ID. The authentication method to use. Must be `azure` when using Native Azure. ```bash theme={"dark"} infisical relay start --auth-method=azure --machine-identity-id= --host= --name= ``` The Native GCP ID Token method is used to authenticate with Infisical when running in a GCP environment. Your machine identity ID. The authentication method to use. Must be `gcp-id-token` when using Native GCP ID Token. ```bash theme={"dark"} infisical relay start --auth-method=gcp-id-token --machine-identity-id= --host= --name= ``` The GCP IAM method is used to authenticate with Infisical with a GCP service account key. Your machine identity ID. Path to your GCP service account key file *(Must be in JSON format!)* The authentication method to use. Must be `gcp-iam` when using GCP IAM. ```bash theme={"dark"} infisical relay start --auth-method=gcp-iam --machine-identity-id= --service-account-key-file-path= --host= --name= ``` The AWS IAM method is used to authenticate with Infisical with an AWS IAM role while running in an AWS environment like EC2, Lambda, etc. Your machine identity ID. The authentication method to use. Must be `aws-iam` when using Native AWS IAM. ```bash theme={"dark"} infisical relay start --auth-method=aws-iam --machine-identity-id= --host= --name= ``` The OIDC Auth method is used to authenticate with Infisical via identity tokens with OIDC. Your machine identity ID. The OIDC JWT from the identity provider. The authentication method to use. Must be `oidc-auth` when using OIDC Auth. ```bash theme={"dark"} infisical relay start --auth-method=oidc-auth --machine-identity-id= --jwt= --host= --name= ``` The JWT Auth method is used to authenticate with Infisical via a JWT token. The JWT token to use for authentication. Your machine identity ID. The authentication method to use. Must be `jwt-auth` when using JWT Auth. ```bash theme={"dark"} infisical relay start --auth-method=jwt-auth --jwt= --machine-identity-id= --host= --name= ``` You can use the `INFISICAL_TOKEN` environment variable to authenticate with Infisical with a raw machine identity access token. The machine identity access token to use for authentication. ```bash theme={"dark"} infisical relay start --token= --host= --name= ``` Manage systemd service for Infisical relay. This allows you to install and run the relay as a systemd service on Linux systems. ### Requirements * **Operating System**: Linux only (systemd is not supported on other operating systems) * **Privileges**: Root/sudo privileges required for both install and uninstall operations * **Systemd**: The system must be running systemd as the init system ```bash theme={"dark"} infisical relay systemd ``` ### Subcommands Install and enable systemd service for the relay. Must be run with sudo on Linux systems. ```bash theme={"dark"} sudo infisical relay systemd install --host= --name= --token= [flags] ``` #### Flags The host (IP address or hostname) of the instance where the relay is deployed. This must be a static public IP or resolvable hostname that gateways can reach. ```bash theme={"dark"} # Example with IP address sudo infisical relay systemd install --host=203.0.113.100 --name=my-relay --token= # Example with hostname sudo infisical relay systemd install --host=relay.example.com --name=my-relay --token= ``` The name of the relay. ```bash theme={"dark"} # Example sudo infisical relay systemd install --name=my-relay --host=192.168.1.100 --token= ``` Connect with Infisical using machine identity access token. ```bash theme={"dark"} # Example sudo infisical relay systemd install --token= --host= --name= ``` Domain of your self-hosted Infisical instance. Optional flag for specifying a custom domain. ```bash theme={"dark"} # Example sudo infisical relay systemd install --domain=http://localhost:8080 --token= --host= --name= ``` #### Examples ```bash theme={"dark"} # Install relay with token authentication sudo infisical relay systemd install --host=192.168.1.100 --name=my-relay --token= # Install with custom domain sudo infisical relay systemd install --domain=http://localhost:8080 --token= --host= --name= ``` #### Post-installation After successful installation, the service will be enabled but not started. To start the service: ```bash theme={"dark"} sudo systemctl start infisical-relay ``` To check the service status: ```bash theme={"dark"} sudo systemctl status infisical-relay ``` To view service logs: ```bash theme={"dark"} sudo journalctl -u infisical-relay -f ``` Uninstall and remove systemd service for the relay. Must be run with sudo on Linux systems. ```bash theme={"dark"} sudo infisical relay systemd uninstall ``` #### Examples ```bash theme={"dark"} # Uninstall the relay systemd service sudo infisical relay systemd uninstall ``` #### What it does * Stops the `infisical-relay` systemd service if it's running * Disables the service from starting on boot * Removes the systemd service file * Cleans up the service configuration --- # Source: https://infisical.com/docs/self-hosting/guides/releases.md > ## Documentation Index > Fetch the complete documentation index at: https://infisical.com/docs/llms.txt > Use this file to discover all available pages before exploring further. # Release Channels > Learn how to configure your deployment for different release schedules. Infisical uses rolling release channels to deliver new features, security fixes, and improvements with different update frequencies. This system allows you to balance getting the latest features with maintaining stability in your deployment environment. ## What are release channels? Release channels define different schedules under which Infisical makes new releases available for you to deploy. Each channel operates on its own cadence, allowing you to choose how frequently you want to update your self-hosted deployment while balancing access to the latest features with your organization's stability requirements. ## Available Channels Infisical provides two distinct release channels with different update frequencies and stability profiles. * **Update Frequency**: Daily builds during weekdays (Monday-Friday) * **Versioning Strategy**: Nightly releases provide daily patches and features while making its way towards the next stable release * **Version Format**: `vX.Y.0-nightly-YYYYMMDD` where X.Y represents the next minor version increment from the latest stable release * **Multiple Daily Builds**: If multiple nightly builds are created on the same day, they are numbered incrementally: `vX.Y.0-nightly-YYYYMMDD.1`, `vX.Y.0-nightly-YYYYMMDD.2`, etc. * **Stability**: Latest features with standard CI/CD testing * **Release Process**: Built from main branch after all automated tests pass * **Intended Audience**: Development environments & early adopters **Best for:** * Organizations with flexible change management * Teams that want to test new features before they are made available via stable release channel **Characteristics:** * Access to latest features immediately * Pre-release versions of upcoming stable releases * Faster security patch delivery * Higher update frequency (daily) * **Update Frequency**: Monthly releases (typically 1st Tuesday of each month) * **Version Tags**: `vX.Y.Z` (e.g., `v0.145.0`, `v0.146.0`) * **Stability**: Both code tested and production-proven releases * **Release Process**: Features validated through nightly channel for 30+ days * **Intended Audience**: Production environments, enterprise teams prioritizing stability **Best for:** * Enterprise environments with limited change windows * Organizations requiring predictable release cycles * Teams prioritizing stability and long-term support **Characteristics:** * Predictable monthly schedule * Extensive testing and validation * Production-proven features Schedule Note: Target dates are approximate and subject to change based on critical issues, security updates, or maintenance requirements. ## Staying up to date Track what features are available in each version across different sources: * **Released versions**: View detailed changelogs, new features, and breaking changes in our [GitHub Releases](https://github.com/Infisical/infisical/releases) * **Docker Image Versions**: Browse available container images and tags on [Docker Hub](https://hub.docker.com/r/infisical/infisical) * **Linux Package Releases**: Access downloadable packages and version history on our [Linux releases page](https://cloudsmith.io/~infisical/repos/infisical-core/packages/) --- # Source: https://infisical.com/docs/integrations/frameworks/remix.md > ## Documentation Index > Fetch the complete documentation index at: https://infisical.com/docs/llms.txt > Use this file to discover all available pages before exploring further. # Remix > How to use Infisical to inject environment variables and secrets into a Remix app. Prerequisites: * Set up and add envars to [Infisical Cloud](https://app.infisical.com) * [Install the CLI](/cli/overview) ## Initialize Infisical for your [Remix](https://remix.run) app ```bash theme={"dark"} # navigate to the root of your of your project cd /path/to/project # then initialize Infisical infisical init ``` ## Start your application as usual but with Infisical ```bash theme={"dark"} infisical run -- # Example infisical run -- npm run dev ``` --- # Source: https://infisical.com/docs/api-reference/endpoints/pki/syncs/remove-certificates.md # Source: https://infisical.com/docs/api-reference/endpoints/pki/syncs/chef/remove-certificates.md # Source: https://infisical.com/docs/api-reference/endpoints/pki/syncs/azure-key-vault/remove-certificates.md # Source: https://infisical.com/docs/api-reference/endpoints/pki/syncs/aws-secrets-manager/remove-certificates.md # Source: https://infisical.com/docs/api-reference/endpoints/pki/syncs/aws-certificate-manager/remove-certificates.md > ## Documentation Index > Fetch the complete documentation index at: https://infisical.com/docs/llms.txt > Use this file to discover all available pages before exploring further. # Remove Certificates from AWS Certificate Manager > Remove certificates from the specified AWS Certificate Manager PKI Sync destination. ## OpenAPI ````yaml POST /api/v1/cert-manager/syncs/aws-certificate-manager/{pkiSyncId}/remove-certificates openapi: 3.0.3 info: title: Infisical API description: List of all available APIs that can be consumed version: 0.0.1 servers: - url: https://us.infisical.com description: Production server (US) - url: https://eu.infisical.com description: Production server (EU) - url: http://localhost:8080 description: Local server security: [] paths: /api/v1/cert-manager/syncs/aws-certificate-manager/{pkiSyncId}/remove-certificates: post: tags: - PKI Syncs description: >- Remove certificates from the specified AWS Certificate Manager PKI Sync destination. operationId: removeAwsCertificateManagerPkiSyncCertificates parameters: - schema: type: string in: path name: pkiSyncId required: true responses: '200': description: Default Response content: application/json: schema: type: object properties: message: type: string required: - message additionalProperties: false '400': description: Default Response content: application/json: schema: type: object properties: reqId: type: string statusCode: type: number enum: - 400 message: type: string error: type: string details: {} required: - reqId - statusCode - message - error additionalProperties: false '401': description: Default Response content: application/json: schema: type: object properties: reqId: type: string statusCode: type: number enum: - 401 message: type: string error: type: string required: - reqId - statusCode - message - error additionalProperties: false '403': description: Default Response content: application/json: schema: type: object properties: reqId: type: string statusCode: type: number enum: - 403 message: type: string details: {} error: type: string required: - reqId - statusCode - message - error additionalProperties: false '404': description: Default Response content: application/json: schema: type: object properties: reqId: type: string statusCode: type: number enum: - 404 message: type: string error: type: string required: - reqId - statusCode - message - error additionalProperties: false '422': description: Default Response content: application/json: schema: type: object properties: reqId: type: string statusCode: type: number enum: - 422 message: {} error: type: string required: - reqId - statusCode - error additionalProperties: false '500': description: Default Response content: application/json: schema: type: object properties: reqId: type: string statusCode: type: number enum: - 500 message: type: string error: type: string required: - reqId - statusCode - message - error additionalProperties: false ```` --- # Source: https://infisical.com/docs/api-reference/endpoints/groups/remove-group-user.md > ## Documentation Index > Fetch the complete documentation index at: https://infisical.com/docs/llms.txt > Use this file to discover all available pages before exploring further. # Remove Group User ## OpenAPI ````yaml DELETE /api/v1/groups/{id}/users/{username} openapi: 3.0.3 info: title: Infisical API description: List of all available APIs that can be consumed version: 0.0.1 servers: - url: https://us.infisical.com description: Production server (US) - url: https://eu.infisical.com description: Production server (EU) - url: http://localhost:8080 description: Local server security: [] paths: /api/v1/groups/{id}/users/{username}: delete: tags: - Groups operationId: removeUserFromGroup parameters: - schema: type: string in: path name: id required: true description: The ID of the group to remove the user from. - schema: type: string in: path name: username required: true description: The username of the user to remove from the group. responses: '200': description: Default Response content: application/json: schema: type: object properties: email: type: string nullable: true username: type: string firstName: type: string nullable: true lastName: type: string nullable: true id: type: string format: uuid required: - username - id additionalProperties: false '400': description: Default Response content: application/json: schema: type: object properties: reqId: type: string statusCode: type: number enum: - 400 message: type: string error: type: string details: {} required: - reqId - statusCode - message - error additionalProperties: false '401': description: Default Response content: application/json: schema: type: object properties: reqId: type: string statusCode: type: number enum: - 401 message: type: string error: type: string required: - reqId - statusCode - message - error additionalProperties: false '403': description: Default Response content: application/json: schema: type: object properties: reqId: type: string statusCode: type: number enum: - 403 message: type: string details: {} error: type: string required: - reqId - statusCode - message - error additionalProperties: false '404': description: Default Response content: application/json: schema: type: object properties: reqId: type: string statusCode: type: number enum: - 404 message: type: string error: type: string required: - reqId - statusCode - message - error additionalProperties: false '422': description: Default Response content: application/json: schema: type: object properties: reqId: type: string statusCode: type: number enum: - 422 message: {} error: type: string required: - reqId - statusCode - error additionalProperties: false '500': description: Default Response content: application/json: schema: type: object properties: reqId: type: string statusCode: type: number enum: - 500 message: type: string error: type: string required: - reqId - statusCode - message - error additionalProperties: false ```` --- # Source: https://infisical.com/docs/api-reference/endpoints/ssh/groups/remove-host.md # Remove Host > Remove an SSH Host from a Host Group ## OpenAPI ````yaml DELETE /api/v1/ssh/host-groups/{sshHostGroupId}/hosts/{hostId} paths: path: /api/v1/ssh/host-groups/{sshHostGroupId}/hosts/{hostId} method: delete servers: - url: https://us.infisical.com description: Production server (US) - url: https://eu.infisical.com description: Production server (EU) - url: http://localhost:8080 description: Local server request: security: [] parameters: path: sshHostGroupId: schema: - type: string required: true description: The ID of the SSH host group to delete the host from. hostId: schema: - type: string required: true description: The ID of the SSH host to delete from the SSH host group. query: {} header: {} cookie: {} body: {} response: '200': application/json: schemaArray: - type: object properties: id: allOf: - type: string format: uuid projectId: allOf: - type: string hostname: allOf: - type: string alias: allOf: - type: string nullable: true userCertTtl: allOf: - type: string hostCertTtl: allOf: - type: string userSshCaId: allOf: - type: string format: uuid hostSshCaId: allOf: - type: string format: uuid loginMappings: allOf: - type: array items: type: object properties: loginUser: type: string allowedPrincipals: type: object properties: usernames: type: array items: type: string groups: type: array items: type: string additionalProperties: false required: - loginUser - allowedPrincipals additionalProperties: false requiredProperties: - id - projectId - hostname - userCertTtl - hostCertTtl - userSshCaId - hostSshCaId - loginMappings additionalProperties: false examples: example: value: id: 3c90c3cc-0d44-4b50-8888-8dd25736052a projectId: hostname: alias: userCertTtl: hostCertTtl: userSshCaId: 3c90c3cc-0d44-4b50-8888-8dd25736052a hostSshCaId: 3c90c3cc-0d44-4b50-8888-8dd25736052a loginMappings: - loginUser: allowedPrincipals: usernames: - groups: - description: Default Response '400': application/json: schemaArray: - type: object properties: reqId: allOf: - type: string statusCode: allOf: - type: number enum: - 400 message: allOf: - type: string error: allOf: - type: string requiredProperties: - reqId - statusCode - message - error additionalProperties: false examples: example: value: reqId: statusCode: 400 message: error: description: Default Response '401': application/json: schemaArray: - type: object properties: reqId: allOf: - type: string statusCode: allOf: - type: number enum: - 401 message: allOf: - type: string error: allOf: - type: string requiredProperties: - reqId - statusCode - message - error additionalProperties: false examples: example: value: reqId: statusCode: 401 message: error: description: Default Response '403': application/json: schemaArray: - type: object properties: reqId: allOf: - type: string statusCode: allOf: - type: number enum: - 403 message: allOf: - type: string details: allOf: - {} error: allOf: - type: string requiredProperties: - reqId - statusCode - message - error additionalProperties: false examples: example: value: reqId: statusCode: 403 message: details: error: description: Default Response '404': application/json: schemaArray: - type: object properties: reqId: allOf: - type: string statusCode: allOf: - type: number enum: - 404 message: allOf: - type: string error: allOf: - type: string requiredProperties: - reqId - statusCode - message - error additionalProperties: false examples: example: value: reqId: statusCode: 404 message: error: description: Default Response '422': application/json: schemaArray: - type: object properties: reqId: allOf: - type: string statusCode: allOf: - type: number enum: - 422 message: allOf: - {} error: allOf: - type: string requiredProperties: - reqId - statusCode - error additionalProperties: false examples: example: value: reqId: statusCode: 422 message: error: description: Default Response '500': application/json: schemaArray: - type: object properties: reqId: allOf: - type: string statusCode: allOf: - type: number enum: - 500 message: allOf: - type: string error: allOf: - type: string requiredProperties: - reqId - statusCode - message - error additionalProperties: false examples: example: value: reqId: statusCode: 500 message: error: description: Default Response deprecated: false type: path components: schemas: {} ```` --- # Source: https://infisical.com/docs/api-reference/endpoints/project-users/remove-member-from-project.md # Source: https://infisical.com/docs/api-reference/endpoints/deprecated/project-users/remove-member-from-project.md > ## Documentation Index > Fetch the complete documentation index at: https://infisical.com/docs/llms.txt > Use this file to discover all available pages before exploring further. # Remove Member > Remove members from project ## OpenAPI ````yaml DELETE /api/v2/workspace/{projectId}/memberships openapi: 3.0.3 info: title: Infisical API description: List of all available APIs that can be consumed version: 0.0.1 servers: - url: https://us.infisical.com description: Production server (US) - url: https://eu.infisical.com description: Production server (EU) - url: http://localhost:8080 description: Local server security: [] paths: /api/v2/workspace/{projectId}/memberships: delete: tags: - Project Users description: Remove members from project parameters: - schema: type: string in: path name: projectId required: true description: The ID of the project to remove the member from. requestBody: content: application/json: schema: type: object properties: emails: type: array items: type: string format: email default: [] description: >- A list of organization member emails to remove from the project. usernames: type: array items: type: string default: [] description: A list of usernames to remove from the project. additionalProperties: false responses: '200': description: Default Response content: application/json: schema: type: object properties: memberships: type: array items: type: object properties: id: type: string format: uuid createdAt: type: string format: date-time updatedAt: type: string format: date-time userId: type: string format: uuid projectId: type: string required: - id - createdAt - updatedAt - userId - projectId additionalProperties: false required: - memberships additionalProperties: false '400': description: Default Response content: application/json: schema: type: object properties: reqId: type: string statusCode: type: number enum: - 400 message: type: string error: type: string details: {} required: - reqId - statusCode - message - error additionalProperties: false '401': description: Default Response content: application/json: schema: type: object properties: reqId: type: string statusCode: type: number enum: - 401 message: type: string error: type: string required: - reqId - statusCode - message - error additionalProperties: false '403': description: Default Response content: application/json: schema: type: object properties: reqId: type: string statusCode: type: number enum: - 403 message: type: string details: {} error: type: string required: - reqId - statusCode - message - error additionalProperties: false '404': description: Default Response content: application/json: schema: type: object properties: reqId: type: string statusCode: type: number enum: - 404 message: type: string error: type: string required: - reqId - statusCode - message - error additionalProperties: false '422': description: Default Response content: application/json: schema: type: object properties: reqId: type: string statusCode: type: number enum: - 422 message: {} error: type: string required: - reqId - statusCode - error additionalProperties: false '500': description: Default Response content: application/json: schema: type: object properties: reqId: type: string statusCode: type: number enum: - 500 message: type: string error: type: string required: - reqId - statusCode - message - error additionalProperties: false security: - bearerAuth: [] components: securitySchemes: bearerAuth: type: http scheme: bearer bearerFormat: JWT description: An access token in Infisical ```` --- # Source: https://infisical.com/docs/api-reference/endpoints/secret-syncs/zabbix/remove-secrets.md # Source: https://infisical.com/docs/api-reference/endpoints/secret-syncs/windmill/remove-secrets.md # Source: https://infisical.com/docs/api-reference/endpoints/secret-syncs/vercel/remove-secrets.md # Source: https://infisical.com/docs/api-reference/endpoints/secret-syncs/terraform-cloud/remove-secrets.md # Source: https://infisical.com/docs/api-reference/endpoints/secret-syncs/teamcity/remove-secrets.md # Source: https://infisical.com/docs/api-reference/endpoints/secret-syncs/supabase/remove-secrets.md # Source: https://infisical.com/docs/api-reference/endpoints/secret-syncs/render/remove-secrets.md # Source: https://infisical.com/docs/api-reference/endpoints/secret-syncs/railway/remove-secrets.md # Source: https://infisical.com/docs/api-reference/endpoints/secret-syncs/octopus-deploy/remove-secrets.md # Source: https://infisical.com/docs/api-reference/endpoints/secret-syncs/oci-vault/remove-secrets.md # Source: https://infisical.com/docs/api-reference/endpoints/secret-syncs/northflank/remove-secrets.md # Source: https://infisical.com/docs/api-reference/endpoints/secret-syncs/netlify/remove-secrets.md # Source: https://infisical.com/docs/api-reference/endpoints/secret-syncs/laravel-forge/remove-secrets.md # Source: https://infisical.com/docs/api-reference/endpoints/secret-syncs/humanitec/remove-secrets.md # Source: https://infisical.com/docs/api-reference/endpoints/secret-syncs/heroku/remove-secrets.md # Source: https://infisical.com/docs/api-reference/endpoints/secret-syncs/hashicorp-vault/remove-secrets.md # Source: https://infisical.com/docs/api-reference/endpoints/secret-syncs/gitlab/remove-secrets.md # Source: https://infisical.com/docs/api-reference/endpoints/secret-syncs/github/remove-secrets.md # Source: https://infisical.com/docs/api-reference/endpoints/secret-syncs/gcp-secret-manager/remove-secrets.md # Source: https://infisical.com/docs/api-reference/endpoints/secret-syncs/flyio/remove-secrets.md # Source: https://infisical.com/docs/api-reference/endpoints/secret-syncs/digital-ocean-app-platform/remove-secrets.md # Source: https://infisical.com/docs/api-reference/endpoints/secret-syncs/databricks/remove-secrets.md # Source: https://infisical.com/docs/api-reference/endpoints/secret-syncs/cloudflare-workers/remove-secrets.md # Source: https://infisical.com/docs/api-reference/endpoints/secret-syncs/cloudflare-pages/remove-secrets.md # Source: https://infisical.com/docs/api-reference/endpoints/secret-syncs/circleci/remove-secrets.md # Source: https://infisical.com/docs/api-reference/endpoints/secret-syncs/chef/remove-secrets.md # Source: https://infisical.com/docs/api-reference/endpoints/secret-syncs/checkly/remove-secrets.md # Source: https://infisical.com/docs/api-reference/endpoints/secret-syncs/camunda/remove-secrets.md # Source: https://infisical.com/docs/api-reference/endpoints/secret-syncs/bitbucket/remove-secrets.md # Source: https://infisical.com/docs/api-reference/endpoints/secret-syncs/azure-key-vault/remove-secrets.md # Source: https://infisical.com/docs/api-reference/endpoints/secret-syncs/azure-devops/remove-secrets.md # Source: https://infisical.com/docs/api-reference/endpoints/secret-syncs/azure-app-configuration/remove-secrets.md # Source: https://infisical.com/docs/api-reference/endpoints/secret-syncs/aws-secrets-manager/remove-secrets.md # Source: https://infisical.com/docs/api-reference/endpoints/secret-syncs/aws-parameter-store/remove-secrets.md # Source: https://infisical.com/docs/api-reference/endpoints/secret-syncs/1password/remove-secrets.md > ## Documentation Index > Fetch the complete documentation index at: https://infisical.com/docs/llms.txt > Use this file to discover all available pages before exploring further. # Remove Secrets > Remove previously synced secrets from the specified 1Password Sync destination. ## OpenAPI ````yaml POST /api/v1/secret-syncs/1password/{syncId}/remove-secrets openapi: 3.0.3 info: title: Infisical API description: List of all available APIs that can be consumed version: 0.0.1 servers: - url: https://us.infisical.com description: Production server (US) - url: https://eu.infisical.com description: Production server (EU) - url: http://localhost:8080 description: Local server security: [] paths: /api/v1/secret-syncs/1password/{syncId}/remove-secrets: post: tags: - Secret Syncs description: >- Remove previously synced secrets from the specified 1Password Sync destination. operationId: removeOnePasswordSecretSyncSecrets parameters: - schema: type: string format: uuid in: path name: syncId required: true description: The ID of the 1Password Sync to trigger removing secrets for. responses: '200': description: Default Response content: application/json: schema: type: object properties: secretSync: type: object properties: id: type: string format: uuid name: type: string description: type: string nullable: true isAutoSyncEnabled: type: boolean default: true version: type: number default: 1 projectId: type: string folderId: type: string format: uuid nullable: true connectionId: type: string format: uuid createdAt: type: string format: date-time updatedAt: type: string format: date-time syncStatus: type: string nullable: true lastSyncJobId: type: string nullable: true lastSyncMessage: type: string nullable: true lastSyncedAt: type: string format: date-time nullable: true importStatus: type: string nullable: true lastImportJobId: type: string nullable: true lastImportMessage: type: string nullable: true lastImportedAt: type: string format: date-time nullable: true removeStatus: type: string nullable: true lastRemoveJobId: type: string nullable: true lastRemoveMessage: type: string nullable: true lastRemovedAt: type: string format: date-time nullable: true syncOptions: type: object properties: initialSyncBehavior: type: string enum: - overwrite-destination - import-prioritize-source - import-prioritize-destination description: >- Specify how Infisical should resolve the initial sync to the 1Password destination. keySchema: type: string description: >- Specify the format to use for structuring secret keys in the 1Password destination. disableSecretDeletion: type: boolean description: >- Enable this flag to prevent removal of secrets from the 1Password destination when syncing. required: - initialSyncBehavior additionalProperties: false description: Optional parameters to modify how secrets are synced. connection: type: object properties: app: type: string enum: - 1password name: type: string id: type: string format: uuid required: - app - name - id additionalProperties: false environment: type: object properties: slug: type: string name: type: string id: type: string format: uuid required: - slug - name - id additionalProperties: false nullable: true folder: type: object properties: id: type: string path: type: string required: - id - path additionalProperties: false nullable: true destination: type: string enum: - 1password destinationConfig: type: object properties: vaultId: type: string minLength: 1 description: The ID of the 1Password vault to sync secrets to. valueLabel: type: string description: >- The label of the entry that holds the secret value. required: - vaultId additionalProperties: false required: - id - name - projectId - connectionId - createdAt - updatedAt - syncOptions - connection - environment - folder - destination - destinationConfig additionalProperties: false title: 1Password required: - secretSync additionalProperties: false '400': description: Default Response content: application/json: schema: type: object properties: reqId: type: string statusCode: type: number enum: - 400 message: type: string error: type: string details: {} required: - reqId - statusCode - message - error additionalProperties: false '401': description: Default Response content: application/json: schema: type: object properties: reqId: type: string statusCode: type: number enum: - 401 message: type: string error: type: string required: - reqId - statusCode - message - error additionalProperties: false '403': description: Default Response content: application/json: schema: type: object properties: reqId: type: string statusCode: type: number enum: - 403 message: type: string details: {} error: type: string required: - reqId - statusCode - message - error additionalProperties: false '404': description: Default Response content: application/json: schema: type: object properties: reqId: type: string statusCode: type: number enum: - 404 message: type: string error: type: string required: - reqId - statusCode - message - error additionalProperties: false '422': description: Default Response content: application/json: schema: type: object properties: reqId: type: string statusCode: type: number enum: - 422 message: {} error: type: string required: - reqId - statusCode - error additionalProperties: false '500': description: Default Response content: application/json: schema: type: object properties: reqId: type: string statusCode: type: number enum: - 500 message: type: string error: type: string required: - reqId - statusCode - message - error additionalProperties: false ```` --- # Source: https://infisical.com/docs/integrations/secret-syncs/render.md # Source: https://infisical.com/docs/integrations/app-connections/render.md > ## Documentation Index > Fetch the complete documentation index at: https://infisical.com/docs/llms.txt > Use this file to discover all available pages before exploring further. # Render Connection > Learn how to configure a Render Connection for Infisical. Infisical supports connecting to Render using API keys for secure access to your Render services. ## Configure API Key for Infisical Navigate to your Render dashboard and click on **Account Settings** in the top right corner. Account
    Settings In the Account Settings page, scroll down to the **API Keys** section and click **Create API Key**. Create API
    Key Enter a descriptive name for your API key (e.g., "production") and click **Create API Key**. Name API
    Key After creation, you'll be shown your API key. Make sure to copy and securely store this key as it will not be shown again. ## Setup Render Connection in Infisical Navigate to the **Integrations** tab in the desired project, then select **App Connections**. App Connections
    Tab Select the **Render Connection** option from the connection options modal. Select Render
    Connection Enter your Render API key in the provided field and click **Connect to Render** to establish the connection. Connect to
    Render Your **Render Connection** is now available for use in your Infisical projects. Render Connection
    Created --- # Source: https://infisical.com/docs/api-reference/endpoints/universal-auth/renew-access-token.md > ## Documentation Index > Fetch the complete documentation index at: https://infisical.com/docs/llms.txt > Use this file to discover all available pages before exploring further. # Renew Access Token > Renew machine identity access token ## OpenAPI ````yaml POST /api/v1/auth/token/renew openapi: 3.0.3 info: title: Infisical API description: List of all available APIs that can be consumed version: 0.0.1 servers: - url: https://us.infisical.com description: Production server (US) - url: https://eu.infisical.com description: Production server (EU) - url: http://localhost:8080 description: Local server security: [] paths: /api/v1/auth/token/renew: post: tags: - Universal Auth description: Renew machine identity access token operationId: renewIdentityAccessToken requestBody: content: application/json: schema: type: object properties: accessToken: type: string description: The access token to renew. required: - accessToken additionalProperties: false required: true responses: '200': description: Default Response content: application/json: schema: type: object properties: accessToken: type: string expiresIn: type: number accessTokenMaxTTL: type: number tokenType: type: string enum: - Bearer required: - accessToken - expiresIn - accessTokenMaxTTL - tokenType additionalProperties: false '400': description: Default Response content: application/json: schema: type: object properties: reqId: type: string statusCode: type: number enum: - 400 message: type: string error: type: string details: {} required: - reqId - statusCode - message - error additionalProperties: false '401': description: Default Response content: application/json: schema: type: object properties: reqId: type: string statusCode: type: number enum: - 401 message: type: string error: type: string required: - reqId - statusCode - message - error additionalProperties: false '403': description: Default Response content: application/json: schema: type: object properties: reqId: type: string statusCode: type: number enum: - 403 message: type: string details: {} error: type: string required: - reqId - statusCode - message - error additionalProperties: false '404': description: Default Response content: application/json: schema: type: object properties: reqId: type: string statusCode: type: number enum: - 404 message: type: string error: type: string required: - reqId - statusCode - message - error additionalProperties: false '422': description: Default Response content: application/json: schema: type: object properties: reqId: type: string statusCode: type: number enum: - 422 message: {} error: type: string required: - reqId - statusCode - error additionalProperties: false '500': description: Default Response content: application/json: schema: type: object properties: reqId: type: string statusCode: type: number enum: - 500 message: type: string error: type: string required: - reqId - statusCode - message - error additionalProperties: false ```` --- # Source: https://infisical.com/docs/api-reference/endpoints/dynamic-secrets/renew-lease.md > ## Documentation Index > Fetch the complete documentation index at: https://infisical.com/docs/llms.txt > Use this file to discover all available pages before exploring further. # Renew Lease ## OpenAPI ````yaml POST /api/v1/dynamic-secrets/leases/{leaseId}/renew openapi: 3.0.3 info: title: Infisical API description: List of all available APIs that can be consumed version: 0.0.1 servers: - url: https://us.infisical.com description: Production server (US) - url: https://eu.infisical.com description: Production server (EU) - url: http://localhost:8080 description: Local server security: [] paths: /api/v1/dynamic-secrets/leases/{leaseId}/renew: post: tags: - Dynamic Secrets parameters: - schema: type: string minLength: 1 in: path name: leaseId required: true description: The ID of the dynamic secret lease. requestBody: content: application/json: schema: type: object properties: ttl: type: string description: >- The renew TTL that gets added with current expiry (ensure it's below max TTL) for a total less than creation time + max TTL. projectSlug: type: string minLength: 1 description: The slug of the project of the dynamic secret in. path: type: string minLength: 1 default: / description: The path of the dynamic secret in. environmentSlug: type: string minLength: 1 description: The slug of the environment of the dynamic secret in. required: - projectSlug - environmentSlug additionalProperties: false required: true responses: '200': description: Default Response content: application/json: schema: type: object properties: lease: type: object properties: id: type: string format: uuid version: type: number externalEntityId: type: string expireAt: type: string format: date-time status: type: string nullable: true statusDetails: type: string nullable: true dynamicSecretId: type: string format: uuid createdAt: type: string format: date-time updatedAt: type: string format: date-time config: nullable: true required: - id - version - externalEntityId - expireAt - dynamicSecretId - createdAt - updatedAt additionalProperties: false required: - lease additionalProperties: false '400': description: Default Response content: application/json: schema: type: object properties: reqId: type: string statusCode: type: number enum: - 400 message: type: string error: type: string details: {} required: - reqId - statusCode - message - error additionalProperties: false '401': description: Default Response content: application/json: schema: type: object properties: reqId: type: string statusCode: type: number enum: - 401 message: type: string error: type: string required: - reqId - statusCode - message - error additionalProperties: false '403': description: Default Response content: application/json: schema: type: object properties: reqId: type: string statusCode: type: number enum: - 403 message: type: string details: {} error: type: string required: - reqId - statusCode - message - error additionalProperties: false '404': description: Default Response content: application/json: schema: type: object properties: reqId: type: string statusCode: type: number enum: - 404 message: type: string error: type: string required: - reqId - statusCode - message - error additionalProperties: false '422': description: Default Response content: application/json: schema: type: object properties: reqId: type: string statusCode: type: number enum: - 422 message: {} error: type: string required: - reqId - statusCode - error additionalProperties: false '500': description: Default Response content: application/json: schema: type: object properties: reqId: type: string statusCode: type: number enum: - 500 message: type: string error: type: string required: - reqId - statusCode - message - error additionalProperties: false ```` --- # Source: https://infisical.com/docs/api-reference/endpoints/certificates/renew.md # Source: https://infisical.com/docs/api-reference/endpoints/certificate-authorities/internal/renew.md > ## Documentation Index > Fetch the complete documentation index at: https://infisical.com/docs/llms.txt > Use this file to discover all available pages before exploring further. # Renew > Perform CA certificate renewal ## OpenAPI ````yaml POST /api/v1/cert-manager/ca/internal/{caId}/renew openapi: 3.0.3 info: title: Infisical API description: List of all available APIs that can be consumed version: 0.0.1 servers: - url: https://us.infisical.com description: Production server (US) - url: https://eu.infisical.com description: Production server (EU) - url: http://localhost:8080 description: Local server security: [] paths: /api/v1/cert-manager/ca/internal/{caId}/renew: post: tags: - PKI Certificate Authorities description: Perform CA certificate renewal operationId: renewCaCertificate parameters: - schema: type: string in: path name: caId required: true description: The ID of the CA to renew the CA certificate for. requestBody: content: application/json: schema: type: object properties: type: type: string enum: - existing description: >- The type of behavior to use for the renewal operation. Currently Infisical is only able to renew a CA certificate with the same key pair. notAfter: type: string description: >- The expiry date and time for the renewed CA certificate in YYYY-MM-DDTHH:mm:ss.sssZ format. required: - type - notAfter additionalProperties: false required: true responses: '200': description: Default Response content: application/json: schema: type: object properties: certificate: type: string description: The renewed CA certificate body. certificateChain: type: string description: The certificate chain of the CA. serialNumber: type: string description: The serial number of the renewed CA certificate. certId: type: string description: Certificate ID required: - certificate - certificateChain - serialNumber - certId additionalProperties: false '400': description: Default Response content: application/json: schema: type: object properties: reqId: type: string statusCode: type: number enum: - 400 message: type: string error: type: string details: {} required: - reqId - statusCode - message - error additionalProperties: false '401': description: Default Response content: application/json: schema: type: object properties: reqId: type: string statusCode: type: number enum: - 401 message: type: string error: type: string required: - reqId - statusCode - message - error additionalProperties: false '403': description: Default Response content: application/json: schema: type: object properties: reqId: type: string statusCode: type: number enum: - 403 message: type: string details: {} error: type: string required: - reqId - statusCode - message - error additionalProperties: false '404': description: Default Response content: application/json: schema: type: object properties: reqId: type: string statusCode: type: number enum: - 404 message: type: string error: type: string required: - reqId - statusCode - message - error additionalProperties: false '422': description: Default Response content: application/json: schema: type: object properties: reqId: type: string statusCode: type: number enum: - 422 message: {} error: type: string required: - reqId - statusCode - error additionalProperties: false '500': description: Default Response content: application/json: schema: type: object properties: reqId: type: string statusCode: type: number enum: - 500 message: type: string error: type: string required: - reqId - statusCode - message - error additionalProperties: false ```` --- # Source: https://infisical.com/docs/self-hosting/guides/replication.md > ## Documentation Index > Fetch the complete documentation index at: https://infisical.com/docs/llms.txt > Use this file to discover all available pages before exploring further. # Replication > Learn how Infisical supports multi-region replication Infisical replication 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 [team@infisical.com](mailto:team@infisical.com) to purchase an enterprise license to use it. Multi-region replication is available in Infisical Enterprise to support globally distributed deployments. Understanding the architecture, use cases, and operational considerations is essential before implementing this feature in production environments. Infisical uses a primary/secondary (1:N) architecture with asynchronous PostgreSQL replication. This design prioritizes high availability and minimal read latency for applications deployed across multiple geographic regions. ## Use cases * **Multi-Region Deployments**: Serving secrets to applications distributed across continents from a single region introduces unacceptable latency. A centralized deployment also creates a single point of failure: regional outages can render secrets inaccessible globally, and network connectivity issues impact availability. * **Geographic Data Locality**: Global organizations need to minimize the time it takes for applications to retrieve secrets and configurations. Regional replicas enable applications to fetch data from nearby instances rather than making cross-continental requests. * **Disaster Recovery**: Organizations need resilience against primary region failures. Secondary regions with read replicas can be promoted to primary status when needed, maintaining operations during outages or disasters. ## Design Goals In order to address the common use cases, the implementation reflects several core goals: * **Optimized Read Performance**: Applications need fast access to secrets regardless of their location. Regional instances use Redis for aggressive caching and read from local PostgreSQL replicas, eliminating cross-region round trips for most read operations. * **Conflict-Free Architecture**: All mutations flow through the primary instance exclusively. This prevents write conflicts and split-brain scenarios that plague multi-master systems. The trade-off ensures data integrity without requiring conflict resolution strategies. * **Zero Client Changes**: Existing Infisical integrations, SDKs, and CLI tools work without modification. Regional instances route write operations to the primary while handling reads locally. Authentication tokens and API keys function identically across all instances. * **Operational Simplicity**: Deploying additional regions requires minimal configuration. PostgreSQL handles replication complexity, and the stateless application tier scales horizontally without coordination overhead. # Architecture Infisical distinguishes between *primary* and *secondary* instances. The primary holds write authority and is the sole instance permitted to modify the PostgreSQL database. Secondary instances handle read traffic locally and proxy write operations to the primary. ## Infrastructure components Two data stores form Infisical's persistence layer: * **PostgreSQL** maintains the authoritative dataset including secrets with their version history, authentication credentials, user identities, project configurations, access policies, audit trails, and integration settings. All persistent state lives in PostgreSQL. * **Redis** accelerates read operations through caching and manages asynchronous job queues. Each regional deployment maintains an independent Redis instance optimized for local access patterns. The Infisical application servers are stateless and therefore hold no persistent data internally. This design simplifies regional deployment and horizontal scaling. A primary deployment consists of three core components: * **Application Servers**: Process all API requests directly, handling both read and write operations without forwarding * **PostgreSQL Primary Database**: Accepts read and write queries, serving as the authoritative source of truth * **Redis Cache**: Stores frequently accessed data and executes all background jobs including secret synchronization, scheduled tasks, and audit log processing Each secondary deployment mirrors the primary structure with key differences: * **Application Servers**: Service read requests from local infrastructure but forward any write requests to the primary region * **PostgreSQL Read Replica**: Continuously streams changes from the primary database via PostgreSQL replication * **PostgreSQL Primary Database**: Connection string to the primary database for write forwarding * **Redis Cache**: Maintains a local cache but processes only audit logs (other background jobs remain disabled) Configuring a secondary region requires four main environment variables: 1. `INFISICAL_PRIMARY_INSTANCE_URL`: The primary region's Infisical API endpoint 2. Postgres primary instance connection details. View related [environment variables](/self-hosting/configuration/envars#postgresql). 3. Postgres read replica connection details. View related [environment variables](/self-hosting/configuration/envars#postgresql). 4. Redis connection details. View related [environment variables](/self-hosting/configuration/envars#redis). ## How requests are processed When a client sends a read request to a secondary instance, the application first checks the local Redis cache for the requested data. If the data exists in cache, it's returned immediately to the client. Otherwise, the application queries the local PostgreSQL read replica, caches the result in Redis for future requests, and returns the response to the client. Write operations follow a different path. When a secondary receives a write request, it forwards the complete request to the primary instance URL. The primary processes the mutation against the authoritative database and returns a response, which the secondary then forwards back to the client. PostgreSQL subsequently streams these changes to all replicas asynchronously. Operations against the primary instance are more straightforward, as both reads and writes execute directly against local infrastructure without any forwarding. ## Replication mechanism PostgreSQL streaming replication handles all data synchronization. When transactions commit on the primary, changes are written to the write-ahead log (WAL) and streamed to all configured replicas, which apply the entries to maintain consistency. Replication lag typically remains under one second. This approach replicates all data stored in PostgreSQL: secrets and their version histories, user accounts and permissions, authentication tokens, project configurations, access policies, audit logs, integration settings, and all other application metadata. Replicas are eventually consistent. This means that all replicas eventually converge to the same state, typically under 1 second. The application layer remains unaware of replication mechanics and operates identically across all instances. ## Caching behavior Redis caches are regional and independent (no coordination occurs between instances): * Secondary instances populate caches on demand from read requests * Cache hits serve data without touching PostgreSQL * Cache misses fetch from the local replica and populate the cache * Each region maintains its own hot dataset based on local access patterns Secrets use versioned caching. When a secret changes, its version identifier changes, causing automatic cache misses. This ensures subsequent reads fetch the updated value from PostgreSQL without requiring active cache invalidation. # Technical Details Understanding the implementation details can help evaluate whether Infisical's replication characteristics align with your requirements. The following sections provide deeper insight into performance behavior, failure modes, and the underlying mechanisms that drive the replication system. ### PostgreSQL streaming replication Infisical relies on PostgreSQL's native replication, which provides: * **Asynchronous operation**: The primary commits transactions immediately without waiting for replicas to confirm receipt. Replicas receive and apply changes continuously with typical lag measured in milliseconds to low seconds, depending on network conditions and write volume. * **Binary-level consistency**: Replication occurs at the storage layer using write-ahead logs, guaranteeing replicas are byte-for-byte identical to the primary at the block level. * **Promotion capability**: Read replicas can be promoted to primary during disaster recovery. Promotion requires updating Infisical configuration to designate the promoted instance as primary and reconfiguring other secondaries. Consult PostgreSQL's official documentation for replication setup instructions specific to your hosting environment (RDS, Cloud SQL, self-managed, etc.). ### Version management All Infisical instances must run identical versions (mixing versions risks database schema mismatches or incompatible API behavior). Database migrations execute only on the primary and replicate to secondaries through standard PostgreSQL mechanisms. During upgrades: 1. Upgrade the primary instance (migrations run automatically) 2. Upgrade secondary instances to match 3. All instances can continue running during the upgrade process since database migrations don't immediately drop tables/columns ### Request proxying When a secondary receives a mutation request (POST, PUT, PATCH, DELETE), it functions as a transparent proxy: 1. Preserve the original request completely (headers, authentication context, request body) 2. Forward to the primary instance URL specified in configuration 3. Primary processes the request as a direct client request 4. Return the primary's response unmodified to the client ### Cache management Infisical uses versioned caching rather than active invalidation: 1. Secrets and other cached entities include version identifiers 2. When data mutates, its version changes in the database 3. Cache lookups include the version in the cache key 4. Version changes cause automatic cache misses 5. Cache misses fetch updated data from PostgreSQL 6. Fresh data populates the cache with the new version This strategy ensures correctness without requiring cross-region cache invalidation protocols. ### Background job processing Secondary instances run with restricted background job capabilities: **Active**: Audit log processing\ **Disabled**: Secret synchronization to third-party systems, scheduled tasks, cron jobs, time-triggered operations Limiting background jobs to the primary prevents duplicate processing and ensures integrations execute once. --- # Source: https://infisical.com/docs/documentation/platform/pki/guides/request-cert-acme.md > ## Documentation Index > Fetch the complete documentation index at: https://infisical.com/docs/llms.txt > Use this file to discover all available pages before exploring further. # Obtain a Certificate via ACME The [ACME enrollment method](/documentation/platform/pki/enrollment-methods/acme) lets any [ACME client](https://letsencrypt.org/docs/client-options/) obtain TLS certificates from Infisical using the [ACME protocol](https://en.wikipedia.org/wiki/Automatic_Certificate_Management_Environment). This includes ACME clients like [Certbot](https://certbot.eff.org/), [cert-manager](https://cert-manager.io/) in Kubernetes using the [ACME issuer type](https://cert-manager.io/docs/configuration/acme/), and more. Infisical currently supports the [HTTP-01 challenge type](https://letsencrypt.org/docs/challenge-types/#http-01-challenge) for domain validation as part of the ACME enrollment method. ## Diagram The following sequence diagram illustrates the certificate enrollment workflow for requesting a certificate via ACME from Infisical. ```mermaid theme={"dark"} sequenceDiagram autonumber participant ACME as ACME Client participant Infis as Infisical ACME Server participant Authz as HTTP-01 Challenge
Validation Endpoint participant CA as CA
(Internal or External) Note over ACME: ACME Client discovers
Infisical ACME Directory URL ACME->>Infis: GET /directory Infis-->>ACME: Directory + nonce + endpoints ACME->>Infis: HEAD /new-nonce Infis-->>ACME: Return nonce in Replay-Nonce header ACME->>Infis: POST /new-account
(contact, ToS agreed) Infis-->>ACME: Return account object Note over ACME,Infis: Requesting a certificate ACME->>Infis: POST /new-order
(identifiers: DNS names) Infis-->>ACME: Return order
with authorization URLs loop For each authorization (one per DNS name) ACME->>Infis: POST /authorizations/:authzId Infis-->>ACME: Return HTTP-01 challenge
(URL + token + keyAuth) Note over ACME: Client must prove control
over the domain via HTTP ACME->>Authz: Provision challenge response
at
/.well-known/acme-challenge/ ACME->>Infis: POST /authorizations/:authzId/challenges/:challengeId
(trigger validation) Infis->>Authz: HTTP GET /.well-known/acme-challenge/ Authz-->>Infis: Return keyAuth Infis-->>ACME: Authorization = valid end Note over Infis: All authorizations valid → ready to finalize ACME->>ACME: Generate keypair locally
and create CSR ACME->>Infis: POST /orders/:orderId/finalize
(CSR) Infis->>CA: Request certificate issuance
(CSR) CA-->>Infis: Signed certificate (+ chain) Infis-->>ACME: Return order with certificate URL
(status: valid) ACME->>Infis: POST /orders/:orderId/certificate Infis-->>ACME: Return certificate
and certificate chain ``` ## Guide In the following steps, we explore an end-to-end workflow for obtaining a certificate via ACME with Infisical. Before you can issue any certificate, you must first configure a [Certificate Authority (CA)](/documentation/platform/pki/ca/overview). The CA you configure will be used to issue the certificate back to your client; it can be either Internal or External: * [Internal CA](/documentation/platform/pki/ca/private-ca): If you're building your own PKI and wish to issue certificates for internal use, you should follow the guide [here](/documentation/platform/pki/ca/private-ca#guide-to-creating-a-ca-hierarchy) to create at minimum a root CA and an intermediate/issuing CA within Infisical. * [External CA](/documentation/platform/pki/ca/external-ca): If you have existing PKI infrastructure or wish to connect to a public CA (e.g. [Let's Encrypt](/documentation/platform/pki/ca/lets-encrypt), [DigiCert](/documentation/platform/pki/ca/digicert), etc.) to issue TLS certificates, you should follow the documentation [here](/documentation/platform/pki/ca/external-ca) to configure an External CA. Note that if you're looking to issue self-signed certificates, you can skip this step and proceed to Step 3. Next, follow the guide [here](/documentation/platform/pki/certificates/policies#guide-to-creating-a-certificate-policy) to create a [certificate policy](/documentation/platform/pki/certificates/policies). The certificate policy will constrain what attributes may or may not be allowed in the request to issue a certificate. For example, you can specify that the requested common name must adhere to a specific format like `*.acme.com` and that the maximum TTL cannot exceed 1 year. If you're looking to issue TLS server certificates, you should select the **TLS Server Certificate** option under the **Policy Preset** dropdown. Next, follow the guide [here](/documentation/platform/pki/certificates/profiles#guide-to-creating-a-certificate-profile) to create a [certificate profile](/documentation/platform/pki/certificates/profiles) that will be referenced when requesting a certificate. The certificate profile specifies which certificate policy and issuing CA should be used to validate an incoming certificate request and issue a certificate; it also specifies the [enrollment method](/documentation/platform/pki/enrollment-methods/overview) for how certificates can be requested against this profile to begin with. You should specify the certificate policy from Step 2, the issuing CA from Step 1, and the **ACME** option in the **Enrollment Method** dropdown when creating the certificate profile. Finally, follow the guide [here](/documentation/platform/pki/enrollment-methods/acme#guide-to-certificate-enrollment-via-acme) to request a certificate against the certificate profile using an [ACME client](https://letsencrypt.org/docs/client-options/). The ACME client will connect to Infisical's ACME server at the **ACME Directory URL** and authenticate using the **EAB Key Identifier (KID)** and **EAB Secret** credentials as part of the ACME protocol. The typical ACME workflow looks likes this: * The ACME client creates (or reuses) an ACME account with Infisical using EAB credentials. * The ACME client creates an order for one or more DNS names. * For each DNS name, the ACME client receives an `HTTP-01` challenge and provisions the corresponding token response at `/.well-known/acme-challenge/<token>`. * Once all authorizations are valid, the ACME client finalizes the order by sending a CSR to Infisical. * Infisical issues the certificate from the issuing CA on the certificate profile and returns it (plus the chain) back to the ACME client. ACME clients typically handle renewal by tracking certificate expiration and completing the lifecycle once again to request a new certificate. We recommend reading more about the ACME protocol [here](https://letsencrypt.org/how-it-works/). --- # Source: https://infisical.com/docs/documentation/platform/pki/guides/request-cert-agent.md > ## Documentation Index > Fetch the complete documentation index at: https://infisical.com/docs/llms.txt > Use this file to discover all available pages before exploring further. # Request a Certificate via the Infisical Agent The [Infisical Agent](/integrations/platforms/certificate-agent) is an installable client daemon that can request TLS and other X.509 certificates from Infisical using the [API enrollment method](/documentation/platform/pki/enrollment-methods/api) configured on a [certificate profile](/documentation/platform/pki/certificates/profiles), persist it to a specified path on the filesystem, and automatically monitor and renew it before expiration. Instead of [manually requesting](/documentation/platform/pki/guides/request-cert-api) and renewing a certificate via the [Issue Certificate](/api-reference/endpoints/certificates/create-certificate) API endpoint, you can install and launch the Infisical Agent to have it perform these steps for you automatically. ## Diagram The following sequence diagram illustrates the certificate enrollment workflow for requesting a certificate using the Infisical Agent from Infisical. ```mermaid theme={"dark"} sequenceDiagram autonumber participant Agent as Infisical Agent participant Infis as Infisical participant CA as CA
(Internal or External) Agent->>Infis: Request certificate
(profileId, conditional subject/SANs, ttl,
key usages, conditional CSR, etc.) Infis->>Infis: Look up certificate profile
(by profileId) Infis->>Infis: Validate request
against profile constraints
(CN/SAN rules, key usages, max TTL, etc.) alt Issuer Type = Self-Signed Infis->>Infis: Generate keypair
and self-sign certificate else Issuer Type = Internal CA Infis->>CA: Request certificate issuance CA-->>Infis: Signed certificate
(+ chain) end Infis-->>Agent: Return certificate, certificate chain,
(and private key if server-generated) Note over Agent: Persist certificate and begin lifecycle monitoring loop Periodic certificate status check Agent->>Agent: Check certificate expiration
against renew-before-expiry threshold alt Renewal not required Agent-->>Agent: Continue monitoring else Renewal required Agent->>Infis: Request new certificate
(same profile and constraints) Infis->>Infis: Validate renewal request
against profile constraints alt Issuer Type = Self-Signed Infis->>Infis: Generate keypair
and self-sign certificate else Issuer Type = Internal CA Infis->>CA: Request certificate issuance CA-->>Infis: Signed certificate
(+ chain) end Infis-->>Agent: Return renewed certificate, certificate chain, and private key end end ``` ## Guide In the following steps, we explore an end-to-end workflow for requesting and continuously renewing a certificate using the Infisical Agent. Before you can issue any certificate, you must first configure a [Certificate Authority (CA)](/documentation/platform/pki/ca/overview). The CA you configure will be used to issue the certificate back to your client; it can be either Internal or External: * [Internal CA](/documentation/platform/pki/ca/private-ca): If you're building your own PKI and wish to issue certificates for internal use, you should follow the guide [here](/documentation/platform/pki/ca/private-ca#guide-to-creating-a-ca-hierarchy) to create at minimum a root CA and an intermediate/issuing CA within Infisical. * [External CA](/documentation/platform/pki/ca/external-ca): If you have existing PKI infrastructure or wish to connect to a public CA (e.g. [Let's Encrypt](/documentation/platform/pki/ca/lets-encrypt), [DigiCert](/documentation/platform/pki/ca/digicert), etc.) to issue TLS certificates, you should follow the documentation [here](/documentation/platform/pki/ca/external-ca) to configure an External CA. Note that if you're looking to issue self-signed certificates, you can skip this step and proceed to Step 3. Next, follow the guide [here](/documentation/platform/pki/certificates/policies#guide-to-creating-a-certificate-policy) to create a [certificate policy](/documentation/platform/pki/certificates/policies). The certificate policy will constrain what attributes may or may not be allowed in the request to issue a certificate. For example, you can specify that the requested common name must adhere to a specific format like `*.acme.com` and that the maximum TTL cannot exceed 1 year. If you're looking to issue TLS server certificates, you should select the **TLS Server Certificate** option under the **Policy Preset** dropdown. Next, follow the guide [here](/documentation/platform/pki/certificates/profiles#guide-to-creating-a-certificate-profile) to create a [certificate profile](/documentation/platform/pki/certificates/profiles) that will be referenced when requesting a certificate. The certificate profile specifies which certificate policy and issuing CA should be used to validate an incoming certificate request and issue a certificate; it also specifies the [enrollment method](/documentation/platform/pki/enrollment-methods/overview) for how certificates can be requested against this profile to begin with. You should specify the certificate policy from Step 2, the issuing CA from Step 1, and the **API** option in the **Enrollment Method** dropdown when creating the certificate profile. Note that if you're looking to issue self-signed certificates, you should select the **Self-Signed** option in the **Issuer Type** dropdown when creating the certificate profile. Next, [install the Infisical CLI](/cli/overview) on the target machine you wish to request the certificate on and follow the documentation [here](/integrations/platforms/certificate-agent#operating-the-agent) to set up the Infisical Agent on it. As part of the setup, you must create an [agent configuration file](/integrations/platforms/certificate-agent#agent-configuration) that specifies how the agent should authenticate with Infisical using a [machine identity](/documentation/platform/identities/machine-identities), the certificate profile it should request against (from Step 3), what kind of certificate to request, where to persist the certificate, and how it should be managed in terms of auto-renewal. Finally, start the agent with that configuration file so it can start requesting and continuously renewing the certificate on your behalf using the command below: ```bash theme={"dark"} infisical cert-manager agent --config /path/to/your/agent-config.yaml ``` The certificate, certificate chain, and private key will be persisted to the filesystem at the paths specified in the `file-output` section of the agent configuration file. --- # Source: https://infisical.com/docs/documentation/platform/pki/guides/request-cert-api.md > ## Documentation Index > Fetch the complete documentation index at: https://infisical.com/docs/llms.txt > Use this file to discover all available pages before exploring further. # Request a Certificate via API The [API enrollment method](/documentation/platform/pki/enrollment-methods/api) lets you programmatically request TLS and other X.509 certificates from Infisical. This is the most flexible way to request certificates from Infisical but requires you to implement certificate request and renewal logic on your own. For a more automated way to request certificates, we highly recommend you check out the guide for requesting certificates using the [Infisical Agent](/integrations/platforms/certificate-agent) [here](/documentation/platform/pki/guides/request-cert-agent). ## Diagram The following sequence diagram illustrates the certificate issuance workflow for requesting a certificate via API from Infisical. ```mermaid theme={"dark"} sequenceDiagram autonumber participant Client as Client participant Infis as Infisical participant CA as CA
(Internal or External) Client->>Infis: POST /certificate
(profileId, conditional subject/SANs, ttl,
key usages, conditional CSR, etc.) Infis->>Infis: Look up certificate profile
(by profileId) Infis->>Infis: Validate request or CSR
against profile constraints
(CN/SAN rules, key usages, max TTL, etc.) alt Issuer Type = Self-Signed Infis->>Infis: Generate keypair
and self-sign certificate else Issuer Type = CA Infis->>CA: Request certificate issuance
(CSR) CA-->>Infis: Signed certificate
(+ chain) end Infis-->>Client: Return certificate, certificate chain,
issuing CA certificate, serial number,
certificate ID
(and private key if server-generated)
OR certificate request ID if async ``` ## Guide In the following steps, we explore an end-to-end workflow for requesting a certificate via API from Infisical. Before you can issue any certificate, you must first configure a [Certificate Authority (CA)](/documentation/platform/pki/ca/overview). The CA you configure will be used to issue the certificate back to your client; it can be either Internal or External: * [Internal CA](/documentation/platform/pki/ca/private-ca): If you're building your own PKI and wish to issue certificates for internal use, you should follow the guide [here](/documentation/platform/pki/ca/private-ca#guide-to-creating-a-ca-hierarchy) to create at minimum a root CA and an intermediate/issuing CA within Infisical. * [External CA](/documentation/platform/pki/ca/external-ca): If you have existing PKI infrastructure or wish to connect to a public CA (e.g. [Let's Encrypt](/documentation/platform/pki/ca/lets-encrypt), [DigiCert](/documentation/platform/pki/ca/digicert), etc.) to issue TLS certificates, you should follow the documentation [here](/documentation/platform/pki/ca/external-ca) to configure an External CA. Note that if you're looking to issue self-signed certificates, you can skip this step and proceed to Step 3. Next, follow the guide [here](/documentation/platform/pki/certificates/policies#guide-to-creating-a-certificate-policy) to create a [certificate policy](/documentation/platform/pki/certificates/policies). The certificate policy will constrain what attributes may or may not be allowed in the request to issue a certificate. For example, you can specify that the requested common name must adhere to a specific format like `*.acme.com` and that the maximum TTL cannot exceed 1 year. If you're looking to issue TLS server certificates, you should select the **TLS Server Certificate** option under the **Policy Preset** dropdown. Next, follow the guide [here](/documentation/platform/pki/certificates/profiles#guide-to-creating-a-certificate-profile) to create a [certificate profile](/documentation/platform/pki/certificates/profiles) that will be referenced when requesting a certificate. The certificate profile specifies which certificate policy and issuing CA should be used to validate an incoming certificate request and issue a certificate; it also specifies the [enrollment method](/documentation/platform/pki/enrollment-methods/overview) for how certificates can be requested against this profile to begin with. You should specify the certificate policy from Step 2, the issuing CA from Step 1, and the **API** option in the **Enrollment Method** dropdown when creating the certificate profile. Note that if you're looking to issue self-signed certificates, you should select the **Self-Signed** option in the **Issuer Type** dropdown when creating the certificate profile. Finally, follow the guide [here](/documentation/platform/pki/enrollment-methods/api#guide-to-certificate-enrollment-via-api) to request a certificate against the certificate profile over the Web UI or by making an API request the [Issue Certificate](/api-reference/endpoints/certificates/create-certificate) API endpoint with or without a certificate signing request (CSR). To renew a certificate on the client-side, you have two options: * Make a request to issue a new certificate against the same [Issue Certificate](/api-reference/endpoints/certificates/create-certificate) API endpoint. * Make a request to the [Renew Certificate](/api-reference/endpoints/certificates/renew) API endpoint with the ID of the certificate you wish to renew. Note that this endpoint only works if the original certificate was issued through the [Issue Certificate](/api-reference/endpoints/certificates/issue-certificate) API endpoint without a CSR. We recommend reading the guide [here](/documentation/platform/pki/certificates/certificates#guide-to-renewing-certificates) to learn more about all the ways to renew a certificate with Infisical including [server-driven certificate renewal](/documentation/platform/pki/certificates/certificates#server-driven-certificate-renewal). Note that depending on your environment and infrastructure use-case, you may wish to use a different [enrollment method](/documentation/platform/pki/enrollment-methods/overview) to request certificates. For more automated certificate management, you may wish to request certificates using a client that can monitor expiring certificates and request renewals for you. For example, you can install the Infisical Agent on a VM and have it request and renew certificates for you or use an [ACME client](https://letsencrypt.org/docs/client-options/) paired with Infisical's [ACME enrollment method](/documentation/platform/pki/enrollment-methods/acme). --- # Source: https://infisical.com/docs/documentation/platform/pki/guides/request-cert-csr.md > ## Documentation Index > Fetch the complete documentation index at: https://infisical.com/docs/llms.txt > Use this file to discover all available pages before exploring further. # Issue a Certificate with CSR > Learn how to issue certificates using a Certificate Signing Request (CSR) to maintain control of your private keys The [API enrollment method](/documentation/platform/pki/enrollment-methods/api) supports issuing certificates using a Certificate Signing Request (CSR). This allows you to manage your own private key externally while having Infisical sign the certificate. ## When to Use CSR-Based Issuance CSR-based certificate issuance is recommended when: * You need to maintain control of your private key * Your security policy requires keys to be generated on the target system * You're integrating with Hardware Security Modules (HSMs) * You want to use a specific key that already exists * You're working with systems that generate their own CSRs (e.g., load balancers, network appliances) ## Generating a CSR Prior to requesting a certificate, a Certificate Signing Request (CSR) must be generated. While multiple tools and workflows are available, the example below illustrates how to generate a CSR using OpenSSL. ### Generate a New Key and CSR ```bash theme={"dark"} # Generate a new RSA private key and CSR openssl req -new -newkey rsa:2048 -nodes \ -keyout private.key \ -out request.csr \ -subj "/CN=service.example.com/O=My Organization/C=US" ``` ### Generate CSR from Existing Key ```bash theme={"dark"} # Generate CSR from an existing private key openssl req -new -key private.key -out request.csr \ -subj "/CN=service.example.com" ``` ### Generate CSR with Subject Alternative Names ```bash theme={"dark"} # Generate CSR with SANs openssl req -new -newkey rsa:2048 -nodes \ -keyout private.key \ -out request.csr \ -subj "/CN=service.example.com" \ -addext "subjectAltName=DNS:service.example.com,DNS:www.service.example.com,IP:192.168.1.1" ``` ### Generate CSR with ECDSA Key ```bash theme={"dark"} # Generate ECDSA P-256 key and CSR openssl ecparam -genkey -name prime256v1 -out private.key openssl req -new -key private.key -out request.csr \ -subj "/CN=service.example.com" ``` ### Verify Your CSR Before submitting, verify your CSR contents: ```bash theme={"dark"} openssl req -in request.csr -noout -text ``` ## CSR Format Requirements Your CSR must meet the following requirements: * **Format**: PEM-encoded PKCS#10 Certificate Signing Request * **Required header**: `-----BEGIN CERTIFICATE REQUEST-----` * **Required footer**: `-----END CERTIFICATE REQUEST-----` ### Supported Key Algorithms | Algorithm | Supported Sizes/Curves | | --------- | ---------------------- | | RSA | 2048, 3072, 4096 bits | | ECDSA | P-256, P-384, P-521 | ### Supported Signature Algorithms | Key Type | Supported Hash Algorithms | | -------- | ------------------------- | | RSA | SHA-256, SHA-384, SHA-512 | | ECDSA | SHA-256, SHA-384, SHA-512 | ## Guide Before you can issue any certificate, you must first configure a [Certificate Authority (CA)](/documentation/platform/pki/ca/overview). The CA you configure will be used to issue the certificate back to your client; it can be either Internal or External: * [Internal CA](/documentation/platform/pki/ca/private-ca): If you're building your own PKI and wish to issue certificates for internal use, you should follow the guide [here](/documentation/platform/pki/ca/private-ca#guide-to-creating-a-ca-hierarchy) to create at minimum a root CA and an intermediate/issuing CA within Infisical. * [External CA](/documentation/platform/pki/ca/external-ca): If you have existing PKI infrastructure or wish to connect to a public CA (e.g. [Let's Encrypt](/documentation/platform/pki/ca/lets-encrypt), [DigiCert](/documentation/platform/pki/ca/digicert), etc.) to issue TLS certificates, you should follow the documentation [here](/documentation/platform/pki/ca/external-ca) to configure an External CA. Note that if you're looking to issue self-signed certificates, you can skip this step and proceed to Step 3. Next, follow the guide [here](/documentation/platform/pki/certificates/policies#guide-to-creating-a-certificate-policy) to create a [certificate policy](/documentation/platform/pki/certificates/policies). The certificate policy will constrain what attributes may or may not be allowed in the request to issue a certificate. For example, you can specify that the requested common name must adhere to a specific format like `*.acme.com` and that the maximum TTL cannot exceed 1 year. If you're looking to issue TLS server certificates, you should select the **TLS Server Certificate** option under the **Policy Preset** dropdown. Next, follow the guide [here](/documentation/platform/pki/certificates/profiles#guide-to-creating-a-certificate-profile) to create a [certificate profile](/documentation/platform/pki/certificates/profiles) that will be referenced when requesting a certificate. The certificate profile specifies which certificate policy and issuing CA should be used to validate an incoming certificate request and issue a certificate. You should specify the certificate policy from Step 2, the issuing CA from Step 1, and the **API** option in the **Enrollment Method** dropdown when creating the certificate profile. CSR-based issuance requires a Certificate Authority. Self-signed certificates are not supported when using a CSR. To issue a certificate using your CSR, navigate to your Project > Certificates > Certificate Requests and click **Request**. pki certificates Select **CSR (Certificate Signing Request)** as the **Request Method**, then choose your certificate profile. pki certificate issue modal Paste your PEM-encoded CSR into the text area and specify the TTL for the certificate. pki certificate issue modal csr When using a CSR, the subject attributes, subject alternative names, and key algorithm are extracted from your CSR. You only need to specify the TTL for the certificate. To issue a certificate with a CSR, make an API request to the [Issue Certificate](/api-reference/endpoints/certificates/create-certificate) API endpoint with your PEM-encoded CSR. ### Sample request ```bash Request theme={"dark"} curl --location --request POST 'https://app.infisical.com/api/v1/cert-manager/certificates' \ --header 'Authorization: Bearer ' \ --header 'Content-Type: application/json' \ --data-raw '{ "profileId": "", "csr": "-----BEGIN CERTIFICATE REQUEST-----\nMIICvDCCAaQCAQAwdzELMAkGA1UEBhMCVVMxDTALBgNVBAgMBE9oaW8xEDAOBgNV\nBAcMB0NvbHVtYnMxFzAVBgNVBAoMDk15IE9yZ2FuaXphdGlvbjEcMBoGA1UEAwwT\nc2VydmljZS5leGFtcGxlLmNvbTCCASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoC\nggEBAK...\n-----END CERTIFICATE REQUEST-----", "attributes": { "ttl": "365d" } }' ``` ### Sample response ```bash Response theme={"dark"} { "certificate": { "certificate": "-----BEGIN CERTIFICATE-----\nMIIEpDCCAowCCQD...\n-----END CERTIFICATE-----", "certificateChain": "-----BEGIN CERTIFICATE-----\nMIIEpDCCAowCCQD...\n-----END CERTIFICATE-----", "issuingCaCertificate": "-----BEGIN CERTIFICATE-----\nMIIEpDCCAowCCQD...\n-----END CERTIFICATE-----", "serialNumber": "123456789012345679", "certificateId": "990i4567-e29b-41d4-a716-446655440004" }, "certificateRequestId": "..." } ``` No private key is returned when using CSR-based issuance since you manage your own key externally. When sending the CSR via API: * Replace actual newlines in the PEM content with `\n` in the JSON string * Include the full PEM headers (`-----BEGIN CERTIFICATE REQUEST-----`) and footers (`-----END CERTIFICATE REQUEST-----`) Your CSR must comply with the [certificate policy](/documentation/platform/pki/certificates/policies) attached to the profile. The policy validates subject attributes, SANs, key algorithms, signature algorithms, key usages, and basic constraints. If your CSR doesn't comply with the policy, you'll receive an error message indicating which constraint was violated. ## FAQ **Use Managed (recommended for most cases)** when: * You want Infisical to handle key generation and storage * You need server-side auto-renewal capabilities * You're deploying certificates via certificate syncs to cloud providers * You want the simplest setup with minimal configuration * You don't have specific requirements for key custody **Use CSR** when: * Your security policy requires private keys to be generated on the target system * You're using a Hardware Security Module (HSM) that generates and stores keys * You need to reuse an existing private key * You have compliance requirements that mandate key generation in a specific location * You're integrating with systems that generate their own CSRs (e.g., load balancers, appliances) Certificates issued via CSR are **not eligible for server-side auto-renewal** since Infisical doesn't have access to the private key. You'll need to handle renewal by generating a new CSR and requesting a new certificate. Certificates issued via CSR cannot be automatically renewed by Infisical since the private key is managed externally. To renew: 1. Generate a new CSR using your existing private key (or generate a new key pair if desired) 2. Request a new certificate using the new CSR 3. Deploy the new certificate before the old one expires ```bash theme={"dark"} # Generate a new CSR with your existing key openssl req -new -key private.key -out request.csr \ -subj "/CN=service.example.com" ``` Set up alerts for certificate expiration to ensure timely renewal. **Error**: "CSR cannot be empty" or invalid format error **Solution**: Ensure your CSR: * Starts with `-----BEGIN CERTIFICATE REQUEST-----` * Ends with `-----END CERTIFICATE REQUEST-----` * Contains valid base64-encoded content The UI accepts multiline PEM format directly—you can paste your CSR as-is from the file without any formatting changes. Verify your CSR is valid: ```bash theme={"dark"} openssl req -in request.csr -noout -text ``` **Solution**: When sending CSR via API JSON: * Replace actual newlines with `\n` in the JSON string * Include full PEM headers and footers * Ensure proper JSON escaping Example format: ```json theme={"dark"} { "csr": "-----BEGIN CERTIFICATE REQUEST-----\nMIIC...base64content...\n-----END CERTIFICATE REQUEST-----" } ``` Policy validation errors occur when your CSR doesn't comply with the certificate policy attached to the profile. Common errors include: * **Subject attributes**: "Missing required {attribute} attribute" or "{attribute} value does not match allowed patterns" * **Subject Alternative Names**: "{type} SAN is not allowed by template policy" or "Required {type} SAN not found" * **Key algorithm**: "Key algorithm is not allowed by template policy" * **Signature algorithm**: "Signature algorithm is not allowed by template policy" **Solution**: 1. Review your certificate policy configuration in Project > Certificates > Certificate Policies 2. Ensure your CSR includes all required attributes and SANs 3. Ensure values match allowed patterns configured in the policy 4. Verify your key algorithm is in the policy's allowed list (common options: RSA\_2048, RSA\_4096, ECDSA\_P256, ECDSA\_P384) Example generating a CSR with full subject and SANs: ```bash theme={"dark"} openssl req -new -key key.pem -out request.csr \ -subj "/CN=service.example.com/O=My Organization/OU=Engineering/C=US/ST=California/L=San Francisco" \ -addext "subjectAltName=DNS:service.example.com,DNS:api.example.com" ``` **Error**: "Self-signed certificates are not supported for CSR signing" **Solution**: CSR-based issuance requires a Certificate Authority to sign the certificate. --- # Source: https://infisical.com/docs/self-hosting/configuration/requirements.md > ## Documentation Index > Fetch the complete documentation index at: https://infisical.com/docs/llms.txt > Use this file to discover all available pages before exploring further. # Hardware requirements > Find out the minimal requirements for operating Infisical. This page details the minimum requirements necessary for installing and using Infisical. The actual resource requirements will vary in direct proportion to the operations performed by Infisical and the level of utilization by the end users. ## Deployment Sizes **Small** suitable for most initial production setups, as well as development and testing scenarios. **Large** suitable for high-demand production environments, characterized by either a high volume of transactions, large number of secrets, or both. ## Hardware Requirements ### Storage Infisical doesn’t require file storage as all persisted data is saved in the database. However, its logs and metrics are saved to disk for later viewing. As a result, we recommend provisioning 1-2 GB of storage. ### CPU and Memory (Per Container/Instance) Infisical is stateless and scales horizontally by running across multiple containers/instances. Each instance typically does **not** need more than **2–4 CPU cores** and **4–8 GB** of memory. If you need additional capacity, simply increase the **number** of containers/instances running in parallel. | **Deployment Size** | **CPU (Cores, per container)** | **Memory (GB, per container)** | **Recommended Number of Containers** | | ------------------- | ------------------------------ | ------------------------------ | ------------------------------------ | | **Small** | 2 | 4 | 2+ | | **Medium** | 2–4 | 4–8 | 5+ | | **Large** | 2–4 | 4–8 | 10+ | > **Note:** > > * Adding more containers (horizontal scaling) is generally the best way to handle spikes in secret operations. > * If you prefer, you can increase CPU/memory on a single container (vertical scaling), but horizontal scaling is more flexible and resilient. ## Database & caching layer ### Postgres PostgreSQL is the only database supported by Infisical. Infisical has been extensively tested with Postgres version 16. We recommend using versions 14 and up for optimal compatibility. The compute required for Postgres is largely dependent on the number of secret operations (reads and writes) you expect. The more frequently you read and write secrets, the more compute you will need. You'll notice that storage requirements are high and this is because audit logs are by default stored in the database. Recommended resource allocation based on deployment size. You may require more resources if you have a large number of secrets or high transaction volume: * **small:** 2 vCPU / 8 GB RAM / 100 GB Disk * **medium:** 4vCPU / 16 GB RAM / 200 GB Disk * **large:** 8vCPU / 32 GB RAM / 500 GB Disk ### Redis Redis is utilized for session management and background tasks in Infisical. Redis requirements: * Use Redis versions 6.x or 7.x. We advise upgrading to at least Redis 6.2. * Redis Cluster mode is currently not supported; use Redis Standalone, with or without High Availability (HA). * Redis storage needs are minimal: a setup with 2 vCPU, 4 GB RAM, and 30GB SSD will be sufficient for small deployments. * Set cache eviction policy to `noeviction`. ## Supported Web Browsers Infisical supports a range of web browsers. However, features such as browser-based CLI login only work on Google Chrome and Firefox at the moment. * [Mozilla Firefox](https://www.mozilla.org/en-US/firefox/new/) * [Google Chrome](https://www.google.com/chrome/) * [Chromium](https://www.chromium.org/getting-involved/dev-channel/) * [Apple Safari](https://www.apple.com/safari/) * [Microsoft Edge](https://www.microsoft.com/en-us/edge?form=MA13FJ) --- # Source: https://infisical.com/docs/cli/commands/reset.md > ## Documentation Index > Fetch the complete documentation index at: https://infisical.com/docs/llms.txt > Use this file to discover all available pages before exploring further. # infisical reset > Reset Infisical ```bash theme={"dark"} infisical reset ``` ## Description This command provides a way to clear all Infisical-generated configuration data, effectively resetting the software to its default settings. This can be an effective way to address any persistent issues that arise while using the CLI. --- # Source: https://infisical.com/docs/documentation/platform/pam/getting-started/resources.md > ## Documentation Index > Fetch the complete documentation index at: https://infisical.com/docs/llms.txt > Use this file to discover all available pages before exploring further. # PAM Resource > Learn how to add and configure resources like databases and servers, and set up automated credential rotation. A resource represents a target system, such as a database, server, or application, that you want to manage access to. Some examples of resources are: * PostgreSQL Database * MCP Server * Linux Server * Web Application ## Prerequisites Before you can create a resource, you must have an **Infisical Gateway** deployed that is able to reach the target resource over the network. The Gateway acts as a secure bridge, allowing Infisical to reach your private infrastructure without exposing it to the public internet. When creating a resource, you will be asked to specify which Gateway should be used to connect to it. [Read the Gateway Deployment Guide](/documentation/platform/gateways/gateway-deployment) ## Creating a Resource To add a resource, navigate to the **Resources** tab in your PAM project and click **Add Resource**. Add Resource Button Next, select the type of resource you want to add. Select Resource Type After selecting a resource type, provide the necessary connection details. The required fields vary depending on the resource type. **Important**: You must select the **Gateway** that has network access to this resource. In this PostgreSQL example, you provide details such as host, port, gateway, and database name. Create Resource Clicking **Create Resource** will trigger a connection test from the selected Gateway to your target resource. If the connection fails, an error message will be displayed to help you troubleshoot (usually indicating a network firewall issue between the Gateway and the Resource). ## Automated Credential Rotation Some resources, such as PostgreSQL, support automated credential rotation to enhance your security posture. This feature requires configuring a privileged "Rotation Account" on the resource. To learn more about how to configure this, please refer to the [Credential Rotation guide](/documentation/platform/pam/product-reference/credential-rotation). --- # Source: https://infisical.com/docs/api-reference/endpoints/universal-auth/retrieve.md # Source: https://infisical.com/docs/api-reference/endpoints/token-auth/retrieve.md # Source: https://infisical.com/docs/api-reference/endpoints/tls-cert-auth/retrieve.md # Source: https://infisical.com/docs/api-reference/endpoints/oidc-auth/retrieve.md # Source: https://infisical.com/docs/api-reference/endpoints/oci-auth/retrieve.md # Source: https://infisical.com/docs/api-reference/endpoints/ldap-auth/retrieve.md # Source: https://infisical.com/docs/api-reference/endpoints/kubernetes-auth/retrieve.md # Source: https://infisical.com/docs/api-reference/endpoints/jwt-auth/retrieve.md # Source: https://infisical.com/docs/api-reference/endpoints/gcp-auth/retrieve.md # Source: https://infisical.com/docs/api-reference/endpoints/azure-auth/retrieve.md # Source: https://infisical.com/docs/api-reference/endpoints/aws-auth/retrieve.md # Source: https://infisical.com/docs/api-reference/endpoints/alicloud-auth/retrieve.md > ## Documentation Index > Fetch the complete documentation index at: https://infisical.com/docs/llms.txt > Use this file to discover all available pages before exploring further. # Retrieve > Retrieve Alibaba Cloud Auth configuration on machine identity ## OpenAPI ````yaml GET /api/v1/auth/alicloud-auth/identities/{identityId} openapi: 3.0.3 info: title: Infisical API description: List of all available APIs that can be consumed version: 0.0.1 servers: - url: https://us.infisical.com description: Production server (US) - url: https://eu.infisical.com description: Production server (EU) - url: http://localhost:8080 description: Local server security: [] paths: /api/v1/auth/alicloud-auth/identities/{identityId}: get: tags: - Alibaba Cloud Auth description: Retrieve Alibaba Cloud Auth configuration on machine identity operationId: getAlicloudAuth parameters: - schema: type: string in: path name: identityId required: true description: The ID of the machine identity to retrieve the auth method for. responses: '200': description: Default Response content: application/json: schema: type: object properties: identityAliCloudAuth: type: object properties: id: type: string format: uuid accessTokenTTL: type: number default: 7200 accessTokenMaxTTL: type: number default: 7200 accessTokenNumUsesLimit: type: number default: 0 accessTokenTrustedIps: {} createdAt: type: string format: date-time updatedAt: type: string format: date-time identityId: type: string format: uuid type: type: string allowedArns: type: string required: - id - createdAt - updatedAt - identityId - type - allowedArns additionalProperties: false required: - identityAliCloudAuth additionalProperties: false '400': description: Default Response content: application/json: schema: type: object properties: reqId: type: string statusCode: type: number enum: - 400 message: type: string error: type: string details: {} required: - reqId - statusCode - message - error additionalProperties: false '401': description: Default Response content: application/json: schema: type: object properties: reqId: type: string statusCode: type: number enum: - 401 message: type: string error: type: string required: - reqId - statusCode - message - error additionalProperties: false '403': description: Default Response content: application/json: schema: type: object properties: reqId: type: string statusCode: type: number enum: - 403 message: type: string details: {} error: type: string required: - reqId - statusCode - message - error additionalProperties: false '404': description: Default Response content: application/json: schema: type: object properties: reqId: type: string statusCode: type: number enum: - 404 message: type: string error: type: string required: - reqId - statusCode - message - error additionalProperties: false '422': description: Default Response content: application/json: schema: type: object properties: reqId: type: string statusCode: type: number enum: - 422 message: {} error: type: string required: - reqId - statusCode - error additionalProperties: false '500': description: Default Response content: application/json: schema: type: object properties: reqId: type: string statusCode: type: number enum: - 500 message: type: string error: type: string required: - reqId - statusCode - message - error additionalProperties: false security: - bearerAuth: [] components: securitySchemes: bearerAuth: type: http scheme: bearer bearerFormat: JWT description: An access token in Infisical ```` --- # Source: https://infisical.com/docs/api-reference/endpoints/universal-auth/revoke-access-token.md > ## Documentation Index > Fetch the complete documentation index at: https://infisical.com/docs/llms.txt > Use this file to discover all available pages before exploring further. # Revoke Access Token > Revoke machine identity access token ## OpenAPI ````yaml POST /api/v1/auth/token/revoke openapi: 3.0.3 info: title: Infisical API description: List of all available APIs that can be consumed version: 0.0.1 servers: - url: https://us.infisical.com description: Production server (US) - url: https://eu.infisical.com description: Production server (EU) - url: http://localhost:8080 description: Local server security: [] paths: /api/v1/auth/token/revoke: post: tags: - Universal Auth description: Revoke machine identity access token operationId: revokeIdentityAccessToken requestBody: content: application/json: schema: type: object properties: accessToken: type: string description: The access token to revoke. required: - accessToken additionalProperties: false required: true responses: '200': description: Default Response content: application/json: schema: type: object properties: message: type: string required: - message additionalProperties: false '400': description: Default Response content: application/json: schema: type: object properties: reqId: type: string statusCode: type: number enum: - 400 message: type: string error: type: string details: {} required: - reqId - statusCode - message - error additionalProperties: false '401': description: Default Response content: application/json: schema: type: object properties: reqId: type: string statusCode: type: number enum: - 401 message: type: string error: type: string required: - reqId - statusCode - message - error additionalProperties: false '403': description: Default Response content: application/json: schema: type: object properties: reqId: type: string statusCode: type: number enum: - 403 message: type: string details: {} error: type: string required: - reqId - statusCode - message - error additionalProperties: false '404': description: Default Response content: application/json: schema: type: object properties: reqId: type: string statusCode: type: number enum: - 404 message: type: string error: type: string required: - reqId - statusCode - message - error additionalProperties: false '422': description: Default Response content: application/json: schema: type: object properties: reqId: type: string statusCode: type: number enum: - 422 message: {} error: type: string required: - reqId - statusCode - error additionalProperties: false '500': description: Default Response content: application/json: schema: type: object properties: reqId: type: string statusCode: type: number enum: - 500 message: type: string error: type: string required: - reqId - statusCode - message - error additionalProperties: false ```` --- # Source: https://infisical.com/docs/api-reference/endpoints/universal-auth/revoke-client-secret.md > ## Documentation Index > Fetch the complete documentation index at: https://infisical.com/docs/llms.txt > Use this file to discover all available pages before exploring further. # Revoke Client Secret > Revoke Universal Auth Client Secrets for machine identity ## OpenAPI ````yaml POST /api/v1/auth/universal-auth/identities/{identityId}/client-secrets/{clientSecretId}/revoke openapi: 3.0.3 info: title: Infisical API description: List of all available APIs that can be consumed version: 0.0.1 servers: - url: https://us.infisical.com description: Production server (US) - url: https://eu.infisical.com description: Production server (EU) - url: http://localhost:8080 description: Local server security: [] paths: /api/v1/auth/universal-auth/identities/{identityId}/client-secrets/{clientSecretId}/revoke: post: tags: - Universal Auth description: Revoke Universal Auth Client Secrets for machine identity operationId: revokeUniversalAuthClientSecret parameters: - schema: type: string in: path name: identityId required: true description: The ID of the machine identity to revoke the client secret from. - schema: type: string in: path name: clientSecretId required: true description: The ID of the client secret to revoke. responses: '200': description: Default Response content: application/json: schema: type: object properties: clientSecretData: type: object properties: id: type: string createdAt: type: string format: date-time updatedAt: type: string format: date-time description: type: string clientSecretPrefix: type: string clientSecretNumUses: type: number default: 0 clientSecretNumUsesLimit: type: number default: 0 clientSecretTTL: type: number default: 0 identityUAId: type: string format: uuid isClientSecretRevoked: type: boolean default: false required: - id - createdAt - updatedAt - description - clientSecretPrefix - identityUAId additionalProperties: false required: - clientSecretData additionalProperties: false '400': description: Default Response content: application/json: schema: type: object properties: reqId: type: string statusCode: type: number enum: - 400 message: type: string error: type: string details: {} required: - reqId - statusCode - message - error additionalProperties: false '401': description: Default Response content: application/json: schema: type: object properties: reqId: type: string statusCode: type: number enum: - 401 message: type: string error: type: string required: - reqId - statusCode - message - error additionalProperties: false '403': description: Default Response content: application/json: schema: type: object properties: reqId: type: string statusCode: type: number enum: - 403 message: type: string details: {} error: type: string required: - reqId - statusCode - message - error additionalProperties: false '404': description: Default Response content: application/json: schema: type: object properties: reqId: type: string statusCode: type: number enum: - 404 message: type: string error: type: string required: - reqId - statusCode - message - error additionalProperties: false '422': description: Default Response content: application/json: schema: type: object properties: reqId: type: string statusCode: type: number enum: - 422 message: {} error: type: string required: - reqId - statusCode - error additionalProperties: false '500': description: Default Response content: application/json: schema: type: object properties: reqId: type: string statusCode: type: number enum: - 500 message: type: string error: type: string required: - reqId - statusCode - message - error additionalProperties: false security: - bearerAuth: [] components: securitySchemes: bearerAuth: type: http scheme: bearer bearerFormat: JWT description: An access token in Infisical ```` --- # Source: https://infisical.com/docs/api-reference/endpoints/token-auth/revoke-token.md > ## Documentation Index > Fetch the complete documentation index at: https://infisical.com/docs/llms.txt > Use this file to discover all available pages before exploring further. # Revoke Token > Revoke token for machine identity with Token Auth ## OpenAPI ````yaml POST /api/v1/auth/token-auth/tokens/{tokenId}/revoke openapi: 3.0.3 info: title: Infisical API description: List of all available APIs that can be consumed version: 0.0.1 servers: - url: https://us.infisical.com description: Production server (US) - url: https://eu.infisical.com description: Production server (EU) - url: http://localhost:8080 description: Local server security: [] paths: /api/v1/auth/token-auth/tokens/{tokenId}/revoke: post: tags: - Token Auth description: Revoke token for machine identity with Token Auth operationId: revokeTokenAuthToken parameters: - schema: type: string in: path name: tokenId required: true description: The ID of the token to revoke. responses: '200': description: Default Response content: application/json: schema: type: object properties: message: type: string required: - message additionalProperties: false '400': description: Default Response content: application/json: schema: type: object properties: reqId: type: string statusCode: type: number enum: - 400 message: type: string error: type: string details: {} required: - reqId - statusCode - message - error additionalProperties: false '401': description: Default Response content: application/json: schema: type: object properties: reqId: type: string statusCode: type: number enum: - 401 message: type: string error: type: string required: - reqId - statusCode - message - error additionalProperties: false '403': description: Default Response content: application/json: schema: type: object properties: reqId: type: string statusCode: type: number enum: - 403 message: type: string details: {} error: type: string required: - reqId - statusCode - message - error additionalProperties: false '404': description: Default Response content: application/json: schema: type: object properties: reqId: type: string statusCode: type: number enum: - 404 message: type: string error: type: string required: - reqId - statusCode - message - error additionalProperties: false '422': description: Default Response content: application/json: schema: type: object properties: reqId: type: string statusCode: type: number enum: - 422 message: {} error: type: string required: - reqId - statusCode - error additionalProperties: false '500': description: Default Response content: application/json: schema: type: object properties: reqId: type: string statusCode: type: number enum: - 500 message: type: string error: type: string required: - reqId - statusCode - message - error additionalProperties: false security: - bearerAuth: [] components: securitySchemes: bearerAuth: type: http scheme: bearer bearerFormat: JWT description: An access token in Infisical ```` --- # Source: https://infisical.com/docs/api-reference/endpoints/universal-auth/revoke.md # Source: https://infisical.com/docs/api-reference/endpoints/token-auth/revoke.md # Source: https://infisical.com/docs/api-reference/endpoints/tls-cert-auth/revoke.md # Source: https://infisical.com/docs/api-reference/endpoints/oidc-auth/revoke.md # Source: https://infisical.com/docs/api-reference/endpoints/oci-auth/revoke.md # Source: https://infisical.com/docs/api-reference/endpoints/ldap-auth/revoke.md # Source: https://infisical.com/docs/api-reference/endpoints/kubernetes-auth/revoke.md # Source: https://infisical.com/docs/api-reference/endpoints/jwt-auth/revoke.md # Source: https://infisical.com/docs/api-reference/endpoints/gcp-auth/revoke.md # Source: https://infisical.com/docs/api-reference/endpoints/certificates/revoke.md # Source: https://infisical.com/docs/api-reference/endpoints/azure-auth/revoke.md # Source: https://infisical.com/docs/api-reference/endpoints/aws-auth/revoke.md # Source: https://infisical.com/docs/api-reference/endpoints/alicloud-auth/revoke.md > ## Documentation Index > Fetch the complete documentation index at: https://infisical.com/docs/llms.txt > Use this file to discover all available pages before exploring further. # Revoke > Delete Alibaba Cloud Auth configuration on machine identity ## OpenAPI ````yaml DELETE /api/v1/auth/alicloud-auth/identities/{identityId} openapi: 3.0.3 info: title: Infisical API description: List of all available APIs that can be consumed version: 0.0.1 servers: - url: https://us.infisical.com description: Production server (US) - url: https://eu.infisical.com description: Production server (EU) - url: http://localhost:8080 description: Local server security: [] paths: /api/v1/auth/alicloud-auth/identities/{identityId}: delete: tags: - Alibaba Cloud Auth description: Delete Alibaba Cloud Auth configuration on machine identity operationId: deleteAlicloudAuth parameters: - schema: type: string in: path name: identityId required: true description: The ID of the machine identity to revoke the auth method for. responses: '200': description: Default Response content: application/json: schema: type: object properties: identityAliCloudAuth: type: object properties: id: type: string format: uuid accessTokenTTL: type: number default: 7200 accessTokenMaxTTL: type: number default: 7200 accessTokenNumUsesLimit: type: number default: 0 accessTokenTrustedIps: {} createdAt: type: string format: date-time updatedAt: type: string format: date-time identityId: type: string format: uuid type: type: string allowedArns: type: string required: - id - createdAt - updatedAt - identityId - type - allowedArns additionalProperties: false required: - identityAliCloudAuth additionalProperties: false '400': description: Default Response content: application/json: schema: type: object properties: reqId: type: string statusCode: type: number enum: - 400 message: type: string error: type: string details: {} required: - reqId - statusCode - message - error additionalProperties: false '401': description: Default Response content: application/json: schema: type: object properties: reqId: type: string statusCode: type: number enum: - 401 message: type: string error: type: string required: - reqId - statusCode - message - error additionalProperties: false '403': description: Default Response content: application/json: schema: type: object properties: reqId: type: string statusCode: type: number enum: - 403 message: type: string details: {} error: type: string required: - reqId - statusCode - message - error additionalProperties: false '404': description: Default Response content: application/json: schema: type: object properties: reqId: type: string statusCode: type: number enum: - 404 message: type: string error: type: string required: - reqId - statusCode - message - error additionalProperties: false '422': description: Default Response content: application/json: schema: type: object properties: reqId: type: string statusCode: type: number enum: - 422 message: {} error: type: string required: - reqId - statusCode - error additionalProperties: false '500': description: Default Response content: application/json: schema: type: object properties: reqId: type: string statusCode: type: number enum: - 500 message: type: string error: type: string required: - reqId - statusCode - message - error additionalProperties: false security: - bearerAuth: [] components: securitySchemes: bearerAuth: type: http scheme: bearer bearerFormat: JWT description: An access token in Infisical ```` --- # Source: https://infisical.com/docs/documentation/platform/access-controls/role-based-access-controls.md > ## Documentation Index > Fetch the complete documentation index at: https://infisical.com/docs/llms.txt > Use this file to discover all available pages before exploring further. # Role-based Access Controls > Learn how to use RBAC to manage user permissions. Infisical's Role-based Access Controls (RBAC) enable the usage of predefined and custom roles that imply a set of permissions for user and machine identities. Such roles make it possible to restrict access to resources and the range of actions that can be performed. In general, access controls can be split up across [projects](/documentation/platform/project) and [organizations](/documentation/platform/organization). ## Organization-level access controls By default, every user and machine identity in a organization is either an **admin** or a **member**. **Admins** are able to perform every action with the organization, including adding and removing organization members, managing access controls, setting up security settings, and creating new projects. **Members**, on the other hand, are restricted from removing organization members, modifying billing information, updating access controls, and performing a number of other actions. Overall, organization-level access controls are significantly of administrative nature. Access to projects, secrets and other sensitive data is specified on the project level. Org member role ## Project-level access controls By default, every user in a project is either a **viewer**, **developer**, or an **admin**. Each of these roles comes with a varying access to different features and resources inside projects. As such: * **Admin**: This role enables identities to have access to all environments, folders, secrets, and actions within the project. * **Developers**: This role restricts identities from performing project control actions, updating Approval Workflow policies, managing roles, editing and removing project members, and more. * **Viewer**: The most limiting bulit-in role on the project level – it forbids user and machine identities to perform any action and rather shows them in the read-only mode. Project member role ## Creating custom roles By creating custom roles, you are able to adjust permissions to the needs of your organization. This can be useful for: * Creating superadmin roles, roles specific to SRE engineers, etc. * Restricting access of users to specific secrets, folders, and environments. * Embedding these specific roles into [Approval Workflow policies](/documentation/platform/pr-workflows). It is worth noting that users are able to assume multiple built-in and custom roles. A user will gain access to all actions within the roles assigned to them, not just the actions those roles share in common. project member custom role --- # Source: https://infisical.com/docs/api-reference/endpoints/secret-rotations/windows-local-account/rotate-secrets.md # Source: https://infisical.com/docs/api-reference/endpoints/secret-rotations/unix-linux-local-account/rotate-secrets.md # Source: https://infisical.com/docs/api-reference/endpoints/secret-rotations/redis-credentials/rotate-secrets.md # Source: https://infisical.com/docs/api-reference/endpoints/secret-rotations/postgres-credentials/rotate-secrets.md # Source: https://infisical.com/docs/api-reference/endpoints/secret-rotations/oracledb-credentials/rotate-secrets.md # Source: https://infisical.com/docs/api-reference/endpoints/secret-rotations/okta-client-secret/rotate-secrets.md # Source: https://infisical.com/docs/api-reference/endpoints/secret-rotations/mysql-credentials/rotate-secrets.md # Source: https://infisical.com/docs/api-reference/endpoints/secret-rotations/mssql-credentials/rotate-secrets.md # Source: https://infisical.com/docs/api-reference/endpoints/secret-rotations/mongodb-credentials/rotate-secrets.md # Source: https://infisical.com/docs/api-reference/endpoints/secret-rotations/ldap-password/rotate-secrets.md # Source: https://infisical.com/docs/api-reference/endpoints/secret-rotations/databricks-service-principal-secret/rotate-secrets.md # Source: https://infisical.com/docs/api-reference/endpoints/secret-rotations/azure-client-secret/rotate-secrets.md # Source: https://infisical.com/docs/api-reference/endpoints/secret-rotations/aws-iam-user-secret/rotate-secrets.md # Source: https://infisical.com/docs/api-reference/endpoints/secret-rotations/auth0-client-secret/rotate-secrets.md > ## Documentation Index > Fetch the complete documentation index at: https://infisical.com/docs/llms.txt > Use this file to discover all available pages before exploring further. # Rotate Secrets > Rotate the generated credentials for the specified Auth0 Client Secret Rotation. ## OpenAPI ````yaml POST /api/v2/secret-rotations/auth0-client-secret/{rotationId}/rotate-secrets openapi: 3.0.3 info: title: Infisical API description: List of all available APIs that can be consumed version: 0.0.1 servers: - url: https://us.infisical.com description: Production server (US) - url: https://eu.infisical.com description: Production server (EU) - url: http://localhost:8080 description: Local server security: [] paths: /api/v2/secret-rotations/auth0-client-secret/{rotationId}/rotate-secrets: post: tags: - Secret Rotations description: >- Rotate the generated credentials for the specified Auth0 Client Secret Rotation. operationId: rotateAuth0ClientSecretRotation parameters: - schema: type: string format: uuid in: path name: rotationId required: true description: >- The ID of the Auth0 Client Secret Rotation to rotate generated credentials for. responses: '200': description: Default Response content: application/json: schema: type: object properties: secretRotation: type: object properties: id: type: string format: uuid name: type: string description: type: string nullable: true isAutoRotationEnabled: type: boolean default: true activeIndex: type: number default: 0 folderId: type: string format: uuid connectionId: type: string format: uuid createdAt: type: string format: date-time updatedAt: type: string format: date-time rotationInterval: type: number rotationStatus: type: string lastRotationAttemptedAt: type: string format: date-time lastRotatedAt: type: string format: date-time lastRotationJobId: type: string nullable: true nextRotationAt: type: string format: date-time nullable: true isLastRotationManual: type: boolean default: true connection: type: object properties: app: type: string enum: - auth0 name: type: string id: type: string format: uuid required: - app - name - id additionalProperties: false environment: type: object properties: slug: type: string name: type: string id: type: string format: uuid required: - slug - name - id additionalProperties: false projectId: type: string folder: type: object properties: id: type: string path: type: string required: - id - path additionalProperties: false rotateAtUtc: type: object properties: hours: type: number minimum: 0 maximum: 23 minutes: type: number minimum: 0 maximum: 59 required: - hours - minutes additionalProperties: false lastRotationMessage: type: string nullable: true type: type: string enum: - auth0-client-secret parameters: type: object properties: clientId: type: string minLength: 1 description: >- The client ID of the Auth0 Application to rotate the client secret for. required: - clientId additionalProperties: false secretsMapping: type: object properties: clientId: type: string minLength: 1 description: >- The name of the secret that the client ID will be mapped to. clientSecret: type: string minLength: 1 description: >- The name of the secret that the rotated client secret will be mapped to. required: - clientId - clientSecret additionalProperties: false required: - id - name - folderId - connectionId - createdAt - updatedAt - rotationInterval - rotationStatus - lastRotationAttemptedAt - lastRotatedAt - connection - environment - projectId - folder - rotateAtUtc - type - parameters - secretsMapping additionalProperties: false required: - secretRotation additionalProperties: false '400': description: Default Response content: application/json: schema: type: object properties: reqId: type: string statusCode: type: number enum: - 400 message: type: string error: type: string details: {} required: - reqId - statusCode - message - error additionalProperties: false '401': description: Default Response content: application/json: schema: type: object properties: reqId: type: string statusCode: type: number enum: - 401 message: type: string error: type: string required: - reqId - statusCode - message - error additionalProperties: false '403': description: Default Response content: application/json: schema: type: object properties: reqId: type: string statusCode: type: number enum: - 403 message: type: string details: {} error: type: string required: - reqId - statusCode - message - error additionalProperties: false '404': description: Default Response content: application/json: schema: type: object properties: reqId: type: string statusCode: type: number enum: - 404 message: type: string error: type: string required: - reqId - statusCode - message - error additionalProperties: false '422': description: Default Response content: application/json: schema: type: object properties: reqId: type: string statusCode: type: number enum: - 422 message: {} error: type: string required: - reqId - statusCode - error additionalProperties: false '500': description: Default Response content: application/json: schema: type: object properties: reqId: type: string statusCode: type: number enum: - 500 message: type: string error: type: string required: - reqId - statusCode - message - error additionalProperties: false ```` --- # Source: https://infisical.com/docs/sdks/languages/ruby.md > ## Documentation Index > Fetch the complete documentation index at: https://infisical.com/docs/llms.txt > Use this file to discover all available pages before exploring further. # Infisical Ruby SDK If you're working with Ruby, the official Infisical Ruby SDK package is the easiest way to fetch and work with secrets for your application. * [Ruby Package](https://rubygems.org/gems/infisical-sdk) * [Github Repository](https://github.com/infisical/sdk) **Deprecation Notice** All versions prior to **2.3.9** should be considered deprecated and are no longer supported by Infisical. Please update to version **2.3.9** or newer. All changes are fully backwards compatible with older versions. ## Basic Usage ```ruby theme={"dark"} require 'infisical-sdk' # 1. Create the Infisical client infisical = InfisicalSDK::InfisicalClient.new('https://app.infisical.com') infisical.auth.universal_auth(client_id: 'YOUR_CLIENT_ID', client_secret: 'YOUR_CLIENT_SECRET') test_secret = infisical.secrets.get( secret_name: 'API_KEY', project_id: 'project-id', environment: 'dev' ) puts "Secret: #{single_test_secret}" ``` This example demonstrates how to use the Infisical Ruby SDK in a simple Ruby application. The application retrieves a secret named `API_KEY` from the `dev` environment of the `YOUR_PROJECT_ID` project. We do not recommend hardcoding your [Machine Identity Tokens](/documentation/platform/identities/machine-identities). Setting it as an environment variable would be best. # Installation ```console theme={"dark"} $ gem install infisical-sdk ``` # Configuration Import the SDK and create a client instance. ```ruby theme={"dark"} infisical = InfisicalSDK::InfisicalClient.new('https://app.infisical.com') # Optional parameter, default is https://api.infisical.com ``` ### Client parameters The URL of the Infisical API. Default is `https://api.infisical.com`. How long the client should cache secrets for. Default is 5 minutes. Disable by setting to 0. ### Authentication The SDK supports a variety of authentication methods. The most common authentication method is Universal Auth, which uses a client ID and client secret to authenticate. #### Universal Auth **Using environment variables** Call `auth.universal_auth()` with empty arguments to use the following environment variables: * `INFISICAL_UNIVERSAL_AUTH_CLIENT_ID` - Your machine identity client ID. * `INFISICAL_UNIVERSAL_AUTH_CLIENT_SECRET` - Your machine identity client secret. **Using the SDK directly** ```ruby theme={"dark"} infisical.auth.universal_auth(client_id: 'your-client-id', client_secret: 'your-client-secret') ``` #### GCP ID Token Auth Please note that this authentication method will only work if you're running your application on Google Cloud Platform. Please [read more](/documentation/platform/identities/gcp-auth) about this authentication method. **Using environment variables** Call `.auth.gcp_id_token_auth()` with empty arguments to use the following environment variables: * `INFISICAL_GCP_AUTH_IDENTITY_ID` - Your Infisical Machine Identity ID. **Using the SDK directly** ```ruby theme={"dark"} infisical.auth.gcp_id_token_auth(identity_id: 'MACHINE_IDENTITY_ID') ``` #### GCP IAM Auth **Using environment variables** Call `.auth.gcp_iam_auth()` with empty arguments to use the following environment variables: * `INFISICAL_GCP_IAM_AUTH_IDENTITY_ID` - Your Infisical Machine Identity ID. * `INFISICAL_GCP_IAM_SERVICE_ACCOUNT_KEY_FILE_PATH` - The path to your GCP service account key file. **Using the SDK directly** ```ruby theme={"dark"} infisical.auth.gcp_iam_auth(identity_id: 'MACHINE_IDENTITY_ID', service_account_key_file_path: 'SERVICE_ACCOUNT_KEY_FILE_PATH') ``` #### AWS IAM Auth Please note that this authentication method will only work if you're running your application on AWS. Please [read more](/documentation/platform/identities/aws-auth) about this authentication method. **Using environment variables** Call `.auth.aws_iam_auth()` with empty arguments to use the following environment variables: * `INFISICAL_AWS_IAM_AUTH_IDENTITY_ID` - Your Infisical Machine Identity ID. **Using the SDK directly** ```ruby theme={"dark"} infisical.auth.aws_iam_auth(identity_id: 'MACHINE_IDENTITY_ID') ``` #### Azure Auth Please note that this authentication method will only work if you're running your application on Azure. Please [read more](/documentation/platform/identities/azure-auth) about this authentication method. **Using environment variables** Call `.auth.azure_auth()` with empty arguments to use the following environment variables: * `INFISICAL_AZURE_AUTH_IDENTITY_ID` - Your Infisical Machine Identity ID. **Using the SDK directly** ```ruby theme={"dark"} infisical.auth.azure_auth(identity_id: 'MACHINE_IDENTITY_ID') ``` #### Kubernetes Auth Please note that this authentication method will only work if you're running your application on Kubernetes. Please [read more](/documentation/platform/identities/kubernetes-auth) about this authentication method. **Using environment variables** Call `.auth.kubernetes_auth()` with empty arguments to use the following environment variables: * `INFISICAL_KUBERNETES_IDENTITY_ID` - Your Infisical Machine Identity ID. * `INFISICAL_KUBERNETES_SERVICE_ACCOUNT_TOKEN_PATH_ENV_NAME` - The environment variable name that contains the path to the service account token. This is optional and will default to `/var/run/secrets/kubernetes.io/serviceaccount/token`. **Using the SDK directly** ```ruby theme={"dark"} # Service account token path will default to /var/run/secrets/kubernetes.io/serviceaccount/token if empty value is passed infisical.auth.kubernetes_auth(identity_id: 'MACHINE_IDENTITY_ID', service_account_token_path: nil) ``` ## Working with Secrets ### client.secrets.list(options) ```ruby theme={"dark"} secrets = infisical.secrets.list( project_id: 'PROJECT_ID', environment: 'dev', path: '/foo/bar', ) ``` Retrieve all secrets within the Infisical project and environment that client is connected to #### Parameters The slug name (dev, prod, etc) of the environment from where secrets should be fetched from. The project ID where the secret lives in. The path from where secrets should be fetched from. Whether or not to set the fetched secrets to the process environment. If true, you can access the secrets like so `System.getenv("SECRET_NAME")`. Whether or not to include imported secrets from the current path. Read about [secret import](/documentation/platform/secret-reference) Whether or not to fetch secrets recursively from the specified path. Please note that there's a 20-depth limit for recursive fetching. Whether or not to expand secret references in the fetched secrets. Read about [secret reference](/documentation/platform/secret-reference) ### client.secrets.get(options) ```ruby theme={"dark"} secret = infisical.secrets.get( secret_name: 'API_KEY', project_id: project_id, environment: env_slug ) ``` Retrieve a secret from Infisical. By default, `Secrets().Retrieve()` fetches and returns a shared secret. #### Parameters The key of the secret to retrieve. The project ID where the secret lives in. The slug name (dev, prod, etc) of the environment from where secrets should be fetched from. The path from where secret should be fetched from. The type of the secret. Valid options are "shared" or "personal". If not specified, the default value is "shared". ### client.secrets.create(options) ```ruby theme={"dark"} new_secret = infisical.secrets.create( secret_name: 'NEW_SECRET', secret_value: 'SECRET_VALUE', project_id: 'PROJECT_ID', environment: 'dev', ) ``` Create a new secret in Infisical. #### Parameters The key of the secret to create. The value of the secret. A comment for the secret. The project ID where the secret lives in. The slug name (dev, prod, etc) of the environment from where secrets should be fetched from. The path from where secret should be created. The type of the secret. Valid options are "shared" or "personal". If not specified, the default value is "shared". ### client.secrets.update(options) ```ruby theme={"dark"} updated_secret = infisical.secrets.update( secret_name: 'SECRET_KEY_TO_UPDATE', secret_value: 'NEW_SECRET_VALUE', project_id: 'PROJECT_ID', environment: 'dev', ) ``` Update an existing secret in Infisical. #### Parameters The key of the secret to update. The new value of the secret. Whether or not to skip multiline encoding for the new secret value. The project ID where the secret lives in. The slug name (dev, prod, etc) of the environment from where secrets should be fetched from. The path from where secret should be updated. The type of the secret. Valid options are "shared" or "personal". If not specified, the default value is "shared". ### client.secrets.delete(options) ```ruby theme={"dark"} deleted_secret = infisical.secrets.delete( secret_name: 'SECRET_TO_DELETE', project_id: 'PROJECT_ID', environment: 'dev', ) ``` Delete a secret in Infisical. #### Parameters The key of the secret to update. The project ID where the secret lives in. The slug name (dev, prod, etc) of the environment from where secrets should be fetched from. The path from where secret should be deleted. The type of the secret. Valid options are "shared" or "personal". If not specified, the default value is "shared". ## Cryptography ### Create a symmetric key Create a base64-encoded, 256-bit symmetric key to be used for encryption/decryption. ```ruby theme={"dark"} key = infisical.cryptography.create_symmetric_key ``` #### Returns (string) `key` (string): A base64-encoded, 256-bit symmetric key, that can be used for encryption/decryption purposes. ### Encrypt symmetric ```ruby theme={"dark"} encrypted_data = infisical.cryptography.encrypt_symmetric(data: "Hello World!", key: key) ``` #### Parameters The plaintext you want to encrypt. The symmetric key to use for encryption. #### Returns (object) `tag` (string): A base64-encoded, 128-bit authentication tag. `iv` (string): A base64-encoded, 96-bit initialization vector. `ciphertext` (string): A base64-encoded, encrypted ciphertext. ### Decrypt symmetric ```ruby theme={"dark"} decrypted_data = infisical.cryptography.decrypt_symmetric( ciphertext: encrypted_data['ciphertext'], iv: encrypted_data['iv'], tag: encrypted_data['tag'], key: key ) ``` #### Parameters The ciphertext you want to decrypt. The symmetric key to use for encryption. The initialization vector to use for decryption. The authentication tag to use for decryption. #### Returns (string) `Plaintext` (string): The decrypted plaintext. --- # Source: https://infisical.com/docs/cli/commands/run.md > ## Documentation Index > Fetch the complete documentation index at: https://infisical.com/docs/llms.txt > Use this file to discover all available pages before exploring further. # infisical run > The command that injects your secrets into local environment ```bash theme={"dark"} infisical run [options] -- [your application start command] # Example infisical run [options] -- npm run dev ``` ```bash theme={"dark"} infisical run [options] --command [string command] # Example infisical run [options] --command "npm run bootstrap && npm run dev start; other-bash-command" ``` ## Description Inject secrets from Infisical into your application process. ## Subcommands & flags Use this command to inject secrets into your applications process ```bash theme={"dark"} $ infisical run -- # Example $ infisical run -- npm run dev ``` ### Environment variables Used to fetch secrets via a [machine identity](/documentation/platform/identities/machine-identities) apposed to logged in credentials. Simply, export this variable in the terminal before running this command. ```bash theme={"dark"} # Example export INFISICAL_TOKEN=$(infisical login --method=universal-auth --client-id= --client-secret= --silent --plain) # --plain flag will output only the token, so it can be fed to an environment variable. --silent will disable any update messages. ``` Alternatively, you may use service tokens. ```bash theme={"dark"} # Example export INFISICAL_TOKEN= ``` Used to disable the check for new CLI versions. This can improve the time it takes to run this command. Recommended for production environments. To use, simply export this variable in the terminal before running this command. ```bash theme={"dark"} # Example export INFISICAL_DISABLE_UPDATE_CHECK=true ``` ### Flags By passing the `watch` flag, you are telling the CLI to watch for changes that happen in your Infisical project. If secret changes happen, the command you provided will automatically be restarted with the new environment variables attached. ```bash theme={"dark"} # Example infisical run --watch -- printenv ``` Explicitly set the directory where the .infisical.json resides. This is useful for some monorepo setups. ```bash theme={"dark"} # Example infisical run --project-config-dir=/some-dir -- printenv ``` Pass secrets into multiple commands at once ```bash theme={"dark"} # Example infisical run --command="npm run build && npm run dev; more-commands..." ``` The project ID to fetch secrets from. This is required when using a machine identity to authenticate. ```bash theme={"dark"} # Example infisical run --projectId= -- npm run dev ``` If you are using a [machine identity](/documentation/platform/identities/machine-identities) to authenticate, you can pass the token as a flag ```bash theme={"dark"} # Example infisical run --token="" --projectId= -- npm run start ``` You may also expose the token to the CLI by setting the environment variable `INFISICAL_TOKEN` before executing the run command. This will have the same effect as setting the token with `--token` flag Turn on or off the shell parameter expansion in your secrets. If you have used shell parameters in your secret(s), activating this feature will populate them before injecting them into your application process. Default value: `true` By default imported secrets are available, you can disable it by setting this option to false. Default value: `true` {" "} This is used to specify the environment from which secrets should be retrieved. The accepted values are the environment slugs defined for your project, such as `dev`, `staging`, `test`, and `prod`. Default value: `dev` Prioritizes personal secrets with the same name over shared secrets Default value: `true` When working with tags, you can use this flag to filter and retrieve only secrets that are associated with a specific tag(s). ```bash theme={"dark"} # Example infisical run --tags=tag1,tag2,tag3 -- npm run dev ``` Note: you must reference the tag by its slug name not its fully qualified name. Go to project settings to view all tag slugs. By default, all secrets are fetched The `--path` flag indicates which project folder secrets will be injected from. ```bash theme={"dark"} # Example infisical run --path="/nextjs" -- npm run dev ``` ## Automatically reload command when secrets change To automatically reload your command when secrets change, use the `--watch` flag. ```bash theme={"dark"} infisical run --watch -- npm run dev ``` This will watch for changes in your secrets and automatically restart your command with the new secrets. When your command restarts, it will have the new environment variables injeceted into it. Please note that this feature is intended for development purposes. It is not recommended to use this in production environments. Generally it's not recommended to automatically reload your application in production when remote changes are made. --- # Source: https://infisical.com/docs/integrations/cicd/rundeck.md # Rundeck > How to sync secrets from Infisical to Rundeck Prerequisites: * Set up and add envars to [Infisical Cloud](https://app.infisical.com) Obtain a User API Token in the Profile settings of Rundeck integrations rundeck token Navigate to your project's integrations tab in Infisical. integrations Press on the Rundeck tile and input your Rundeck instance Base URL and User API token to grant Infisical access to manage Rundeck keys integrations rundeck authorization Select which Infisical environment secrets you want to sync to a Rundeck Key Storage Path and press create integration to start syncing secrets to Rundeck. create integration rundeck integrations rundeck --- # Source: https://infisical.com/docs/sdks/languages/rust.md > ## Documentation Index > Fetch the complete documentation index at: https://infisical.com/docs/llms.txt > Use this file to discover all available pages before exploring further. # Infisical Rust SDK If you're working with Rust, the official Infisical Rust SDK package is the easiest way to fetch and work with secrets for your application. ### Installation ```bash theme={"dark"} cargo add infisical ``` ### Getting Started The easiest way to get started is to use the builder pattern for both the client and your requests. ```rust theme={"dark"} use infisical::{AuthMethod, Client, InfisicalError, encode_base64, decode_base64}; use infisical::secrets::GetSecretRequest; async fn fetch_secret() -> Result<(), InfisicalError> { // 1. Build the client. You can chain methods to configure it. let mut client = Client::builder() .base_url("https://app.infisical.com") // Optional: defaults to https://app.infisical.com .build() .await?; // 2. Set up your authentication method and log in. let auth_method = AuthMethod::new_universal_auth("", ""); client.login(auth_method).await?; // 3. Build a request to get a secret. // Required parameters (name, project_id, environment) are passed to `builder()`. let request = GetSecretRequest::builder("API_KEY", "", "dev") .path("/") // Optional parameters are set with builder methods. .build(); // 4. Make the API call. let secret = client.secrets().get(request).await?; println!("Fetched secret key: {}", secret.secret_key); // For security, avoid printing the secret value in production code! // println!("Secret value: {}", secret.secret_value); Ok(()) } ``` ### Client Configuration The `Client::builder()` provides several configuration options: ```rust theme={"dark"} let mut client = Client::builder() .base_url("https://app.infisical.com") // Optional: set custom Infisical instance URL .build() .await?; ``` **Parameters** * `.base_url(url)`: Optional method to set the Infisical instance URL. Defaults to `https://app.infisical.com` for Infisical Cloud. Use `https://eu.infisical.com` for EU and `http://localhost:8080` for local development. ### Core Methods The SDK methods are organized into the following high-level categories: * `Client::builder()`: The main entry point for creating a client. * `client.login()`: Allows client to make authenticated requests to the API. * `client.secrets()`: Provides access to all CRUD operations for secrets. * `client.kms()`: Provides access to all KMS (Key Management Service) operations. ### Helper Functions The SDK provides utility functions for common operations: ```rust theme={"dark"} use infisical::{encode_base64, decode_base64}; // Base64 encode a string let encoded = encode_base64("sensitive data"); println!("Encoded: {}", encoded); // Base64 decode a string let decoded = decode_base64(&encoded)?; println!("Decoded: {}", decoded); ``` **Available Functions** * `encode_base64(data: &str) -> String`: Encodes a string as base64 * `decode_base64(data: &str) -> Result`: Decodes a base64 string ### `secrets` All secret operations are accessed via `client.secrets()`. Each operation has a dedicated request builder. #### Create Secret Create a new secret in your project. **Example** ```rust theme={"dark"} use infisical::secrets::CreateSecretRequest; let request = CreateSecretRequest::builder( "API_KEY", "your-secret-value", "", "dev" ) .path("/") .secret_comment("A comment for the new secret") .build(); let created_secret = client.secrets().create(request).await?; ``` **Parameters** * `secret_name`, `secret_value`, `project_id`, `environment`: Required parameters passed to the `builder()` function. * `.path(path)`: Optional method to set the secret's path (defaults to `/`). * `.secret_comment(comment)`: Optional method to add a comment. * `.skip_multiline_encoding(bool)`: Optional method to control multiline encoding (defaults to `false`). * `.r#type(type)`: Optional method to set the secret type (`shared` or `personal`), defaults to `shared`. #### Get Secret Retrieve a specific secret by name. **Example** ```rust theme={"dark"} use infisical::secrets::GetSecretRequest; let request = GetSecretRequest::builder("API_KEY", "", "dev") .path("/") .build(); let secret = client.secrets().get(request).await?; ``` **Parameters** * `secret_name`, `project_id`, `environment`: Required parameters passed to the `builder()` function. * `.path(path)`: Optional method to set the secret's path (defaults to `/`). * `.expand_secret_references(bool)`: Optional method to control secret reference expansion (defaults to `true`). * `.r#type(type)`: Optional method to set the secret type (`shared` or `personal`), defaults to `shared`. #### List Secrets List all secrets in a project and environment. **Example** ```rust theme={"dark"} use infisical::secrets::ListSecretsRequest; let request = ListSecretsRequest::builder("", "dev") .path("/") .recursive(true) .build(); let secrets = client.secrets().list(request).await?; ``` **Parameters** * `project_id`, `environment`: Required parameters passed to the `builder()` function. * `.path(path)`: Optional method to set the path from which to list secrets (defaults to `/`). * `.expand_secret_references(bool)`: Optional method to control secret reference expansion (defaults to `true`). * `.recursive(bool)`: Optional method to recursively list secrets from sub-folders (defaults to `false`). * `.attach_to_process_env(bool)`: Optional method to attach fetched secrets to the current process's environment variables (defaults to `false`). #### Update Secret Update an existing secret. **Example** ```rust theme={"dark"} use infisical::secrets::UpdateSecretRequest; let request = UpdateSecretRequest::builder("API_KEY", "", "dev") .secret_value("new-secret-value") // Set the new value .build(); let updated_secret = client.secrets().update(request).await?; ``` **Parameters** * `secret_name`, `project_id`, `environment`: Required parameters passed to the `builder()` function. * `.new_secret_name(name)`: Optional method to rename the secret. * `.secret_value(value)`: Optional method to set a new value for the secret. * `.path(path)`: Optional method to set the secret's path. * `.secret_comment(comment)`: Optional method to add or change the comment. * `.skip_multiline_encoding(bool)`: Optional method to control multiline encoding. * `.r#type(type)`: Optional method to set the secret type (`shared` or `personal`). #### Delete Secret Delete a secret from your project. **Example** ```rust theme={"dark"} use infisical::secrets::DeleteSecretRequest; let request = DeleteSecretRequest::builder("API_KEY", "", "dev") .path("/") .build(); let deleted_secret = client.secrets().delete(request).await?; ``` **Parameters** * `secret_name`, `project_id`, `environment`: Required parameters passed to the `builder()` function. * `.path(path)`: Optional method to set the secret's path (defaults to `/`). * `.r#type(type)`: Optional method to set the secret type (`shared` or `personal`), defaults to `shared`. ### `kms` All KMS (Key Management Service) operations are accessed via `client.kms()`. Each operation has a dedicated request builder. #### List KMS Keys List all KMS keys in a project. **Example** ```rust theme={"dark"} use infisical::kms::ListKmsKeysRequest; let request = ListKmsKeysRequest::builder("").build(); let keys = client.kms().list(request).await?; ``` **Parameters** * `project_id`: Required parameter passed to the `builder()` function. #### Get KMS Key Retrieve a specific KMS key by ID. **Example** ```rust theme={"dark"} use infisical::kms::GetKmsKeyRequest; let request = GetKmsKeyRequest::builder("").build(); let key = client.kms().get(request).await?; ``` **Parameters** * `key_id`: Required parameter passed to the `builder()` function. #### Get KMS Key by Name Retrieve a specific KMS key by name. **Example** ```rust theme={"dark"} use infisical::kms::GetKmsKeyByNameRequest; let request = GetKmsKeyByNameRequest::builder("").build(); let key = client.kms().get_by_name(request).await?; ``` **Parameters** * `key_name`: Required parameter passed to the `builder()` function. #### Create KMS Key Create a new KMS key in your project. **Example** ```rust theme={"dark"} use infisical::kms::{CreateKmsKeyRequest, EncryptionAlgorithm, KeyUsage}; let request = CreateKmsKeyRequest::builder("", "my-key") .description("A key for encryption operations") .key_usage(KeyUsage::EncryptDecrypt) .encryption_algorithm(EncryptionAlgorithm::Aes256Gcm) .build(); let created_key = client.kms().create(request).await?; ``` **Parameters** * `project_id`, `name`: Required parameters passed to the `builder()` function. * `.description(description)`: Optional method to set the key description. * `.key_usage(usage)`: Optional method to set the key usage using the `KeyUsage` enum (defaults to `KeyUsage::EncryptDecrypt`). * `.encryption_algorithm(algorithm)`: Optional method to set the encryption algorithm using the `EncryptionAlgorithm` enum (defaults to `EncryptionAlgorithm::Aes256Gcm`). #### Update KMS Key Update an existing KMS key. **Example** ```rust theme={"dark"} use infisical::kms::UpdateKmsKeyRequest; let request = UpdateKmsKeyRequest::builder("") .name("updated-key-name") .description("Updated description") .is_disabled(false) .build(); let updated_key = client.kms().update(request).await?; ``` **Parameters** * `key_id`: Required parameter passed to the `builder()` function. * `.name(name)`: Optional method to rename the key. * `.description(description)`: Optional method to update the key description. * `.is_disabled(disabled)`: Optional method to enable or disable the key. #### Delete KMS Key Delete a KMS key from your project. **Example** ```rust theme={"dark"} use infisical::kms::DeleteKmsKeyRequest; let request = DeleteKmsKeyRequest::builder("").build(); let deleted_key = client.kms().delete(request).await?; ``` **Parameters** * `key_id`: Required parameter passed to the `builder()` function. #### Encrypt Data Encrypt data using a KMS key. **Example** ```rust theme={"dark"} use infisical::kms::EncryptRequest; let request = EncryptRequest::builder("", "sensitive data").build(); let ciphertext = client.kms().encrypt(request).await?; ``` **Parameters** * `key_id`, `plaintext`: Required parameters passed to the `builder()` function. #### Decrypt Data Decrypt data using a KMS key. **Example** ```rust theme={"dark"} use infisical::kms::DecryptRequest; let request = DecryptRequest::builder("", "encrypted-data").build(); let plaintext = client.kms().decrypt(request).await?; ``` **Parameters** * `key_id`, `ciphertext`: Required parameters passed to the `builder()` function. #### Sign Data Sign data using a KMS key. **Example** ```rust theme={"dark"} use infisical::kms::{SigningAlgorithm, SignRequest}; let request = SignRequest::builder("", "data to sign") .signing_algorithm(SigningAlgorithm::RsassaPkcs1V15Sha256) .is_digest(false) .build(); let signature = client.kms().sign(request).await?; ``` **Parameters** * `key_id`, `data`: Required parameters passed to the `builder()` function. * `.signing_algorithm(algorithm)`: Optional method to set the signing algorithm using the `SigningAlgorithm` enum (defaults to `SigningAlgorithm::RsassaPkcs1V15Sha256`). * `.is_digest(is_digest)`: Optional method to indicate if the data is a digest (defaults to `false`). #### Verify Signature Verify a signature using a KMS key. **Example** ```rust theme={"dark"} use infisical::kms::{SigningAlgorithm, VerifyRequest}; let request = VerifyRequest::builder("", "data to sign", "signature") .signing_algorithm(SigningAlgorithm::RsassaPkcs1V15Sha256) .is_digest(false) .build(); let verification = client.kms().verify(request).await?; ``` **Parameters** * `key_id`, `data`, `signature`: Required parameters passed to the `builder()` function. * `.signing_algorithm(algorithm)`: Optional method to set the signing algorithm using the `SigningAlgorithm` enum (defaults to `SigningAlgorithm::RsassaPkcs1V15Sha256`). * `.is_digest(is_digest)`: Optional method to indicate if the data is a digest (defaults to `false`). #### Get Public Key Get the public key for a KMS key. **Example** ```rust theme={"dark"} let public_key = client.kms().get_public_key("").await?; ``` **Parameters** * `key_id`: The ID of the key to get the public key for. #### Get Signing Algorithms Get the available signing algorithms for a KMS key. **Example** ```rust theme={"dark"} let algorithms = client.kms().get_signing_algorithms("").await?; ``` **Parameters** * `key_id`: The ID of the key to get signing algorithms for. ## Development and Testing ### Environment Setup For development and testing, you'll need to set up environment variables. Create a `.env` file in your project root: ```env theme={"dark"} INFISICAL_CLIENT_ID=your_client_id_here INFISICAL_CLIENT_SECRET=your_client_secret_here INFISICAL_BASE_URL=http://localhost:8080 # Optional: for local development # Project IDs for different resources INFISICAL_SECRETS_PROJECT_ID=your_project_id_here INFISICAL_KMS_PROJECT_ID=your_project_id_here ``` ### Getting Credentials To obtain the required credentials: 1. **Client ID and Secret**: Create a Universal Auth machine identity in your Infisical project settings 2. **Project ID**: Found in your project settings or URL when viewing a project in the Infisical dashboard ### Running Tests Tests that require authentication are marked with `#[ignore]` and need valid credentials: ```bash theme={"dark"} # Run ignored tests (requires .env file with valid credentials) cargo test -- --ignored --nocapture # Run a specific test cargo test test_kms_resource -- --ignored --nocapture ``` **Note**: Integration tests require a running Infisical instance and valid authentication credentials. --- # Source: https://infisical.com/docs/documentation/platform/dynamic-secrets/sap-ase.md > ## Documentation Index > Fetch the complete documentation index at: https://infisical.com/docs/llms.txt > Use this file to discover all available pages before exploring further. # SAP ASE > Learn how to dynamically generate SAP ASE database account credentials. The Infisical SAP ASE dynamic secret allows you to generate SAP ASE database credentials on demand. ## Prerequisite * Infisical requires that you have a user in your SAP ASE instance, configured with the appropriate permissions. This user will facilitate the creation of new accounts as needed. Ensure the user possesses privileges for creating, dropping, and granting permissions to roles for it to be able to create dynamic secrets. The user used for authentication must have access to the `master` database. You can use the `sa` user for this purpose or create a new user with the necessary permissions. * The SAP ASE instance should be reachable by Infisical. ## Set up Dynamic Secrets with SAP ASE Open the Secret Overview dashboard and select the environment in which you would like to add a dynamic secret. Add Dynamic Secret Button Dynamic Secret Modal Name by which you want the secret to be referenced Default time-to-live for a generated secret (it is possible to modify this value when a secret is generate) The maximum time-to-live for a generated secret Your SAP ASE instance host (IP or domain) Your SAP ASE instance port. On default SAP ASE instances this is usually `5000`. The database name that you want to generate credentials for. This database must exist on the SAP ASE instance. Please note that the user/password used for authentication must have access to this database, **and** the `master` database. Username that will be used to create dynamic secrets Password that will be used to create dynamic secrets Dynamic Secret Setup Modal Modify SQL Statements Modal Specifies a template for generating usernames. This field allows customization of how usernames are automatically created. Allowed template variables are: * `{{randomUsername}}`: Random username string. * `{{unixTimestamp}}`: Current Unix timestamp at the time of lease creation. * `{{identity.name}}`: Name of the identity that is generating the lease. * `{{dynamicSecret.name}}`: Name of the associated dynamic secret. * `{{dynamicSecret.type}}`: Type of the associated dynamic secret. * `{{random N}}`: Random string of N characters. Allowed template functions are: * `truncate`: Truncates a string to a specified length. * `replace`: Replaces a substring with another value. * `uppercase`: Converts a string to uppercase. * `lowercase`: Converts a string to lowercase. Examples: ```yaml theme={"dark"} {{ randomUsername }} // 3POnzeFyK9gW2nioK0q2gMjr6CZqsRiX {{ unixTimestamp }} // 17490641580 {{ identity.name }} // {{ random 5 }} // x9K2m {{ truncate identity.name 4 }} // test {{ replace identity.name '' 'new-value' }} // new-value ``` If you want to provide specific privileges for the generated dynamic credentials, you can modify the SQL statement to your needs. Due to SAP ASE limitations, the attached SQL statements are not executed as a transaction. After submitting the form, you will see a dynamic secret created in the dashboard. Once you've successfully configured the dynamic secret, you're ready to generate on-demand credentials. To do this, simply click on the 'Generate' button which appears when hovering over the dynamic secret item. Alternatively, you can initiate the creation of a new lease by selecting 'New Lease' from the dynamic secret lease list section. Dynamic Secret Dynamic Secret When generating these secrets, it's important to specify a Time-to-Live (TTL) duration. This will dictate how long the credentials are valid for. Provision Lease Ensure that the TTL for the lease falls within the maximum TTL defined when configuring the dynamic secret in step 4. Once you click the `Submit` button, a new secret lease will be generated and the credentials for it will be shown to you. Provision Lease ## Audit or Revoke Leases Once you have created one or more leases, you will be able to access them by clicking on the respective dynamic secret item on the dashboard. This will allow you see the lease details and delete the lease ahead of its expiration time. Provision Lease ## Renew Leases To extend the life of the generated dynamic secret lease past its initial time to live, simply click on the **Renew** as illustrated below. Provision Lease Lease renewals cannot exceed the maximum TTL set when configuring the dynamic secret. --- # Source: https://infisical.com/docs/documentation/platform/dynamic-secrets/sap-hana.md > ## Documentation Index > Fetch the complete documentation index at: https://infisical.com/docs/llms.txt > Use this file to discover all available pages before exploring further. # SAP HANA > Learn how to dynamically generate SAP HANA database account credentials. The Infisical SAP HANA dynamic secret allows you to generate SAP HANA database credentials on demand. ## Prerequisite * Infisical requires a SAP HANA database user in your instance with the necessary permissions. This user will facilitate the creation of new accounts as needed. Ensure the user possesses privileges for creating, dropping, and granting permissions to roles for it to be able to create dynamic secrets. * The SAP HANA instance should be reachable by Infisical. ## Set up Dynamic Secrets with SAP HANA Open the Secret Overview dashboard and select the environment in which you would like to add a dynamic secret. Add Dynamic Secret Button Dynamic Secret Modal Name by which you want the secret to be referenced Default time-to-live for a generated secret (it is possible to modify this value after a secret is generated) Maximum time-to-live for a generated secret SAP HANA Host SAP HANA Port Username that will be used to create dynamic secrets Password that will be used to create dynamic secrets A CA may be required for SSL if you are self-hosting SAP HANA Dynamic Secret Setup Modal Modify SQL Statements Modal Specifies a template for generating usernames. This field allows customization of how usernames are automatically created. Allowed template variables are: * `{{randomUsername}}`: Random username string. * `{{unixTimestamp}}`: Current Unix timestamp at the time of lease creation. * `{{identity.name}}`: Name of the identity that is generating the lease. * `{{dynamicSecret.name}}`: Name of the associated dynamic secret. * `{{dynamicSecret.type}}`: Type of the associated dynamic secret. * `{{random N}}`: Random string of N characters. Allowed template functions are: * `truncate`: Truncates a string to a specified length. * `replace`: Replaces a substring with another value. * `uppercase`: Converts a string to uppercase. * `lowercase`: Converts a string to lowercase. Examples: ```yaml theme={"dark"} {{ randomUsername }} // 3POnzeFyK9gW2nioK0q2gMjr6CZqsRiX {{ unixTimestamp }} // 17490641580 {{ identity.name }} // {{ random 5 }} // x9K2m {{ truncate identity.name 4 }} // test {{ replace identity.name '' 'new-value' }} // new-value ``` If you want to provide specific privileges for the generated dynamic credentials, you can modify the SQL statement to your needs. Due to SAP HANA limitations, the attached SQL statements are not executed as a transaction. After submitting the form, you will see a dynamic secret created in the dashboard. If this step fails, you may have to add the CA certficate. Once you've successfully configured the dynamic secret, you're ready to generate on-demand credentials. To do this, simply click on the 'Generate' button which appears when hovering over the dynamic secret item. Alternatively, you can initiate the creation of a new lease by selecting 'New Lease' from the dynamic secret lease list section. Dynamic Secret Dynamic Secret When generating these secrets, it's important to specify a Time-to-Live (TTL) duration. This will dictate how long the credentials are valid for. Provision Lease Ensure that the TTL for the lease falls within the maximum TTL defined when configuring the dynamic secret in step 4. Once you click the `Submit` button, a new secret lease will be generated and the credentials for it will be shown to you. Provision Lease ## Audit or Revoke Leases Once you have created one or more leases, you will be able to access them by clicking on the respective dynamic secret item on the dashboard. This will allow you to see the lease details and delete the lease ahead of its expiration time. Provision Lease ## Renew Leases To extend the life of the generated dynamic secret lease past its initial time to live, simply click on the **Renew** button as illustrated below. Provision Lease Lease renewals cannot exceed the maximum TTL set when configuring the dynamic secret. --- # Source: https://infisical.com/docs/cli/commands/scan-git-changes.md > ## Documentation Index > Fetch the complete documentation index at: https://infisical.com/docs/llms.txt > Use this file to discover all available pages before exploring further. # scan git-changes > Scan for secrets in your uncommitted code ```bash theme={"dark"} infisical scan git-changes # Display the full secret findings infisical scan git-changes --verbose ``` ## Description Scanning for secrets before you commit your changes is great way to prevent leaks. Infisical makes this easy with the sub command `git-changes`. The `git-changes` scans for uncommitted changes in a Git repository, and is especially designed for use on developer machines, aligning with the ['shift left'](https://cloud.google.com/architecture/devops/devops-tech-shifting-left-on-security) security approach. When `git-changes` is run on a Git repository, Infisical parses the output from a `git diff` command. To scan changes in commits that have been staged via `git add`, you can add the `--staged` flag to the sub command. This flag is particularly useful when using Infisical CLI as a pre-commit tool. ### Flags **Description** detect secrets in a --staged state Default value: `false` **Description** git log options Short hand: `-b` **Description** path to baseline with issues that can be ignored Short hand: `-c` **Description** config file path order of precedence: 1. \--config flag 2. env var INFISICAL\_SCAN\_CONFIG 3. (--source/-s)/.infisical-scan.toml If none of the three options are used, then Infisical will use the default config **Description** exit code when leaks have been encountered (default 1) **Description** files larger than this will be skipped **Description** turn off color for verbose output **Description** redact secrets from logs and stdout **Description** output format (json, csv, sarif) (default "json") **Description** report file **Description** path to source (default ".") **Description** show verbose output from scan --- # Source: https://infisical.com/docs/cli/commands/scan-install.md > ## Documentation Index > Fetch the complete documentation index at: https://infisical.com/docs/llms.txt > Use this file to discover all available pages before exploring further. # scan install > Add various scanning tools seamlessly into your development lifecycle ```bash theme={"dark"} infisical scan install --pre-commit-hook ``` ## Description The command `infisical scan install` is designed to incorporate various scanning tools seamlessly into your development lifecycle. Initially, we are offering users the ability to install a pre-commit hook. This hook conducts an automatic scan for any exposed secrets in your commits before they are pushed. ### Flags ```bash theme={"dark"} infisical scan install --pre-commit-hook ``` **Description** Installs a git pre-commit hook that triggers Infisical to scan your staged changes for any exposed secrets prior to pushing. --- # Source: https://infisical.com/docs/api-reference/endpoints/secret-scanning/data-sources/gitlab/scan-resource.md # Source: https://infisical.com/docs/api-reference/endpoints/secret-scanning/data-sources/github/scan-resource.md # Source: https://infisical.com/docs/api-reference/endpoints/secret-scanning/data-sources/bitbucket/scan-resource.md > ## Documentation Index > Fetch the complete documentation index at: https://infisical.com/docs/llms.txt > Use this file to discover all available pages before exploring further. # Scan Resource > Trigger a scan for the specified Bitbucket Data Source resource. ## OpenAPI ````yaml POST /api/v2/secret-scanning/data-sources/bitbucket/{dataSourceId}/resources/{resourceId}/scan openapi: 3.0.3 info: title: Infisical API description: List of all available APIs that can be consumed version: 0.0.1 servers: - url: https://us.infisical.com description: Production server (US) - url: https://eu.infisical.com description: Production server (EU) - url: http://localhost:8080 description: Local server security: [] paths: /api/v2/secret-scanning/data-sources/bitbucket/{dataSourceId}/resources/{resourceId}/scan: post: tags: - Secret Scanning description: Trigger a scan for the specified Bitbucket Data Source resource. operationId: triggerBitbucketDataSourceResourceScan parameters: - schema: type: string format: uuid in: path name: dataSourceId required: true description: The ID of the Bitbucket Data Source to trigger a scan for. - schema: type: string format: uuid in: path name: resourceId required: true description: The ID of the individual Data Source resource to trigger a scan for. responses: '200': description: Default Response content: application/json: schema: type: object properties: dataSource: type: object properties: id: type: string format: uuid externalId: type: string nullable: true name: type: string description: type: string nullable: true encryptedCredentials: nullable: true isAutoScanEnabled: type: boolean default: true nullable: true projectId: type: string createdAt: type: string format: date-time updatedAt: type: string format: date-time isDisconnected: type: boolean default: false type: type: string enum: - bitbucket connectionId: type: string format: uuid connection: type: object properties: app: type: string enum: - bitbucket name: type: string id: type: string format: uuid required: - app - name - id additionalProperties: false config: type: object properties: workspaceSlug: type: string minLength: 1 maxLength: 128 description: The workspace to scan. includeRepos: type: array items: type: string minLength: 1 maxLength: 256 minItems: 1 maxItems: 100 default: - '*' description: >- The repositories to include when scanning. Defaults to all repositories (["*"]). required: - workspaceSlug additionalProperties: false required: - id - name - projectId - createdAt - updatedAt - type - connectionId - connection - config additionalProperties: false title: Bitbucket required: - dataSource additionalProperties: false '400': description: Default Response content: application/json: schema: type: object properties: reqId: type: string statusCode: type: number enum: - 400 message: type: string error: type: string details: {} required: - reqId - statusCode - message - error additionalProperties: false '401': description: Default Response content: application/json: schema: type: object properties: reqId: type: string statusCode: type: number enum: - 401 message: type: string error: type: string required: - reqId - statusCode - message - error additionalProperties: false '403': description: Default Response content: application/json: schema: type: object properties: reqId: type: string statusCode: type: number enum: - 403 message: type: string details: {} error: type: string required: - reqId - statusCode - message - error additionalProperties: false '404': description: Default Response content: application/json: schema: type: object properties: reqId: type: string statusCode: type: number enum: - 404 message: type: string error: type: string required: - reqId - statusCode - message - error additionalProperties: false '422': description: Default Response content: application/json: schema: type: object properties: reqId: type: string statusCode: type: number enum: - 422 message: {} error: type: string required: - reqId - statusCode - error additionalProperties: false '500': description: Default Response content: application/json: schema: type: object properties: reqId: type: string statusCode: type: number enum: - 500 message: type: string error: type: string required: - reqId - statusCode - message - error additionalProperties: false ```` --- # Source: https://infisical.com/docs/cli/commands/scan.md # Source: https://infisical.com/docs/api-reference/endpoints/secret-scanning/data-sources/gitlab/scan.md # Source: https://infisical.com/docs/api-reference/endpoints/secret-scanning/data-sources/github/scan.md # Source: https://infisical.com/docs/api-reference/endpoints/secret-scanning/data-sources/bitbucket/scan.md > ## Documentation Index > Fetch the complete documentation index at: https://infisical.com/docs/llms.txt > Use this file to discover all available pages before exploring further. # Scan > Trigger a scan for the specified Bitbucket Data Source. ## OpenAPI ````yaml POST /api/v2/secret-scanning/data-sources/bitbucket/{dataSourceId}/scan openapi: 3.0.3 info: title: Infisical API description: List of all available APIs that can be consumed version: 0.0.1 servers: - url: https://us.infisical.com description: Production server (US) - url: https://eu.infisical.com description: Production server (EU) - url: http://localhost:8080 description: Local server security: [] paths: /api/v2/secret-scanning/data-sources/bitbucket/{dataSourceId}/scan: post: tags: - Secret Scanning description: Trigger a scan for the specified Bitbucket Data Source. operationId: triggerBitbucketDataSourceScan parameters: - schema: type: string format: uuid in: path name: dataSourceId required: true description: The ID of the Bitbucket Data Source to trigger a scan for. responses: '200': description: Default Response content: application/json: schema: type: object properties: dataSource: type: object properties: id: type: string format: uuid externalId: type: string nullable: true name: type: string description: type: string nullable: true encryptedCredentials: nullable: true isAutoScanEnabled: type: boolean default: true nullable: true projectId: type: string createdAt: type: string format: date-time updatedAt: type: string format: date-time isDisconnected: type: boolean default: false type: type: string enum: - bitbucket connectionId: type: string format: uuid connection: type: object properties: app: type: string enum: - bitbucket name: type: string id: type: string format: uuid required: - app - name - id additionalProperties: false config: type: object properties: workspaceSlug: type: string minLength: 1 maxLength: 128 description: The workspace to scan. includeRepos: type: array items: type: string minLength: 1 maxLength: 256 minItems: 1 maxItems: 100 default: - '*' description: >- The repositories to include when scanning. Defaults to all repositories (["*"]). required: - workspaceSlug additionalProperties: false required: - id - name - projectId - createdAt - updatedAt - type - connectionId - connection - config additionalProperties: false title: Bitbucket required: - dataSource additionalProperties: false '400': description: Default Response content: application/json: schema: type: object properties: reqId: type: string statusCode: type: number enum: - 400 message: type: string error: type: string details: {} required: - reqId - statusCode - message - error additionalProperties: false '401': description: Default Response content: application/json: schema: type: object properties: reqId: type: string statusCode: type: number enum: - 401 message: type: string error: type: string required: - reqId - statusCode - message - error additionalProperties: false '403': description: Default Response content: application/json: schema: type: object properties: reqId: type: string statusCode: type: number enum: - 403 message: type: string details: {} error: type: string required: - reqId - statusCode - message - error additionalProperties: false '404': description: Default Response content: application/json: schema: type: object properties: reqId: type: string statusCode: type: number enum: - 404 message: type: string error: type: string required: - reqId - statusCode - message - error additionalProperties: false '422': description: Default Response content: application/json: schema: type: object properties: reqId: type: string statusCode: type: number enum: - 422 message: {} error: type: string required: - reqId - statusCode - error additionalProperties: false '500': description: Default Response content: application/json: schema: type: object properties: reqId: type: string statusCode: type: number enum: - 500 message: type: string error: type: string required: - reqId - statusCode - message - error additionalProperties: false ```` --- # Source: https://infisical.com/docs/cli/scanning-overview.md > ## Documentation Index > Fetch the complete documentation index at: https://infisical.com/docs/llms.txt > Use this file to discover all available pages before exploring further. # Secret scanning > Scan and prevent secret leaks in your code base Building upon its core functionality of fetching and injecting secrets into your applications, Infisical now takes a significant step forward in bolstering your code security. We've enhanced our CLI tool to include a powerful scanning feature, capable of identifying more than 140 different types of secret leaks in your codebase. In addition to scanning for past leaks, this new addition also actively aids in preventing future leaks. # Scanning ```bash theme={"dark"} infisical scan # Display the full secret findings infisical scan --verbose ``` The `infisical scan` command serves to scan repositories, directories, and files. It's compatible with both individual developer machines and Continuous Integration (CI) environments. When you run `infisical scan` on a Git repository, Infisical will parses the output of a `git log -p` command. This command generates [patches](https://stackoverflow.com/questions/8279602/what-is-a-patch-in-git-version-control) that Infisical uses to identify secrets in your code. You can configure the range of commits that `git log` will cover using the `--log-opts` flag. Any options you can use with `git log -p` are valid for `--log-opts`. For instance, to instruct Infisical to scan a specific range of commits, use the following command: `infisical scan --log-opts="--all commitA..commitB"`. For more details, refer to the [Git log documentation](https://git-scm.com/docs/git-log). To scan individual files and directories, use the `--no-git` flag. **View [full details for this command](./commands/scan)** ```bash theme={"dark"} infisical scan git-changes # Display the full secret findings infisical scan git-changes --verbose ``` Scanning for secrets before you commit your changes is great way to prevent leaks. Infisical makes this easy with the sub command `git-changes`. The `git-changes` scans for uncommitted changes in a Git repository, and is especially designed for use on developer machines, aligning with the ['shift left'](https://cloud.google.com/architecture/devops/devops-tech-shifting-left-on-security) security approach. When `git-changes` is run on a Git repository, Infisical parses the output from a `git diff` command. To scan changes in commits that have been staged via `git add`, you can add the `--staged` flag to the sub command. This flag is particularly useful when using Infisical CLI as a pre-commit tool. **View [full details for this command](./commands/scan-git-changes)** ​ `git-changes` command is only for Git repositories; using it on files or directories will result in an error. # # # Automatically scan changes before you commit To lower the risk of committing hardcoded secrets to your code repository, we have designed a custom git pre-commit hook. This hook scans the changes you're about to commit for any exposed secrets. If any hardcoded secrets are detected, it will block your commit. ### Install pre-commit hook To install this git hook, go into your local git repository and run the following command. ```bash theme={"dark"} infisical scan install --pre-commit-hook ``` To disable this hook after installing it, run the command `git config --bool hooks.infisical-scan false` ### Third party hooks management If you would rather handle your pre-commit hook outside of the standard `.git/hooks` directory, you can quickly achieve this by adding the following command into your pre-commit script. For instance, if you utilize [Husky](https://typicode.github.io/husky/) for managing your Git hooks, you can insert the command provided below into your `.husky/pre-commit` file. ```bash theme={"dark"} infisical scan git-changes --staged --verbose ``` # # # Creating a baseline When scanning large repositories or repositories with a long history, it can be helpful to use a baseline. A baseline allows Infisical to ignore any old findings that are already present in the baseline findings. You can create a infisical scan report by running `infisical scan` with the `--report-path` flag. To create a Infisical scan report and save it in a file called leaks-report.json, use the following command: ``` infisical scan --report-path leaks-report.json ``` Once a baseline is created, you can apply it when running the `infisical scan` command again. Use the following command: ``` infisical scan --baseline-path leaks-report.json --report-path findings.json ``` After running the `scan` command with the `--baseline-path` flag, the report output in findings.json will only contain new issues. # # # Configuration file To customize the scan, such as specifying your own rules or establishing exceptions for certain files or paths that should not be flagged as risks, you can define these specifications in the configuration file. ```toml infisical-scan.toml theme={"dark"} # Title for the configuration file title = "Some title" # This configuration is the foundation that can be expanded. If there are any overlapping rules # between this base and the expanded configuration, the rules in this base will take priority. # Another aspect of extending configurations is the ability to link multiple files, up to a depth of 2. # "Allowlist" arrays get appended and may have repeated elements. # "useDefault" and "path" cannot be used simultaneously. Please choose one. [extend] # useDefault will extend the base configuration with the default config: # https://raw.githubusercontent.com/Infisical/infisical/main/cli/config/infisical-scan.toml useDefault = true # or you can supply a path to a configuration. Path is relative to where infisical cli # was invoked, not the location of the base config. path = "common_config.toml" # An array of tables that contain information that define instructions # on how to detect secrets [[rules]] # Unique identifier for this rule id = "some-identifier-for-rule" # Short human readable description of the rule. description = "awesome rule 1" # Golang regular expression used to detect secrets. Note Golang's regex engine # does not support lookaheads. regex = '''one-go-style-regex-for-this-rule''' # Golang regular expression used to match paths. This can be used as a standalone rule or it can be used # in conjunction with a valid `regex` entry. path = '''a-file-path-regex''' # Array of strings used for metadata and reporting purposes. tags = ["tag","another tag"] # A regex match may have many groups, this allows you to specify the group that should be used as (which group the secret is contained in) # its entropy checked if `entropy` is set. secretGroup = 3 # Float representing the minimum shannon entropy a regex group must have to be considered a secret. # Shannon entropy measures how random a data is. Since secrets are usually composed of many random characters, they typically have high entropy entropy = 3.5 # Keywords are used for pre-regex check filtering. # If rule has keywords but the text fragment being scanned doesn't have at least one of it's keywords, it will be skipped for processing further. # Ideally these values should either be part of the identifier or unique strings specific to the rule's regex # (introduced in v8.6.0) keywords = [ "auth", "password", "token", ] # You can include an allowlist table for a single rule to reduce false positives or ignore commits # with known/rotated secrets [rules.allowlist] description = "ignore commit A" commits = [ "commit-A", "commit-B"] paths = [ '''go\.mod''', '''go\.sum''' ] # note: (rule) regexTarget defaults to check the _Secret_ in the finding. # if regexTarget is not specified then _Secret_ will be used. # Acceptable values for regexTarget are "match" and "line" regexTarget = "match" regexes = [ '''process''', '''getenv''', ] # note: stopwords targets the extracted secret, not the entire regex match # if the extracted secret is found in the stopwords list, the finding will be skipped (i.e not included in report) stopwords = [ '''client''', '''endpoint''', ] # This is a global allowlist which has a higher order of precedence than rule-specific allowlists. # If a commit listed in the `commits` field below is encountered then that commit will be skipped and no # secrets will be detected for said commit. The same logic applies for regexes and paths. [allowlist] description = "global allow list" commits = [ "commit-A", "commit-B", "commit-C"] paths = [ '''gitleaks\.toml''', '''(.*?)(jpg|gif|doc)''' ] # note: (global) regexTarget defaults to check the _Secret_ in the finding. # if regexTarget is not specified then _Secret_ will be used. # Acceptable values for regexTarget are "match" and "line" regexTarget = "match" regexes = [ '''219-09-9999''', '''078-05-1120''', '''(9[0-9]{2}|666)-\d{2}-\d{4}''', ] # note: stopwords targets the extracted secret, not the entire regex match # if the extracted secret is found in the stopwords list, the finding will be skipped (i.e not included in report) stopwords = [ '''client''', '''endpoint''', ] ``` # # # Ignoring Known Secrets If you're intentionally committing a test secret that `infisical scan` might flag, you can instruct Infisical to overlook that secret with the methods listed below. ### infisical-scan:ignore To ignore a secret contained in line of code, simply add `infisical-scan:ignore ` at the end of the line as comment in the given programming. ```js example.js theme={"dark"} function helloWorld() { console.log("8dyfuiRyq=vVc3RRr_edRk-fK__JItpZ"); // infisical-scan:ignore } ``` ### .infisicalignore An alternative method to exclude specific findings involves creating a .infisicalignore file at your repository's root. You can then add the fingerprints of the findings you wish to exclude. The Infisical scan report provides a unique Fingerprint for each secret found. By incorporating these Fingerprints into the .infisicalignore file, Infisical will skip the corresponding secret findings in subsequent scans. ```.ignore .infisicalignore theme={"dark"} bea0ff6e05a4de73a5db625d4ae181a015b50855:frontend/components/utilities/attemptLogin.js:stripe-access-token:147 bea0ff6e05a4de73a5db625d4ae181a015b50855:backend/src/json/integrations.json:generic-api-key:5 1961b92340e5d2613acae528b886c842427ce5d0:frontend/components/utilities/attemptLogin.js:stripe-access-token:148 ``` --- # Source: https://infisical.com/docs/api-reference/endpoints/identities/search.md > ## Documentation Index > Fetch the complete documentation index at: https://infisical.com/docs/llms.txt > Use this file to discover all available pages before exploring further. # Search > Search machine identities ## OpenAPI ````yaml POST /api/v1/identities/search openapi: 3.0.3 info: title: Infisical API description: List of all available APIs that can be consumed version: 0.0.1 servers: - url: https://us.infisical.com description: Production server (US) - url: https://eu.infisical.com description: Production server (EU) - url: http://localhost:8080 description: Local server security: [] paths: /api/v1/identities/search: post: tags: - Identities description: Search machine identities operationId: searchMachineIdentities requestBody: content: application/json: schema: type: object properties: orderBy: type: string enum: - name - role default: name description: The column to order identities by. orderDirection: type: string enum: - asc - desc default: asc description: The direction to order identities in. limit: type: number maximum: 100 default: 50 description: The number of identities to return. offset: type: number default: 0 description: >- The offset to start from. If you enter 10, it will start from the 10th identity. search: type: object properties: name: anyOf: - type: string maxLength: 255 - type: object properties: $eq: type: string maxLength: 255 $contains: type: string maxLength: 255 $in: type: array items: type: string maxLength: 255 additionalProperties: false description: The name of the identity to filter by. role: anyOf: - type: string maxLength: 255 - type: object properties: $eq: type: string maxLength: 255 $in: type: array items: type: string maxLength: 255 additionalProperties: false description: The organizational role of the identity to filter by. $or: type: array items: type: object properties: name: anyOf: - type: string maxLength: 255 - type: object properties: $eq: type: string maxLength: 255 $contains: type: string maxLength: 255 $in: type: array items: type: string maxLength: 255 additionalProperties: false description: The name of the identity to filter by. role: anyOf: - type: string maxLength: 255 - type: object properties: $eq: type: string maxLength: 255 $in: type: array items: type: string maxLength: 255 additionalProperties: false description: >- The organizational role of the identity to filter by. additionalProperties: false description: The filters to apply to the search. maxItems: 5 additionalProperties: false description: The filters to apply to the search. additionalProperties: false responses: '200': description: Default Response content: application/json: schema: type: object properties: identities: type: array items: type: object properties: id: type: string format: uuid role: type: string roleId: type: string format: uuid nullable: true orgId: type: string format: uuid createdAt: type: string format: date-time updatedAt: type: string format: date-time identityId: type: string format: uuid lastLoginAuthMethod: type: string nullable: true lastLoginTime: type: string format: date-time nullable: true customRole: type: object properties: id: type: string format: uuid name: type: string slug: type: string permissions: {} description: type: string nullable: true required: - id - name - slug additionalProperties: false identity: type: object properties: name: type: string id: type: string format: uuid hasDeleteProtection: type: boolean default: false orgId: type: string format: uuid authMethods: type: array items: type: string required: - name - id - orgId - authMethods additionalProperties: false required: - id - role - orgId - createdAt - updatedAt - identityId - identity additionalProperties: false totalCount: type: number required: - identities - totalCount additionalProperties: false '400': description: Default Response content: application/json: schema: type: object properties: reqId: type: string statusCode: type: number enum: - 400 message: type: string error: type: string details: {} required: - reqId - statusCode - message - error additionalProperties: false '401': description: Default Response content: application/json: schema: type: object properties: reqId: type: string statusCode: type: number enum: - 401 message: type: string error: type: string required: - reqId - statusCode - message - error additionalProperties: false '403': description: Default Response content: application/json: schema: type: object properties: reqId: type: string statusCode: type: number enum: - 403 message: type: string details: {} error: type: string required: - reqId - statusCode - message - error additionalProperties: false '404': description: Default Response content: application/json: schema: type: object properties: reqId: type: string statusCode: type: number enum: - 404 message: type: string error: type: string required: - reqId - statusCode - message - error additionalProperties: false '422': description: Default Response content: application/json: schema: type: object properties: reqId: type: string statusCode: type: number enum: - 422 message: {} error: type: string required: - reqId - statusCode - error additionalProperties: false '500': description: Default Response content: application/json: schema: type: object properties: reqId: type: string statusCode: type: number enum: - 500 message: type: string error: type: string required: - reqId - statusCode - message - error additionalProperties: false security: - bearerAuth: [] components: securitySchemes: bearerAuth: type: http scheme: bearer bearerFormat: JWT description: An access token in Infisical ```` --- # Source: https://infisical.com/docs/documentation/platform/secret-reference.md > ## Documentation Index > Fetch the complete documentation index at: https://infisical.com/docs/llms.txt > Use this file to discover all available pages before exploring further. # Secret Referencing and Importing > Learn the fundamentals of secret referencing and importing in Infisical. ## Secret Referencing Infisical's secret referencing functionality makes it possible to reference the value of a "base" secret when defining the value of another secret. This means that updating the value of a base secret propagates directly to other secrets whose values depend on the base secret. secret referencing Since secret referencing reconstructs values on the client side, any client (user, service token, or machine identity) fetching secrets must have proper permissions to access all base and dependent secrets. Without sufficient permissions, secret references will not resolve to their appropriate values. For example, if secret A references values from secrets B and C located in different scopes, the client must have read access to all three scopes containing secrets A, B, and C. If permission to any referenced secret is missing, the reference will remain unresolved, potentially causing application errors or unexpected behavior. This is an important security consideration when planning your secret access strategy, especially when working with cross-environment or cross-folder references. You can hold the `Cmd` (Mac) or `Ctrl` (Windows/Linux) key and click the secret reference to be redirected to it. ### Syntax When defining a secret reference, interpolation syntax is used to define references to secrets in other environments and [folders](./folder). Suppose you have some secret `MY_SECRET` at the root of some environment and want to reference part of its value from another base secret `BASE_SECRET` located elsewhere. Then consider the following scenarios: * If `BASE_SECRET` is in the same environment and folder as `MY_SECRET`, then you'd reference it using `${BASE_SECRET}`. * If `BASE_SECRET` is at the root of another environment with the slug `dev`, then you'd reference it using `${dev.MY_SECRET}`. Here are a few more helpful examples for how to reference secrets in different contexts: | Reference syntax | Environment | Folder | Secret Key | | ----------------------- | ----------- | ----------------------------- | ---------- | | `${KEY1}` | same env | same folder | KEY1 | | `${dev.KEY2}` | `dev` | `/` (root of dev environment) | KEY2 | | `${prod.frontend.KEY2}` | `prod` | `/frontend` | KEY2 | ## Secret Imports Infisical's Secret Imports functionality makes it possible to import the secrets from another environment or folder into the current folder context. This can be useful if you have common secrets that need to be available across multiple environments/folders. To add a secret import, press the downward chevron to the right of the **Add Secret** button; then press on the **Add Import** button. add secret import Once added, a secret import will show up with a green import icon on the secrets dashboard. In the example below, you can see that the items in the path `/some-folder` are being imported into the current folder context. added secret import To delete a secret import, hover over it and press the **X** button that appears on the right side. delete secret import Lastly, note that the order of secret imports matters. If two secret imports contain secrets with the same name, then the secret value from the bottom-most secret import is taken — "the last one wins." To reorder a secret import, hover over it and drag the arrows handle to the position you want. reorder secret import