İçeriğe geç
Sahadan
SahaOrta12 dk okuma

Saldırganların Parola Sözlüğüne 'claude' Girdi: Ajan Çalıştıran Sunucuyu Sertleştirme

Honeypot ağımızda bir haftada 163 kez 'claude' kullanıcı adıyla SSH girişi denendi. Bu sayı jenkins, docker, kubernetes ve ansible denemelerinin toplamından fazla. 20 Eylül 2026 sabahı aynı filo sözlüğüne openclaw, agent ve cursor ekledi. Yapay zekâ ajanı çalıştıran bir sunucuda hesap, anahtar ve sır düzenini buna göre kurmak gerekiyor.

EÖ

Erdem Özyurt

·Güncellendi:

Saldırganların SSH parola sözlüğüne yapay zekâ ajanlarının kullanıcı adları girdi. Honeypot ağımızda 16-23 Eylül 2026 arasında claude kullanıcı adıyla 163 giriş denemesi kaydedildi; aynı pencerede jenkins, docker, kubernetes ve ansible denemelerinin toplamı 141’de kaldı. 20 Eylül sabahı aynı filo sözlüğüne openclaw, agent ve cursor ekledi.

Bu yazı, sunucusunda bir kodlama ajanı çalıştıran birinin hesap, anahtar ve sır düzenini nasıl kuracağını anlatıyor. Önce ölçüm, sonra düzen.

Ölçülen nedir, ne kadar yeni?

Rakamlar SiberKale honeypot ağının SSH ve Telnet potundan geliyor. Ölçüm penceresi 16 Eylül 00:00 ile 23 Eylül 20:15 UTC arası; bu, ölçüm anındaki ham log saklama penceresinin tamamı. Pencerede 40.864 kimlik denemesi yapıldı ve 1.494 farklı kullanıcı adı denendi.

Kullanıcı adı Deneme Kaynak IP İlk görülme
root 14.325 388 16 Eyl
admin 5.999 243 16 Eyl
ubuntu 1.997 101 17 Eyl
deploy 412 41 17 Eyl
claude 163 28 17 Eyl
openclaw 93 16 20 Eyl
jenkins 62 24 16 Eyl
docker 43 8 18 Eyl
ai 32 16 20 Eyl
ansible 22 20 17 Eyl
kubernetes 14 14 20 Eyl
agent 13 13 20 Eyl
cursor 13 13 20 Eyl

İki noktanın altını çizmek gerekiyor.

Birincisi, kıyas. On yıldır sahada olan CI/CD araçlarının kullanıcı adları, on sekiz aylık bir ajan ekosisteminin kullanıcı adının gerisinde. Sözlük yazarları kubernetes denemeye 14 IP ayırmışken claude denemeye 28 IP ayırmış.

İkincisi, tarih. openclaw, agent, cursor, ai, gitlab ve kubernetes kullanıcı adlarının hepsi ilk kez 20 Eylül sabahı 04:58 ile 06:17 UTC arasında denendi. Bu altı kelime tek seferde, tek bir güncellemeyle sözlüğe girdi. Yani sözlük yaşayan bir liste ve bakımı yapılıyor.

Denenen parolalar ise sözlüğün ne kadar basit olduğunu gösteriyor: claude/claude, openclaw/openclaw, agent/agent, cursor/cursor ve klasik 123, 123456. Bu bir istismar değil, envanter çıkarma. Saldırgan “bu isimde hesap var mı ve varsayılan mı bırakılmış” sorusunu ölçüyor, cevabı bir listeye yazıyor. O liste ikinci turda kullanılıyor.

Denemeleri yapan kaynakların tamamı tek bir adres bloğundan geliyordu: 109.160.32.0/24. Bu blok Tellal veritabanına 5 Eylül 2026’da girmiş, yani ölçüm anında 18 günlük. 55 aktif adresinin 41’i AbuseIPDB’de sıfır puanlı ve hiçbiri Spamhaus listesinde değil. Blokta her adres tam olarak 1.098 deneme yapmış ve tam olarak 350 farklı kullanıcı adı denemiş; bu eşitlik, merkezden dağıtılan tek bir iş kuyruğunun imzası.

Bir ajan hesabı ele geçerse ne kaybedilir?

Kullanıcı adının kendisi değerli değil. Değerli olan, o hesabın normal çalışma düzeninde elinde tuttukları.

Tipik bir ajan kurulumunda hesabın erişimi şunlardır: proje dizinlerinin tamamına okuma ve yazma, git deposuna push yetkisi veren kimlik, proje kökündeki ortam dosyaları, çoğu zaman bir SSH anahtarı ve giden internet erişimi. Bunların hepsi ajanın işini yapması için var. Aynı liste, hesabı ele geçiren biri için de aynı anlama gelir.

Buradaki asıl mesele şu: ajan mimarisi, bir hesabın altında çok şey toplamayı teşvik eder. Ajan ne kadar çok şeye erişirse o kadar faydalıdır. Güvenlik tarafında ise tam tersi geçerlidir. Bu gerilimi çözmenin yolu ajanı kısıtlamak değil, ajanın hesabını doğru çizmektir.

Ajan hesabını nasıl kurmalı?

Dört kural yeterli.

Hesap ayrı olsun, ad ürün adı olmasın. Ajanı root ile ya da kendi kişisel hesabınızla çalıştırmayın. Ayrı bir hesap açın ve adını kurumunuza özgü seçin.

sudo useradd --system --create-home --shell /usr/sbin/nologin agentsvc

--shell /usr/sbin/nologin ajanın interaktif kabuk girişi yapmasını engeller. Ajanı systemd servisi olarak çalıştırdığınızda buna ihtiyaç duymazsınız. Ajanın gerçekten kabuk komutu çalıştırması gerekiyorsa bu kısıtı kaldırmak yerine servis biriminin içinde kontrollü bir kabuk kullanın.

Parola ile SSH girişini kapatın. Sözlük saldırısını anlamsızlaştıran tek ayar budur.

# /etc/ssh/sshd_config.d/10-hardening.conf
PasswordAuthentication no
KbdInteractiveAuthentication no
PermitRootLogin no
AllowUsers erdem

AllowUsers satırı kritik. SSH ile giriş yapması gereken hesapları açıkça sayarsanız, ajan hesabı listede olmadığı için doğru parola bile bilinse giriş reddedilir. Değişikliği uygulamadan önce sözdizimini sınayın, yoksa kendinizi dışarıda bırakabilirsiniz:

sudo sshd -t && sudo systemctl reload ssh

Ajanın okuyabildiği sırları daraltın. Ajan hesabının ev dizininde yalnız o ajanın işini yapmak için gereken sırlar bulunsun. Bulut sağlayıcı kimlik dosyaları, üretim veritabanı parolaları ve yedekleme anahtarları başka bir hesapta dursun.

sudo install -d -m 700 -o agentsvc -g agentsvc /etc/agent-secrets
sudo install -m 600 -o agentsvc -g agentsvc /dev/null /etc/agent-secrets/env

Sır dosyasını proje dizinine koymayın. Proje dizinleri git deposuna, yedeklere ve konteyner imajlarına karışır. Ajan sırrı proje dışında dursun, servise ortam dosyası olarak verilsin:

# /etc/systemd/system/agent.service
[Service]
User=agentsvc
EnvironmentFile=/etc/agent-secrets/env
WorkingDirectory=/srv/projects
ProtectSystem=strict
ProtectHome=yes
PrivateTmp=yes
NoNewPrivileges=yes
ReadWritePaths=/srv/projects

ProtectSystem=strict ve ReadWritePaths ikilisi, ajanın yalnız proje dizinine yazmasını sağlar. NoNewPrivileges=yes, süreç içinden yetki yükseltmeyi kapatır.

sudo yetkisini tek tek yazın. Ajanın ayrıcalıklı bir komuta ihtiyacı varsa tam yol ve tam argümanla tanımlayın:

# /etc/sudoers.d/agentsvc
agentsvc ALL=(root) NOPASSWD: /usr/bin/systemctl restart myapp.service

Bu satır ajanın yalnız o servisi yeniden başlatmasına izin verir. NOPASSWD: ALL yazmak, ajanın yanlış yönlendirildiği her senaryoda sistem yetkisini teslim etmek demektir.

Sunucumda bu denemeler var mı, nasıl bakarım?

Ölçüm basit. Son bir haftanın başarısız SSH girişlerini kullanıcı adına göre saydırın:

journalctl -u ssh --since "7 days ago" --no-pager \
  | grep -oE "Invalid user [a-zA-Z0-9._-]+" \
  | awk '{print $3}' | sort | uniq -c | sort -rn | head -30

Debian tabanlı sistemlerde servis adı ssh, RHEL tabanlılarda sshd olur. Çıktı size kendi sunucunuza gelen sözlüğü verir.

Ajan adlarını özel olarak arayın:

journalctl -u ssh --since "30 days ago" --no-pager \
  | grep -EiC0 "Invalid user (claude|cursor|agent|openclaw|copilot|ollama|ai)\b"

Bu adların çıkması tek başına bir ihlal değildir. Anlamı şudur: sunucunuz artık rastgele tarama havuzunda değil, güncellenmiş bir sözlüğün hedefinde. O andan itibaren parola girişinin kapalı olduğunu doğrulamak isteğe bağlı bir iş olmaktan çıkar.

Ayarın gerçekten uygulandığını sunucunun dışından ölçün, yapılandırmayı okuyarak değil:

ssh -o PreferredAuthentications=password -o PubkeyAuthentication=no agentsvc@sunucu

Beklenen cevap Permission denied (publickey). Parola sorulursa ayar uygulanmamıştır.

Bu tabloyu nasıl okumalı?

Üç yıl önce bir sunucuda jenkins kullanıcı adının denenmesi, saldırganın CI sunucularını tanıdığı anlamına geliyordu. Bugün claude denenmesi, saldırganın ajan çalıştıran makineleri tanıdığı anlamına geliyor. Sözlük, ekosistemin haritasıdır ve gecikmeyle de olsa onu takip eder.

Dikkat çeken şey, gecikmenin ne kadar kısaldığı. cursor ve agent kelimelerinin sözlüğe girdiği anı tek bir sabahta ölçebildik. Bu, kampanyayı yazanların listeyi elle değil, ekosistemi izleyerek güncellediğini gösteriyor.

Savunma tarafında yapılacak şey değişmedi: parola girişini kapat, hesabı ayır, sırrı daralt, yetkiyi tek tek yaz. Değişen tek şey, bu işin artık ertelenebilir olmaktan çıkması. Ajan çalıştıran bir sunucunuz varsa, o sunucunun adı bugün birinin listesinde.

Bu ölçümün tam dökümü ve gösterge listesi Tellal’ın 16-23 Eylül bülteninde yayımlandı.

#ssh#guvenlik#ai#kodlama-ajani#claude#honeypot#brute-force#sunucu#sertlestirme#linux#systemd#devops
Paylaş:𝕏 TwitterLinkedIn

Sıkça Sorulan Sorular

Saldırganlar 'claude' kullanıcı adını neden deniyor?

Çünkü yapay zekâ kodlama ajanları sunucularda kendi sistem kullanıcılarıyla çalışıyor ve bu kullanıcı adları tahmin edilebilir. Saldırgan için değerli olan hesabın adı değil, elindekiler: ajanın çalıştığı hesapta çoğu zaman proje dizinlerine tam erişim, bir SSH anahtarı, ortam dosyalarında API anahtarları ve git kimlik bilgileri bulunur. Ölçtüğüm pencerede denemelerin tamamı parola olarak kullanıcı adının kendisini veya 123, 123456 gibi ilk sıra sözlük parolalarını kullandı. Yani bu henüz akıllı bir saldırı değil, envanter çıkarma hareketi.

Ajan için ayrı bir sistem kullanıcısı açmalı mıyım?

Evet, ama adını üründen almayın. Ajanı root ile veya kendi kişisel hesabınızla çalıştırmak, ajanın hata yaptığı ya da istem enjeksiyonuna uğradığı anda tüm makineyi vermek demektir. Doğru düzen: ajanın kendi hesabı olsun, o hesaba SSH ile parola girişi kapalı olsun, kabuk girişi gerekmiyorsa kabuğu nologin olsun ve ajan servis olarak systemd üzerinden çalışsın. Hesap adını agent01 gibi kuruma özgü ve tahmin edilmesi zor bir şey seçin; claude, cursor, agent gibi adlar bugün zaten sözlükte.

Ajanın kullandığı API anahtarlarını nerede tutmalıyım?

Ajanın okuyabildiği yerde, ama ajanın hesabının okuyabildiği her şeyin ajana verilmiş sayıldığını bilerek. Pratik kural şudur: ajan hesabının ev dizininde yalnız o ajanın işini yapmak için gereken sırlar bulunsun; bulut sağlayıcı kimlik dosyaları, üretim veritabanı parolaları ve yedekleme anahtarları başka bir hesapta dursun. Dosya izinleri 600 ve sahibi ajan hesabı olmalı. Sır dosyasını proje dizinine koymayın, çünkü proje dizinleri sık sık git deposuna ve yedeklere karışır.

Sunucumda bu denemelerin olup olmadığını nasıl kontrol ederim?

Başarısız SSH girişlerini kullanıcı adına göre saydırın. systemd kullanan bir sistemde journalctl -u ssh --since '7 days ago' | grep -E 'Invalid user|Failed password' komutu size denenen kullanıcı adlarını verir; çıktıyı awk ile kullanıcı adı alanına göre sıralayıp sayınca kendi sözlüğünüzü görürsünüz. Ajan adlarının listede çıkması, sunucunuzun rastgele taramadan hedefli listeye geçtiğinin ilk işaretidir. lastb komutu da aynı bilgiyi verir, ama btmp dosyası bazı dağıtımlarda kapalı gelir.

Parola girişini tamamen kapatmak yeterli mi?

Brute force için yeterli, ama tek başına yeterli değil. Parola kimlik doğrulaması kapalıyken sözlük saldırısı anlamsızlaşır; bu yüzden birinci adım odur. Ancak ajan çalıştıran bir sunucuda ikinci risk parola değil yetkidir: ajan hesabı hangi dosyaları okuyabiliyor, hangi komutları sudo ile çalıştırabiliyor, giden ağ trafiği kısıtlı mı. Bir ajan istem enjeksiyonuyla yanlış yöne sürüldüğünde giriş kapısından değil zaten içeriden hareket eder.

Ajan hesabına sudo yetkisi vermeli miyim?

Genel sudo yetkisi vermeyin. Ajanın gerçekten ihtiyaç duyduğu ayrıcalıklı komutlar varsa bunları tek tek, tam yol ve tam argümanla sudoers dosyasına yazın ve NOPASSWD kapsamını o komutlarla sınırlayın. Ajanın servis yeniden başlatması gerekiyorsa o servise özel bir systemctl izni yeterlidir. Geniş yetki veren her satır, ajanın yanlış yönlendirildiği senaryoda doğrudan sistem yetkisine dönüşür.

Kaynaklar

  1. 1

    Bülten 16-23 Eylül: saldırı sözlüğüne claude girdi, Türkiye tedariki dağıldı

    Tellal Tehdit İstihbarat Platformu (2026) ↗
  2. 2

    Bülten 24-31 Ağustos: sahne makinelere kaldı, KEYPLUG solucanı ağa girdi

    Tellal Tehdit İstihbarat Platformu (2026) ↗
EÖ

Yazan: Erdem Özyurt

Bilişim Danışmanı · ISP Altyapı · Siber Güvenlik

Kablo döşemekten kod yazmaya, ağ tasarımından web geliştirmeye; Layer 1'den Layer 7'ye bütünlük içinde çalışıyorum.

Hakkımda daha fazla →