Tüm Servislere Tek Şifre: Docker ile Authentik Kurulum Notlarım

Hetzner CX33 sunucumda Docker ve Portainer üzerinde yirmiye yakın servis koşturuyorum. n8n, Beszel, Grafana ve kendi yazdığım küçük paneller derken bir süre sonra iş çığırından çıktı. Her servise ayrı hesap açmak, her birinde iki adımlı doğrulamayı (MFA) tek tek kurmak ve şifreleri akılda tutmak tam bir eziyete dönüştü. İşin kötüsü, kullandığım bazı dahili araçlarda kullanıcı girişi özelliği bile yoktu; dış ağa açmak istesem doğrudan güvenlik riski yaratıyordu.

İlk önce Keycloak düşündüm ama tek başına 2 GB RAM isteyen devasa bir Java canavarı. Authelia tarafı çok daha hafif olsa da yetenekleri daha çok proxy authentication ile sınırlı; modern uygulamalar için OIDC tarafı biraz zayıf kalıyor. Ortada hem modern OIDC/OAuth2 desteği veren hem de Nginx ya da Traefik önünde Forward Auth yapabilen en mantıklı açık kaynak seçenek olarak Authentik kaldı.

Kurulumu yapıp tüm servisleri arkasına topladım. Sistem şu an tıkır tıkır çalışıyor. Ancak resmi dokümantasyonda yazmayan ya da arayüzde saç baş yolduran birkaç kritik ayrıntı var. Kurulum adımlarını, gerçek bellek tüketimini ve takıldığım pürüzleri doğrudan kendi notlarımdan aktarıyorum.

Kaynak Tüketimi: Küçük Sunucusu Olanlar Dikkat

Önce can alıcı noktadan başlayayım: Authentik öyle 'hafif' bir araç değil.

Mimarisi dört ana parçadan oluşuyor: Authentik Server, Worker, PostgreSQL veritabanı ve Redis önbelleği. Konteynerleri ayağa kaldırdığınız an, henüz tek bir kullanıcı bile giriş yapmamışken boşta yaklaşık 1.2 GB ile 1.5 GB arasında RAM tüketiyor.

Eğer 2 GB RAM'e sahip küçük bir VPS kullanıyorsanız, yanına başka bir servis koyduğunuz an Linux'un OOM Killer mekanizması devreye girip PostgreSQL'i anında öldürebilir. Bu yüzden sunucunuzda en az 2 GB veya 4 GB swap alanı açık değilse bu maceraya hiç girmeyin. Benim Hetzner CX33 makinede 8 GB RAM olduğu için sorun yaşamadım ama kenara mutlaka not edin.

Docker Compose ile Kurulum

Kurulum için resmi compose.yml dosyasını indirmek en temiz yol. Boş bir dizin oluşturup dosyayı çekiyoruz:

mkdir -p ~/authentik && cd ~/authentik
wget https://docs.goauthentik.io/compose.yml

Authentik'in çalışması için iki adet rastgele gizli anahtara ihtiyacımız var. Biri PostgreSQL parolası, diğeri oturumları imzalamak için kullanılan anahtar. Terminalden şu iki satırı çalıştırarak doğrudan .env dosyasına yazdırabilirsiniz:

echo "PG_PASS=$(openssl rand -base64 36 | tr -d '\n')" >> .env
echo "AUTHENTIK_SECRET_KEY=$(openssl rand -base64 60 | tr -d '\n')" >> .env

Burada ufak bir pürüz var: PostgreSQL 99 karakterden uzun parolalarda hata verebiliyor. Bu yüzden base64 çıktısını 36 karakterde tuttuk.

Varsayılan ayarlarda Authentik HTTP için 9000, HTTPS için 9443 portunu dinler. Önünde Traefik veya CloudPanel gibi bir reverse proxy varsa portları değiştirmeden doğrudan 9000 portuna yönlendirme yapabilirsiniz.

Konteynerleri başlatalım:

docker compose pull
docker compose up -d

İlk Kurulum Tuzağı: akadmin Şifresi

Konteynerler açıldığında tarayıcıdan doğrudan ana sayfaya giderseniz karşınıza boş bir giriş ekranı gelir. Elinizde henüz hiçbir kullanıcı adı ve şifre olmadığı için öylece kalırsınız.

İlk kurulum için özel bir adrese gitmeniz gerekiyor:

http://sunucu-ip-adresi:9000/if/flow/initial-setup/

Bu sayfaya girdiğinizde Authentik sizden varsayılan süper yönetici olan akadmin hesabı için bir şifre belirlemenizi ister. Şifreyi kaydedip panele giriş yapabilirsiniz.

Arayüzdeki Labirent: Provider, Application ve Flow Mantığı

Authentik yönetim paneline ilk girdiğinizde menüler arasında kaybolmanız işten bile değil. Akışı kafada netleştirmek için zinciri şöyle kurmak gerekiyor:

  • Provider (Sağlayıcı): Arkadaki servisle hangi dilden konuşacağınızı belirler. Örneğin Portainer için bir OAuth2/OIDC sağlayıcısı açarsınız.
  • Application (Uygulama): Kullanıcının gördüğü vitrindir. Uygulamaya bir isim verir, simgesini seçer ve az önce oluşturduğunuz Provider'ı buna bağlarsınız.
  • Flows (Akışlar): İşin en can alıcı kısmı burası. Giriş, kayıt, şifre sıfırlama gibi her işlem birer akıştan ibaret. Kullanıcı adı sorma, şifre denetleme ve iki adımlı doğrulama (MFA) aşamaları arka arkaya dizilir.

Buradaki tek tehlike: Varsayılan akışlardan bir Stage (aşama) silerseniz kendinizi panelin dışına kilitleyebilirsiniz. Bu yüzden akışları kurcalamadan önce kopyasını alıp üzerinde deneme yapmak en mantıklısı.

Portainer'ı OIDC ile Authentik'e Bağlamak

Kendi sunucumda ilk bağladığım servis Portainer oldu. Yapılandırma adımları şu şekilde:

  1. Authentik panelinde Applications -> Providers sekmesinden yeni bir OAuth2/OpenID Provider oluşturdum. Redirect URI olarak Portainer adresimi yazdım: https://portainer.alanadiniz.com/
  2. Sistem bana bir Client ID ve Client Secret verdi. Ardından Applications altından yeni bir uygulama açıp bu Provider ile eşleştirdim.
  3. Portainer tarafında Settings -> Authentication bölümüne geçip OAuth'u seçtim. Aldığım ID ve Secret bilgilerini yapıştırdım.
  4. OpenID Configuration URL alanına Authentik'in keşif adresini girdim: https://auth.alanadiniz.com/application/o/portainer/.well-known/openid-configuration

Kaydettiğim an Portainer giriş ekranına 'Login with OAuth' seçeneği geldi. Artık Portainer üzerinde ayrı bir şifre tutmuyorum; Authentik üzerinden Passkey (Touch ID) ile tek dokunuşla panele giriyorum.

Giriş Ekranı Olmayan Araçlar İçin: Traefik ile Forward Auth

Beni Authentik kurmaya asıl iten ihtiyaç, içinde kullanıcı girişi bulunmayan dahili panellerdi. Örneğin basit bir durum izleme ekranı veya arka planda çalışan bir kuyruk yöneticisi.

Authentik'in içindeki Proxy Outpost bileşeni burada devreye giriyor. Authentik üzerinde Forward Auth modunda bir Proxy Provider tanımlıyorsunuz. Traefik tarafında bir middleware kuralı yazarak trafiği önce bu Outpost'a yönlendiriyorsunuz.

Kullanıcı adrese gitmek istediğinde Traefik önce Authentik'e soruyor. Oturum açıksa istek servise geçiyor, oturum yoksa doğrudan Authentik giriş ekranı açılıyor. Servisin kaynak kodunda tek bir satır kullanıcı yönetimi olmasa bile önünde iki adımlı doğrulamalı tam bir güvenlik kalkanı oluşuyor.

Yaşayarak Öğrendiğim İki Önemli Detay

Kurulum yaparken tökezlediğim ve zaman kaybettiren iki konuyu buraya özellikle bırakıyorum:

  • UTC Zamanı ve Login Loop Hatası: Authentik konteynerlerine sunucunun yerel saat dosyasını (/etc/localtime) kesinlikle bağlamayın. Authentik içeride tamamen UTC ile çalışır. Sunucuyla konteyner arasında birkaç saniyelik bile zaman kayması olursa OIDC token'ları geçersiz sayılır ve oturum açmaya çalıştığınızda sürekli giriş ekranına geri fırlatılırsınız.
  • Docker Soketi ve Outpost Güvenliği: Authentik worker konteyneri varsayılan yapılandırmada /var/run/docker.sock dosyasını ister. Amacı Outpost konteynerlerini otomatik yönetmektir. Eğer Docker soketini bir konteynere teslim etmek istemiyorsanız bu satırı kaldırabilirsiniz; bu durumda Outpost'u bağımsız bir compose dosyasıyla manuel çalıştırmanız gerekir.

Son Söz

Authentik, 1.5 GB civarındaki RAM ayak izi ve arayüzündeki akış karmaşasını göze alırsanız, Docker altyapınız için kurabileceğiniz en derli toplu kimlik sağlayıcı. Özellikle Portainer, Grafana gibi OIDC destekleyen araçlarla, giriş ekranı olmayan dahili servisleri tek bir merkezde toplamak istiyorsanız harcadığınız zamana kesinlikle değiyor.