Access
VPN yerine kimlik ve cihaz temelli erişim. Her uygulama varsayılan olarak reddediyor; kullanıcı bir Allow policy'siyle eşleşmedikçe geçemiyor.
- DurumGenel kullanımda
- FiyatKullanıcı başına aylık; ücretsiz katmanda 50 kullanıcı
- Ücretsiz katmanvar
- Doğrulama
Access nedir?
“Cloudflare Access is a zero trust network access (ZTNA) solution designed to secure access for employees and contractors across self-hosted, SaaS, and non-web applications, eliminating the need for a traditional VPN.”
Klasik VPN modelinde kullanıcı ağa girer, sonra ağdaki her şeye erişir. Access’te ağ diye bir şey yok: her uygulama tek tek korunuyor ve her istekte kimlik, cihaz ve bağlam yeniden değerlendiriliyor.
Temel kural tek cümlede:
“All Access applications are deny by default — a user must match an Allow policy before they are granted access.”
Tunnel ile sınır tam olarak nerede
Bu, en çok karıştırılan ayrım:
| Soru | Cevap |
|---|---|
| Genel erişime açık hostname için Tunnel şart mı? | Hayır. Ama “you will then need to protect your origin IP using other methods.” |
| Özel ağ uygulaması için? | Evet. “You must also connect your private network to Cloudflare using a Cloudflare Tunnel or Cloudflare Mesh.” |
| Altyapı (SSH) uygulaması için? | Evet, ve ayrıca Cloudflare One Client zorunlu. |
| Tunnel kimlik doğruluyor mu? | Hayır — o taşıma. Access yetkilendirme. |
Tek cümlelik özet: Tunnel paketi gelen port açmadan Cloudflare’e taşır; Access isteğin geçip geçmeyeceğine karar verir. Genel erişime açık uygulamada Access tek başına çalışır ama origin IP’n açıkta kalır. Özel ağ veya altyapı hedefinde Tunnel (ya da Mesh, ya da Cloudflare WAN) zorunludur.
Nasıl çalışır?
Dört uygulama tipi
| Self-hosted | SaaS | Infrastructure | Bookmark | |
|---|---|---|---|---|
| Ne korur | Kendi uygulamaların: genel web, özel ağ, Workers | Üçüncü taraf SaaS (Salesforce, Atlassian, Workday) | Tek tek sunucular ve altyapı hedefleri | App Launcher’da görünen dış bağlantılar |
| Client zorunlu | Hedefe göre değişir | Hayır | Evet | Hayır |
| İstemcisiz erişim | Evet | — | Hayır | — |
| Yetkilendirme | Access policy + uygulama token’ı | Access policy + SAML/OIDC iddiası | Protokol farkındalıklı policy (port, kullanıcı adı) | Yalnızca görünürlük |
| Oturum yönetimi | Tam | Tam | Tam | Yok |
| Denetim kaydı | Kimlik doğrulama + istek başına log | Kimlik doğrulama | Kimlik doğrulama + SSH komut logları | Yalnızca App Launcher |
Self-hosted dört ayrı biçimde kurulabiliyor: genel hostname, özel IP/hostname/CIDR + port,
doğrudan bir Cloudflare Worker’ı adıyla, ve cloudflared access login ile CLI üzerinden.
Infrastructure yalnızca SSH. Birebir: “Access for Infrastructure currently supports SSH. To connect using other protocols, add a self-hosted private application. For browser-based SSH, RDP, or VNC, refer to browser-rendered terminal.” Ve “Cloudflare will not create new users on the target. UNIX users must already be present on the server.”
Policy’ler — dört yapı taşı
Aksiyonlar: Allow, Block, Bypass, Service Auth. “You can set only one action per policy.”
Kural tipleri ve mantık karşılıkları:
| Tip | Mantık | Not |
|---|---|---|
| Include | VEYA | “All Access policies must contain at least one Include rule.” |
| Require | VE | Buradaki hata herkesi kilitliyor |
| Exclude | DEĞİL | — |
Değerlendirme sırası listedeki sıra değil, aksiyon tipine göre:
“Bypass and Service Auth policies are evaluated first, from top to bottom as shown in the UI. Then, Block and Allow policies are evaluated based on their order from top to bottom.”
Cloudflare’in örneği: listede Allow A · Block B · Service Auth C · Bypass D · Allow E varsa
çalışma sırası Service Auth C → Bypass D → Allow A → Block B → Allow E. Ve “Once a user
matches an Allow or Block policy, evaluation stops.” Yayılma ~60 saniye.
Seçicilerin sürekli değerlendirilip değerlendirilmediği de önemli: “Non-identity attributes are polled continuously, meaning they are evaluated with each new HTTP request.” Kimlik temelli seçiciler (e-posta, IdP grubu, login yöntemi) yalnızca giriş anında; IP, ülke, sertifika, service token, cihaz duruşu ve WARP/Gateway sürekli.
İki token, dört süre katmanı
| Token | Ne yapıyor | Nerede duruyor |
|---|---|---|
| Global session token | “provides single sign-on (SSO) functionality for all Access applications” | Takım alan adında |
| Application token | “Allows the user to access a specific Access application” | Korunan hostname’de |
Süreler en özelden en genele: Client session (varsa hepsini eziyor) → Policy session → Application session → Global session. Aralık 15 dakika – 1 ay, varsayılan 24 saat.
Yenilenme mantığı: “When the application token expires, Cloudflare will automatically issue a new application token if the global token is still valid… If the global token has also expired, the user will be prompted to re-authenticate with the IdP.”
Global token’ı daha uzun tutmanın gerekçesi: “the global token cannot be used to directly access an application.”
JWT’nin içi
{
"aud": ["32eafc7626e974616deaf0dc3ce63d7bcbed58a2731e84d06bc3cdf1b53c4228"],
"email": "kullanici@sirket.com",
"exp": 1659474457, "iat": 1659474397, "nbf": 1659474397,
"iss": "https://takim.cloudflareaccess.com",
"type": "app",
"sub": "7335d417-61da-459d-899c-0a01c76a2f94",
"country": "TR"
}
type değeri app (uygulama token’ı) veya org (global oturum). Service token ile gelen
isteklerde common_name doluyor ve "sub": "" boş kalıyor.
Origin’de doğrulama — ve atlatma riski
Bu sayfadaki en önemli bölüm. Doküman aynı şeyi iki ayrı yerde söylüyor:
“Unless your application is connected to Access through Cloudflare Tunnel, your application must validate the token to ensure the security of your origin. Validation of the header alone is not sufficient — the JWT and signature must be confirmed to avoid identity spoofing.”
“The external API should validate the application token issued by Cloudflare Access to ensure that any requests which bypass Access (for example, due to a network misconfiguration) are rejected.”
Tehdit modeli basit: Access Cloudflare kenarında çalışıyor. Origin IP’ni öğrenen biri doğrudan bağlanırsa giriş ekranı hiç devreye girmiyor. Bir DNS kaydı gri buluta alınırsa, bir firewall kuralı gevşerse de aynı şey oluyor.
Doğrulanacak üç şey: imza (RS256, JWKS’e karşı), iss (takım alan adın), aud
(uygulamanın AUD etiketi).
const JWKS = jose.createRemoteJWKSet(
new URL(`${TAKIM_ALAN_ADI}/cdn-cgi/access/certs`),
);
const token = request.headers.get("cf-access-jwt-assertion");
if (!token) return new Response("token yok", { status: 403 });
const { payload } = await jose.jwtVerify(token, JWKS, {
issuer: TAKIM_ALAN_ADI,
audience: AUD,
});
Cloudflare Workers, Go, Python (Flask) ve Node.js (Express) için çalışan örnek yayımlıyor.
nginx için native bir doğrulayıcı yok — doküman gövdesinde nginx 18 kez geçiyor ve hiçbiri
bu bağlamda değil (pozitif kontrol: apache 43 eşleşme). Pratik yol nginx’in auth_request
direktifiyle bu örneklerden birine delege etmek.
Cihaz duruşu
Üç aile var ve ayrım kritik:
| Aile | Client gerekiyor mu | Kaç kontrol |
|---|---|---|
| Cloudflare One Client kontrolleri | Evet | 15 |
| Üçüncü taraf (service-to-service) | Evet | 8 sağlayıcı |
| Access entegrasyon kontrolleri | Hayır | Yalnızca 2 |
İstemcisiz çalışan iki kontrol: Microsoft Entra ID Conditional Access ve Mutual TLS. Ve bunlar “cannot be used in Gateway network policies” — yalnızca Access’te.
Hiçbiri Enterprise gerektirmiyor. Doküman gövdesinde /posture-checks/ bloğunda plan kısıtı
ifadesi yok; tek “Feature availability” tablosu “All plans” diyor. Pozitif kontrol olarak aynı
gövdede enterprise plan 56 eşleşme veriyor — yani Cloudflare bu kapıyı gerektiğinde açıkça
yazıyor.
Zamanlama: Client varsayılan olarak beş dakikada bir yokluyor. Access aynı hızda algılıyor, Gateway ise beş dakika daha gecikiyor — 10 dakikalık yoklamada toplam 15 dakikaya kadar. Ve “Gateway does not terminate an active session even if a subsequent posture check fails during that session.”
Ne zaman kullanılır, ne zaman kullanılmaz
Uygun olduğu işler
- İç web uygulamalarını VPN olmadan açmak — wiki, Jenkins, Grafana, ERP
- Yüklenici ve dış ekiplere süreli, dar kapsamlı erişim vermek
- SaaS uygulamalarının önüne tek bir SSO katmanı koymak (35 hazır entegrasyon + generic SAML/OIDC)
- SSH erişimini port açmadan, komut kaydıyla vermek
- Bu sitenin
/yonetim/paneli gibi tek kişilik yönetim arayüzlerini kapatmak
Uygun olmadığı işler
- Origin’de doğrulama yapmadan, Tunnel’sız kurulum. Access atlanabilir hâle geliyor.
- RDP’yi altyapı uygulaması sanmak. Access for Infrastructure yalnızca SSH; RDP için browser-rendered terminal var ve o da yalnızca genel hostname’lerde çalışıyor.
- Bypass ile hızlı çözüm. Hiçbir kontrol uygulamıyor, hiçbir şey loglamıyor.
groupsclaim’ine dayalı yetkilendirme. 1 KB sınırında sessizce kırpılıyor.- SaaS uygulamasında oturumu kontrol etmek. “Access does not control how long the user can stay in the SaaS app itself.”
- Tarayıcıdan RDP’de sertifika zinciri doğrulaması beklemek. “We do not currently validate the chain of trust.”
Somut örnekler
1. Bu sitenin yönetim paneli
/yonetim/ yolu bir self-hosted Access uygulamasıyla korunuyor, policy’si tek satır:
Allow │ Include │ Emails │ samet.canturk@tdsynnex.com
Ama Access tek katman değil — Worker gelen Cf-Access-Jwt-Assertion başlığını yeniden
doğruluyor: JWKS’ten kid eşleştiriyor, iss ve aud kontrol ediyor, sonra e-postayı listeyle
karşılaştırıyor. Bu sayede *.workers.dev adresi üzerinden dolaşmak da işe yaramıyor — o adres
Access’in kapsamında değil ama Worker’ın kapsamında.
2. Rule group ile Require tuzağından kaçmak
Yanlış:
Allow │ Require │ Country │ Türkiye, Almanya ← ikisi birden olmak zorunda
Doğru:
Rule group "Ülke kuralları":
Include │ Country │ Türkiye
Include │ Country │ Almanya
Allow │ Require │ Rule group │ Ülke kuralları
│ Include │ Emails ending in│ @sirket.com
3. Service token ile makineye erişim
CI/CD veya bir izleme sistemi için, koltuk tüketmeden:
Service Auth │ Include │ Service Token │ ci-deploy-token
İstemci iki başlık gönderiyor: CF-Access-Client-Id ve CF-Access-Client-Secret. JWT’de
common_name doluyor, sub boş kalıyor.
4. Kimliği origin’e taşımak
curl -H "cookie: CF_Authorization=<token>" \
https://<takim>.cloudflareaccess.com/cdn-cgi/access/get-identity
Dönen alanlar: email, idp, geo, user_uuid, devicePosture, ip, auth_status,
common_name, is_warp, is_gateway, device_id, device_sessions.
5. SPA’de oturum bitişini yakalamak
fetch("/api/veri", { headers: { "X-Requested-With": "XMLHttpRequest" } })
.then((y) => {
if (y.status === 401) location.reload(); // Access oturumu bitti
return y.json();
});
Bu başlık olmadan Access yönlendirme döndürüyor ve fetch sessizce giriş sayfasının HTML’ini
alıyor.
Demo 1: Access’i atlat, sonra atlatılamaz hâle getir
Bu demonun tamamı tek bir cümleyi kanıtlamak için: “Unless your application is connected to Access through Cloudflare Tunnel, your application must validate the token.”
Ön koşullar: Ubuntu sunucu (public IP), ornek.com Cloudflare’de aktif, Zero Trust hesabı.
export ZONE=ornek.com
export HOST=ic-panel.$ZONE
export ORIGIN_IP=203.0.113.10
Adım 1 — Korunacak servisi kur
sudo apt update && sudo apt install -y nginx python3-pip
sudo mkdir -p /var/www/ic-panel
echo '<h1>Gizli iç panel</h1><p>Bu sayfayı yalnızca yetkili kişiler görmeli.</p>' \
| sudo tee /var/www/ic-panel/index.html
sudo tee /etc/nginx/sites-available/ic-panel.conf >/dev/null <<'EOF'
server {
listen 80;
server_name ic-panel.ornek.com;
root /var/www/ic-panel;
index index.html;
}
EOF
sudo ln -sf /etc/nginx/sites-available/ic-panel.conf /etc/nginx/sites-enabled/
sudo nginx -t && sudo systemctl reload nginx
ic-panel.ornek.com için proxied (turuncu bulut) bir A kaydı oluştur.
Adım 2 — Access uygulamasını oluştur
Panel: Zero Trust → Access → Applications → Add an application → Self-hosted
- Application domain:
ic-panel.ornek.com - Policy: Allow · Include · Emails · kendi e-postan
Adım 3 — Access’in çalıştığını doğrula
curl -sI https://$HOST/ | head -3
302 ve location: https://<takim>.cloudflareaccess.com/cdn-cgi/access/login/... görmelisin.
Tarayıcıdan açınca giriş ekranı geliyor.
Adım 4 — Access’i ATLAT
Şimdi origin IP’sine doğrudan bağlan. --resolve DNS’i atlıyor:
curl -s --resolve $HOST:80:$ORIGIN_IP http://$HOST/ | head -5
Gizli sayfa açılıyor. Giriş ekranı yok, JWT yok, log yok.
Adım 5 — JWT doğrulayıcısını kur
AUD etiketini panelden al: Access → Applications → Configure → Additional settings → Application Audience (AUD) Tag.
sudo pip3 install --break-system-packages flask PyJWT cryptography requests
sudo tee /opt/access-dogrula.py >/dev/null <<'PY'
import os, jwt, requests
from flask import Flask, request
from cryptography.hazmat.primitives import serialization
TAKIM = os.environ["TEAM_DOMAIN"] # https://<takim>.cloudflareaccess.com
AUD = os.environ["POLICY_AUD"]
CERTS = f"{TAKIM}/cdn-cgi/access/certs"
app = Flask(__name__)
def anahtar(kid):
# public_cert DEGIL: kid eslestirmesi. Rotasyonda eski deger okunmasin diye.
for k in requests.get(CERTS, timeout=5).json()["keys"]:
if k["kid"] == kid:
return jwt.algorithms.RSAAlgorithm.from_jwk(k)
return None
@app.route("/dogrula")
def dogrula():
token = request.headers.get("Cf-Access-Jwt-Assertion")
if not token:
return "token yok", 403
try:
kid = jwt.get_unverified_header(token)["kid"]
pk = anahtar(kid)
if pk is None:
return "anahtar eslesmedi", 403
jwt.decode(token, pk, algorithms=["RS256"], audience=AUD, issuer=TAKIM)
except Exception as e:
return f"gecersiz: {e}", 403
return "", 200
app.run(host="127.0.0.1", port=8099)
PY
TEAM_DOMAIN="https://<takim>.cloudflareaccess.com" \
POLICY_AUD="<aud-etiketi>" \
sudo -E python3 /opt/access-dogrula.py &
Adım 6 — nginx’i doğrulayıcıya bağla
sudo tee /etc/nginx/sites-available/ic-panel.conf >/dev/null <<'EOF'
server {
listen 80;
server_name ic-panel.ornek.com;
root /var/www/ic-panel;
index index.html;
location = /_access {
internal;
proxy_pass http://127.0.0.1:8099/dogrula;
proxy_pass_request_body off;
proxy_set_header Content-Length "";
proxy_set_header Cf-Access-Jwt-Assertion $http_cf_access_jwt_assertion;
}
location / {
auth_request /_access;
try_files $uri $uri/ =404;
}
}
EOF
sudo nginx -t && sudo systemctl reload nginx
Adım 7 — Aynı atlatmayı tekrar dene
echo "--- dogrudan origin'e (artik reddedilmeli) ---"
curl -s -o /dev/null -w "%{http_code}\n" --resolve $HOST:80:$ORIGIN_IP http://$HOST/
echo "--- Cloudflare uzerinden (calismali) ---"
curl -sI https://$HOST/ | head -1
Doğrudan istek artık 403. Cloudflare üzerinden giriş yapınca sayfa açılıyor.
Adım 8 — Sahte token da geçmesin
curl -s -o /dev/null -w "sahte token: %{http_code}\n" \
-H "Cf-Access-Jwt-Assertion: sahte.token.degeri" \
--resolve $HOST:80:$ORIGIN_IP http://$HOST/
Yine 403 — başlığın varlığı yetmiyor, imza doğrulanıyor. Bu, dokümanın “Validation of the header alone is not sufficient” uyarısının kanıtı.
Adım 9 — Anahtar rotasyonuna hazır olduğunu göster
curl -s https://<takim>.cloudflareaccess.com/cdn-cgi/access/certs | jq '{
anahtar_sayisi: (.keys | length),
kid_listesi: [.keys[].kid],
public_certs_sayisi: (.public_certs | length)
}'
İki anahtar dönüyor: mevcut ve bir önceki. Doğrulayıcın public_cert yerine kid eşleştirdiği
için rotasyonda kesinti olmuyor.
Demo 2: Require tuzağını üret ve düzelt
Bu demo tek bir yapılandırma hatasının nasıl herkesi kilitlediğini gösteriyor — ve hata mesajı yardımcı olmadığı için sahada saatler kaybettiriyor.
Adım 1 — Çalışan bir policy ile başla
Allow │ Include │ Emails ending in │ @sirket.com
# Tarayicidan giris yap, sonra:
curl -sI https://$HOST/ -H "cookie: CF_Authorization=$TOKEN" | head -1
Adım 2 — Ülke kısıtını “doğal” yoldan ekle
Allow │ Include │ Emails ending in │ @sirket.com
│ Require │ Country │ Türkiye, Almanya
Sezgi: “kullanıcı Türkiye’de veya Almanya’da olsun.” Gerçek: ikisinde birden olsun.
curl -sI https://$HOST/ | head -1
Kimse giremiyor. Access “erişim reddedildi” diyor ama nedenini söylemiyor.
Adım 3 — Logda ne göründüğüne bak
Panel: Zero Trust → Logs → Access
Adım 4 — Rule group ile düzelt
Panel: Access → Policies → Rule groups → Create
Rule group "Ülke kuralları":
Include │ Country │ Türkiye
Include │ Country │ Almanya
Sonra policy’yi şuna çevir:
Allow │ Include │ Emails ending in │ @sirket.com
│ Require │ Rule group │ Ülke kuralları
sleep 60 # yayilma ~60 saniye
curl -sI https://$HOST/ -H "cookie: CF_Authorization=$TOKEN" | head -1
Adım 5 — Değerlendirme sırasını da gör
Policy listesine bir Bypass ekle ve sıranın listedeki sıra olmadığını kanıtla:
1. Allow │ Include │ Emails ending in │ @sirket.com
2. Block │ Include │ Country │ (test için kendi ülken)
3. Bypass │ Include │ IP ranges │ (kendi IP'n)
Sezgi: 2. sıradaki Block önce çalışır. Gerçek: 3. sıradaki Bypass önce çalışıyor ve seni içeri alıyor — “Bypass and Service Auth policies are evaluated first.”
Adım 6 — Bypass’ın loglamadığını kanıtla
Aynı isteği tekrar at, sonra Zero Trust → Logs → Access ekranına bak. Bypass ile geçen istek logda yok.
Ölçüm tablosu
| Ölçüt | Değer |
|---|---|
| Cloudflare üzerinden istek (Access açık) | |
| Origin IP’sine doğrudan istek — doğrulayıcı yokken | |
| Origin IP’sine doğrudan istek — doğrulayıcı varken | |
| Sahte JWT ile doğrudan istek | |
| JWKS’te dönen anahtar sayısı | |
Require · Country · A, B ile erişebilen kullanıcı sayısı | |
| Rule group’a taşıdıktan sonra | |
| Policy değişikliğinin yayılma süresi | |
| Bypass ile geçen isteğin logda görünmesi |
Fiyatlandırma
Rakamlar 1 Eylül 2026’da cloudflare.com/sase/products/access sayfasından alındı — bu, fiyatları statik HTML’de sunan tek resmî sayfa.
| Free | Pay-as-you-go | Contract | |
|---|---|---|---|
| Fiyat | 0 USD | 7 USD / kullanıcı / ay (yıllık) | Özel |
| Konumlandırma | “Best for teams under 50 users or enterprise proof-of-concept tests.” | “Best for teams over 50 users solving narrow SSE use cases…” | “…full-featured SSE or SASE deployment…” |
| Uptime SLA | — | %100 | %100 |
| Destek | Topluluk forumları ve Discord | Sohbet ve destek talebi | Telefon, sohbet, talep + profesyonel hizmetler |
| Log saklama | 24 saate kadar | 30 güne kadar | 6 aya kadar; SIEM/bulut depoya Logpush |
| DNS lokasyonu | 3’e kadar | 50’ye kadar | 250’ye kadar |
| CASB entegrasyonu | 2 salt-okunur | 2 salt-okunur | Sınırsız (eklenti) |
| DLP | Sınırlı hazır profil | Sınırlı hazır profil | Tam özellikli (eklenti) |
| Browser Isolation | — | Eklenti | Eklenti |
| Email Security | — | — | Eklenti |
| Dedicated egress IP | — | — | Eklenti |
Her planda dahil olanlar: özelleştirilebilir erişim politikaları ve policy tester, self-hosted / SaaS / web olmayan (SSH, VNC, RDP) uygulamalar, eşzamanlı birden çok IdP, generic SAML ve OIDC, kimlik temelli bağlam, üçüncü taraf cihaz duruşu entegrasyonları, istemcisiz erişim, tarayıcıdan SSH ve VNC, split tunneling, App Launcher, service token’lar, iç DNS ve Local Domain Fallback, Terraform, mTLS kimlik doğrulama, DNS/HTTP/L4 filtreleme, SSH proxy ve komut kaydı, Shadow IT keşfi, DEX.
Lisanslama ve hukuki çerçeve
Access tescilli bir hizmettir ve Cloudflare Hizmet Şartlarına tabidir.
Log saklama — pazarlama ile dokümantasyon çelişiyor. İkisini de veriyoruz:
Pazarlama sayfası: “Standard log retention — up to 24 hours / up to 30 days / Up to 6 months” ve ayrıca “Block policy decisions are stored for a week, and authentication logs for 6 months.”
Dokümantasyon (yetkili tablo):
| Log tipi | Free | Standard | Enterprise |
|---|---|---|---|
| Admin logları | 18 ay | 18 ay | 18 ay |
| Access logları | 24 saat | 30 gün | 180 gün |
| DNS logları | 24 saat | 30 gün | 180 gün |
| Network logları | 24 saat | 30 gün | 30 gün |
| HTTP logları | 24 saat | 30 gün | 30 gün |
| Cihaz duruşu logları | 30 gün | 30 gün | 30 gün |
Üç ayrı uyuşmazlık: plan adları farklı (pazarlama Free/Pay-as-you-go/Contract; doküman Free/Standard/Access/Gateway/Enterprise ve “Pay-as-you-go” sütunu hiç yok), “6 ay” ile “180 gün” aynı şey değil ve doküman 180 günü yalnızca Access ve DNS loglarına veriyor, ve “block policy decisions… a week” ifadesi yalnızca pazarlama sayfasında geçiyor.
Türkiye — Access bu bölgeye sabitlenemiyor.
Cloudflare Türkiye’yi bir Regional Services bölgesi olarak destekliyor: “Cloudflare will only use data centers that are physically located within Turkey to decrypt and service HTTPS traffic.” Ama Access bu bölgeyi kullanamıyor.
Zero Trust dokümantasyonunda Türkiye hiç geçmiyor. 8,4 MB’lık Cloudflare One doküman
gövdesinde Turkey, Türkiye, Turkish, Istanbul, KVKK ve kişisel kelimelerinin tamamı
sıfır eşleşme veriyor. Pozitif kontrol aynı gövdede: Germany 16, United States 21,
India 17, Japan 9, France 7. Ülke adları orada ve aranabiliyor — Türkiye yok.
Gateway tarafında bölge kısmen mümkün, Access’te değil. Karşılaştırma için: Gateway’in HTTPS filtrelemesi Turkey bölgesine sabitlenebiliyor, ama “Gateway DNS (domain name filtering) cannot be regionalized using Regional Services” ve bu bile yalnızca Cloudflare One Client’ın Traffic and DNS modundaki trafiği için geçerli. Ayrıntı Gateway sayfasında.
KVKK. Cloudflare’in KVKK ile ilgili yayımlanmış tek bir sayfası yok. Trust Hub’ın hukuk rejimi dizininde sekiz jurisdiction var — GDPR, Brezilya LGPD, Japonya APPI, Singapur PDPA, Güney Kore PIPA, Hindistan IT Act, Avustralya Privacy Act, ABD — Türkiye yok. Bu, “0 eşleşme”dan daha güçlü bir kanıt: listenin kendisi var, sekiz komşusu var, Türkiye içinde değil.
Panel Türkçe değil. Resmî dil listesi on dil içeriyor ve Türkçe yok: Almanca, İngilizce, İspanyolca, Fransızca, İtalyanca, Japonca, Korece, Portekizce, Basitleştirilmiş ve Geleneksel Çince.
Sık yapılan hatalar
Origin’de JWT doğrulamamak
Access atlanabilir hâle geliyor. Tunnel kullanmıyorsan doğrulama zorunlu, ve başlığın varlığını kontrol etmek yetmiyor — imza doğrulanmalı.
public_cert değerini önbelleğe almak
Anahtar altı haftada bir dönüyor. kid eşleştirmesi yap; eski anahtar rotasyondan sonra yalnızca
7 gün geçerli kalıyor.
Require ile VEYA yazmaya çalışmak
Herkesi kilitliyor ve hata mesajı sebebi söylemiyor. VEYA anlamı için rule group kullan.
Bypass’ı hızlı çözüm olarak kullanmak
Hiçbir kontrol uygulanmıyor ve hiçbir şey loglanmıyor. Kimlik gerekmeyen ama denetlenmesi gereken erişim için Service Auth var.
groups claim’ine güvenmek
1 KB sınırında sondan başlayarak kırpılıyor. Çok gruba üye bir kullanıcı, aynı uygulamadaki başka bir kullanıcıdan farklı bir token alabiliyor.
SameSite=Strict bırakmak
ERR_TOO_MANY_REDIRECTS üretiyor. None veya Lax kullan.
Binding cookie’yi Zaraz veya Worker’lı bir zone’da açmak
Yönlendirme döngüsü oluşuyor. SSH/RDP gibi tarayıcı dışı erişimlerde de açma.
Require WARP ile kurumsal cihaz kontrolü yaptığını sanmak
Tüketici WARP’ı da geçiyor. Require Gateway kullan.
Cihaz duruşunun anında etkili olacağını beklemek
Gateway’de toplam gecikme 15 dakikaya kadar çıkabiliyor, ve aktif oturum duruş bozulsa bile sonlandırılmıyor.
Özel IP uygulamasında virgüllü port listesi yazmak
“Comma-separated lists of ports (such as 80, 443) are not supported.” Aynı IP’yi iki kez ekle.
SaaS uygulamasında oturum süresi kontrol ettiğini sanmak
“Application session durations only control the front door to a SaaS app; Access does not control how long the user can stay in the SaaS app itself.”
Sıkça sorulan sorular
- Access kullanmak için Cloudflare Tunnel şart mı?
- Duruma göre. Genel erişime açık bir hostname için şart değil: “If your application is already on the public Internet with DNS managed through Cloudflare (or a partial CNAME setup)… you can place Access in front of it by matching the application's hostname.” Ama bedeli var: “If your application is already publicly routable, a tunnel is not strictly required. However, you will then need to protect your origin IP using other methods.” Özel ağ ve altyapı uygulamaları içinse zorunlu: “You must also connect your private network to Cloudflare using a Cloudflare Tunnel or Cloudflare Mesh.” Tek cümlelik ayrım: Tunnel paketi porta ihtiyaç duymadan Cloudflare'e taşır, Access isteğin geçip geçmeyeceğine karar verir.
- Origin'de JWT doğrulaması yapmam gerekiyor mu?
- Tunnel kullanmıyorsan evet, ve doküman bunu iki ayrı yerde söylüyor. Birebir: “Unless your application is connected to Access through Cloudflare Tunnel, your application must validate the token to ensure the security of your origin. Validation of the header alone is not sufficient — the JWT and signature must be confirmed to avoid identity spoofing.” Ve ikincisi: “The external API should validate the application token issued by Cloudflare Access to ensure that any requests which bypass Access (for example, due to a network misconfiguration) are rejected.” Tehdit modeli basit: Access Cloudflare kenarında çalışıyor. Origin IP'ni öğrenen biri doğrudan bağlanırsa giriş ekranı hiç devreye girmiyor.
- Hangi başlığı doğrulamalıyım — çerezi mi başlığı mı?
- Başlığı. Birebir: “the request will include an application token as a
Cf-Access-Jwt-Assertionrequest header. Requests made through a browser will also pass the token as aCF_Authorizationcookie… We recommend validating theCf-Access-Jwt-Assertionheader instead of theCF_Authorizationcookie, since the cookie is not guaranteed to be passed.” Not: Cloudflare'in kendi Python örneği çerezi okuyor — aynı sayfanın tavsiyesiyle çelişiyor. Başlığı tercih et. - İmza anahtarı ne sıklıkla değişiyor?
- Birebir: “By default, Access rotates the signing key every 6 weeks. This means you will need to programmatically or manually update your keys as they rotate. Previous keys remain valid for 7 days after rotation to allow time for you to make the update.” Ve rotasyonu atlatmanın resmî yolu: “Validate tokens using the external endpoint rather than saving the public key as a hard-coded value. Do not fetch the current key from
public_cert, since your origin may inadvertently read an expired value from an outdated cache. Instead, match thekidvalue in the JWT to the corresponding certificate inpublic_certs.” Bu sitenin kendi yönetim paneli tam olarak böyle yazıldı. - JWT'de ne kontrol etmeliyim?
- Üç şey, ve Cloudflare'in dört dildeki örneğinin hepsinde bu üçü var: (1) imza —
<takım>.cloudflareaccess.com/cdn-cgi/access/certsadresindeki JWKS'e karşı RS256; (2)iss— takım alan adınla eşleşmeli; (3)aud— uygulamanın AUD etiketiyle eşleşmeli. AUD etiketini panelde Access → Applications → Configure → Additional settings → Application Audience (AUD) Tag altında bulursun ve “The AUD tag will never change unless you delete or recreate the Access application.” - nginx için hazır bir Access doğrulayıcısı var mı?
- Yok — doğrulanmış negatif bulgu. Cloudflare Workers, Go, Python (Flask) ve Node.js (Express) için çalışan örnek yayımlıyor, ama nginx'e özel bir doğrulayıcı yok. 8,4 MB'lık doküman gövdesinde
nginx18 kez geçiyor ve hiçbiri Access JWT doğrulaması bağlamında değil (pozitif kontrol: aynı gövdedeapache43 eşleşme). Pratik yol: nginx'inauth_requestdirektifiyle Cloudflare'in Python veya Node örneğine delege etmek, ya da doğrulamayı bir Worker'da yapmak. - Policy'lerim kimseyi içeri almıyor.
- Muhtemelen Require kural tipini yanlış kullanıyorsun. Include = VEYA, Require = VE, Exclude = DEĞİL. Cloudflare'in kendi örneği:
Require · Country · United States, Portugal+Require · Emails ending in · @sirket.com, @tasaron.com→ “This policy requires the user to be in the United States AND Portugal simultaneously, and have an email ending in both@cloudflare.comAND@contractors.com. Therefore, nobody will have access to the application.” Çözüm: VEYA anlamını bir rule group'a taşı, sonraRequire · Rule groupyaz. - Policy'ler hangi sırada değerlendiriliyor?
- Aksiyon tipine göre, listedeki sıraya değil. Birebir: “Bypass and Service Auth policies are evaluated first, from top to bottom as shown in the UI. Then, Block and Allow policies are evaluated based on their order from top to bottom.” Cloudflare'in örneği: listede
Allow A · Block B · Service Auth C · Bypass D · Allow Evarsa çalışma sırasıService Auth C → Bypass D → Allow A → Block B → Allow E. Ve “Once a user matches an Allow or Block policy, evaluation stops.” Değişiklik yayılımı yaklaşık 60 saniye. - Bypass aksiyonu ne yapıyor, güvenli mi?
- Hiçbir kontrol uygulamıyor ve loglamıyor. Birebir uyarı: “Bypass does not enforce any Access security controls and requests are not logged. Bypass policies should be tested before deploying to production. Consider using Service Auth if you would like to enforce policies and maintain logging without requiring user authentication.” İki tuzak daha: kimlik temelli seçicileri desteklemiyor, ve “Bypass policies which contain device posture check rules will not function when: Zaraz is enabled for the zone… a Worker intercepts the request.”
- Access ile Gateway aynı trafiğe uygulanırsa hangisi kazanıyor?
- Varsayılan sıra: “By default, Cloudflare will evaluate Access application policies after evaluating all Gateway network policies.” Ama Gateway'in izin vermesi Access'i geçersiz kılmıyor — birebir: “If Gateway traffic is headed to a private IP address protected as an Access application, that traffic will still be evaluated by the destination application's Access policies, even if a Gateway Allow policy matched first… A Gateway Allow policy does not override or bypass Access policies.”
- Oturum ne kadar sürüyor?
- İki token var, dört katman süre. Global session token takım alan adında duruyor ve SSO sağlıyor; application token korunan hostname'de duruyor. Süre katmanları en özelden en genele: Client session (varsa hepsini eziyor) → Policy session → Application session → Global session. Aralık 15 dakika – 1 ay, varsayılan 24 saat. Yenilenme mantığı: “When the application token expires, Cloudflare will automatically issue a new application token if the global token is still valid… If the global token has also expired, the user will be prompted to re-authenticate with the IdP.” Ve global token'ı uzun tutmanın gerekçesi: “the global token cannot be used to directly access an application.”
- Çalınan bir çereze karşı ne yapabilirim?
- Binding cookie'yi aç. Birebir: “The binding cookie (
CF_Binding) is an optional cookie issued when a user successfully authenticates… This cookie is stripped at Cloudflare's network and never forwarded to the origin server. TheCF_Authorizationcookie cannot be used without the associated binding cookie, which prevents a stolenCF_Authorizationcookie from being reused by an attacker.” Açmaman gereken durumlar: SSH/RDP gibi tarayıcı dışı araçlar, zone'da Zaraz veya Google tag gateway varsa (“can cause an authentication redirect loop (ERR_TOO_MANY_REDIRECTS)”), ve Cloudflare One Client ile kimlik doğrulama açıksa. - ERR_TOO_MANY_REDIRECTS alıyorum.
- İlk bakılacak yer SameSite ayarı. Birebir: “If you are receiving the
ERR_TOO_MANY_REDIRECTSerrors, make sure yourSameSitesetting is set to None or Lax. Setting theSameSitesetting to Strict can result in too many redirects.” İkinci sebep: binding cookie + Zaraz/Worker birlikteliği. Üçüncüsü: çok alan adlı uygulamada eager redirect — “Browser behavior can become unreliable when the redirect chain exceeds 10 redirects. If your application has more than 10 domains, turn off this setting.” - IdP grupları JWT'de neden görünmüyor?
- İki sebepten. Birincisi: “Identity provider groups are only included in the token when you explicitly configure
groupsas a custom SAML attribute or OIDC claim. Access does not add them automatically.” İkincisi çok daha sinsi: “Access trims custom attributes and claims when the serializedcustomclaim exceeds roughly 1 KB (1,000 bytes), dropping configured values from the end of the list first. Groups are usually the largest contributor to this size, so a user who belongs to many groups can receive a token without theirgroupsclaim while other users on the same application keep it.” Cloudflare'in kendi sonucu: “Do not rely on custom claims in the JWT for authorization decisions when they may grow large.” - Kullanıcıyı nasıl tamamen çıkarırım?
- Çıkış URL'i:
<uygulama>/cdn-cgi/access/logoutveya<takım>.cloudflareaccess.com/cdn-cgi/access/logout— “This action revokes the user's session across all applications… all previously issued tokens will stop being accepted in 20-30 seconds.” Ama kalıcı değil: “Unless there are changes to rules in the policy, users can start a new session if their profile in your identity provider is still active.” Kalıcı iptal için Cloudflare'in kendi talimatı: “1. Disable their account in your identity provider…” Ve iki ince nokta: Remove koltuğu boşaltıyor ama yetkiyi kalıcı kaldırmıyor; Revoke oturumu bitiriyor ama “will not remove the user's consumption of an active seat.” Ayrıca “the user will not be able to log in again for up to 1 minute.” Ve son kullanıcı tarafında: “end users cannot log themselves out on a per-application basis.” - SPA'im oturum bitince bozuluyor.
- Access AJAX isteklerini yönlendirme yerine hata koduyla karşılayabiliyor. Birebir: “add the following header to all AJAX requests:
X-Requested-With: XMLHttpRequest” → süresi dolmuş token'da yönlendirme yerine 401 dönüyor. “We recommend using this response code to either force a page refresh or to display a message to the user that their session has expired.” Ayrıca 1 Temmuz 2026'da bir düzeltme geldi: Access artık giriş sonrası geri dönerken URL fragment karakterlerini (/,?,=,&,;) koruyor. - Cihaz duruş kontrolleri Enterprise gerektiriyor mu?
- Hayır — doğrulanmış negatif bulgu. Doküman gövdesinde
/posture-checks/bloğunda plan kısıtı ifadesi hiç yok; tek “Feature availability” tablosu Client certificate sayfasında ve “All plans” diyor. Pozitif kontrol: aynı gövdedeenterprise plan56 eşleşme veriyor — örneğin “User Risk Score… This selector only displays for Enterprise plans”. Yani Cloudflare Enterprise kapısını gerektiğinde açıkça yazıyor, duruş kontrollerinde yazmıyor. Ama 15 Client kontrolünün tamamı ve tüm üçüncü taraf entegrasyonları Cloudflare One Client istiyor. İstemcisiz çalışan yalnızca iki tanesi var: Microsoft Entra ID Conditional Access ve Mutual TLS. - Duruş değişikliği ne kadar sürede etkili oluyor?
- Access ile Gateway farklı davranıyor. Client varsayılan olarak beş dakikada bir yokluyor. Access: “Access detects changes in device posture at the same rate as the polling frequency.” Gateway: “it maintains a local cache of posture results that is only updated every five minutes. Therefore, Gateway policies are subject to an additional five-minute delay” — 10 dakikalık yoklama sıklığında toplam 15 dakikaya kadar. Ve kritik bir sınır: “Gateway does not terminate an active session even if a subsequent posture check fails during that session. Gateway only evaluates posture checks at the beginning of a session.” Cloudflare'in önerisi: süre dolumunu yoklama sıklığının en az iki katı yap.
- “Require WARP” kontrolü güvenli mi?
- Sandığın kadar değil. Birebir: “Require WARP … will check for all versions of WARP, including the consumer version.” Yani ücretsiz tüketici WARP'ı çalıştıran herkes bu kontrolü geçiyor. Kurumsal anlam istiyorsan Require Gateway kullan: “Require Gateway will only allow requests coming from devices whose traffic is filtered by your organization's Cloudflare Gateway configuration.”
- Kaç uygulama ve policy tanımlayabilirim?
- Resmî varsayılan limitler — ve giriş cümlesi önemli: “These limits may be increased on Enterprise accounts.” Uygulama 500 · uygulama başına kural 1.000 · uygulama başına alan adı 50 · yeniden kullanılabilir policy 500 · rule group 300, grup başına kural 1.000 · service token 50 · kimlik sağlayıcı 50 · mTLS kök sertifikası 50 · altyapı hedefi 5.000. Karakter sınırları: uygulama adı 350, ama uygulama URL'i ve takım alan adı yalnızca 63. Not: “uygulama başına policy sayısı” diye bir limit yayımlanmıyor — 500 hesap geneli yeniden kullanılabilir policy sayısı, karıştırma.
- Koltuk nasıl sayılıyor?
- Birebir: “When users authenticate to an application or enroll their agent into the Cloudflare One Client, they count against one of your active seats.” Koltuk azaltmak için önce kullanıcıları kaldırman gerekiyor. Koltuk tüketmeyen yol: “you can use Access service tokens to allow access to applications without consuming seats.” Tersine bir tuzak da var: “Each user who authenticates through an authorization proxy endpoint occupies a Gateway seat.”
- Fiyat ne kadar?
- Ürün sayfasından, 1 Eylül 2026: Free 0 USD (“Best for teams under 50 users or enterprise proof-of-concept tests”), Pay-as-you-go 7 USD/kullanıcı/ay (yıllık ödeme), Contract özel fiyat. Ama aynı sayfa kendi içinde çelişiyor: “Core capabilities” bölümündeki Usage satırı Free için “50 user limit” diyor, “Access controls” bölümündeki Usage satırı ise Free hücresini boş bırakıp yalnızca iki değer gösteriyor. Üçüncü bir kaynak 50'yi doğruluyor: SASE referans mimarisi “many of the capabilities… can be used for free, without any time constraints, for up to 50 users.” Not: brief'teki
cloudflare.com/plans/zero-trust/adresi 404 dönüyor; canlı plan sayfası fiyatları JavaScript ile yüklüyor ve ham HTML'de göstermiyor. - Loglar ne kadar saklanıyor?
- Pazarlama sayfası ile dokümantasyon çelişiyor; ikisini de veriyoruz. Pazarlama: “Standard log retention — up to 24 hours / up to 30 days / Up to 6 months” ve ayrı bir satırda “Block policy decisions are stored for a week, and authentication logs for 6 months.” Dokümantasyon (yetkili tablo): Access logları Free 24 saat, Standard 30 gün, Enterprise 180 gün; Network ve HTTP logları Enterprise'da bile 30 gün; admin logları her planda 18 ay. Üç ayrı uyuşmazlık var: plan adları farklı (pazarlama Free/Pay-as-you-go/Contract, doküman Free/Standard/Access/Gateway/Enterprise), “6 ay” ile “180 gün” aynı şey değil ve doküman 180 günü yalnızca Access ve DNS loglarına veriyor, ve “block policy decisions… a week” ifadesi yalnızca pazarlama sayfasında geçiyor.
- Hesap genelinde varsayılan reddetme kurabilir miyim?
- Evet — ve bu, kazara ifşayı önlemenin en doğrudan yolu. Birebir: “When this setting is turned on, traffic to any hostname without a matching Access application is automatically blocked. This deny-by-default approach prevents accidental exposure of internal resources to the public Internet. Without this setting, a developer could deploy a new application or create a DNS record and inadvertently expose the resource before configuring an Access application.” Engellenen istek şunu görüyor:
Error 1050: This resource is blocked by this account's Default-Deny policy. - Access for Infrastructure hangi protokolleri destekliyor?
- Yalnızca SSH. Birebir: “Access for Infrastructure currently supports SSH. To connect using other protocols, add a self-hosted private application. For browser-based SSH, RDP, or VNC, refer to browser-rendered terminal.” Yani RDP bir altyapı uygulama tipi değil. Cloudflare One Client zorunlu, ve “Cloudflare will not create new users on the target. UNIX users must already be present on the server.” 1 Temmuz 2026'dan beri SSH için YubiKey PIV ile bağımsız MFA var.
- Tarayıcıdan SSH/RDP/VNC açabilir miyim?
- Evet, istemci kurmadan — ama kısıtları oku. “For SSH and VNC, user email prefixes must match their username on the server.” Kısıtlar birebir: “Browser rendering is only supported for self-hosted public applications, not private IPs or hostnames”; “You can only render a browser-rendered terminal on domains and subdomains, not on specific paths”; “Cloudflare does not control the length of an active SSH, VNC, or RDP session”; ve RDP için dikkat çekici olan: “Cloudflare uses TLS to secure the egress RDP connection to your Windows server. We do not currently validate the chain of trust.” Policy tarafında Bypass ve Service Auth desteklenmiyor.
- Kimlik sağlayıcım listede yok.
- Muhtemelen yine çalışır. Birebir: “If you do not see your identity provider listed, these providers can typically still be enabled. If they support OIDC or OAuth, select the generic OIDC option. If they support SAML, select the generic SAML option. Cloudflare supports all SAML and OIDC providers… If your provider supports both SAML and OIDC, we recommend OIDC for ease of configuration.” Belgelenmiş 26 sağlayıcı sayfası var, artı generic SAML ve generic OIDC. Yeni hesaplarda varsayılan artık one-time PIN değil, Cloudflare'in kendi kimlik sağlayıcısı.
- Access trafiğimi Türkiye'ye sabitleyebilir miyim?
- Hayır. Cloudflare Türkiye'yi bir Regional Services bölgesi olarak destekliyor — ama Access bu bölgeyi kullanamıyor. Uyumluluk matrisinin Access satırı 🚧 ve dipnotu birebir şöyle: “Can be localized to US FedRAMP Moderate Domestic region only.” Yani Access için tek bölgeselleştirme seçeneği ABD FedRAMP bölgesi. İki ek kısıt: “Access App SSL keys can use Geo Key Manager. Access JWT is not yet localized.” ve “Customer Metadata Boundary can be used to limit data transfer outside region, but Access User Logs will not be available outside US region. EU customers must use Logpush to retain logs.” Ayrıca CMB yalnızca
usveeudestekliyor. Zero Trust dokümantasyonunun tamamındaTurkey,Türkiye,IstanbulveKVKKsıfır eşleşme veriyor (pozitif kontrol: aynı gövdede Germany 16, United States 21, India 17). - `.tr` alan adıyla Access kullanabilir miyim?
- Evet. Cloudflare Registrar'ın
.tr'yi desteklememesi ayrı bir konu — o yalnızca alan adını Cloudflare'de kaydedemeyeceğin anlamına geliyor, zone olarak ekleyemeyeceğin değil. Access'in ön koşulu TLD'den bağımsız: “An active domain on Cloudflare… Domain uses either a full setup or a partial (CNAME) setup.” Doküman gövdesinde.triçin hiçbir dışlama yok. Pratik not: full setup nameserver değişikliği gerektiriyor;.trtarafında bunu yapamıyorsan partial (CNAME) setup Access tarafından açıkça destekleniyor ve kendi bölümü var. - Panel Türkçe var mı?
- Yok. Resmî dil listesi birebir: “Deutsch (German) · English · Español (Spanish) · Français (French) · Italiano (Italian) · 日本語 (Japanese) · 한국어 (Korean) · Português (Portuguese) · 简体中文 · 繁體中文” — Türkçe listede yok. Bu portalın var olma gerekçelerinden biri de bu.
İlgili servisler
- Cloudflare TunnelŞirket içi sunucunu, güvenlik duvarında port açmadan Cloudflare’e giden bir tünelle yayınlar.
- GatewayÇalışanların DNS, HTTP ve ağ trafiğini filtreler; zararlı ve yasak siteleri engeller.
- Cloudflare MeshSunucu, laptop ve telefonlara özel IP verip birbirlerine ulaşmalarını sağlar; eski adı WARP Connector.
- Cloudflare WANŞube, veri merkezi ve cloud ağlarını Cloudflare backbone’u üzerinden birbirine bağlar.
- Browser IsolationWeb sayfasını uzaktaki bir tarayıcıda çalıştırıp cihaza yalnızca render’ı gönderir.
- CASBGoogle Workspace, Microsoft 365 gibi SaaS hesaplarındaki misconfiguration’ları tarar.
Bu sayfadaki fiyat ve özellik bilgileri 1 Eylül 2026 tarihinde Cloudflare’in resmî kaynaklarından doğrulanmıştır. Cloudflare fiyatlandırmasını önceden haber vermeden değiştirebilir; bağlayıcı bilgi içinresmî sayfaya bakın.