InfoGrab Docs

Microsoft OAuth 자격 증명 사전 구성

요약

위임된 액세스로 Microsoft Entra ID 앱 등록 설정을 완료한 후, credential overwrites를 사용하여 Client ID와 Client Secret을 n8n 시작 시 주입할 수 있습니다. n8n은 credential overwrites를 위한 세 가지 환경 변수를 지원합니다.

위임된 액세스로 Microsoft Entra ID 앱 등록 설정을 완료한 후, credential overwrites를 사용하여 Client ID와 Client Secret을 n8n 시작 시 주입할 수 있습니다. 이렇게 하면 조직의 사용자들이 자체 OAuth 앱 등록 없이 Microsoft 서비스에 연결할 수 있습니다.

n8n은 credential overwrites를 위한 세 가지 환경 변수를 지원합니다. 이 가이드에서는 CREDENTIALS_OVERWRITE_DATA_FILE을 사용합니다. 전체 변수 참조는 Credentials 환경 변수를 참고하세요.

자격 증명 파일 생성#

n8n이 실행 중인 호스트에서 docker-compose.yaml과 동일한 디렉토리에 credentials-overwrite.json 파일을 생성합니다.

파일에는 n8n credential type 이름을 키로 하는 JSON 객체가 포함됩니다. 예를 들어, Microsoft Outlook을 사전 구성하려면:

{
  "microsoftOutlookOAuth2Api": {
    "clientId": "YOUR_CLIENT_ID",
    "clientSecret": "YOUR_CLIENT_SECRET"
  }
}

여러 Microsoft 서비스를 한 번에 사전 구성하려면 각 credential type을 별도의 키로 추가합니다:

{
  "microsoftOutlookOAuth2Api": {
    "clientId": "YOUR_CLIENT_ID",
    "clientSecret": "YOUR_CLIENT_SECRET"
  },
  "microsoftOneDriveOAuth2Api": {
    "clientId": "YOUR_CLIENT_ID",
    "clientSecret": "YOUR_CLIENT_SECRET"
  }
}
Minified JSON

n8n은 JSON이 minified(공백이나 줄바꿈 없음) 형식이어야 합니다. 위 예시는 가독성을 위해 형식화되어 있습니다. 실제 파일에는 추가 공백이 없어야 합니다:

{"microsoftOutlookOAuth2Api":{"clientId":"YOUR_CLIENT_ID","clientSecret":"YOUR_CLIENT_SECRET"}}

각 Microsoft 서비스의 credential type 이름은 통합별 필수 스코프를 참고하세요.

Docker Compose#

compose.yaml에서 자격 증명 파일을 읽기 전용 볼륨으로 마운트하고 환경 변수를 설정합니다:

services:
  n8n:
    image: docker.n8n.io/n8nio/n8n:latest
    container_name: n8n
    restart: always
    ports:
      - "5678:5678"
    environment:
      - GENERIC_TIMEZONE=America/New_York
      - TZ=America/New_York
      - N8N_ENFORCE_SETTINGS_FILE_PERMISSIONS=true
      - N8N_LOG_LEVEL=debug
      - N8N_LOG_OUTPUT=file,console
      - N8N_LOG_FILE_COUNT_MAX=5
      - CREDENTIALS_OVERWRITE_DATA_FILE=/run/secrets/credentials-overwrite.json
    volumes:
      - n8n_data:/home/node/.n8n
      - ./credentials-overwrite.json:/run/secrets/credentials-overwrite.json:ro
    networks:
      - default
volumes:
  n8n_data:
    name: ${N8N_VOLUME:-n8n_data}
    external: true

컨테이너를 재시작하여 변경 사항을 적용합니다:

docker compose up -d

덮어쓰기 적용 확인#

n8n이 시작된 후, 사용자에게 사전 구성된 서비스 중 하나(예: Microsoft Outlook)에 대한 새 자격 증명을 생성하도록 합니다. 자격 증명 선택 화면에서 Managed OAuth2 (recommended) 옵션이 표시되어야 합니다.

Microsoft Entra credentials screen

사용자는 별도의 인증 없이 Connect to Microsoft Outlook을 클릭할 수 있습니다. Account connected 메시지가 표시되어야 합니다.

Managed OAuth 2 옵션이 표시되지 않으면 환경 변수가 올바르게 적용되지 않은 것입니다. 볼륨 마운트의 파일 경로가 CREDENTIALS_OVERWRITE_DATA_FILE 값과 일치하는지 확인하세요.

Kubernetes#

Kubernetes 배포의 경우 Docker 볼륨 마운트를 Kubernetes 네이티브 프리미티브로 교체합니다. 접근 방식은 클라우드 제공업체에 따라 다릅니다. 환경에 맞는 섹션을 선택하세요.

일반 Kubernetes Secret (EKS / AKS / GKE)#

이 방식은 추가 의존성 없이 세 가지 관리형 Kubernetes 제공업체 모두에서 작동합니다.

1. Secret 생성:

apiVersion: v1
kind: Secret
metadata:
  name: n8n-credentials-overwrite
  namespace: your-namespace
type: Opaque
stringData:
  credentials-overwrite.json: '{"microsoftOutlookOAuth2Api":{"clientId":"YOUR_CLIENT_ID","clientSecret":"YOUR_CLIENT_SECRET"}}'

2. Deployment에 Secret 마운트:

spec:
  containers:
    - name: n8n
      image: docker.n8n.io/n8nio/n8n:latest
      env:
        - name: CREDENTIALS_OVERWRITE_DATA_FILE
          value: /run/secrets/credentials-overwrite.json
        # ...다른 환경 변수
      volumeMounts:
        - name: credentials-overwrite
          mountPath: /run/secrets/credentials-overwrite.json
          subPath: credentials-overwrite.json
          readOnly: true
  volumes:
    - name: credentials-overwrite
      secret:
        secretName: n8n-credentials-overwrite

subPath 필드는 중요합니다. 이 필드가 없으면 Kubernetes가 단일 파일만 마운트하는 대신 전체 /run/secrets/ 디렉토리를 교체합니다.

대안: 인라인 환경 변수

볼륨 마운트를 생략하고 Secret을 직접 환경 변수로 참조할 수 있습니다:

env:
  - name: CREDENTIALS_OVERWRITE_DATA
    valueFrom:
      secretKeyRef:
        name: n8n-credentials-overwrite
        key: credentials-overwrite.json
stringData:
  credentials-json: '{"microsoftOutlookOAuth2Api":{"clientId":"...","clientSecret":"..."}}'

단일 서비스 설정에서는 더 깔끔하지만, 일부 Kubernetes 환경에서 환경 변수 크기를 제한(예: 변수당 128KB)한다는 점에 유의하세요. credential overwrites가 많은 경우 파일 기반 방식이 더 안전합니다.

AWS Secrets Manager (EKS)#

이 방식은 AWS Secrets Store CSI Driver를 사용하여 AWS Secrets Manager의 secret을 pod에 직접 마운트합니다. rotation 지원, CloudTrail 감사 로깅, 중앙 집중식 secret 관리를 제공합니다.

사전 요구 사항:

  • 클러스터에 Secrets Store CSI Driver와 ASCP(AWS Secrets and Configuration Provider) 설치
  • 클러스터에 IAM OIDC 제공자 구성(IRSA 필요)
  • secretsmanager:GetSecretValuesecretsmanager:DescribeSecret 권한이 있는 IAM 역할

1. AWS Secrets Manager에 secret 생성:

aws secretsmanager create-secret \
  --name n8n/credentials-overwrite \
  --description "n8n credential overwrites for Microsoft OAuth" \
  --secret-string '{"microsoftOutlookOAuth2Api":{"clientId":"YOUR_CLIENT_ID","clientSecret":"YOUR_CLIENT_SECRET"}}'

2. IAM 정책 생성:

{
  "Version": "2012-10-17",
  "Statement": [
    {
      "Effect": "Allow",
      "Action": [
        "secretsmanager:GetSecretValue",
        "secretsmanager:DescribeSecret"
      ],
      "Resource": "arn:aws:secretsmanager:REGION:ACCOUNT_ID:secret:n8n/credentials-overwrite-*"
    }
  ]
}
aws iam create-policy \
  --policy-name n8n-credentials-overwrite-read \
  --policy-document file://policy.json

3. IRSA로 서비스 계정 생성:

eksctl create iamserviceaccount \
  --name n8n-sa \
  --namespace your-namespace \
  --cluster your-cluster \
  --attach-policy-arn arn:aws:iam::ACCOUNT_ID:policy/n8n-credentials-overwrite-read \
  --approve

4. SecretProviderClass 생성:

apiVersion: secrets-store.csi.x-k8s.io/v1
kind: SecretProviderClass
metadata:
  name: n8n-credentials-overwrite
  namespace: your-namespace
spec:
  provider: aws
  parameters:
    objects: |
      - objectName: "n8n/credentials-overwrite"
        objectType: "secretsmanager"
        objectAlias: "credentials-overwrite.json"

5. n8n Deployment 업데이트:

apiVersion: apps/v1
kind: Deployment
metadata:
  name: n8n
  namespace: your-namespace
spec:
  template:
    spec:
      serviceAccountName: n8n-sa
      containers:
        - name: n8n
          image: docker.n8n.io/n8nio/n8n:latest
          env:
            - name: CREDENTIALS_OVERWRITE_DATA_FILE
              value: /run/secrets/credentials-overwrite.json
          volumeMounts:
            - name: credentials-overwrite
              mountPath: /run/secrets/credentials-overwrite.json
              subPath: credentials-overwrite.json
              readOnly: true
      volumes:
        - name: credentials-overwrite
          csi:
            driver: secrets-store.csi.k8s.io
            readOnly: true
            volumeAttributes:
              secretProviderClass: n8n-credentials-overwrite

Secret 교체:

Secrets Manager에서 값을 업데이트합니다:

aws secretsmanager update-secret \
  --secret-id n8n/credentials-overwrite \
  --secret-string '{"microsoftOutlookOAuth2Api":{"clientId":"NEW_CLIENT_ID","clientSecret":"NEW_CLIENT_SECRET"}}'

CSI driver는 폴링 간격(기본값: 2분)마다 업데이트된 값을 동기화합니다. n8n은 시작 시 자격 증명 파일을 읽으므로, 업데이트된 파일을 읽으려면 n8n pod를 재시작하세요.

Azure Key Vault (AKS)#

이 방식은 Azure Key Vault Provider for the Secrets Store CSI Driver를 사용하여 Azure Key Vault의 secret을 pod에 마운트합니다.

사전 요구 사항:

  • AKS 클러스터에 Secrets Store CSI Driver와 Azure Key Vault Provider 애드온 활성화
  • Azure Key Vault 인스턴스
  • 볼트에 접근 권한이 있는 managed identity 또는 service principal
  • 클러스터에 Workload Identity 활성화(pod identity보다 권장)

1. 기존 Key Vault 생성 또는 사용:

az keyvault create \
  --name n8n-credentials-vault \
  --resource-group your-resource-group \
  --location your-region

2. Key Vault에 secret 생성:

az keyvault secret set \
  --vault-name n8n-credentials-vault \
  --name n8n-credentials-overwrite \
  --value '{"microsoftOutlookOAuth2Api":{"clientId":"YOUR_CLIENT_ID","clientSecret":"YOUR_CLIENT_SECRET"}}'

3. Workload Identity 설정:

managed identity를 생성하고 federated credential을 설정합니다:

# managed identity 생성
az identity create \
  --name n8n-workload-identity \
  --resource-group your-resource-group \
  --location your-region

# identity client ID 가져오기
CLIENT_ID=$(az identity show \
  --name n8n-workload-identity \
  --resource-group your-resource-group \
  --query clientId -o tsv)

# Key Vault에 identity 접근 권한 부여
az keyvault set-policy \
  --name n8n-credentials-vault \
  --secret-permissions get \
  --spn "$CLIENT_ID"

# 클러스터의 OIDC issuer URL 가져오기
OIDC_ISSUER=$(az aks show \
  --name your-cluster \
  --resource-group your-resource-group \
  --query "oidcIssuerProfile.issuerUrl" -o tsv)

# federated credential 생성
az identity credential create \
  --name n8n-workload-identity \
  --resource-group your-resource-group \
  --issuer "$OIDC_ISSUER" \
  --subject system:serviceaccount:your-namespace:n8n-sa \
  --audience api://AzureADTokenExchange

4. Kubernetes ServiceAccount 생성:

apiVersion: v1
kind: ServiceAccount
metadata:
  name: n8n-sa
  namespace: your-namespace
  annotations:
    azure.workload.identity/client-id: "YOUR_MANAGED_IDENTITY_CLIENT_ID"
  labels:
    azure.workload.identity/use: "true"

5. SecretProviderClass 생성:

apiVersion: secrets-store.csi.x-k8s.io/v1
kind: SecretProviderClass
metadata:
  name: n8n-credentials-overwrite
  namespace: your-namespace
spec:
  provider: azure
  parameters:
    usePodIdentity: "false"
    useWorkloadIdentity: "true"
    clientID: "YOUR_MANAGED_IDENTITY_CLIENT_ID"
    keyvaultName: "n8n-credentials-vault"
    objects: |
      array:
        - |
          objectName: n8n-credentials-overwrite
          objectType: secret
          objectAlias: credentials-overwrite.json
    tenantId: "YOUR_TENANT_ID"

6. n8n Deployment 업데이트:

apiVersion: apps/v1
kind: Deployment
metadata:
  name: n8n
  namespace: your-namespace
spec:
  template:
    spec:
      serviceAccountName: n8n-sa
      containers:
        - name: n8n
          image: docker.n8n.io/n8nio/n8n:latest
          env:
            - name: CREDENTIALS_OVERWRITE_DATA_FILE
              value: /run/secrets/credentials-overwrite.json
          volumeMounts:
            - name: credentials-overwrite
              mountPath: /run/secrets/credentials-overwrite.json
              subPath: credentials-overwrite.json
              readOnly: true
      volumes:
        - name: credentials-overwrite
          csi:
            driver: secrets-store.csi.k8s.io
            readOnly: true
            volumeAttributes:
              secretProviderClass: n8n-credentials-overwrite

Secret 교체:

az keyvault secret set \
  --vault-name n8n-credentials-vault \
  --name n8n-credentials-overwrite \
  --value '{"microsoftOutlookOAuth2Api":{"clientId":"NEW_CLIENT_ID","clientSecret":"NEW_CLIENT_SECRET"}}'

CSI driver는 폴링 간격(기본값: 2분)마다 동기화합니다. 업데이트된 파일을 읽으려면 그 후 n8n pod를 재시작하세요.

Google Secret Manager (GKE)#

이 방식은 GCP provider for the Secrets Store CSI Driver를 사용하여 Google Secret Manager의 secret을 pod에 마운트합니다.

사전 요구 사항:

  • Workload Identity Federation이 활성화된 GKE 클러스터
  • 프로젝트에서 Secret Manager API 활성화
  • secretmanager.secretAccessor 역할이 있는 Google 서비스 계정

1. Secret Manager API 활성화:

gcloud services enable secretmanager.googleapis.com \
  --project your-project-id

2. Secret 생성:

echo -n '{"microsoftOutlookOAuth2Api":{"clientId":"YOUR_CLIENT_ID","clientSecret":"YOUR_CLIENT_SECRET"}}' | \
  gcloud secrets create n8n-credentials-overwrite \
    --data-file=- \
    --project your-project-id

3. Workload Identity Federation 설정:

# Google 서비스 계정 생성
gcloud iam service-accounts create n8n-secret-reader \
  --display-name="n8n Secret Reader" \
  --project your-project-id

# secret에 접근 권한 부여
gcloud secrets add-iam-policy-binding n8n-credentials-overwrite \
  --member="serviceAccount:n8n-secret-reader@your-project-id.iam.gserviceaccount.com" \
  --role="roles/secretmanager.secretAccessor" \
  --project your-project-id

# Kubernetes 서비스 계정을 Google 서비스 계정에 바인딩
gcloud iam service-accounts add-iam-policy-binding \
  n8n-secret-reader@your-project-id.iam.gserviceaccount.com \
  --role="roles/iam.workloadIdentityUser" \
  --member="serviceAccount:your-project-id.svc.id.goog[your-namespace/n8n-sa]"

4. Kubernetes ServiceAccount 생성:

apiVersion: v1
kind: ServiceAccount
metadata:
  name: n8n-sa
  namespace: your-namespace
  annotations:
    iam.gke.io/gcp-service-account: n8n-secret-reader@your-project-id.iam.gserviceaccount.com

5. CSI Driver와 GCP provider 설치:

# CSI driver 설치
helm repo add secrets-store-csi-driver https://kubernetes-sigs.github.io/secrets-store-csi-driver/charts
helm install csi-secrets-store secrets-store-csi-driver/secrets-store-csi-driver \
  --namespace kube-system

# GCP provider 설치
kubectl apply -f https://raw.githubusercontent.com/GoogleCloudPlatform/secrets-store-csi-driver-provider-gcp/main/deploy/provider-gcp-plugin.yaml

6. SecretProviderClass 생성:

apiVersion: secrets-store.csi.x-k8s.io/v1
kind: SecretProviderClass
metadata:
  name: n8n-credentials-overwrite
  namespace: your-namespace
spec:
  provider: gcp
  parameters:
    secrets: |
      - resourceName: "projects/your-project-id/secrets/n8n-credentials-overwrite/versions/latest"
        path: "credentials-overwrite.json"

7. n8n Deployment 업데이트:

apiVersion: apps/v1
kind: Deployment
metadata:
  name: n8n
  namespace: your-namespace
spec:
  template:
    spec:
      serviceAccountName: n8n-sa
      containers:
        - name: n8n
          image: docker.n8n.io/n8nio/n8n:latest
          env:
            - name: CREDENTIALS_OVERWRITE_DATA_FILE
              value: /run/secrets/credentials-overwrite.json
          volumeMounts:
            - name: credentials-overwrite
              mountPath: /run/secrets/credentials-overwrite.json
              subPath: credentials-overwrite.json
              readOnly: true
      volumes:
        - name: credentials-overwrite
          csi:
            driver: secrets-store.csi.k8s.io
            readOnly: true
            volumeAttributes:
              secretProviderClass: n8n-credentials-overwrite

Secret 교체:

새 버전의 secret을 생성합니다:

echo -n '{"microsoftOutlookOAuth2Api":{"clientId":"NEW_CLIENT_ID","clientSecret":"NEW_CLIENT_SECRET"}}' | \
  gcloud secrets versions add n8n-credentials-overwrite \
    --data-file=- \
    --project your-project-id

SecretProviderClass가 versions/latest를 참조하므로 CSI driver는 다음 동기화 시 새 버전을 가져옵니다. n8n이 업데이트된 파일을 읽으려면 n8n pod를 재시작하세요.

Microsoft OAuth 자격 증명 사전 구성

원문 보기
요약

위임된 액세스로 Microsoft Entra ID 앱 등록 설정을 완료한 후, credential overwrites를 사용하여 Client ID와 Client Secret을 n8n 시작 시 주입할 수 있습니다. n8n은 credential overwrites를 위한 세 가지 환경 변수를 지원합니다.

위임된 액세스로 Microsoft Entra ID 앱 등록 설정을 완료한 후, credential overwrites를 사용하여 Client ID와 Client Secret을 n8n 시작 시 주입할 수 있습니다. 이렇게 하면 조직의 사용자들이 자체 OAuth 앱 등록 없이 Microsoft 서비스에 연결할 수 있습니다.

n8n은 credential overwrites를 위한 세 가지 환경 변수를 지원합니다. 이 가이드에서는 CREDENTIALS_OVERWRITE_DATA_FILE을 사용합니다. 전체 변수 참조는 Credentials 환경 변수를 참고하세요.

자격 증명 파일 생성#

n8n이 실행 중인 호스트에서 docker-compose.yaml과 동일한 디렉토리에 credentials-overwrite.json 파일을 생성합니다.

파일에는 n8n credential type 이름을 키로 하는 JSON 객체가 포함됩니다. 예를 들어, Microsoft Outlook을 사전 구성하려면:

{
  "microsoftOutlookOAuth2Api": {
    "clientId": "YOUR_CLIENT_ID",
    "clientSecret": "YOUR_CLIENT_SECRET"
  }
}

여러 Microsoft 서비스를 한 번에 사전 구성하려면 각 credential type을 별도의 키로 추가합니다:

{
  "microsoftOutlookOAuth2Api": {
    "clientId": "YOUR_CLIENT_ID",
    "clientSecret": "YOUR_CLIENT_SECRET"
  },
  "microsoftOneDriveOAuth2Api": {
    "clientId": "YOUR_CLIENT_ID",
    "clientSecret": "YOUR_CLIENT_SECRET"
  }
}
Minified JSON

n8n은 JSON이 minified(공백이나 줄바꿈 없음) 형식이어야 합니다. 위 예시는 가독성을 위해 형식화되어 있습니다. 실제 파일에는 추가 공백이 없어야 합니다:

{"microsoftOutlookOAuth2Api":{"clientId":"YOUR_CLIENT_ID","clientSecret":"YOUR_CLIENT_SECRET"}}

각 Microsoft 서비스의 credential type 이름은 통합별 필수 스코프를 참고하세요.

Docker Compose#

compose.yaml에서 자격 증명 파일을 읽기 전용 볼륨으로 마운트하고 환경 변수를 설정합니다:

services:
  n8n:
    image: docker.n8n.io/n8nio/n8n:latest
    container_name: n8n
    restart: always
    ports:
      - "5678:5678"
    environment:
      - GENERIC_TIMEZONE=America/New_York
      - TZ=America/New_York
      - N8N_ENFORCE_SETTINGS_FILE_PERMISSIONS=true
      - N8N_LOG_LEVEL=debug
      - N8N_LOG_OUTPUT=file,console
      - N8N_LOG_FILE_COUNT_MAX=5
      - CREDENTIALS_OVERWRITE_DATA_FILE=/run/secrets/credentials-overwrite.json
    volumes:
      - n8n_data:/home/node/.n8n
      - ./credentials-overwrite.json:/run/secrets/credentials-overwrite.json:ro
    networks:
      - default
volumes:
  n8n_data:
    name: ${N8N_VOLUME:-n8n_data}
    external: true

컨테이너를 재시작하여 변경 사항을 적용합니다:

docker compose up -d

덮어쓰기 적용 확인#

n8n이 시작된 후, 사용자에게 사전 구성된 서비스 중 하나(예: Microsoft Outlook)에 대한 새 자격 증명을 생성하도록 합니다. 자격 증명 선택 화면에서 Managed OAuth2 (recommended) 옵션이 표시되어야 합니다.

Microsoft Entra credentials screen

사용자는 별도의 인증 없이 Connect to Microsoft Outlook을 클릭할 수 있습니다. Account connected 메시지가 표시되어야 합니다.

Managed OAuth 2 옵션이 표시되지 않으면 환경 변수가 올바르게 적용되지 않은 것입니다. 볼륨 마운트의 파일 경로가 CREDENTIALS_OVERWRITE_DATA_FILE 값과 일치하는지 확인하세요.

Kubernetes#

Kubernetes 배포의 경우 Docker 볼륨 마운트를 Kubernetes 네이티브 프리미티브로 교체합니다. 접근 방식은 클라우드 제공업체에 따라 다릅니다. 환경에 맞는 섹션을 선택하세요.

일반 Kubernetes Secret (EKS / AKS / GKE)#

이 방식은 추가 의존성 없이 세 가지 관리형 Kubernetes 제공업체 모두에서 작동합니다.

1. Secret 생성:

apiVersion: v1
kind: Secret
metadata:
  name: n8n-credentials-overwrite
  namespace: your-namespace
type: Opaque
stringData:
  credentials-overwrite.json: '{"microsoftOutlookOAuth2Api":{"clientId":"YOUR_CLIENT_ID","clientSecret":"YOUR_CLIENT_SECRET"}}'

2. Deployment에 Secret 마운트:

spec:
  containers:
    - name: n8n
      image: docker.n8n.io/n8nio/n8n:latest
      env:
        - name: CREDENTIALS_OVERWRITE_DATA_FILE
          value: /run/secrets/credentials-overwrite.json
        # ...다른 환경 변수
      volumeMounts:
        - name: credentials-overwrite
          mountPath: /run/secrets/credentials-overwrite.json
          subPath: credentials-overwrite.json
          readOnly: true
  volumes:
    - name: credentials-overwrite
      secret:
        secretName: n8n-credentials-overwrite

subPath 필드는 중요합니다. 이 필드가 없으면 Kubernetes가 단일 파일만 마운트하는 대신 전체 /run/secrets/ 디렉토리를 교체합니다.

대안: 인라인 환경 변수

볼륨 마운트를 생략하고 Secret을 직접 환경 변수로 참조할 수 있습니다:

env:
  - name: CREDENTIALS_OVERWRITE_DATA
    valueFrom:
      secretKeyRef:
        name: n8n-credentials-overwrite
        key: credentials-overwrite.json
stringData:
  credentials-json: '{"microsoftOutlookOAuth2Api":{"clientId":"...","clientSecret":"..."}}'

단일 서비스 설정에서는 더 깔끔하지만, 일부 Kubernetes 환경에서 환경 변수 크기를 제한(예: 변수당 128KB)한다는 점에 유의하세요. credential overwrites가 많은 경우 파일 기반 방식이 더 안전합니다.

AWS Secrets Manager (EKS)#

이 방식은 AWS Secrets Store CSI Driver를 사용하여 AWS Secrets Manager의 secret을 pod에 직접 마운트합니다. rotation 지원, CloudTrail 감사 로깅, 중앙 집중식 secret 관리를 제공합니다.

사전 요구 사항:

  • 클러스터에 Secrets Store CSI Driver와 ASCP(AWS Secrets and Configuration Provider) 설치
  • 클러스터에 IAM OIDC 제공자 구성(IRSA 필요)
  • secretsmanager:GetSecretValuesecretsmanager:DescribeSecret 권한이 있는 IAM 역할

1. AWS Secrets Manager에 secret 생성:

aws secretsmanager create-secret \
  --name n8n/credentials-overwrite \
  --description "n8n credential overwrites for Microsoft OAuth" \
  --secret-string '{"microsoftOutlookOAuth2Api":{"clientId":"YOUR_CLIENT_ID","clientSecret":"YOUR_CLIENT_SECRET"}}'

2. IAM 정책 생성:

{
  "Version": "2012-10-17",
  "Statement": [
    {
      "Effect": "Allow",
      "Action": [
        "secretsmanager:GetSecretValue",
        "secretsmanager:DescribeSecret"
      ],
      "Resource": "arn:aws:secretsmanager:REGION:ACCOUNT_ID:secret:n8n/credentials-overwrite-*"
    }
  ]
}
aws iam create-policy \
  --policy-name n8n-credentials-overwrite-read \
  --policy-document file://policy.json

3. IRSA로 서비스 계정 생성:

eksctl create iamserviceaccount \
  --name n8n-sa \
  --namespace your-namespace \
  --cluster your-cluster \
  --attach-policy-arn arn:aws:iam::ACCOUNT_ID:policy/n8n-credentials-overwrite-read \
  --approve

4. SecretProviderClass 생성:

apiVersion: secrets-store.csi.x-k8s.io/v1
kind: SecretProviderClass
metadata:
  name: n8n-credentials-overwrite
  namespace: your-namespace
spec:
  provider: aws
  parameters:
    objects: |
      - objectName: "n8n/credentials-overwrite"
        objectType: "secretsmanager"
        objectAlias: "credentials-overwrite.json"

5. n8n Deployment 업데이트:

apiVersion: apps/v1
kind: Deployment
metadata:
  name: n8n
  namespace: your-namespace
spec:
  template:
    spec:
      serviceAccountName: n8n-sa
      containers:
        - name: n8n
          image: docker.n8n.io/n8nio/n8n:latest
          env:
            - name: CREDENTIALS_OVERWRITE_DATA_FILE
              value: /run/secrets/credentials-overwrite.json
          volumeMounts:
            - name: credentials-overwrite
              mountPath: /run/secrets/credentials-overwrite.json
              subPath: credentials-overwrite.json
              readOnly: true
      volumes:
        - name: credentials-overwrite
          csi:
            driver: secrets-store.csi.k8s.io
            readOnly: true
            volumeAttributes:
              secretProviderClass: n8n-credentials-overwrite

Secret 교체:

Secrets Manager에서 값을 업데이트합니다:

aws secretsmanager update-secret \
  --secret-id n8n/credentials-overwrite \
  --secret-string '{"microsoftOutlookOAuth2Api":{"clientId":"NEW_CLIENT_ID","clientSecret":"NEW_CLIENT_SECRET"}}'

CSI driver는 폴링 간격(기본값: 2분)마다 업데이트된 값을 동기화합니다. n8n은 시작 시 자격 증명 파일을 읽으므로, 업데이트된 파일을 읽으려면 n8n pod를 재시작하세요.

Azure Key Vault (AKS)#

이 방식은 Azure Key Vault Provider for the Secrets Store CSI Driver를 사용하여 Azure Key Vault의 secret을 pod에 마운트합니다.

사전 요구 사항:

  • AKS 클러스터에 Secrets Store CSI Driver와 Azure Key Vault Provider 애드온 활성화
  • Azure Key Vault 인스턴스
  • 볼트에 접근 권한이 있는 managed identity 또는 service principal
  • 클러스터에 Workload Identity 활성화(pod identity보다 권장)

1. 기존 Key Vault 생성 또는 사용:

az keyvault create \
  --name n8n-credentials-vault \
  --resource-group your-resource-group \
  --location your-region

2. Key Vault에 secret 생성:

az keyvault secret set \
  --vault-name n8n-credentials-vault \
  --name n8n-credentials-overwrite \
  --value '{"microsoftOutlookOAuth2Api":{"clientId":"YOUR_CLIENT_ID","clientSecret":"YOUR_CLIENT_SECRET"}}'

3. Workload Identity 설정:

managed identity를 생성하고 federated credential을 설정합니다:

# managed identity 생성
az identity create \
  --name n8n-workload-identity \
  --resource-group your-resource-group \
  --location your-region

# identity client ID 가져오기
CLIENT_ID=$(az identity show \
  --name n8n-workload-identity \
  --resource-group your-resource-group \
  --query clientId -o tsv)

# Key Vault에 identity 접근 권한 부여
az keyvault set-policy \
  --name n8n-credentials-vault \
  --secret-permissions get \
  --spn "$CLIENT_ID"

# 클러스터의 OIDC issuer URL 가져오기
OIDC_ISSUER=$(az aks show \
  --name your-cluster \
  --resource-group your-resource-group \
  --query "oidcIssuerProfile.issuerUrl" -o tsv)

# federated credential 생성
az identity credential create \
  --name n8n-workload-identity \
  --resource-group your-resource-group \
  --issuer "$OIDC_ISSUER" \
  --subject system:serviceaccount:your-namespace:n8n-sa \
  --audience api://AzureADTokenExchange

4. Kubernetes ServiceAccount 생성:

apiVersion: v1
kind: ServiceAccount
metadata:
  name: n8n-sa
  namespace: your-namespace
  annotations:
    azure.workload.identity/client-id: "YOUR_MANAGED_IDENTITY_CLIENT_ID"
  labels:
    azure.workload.identity/use: "true"

5. SecretProviderClass 생성:

apiVersion: secrets-store.csi.x-k8s.io/v1
kind: SecretProviderClass
metadata:
  name: n8n-credentials-overwrite
  namespace: your-namespace
spec:
  provider: azure
  parameters:
    usePodIdentity: "false"
    useWorkloadIdentity: "true"
    clientID: "YOUR_MANAGED_IDENTITY_CLIENT_ID"
    keyvaultName: "n8n-credentials-vault"
    objects: |
      array:
        - |
          objectName: n8n-credentials-overwrite
          objectType: secret
          objectAlias: credentials-overwrite.json
    tenantId: "YOUR_TENANT_ID"

6. n8n Deployment 업데이트:

apiVersion: apps/v1
kind: Deployment
metadata:
  name: n8n
  namespace: your-namespace
spec:
  template:
    spec:
      serviceAccountName: n8n-sa
      containers:
        - name: n8n
          image: docker.n8n.io/n8nio/n8n:latest
          env:
            - name: CREDENTIALS_OVERWRITE_DATA_FILE
              value: /run/secrets/credentials-overwrite.json
          volumeMounts:
            - name: credentials-overwrite
              mountPath: /run/secrets/credentials-overwrite.json
              subPath: credentials-overwrite.json
              readOnly: true
      volumes:
        - name: credentials-overwrite
          csi:
            driver: secrets-store.csi.k8s.io
            readOnly: true
            volumeAttributes:
              secretProviderClass: n8n-credentials-overwrite

Secret 교체:

az keyvault secret set \
  --vault-name n8n-credentials-vault \
  --name n8n-credentials-overwrite \
  --value '{"microsoftOutlookOAuth2Api":{"clientId":"NEW_CLIENT_ID","clientSecret":"NEW_CLIENT_SECRET"}}'

CSI driver는 폴링 간격(기본값: 2분)마다 동기화합니다. 업데이트된 파일을 읽으려면 그 후 n8n pod를 재시작하세요.

Google Secret Manager (GKE)#

이 방식은 GCP provider for the Secrets Store CSI Driver를 사용하여 Google Secret Manager의 secret을 pod에 마운트합니다.

사전 요구 사항:

  • Workload Identity Federation이 활성화된 GKE 클러스터
  • 프로젝트에서 Secret Manager API 활성화
  • secretmanager.secretAccessor 역할이 있는 Google 서비스 계정

1. Secret Manager API 활성화:

gcloud services enable secretmanager.googleapis.com \
  --project your-project-id

2. Secret 생성:

echo -n '{"microsoftOutlookOAuth2Api":{"clientId":"YOUR_CLIENT_ID","clientSecret":"YOUR_CLIENT_SECRET"}}' | \
  gcloud secrets create n8n-credentials-overwrite \
    --data-file=- \
    --project your-project-id

3. Workload Identity Federation 설정:

# Google 서비스 계정 생성
gcloud iam service-accounts create n8n-secret-reader \
  --display-name="n8n Secret Reader" \
  --project your-project-id

# secret에 접근 권한 부여
gcloud secrets add-iam-policy-binding n8n-credentials-overwrite \
  --member="serviceAccount:n8n-secret-reader@your-project-id.iam.gserviceaccount.com" \
  --role="roles/secretmanager.secretAccessor" \
  --project your-project-id

# Kubernetes 서비스 계정을 Google 서비스 계정에 바인딩
gcloud iam service-accounts add-iam-policy-binding \
  n8n-secret-reader@your-project-id.iam.gserviceaccount.com \
  --role="roles/iam.workloadIdentityUser" \
  --member="serviceAccount:your-project-id.svc.id.goog[your-namespace/n8n-sa]"

4. Kubernetes ServiceAccount 생성:

apiVersion: v1
kind: ServiceAccount
metadata:
  name: n8n-sa
  namespace: your-namespace
  annotations:
    iam.gke.io/gcp-service-account: n8n-secret-reader@your-project-id.iam.gserviceaccount.com

5. CSI Driver와 GCP provider 설치:

# CSI driver 설치
helm repo add secrets-store-csi-driver https://kubernetes-sigs.github.io/secrets-store-csi-driver/charts
helm install csi-secrets-store secrets-store-csi-driver/secrets-store-csi-driver \
  --namespace kube-system

# GCP provider 설치
kubectl apply -f https://raw.githubusercontent.com/GoogleCloudPlatform/secrets-store-csi-driver-provider-gcp/main/deploy/provider-gcp-plugin.yaml

6. SecretProviderClass 생성:

apiVersion: secrets-store.csi.x-k8s.io/v1
kind: SecretProviderClass
metadata:
  name: n8n-credentials-overwrite
  namespace: your-namespace
spec:
  provider: gcp
  parameters:
    secrets: |
      - resourceName: "projects/your-project-id/secrets/n8n-credentials-overwrite/versions/latest"
        path: "credentials-overwrite.json"

7. n8n Deployment 업데이트:

apiVersion: apps/v1
kind: Deployment
metadata:
  name: n8n
  namespace: your-namespace
spec:
  template:
    spec:
      serviceAccountName: n8n-sa
      containers:
        - name: n8n
          image: docker.n8n.io/n8nio/n8n:latest
          env:
            - name: CREDENTIALS_OVERWRITE_DATA_FILE
              value: /run/secrets/credentials-overwrite.json
          volumeMounts:
            - name: credentials-overwrite
              mountPath: /run/secrets/credentials-overwrite.json
              subPath: credentials-overwrite.json
              readOnly: true
      volumes:
        - name: credentials-overwrite
          csi:
            driver: secrets-store.csi.k8s.io
            readOnly: true
            volumeAttributes:
              secretProviderClass: n8n-credentials-overwrite

Secret 교체:

새 버전의 secret을 생성합니다:

echo -n '{"microsoftOutlookOAuth2Api":{"clientId":"NEW_CLIENT_ID","clientSecret":"NEW_CLIENT_SECRET"}}' | \
  gcloud secrets versions add n8n-credentials-overwrite \
    --data-file=- \
    --project your-project-id

SecretProviderClass가 versions/latest를 참조하므로 CSI driver는 다음 동기화 시 새 버전을 가져옵니다. n8n이 업데이트된 파일을 읽으려면 n8n pod를 재시작하세요.