Biçim Keep a Changelog esas alınmıştır.
- Sunucu eklerken CIDR editörü:
ModuleGenerator.shSSHModule.sh'yi yüklemediği için sunucu bilgileri (IP/port/kullanıcı/anahtar) okunamıyor ve "_ssh_env_get: command not found" yazıyordu; ayrıca değişken türü sorgusu Python'a BrokenPipe izi bastırabiliyordu. İkisi de giderildi (test eklendi).
-
Eylem düzeyi
requires_vars(isteğe bağlı manifest alanı): bir eylem, listedeki değişken değerler dosyasında boş/yoksa ssh'a gitmeden "⛔ çalıştırılmadı: değeri boş değişken: …" ile reddedilir; menüde eylem kartında ⛔ ve "Boş: …" ipucu görünür. Yalnızca o eylemleri kapatır (audit,rollback_*etkilenmez); alan yoksa davranış değişmez. Amaç: erişim kısıtını (örn.hardening_ssh_allow_from) boş bırakıp kendini dışarıda bırakmayı önlemek. -
Manifest:
platform_choices/onboarding_varsokunur ve doğrulanır (sunucu eklerken platform seçimi için hazırlık; seçim ekranı veapply_varsuygulaması sonraki PR'larda). Alan yoksa davranış değişmez; bozuksa paket kilide yazılmaz. Tasarım:docs/sunucu-ekleme-platform-secimi.md. -
Sunucu eklerken platform ve
allow_fromsorusu:ModuleGenerator.sh(anahtar adımından sonra), kurulu ve manifestindeplatform_choicesolan her paket için sunucu türünü doğrudan sorar ("Bilmiyorum" =generic, "Şimdi değil" = hiçbir şey yazılmaz), seçilen platformundefaultsdeğerlerini özetleyip onaylaservers/<ad>/<paket>.vars'a yazar (dosyadaki değerler ezilmez) veonboarding_varsiçin (örn.list[cidr]allow_from) mevcut CIDR editörünü açar; boş bırakılırsa değer yazılmaz ve ilgili eylemler ⛔ kalır. Manifest yoksa/alan yoksa hiçbir şey sorulmaz.apply_varsbu adımda YAZILMAZ (sonraki PR). Algılama (platform_detect) henüz yok; liste doğrudan sorulur. Yeni:Helpers/ComponentsOnboard.sh;platform_var=bilgi satırı.
- Çalışma paneli iki sütunlu (fzf eylem menüsü, eylem çalışırken): üst bölüm artık terminal genişliğinin tamamını kullanır: solda eylem özeti (ad, etkiler, onay, ön koşul), sağda son sonuç ve uyarılar;
│ayırıcı ve fzf'e benzer kenarlık etiketleri (Eylem,Son sonuç ve uyarılar). Üst bölümün yüksekliği içeriğe göre ayarlanır (en az 9 satır, en çok terminalin %40'ı), çıktı bölgesi altta tam genişlikte kalır; çıktı çerçevesinin başlığı canlı ilerlemeyi göstermeye devam eder.BECOME password:ve diğer istemler alt bölgede aynen çalışır. Terminal < 24 satır ya da < 60 sütunsa eski akış kullanılır. Çizim başlangıçtaki genişliğe göre yapılır; çalışırken terminal yeniden boyutlandırılırsa üst bölüm yeniden çizilmez. UI parçası:ui_region_begin2,ui_wrap_text(UI.sh).
Bu yama sürümü kullanıcıya görünür özellikler de taşır: paket menüsünde 🧪 Kontrol ve ön koşul önerisi, bulgular ekranı, canlı ilerleme, ortak arayüz parçaları ve linux-hardening 0.11.0.
- fail2ban davranışı değişti (
linux-hardening0.11.0):127.0.0.1/8 ::1her zaman muaf;hardening_fail2ban_ignoreipvarsayılanı boş ve yazdığınız adresleri EKLER. Kontrol makinesinin vehardening_ssh_allow_from'un adresi artık otomatik muaf EDİLMEZ: bağlı adres muaf değilse art arda hatalı denemede (5)bantime(varsayılan10m, eskiden1h) kadar banlanabilirsiniz; günlükte tek satırNOT (fail2ban)çıkar. Yükseltmede jail dosyası bir kez yeniden yazılır (ilk koşuchanged+ fail2ban yeniden başlatması). Gerçek VM doğrulaması (Ubuntu + Proxmox) henüz yapılmadı (yalnızca birim/Ansible testleri ve Docker LAB e2e yeşil); ikinci apply'ınchanged=0olması ve etkin ban davranışı sınanmadı.
- 🧪 Kontrol (paket eylem menüsü): pakette
previewveauditikisi de bu sunucunun platformunda varsa listede yeni satır; ikisini art arda çalıştırır (öncepreview, başarısızsaauditçalışmaz) ve sonunda tek özet yazar: apply'da değişecek sayısı, Lynis puanı, bulgular. Zorunlu değişken eksikse ⛔ ve hiçbir şey çalışmaz;auditkapıya/onaya takılırsapreviewsonucu korunur ve özet nedenini söyler. Paket kodu değişmez, eylemlerin kendi kapıları ve onayları aynen geçerlidir. Menü satırları kayar: Geçmiş artık Kontrol'den sonra gelir. - Ön koşul eylemini önermek (etkileşimli menü):
applygibirequirestaşıyan bir eylem seçilince ön koşul (örn.preview) yok ya da süresi dolmuşsa menü "önce çalıştırılsın mı? [e/H]" diye sorar, çalıştırır, sonucu gösterir ve "devam edilsin mi?" diye ikinci kez sorar; eylemin kendi onayı (sunucu adını yazma) ayrıca aynen sorulur. Ön koşul başarısız olursa ya da "H" denirse eylem çalışmaz; girdi biterse (EOF) "hayır" sayılır. Komut satırı (--components run) ve kapı (comp_gate_requires) değişmedi: atlama değil, çalıştırma kolaylığı. - Denetim bulguları: manifestte
outputs.findings(düz.tsvdosya adı) bildiren paketinbulgular.tsvdosyası (10 sütun: kimlik, risk, tur, aciklama, ayrinti, oneri, alan, deger, kapanir_varsayilan, platform) ayrıştırılır (component_findings.py; geçersiz satır atlanır, en çok 2000 satır, başlık bozuksa gösterilmez). Paket menüsünde hazırlık özetinde sayı ve eşleşen bulgular, "🔎 Bulgular" ekranında önem sırasıyla liste ve kartlar (ayrıntı, öneri, paket karşılığı, "elle ayarlayın / apply yeterli"), "yalnız eşlemeli" süzgeci. Biçim:docs/package-standard.md"Bulgular". - Canlı ilerleme (fzf çalışma paneli): paket
SSHPOCKET_PROGRESSsatırları yazıyorsa çıktı çerçevesinin başlığı çalışırken güncellenir ("Çıktı: apply — srv (çalışıyor) · aide 9/14 · bekleniyor ~300 sn"). Günlüğe saniyede bir bakan ayrı bir arka plan izleyici yapar; ana çıktı akışına dokunmaz (parola istemleri gecikmez), önceki koşunun günlüğünü yok sayar, panel bitince durur. - İlerleme satırı ayrıştırıcısı: paketin
SSHPOCKET_PROGRESS alan=… sira=n/toplam durum=basladi|bitti [degisen atlanan kesin uyari bekle_tahmin]satırları (comp_progress_parse) sonuç panelinde alan tablosu olur: uygulamada "değişen", önizlemede "değişecek" (+ toplam;kesin=0ise~tahmini), bitmeyen alan ⏳, uyarı sayısı. Satır yoksa panel eskisi gibidir;SSHPOCKET_RESULTayrıştırıcısıyla çakışmaz. Biçimdocs/package-standard.md'de.
- Python eklentili paketlerde ikinci koşu reddedilmesi:
linux-hardening0.10.0'ın callback/filter eklentileri ilk koşuda kurulu paket klasörüne__pycache__yazıyor, bir sonraki eylem "kurulu paketin dosyaları değişmiş" bütünlük denetimine takılıyordu (gerçek Proxmox'ta ilkauditplatform kapısında durduktan sonra ikinci deneme çalışmadı). Paket artıkPYTHONDONTWRITEBYTECODE=1ile çalışır. Etkilenmiş kurulumda__pycache__klasörlerini silmek yeter. - Test:
yürütme: TERM ve HUPtestinin sahteansible-playbook'u sinyalden sonra çıktı borularını bırakır; yetim işlembats'ı asmaz ve tam koşuda dalgalanmaz. - Aynı anda iki paket kurulumu (örn. iki Terminal sekmesinde
--components sync) artıkmvyüzünden iç içe klasör (0.9.1/linux-hardening-0.9.1) üretmez: kurulum bölümümkdirtabanlı kilitle (<paket>/.install.lock, sahibi ölmüşse temizlenir, doluysa ~10 sn bekler) korunur ve kilit altında "zaten kurulu mu" yeniden bakılır. Bozuk iç içe kurulumda eski davranış korunur: "kurulu paketin dosyaları değişmiş", elle silip yenidensync.
- Paket eylem paneli kozmetiği: rozetler düz sembol (✎ / ☠; emoji genişliği sarmayı bozuyordu), kart uyarıları ve başlık özeti terminal genişliğine göre sözcük sınırından bölünür; "Geçmiş ve son sonuçlar" satırı son 5 çalıştırmayı ve son günlüğün sonunu sağ bölmede gösterir.
- Ortak arayüz parçaları (
UI.sh): menülerdeki seçici (ui_pick), kaydırma bölgeli ekran (ui_region_begin/end/reset,ui_rule_label) ve genel liste editörü (ui_edit_list) paket menüsünden çıkarıldı;comp_menu_edit_listartık yalnızca CIDR/paket geri çağrımlarını verir. Davranış değişmedi.UI_PICK_*veUI_LIST_*bağlam değişkenleridocs/ui-design.md§5b'de belgelendi (yeni paketler, örn.utility, aynı altyapıyı kullanır). Paketten bağımsız yeni testler. - Eylem paneli (fzf): eylem listesinde hazırlık özeti başlıkta, seçili eylemin kartı (etkiler, onay, ön koşul, kapı durumu, son sonuç, uyarılar) sağ bölmede; eylem bitince sonuç paneli (durum, süre,
ok/changed/failedözeti, sonuç anahtarları, günlük yolu, sıradaki adım). Terminal ≥ 24 satır ve 60 sütunsa çalışma sırasında üst bölüm sabit kalır, alt bölüm kaydırma bölgesi olur: onay soruları,BECOME password:istemi ve çıktı aynı ekranda akar,Ctrl-Cbölgeyi sıfırlar. Küçük terminalde ve numaralı modda eski akış. Çok satırlı açıklama desteği eklendi. - Değişken düzenleme (etkileşimli modda, ok tuşlu/fzf):
boolveenumiçin seçici liste (izinli değerler, imleç şimdikinin tersinde, sağda açıklama, riskli değer işaretli, "Varsayılana dön");list[string],list[int]velist[cidr]için liste editörü (öğeler liste, Enter ile sil/değiştir, ➕ Ekle, CIDR için öneri ve sunucunun gördüğü adres, 🧹 Temizle, 💾 Kaydet; Vazgeç dosyayı değiştirmez);int/stringyanlış değerde ekran kapanmadan 3 deneme. Kayıt sonrası "Devam için Enter" duraksaması yok, ileti değişken listesinde görünür.describeçıktısına 10. alan (enum değerleri) eklendi. Numaralı modun akışı değişmedi. - fzf geniş düzen (Değişkenler ekranı): yol çubuğu kenarlık etiketi (
Sunucu › … › Değişkenler), üstte grup ve sayı özeti, sağda açıklama bölmesi (fzf ≥ 0.35 etiketli kenarlık, ≥ 0.58 etiketli liste/giriş çerçeveleri; eski fzf'te yalnız sağ önizleme),Ctrl-Oile grup seçimi. fzf yoksa ya daUI=numbers|arrowsise bugünkü menüler aynen çalışır. Diğer ekranlar değişmedi. components.lock:linux-hardening0.10.0 → 0.11.0 (sha2565ed26848…7f0e; 128 değişken, ekleme/silme yok). fail2banignoreipsadeleşti:127.0.0.1/8 ::1kodda her zaman muaf,hardening_fail2ban_ignoreipvarsayılanı artık boş ve yazılan adresleri EKLER (ezmez); kontrol makinesinin vehardening_ssh_allow_from'un adresi otomatik eklenmez, bağlı adres muaf değilse günlükte tek satırNOT (fail2ban)çıkar.hardening_fail2ban_bantimevarsayılanı1h→10m. Yükseltmede önceden otomatik eklenen adres jail dosyasından düşer: ilk koşuchangedve bir fail2ban yeniden başlatması gösterir. Doğrulama: kilit kuru koşusu (sha256 + imza ad alanı) ve 128 değişken denetimi geçti; fail2ban değişikliği gerçek VM'de (Ubuntu + Proxmox) henüz doğrulanmadı: ikinci apply'ınchanged=0olması ve etkin ban davranışı sınanmadı.components.lock:linux-hardening0.9.1 → 0.10.0 (sha2566921e52c…0c8b). Paket artıkSSHPOCKET_PROGRESSsatırlarını (14 alan, AIDE'debekle_tahmin=300) veauditsonrasıbulgular.tsvdosyasını (0600,summary.json'ın yanında) üretir; ikisi de Docker LAB'da gerçek koşuyla doğrulandı (preview, apply, audit: 22 bulgu = 20 öneri + 2 uyarı). Gerçek VM doğrulaması sürüyor.components.lock:linux-hardening0.9.0 → 0.9.1 (128 değişken, 11 eylem; 0.9.0 gerçek VM turunun bulgularını düzeltir:kaldirsahiplik testi, modprobe uyarı metni,hardening_ssh_allow_fromartıkrequireddeğil). Gerçek VM doğrulaması sürüyor.- Sunucu adı onayı (
type-server-name) yazım hatasında 3 deneme verir (her yanlışta1/3,2/3bildirimi); ad yine birebir yazılmalı, girdi bitince (EOF) hemen vazgeçilir. - Ansible
Incorrect sudo password/Missing sudo passwordile düşerse sudo parolasının reddedildiğini ve komutun yeniden çalıştırılabileceğini söyleyen bir not gösterilir.
linux-hardening 0.9.0 kilitlendi (alan anahtarları, kalıcı kaldırma eylemleri); runner: script sudo'lu yolda sonuç ayrıştırma (CRLF) ve validate script/Türkçe kurtarma adı düzeltmeleri.
components.lock:linux-hardening0.8.4 → 0.9.0 (128 değişken, 11 eylem; tüm değişkenler gruplu). Yeni: 13 alan anahtarı (hardening_<alan>_enabled, hepsi varsayılan açık), kalıcı kaldırma eylemlerikaldir_onizle(salt okunur,SİLİNECEK:satırları),kaldir(sunucu adıyla onay) vekaldir_geri_yukle. Ubuntu'da 118 değişken ve 9 eylem, Proxmox'ta 128 değişken ve 11 eylem görünür. Gerçek VM doğrulaması sürüyor.validate: kurtarma eylemi adı artık adın ya da_sonrası sözcüğün başındarollback|recover|restore|undo|geriiçeriyorsa tanınır (kaldir_geri_yuklegibi Türkçe adlar--strict'te yanlış uyarı vermez).
runner: scriptsudo'lu yolda sonuç satırı ayrıştırılamıyordu:ssh -tçıktıdaki satır sonlarını CRLF yapıyor, son anahtarın değeri7\rolarak okunup "Sonuç satırı geçersiz" deniyordu (eylem çalışıyor ama sonuç kaydedilmiyordu). Ayrıştırıcı artık\r'yi atar; gerçek makinede (ubuntutest) bulundu, regresyon testi eklendi.validatescript paketlerinde yanlış uyarı vermez: sonuç satırı (SSHPOCKET_RESULT …) ve değişken kullanımı artıkscripts/klasöründe de aranır; değişken betikteSSHPOCKET_VAR_<AD>olarak okunuyorsa "kullanılmıyor" uyarısı çıkmaz.
runner: script: paketler Ansible yerine hedef sunucuda çalışan betiklerle eylem tanımlayabilir (sudo'lu yolda root'a ait kopya + SHA-256 doğrulama).
runner: script: paketler Ansible yerinescripts/<ad>.shbetikleriyle eylem tanımlayabilir. Betik hedef sunucuda çalışır (kontrol makinesinde yabancı kod çalışmaz): sudo gerekmiyorsa ssh stdin'inden akar;requires_sudoise sunucuda 0600 geçici dosyaya yazılır,ssh -tile tek sudo oturumunda root'a ait 0700 klasöre kopyalanıp SHA-256'sı yerelde hesaplanan özetle doğrulanır (uyuşmazsa çalışmaz; yükleme ile sudo arasındaki değiştirme yarışı kapalı) ve çalıştırılır; sudo parolası aynı terminalde sudo isteminde girilir, dosyalar her çıkışta silinir. DeğişkenlerSSHPOCKET_VAR_<AD>olarak tek tırnakla kaçırılarak geçer; sonuçSSHPOCKET_RESULT <id>.<eylem> k=vsatırıyla gelir. Ortak kapılar (host key, ajan, profil, root reddi, önkoşul, onay) ansible ile aynıdır; Python ortamı gerekmez. Manifest doğrulayıcı vevalidatebetik yolunu/varlığını denetler. Standart §7 güncellendi.
Değişkenler ekranında arama/grup/"değiştirdiklerim" süzgeci; saat sapması uyarısı iki saati, farkı, saat dilimini ve hazır düzeltme komutunu gösterir; linux-hardening 0.8.4 gerçek VM doğrulaması belgelendi.
- Saat sapması uyarısı daha açıklayıcı (
--components run, 60 sn'den büyük fark): sunucu ve bu bilgisayarın saati (UTC), fark, sunucunun saat dilimi, NTP eşitleme durumu (NTPSynchronized=noise kalıcı olmayabileceği), TOTP/2FA etkisi ve kopyalanabilir hazır düzeltme komutu gösterilir. Fark tam saat dilimi farkına benziyorsa ipucu verilir. Uzak komut hâlâ sabit ve salt okunurdur (date +%s; timedatectl show -p Timezone -p NTPSynchronized); gelen satırlar katı desenle okunur. Saati sshpocket düzeltmez (saat sıçrar, karar kullanıcıda); uyarı engellemez.
- Değişkenler ekranı: arama, grup ve "değiştirdiklerim" süzgeci. Bir paketin 25'ten fazla değişkeni varsa liste başında
🔎 Ara,📂 Grup(pakettegroupvarsa) ve✏️ Yalnızca değiştirdiklerimsatırları çıkar; arama ad ve açıklamada büyük/küçük harf ayırmadan çalışır, süzgeç açıkken↩ Süzgeci temizlegörünür ve başlıktaGösterilen: X / Y · bu sunucuda değiştirilen: Nyazar. Dosyada değeri yazılı satırlar✏️ile işaretlenir; uzun değerler 40 karaktere kısaltılır (düzenleme ekranında tam değer görünür). Küçük paketlerde numaralandırma eskisi gibidir.
linux-hardening0.8.4 gerçek VM doğrulaması (Ubuntu 26.04 ve Proxmox VE 9) README vedocs/hardening-kullanim.md'ye işlendi: platform süzmesi, altı sunucu başına anahtar (falseyazmaz, önceden yazılanı silmez),pve_keep_banner(yeniden başlatma sonrası banner korunur), yeniden tasarlananpve_web_exclusive(8006/3128 listede olmayan aynı alt ağ istemcisinde kapanır), ek güvenlik duvarı portu.pve_web_exclusiveiçin eski "beklendiği gibi çalışmıyor" uyarısı kaldırıldı.
Eylemlerde platforms (Ubuntu sunucuda pve_firewall_* görünmez); linux-hardening 0.8.4 kilitlendi; değişken açıklama sınırı 2000; sürüm yayını için scripts/release-publish.sh.
components.lock:linux-hardening0.8.3 → 0.8.4 (116 değişken, 8 eylem). Paketplatform_var: hardening_platformile 9 Proxmox değişkenini (group: Proxmox) vepve_firewall_preview/applyeylemlerini yalnızcaproxmox-hostplatformunda gösterir (Ubuntu'da 107 değişken, 6 eylem görünür; gizli değişkenin yazılı değeri yine çalıştırmaya iletilir). 6 yeni koşulsuz-görev anahtarı (varsayılan açık) vehardening_pve_keep_banner.pve_web_exclusiveyeniden tasarlandı. sshpocket: değişken açıklama sınırı 1000 → 2000 karakter (pakettekipve_web_exclusiveaçıklaması 1182 karakter). Gerçek VM doğrulaması sürüyor.
- Eylemlerde
platforms(isteğe bağlı): manifestte bir eyleme"platforms": ["proxmox-host"]yazılırsa eylem yalnızca o platformda listelenir; diğer sunucularda menüden gizlenir ("N eylem … gizlendi" notu) ve CLI'dan çalıştırılması ssh'a gitmeden reddedilir. Ön koşul tutarlılığı manifest doğrulamasında denetlenir. Eski sürümler alanı yok sayar. Örnek: Ubuntu sunucudapve_firewall_*görünmez. scripts/release-publish.sh: sürüm yayınını tek komuta indirir. Ön kontroller (main, temiz, güncel, CHANGELOG başlığı, imza anahtarı, Release yok,mainCI'ı bu commit için yeşil) → etiket →release.sh→gh release create(notlar CHANGELOG'dan) → yüklenen dosyaların SHA-256 doğrulaması.--dry-runyalnızca planı gösterir. Elle yolRELEASING.md'de yedek olarak durur.
Sunucu menüsünde denetim puanı; değişkenler ekranı platforma göre süzülür ve gruplanır (isteğe bağlı); USB çıkarılırken anahtarlar ssh-agent'tan çıkarılır; eski paket sürümleri için temizleme sorusu ve Ayarlar menüsü; Ansible become bekleme süresi 30 sn; warn_if sorusu yalnızca değiştiren eylemlerde.
- Sunucu menüsünde denetim puanı: 🛡️ Paketler › paket ekranında araç başına son denetim puanı ve bir öncekiyle fark gösterilir (
📊 Lynis: 83 (2 gün önce) · önceki 61 (+22)). Yalnızca puan. Ortaksummary.jsonbiçimi (tool,date,score; eskihardening_indexdesteklenir)docs/package-standard.md'de tanımlandı; OpenSCAP gibi yeni bir araç eklemek sshpocket'te kod değişikliği istemez. - Değişkenler ekranı platforma göre süzülür ve gruplanır (isteğe bağlı manifest alanları): üst düzey
platform_var, değişkendeplatformsvegroup. Ubuntu sunucuda Proxmox'a özgü değişkenler gizlenir, kaç değişkenin gizlendiği yazılır; gruplar[Proxmox]etiketiyle yan yana gelir. Gizlenen değişkenin yazılı değeri verequiredkuralı etkilenmez; alanları olmayan paketler (bugünkü linux-hardening) eskisi gibi görünür. Paketin bu alanları kullanması ayrı bir iş (docs/package-standard.md§6).
- Eski paket sürümleri artık hatırlatılıyor: menüden güncelleme (ve paketlerin eşitlenmesi) bittikten sonra
prunelisteyi gösterir ve silinmesini sorar (varsayılan: silme); ayrıca Ayarlar › 4) Eski paket sürümlerini temizle menüsünden her zaman yapılabilir. Etkin, bir önceki ve kilitteki sürüm kalır. - Sunucu saati farkı uyarısına paket seçeneği ipucu eklendi:
linux-hardeningiçinhardening_time_makestep=true(apply saati düzeltir, varsayılan kapalı).docs/hardening-kullanim.mdilgili bölüm genişletildi. - USB'yi menüden çıkarırken USB'deki anahtarlar
ssh-agent'tan çıkarılır (EjectUSB, çıkarmadan önce): USB'dekiservers/*/*.pubdosyalarına karşılık gelen anahtarlarssh-add -dile silinir (parola sorulmaz); ajandaki başka anahtarlara dokunulmaz. Böylece çözülmüş anahtar bilgisayarın belleğinde kalmaz. USB menüden çıkarılmadan çekilirse çalışmaz. --components run: Ansible bağlantı/becomebekleme süresi 10 sn'den 30 sn'ye çıkarıldı (ANSIBLE_TIMEOUT, kullanıcının kendi değeri korunur). Gerçek Proxmox VM'inde zaman zaman görülen "Timeout (12s) waiting for privilege escalation prompt" için.- "Riskli değer" (
warn_if) sorusu yalnızca yapılandırmayı değiştiren eylemlerde sorulur (applyvb.).preview, durum eylemleri ve yalnızca araç kuran eylemler (audit) artık sormaz; eskidenpreviewveaudither çalıştırmada, ardındanapplyyine sorduğu için aynı soru 2-3 kez çıkıyordu. Zorunlu değişken kuralı (previewdahil) aynı kaldı.
linux-hardening 0.8.3, gerçek VM'lerde (Ubuntu 26.04 ve tek düğümlü Proxmox VE 9, boş sunucular): varsayılanlarla Lynis Ubuntu 61→83, Proxmox 62→83 (84hidepidile);kernel_modules_disabledUbuntu'da yeniden başlatma sonrasıufwaçık, Proxmox'ta reddedilir;fail2ban_pve_web,pveproxy_allow_from,postfix_banner,proc_hidepid,apt_listbugsçalıştı. Bilinen sorunlar:hardening_pve_web_exclusiveaynı alt ağdan 8006'yı kapatmıyor; Proxmox yeniden başlatmadapvebanner.service/etc/issuebandını eziyor; Proxmox'ta hidepid sonrası iki kez geçici "Timeout (12s) waiting for privilege escalation prompt". Denenmedi: misafir VM/CT'li Proxmox, Docker'lı VM, Raspberry Pi, HA kümesi.docs/hardening-kullanim.md: "Yeni seçenekler (0.8.x) ve gerçek VM notları" bölümü; README (TR/EN) kilit paragrafı güncellendi.
linux-hardening 0.8.3 kilitlendi (7 yeni menü değişkeni; gerçek VM doğrulaması bu sürümden sonra).
components.lock:linux-hardening0.8.2 → 0.8.3 (109 değişken, 8 eylem). Yeni (7):hardening_postfix_banner(varsayılan AÇIK, Proxmox'ta postfix banner'ı),hardening_proc_hidepid(warn_if) vehardening_proc_hidepid_users,hardening_apt_upgrade_phased(warn_if),hardening_apt_listbugs,hardening_pve_web_allow_fromvehardening_pve_web_exclusive(warn_if).hardening_pve_pveproxy_allow_from=[]blok tek başınaysa artık dosyayı siler. Gerçek VM doğrulaması bu satırdan sonra yapılır.
linux-hardening 0.8.2 kilitlendi (yalnızca Proxmox: kernel_modules_disabled reddi, yeni fail2ban_pve_web ve pve_pveproxy_allow_from; gerçek Proxmox VM doğrulaması bu sürümden sonra); paket öncesi sunucu saati farkı uyarısı.
components.lock:linux-hardening0.8.1 → 0.8.2 (102 değişken, 8 eylem; yalnızca Proxmox tarafı değişti).hardening_kernel_modules_disabledProxmox VE hostunda artık reddedilir (veth/KVM/bridge/softdog yüklenemediği için LXC ve HA bozuluyordu; gerçek VM'de görüldü). Yeni:hardening_fail2ban_pve_web(varsayılan KAPALI,warn_if: web arayüzü 8006 için fail2ban jail'i) vehardening_pve_pveproxy_allow_from(liste; 8006'yı yalnızca verilen CIDR'lere açar). Gerçek Proxmox VM doğrulaması bu satırdan sonra yapılır.
--components run: sunucu saati yerelden 60 sn'den fazla farklıysa (örn. snapshot geri alındıktan sonra) engellemeden uyarır; apt "Not live until" hatasına karşısudo chronyc makestepönerir. Salt okunur sabitdate +%ssorgusu; okunamazsa sessiz geçer.
linux-hardening 0.8.1 kilitlendi (kernel_modules_disabled için modül ön yükleme düzeltmesi paket tarafında yapıldı; gerçek VM doğrulaması bu sürümden sonra); validate kurtarma ve araç kuran eylemlerde ön koşul uyarısı vermez.
components.lock:linux-hardening0.8.0 → 0.8.1.hardening_kernel_modules_disabledartık/etc/modules-load.d/60-hardening-preload.confyazar (yüklü modüller + netfilter +binfmt_misc); 0.8.0'da yeniden başlatmadaufwaçılmıyor, güvenlik duvarı sessizce kapalı kalıyordu.verify_accessiçinssh-agent'ta çok anahtar ipucu;hardening_ssh_max_sessions(1-10) vehardening_auditd_backlog_limit(min 0) sınır taşır;rollback_disarmarmed değilkenchanged=0.validate: "salt okunur preview ön koşulu yok" uyarısı artık yalnızca yapılandırma değiştiren eylemler için; kurtarma eylemleri (rollback_*,recover*,restore*,undo*) ve yalnızcainstalls-packageetkisi olanlar (örn.audit) muaf.linux-hardeningartık--strictaltında temiz geçer.
linux-hardening 0.8.0 kilitlendi (pve_firewall_preview artık hiçbir şey yazmaz); passphrase istemi açıklaması; sunucu silme sonrası gereksiz uyarı giderildi.
- Passphrase Keychain'e kaydedilirken (yeni sunucu, Keychain menüsü, yanlış passphrase düzeltme) macOS'un "password data for new item:" istemi öncesinde açıklanır: bu, SSH anahtarının PASSPHRASE'idir (sudo parolası değil), yazarken görünmez ve doğrulama için bir kez daha sorulabilir.
components.lock:linux-hardening0.7.0 → 0.8.0 (100 değişken, 8 eylem).pve_firewall_previewdüzeltmesi: 0.7.0'da bu eylem, sunucu değişkenlerindehardening_pve_apply=trueiken Proxmox'tacluster.fw'yi GERÇEKTEN yazıyordu (gerçek Proxmox VM'inde görüldü); 0.8.0'da komutpve-firewall-onizleme.yml --checkolur ve yazma kapısı değişkenle açılamaz. Yeni menü değişkenleri (18): varsayılan AÇIKhardening_debsums(+_cron_check),hardening_apt_show_versions,hardening_process_accounting,hardening_fail2ban_jail_local,hardening_ufw_log_martians; varsayılan KAPALI (çoğuwarn_if)hardening_apt_upgrade,hardening_kernel_modules_disabled,hardening_auditd_conf_cis,hardening_auditd_disk_full_halt,hardening_auditd_backlog_limit,hardening_auditd_immutable,hardening_aide_audit_tools,hardening_ssh_max_sessions,hardening_ufw_outgoing_deny,hardening_restrict_compilers,hardening_apparmor_enforce,hardening_malware_scanner. Kapatınca GERİ ALINMAYANLAR: auditd.conf değerleri, GRUB satırı, derleyici izinleri, AppArmor kipi, ufw "ALLOW OUT" kuralları;-e 2vekernel_modules_disabledyeniden başlatmaya kadar sürer.
- Sunucu silme/ekleme sonrası menü yeniden yüklenirken, eski
sistem/Modulesklasörü olmayan kurulumlarda ekranaWarning: Autoload path does not existyazılıyordu; klasör yoksa artık sessiz (Main.shile aynı koruma).
- Docker LAB e2e: Proxmox benzeri LAB testi (
/etc/pve+pveversionişaretleri,hardening_pve_apply=true):pve_firewall_previewhiçbir şey yazmaz,pve-firewall restartçalışmaz, güvenlik ağı arm edilmez, eylem komutunda--checkvar ve-e/-i/--limityok. 0.7.0 kilidiyle elle denendi: kural dosyasını yazıyor (test bunu yakalar).drive.expriskli değer sorusunuE2E_RISKYile cevaplayabilir.
- ssh-agent'ında 3'ten fazla anahtar varsa, sertleştirme sonrası paketin "yeni SSH bağlantısı" doğrulaması
Too many authentication failuresile düşer (sertleştirmeMaxAuthTries 3yapar, doğrulayansshagent'taki tüm anahtarları dener). Güvenlik ağı sshd/ufw'yi geri alır ama paketler, sysctl, auditd, fail2ban ve AIDE kalır. Geçici çözüm:ssh-add -D(sshpocket gereken anahtarı yeniden ekler). Gerçek Ubuntu VM'inde 5 anahtarla görüldü.
Ubuntu 26.04'te parolalı sudo ile paket çalıştırma düzeltildi (sudo-rs); README gerçek VM doğrulamalarını yansıtıyor.
linux-hardening 0.7.0, sshpocket 3.6.8 ile USB'den taze Ubuntu 26.04.1 VM'inde:audit(Lynis 58) →preview(changed=34) →apply(ok=168 changed=43 failed=0; güvenlik ağı, ufw, ssh, yeni bağlantı doğrulaması,/tmpnoexec) → bağımsız kontrol → ikincipreviewchanged=0(idempotent) →audit(Lynis 76, öneri 46 → 23). Parolalı sudo-rs sorunu yeniden üretildi ve düzeltildi (aşağıda). Proxmox VE 9.2.21 VM'inde (0.6.0,proxmox-host):applyok=133 failed=0, Lynis 82, web arayüzü ve CT oluşturma çalışıyor. Denenmedi: gerçek Proxmox'tapve_firewall_preview/pve_firewall_apply, Ubuntu'darollback_now/rollback_disarm(yalnızca LAB), kümeli Proxmox ve gerçek donanım.
- Ubuntu 26.04: parolalı sudo ile paket çalıştırma artık takılmıyor. Varsayılan
sudo-rs, Ansible'ın parolalıbecome'ındaTimeout (12s) waiting for privilege escalation promptile düşüyordu (gerçek VM'de yeniden üretildi:UNREACHABLE). Ubuntu profillerinde sunucuda/usr/bin/sudo.ws(klasik sudo) çalıştırılabilirse, envantereansible_become_exe=/usr/bin/sudo.wsyazılır (salt okunur, sabit bir ssh sorgusuyla tespit edilir; envantere yalnızca tam bu yol yazılabilir). NOPASSWD sudo etkilenmez, Ubuntu dışı profillerde sorgu yapılmaz. Sudo istemi zaman aşımında nedeni açıklayan bir ipucu da gösterilir.
Paket sürümü güncellemesi: linux-hardening 0.7.0 kilitlendi; Proxmox VE güvenlik duvarı için pve_firewall_preview ve pve_firewall_apply eylemleri.
components.lock:linux-hardening0.6.0 → 0.7.0 (82 değişken; yeni:hardening_auditd_cis_l2(varsayılan KAPALI,warn_if),hardening_motd_disable_scripts). Yeni eylemler:pve_firewall_preview(salt okunur) vepve_firewall_apply(type-server-name, önce önizleme şart): Proxmox VE (tek düğüm) datacenter güvenlik duvarını yönetir; Proxmox olmayan hostta hiçbir şey yapmadan nedenini söyleyip durur (LAB e2e ile doğrulandı).pve_firewall_applyyazma onayını playbook içinden (pve-firewall-uygula.yml) taşır; sshpocket'insetözelliğine gerek duymadı. 82 değişkenin tamamı için tür, 31warn_ifve 30 min/max sınırı doğrulandı. Gerçek Proxmox VM'indepve_firewall_*henüz denenmedi.
Paket sözleşmesine eylem düzeyi set (sabit değişkenler) eklendi: aynı playbook'un önizleme ve gerçek koşu eylemleri kullanıcı ayarından bağımsız olur (Proxmox güvenlik duvarı eylemleri için ön koşul).
- Paket sözleşmesi: eylem düzeyi
set(docs/package-standard.md §5): bir eylem, bildirimde tanımlı bool/int/enum/string/path değişkenleri kullanıcı değerinin üstüne sabitleyebilir. Böylece aynı playbook'un önizleme ve gerçek koşu eylemleri (örn. Proxmox güvenlik duvarı içinpve_firewall_preview→hardening_pve_apply=false,pve_firewall_apply→true) kullanıcının.varsayarından bağımsız olur. Bildirim doğrulaması bilinmeyen/yanlış türlü/aralık dışı/liste değeri veoutputs.dir_varçakışmasını reddeder.
Yeni, henüz değişkenleri tanımlanmamış bir sunucuda salt okunur durum eylemleri (rollback_status) artık hem komut satırında hem Paketler menüsünde çalışır.
- Paket çalıştırma: zorunlu değişken (örn.
hardening_ssh_allow_from) denetimi artık yalnızca değiştiren eylemlerde ve başka bir eylemin ön koşulu olan eylemlerde (preview) yapılır. Salt okunur durum eylemleri (rollback_status) yeni, henüz değişkenleri tanımlanmamış bir sunucuda da çalışır. Verilmiş geçersiz değer ve pakette tanımsız ad yine reddedilir; yalnızca "eksik" hoşgörülür. Sunucu menüsündeki 🛡️ Paketler ekranı da aynı kuralı izler: zorunlu değişken eksikken salt okunur durum eylemleri açık,preview/apply/audit⛔ kapalı.
Paket sürümü güncellemesi: linux-hardening 0.6.0 kilitlendi (Raspberry Pi / Proxmox VE platform desteği); validate ve paket bildirimi düzeltmeleri.
components.lock:linux-hardening0.4.0 → 0.6.0 (80 değişken: 43 bool, 15 int, 10 string, 8 list[string], list[cidr], list[int], 2 path; Raspberry Pi/Proxmox VE platform desteği:hardening_platform). Docker LAB'da 16 e2e testin tamamı geçti; ikinci koşuchanged=0; eskiubuntugrubu veINJECT_FACTSuyarıları kayboldu. 80 değişkenin tamamı için tür, 30warn_ifve 30 min/max sınırı doğrulandı. Gerçek VM'de 0.6.0 sshpocket üzerinden denenmedi (0.4.0 denendi).- Profil ve Proxmox: paket 0.6.0
debian-13'ü destekler; Proxmox VE 9 ve Raspberry Pi OS dedebian-13göründüğünden sshpocket'in profil kapısı artık Proxmox hostunu geçirir. Koruma paketin preflight'ındadır: Proxmox hostugenericplatformla hiçbir bayrakla (hardening_allow_unsupporteddahil) sertleştirilmez,--check'te de durur; gerçek değişiklik içinhardening_platform=proxmox-hostvehardening_pve_apply=truegerekir.docs/hardening-kullanim.md'ye "Platformlar" bölümü eklendi.
components validate(dizin modu): gitignore'lu geliştirme klasörleri (.venv,venv,.tox,.pytest_cache,.mypy_cache,.ruff_cache) atlanır ve bildirilir; yazarın çalışma klasöründeki.venvyüzünden çıkan sahte ❌ (sembolik bağ, özel anahtar bloğu) giderildi. Arşiv modu atlamaz: yayın arşivinde bu klasörler varsa yine ❌.- Paket bildirimi: değişken
descriptionsınırı 500 → 1000 karakter (linux-hardening 0.6.0'dakihardening_platformaçıklaması 565 karakter olduğundan kilide yazılamıyordu). Kontrol karakterleri ve diğer metin alanlarının 500 sınırı aynı.
--components prune eklendi; linux-hardening 0.4.0 gerçek VM'de, profil kapısı gerçek Proxmox VE hostunda denendi.
- Profil kapısı gerçek bir Proxmox VE 9 hostunda (Debian 13) denendi:
--components run linux-hardening rollback_status <proxmox>→Profil 'debian-13' bu paketin profilleri arasında yok., Ansible başlamadı, sunucuya hiçbir şey yazılmadı. Ubuntu 26.04 için yazılmış sertleştirme Debian/Proxmox'a uygulanmaz. Not: Proxmox'a özgü bir platform denetimi yok (/etc/pve); engel "Debian desteklenmiyor" mantığına dayanır, Debian profili eklenmeden önce platform denetimi eklenmelidir.
./start.sh --components prune [--dry-run] [--yes]: paket güncellemelerinde yan yana biriken eski sürüm klasörlerini temizler. Kalanlar: etkin sürüm (current), bir önceki sürüm (geri dönüş için) ve kilitteki sürüm. Yalnızca<X.Y.Z>klasörü ve<X.Y.Z>.filessilinir;.bozuk-*(kenara alınmış bozuk kurulum), sembolik bağlar ve geçersiz adlı klasörlere dokunulmaz. Silmeden önce onay ister (--yesile atlanır);--dry-runyalnızca listeler.current'ı olmayan pakete dokunmaz.
linux-hardening 0.4.0, sshpocket 3.6.3 ile USB'den gerçek bir Ubuntu 26.04.1 VM'inde taze kurulumda denendi:audit(Lynis hardening_index 62, 0 uyarı) →preview→apply(ok=131 changed=38 failed=0). Hardening sonrası yeni SSH bağlantısı doğrulaması geçti, güvenlik ağı disarm edildi; ufw, sshd, sysctl (kernel.sysrq=0,fs.protected_fifos=2),/etc/sudoers.d 0750,libpam-tmpdir,apt-listchanges, AIDE zamanlayıcısı ve postfix yokluğu bağımsız kontrol edildi.warn_ifonayı çıkmadı (linux-hardening#74 düzeltmesi gerçek akışta çalışıyor). Denenmedi: gerçek VM'de 0.3.0 üzerine ikinci koşu,rollback_now/rollback_disarm, menü ve Terminal açma.
Paket sürümü güncellemesi: linux-hardening 0.4.0 kilitlendi.
components.lock:linux-hardening0.3.0 → 0.4.0 (Lynis ölçümünden küçük maddeler, salt okunur raporlar: root ortamı,/tmpve/dev/shm, AIDE zamanlayıcı;sukısıtı ve Dockerdaemon.jsonseçenekleri varsayılan KAPALI; değişken sayısı 27 → 38;warn_ifapport/motd'dan kaldırıldı, linux-hardening#74 kapandı). Davranışı değiştiren yeni varsayılan-AÇIK ayarlar paketin CHANGELOG'unda (kernel.sysrq=0,libpam-tmpdir,/etc/sudoers.d 0750vb.). Docker LAB'da 16 e2e testin tamamı geçti. Gerçek VM'de 0.4.0 sshpocket üzerinden denenmedi (0.3.0 denendi).- Docker LAB varsayılan değişkenlerinden
hardening_disable_apport=falsevehardening_disable_update_notifier_motd=falsekaldırıldı (artık gerekmiyor).
- README (TR/EN): "İlk indirmeyi doğrulama":
--updateyalnızca sonraki sürümleri doğrular; ilk indirilen arşivissh-keygen -Y verifyile elle doğrulama tarifi ve anahtarın parmak izi. Bir test README'deki anahtar/parmak izininsistem/release_signersile aynı kaldığını denetler. - Test: paket kurulumunda güvenilen anahtarla ama yanlış ad alanıyla (
sshpocket-release) imzalı paket reddedilir; kilittesignerssatırı boş/bozuksa hiçbir şey kurulmaz.
linux-hardening 0.3.0, sshpocket 3.6.2 ile USB'den gerçek bir Ubuntu 26.04.1 VM'inde denendi:rollback_status→preview→apply(ok=117 changed=35 failed=0); hardening sonrası yeni SSH bağlantısı doğrulaması geçti, güvenlik ağı disarm edildi; ufw/sshd/postfix durumu bağımsız kontrol edildi. Denenmedi:audit,rollback_now,rollback_disarm(yalnızca LAB), menü ve Terminal açma.
Paket sürümü güncellemesi: linux-hardening 0.3.0 kilitlendi; paket çalıştırma ve validate yanlış alarmları düzeltildi.
components.lock:linux-hardening0.2.0 → 0.3.0 (CIS Ubuntu 26.04 Level 1 eşlemesi; yeni rollerfiles/sudo/docker; değişken sayısı 5 → 27). Ek: davranışı değiştiren yeni varsayılan-AÇIK ayarlar paketin CHANGELOG'unda ve README "Dikkat" tablosunda. Docker LAB'da 16 e2e testin tamamı 0.3.0 ile geçti. Gerçek VM'de sshpocket üzerinden denenmedi.- Docker LAB varsayılan değişkenleri
hardening_disable_apport=falsevehardening_disable_update_notifier_motd=falseyazar (0.3.0'da varsayılanlarıwarn_ifile aynı olduğundan her çalıştırmada onay istemi çıkıyor; syhgorath/linux-hardening#74).
- Paket çalıştırma:
warn_if("riskli değer") onayı artık salt okunur durum eylemlerinde (örn.rollback_status) sorulmaz; yalnızca değiştiren eylemlerde ve ön koşul olan eylemlerde (preview) sorulur. Önceden her eylemde sorulduğu için varsayılanı zaten uyarı değerinde olan bir değişken (linux-hardening 0.3.0'dahardening_disable_apport) en zararsız eylemi bile onaya bağlıyordu. components validate: adındapassword/tokengeçen bool ve int değişkenler (örn.hardening_password_inactive_days, gün sayısı) artık "gizli değer izlenimi" uyarısı vermez; yanlış alarmdı (bool/int parola taşıyamaz). Metin alabilen türler (string, list) için uyarı aynen sürer.
- Docker LAB e2e:
audit(lynis kurulumu, rapor/özet 0600-0700 izinleri,summary.jsoniçeriği),rollback_now(armed değilken etkisiz; armed iken sonraki ufw/sshd değişiklikleri geri alınır) verollback_disarm(armed ve yedek silinir) sshpocket üzerinden uçtan uca denendi. Üretim kodu değişmedi.
Sunucuya ulaşılamayınca nedenini söyleyen ipuçları, paket yazarları için sözleşme uyum denetimi (validate) ve güvenilirlik düzeltmeleri.
./start.sh --components validate <kurulu-paket | dizin | arşiv.tar.gz> [--strict] [--unsigned]: paket SÖZLEŞME uyum denetimi (docs/package-standard.md§12'nin mekanik kısmı). Statik: ansible/ssh/ağ çalıştırmaz, paketten hiçbir şey çalıştırmaz; arşiv yalnızca güvenliyse açılır (.., mutlak yol, bağ, aygıt dosyası, aşırı boyut reddedilir; geçici klasör silinir). ❌: geçersizcomponent.json,supportedprofil yok,VERSIONuyuşmazlığı,requirements.txtyok/hash'siz/sabit sürümsüz/URL, olmayan playbook, sembolik bağ, özel anahtar/gizli dosya.⚠️ : değiştiren eylemdepreviewön koşulu/warnings/requires_sudoyok,SSHPOCKET_RESULTçıktısı bulunamadı, parola gibi değişken adı, kullanılmayan değişken, geri alma belgesi yok.--strictuyarıları hata sayar;--unsignedimzalamadan önceki denetimde.siguyarısını atlar. Paket reposunun CI'ıcomponent_validate.py+component_manifest.pyile bağımsız çalıştırabilir. Gerçeklinux-hardening 0.2.0: 0 hata, 3 uyarı (kurtarma eylemleri veauditbilerek ön koşulsuz). Yeni paket yazarları için şablon: sshpocket-paket-sablonu.
- Sunucuya ulaşılamayınca nedenini ve yapılacağı söyler: işletim sistemi algılaması başarısız olduğunda ssh'ın hatası sınıflandırılır (
↳ipucu satırı): zaman aşımı (VPN/ufw), rota yok, bağlantı reddi, host key değişmiş, host key tanınmıyor, anahtar reddi, çok fazla kimlik doğrulama denemesi, ad çözülemedi, kesilen bağlantı (fail2ban). Hata metni temizlenir ve kesilir, kabuğa verilmez. Tablo:docs/hardening-kullanim.md.
- Erişim ağı editörü üst üste binen ağları ayıklar: listede
10.0.0.0/16varken10.0.1.0/24eklenirse "Zaten kapsanıyor" denir ve eklenmez; daha geniş bir ağ eklenirse kapsadığı dar girdiler yerine geçer ve bu açıkça söylenir. - Terminal kapanınca (SIGHUP) geçici inventory/değişken dosyaları silinmiyordu: yürütücü yalnızca Ctrl-C (INT) ve TERM'i yakalıyordu; HUP da yakalanır.
- Docker LAB'ı (
test/e2e/lab/) ve uçtan uca paket testleri: systemd'li Ubuntu 26.04 konteyneri;./test/e2e/lab/up.sh && bats test/e2e/components.bats.linux-hardeningakışını (rollback_status→ tazepreviewolmadanapplyreddi →preview(sunucu değişmez) → geri alma güvenlik ağı (A: doğrulama başarısız → önceki duruma döner; B: denetleyici kaybolur → sunucu zamanlayıcıyla kendini geri alır) →apply→ erişim ağı tuzağı → erişilemeyen sunucu, tanınmayan ve değişmiş host key) gerçek ssh + ansible + ufw ile dener. Kullanıcınınknown_hostsve sshpocket durumuna dokunmaz.colima-trust-ca.sh: antivirüs HTTPS'i yeniden imzalıyorsa CA'yı yalnızca Colima VM'ine ekler. Varsayılanbats testve CI bunları çalıştırmaz.
Paketler artık gerçekten kullanılabilir: ilk paket (linux-hardening) kilitli, imzalı ve gerçek bir Ubuntu 26.04 sunucusunda
rollback_status → preview → apply ile denendi. Kullanım ve erişim ağı tuzağı: docs/hardening-kullanim.md.
- İlk gerçek paket kilitlendi:
components.lockartıklinux-hardening 0.2.0(imzalı, paket standardı v1 uyumlu; sha2562886b610…f38a) girdisini taşır. ./start.sh --components run <paket> <eylem> <sunucu>: kurulu paketin bir eylemini sunucuda çalıştırır. Sunucu bilgisiservers/<ad>/server.env'den, paket değişkenleriservers/<ad>/<paket>.vars'tan okunur. İşletim sistemi profili sabit, salt okunur birssh ... cat /etc/os-releaseile algılanır (host key doğrulaması kapatılmaz, parola sorulmaz; çıktı hiçbir zaman çalıştırılmaz). Python ortamı yoksa onayla kurulur (PyPI'dan ~10 MB, hash'li wheel;~/.cache/sshpocket). Sonuçservers/<ad>/components.logdosyasına (tarih|paket|sürüm|eylem|ok/fail, gizli bilgi yok) işlenir.- Çalıştırma öncesi kapılar: değiştirici eylem root ile reddedilir; host key tanınmalı; anahtar ssh-agent'ta olmalı (gerekirse eklenir); işletim sistemi
profili
supportedolmalı;requireseylemleri (örn.applyiçinpreview) aynı sunucuda, aynı sürümde, son 30 dakikada başarıyla çalışmış olmalı;confirm(evet/hayır ya da sunucu adını yazma) vewarn_ifonayları. Girdi yoksa onay reddedilir. Paket bu kuralları gevşetemez. - Güvenli yürütme:
ansible-playbookpaketin venv'inden, paket kökünde,ANSIBLE_HOST_KEY_CHECKING=Truezorlanarak çalışır; kabuk dizgesi/evalyoktur; geçici inventory/değişken dosyaları (izin 600) Ctrl-C/TERM dahil her çıkışta silinir;outputs.dir_varher zaman kullanıcı klasörüne yönlendirilir (hassas çıktı USB'ye yazılmaz); çıktı kullanıcı klasörüne (izin 600) günlüklenir. EyleminSSHPOCKET_RESULTsatırı önek, anahtar ve değer denetimiyle ayrıştırılır.-i/--limit/-eçalıştırıcıya aittir (pakettecmdiçinde geçerse paket reddedilir). - Sunucu menüsünde
🛡️ Paketler: kurulu paket varsa paket → eylem seç (🔍 salt okunur / ✏️ değişiklik yapar / ☠️ yıkıcı; ön koşul durumu etikette). Ekranın başında Hazırlık bloğu: zorunlu değişken eksikse ❌ ve eylemler ⛔ kapalıdır. 📝 Değişkenlerekranı: değer/varsayılan/otomatik gösterimi, kaydetmeden önce doğrulama (çalıştırmadakiyle aynı doğrulayıcı),warn_ifonayı,-ile silme.list[cidr]değişkenler (örn.hardening_ssh_allow_from) için ağ editörü: bu bilgisayarın adresinden öneri (ağ / tahmini /24 / yalnızca bu adres), isteğe bağlı sunucudan sorgu (sabit, salt okunur ssh), elle ekleme/silme/temizleme; listede tek ağ varsa "başka bir ağdan bağlanırsanız SSH kapalı olur" uyarısı. Hiçbir şey otomatik yazılmaz.📜 Geçmiş ve son sonuçlar: bu sunucudaki son çalıştırmalar, ön koşulların tazeliği (apply için preview: ✅ taze / ⏳ süresi doldu / ❌ kayıt yok) ve son çalıştırma günlüğünün son satırları. Durum eylemlerinin (örn.rollback_status) son sonucu saklanır ve Hazırlık bloğunda gösterilir.- Bildirim doğrulayıcısı
outputsalanını okur: pakettekiprefix, sshpocket'in türettiğiyle (SSHPOCKET_RESULT <paket>.<eylem>) uyuşmazsa paket reddedilir; uyarı metinleri menüde gösterilir. Karar kayıtları:docs/package-standard.md§14.
- Sudo parolası istemi açıklanıyor: eylem
--ask-become-passile çalışacaksa, Ansible'ınBECOME password:istemi öncesinde bunun sunucudaki sudo parolası olduğu, sudo parola istemiyorsa (NOPASSWD) yalnızca Enter'a basılacağı ve parolanın sshpocket'e/günlüğe yazılmadığı belirtilir. - Belgeler:
docs/hardening-kullanim.md(akış, erişim ağı tuzağı, geri alma); README'de Apple Silicon (M5 Pro, macOS 27) test satırı, güncel Python ve paketler maddeleri (TR/EN).
components/(kurulu paketler).gitignore'a eklendi:--components syncile açılan paket klasörü yanlışlıkla commit'lenebiliyordu.
- Keychain'deki passphrase yanlışken bağlantı ekranı sonsuza kadar takılıyordu:
ssh-add, askpass boş cevap verene kadar yeniden dener; askpass her seferinde aynı yanlış passphrase'i döndürdüğü için "SSH key agent'a ekleniyor" satırında %100 CPU ile sonsuz döngü oluşuyordu.askpass.shartık yalnızca ilk çağrıda passphrase döndürür (ASKPASS_STATE), sonrakilerde boş satır verir;ssh-addbirkaç saniyede vazgeçer.
- Yanlış kayıtlı passphrase'te yeniden sorma: key agent'a eklenemezse (agent'a ulaşılabiliyorsa) "Kayıtlı passphrase yanlış olabilir. Yeniden girip
Keychain'e kaydedeyim mi? [e/H]" diye sorulur;
eise passphrase güvenli istemle (komut satırında görünmez) Keychain'e yazılır ve en çok 3 kez denenir. Girdi yoksa takılmaz.
3.5.1 - 2026-10-12
- Belgeler güncellendi: README'ye Gereksinimler bölümü (hangi araçlar macOS ile gelir; fzf ve Python isteğe bağlı); eskimiş
.envanlatımı (servers/<ad>/server.env,sshpocket.conf); tekrarlanan menü/fzf maddeleri birleştirildi; knock istemci tarafı veUIdeğerleri anlatıldı;docs/ui-design.mduygulama durumuyla güncellendi.
- Ok tuşlu menüde listenin satırları her tuşta çoğalıyordu (3.5.0): menü açıklamaları eklenince, terminal genişliğinden uzun açıklama bir alt satıra sarılıyor, imleci geri taşıma sayısı kayıyor ve her ↑/↓'de üst satır kopyalanıyordu. Çizim sırasında otomatik sarma kapatılır (uzun satırlar sağ kenarda kırpılır), çıkışta ve Ctrl-C'de yeniden açılır. 60/80/100 sütunlu gerçek pty testi eklendi.
- fzf, Finder'dan açılınca (start.command) bulunamıyordu: PATH'te yoksa
/opt/homebrew/binve/usr/local/binda aranır.
3.5.0 - 2026-10-12
check-newön sürümleri (pre-release) göremiyordu: depoda kararlı "latest" yoksa (linux-hardening şu an yalnızca ön sürümlü) GitHub API'deki en yeni yayına bakılır (yine yalnızca bilgi; kurulmaz).--doctoryeni Mac'te "geliştirici araçlarını kurun" penceresini açabiliyordu: macOS'ta Command Line Tools yoksa/usr/bin/python3gerçek Python değil bir saplamadır ve çalıştırılınca kurulum penceresi açar. Saplama artık çalıştırılmadan atlanır ve doktor nedenini söyler.- Menüden "Geri" ile dönünce gereksiz "Devam etmek için Enter" soruluyordu: sunucu menüsü, ⚙️ Ayarlar ve Sunucuları yönet'ten geri dönünce artık doğrudan ana menüye dönülür. Okunacak çıktısı olan işlemlerden (bağlanma sonucu, ekleme, silme, güncelleme) sonra duraklama korunur.
- Bakımcı aracı
scripts/lock-component.sh: bir paket sürümünücomponents.lock'a güvenle yazar: paketi ve imzayı HTTPS ile indirir, arşivi denetler, imzayı (sshpocket-component) doğrular,component.json'u şemaya göre doğrular (kurulamayacak paket kilide yazılmaz), sha256'yı hesaplar.--writeyoksa yalnızca gösterir.comp_getpipefail altında 141 ile düşmesin diye tüm girdiyi okur. - CI'da sabit sürüm ShellCheck:
scripts/ci-install-shellcheck.sh(v0.11.0, indirilen arşivin sha256'sı doğrulanmazsa kurulmaz); yerel ve CI aynı sürümü kullanır, "yerelde yeşil, CI'da kırmızı" farkı kapanır. - fzf desteği (isteğe bağlı): sistemde
fzfkuruluysa (brew install fzf) tüm seçim menüleri fzf ile açılır: yazarak arama, önizleme penceresinde seçili seçeneğin açıklaması,←/Esc geri. fzf yoksa ya da terminal değilse (boru/test) kendi ok tuşlu seçicimiz, o da yoksa numaralı menü kullanılır. Açıklama metni fzf komut satırına girmez (dosyadan okunur). ⚙️ Ayarlar → menü stili:auto|fzf|arrows|numbers. - Menü açıklamaları: ana menü, sunucu menüsü, Ayarlar, Sunucuları yönet ve Keychain menülerinde her seçeneğin kısa açıklaması; fzf yoksa ok tuşlu
seçicinin alt satırında gösterilir.
./start.sh --doctorfzf'i isteğe bağlı olarak denetler (kurmaz).
- Sunucu silinince Keychain'deki knock dizisi yetim kalıyordu: artık sunucuyla birlikte silinir; yeniden adlandırmada eski adla duran knock dizisi için "Knock ayarları ile yeniden girin" uyarısı gösterilir.
- Knock ayarları açıklamasız ve bağışlamazdı: tek yanlış girişte "Geçersiz protokol" deyip menüden çıkıyordu. Artık knocking'in ne olduğu, her alanın (protokol, bekleme, dizi) ne anlama geldiği ve örnek değerler gösterilir; yanlış girişte neden geçersiz olduğu söylenip yeniden sorulur (3 deneme), büyük/küçük harf fark etmez, Enter = varsayılan. macOS'un diziyi iki kez isteyebileceği belirtilir.
3.4.0 - 2026-10-12
- Klasik port knocking (istemci tarafı): sunucu menüsüne 5) Knock ayarları.
server.env'eKNOCK=keychain,KNOCK_PROTO(tcp|udp),KNOCK_DELAY_MS; knock dizisi düz metin dosyada tutulmaz, Keychain'de (USBMonitor_<ÖNEK>_Knock). Bağlan ve key gönderme, bağlantıdan önce diziyi otomatik gönderir (bash/dev/tcp|udp: portlar hiçbir sürecin komut satırında görünmez; takılmaz, en çok ~1 sn/vuruş). Durum göstergesi knock göndermez; knock'lı sunucuda port kapalıysa 🔒 gösterir. Keychain/ayar bozuksa bağlantı denenmez. Sunucu tarafı (knockd) ayrı bir pakettir; bu sürümde yoktur. Klasik knocking şifreli değildir (taramalardan saklanma katmanıdır).
3.3.0 - 2026-10-12
Paket altyapısı geldi.
components.lockşimdilik boştur; ilk paket (linux-hardening) hazır olunca eklenecek. Altyapı, paket kurulumunu imzalı, kilitli ve doğrulanabilir yapar (bkz. docs/package-standard.md). Mevcut sunucu/bağlantı davranışı değişmedi.
- Paket kilit dosyası ve imza doğrulama (Aşama 2.0):
components.lock(şimdilik boş) vesistem/Helpers/Components.sh: katı ayrıştırıcı (bilinmeyen/yinelenen anahtar, bozuk değer = hata; dosyasourceedilmez), arşiv sha256'sı kilitle aynı olmalı, imzasshpocket-componentad alanıyla doğrulanır (çekirdeksshpocket-releaseimzası yeniden oynatılamaz). Kilitte olmayan paket reddedilir. - Paketin güvenli kurulumu (Aşama 2.1):
sistem/Helpers/ComponentsInstall.sh: HTTPS indirme (boyut sınırlı), arşiv denetimi (.., mutlak yol, farklı kök, symlink/hardlink/aygıt reddi),component.jsonkimlik+sürüm eşleşmesi,components/<id>/<sürüm>/+current(düz metin), eski sürüm kalır, geri sürüme düşülmez, kurulum özetleri her çalıştırmadan önce yeniden doğrulanabilir. - Bildirim okuma ve sözleşme doğrulama (Aşama 2.2):
component.json(python3 -I+ stdlibjson) tam şema denetimi:sshpocket_api,runner, profiller, eylemler (cmd'de kabuk meta karakteri yok,effects,requiresdöngüsüz), değişkenler,invoke.append; bilinmeyen zorunlu özellik ve daha yenisshpocket_apireddedilir. Etkinconfirm: paket yalnızca sıkılaştırabilir (destructive→ sunucu adı yazdırma).comp_preparekurulu paketi bütünlükle doğrular ve bilgiyi verir. ./start.sh --doctorve venv önbelleği (Aşama 2.3):--doctorön koşulları denetler (ssh araçları,nc, Keychain, Python aralığı,venv/ensurepip, disk, ağ); yalnızca okur ve çözüm komutunu gösterir, Homebrew/pip/sudo çalıştırmaz. Paket bağımlılıkları içinComponentsVenv.sh: aralığa uyan Python seçimi, yalnızca hash'lirequirements.txt(-r/-e/--index-urlreddedilir),~/.cache/sshpocket/venv/<paket>-<ortam-kimliği>önbelleği,pip --require-hashes --only-binary :all:yalnızca venv içine; aynı ortam kimliğinde sağlıklı venv varsa hiçbir şey kurulmaz.- Paket yönetimi komutları (Aşama 2.4a):
./start.sh --components list(kilit ↔ kurulu durumu, ağsız),sync [--yes](eksik/eski paketi kilitteki sürümle, imza doğrulayarak, onayla kurar; bozulmuş kurulumu silmeden<sürüm>.bozuk-<tarih>olarak kenara alıp yeniden kurar),check-new(kilitten daha yeni yayın var mı: yalnızca bilgi, kurulmaz; yeni sürüm yeni sshpocket sürümüyle gelir).--updatebaşarılıysa yeni kodla paketler kilide göre eşitlenir; menüde kilitte paket varsa 📦 Paketler girdisi görünür.
- Ok tuşlu seçim artık ⚙️ Ayarlar, Sunucuları yönet ve Keychain passphrase menülerinde de çalışır (başlıkla birlikte);
UI=numbersile hepsi numaralıya döner.
3.2.0 - 2026-10-11
- Ekran cilası (1/2): her ekranda başlık + ekmek kırıntısı (
Ana menü › ubuntutest) ve alttaki tuş ipucu satırı; sunucu satırlarındakullanıcı@ip[:port]özeti. Renk yalnızca terminalde veNO_COLORtanımsızsa; boru/test çıktısı düz metindir. - Ok tuşlu seçim (ekran cilası 2/2): ana menü ve sunucu menüsünde ↑↓ (veya
j/k) ile gez, Enter ile aç,←/q/0/Esc ile geri. Numara yazıp Enter de çalışır (iki haneli dahil, Backspace ile düzeltilir). Saf bash; terminal değilse (boru, betik, test) eski numaralı menü kullanılır. ⚙️ Ayarlar'aUIeklendi (auto|numbers|arrows): ok tuşları sorun çıkarırsanumbersyapın (ya daSSHPOCKET_UI=numbers). İmleç her çıkışta (Ctrl-C dahil) geri açılır.
3.1.1 - 2026-10-11
- Ana menüye dönerken takılma: macOS
nc -wbağlantı beklemesini sınırlamadığından kapalı/erişilemeyen sunucuda durum kontrolü ~75 sn sürebiliyordu (durum göstergesi 3.1.0'da varsayılan açık olunca belirgin oldu). Kontrol artık süre dolunca öldürülür (⚙️ Ayarlar'daki süre, 1-5 sn); bağlanmadan önceki port kontrolü en çok 5 sn bekler.
3.1.0 - 2026-10-11
- ⚙️ Ayarlar (ana menü):
sshpocket.conf(kökte, gitignore'lu; güncellemede korunur). Şimdilik iki ayar: durum göstergesi (STATUS) ve durum kontrol süresi (STATUS_TIMEOUT, 1-5 sn). Öncelik: ortam değişkeni (SSHPOCKET_STATUSvb.) > dosya > varsayılan. Dosyasourceedilmez; yalnızca bilinen anahtarlar okunur, değerler doğrulanır.
- Durum göstergesi (🟢/🔴/⚪) artık varsayılan AÇIK (Finder'dan
start.commandile açınca da görünür). Kapatmak için ⚙️ Ayarlar veyaSSHPOCKET_STATUS=0. q= geri/çıkış: ana menüdeqçıkış yapar (0 ile aynı); alt menülerde0) Geri (q)ipucu gösterilir.
3.0.0 - 2026-10-11
Veri düzeni değişti (büyük sürüm). Sunucular artık
servers/<ad>/server.envaltında; eskisistem/Modules/<ad>/sunucularınız otomatik taşınır (./start.sh --migrate, önce--dry-run). Eski sürümler yeni düzeni okuyamaz; geri dönmek istersenizservers/.migrated-<tarih>/altındaki eski klasörlerisistem/Modules/altına geri koyun. Keychain'deki passphrase'ler aynen geçerlidir.
- Aşama 1.0/1.1 (
servers/veri katmanı, geriye uyumlu): menü artıkservers/<ad>/server.env(genel anahtarlarIP,USER,PORT,KEY,OS) klasörlerinden de kurulur; sunucu başına üretilmiş bash dosyası gerekmez. Eskisistem/Modules/<ad>/.envbiçimi aynen çalışmaya devam eder (taşıma sonraki adımdır). Tek erişim katmanısrv_get/srv_setbiçimi korur. Aynı adlı eski modül varsa yeni biçim kazanır. servers/içindeki hiçbir dosyasourceedilmez (güvenlik testleri); gizli klasörler,._*ve geçersiz adlar yok sayılır.- Güncelleyici
servers/klasörüne asla dokunmaz (arşivde olsa bile); release paketineservers/dahil edilmez. - Aşama 1.2 (taşıma):
./start.sh --migrate [--dry-run] [--yes]ve etkileşimli açılışta (yalnızca terminalde, onaysız asla) teklif. Eskisistem/Modules/<ad>/→servers/<ad>/: ayarlar genel anahtarlara çevrilir, key'ler kopyalanır ve bayt bayt doğrulanır, izinler 600/700, üretilmiş modül dosyaları taşınmaz. Hiçbir şey silinmez: eski klasörlerservers/.migrated-<tarih>/altına alınır; hata olursa o sunucunun eski klasörü olduğu gibi kalır, yarım klasör bırakılmaz. İdempotent. Keychain'e dokunulmaz (passphrase'ler aynen geçerli). - Aşama 1.3 (yeni biçime yazma):
ModuleGenerator.sh,ImportSSHConfig.shve menüdeki "Yeni sunucu ekle / içe aktar" artıkservers/<ad>/server.envyazar (genel anahtarlar; sunucu başına üretilmiş bash dosyası yok,.env.exampleyok).ModuleManager.sh:listyeni ve eski biçimi (etiketle),removeikisini de,renameyeni biçimi (klasör + key dosyaları; eski biçim için "önce--migrate" der) yönetir. Aynı ad hemservers/hem eskiModules/'te varsa oluşturma/içe aktarma reddedilir. - CI'a macOS işi:
macos-latest(Apple Silicon arm64, macOS 26.6.2) üzerinde macOS'un kendi bash 3.2'siyle ShellCheck + tüm testler. Bu sırada bulunan bir test aracı sorunu (bash 3.2 + UTF-8 yereli, Türkçe test adlarını yanlış kodluyor)LC_ALL=Cile giderildi. Keychain izin penceresi ve Terminal açma otomatik sınanmaz (testler sahtesecuritykullanır). - Aşama 1.4 (sadeleşme): gönderilen
sistem/Modules/example/modülü kaldırıldı; yerinesistem/templates/server.env.exampleşablonu geldi (menüde artık boş bir "EXAMPLE" girdisi çıkmaz; sunucu eklemek için "Yeni sunucu ekle"). Güncelleyici sadeleşti: kod (sistem/*.sh,Helpers,templates) bütünüyle değişir;sistem/Modules/(henüz taşınmamış eski sunucular) veservers/asla silinmez/ezilmez. Eski sürümlerden kalan, hiç yapılandırılmamışexampleşablonu güncellemede güvenle temizlenir (içinde.env/key/başka dosya varsa dokunulmaz). Taşıma,.env'i olanexample'ı da (gerçek sunucu olarak) taşır. EskiModules/klasörü yoksa artık uyarı verilmez.
- Tasarım kararları işlendi: durum göstergesi varsayılan açık,
⚙️ Ayarlarpaneli (5 ayar,sshpocket.conf),qgeri, fzf USB'ye gömülür (yedekli), klasik port knocking için pre-connect kancası (docs/ui-design.md,docs/components-design.md§6.7). docs/ui-design.md: arayüz ilkeleri, fzf dağıtım politikası, Apple Silicon doğrulama listesi ve teknoloji alternatifleri (tasarım, kod yok).- README: "Test edilen ortamlar" tablosu. Yalnızca Intel + macOS 15.7.9'da denendi; Apple Silicon ve daha yeni macOS denenmedi.
docs/components-design.md:servers/veri ayrımı ve bileşen modeli için tasarım (henüz uygulanmadı); linux-hardening PR sırası incelemeyle güncellendi (A → 0a → 0b → 0c → B → D → C).- Tasarım belgesi, linux-hardening'in gerçek
component.yml'ine hizalandı (issue #2):invoke.appendnesne listesi,inventory_group,outputs,hardening_scan_dir, principal=ad alanı. - Tasarım belgesi, linux-hardening v0.1.0'ın geri alma güvenlik ağına hizalandı (issue #3):
rollback_status/disarm/now,hardening_rollback_*değişkenleri, arayüz notları.
- Dependabot yapılandırması (aylık, yalnızca GitHub Actions bağımlılıkları).
2.2.0 - 2026-10-08
- İmzalı güncelleme:
./start.sh --update/--check-updateve menüde "Güncelle". Yalnızca bakımcının imza anahtarıyla imzalı (ssh-keygen -Y verify), HTTPS ile inen Release paketini kurar; imza yoksa/anahtar tanımlı değilse kapalıdır. Geri sürüme düşmez, tehlikeli arşivleri (.., mutlak yol, symlink) reddeder, kullanıcı verisini korur, yedek alır ve hata olursa geri yükler. scripts/release.sh(imzalı paket üretir ve yayından önce doğrular) veRELEASING.md(bakımcı rehberi)..gitattributesile release paketinetest/,scripts/,.github/girmez.- Depo hijyeni testleri:
release_signersbiçimi ve repoda özel anahtar/sır dosyası bulunmaması.
Güncelleyici bu sürümle gelir; v2.1.0 ve öncesi kopyalar bir kez elle güncellenmelidir.
2.1.0 - 2026-10-08
İlk yayın.
2.0.0hiç yayınlanmadığı için bu sürüm, aşağıdaki2.0.0bölümündeki her şeyi de içerir.
- Sürüm tek yerde (
VERSION);sistem/Main.sh --version/./start.sh --versionsürümü yazar. - Uçtan uca testler (
test/e2e/): Docker'da yerel Ubuntusshdilessh-copy-id, elle ekleme komutu, root reddi ve durum göstergesi gerçek sunucuya karşı denenir. ssh-copy-idbaşarısız olursa olası nedenler ve sunucuda çalıştırılacak tek satırlık elle ekleme komutu gösterilir (komut tekrar çalıştırılabilir, mevcut key'leri korur). Kullanıcırootise Ubuntu/Debian uyarısı verilir.- Modül menüsünde Bilgileri güncelle (IP/kullanıcı/port/key yolu) ve Keychain passphrase'ini güncelle/sil. Passphrase kaydedildikten sonra key açılarak doğrulanır. Ayar bozuk veya key eksikken de bu seçenekler çalışır.
- Ana menüde yerleşik eylemler: yeni sunucu ekle,
~/.ssh/config'ten içe aktar, sunucuları yönet. Eklenen/silinen modüller yeniden başlatmadan menüye yansır.
--automodu artık yerleşik eylemleri atlayıp ilk sunucuyu çalıştırır.
İç dönüm noktası; etiketlenmedi ve yayınlanmadı. İlk yayın: 2.1.0.
~/.ssh/configiçe aktarma (ImportSSHConfig.sh); private key'ler kopyalanmaz,<ÖNEK>_KEYile referanslanır.ModuleManager.sh:list,remove,rename.- Menüde durum göstergesi (
SSHPOCKET_STATUS=1): 🟢 / 🔴 / ⚪. - Public key'i sunucuya gönderme (
ssh-copy-idakışı), modül menüsünden ve generator'dan. <ÖNEK>_KEYile modül klasörü dışındaki mevcut key'i kullanma.start.command(Finder'dan çift tıkla başlatma).- 53 Bats testi; GitHub Actions'ta ShellCheck + Bats.
- README (TR/EN), CONTRIBUTING, SECURITY, ROADMAP, issue/PR şablonları.
- Passphrase artık düz metin
.env'de değil, macOS Keychain'de;SSH_ASKPASSile geçici dosyasız aktarılır. - Üç kopya modül tek ortak çalıştırıcıya (
Helpers/SSHModule.sh) indirildi. .envayrıştırma saf bash ile yeniden yazıldı (eval yok); satır sonu yorumları desteklenir.- Host key ilk bağlantıda kullanıcıya sorulur (
accept-newkaldırıldı);ssh -vvarsayılan değil. autorun.shkaldırıldı (macOS desteklemez); yerinestart.sh.
- IP/kullanıcı/port doğrulaması; kullanıcı adı
-ile başlayamaz (ssh seçenek enjeksiyonu). - Menü, girdi bittiğinde (EOF) sonsuz döngüye giriyordu.
- Generator'daki macOS'ta çalışmayan
sed \Uve üzerine yazma davranışı.
- TOTP gizli anahtarları ve parolaların
.enviçinde tutulması.