
SaaS-tietoturvatarkistuslista ennen julkaisua: 40 tarkistusta, jotka teemme ensin (2026)
SaaS-tietoturvatarkistuslista ennen julkaisua on arvokkaampi kuin pino vielä hankkimattomia vaatimustenmukaisuusmerkkejä. Tässä on epämiellyttävä totuus: useimmat julkaisutarkistuslistat kertovat, mitä pitää suojata, mutta eivät koskaan näytä, miten se tehdään. Tämä lista toimittaa koodin. Rakennamme Next.js:llä ja Supabase:lla, olemme nähneet yhden puuttuvan tenant_id-suodattimen päästävän testitilin lukemaan toisen asiakkaan tietoja, ja IBM:n vuoden 2024 Cost of a Data Breach -raportti asetti globaaliksi keskiarvoksi 4,88 miljoonaa dollaria. Et tarvitse SOC 2 -sertifikaattia mennäksesi liveen. Tarvitset alla olevan sovellustason perustason, ryhmiteltynä, ajettavana ja mapped OWASP:n ja NIST:n viitekehyksiin.
Keskeiset huomiot
- Et tarvitse SOC 2:ta tai penetration testausta julkaisuun. Tarvitset alla olevan sovellustason perustason.
- Vaarallisin julkaisuvirhe on vuotava data eri vuokralaisten välillä puuttuvan
tenant_id-tarkistuksen vuoksi. - Älä koskaan kehitä omaa todennusratkaisua. Käytä Auth.js:iä, Clerkiä tai Supabase Authia.
- Tarkista
NEXT_PUBLIC_-etuliitteet ennen käyttöönottoa. Se on nopein tapa vuotaa salaisuus.
Tämä perustaso vastaa OWASP ASVS 5.0:ää ja NIST Secure Software Development Frameworkia (SSDF), kahta viitettä, joihin Google luottaa eniten tässä aiheessa ja joita kumpikaan korkeimmilla sijoituksilla olevista oppaista ei vaivaudu mainitsemaan.
Esijulkaisun tietoturvatarkistuslista (pikaversio)
Nämä ovat minimivaatimukset tietoturvalle ennen julkaisua, ryhmiteltyinä kuuteen kategoriaan. Neljäkymmentä kohtaa. Aja ne ylhäältä alas, anna koodiosiot kehittäjällesi ja käsittele mitä tahansa alla olevassa prioriteettitaulukossa P0:ksi merkittyä julkaisuesteenä.
Salaisuudet ja konfiguraatio
.envon.gitignore:ssa ensimmäisestä commitista lähtien eikä sitä ole koskaan committattu.- Jokainen
NEXT_PUBLIC_- jaVITE_-etuliite on tarkistettu; mitään salaista ei päädy selaimeen. - Palvelimen salaisuudet säilytetään hallinnassa (alustan ympäristömuuttujat, AWS Secrets Manager, Vault), ei repositoriossa.
- Mikä tahansa avain, joka on joskus ollut git-historiassa, kierrätetään ennen julkaisua.
- Salaisuuksia ei esiinny lokeissa, virhevasteissa tai asiakaspaketissa.
- Olet etsinyt rakennetusta paketista live-avaimia (
grep -r "sk_live" .next/).
Todennus ja käyttöoikeudet
- Todennus on rakennettu kirjaston päälle (Auth.js, Clerk tai Supabase Auth), ei itse tehtynä.
- MFA on käytettävissä tileillä.
- Istuntocookiet asettavat
Secure,HttpOnlyjaSameSite. - JWT:tä tai istuntotokeneita ei säilytetä
localStorage:ssa. - RBAC ja vähimmän oikeuden periaate toteutetaan palvelinpuolella, ei vain piilotettuna UI:ssa.
- Salasanat hashataan Argon2:lla tai bcrypt:llä (vain jos hallinnoit todennusta itse).
- Salasanan palautus- ja sähköpostin vahvistusvirrat on testattu väärinkäytön varalta.
Data ja vuokralaiseritys
- Jokaisessa kyselyssä on
tenant_id-suodatin. - Vuokralaisen rajaus pakotetaan ORM- tai repository-tasolla, ei muisteta kyselykohtaisesti.
- Rivitasoinen turvallisuus on otettu käyttöön, ja sen epäonnistumistilat tunnetaan.
- Jokainen object-ID-päätepiste suorittaa omistajuustarkistuksen (tämä estää IDOR:n).
tenant_idsisällytetään välimuistiavaimiin ja objektivarastopolkuihin.- Data on salattu levossa ja siirrossa.
- Maksujen ja webhook-allekirjoitusten (Stripe jne.) aitous varmistetaan palvelinpuolella.
Riippuvuudet ja toimitusketju
npm audittaipnpm auditon puhdas korkean ja kriittisen tason ongelmista (tai ne on eksplisiittisesti triagoitu).- Dependabot tai Renovate on käytössä.
- Snyk tai Socket ajaa syvemmän SCA:n plus haittaohjelma- ja lisenssitarkistukset.
- Lockfile on committattu.
- Hylättyjä tai ylläpidottomia paketteja ei ole kriittisellä polulla.
- Konttikuvat skannataan, jos käytät Dockeria.
Verkko ja kuljetus
- HTTPS pakotetaan kaikkialle, HSTS preloadilla.
- Content-Security-Policy on asetettu (ensin report-only, sitten enforce).
X-Content-Type-Options: nosniffjaX-Frame-Options/frame-ancestorson asetettu.Referrer-PolicyjaPermissions-Policyon asetettu.- CORS käyttää sallittujen listaa, ei koskaan
*:ää tunnistetietojen kanssa. - Rate limiting suojaa todennusta ja kalliita päätepisteitä.
- Jokainen päätepiste validoi syötteen skeemalla (Zod tai vastaava).
Seuranta ja reagointi
- Keskitetyt audit-lokit kirjaavat, kuka käytti mitä ja milloin.
- Virheenkäsittely ei koskaan vuoda stack traceja käyttäjille.
- Hälytykset laukeavat todennuksen poikkeavuuksista (kirjautumisyritysten piikit, mahdoton matkustus).
- Automaattiset varmuuskopiot ajetaan, ja palautus on testattu.
- Incident-response-yhteystieto ja yksisivuinen runbook ovat olemassa.
- Uptime- ja virheseuranta (Sentry tai vastaava) on live-tilassa.
- Tiedät liipaisimen penetration testin tilaamiselle.
Korjaa ensin -prioriteetti
Kaikki kohdat eivät estä julkaisua. Tämä triagointitaulukko järjestää perustason ohittamisen aiheuttaman vahingon mukaan, jotta perustaja tietää, mikä on neuvottelematonta. P0 = korjaa ennen julkaisua, P1 = korjaa ensimmäisen viikon aikana, P2 = korjaa neljännesvuoden aikana.
| Tarkistus | Kategoria | Jos ohitat sen | Korjaustyö | Julkaisueste? |
|---|---|---|---|---|
| Vuokralaiseritys jokaisessa kyselyssä | Data ja vuokralaiset | Yksi asiakas lukee toisen dataa | Keski | P0: estä julkaisu |
| Salaisuudet pois asiakaspaketista | Salaisuudet ja konfiguraatio | Julkiset API-avaimet, tilin kaappaus | Vähäinen | P0: estä julkaisu |
| Omistajuustarkistus object-ID-päätepisteissä | Data ja vuokralaiset | IDOR: id:n kasvattaminen vuotaa tietueita | Vähäinen | P0: estä julkaisu |
| Todennus kirjastolla, ei itse tehtynä | Todennus ja käyttöoikeudet | Toimitetut todennusvirheet, rikkoutuneet istunnot | Keski | P0: estä julkaisu |
| HTTPS ja HSTS kaikkialla | Verkko ja kuljetus | Token-varastus langattomassa verkossa | Vähäinen | P0: estä julkaisu |
| npm audit puhdas korkeista/kriittisistä | Riippuvuudet | Tunnettu CVE transitiivisessa riippuvuudessa | Vähäinen | P1: viikko yksi |
| Rate limiting todennuspäätepisteissä | Verkko ja kuljetus | Tunnistetietojen täyttäminen, brutaali hyökkäys | Vähäinen | P1: viikko yksi |
| Turvallisuusotsikot (CSP, HSTS, nosniff) | Verkko ja kuljetus | XSS, clickjacking, MIME-hyökkäykset | Vähäinen | P1: viikko yksi |
| Keskitetyt audit-lokit | Seuranta | Et näe tai pysty todistamaan murtumista | Keski | P1: viikko yksi |
| Testattu varmuuskopiopalautus | Seuranta | Varmuuskopio, jota ei voi palauttaa, on tyhjää | Keski | P1: viikko yksi |
| MFA käytettävissä tileillä | Todennus ja käyttöoikeudet | Helpompi tilin kaappaus | Vähäinen | P2: tämä neljännes |
| Täysi CSP pakotettu report-onlyn jälkeen | Verkko ja kuljetus | Jäljellä oleva XSS-pinta | Keski | P2: tämä neljännes |
Salaisuudet ja konfiguraatio: Vuotavatko avaimet asiakaspakettiin?
Salaisuuksien hygienia julkaisussa tarkoittaa, että mikään tunnistetieto ei koskaan päädy selaimeen. Next.js:n NEXT_PUBLIC_-etuliite (ja Vite:n VITE_) lähettää arvon jokaiselle vierailijalle, joten yksi väärä etuliite vuotaa avaimen. Pidä .env poissa gitistä, laita palvelimen salaisuudet hallintaan ja grepaa build-tulos ennen käyttöönottoa.
Tässä on yleisin sudenkuoppa: NEXT_PUBLIC_ ei tarkoita "julkista tietoa". Se tarkoittaa "literaalisesti lähetän tämän jokaisen vierailijan selaimeen". Etuliitä Stripe-salaisuus tai service-role-avain sillä tavalla, ja se on live-tilassa paketissa kenelle tahansa, joka avaa DevToolsin.
# .env.local (the mistake)
NEXT_PUBLIC_STRIPE_SECRET=sk_live_51H... # BAD: ships to every browser
STRIPE_SECRET_KEY=sk_live_51H... # OK: server-only
# Public (safe to expose) vs server-only
NEXT_PUBLIC_SUPABASE_ANON_KEY=eyJ... # anon key is meant to be public
SUPABASE_SERVICE_ROLE_KEY=eyJ... # never NEXT_PUBLIC_ this
# Catch a leaked key before you deploy
grep -r "sk_live" .next/ # any hit means a secret is in your client bundleMuut salaisuuksien perustason kohdat ovat tylsiä ja neuvottelemattomia: .env .gitignore:ssa ensimmäisestä commitista lähtien, palvelimen salaisuudet hallinnassa eikä repositoriossa, ja minkä tahansa git-historiaan osuneen avaimen kierrätys (commitin poistaminen ei peru vuotoa). Vuotanut deploy-token on juuri sitä, miten murrot kuten Vercel-tapaus alkavat, joten käsittele jokaista tokenia kuin se olisi jo jonkun watchlistilla.
Todennus ja käyttöoikeudet: Pitäisikö rakentaa todennus vai käyttää kirjastoa?
Pitäisikö rakentaa todennus vai käyttää kirjastoa? Käytä lähes aina kirjastoa. Auth.js, Clerk ja Supabase Auth ovat imeneet itseensä vuosia reunaehdoista, jotka muuten löytäisit uudelleen tuotannossa: istuntojen kiinnitys, tokenien peruutus, palautusvirtojen väärinkäyttö. Oman ratkaisun tekeminen on puolustettavissa vain, jos sinulla on tietoturva-insinööri ja syy, miksi mikään tarjoaja ei sovi, mikä on harvinaista.
Oman todennuksen rakentaminen on kallein tapa säästää 25 dollaria kuukaudessa. Tässä on rehellinen vertailu vaihtoehdoista.
| Vaihtoehto | Paras kun | MFA sisäänrakennettu | Oletusistunto | Sudenkuoppa |
|---|---|---|---|---|
| Auth.js (NextAuth) | Haluat ilmaisen, itse isännöidyn, täyden kontrollin | Providerien/lisäosien kautta | JWT tai tietokanta | Omistat jokaisen tietoturvareunaehdon |
| Clerk | Haluat MFA:n, UI:n ja organisaatiot valmiina | Kyllä | Hallinnoitu | Maksetut tasot skaalautuvat aktiivisten käyttäjien mukaan |
| Supabase Auth | Käytät jo Supabasea ja Postgres RLS:ää | Kyllä | JWT | RLS-politiikan laatu on sinun vastuullasi |
| Tee itse | Sinulla on tietoturva-insinööri ja mikään tarjoaja ei sovi | Rakennat sen | Rakennat sen | Useimmat todennusvirheet alkavat tästä |
Kaksi sudenkuoppaa upottaa tiimejä, jotka valitsevat kirjaston mutta ohittavat konfiguroinnin. Ensinnäkin, JWT:n peruuttaminen on aidosti vaikeaa, joten varastettu token pysyy voimassa vanhenemiseen asti; pidä tokenien elinajat lyhyinä ja suosii palvelinpuolen istuntoja herkissä asioissa. Toiseksi, localStorage:ssa olevat tokenit ovat varastettavissa millä tahansa XSS-hyökkäyksellä, joten säilytä istunnot httpOnly-cookieissa Secure- ja SameSite-asetuksilla. Pakota RBAC palvelimella, älä piilottamalla painikkeita UI:ssa.
Jos SaaS-palvelussasi on AI- tai LLM-ominaisuus, käsittele mallisyötettä myös epäluotettuna todennusrajanana. Katso oppaamme prompt injectionin estämiseen, koska jailbreakattu assistentti, jolla on työkaluoikeudet, on käyttöoikeusongelma chat-ikkunan naamiossa.
Data ja vuokralaiset: Miten estät yhden vuokralaisen lukemasta toisen dataa?
Vuokralaiseritys tarkoittaa, että jokainen kysely, välimuistiavain ja varastopolku on rajattu nykyiseen vuokralaiseen. Puuttuva tenant_id-suodatin antaa yhden asiakkaan lukea toisen dataa, mikä on vaarallisin julkaisuvirhe. Rivitasoinen turvallisuus auttaa, mutta se on turvavyö, ei voimakenttä, joten lisää omistajuustarkistukset jokaiseen object-ID-päätepisteeseen.
Tämä on osio, jota mikään kilpailija ei kata koodina, ja se on syy, miksi vuokralaisten väliset vuodot lipsahtavat tuotantoon. Korjaus alkaa siitä, ettei luoteta ID:hen sellaisenaan. Rajaa jokainen luku kutsujan vuokralaiseen ja pakota se datatasolla, jotta kenenkään ei tarvitse muistaa sitä kyselykohtaisesti.
// BAD: no tenant scope. Any valid id returns any tenant's row.
const order = await db.order.findFirst({ where: { id } });
// GOOD: scoped to the caller's tenant on every read.
const order = await db.order.findFirst({
where: { id, tenantId: session.tenantId },
});Liittyvä vika on IDOR (insecure direct object reference), jonka OWASP API Security Top 10 luokittelee kohtaan API1: Broken Object Level Authorization. Testitili kasvattaa URL:ssä olevaa ID:tä ja lukee tietueen, jota sen ei pitäisi nähdä. PortSwiggerin Web Security Academy tarjoaa kattavan läpikäynnin siitä, miten hyökkääjät löytävät nämä. Korjaus on yksi omistajuustarkistus.
// GET /api/invoices/1234, a test account increments the id
// and reads another tenant's invoice. Classic BOLA.
const invoice = await db.invoice.findUnique({ where: { id } });
// Fix: verify ownership before you return anything.
if (invoice.tenantId !== session.tenantId) {
return res.status(403).json({ error: "Forbidden" });
}Tässä on kehys, joka pitää sinut rehellisenä: jokainen IDOR on vuokralaiseritysvirhe, mutta jokainen vuokralaiseritysvirhe ei ole IDOR. Postgresin rivitasoinen turvallisuus catches monet niistä tietokannassa, mutta sillä on hiljaisia epäonnistumistiloja, jotka kannattaa tuntea ennen kuin luotat siihen.
-- Postgres RLS: a seatbelt, not a force field.
alter table orders enable row level security;
create policy tenant_isolation on orders
using (tenant_id = current_setting('app.tenant_id')::uuid);
-- Silent-failure trap: forget to SET app.tenant_id on a pooled
-- connection and the policy reads the PREVIOUS request's tenant.Yhteyspoolin saastuminen, async-kontekstivuodot ja jaetun välimuistin myrkytys kaikki voittavat RLS:n hiljaa, minkä vuoksi OWASP Multi-Tenant Security Cheat Sheet kehottaa lisäämään vuokralaisen etuliitteen myös välimuistiavaimiin ja varastopolkuihin. OWASP ASVS 5.0:n käyttöoikeusluku ja Supabase RLS -dokumentaatio ovat kaksi viitettä, jotka kannattaa lukea kokonaan tässä yhteydessä.
Riippuvuudet ja toimitusketju: Mitä piilee node_modulesissasi?
Sovelluksesi on yhtä turvallinen kuin heikoin transitiivinen riippuvuutesi. Aja npm audit tai pnpm audit CI:ssä ja epäonnista buildi korkean tai kriittisen tason löydöksissä ennen julkaisua. Lisää Dependabot tai Renovate automaattisia päivityksiä varten ja Snyk tai Socket syvempää haittaohjelma- ja lisenssitarkistusta varten.
Ansa on ajaa audit kerran käsin, nähdä vihreä valo ja olla ajamatta sitä enää koskaan. Kytke se CI:hin, jotta uusi CVE paketissa, jota et ole edes koskenut, estää mergeamisen.
# .github/workflows/ci.yml: block the merge on high/critical
- name: Audit dependencies
run: npm audit --audit-level=high # non-zero exit fails the jobnpm audit -dokumentaatio kattaa vakavuustasot ja --production-lipun, jos haluat ignoroida vain kehitykseen liittyvät löydökset. Automaattinen skannaus on perusvaatimus; syvempää staattista analyysiä varten, joka löytää koodihajuhaitoja ja injektointireittejä, joita riippuvuusskanneri missaa, katso SonarQube-arviomme. Commitoi lockfile, pudota paketit, joista ei ole julkaistu versiota vuosiin, ja skannaa konttikuvasi, jos deployaat Dockerilla.
Verkko ja kuljetus: Mitkä turvallisuusotsikot SaaS todella tarvitsee?
Mitkä turvallisuusotsikot SaaS tarvitsee? HTTPS plus HSTS ja lyhyt otsikkosetti sulkevat helpoimmin hyväksikäytettävät aukot. Lisää Content-Security-Policy, CORS-sallittujen lista villikortin sijaan ja rate limitit todennus- ja kalliisiin päätepisteisiin. Validoi jokainen syöte skeemalla kuten Zod, jotta huonot payloadit eivät koskaan päädy logiikkaasi.
Et tarvitse jokaista koskaan keksittyä otsikkoa. Tarvitset tämän lyhyen listan, ja MDN:n turvallisuusotsikoiden viite selittää kukin syvällisesti.
| Otsikko | Suositeltu arvo | Mitä se estää |
|---|---|---|
| Strict-Transport-Security | max-age=63072000; includeSubDomains; preload | Protokollan alennus, SSL-strip-hyökkäykset |
| Content-Security-Policy | default-src 'self'; aloita report-only | XSS, injektoidut skriptit, datan exfiltraatio |
| X-Content-Type-Options | nosniff | MIME-sniffing, joka muuntaa latauksen skriptiksi |
| X-Frame-Options / frame-ancestors | DENY (tai frame-ancestors 'none') | Clickjacking piilotettujen iframejen kautta |
| Referrer-Policy | strict-origin-when-cross-origin | Kokonaisten URLien (ja niissä olevien tokenien) vuotaminen |
| Permissions-Policy | camera=(), microphone=(), geolocation=() | Rogue-skriptien pääsy laiteAPIeihin |
Aseta otsikot kerran, edgessä, ja lisää rate limiter, jotta skripti ei voi brutaalisti hyökätä kirjautumisreittiäsi vastaan koko yötä.
// next.config.js: security headers on every response
const securityHeaders = [
{ key: "Strict-Transport-Security", value: "max-age=63072000; includeSubDomains; preload" },
{ key: "X-Content-Type-Options", value: "nosniff" },
{ key: "X-Frame-Options", value: "DENY" },
{ key: "Referrer-Policy", value: "strict-origin-when-cross-origin" },
];
// Rate-limit auth routes (Upstash example)
const { success } = await ratelimit.limit(ip);
if (!success) return new Response("Too many requests", { status: 429 });Aloita CSP report-only-tilassa, jotta et riko omaa sovellustasi, tarkkaile violation-raportteja muutaman päivän ja vaihda sitten enforce-tilaan. Pidä CORS nimetyssä sallittujen listassa, älä koskaan yhdistä *:ää tunnistetietoihin.
Seuranta ja reagointi: Miten tiedät, jos sinut on murrettu?
Et voi reagoida siihen, mitä et näe. Ennen julkaisua kytkä keskitetyt audit-lokit, hälytykset todennuksen poikkeavuuksista kuten kirjautumisyritysten piikeistä, automaattiset varmuuskopiot testatulla palautuksella ja yksisivuinen incident-runbook. Testaamaton varmuuskopio on toivo, ei varmuuskopio, ja aika kirjoittaa runbook on nyt, ei kesken incidentin.
IBM:n data asettaa keskimääräiseksi ajaksi murron tunnistamiseen ja rajoittamiseen 258 päivää, etkä voi pienentää tätä lukua, jos lokisi eivät kirjaa, kuka koski mihin. Keskitä ne, hälytä tärkeistä poikkeavuuksista (kirjautumisyritysten piikit, mahdottomat matkustuslokikirjautumiset, äkillinen export-volumen kasvu) ja varmista, että virheenkäsittelijäsi palauttaa siistin viestin stack tracen sijaan, joka karttoisi sisäisiä rakenteitasi.
Nykyinen murtumishavainnointi nojaa poikkeavuuksien seurantaan staattisten sääntöjen sijaan; lisää siitä, miten se todella toimii, artikkelissamme kuinka AI estää datamurtoja. Viitekehyksen tueksi NIST SSDF (SP 800-218) esittelee reagointi- ja seurantakäytännöt selkeällä kielellä. Testaa palautus ennen julkaisua, ei sen jälkeen, kun tietokantasi katoaa.
Mitä todella löydämme, kun tarkastelemme omia julkaisujamme
Kun tiimimme ajaa esijulkaisun tietoturvakatselmuksen buildiin, olipa se meidän tai asiakkaan, kaksi virhettä nousee esiin useammin kuin mikään muu. Ensinnäkin: salaisuus, joka ratsastaa selaimeen NEXT_PUBLIC_-etuliitteellä, yleensä kolmannen osapuolen API-avain, jonka joku etuliitti saadakseen client-side-kutsun toimimaan. Toiseksi: vähintään yksi päätepiste, jolta puuttuu tenant_id-rajaus tai omistajuustarkistus.
Vuokralaisrajausvirhe on pelottava, koska sovellus näyttää toimivan. Jokainen sivu latautuu. Virhe ilmenee vasta, kun joku muuttaa ID:tä URL:ssa. Eräässä katselmuksessa GET /api/orders/:id palautti minkä tahansa tilauksen mille tahansa kirjautuneelle käyttäjälle; testitili luki toisen vuokralaisen tilauksia kasvattamalla numeroa. Korjaus oli kaksi riviä: vertaa order.tenantId ja session.tenantId ennen palauttamista.
Emme lainaa tässä vääriä havaintoprosentteja. Rehellistä ja toistettavaa on tämä: NEXT_PUBLIC_-vuoto ja puuttuva vuokralaisrajaus ovat kaksi asiaa, jotka löydämme lähes jokaisesta ensikatselmuksesta, ja molemmat ovat halpoja korjata, kun tietää, mistä etsiä. Siksi tarkistuslista nostaa ne etusijalle P0:na.
Jos haluaisit mieluummin tiimin ajavan tämän katselmuksen puolestasi ennen julkaisupäivää, se on työtä, jota teemme. Hanki esijulkaisun tietoturvakatselmus →
Kirjoittajasta
Mert Batur Gurbuz on Techsy.io:n co-founder, jossa tiimi toimittaa AI-agentteja, automaatiojärjestelmiä ja voice/SDR-pipelineja B2B-asiakkaille. Hän opiskelee Birminghamin yliopistossa ja kirjoittaa LLM-työkalupakista, jota Techsy-tiimi todella käyttää tuotannossa. Yhdistä LinkedInissä.
Usein kysytyt kysymykset
Mitä pitäisi olla SaaS-tietoturvatarkistuslistalla ennen julkaisua?
Kuusi kategoriaa: salaisuudet ja konfiguraatio (pidä avaimet poissa asiakaspaketista), todennus ja käyttöoikeudet (käytä kirjastoa, lisää MFA), data ja vuokralaiset (tenant_id-rajaus plus omistajuustarkistukset), riippuvuudet (npm audit CI:ssä), verkko ja kuljetus (HTTPS, HSTS, CSP, rate limitit) ja seuranta ja reagointi (audit-lokit, testatut varmuuskopiot, runbook).
Onko SaaS-palveluni tarpeeksi turvallinen julkaisuun?
Olet valmis, kun P0-perustaso on tehty: salaisuudet pois asiakaspaketista, vuokralaiseritys jokaisessa kyselyssä, todennus kirjastolla, HTTPS turvallisuusotsikoilla ja puhdas riippuvuusskannaus. Täydellisyys ei ole mittari. Julkaistu, seurattu sovellus, jossa perustaso on kunnossa, voittaa "täydellisen" sovelluksen, jota ei koskaan julkaista.
Tarvitsenko penetration testin ennen SaaS-palvelun julkaisua?
Et laillisesti julkaisua varten. Priorisoi se, jos käsittelet maksuja tai henkilötietoja, kohdistat enterprise-ostajiin tai jos auditoija tai sijoittaja pyytää sitä. MVP-vaiheessa käytä se panos sovellustason perustasoon ja OWASP Top 10:een ensin. Penetration testi löytää enemmän, kun ilmeiset IDOR- ja otsikkoaukot on jo suljettu.
Tarvitsenko SOC 2:n SaaS-palvelun julkaisuun?
Ei. Mikään asiakas ei odota SOC 2:ta startupilta, joka julkaisi viime viikolla. Se on enterprise-myynnin avain, ei julkaisueste, ja se vie kuukausia. Julkaise sovellustason perustasolla ja aloita SOC 2 -prosessi, kun aito enterprise-kauppa vaatii sitä, ei ennen.
Pitäisikö minun rakentaa oma todennus vai käyttää kirjastoa kuten Auth.js, Clerk tai Supabase Auth?
Käytä lähes aina kirjastoa. Auth.js, Clerk ja Supabase Auth ovat hoitaneet istunto-, token- ja palautusvirtareunaehdot, jotka aiheuttavat useimmat itse rakennetut todennusvirheet. Oman ratkaisun tekeminen on puolustettavissa vain, jos sinulla on tietoturva-insinööri ja kova vaatimus, jota mikään tarjoaja ei täytä, mikä on aidosti harvinaista.
Miten pidän salaisuudet poissa asiakaspaketistani?
Tarkista jokainen NEXT_PUBLIC_- ja VITE_-etuliite, koska mikä tahansa sillä varustettu päätyy selaimeen. Pidä .env poissa gitistä ensimmäisestä commitista lähtien, säilytä palvelimen salaisuudet hallinnassa ja grepaa rakennettu paketti (grep -r "sk_live" .next/) ennen käyttöönottoa vuotaneen avaimen löytämiseksi.
Miten eriytän vuokralaisten datan multi-tenant SaaS:ssa?
Lisää tenant_id-suodatin jokaiseen kyselyyn ja pakota se ORM- tai repository-tasolla, jotta se on automaattista. Ota käyttöön rivitasoinen turvallisuus ja opi sen epäonnistumistilat (pool-saastuminen, async-vuodot). Lisää omistajuustarkistus jokaiseen object-ID-päätepisteeseen IDOR:n sulkemiseksi ja rajaa välimuistiavaimet ja varastopolut vuokralaisen mukaan.
Mitkä turvallisuusotsikot SaaS tarvitsee ennen julkaisua?
Vähintään: Strict-Transport-Security (HSTS), Content-Security-Policy, X-Content-Type-Options: nosniff, X-Frame-Options tai frame-ancestors, Referrer-Policy ja Permissions-Policy. Aloita CSP report-only-tilassa, tarkista rikkomukset ja pakota se sitten. MDN:n turvallisuusotsikoiden dokumentaatio listaa suositellut arvot kullekin, ja yllä oleva otsikkotaulukko tiivistää, mitä kukin estää.
Riittääkö automaattinen skannaus kuten npm audit tai Snyk?
Välttämätön mutta ei riittävä. Työkalut kuten npm audit, Snyk ja Socket löytävät tunnetut CVE:t ja haitalliset paketit, mutta ne eivät löydä business-logiikan ja käyttöoikeuksien vikoja kuten IDORia tai puuttuvaa vuokralaisrajausta. Niihin tarvitaan ihminen, testitili ja eksplisiittinen omistajuustarkistus. Aja molemmat: skanneri ja manuaalinen katselmus.
Yhteenveto: SaaS-tietoturvatarkistuslista, jonka voit todella toimittaa
Et tarvitse olla täydellinen julkaistaksesi. Tarvitset perustason. Sulje P0-kohdat ensin: salaisuudet pois paketista, vuokralaiseritys jokaisessa kyselyssä, omistajuustarkistus jokaisessa object-päätepisteessä, todennus kirjastolla ja HTTPS otsikoilla. Jos korjaat yhden asian ennen perjantain julkaisua, tee se vuokralaiseritys, koska se on virhe, joka vuotaa asiakkaan dataa ilman varoitusta.
Kaikki tässä on ajettavissa tänään, eikä mikään vaadi compliance-budjettia. Käy läpi 40 tarkistusta, anna koodiosiot kehittäjällesi ja julkaise. Haluatko toiset silmät katsomaan ennen live-menoa? Hanki ilmainen konsultaatio, ja käymme listan läpi kanssasi.