Przejdź do treści

Uwierzytelnianie API i zarządzanie kluczami w ElevenAPI

Opublikowano
Ostatnia aktualizacja

PosłuchajPosłuchaj tego artykułu

Uwierzytelnianie API to sposób, w jaki usługa sprawdza, czy przychodzące żądanie może działać na koncie. Na przykład w ElevenAPI, dane uwierzytelniające API autoryzują żądania zużywające rozliczane kredyty, generujące mowę i muzykę na dużą skalę oraz — w niektórych wdrożeniach — mające dostęp do wrażliwych danych audio. 

Wyciek klucza kosztuje pieniądze i może posłużyć do generowania treści na twoim koncie. Może też dać zbyt szeroki dostęp do twoich platform, stwarzając ryzyko wycieków danych i innych wektorów ataku. Już w 2020 roku ponad 90% deweloperów korzystało z API w co najmniej jednym codziennym procesie. Dziś, wraz z rozwojem model context protocols (MCP) i użycia AI, API są dosłownie wszędzie.

Ten artykuł wyjaśnia, jak prawidłowo uwierzytelniać API i zarządzać kluczami przez cały ich cykl życia: określanie zakresu, rotację, kontrolę organizacyjną, audyt i reagowanie na incydenty. Pomoże ci dobrze skonfigurować uwierzytelnianie API i zarządzanie kluczami w zespole. Podczas lektury miej otwarte dokumentację uwierzytelniania oraz dokumentację tokenów jednorazowych.

Podsumowanie

  • ElevenAPI uwierzytelnia każde żądanie za pomocą jednego sekretu — nagłówka xi-api-key. Oznacza to, że każdy, kto ma klucz, może wydawać kredyty i generować audio na koncie.
  • Nigdy nie umieszczaj długoterminowego klucza API w przeglądarce, aplikacji mobilnej ani żadnym innym artefakcie, który użytkownik może sprawdzić. Przechowuj go na serwerze, który kontrolujesz.
  • Przypadki użycia po stronie klienta muszą uwierzytelniać się krótkotrwałymi tokenami jednorazowymi tworzonymi po stronie serwera — nigdy długoterminowym kluczem.
  • Możesz ograniczyć skutki wycieku, nadając kluczom minimalne uprawnienia, rozdzielając klucze według środowisk i regularnie je rotując.
  • Audyt i wykrywanie anomalii pomagają zapobiegać wyciekom kluczy i nieprzyjemnym niespodziankom.

Czym jest uwierzytelnianie API?

Uwierzytelnianie API to sposób, w jaki usługa potwierdza, że przychodzące żądanie może działać na konkretnym koncie, zanim zacznie je obsługiwać. Osoba wysyłająca żądanie przedstawia dane uwierzytelniające, usługa je weryfikuje, a po weryfikacji zwraca odpowiedź. 

Mówiąc prościej, odpowiada na pytanie: czy to żądanie ma uprawnienia do działania na tym koncie? Ten proces różni się od autoryzacji API, która określa, co uwierzytelnione żądanie może robić w twoim systemie.

Czym jest zarządzanie kluczami?

Zarządzanie kluczami to szerszy zestaw praktyk, których używasz do kontrolowania klucza API przez cały jego cykl życia. Określa, jak tworzysz, przechowujesz, używasz, rotujesz i unieważniasz dostęp do kluczy. Te systemy zapewniają zabezpieczenia klucza API end-to-end. 

Dobre praktyki zarządzania kluczami pomagają zapobiegać ich wyciekom i zmniejszają ryzyko, że staną się publicznie dostępne. 

Dlaczego zabezpieczenia kluczy API są ważne: model zagrożeń

Skoro zdefiniowaliśmy już uwierzytelnianie i zarządzanie kluczami, warto precyzyjnie określić, co dzieje się, gdy klucz zostanie niewłaściwie obsłużony. Analiza modelu zagrożeń najpierw sprawia, że każda kolejna omawiana praktyka ma jasny cel: zmniejsza szansę wycieku klucza albo szkody, które wyrządzi po wycieku.

ElevenAPI uwierzytelnia za pomocą jednego mechanizmu opartego na sekrecie: nagłówka xi-api-key. Każdy, kto ma klucz, jest autoryzowany, a samo żądanie nie wymaga drugiego składnika.

Za pomocą twojego klucza można wydawać twoje kredyty. Text to Speech, Speech to Text, muzyka i efekty dźwiękowe są rozliczane, a osoba atakująca z ważnym kluczem może generować treści bez przerwy, aż wyczerpie się twój limit lub saldo.

Można generować na dużą skalę, a nasz model ograniczania liczby żądań sprawia, że sytuacja jest poważniejsza, niż może się wydawać. Limit opiera się na współbieżności, a nie prostym limicie żądań na minutę. Klucz w planie z limitem współbieżności pięciu dla danej rodziny modeli pozwala na znaczącą liczbę równoczesnych generowań, a osoba znająca te limity zrównolegli nadużycie.

Można tworzyć treści na twoim koncie. Każde audio wygenerowane za pomocą twojego klucza jest przypisane do twojej przestrzeni roboczej, co — zależnie od użytych głosów i danych wejściowych — może być problemem wizerunkowym, a czasem prawnym.

Sposoby wycieku kluczy są prozaiczne i takie same jak w przypadku każdego innego rodzaju danych uwierzytelniających:

  • Klucze API w kodzie po stronie klienta: Klucz zawarty w bundlu przeglądarki, binarce aplikacji mobilnej lub aplikacji jednostronicowej jest w praktyce publiczny. Minifikacja to nie zaciemnianie kodu.
  • Klucze API w repozytoriach: Klucze wpisane na stałe i zatwierdzone w Git, w tym w prywatnych repozytoriach, które później stają się publiczne lub są szeroko klonowane, a także w plikach takich jak .env, które nigdy nie miały być śledzone.
  • Klucze API w logach i śladach: Rejestratory żądań, narzędzia do śledzenia błędów i systemy obserwowalności rutynowo przechwytują nagłówki HTTP. Klucz w xi-api-key trafia do magazynu logów, dostawcy APM i do każdego, kto ma dostęp do odczytu któregokolwiek z nich.
  • Klucze API w CI i na zrzutach ekranu: Logi kompilacji, zgłoszenia do wsparcia i współdzielone terminale.

Każda z poniższych sekcji ogranicza prawdopodobieństwo lub skutki jednego z tych problemów.

Najważniejsza zasada: trzymaj klucze API po stronie serwera

Cała reszta artykułu pokazuje, jak zmniejszać ryzyko związane z uwierzytelnianiem i zarządzaniem kluczami API. Ta jedna zasada jest fundamentem i powinna mieć najwyższy priorytet.

Ponieważ mechanizm jest tak prosty, długoterminowy klucz API powinien znajdować się wyłącznie na serwerze, który kontrolujesz. Nigdy nie może trafić do przeglądarki, aplikacji mobilnej, klienta desktopowego ani innego artefaktu, który użytkownik może pobrać i sprawdzić. Jeśli klucz jest w kodzie po stronie klienta, uznaj go za przejęty.

SDK automatycznie odczytuje ELEVENLABS_API_KEY, więc najczystszy kod nie przekazuje niczego i inicjalizuje klienta tylko raz.

import { ElevenLabsClient } from "@elevenlabs/elevenlabs-js";

// Reads process.env.ELEVENLABS_API_KEY when apiKey is omitted - never a literal.
const elevenlabs = new ElevenLabsClient();

const audio = await elevenlabs.textToSpeech.convert("JBFqnCBsd6RMkjVDRZzb", {
  text: "Generated entirely server-side.",
  modelId: "eleven_flash_v2_5",
  outputFormat: "mp3_44100_128",
});

W produkcji klucz należy pobrać przy uruchamianiu procesu z menedżera sekretów (AWS Secrets Manager, GCP Secret Manager, HashiCorp Vault lub odpowiednika na twojej platformie), a nie osadzać w obrazie ani w pliku .env zatwierdzonym w repozytorium.

Tokeny jednorazowe dla aplikacji po stronie klienta

Najważniejsza zasada jest bezwzględna, ale wiele uzasadnionych przypadków użycia wymaga, by klient łączył się bezpośrednio z ElevenAPI: przeglądarka odtwarzająca strumieniowane Text to Speech, aplikacja mobilna przechwytująca audio do transkrypcji czy agent działający w czasie rzeczywistym w karcie użytkownika. Długoterminowy klucz nie może tam trafić. Rozwiązaniem jest przekazanie klientowi poświadczenia o niskim ryzyku w razie wycieku: krótkotrwałego tokenu jednorazowego.

Twój serwer przechowuje długoterminowy klucz, uwierzytelnia i autoryzuje użytkownika zgodnie z własną logiką sesji, a następnie tworzy krótkotrwały token i przekazuje klientowi tylko jego. Token szybko wygasa i jest ograniczony do operacji, dla której go wydano, więc wycieknięty token ma niewielką wartość, a wkrótce żadną. W dokumentacji tokenów jednorazowych znajdziesz obsługiwane endpointy i dokładny format żądania.

Oto podstawowa logika endpointu pośredniczącego. Autoryzuje użytkownika zgodnie z własną logiką sesji, a następnie tworzy token przez udokumentowany endpoint tokenów. Żądanie wychodzi z serwera z długoterminowym xi-api-key, a do klienta wraca tylko wynikowy krótkotrwały token.

// ... express app and route boilerplate
app.post("/api/voice-token", async (req, res) => {
  // 1. Authorize the user with YOUR session/auth system first.
  if (!req.session?.user) return res.status(401).json({ error: "unauthorized" });

  // 2. Mint a short-lived token server-side. The long-lived key travels only
  //    in this server-to-server request, never to the browser.
  const response = await fetch("https://api.elevenlabs.io/v1/tokens", {
    method: "POST",
    headers: {
      "xi-api-key": process.env.ELEVENLABS_API_KEY as string,
      "Content-Type": "application/json",
    },
    body: JSON.stringify({}), // populate per the tokens reference
  });

  // 3. Return only the short-lived token. The API key never leaves the server.
  res.json({ token: await response.json() });
});

Przeglądarka używa potem tego tokenu do połączenia, a długoterminowy klucz nigdy nie trafia na stronę.

Ograniczanie kluczy do minimalnych uprawnień

Zasada minimalnych uprawnień oznacza, że każdy klucz powinien mieć wyłącznie uprawnienia wymagane do wykonania jego zadania — i nic więcej. ElevenAPI pozwala wdrożyć kilka ograniczeń opartych na uprawnieniach, które określają, co klucz może, a czego nie może robić.

Jeden wszechmocny klucz to najgorszy możliwy scenariusz pod względem skutków wycieku, choć jest też łatwym wyborem domyślnym. Lepiej założyć, że każdy klucz kiedyś wycieknie, i dopilnować, by mógł wtedy zrobić tylko tyle, ile wymaga zadanie.

Zacznij od ograniczenia zakresu, które określa, jakie endpointy API może wywoływać klucz. Klucz używany tylko do transkrypcji nie potrzebuje dostępu do Text to Speech; klucz dla funkcji muzyki nie musi mieć dostępu do zarządzania głosami.

Kolejny element to limit kredytów. Ustawienie własnego limitu kredytów dla każdego klucza ogranicza finansowe skutki wycieku, a także zapobiega niekontrolowanym pętlom w twoim kodzie.

Biała lista IP idzie o krok dalej. Możesz ograniczyć klucz do konkretnych adresów IP lub zakresów CIDR, a żądania z adresów spoza listy zostaną odrzucone kodem 403. To funkcja Enterprise, obecnie w wersji preview, dostępna przez opiekuna konta.

Na koniec nie używaj jednego klucza w środowiskach development, staging i produkcyjnym. Wydaj osobny klucz dla każdego środowiska, z własnym zakresem i limitem. Klucze per środowisko oddzielają wyciek z laptopa dewelopera od kredytów produkcyjnych, pozwalają rotować jedno środowisko bez zakłócania innych i ułatwiają interpretację logów użycia, bo ruch jest już podzielony według źródła.

Rotacja kluczy API

Rotacja kluczy polega na regularnym zastępowaniu klucza nowym. Możesz też wykonać ją, gdy podejrzewasz naruszenie lub ujawnienie klucza.

Regularna rotacja skraca też czas, w którym można wykorzystać niezauważony wyciek. Jest bezproblemowa tylko wtedy, gdy twój kod został do niej przygotowany, więc zaprojektuj go z myślą o rotacji, zanim będzie potrzebna.

Kluczową techniką jest nakładanie się ważności kluczy, co pozwala przełączyć je bez przestoju:

  1. Wygeneruj nowy klucz API: Utwórz nowy klucz obok istniejącego, z tym samym zakresem, limitem i ograniczeniami IP. Oba są teraz ważne.
  2. Zaktualizuj klucz: Wdróż nowy klucz, aktualizując sekret w menedżerze sekretów i pozwalając instancjom go pobrać (przez restart, ponowny odczyt lub odświeżenie menedżera sekretów — zależnie od konfiguracji).
  3. Potwierdź ruch: Sprawdź, czy ruch przechodzi przez nowy klucz. Monitoruj użycie, aby potwierdzić, że stary klucz nie jest już używany.
  4. Usuń dostęp klucza: Unieważnij stary klucz, gdy przez bezpieczny okres nie odnotujesz na nim ruchu.

Ponieważ oba klucze są ważne w okresie nakładania się, żądania nigdy nie zawiodą z powodu braku danych uwierzytelniających. Ten okres ma też drugą zaletę: błędnie skonfigurowana instancja ujawni się, nadal używając starego klucza, więc znajdziesz ją przed odcięciem klucza.

Aby nakładanie się kluczy przebiegało bez problemu, zaprojektuj kod tak, by rotacja była zmianą konfiguracji, a nigdy zmianą kodu. Odczytuj klucz z jednego miejsca, gdzie można go odświeżyć, i niech jeden przełącznik decyduje, który sekret jest aktywny.

// Rotation is driven by configuration, not code edits. The secret manager (or
// the deploy that injects env vars) is the single point of change.
// ELEVENLABS_KEY_ACTIVE selects which slot is live, enabling overlap.
let client: ElevenLabsClient | undefined;

function activeKey(): string {
  const slot = process.env.ELEVENLABS_KEY_ACTIVE ?? "primary";
  const name = slot === "primary" ? "ELEVENLABS_API_KEY_PRIMARY" : "ELEVENLABS_API_KEY_SECONDARY";
  return process.env[name] as string;
}

function getClient(): ElevenLabsClient {
  return (client ??= new ElevenLabsClient({ apiKey: activeKey() }));
}

// Call after a secret refresh to pick up the rotated key without a deploy.
function resetClient(): void {
  client = undefined;
}

W okresie nakładania się trzymaj wypełnione oba pola PRIMARY i SECONDARY oraz przełącz ELEVENLABS_KEY_ACTIVE. Kod aplikacji nigdy się nie zmienia.

W przypadku kluczy backendu rozsądnym domyślnym cyklem jest rotacja co 90 dni; częściej dla kluczy o wysokiej wartości lub szerokim dostępie, a natychmiast po każdym ujawnieniu. Możesz to zautomatyzować zadaniem cyklicznym, które tworzy, wdraża, weryfikuje i unieważnia klucze, dzięki czemu rotacja staje się procesem działającym w tle.

Kontrole dostępu i uprawnienia przestrzeni roboczej

Podczas gdy ograniczanie zakresu i rotacja zabezpieczają pojedyncze klucze, kontrola przestrzeni roboczej określa, kto może je w ogóle tworzyć. Pozwala zdefiniować i stosować zasady organizacyjne, które wpłyną na wszystkie przyszłe praktyki zarządzania kluczami.

Zacznij od oddzielenia danych uwierzytelniających ludzi od danych maszyn. Ludzie logują się do panelu na własnych kontach z własnymi uprawnieniami; usługi uwierzytelniają się kluczami lub, lepiej, kontami usługowymi. Nie pozwalaj, by usługa działała na kluczu utworzonym w ramach osobistego dostępu konkretnej osoby, ani by ludzie współdzielili jeden klucz maszynowy. Chodzi o offboarding: gdy osoba odchodzi lub usługa zostaje wycofana, chcesz unieważnić dokładnie właściwe dane uwierzytelniające bez szkód ubocznych.

Konta usługowe realizują ten sam cel. Nadają obciążeniom maszynowym tożsamość niezwiązaną z człowiekiem, z własnym zakresem uprawnień, dzięki czemu ścieżka audytu pozostaje rzetelna.

Następnie przypisuj dostęp do ról, a nie pojedynczych osób. Przestrzenie robocze obsługują właśnie do tego uprawnienia grup i członków. Przyznawaj minimalne uprawnienia pozwalające każdej grupie wykonywać pracę, regularnie przeglądaj członkostwo i dąż do modelu, w którym żadne pojedyncze dane uwierzytelniające — ludzkie ani maszynowe — nie mogą zrobić więcej, niż wymaga rola.

Audyt i wykrywanie

W poprzednich etapach opisaliśmy, jak ograniczyć szkody po wycieku. Teraz pokażemy, jak wykryć, czy w ogóle doszło do wycieku. Skuteczne wykrywanie opiera się na trzech nawykach. 

Pierwszym jest zapisywanie, który klucz (według identyfikatora, nigdy wartości sekretu) obsłużył dany typ żądania, skąd i w jakiej skali. Usuwaj nagłówek xi-api-key z każdej warstwy logowania i śledzenia. Reguła maskowania w middleware HTTP i konfiguracji APM eliminuje najczęstszy sposób, w jaki klucze trafiają do magazynów logów.

Drugim jest monitorowanie zużycia kredytów pod kątem anomalii. Śledź zużycie kredytów przez każdy klucz w czasie i ustaw alerty na odchylenia od normy: nagły wzrost, generowanie o nietypowych godzinach albo klucz, który miał być nieaktywny, a nagle jest używany.

Trzecim jest obserwowanie nagłówków współbieżności. W każdej odpowiedzi zwracamy bieżącą i maksymalną liczbę równoczesnych żądań w nagłówkach current-concurrent-requests oraz maximum-concurrent-requests. Informują one o dostępnym zapasie, a utrzymujące się osiąganie maksimum, którego nie zainicjowano, jest silnym sygnałem nadużycia. Użycie bezpośredniego endpointu HTTP udostępnia nagłówki odpowiedzi bezpośrednio:

const resp = await fetch("https://api.elevenlabs.io/v1/text-to-speech/JBFqnCBsd6RMkjVDRZzb", {
  method: "POST",
  headers: {
    "xi-api-key": process.env.ELEVENLABS_API_KEY as string,
    "Content-Type": "application/json",
  },
  body: JSON.stringify({ text: "Monitoring headroom.", model_id: "eleven_flash_v2_5" }),
});

const current = resp.headers.get("current-concurrent-requests");
const maximum = resp.headers.get("maximum-concurrent-requests");
// Emit these to your metrics pipeline; alert on sustained saturation you did not cause.

Te sygnały powinny uruchamiać alerty. Panel, którego nikt nie obserwuje, nie zapewnia wykrywania. Podłącz sygnały wzrostu zużycia kredytów i nasycenia współbieżności do tej samej ścieżki alertów, której używasz przy awariach, z jasno określoną osobą odpowiedzialną.

Reagowanie na incydenty

Nawet przy najlepszych możliwych zabezpieczeniach i systemach monitorowania musisz zakładać, że klucz w końcu wycieknie. Przygotowanie listy kroków ograniczających szkody daje ci plan działania, który oszczędza czas i zmniejsza skutki.

Oto zdefiniowana ścieżka reagowania na ujawnienie klucza API:

  1. Natychmiast unieważnij wycieknięty klucz: Nie czekaj na pełne zrozumienie skali problemu. Unieważniony klucz nie może generować, a unieważnienie można odwrócić w tym sensie, że zawsze możesz wydać klucz zastępczy. To najważniejsze działanie.
  2. Przejdź na nowy klucz: Jeśli wycieknięty klucz obsługiwał ruch produkcyjny, zastosuj procedurę nakładania się kluczy w odwrotnej kolejności: uruchom nowy klucz, przełącz ruch, a potem potwierdź, że wycieknięty klucz jest nieaktywny. Ponieważ kod odczytuje klucz z konfiguracji, wystarczy zmiana konfiguracji, a nie kodu.
  3. Oceń skalę skutków na podstawie logów użycia: Gdy wyciek jest opanowany, określ jego rozmiar. Jak długo klucz był ważny i ujawniony? Ile kredytów zużyto w tym czasie i czy wzorzec odpowiada prawidłowemu ruchowi, czy nadużyciu? Jakich endpointów dotknął?
  4. Zrotuj powiązane sekrety: Klucz rzadko wycieka sam. Jeśli został ujawniony w repozytorium, magazynie logów lub pipeline CI, załóż, że sąsiednie sekrety w tym samym miejscu też są ujawnione, i zrotuj je.
  5. Zamknij drogę wycieku: Ustal, jak klucz wyciekł, i usuń przyczynę, inaczej sytuacja się powtórzy: dodaj plik do .gitignore i wyczyść historię, włącz maskowanie nagłówków w loggerze, usuń sekret z artefaktu kompilacji i ogranicz dostęp do systemu CI.
  6. Przygotuj post-mortem: Udokumentuj harmonogram zdarzeń, skalę skutków, przyczynę źródłową i dodane konkretne zabezpieczenia (zawężenie zakresu, biała lista IP, skaner sekretów w CI i częstsza rotacja).

Dzięki tym krokom będziesz mieć gotowy proces na scenariusze katastroficzne związane z ujawnieniem API. 

Status zgodności: SOC 2, HIPAA i retencja danych

Uwierzytelnianie jest jednym z elementów szerszej oceny zgodności, dlatego warto ostrożnie podchodzić do tego, co można, a czego nie można tu deklarować. Potraktuj poniższe informacje jako faktyczny punkt wyjścia, a nie rozstrzygnięcie dla twojego przypadku użycia.

ElevenLabs jest zgodne z SOC 2. Dla kwalifikujących się planów i przypadków użycia dostępna jest zgodność z HIPAA oraz tryby zerowej retencji. Zerowa retencja oznacza, że treść żądania nie jest przechowywana po przetworzeniu, co ma znaczenie, gdy dane wejściowe lub wygenerowane audio są wrażliwe.

To, czy dany tryb ma zastosowanie, zależy od twojego planu, konfiguracji i szczegółów tego, co przetwarzasz. Zanim na nich polegasz, potwierdź kwalifikację i dokładne warunki dla swojego konta oraz połącz je z opisanymi wyżej kontrolami dostępu. Certyfikaty zgodności regulują sposób, w jaki platforma obsługuje twoje dane; zarządzanie kluczami określa, kto może działać w twoim imieniu — i za tę część odpowiadasz ty.

Jak wyglądają dobre zabezpieczenia kluczy API

Klucze wyłącznie po stronie serwera eliminują największą powierzchnię wycieku. Tokeny jednorazowe rozszerzają tę gwarancję na klientów, którzy faktycznie muszą łączyć się z naszym API. Ograniczanie zakresu i rozdzielenie środowisk ograniczają szkody z pojedynczego wycieku. Rotacja wbudowana w konfigurację sprawia, że odzyskiwanie działania staje się rutyną zamiast ryzykiem. Kontrole przestrzeni roboczej oddzielają tożsamości ludzkie i maszynowe. Audyt zamienia nadużycie w alert, a nie niespodziankę na rachunku. Pisemny runbook zamienia incydent w procedurę.

To taka sama higiena danych uwierzytelniających, która chroni każdy wartościowy sekret — zastosowana do klucza, którego szczególna wartość polega na tym, że wydaje pieniądze i generuje audio na dużą skalę.

Gdy zechcesz wdrożyć to dla rzeczywistych formatów żądań, w dokumentacji uwierzytelniania i tokenów jednorazowych znajdziesz aktualną listę obsługiwanych endpointów. Aby zrozumieć model współbieżności, który powinno śledzić twoje monitorowanie, przeczytaj dokumentację modeli i szybki start API.

Zabezpiecz integrację z ElevenAPI

Silne uwierzytelnianie API to podstawowa kontrola, na której opiera się wiele innych praktyk bezpieczeństwa. Stosowanie kluczy wyłącznie po stronie serwera, wdrażanie tokenów jednorazowych dla klientów, ograniczanie do minimalnych uprawnień i uwzględnienie rotacji w zarządzaniu kluczami pomagają ograniczać ryzyko na dużą skalę.

Więcej informacji o obsługiwanych endpointach i dokładnym formacie nagłówka znajdziesz w dokumentacji ElevenAPI. Jeśli chcesz zacząć, poproś o klucz API od ElevenLabs i zacznij budować już dziś. 

FAQ o uwierzytelnianiu API i zarządzaniu kluczami 

Podobne artykuły

Twórz z najwyższej jakości audio AI