Skip to content

About

Ansible-based Linux server hardening (Ubuntu 26.04 first, extensible)

Topics

Resources

Contributing

Security policy

Stars

2 stars

Watchers

1 watching

Forks

Latest commit

 

History

476 Commits

Folders and files

NameName
Last commit message
Last commit date
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 

Repository files navigation

linux-hardening

🇹🇷 Türkçe · 🇬🇧 English

Ansible ile Linux sunucu sertleştirme (hardening). Rolleri tek repoda tutar; her dağıtım/sürüm için destek açıkça listelenir, desteklenmeyen sistemde çalışmayı durdurur.

Şu an desteklenen: Ubuntu 26.04 LTS ve Proxmox VE 9 (tek düğüm, hardening_platform=proxmox-host); Debian 13 konteynerde test edildi (hedef: CIS Level 1 Server yaklaşımı). Başka sürüm/dağıtım ekleme yolu açık: bkz. docs/SUPPORT.md.

Durum (0.9): Ubuntu 26.04 ve Proxmox VE 9 (tek düğüm) gerçek VM'lerde sshpocket üzerinden canlı doğrulandı (docs/verification-log.md): temiz sunucuda ilk kurulum, ikinci koşuda changed=0, --check (failed=0), erişim kaybı korumaları, alan anahtarları ve kalıcı kapatma eylemleri. Lynis hardening index Ubuntu'da 83. Doğrulanmayanlar: Raspberry Pi, misafirli/kümeli Proxmox, Docker'lı VM, HA, geri alma güvenlik ağının gerçek VM'de silahlı denemesi (yalnızca Docker LAB'da kanıtlı), tam CIS Benchmark uyumu (bilerek "yaklaşım"). Önce test sunucusunda deneyin, snapshot alın.

Alan anahtarları ve kalıcı kapatma

  • Her sertleştirme alanının kendi anahtarı vardır: hardening_<alan>_enabled (varsayılan true: davranış değişmez). false rolü tamamen atlar; daha önce yazılmış dosyalar silinmez. ufw VE ssh ikisi de kapalıyken hardening_ssh_allow_from şartı, geri alma güvenlik ağı ve yeni bağlantı doğrulaması atlanır. Ayrıntı: docs/component-vars.md.
  • Bu paketin yazdıklarını kaldırmak için ayrı eylemler vardır: kaldir_onizle (salt okunur önizleme), kaldir (önce /var/backups/linux-hardening/ altına yedekler, sonra siler) ve kaldir_geri_yukle. İçeriği bu paketin yazdığı gibi olmayan dosya atlanır. Dosyayı silmek çalışan sistemin durumunu geri almaz (ayrıntı: HOWTO.md).

Akış

  1. playbooks/audit.yml — baseline tarama (Lynis)
  2. playbooks/harden.yml --check --diff — ne değişecek, önce gör
  3. playbooks/harden.yml — uygula (önce snapshot/yedek al)
  4. playbooks/audit.yml — tekrar tara, öncesi/sonrası karşılaştır

Inventory grubu

Sunucuları inventory'de hardening grubuna yazın (dışarıdan üretilen inventory'ler de bunu kullanabilir). Eski ubuntu grubu geçiş için hâlâ kabul edilir. Desteklenen sistem/sürüm kontrolü grup adıyla değil, hardening_preflight ile yapılır.

2FA uyarısı: hardening_ssh_kbdinteractive: true yazmak yalnızca bir anahtarı çevirir. Sunucuda PAM'ın 2FA'yı (örn. libpam-google-authenticator) ayrıca yapılandırılması gerekir; yanlışsa erişim kesilir. Açıkken sshd AuthenticationMethods publickey,keyboard-interactive ile (anahtar VE PAM istemi) çalışır; böylece PasswordAuthentication no iken PAM üzerinden tek başına parola girişi açılmaz. Bu durumda bağlantı doğrulaması yalnızca SSH banner'ını sınar (2FA istemi otomatik cevaplanamaz). Önce test sunucusunda deneyin.

Başlangıç

python3 -m venv .venv && .venv/bin/pip install --require-hashes -r requirements.txt   # hash'li, Python >= 3.12
cp inventory/hosts.example.yml inventory/hosts.yml   # kendi makinelerini yaz
source .venv/bin/activate
ansible-playbook playbooks/audit.yml

Ayrıntılı kullanım, sudo/üretim notları ve sorun giderme: HOWTO.md. Alınan kararlar ve istisnalar: docs/decisions.md. Canlı doğrulama kayıtları: docs/verification-log.md. Yol haritası: docs/ROADMAP.md.

hardening_ssh_allow_from zorunludur (ufw ya da ssh alanı açıkken; varsayılanı bilerek boş). Boşsa, geçersizse ya da Ansible'ın bağlandığı kaynak IP bu ağlarda değilse harden.yml firewall/SSH'a dokunmadan durur. Ayrıca root olarak bağlanılamaz. Örn: -e '{"hardening_ssh_allow_from": ["192.168.1.0/24"]}'

Yalnızca VPN yazma: listeye sunucuya bağlanabileceğin tüm ağları yaz (VPN + LAN + ...). ufw yalnızca bu ağlardan SSH'a izin verir, gerisini keser; koruma ise yalnızca şu anki bağlantının kaynağını denetler. Yalnızca VPN yazarsan LAN'dan SSH zaman aşımına uğrar (ping/ARP çalışır). Geri alma güvenlik ağı bunu yakalamaz: doğrulama kontrol makinesinden, yani çalışan yoldan yapılır.

Önce test sunucusunda deneyin, snapshot alın, --check --diff ile bakın.

Birden fazla sunucu

Web, Docker, Redis gibi farklı sunucuları farklı ayarlarla sertleştirmek için çalışan örnek: examples/ (group_vars ve sshpocket için sunucu başına değişken dosyası). Ayrıntı: HOWTO.md.

Ne yapmaz (kapsam sınırları)

Bu proje tam CIS Benchmark uyumu iddia etmez: hedef "Level 1 Server yaklaşımı". Madde numaralı eşleme (Level 1 Server) docs/cis-esleme.md dosyasında (Debian 13 ve Proxmox notları: docs/cis-esleme-debian.md); aşağıdaki tablo ise madde değil alan bazlıdır ve yalnızca kodda doğrulanmış sınırları listeler. "Bilerek" yazılanlar belgeli kararlardır; diğerleri henüz yapılmadı, atlandığı anlamına gelmez. Eksik bir alan görürseniz issue açın.

Alan Durum Not
SSH portunu değiştirmek Bilerek yok ufw kuralı sshd'nin gerçekten dinlediği porttan yazılır (decisions.md)
Otomatik yeniden başlatma Bilerek yok Otomatik güvenlik güncellemesi açılır, reboot yok (HOWTO.md)
Kullanıcı, parola, anahtar yönetimi Tasarım gereği yok Kullanıcıyı siz oluşturursunuz; rol yalnızca parola girişini kapatmadan önce authorized_keys'in dolu olduğunu doğrular
Uygulama sertleştirmesi (nginx, MySQL vb.) Kapsam dışı Yalnızca işletim sistemi
Başka dağıtım/sürüm Sınırlı Ubuntu 26.04 ve Proxmox VE 9 (tek düğüm) doğrulandı, Debian 13 yalnızca konteynerde; Raspberry Pi planlı (SUPPORT.md)
Geri alma Kısmi sshd drop-in, ufw ve (faillock açıksa) PAM geri alınır; paketler, sysctl, auditd, fail2ban, AIDE geri alınmaz
Bölüm/bağlama seçenekleri Kısmi /tmp ve /dev/shm için nodev,nosuid,noexec (hardening_tmp_noexec, hardening_shm_noexec), /proc için hidepid=2 (hardening_proc_hidepid, varsayılan KAPALI); ayrı bölüm (/home, /var) açılmaz
Önyükleyici (GRUB) Kısmi audit=1 ve audit_backlog_limit yazılır (auditd-kapsam.md); GRUB parolası hardening_grub_password_hash ile isteğe bağlı, varsayılan KAPALI: set superusers normal açılışı da parolaya bağlar, bu yüzden 10_linux yamalanır ve recovery kapatılır (hardening_grub_unrestricted_boot); doğrulama başarısızsa geri alınır. Gerçek GRUB açılışı DENENMEDİ (cis-esleme.md 1.4.1, known-issues.md)
AppArmor profilleri Kısmi Paketler ve etkinleştirme; hardening_apparmor_enforce (varsayılan KAPALI) profilleri complain'den enforce'a alır; kendi profil yazmaz
Günlük yönetimi Kısmi journald kalıcı depolama ve sıkıştırma, sınırlar (hardening_journald_rotation, varsayılan KAPALI), günlük dosya izinleri; rsyslog, logrotate ve uzak günlük yok
cron/at kısıtları, sudo yapılandırması Kısmi Yalnızca cron dosya/dizin izinleri ve sudoers.d ayarı (use_pty, logfile, timestamp_timeout); cron.allow/at.allow oluşturulmaz, su kısıtlanmaz. sudoers değişimleri ayrıca auditd ile izlenir
IPv6'yı kapatmak Bilerek yok Yalnızca router duyurusu (RA) kabulü kapatılabilir (hardening_kernel_disable_ipv6_ra)
Core dump Var (varsayılan KAPALI) fs.suid_dumpable = 0 her zaman; hardening_disable_coredump kullanıcı sınırını ve systemd-coredump'ı kapatır
Kullanılmayan servis/paket kaldırma Kısmi postfix/courier-* kaldırılır; telnet/ftp istemcileri isteğe bağlı (hardening_remove_legacy_clients); avahi, cups vb. yok
Nadir dosya sistemi modülleri Kısmi cramfs, freevxfs, hfs, hfsplus, jffs2, firewire-core ve atm, can, dccp, rds, sctp, tipc, usb-storage engellenir; udf ve squashfs engellenmez
SUID/SGID envanteri Kısmi Salt okunur liste (hardening_suid_report); izin değiştirilmez
AIDE zamanlanmış kontrol Var İlk veritabanı üretilir; hardening_aide_scheduled_check günlük zamanlayıcının açık olmasını sağlar. Veritabanı kendiliğinden güncellenmez, e-posta teslim edilmez
Zaman senkronizasyonu Kısmi Yalnızca salt okunur rapor (hardening_time: saat kayması uyarısı); chrony yapılandırılmaz. Tasarım notu: zaman-ntp.md
Denetim (auditd) kapsamı Sınırlı 6 kural grubu (identity, scope, sshd, logins, time-change, modules); -e 2 isteğe bağlı (hardening_auditd_immutable, varsayılan KAPALI); CIS Level 2 kuralları isteğe bağlı (hardening_auditd_cis_l2); komut yürütme/dosya silme izlenmez; auditd'den önce başlamış süreçler yeniden başlatılana kadar denetlenmez
fail2ban Sınırlı sshd jail; Proxmox web arayüzü jail'i isteğe bağlı (hardening_fail2ban_pve_web, varsayılan KAPALI)

Bilinen çakışmalar (sertleştirmenin meşru kullanımları bozabileceği yerler): docs/known-issues.md.

Dikkat: davranışı değiştiren ayarlar

harden bir sunucuya uygulanınca aşağıdakiler varsayılan olarak açıktır ve meşru bir kullanımı bozabilir. Sunucu türüne göre group_vars/host_vars ya da -e ile kapatın. Tam liste ve kaçış yolları: docs/known-issues.md.

Ayar (varsayılan) Ne bozabilir Kapatma
ufw: gelen trafik deny hardening_ssh_allow_from ve hardening_ufw_extra_allow dışındaki her şey (web, Redis, izleme) kapanır. Docker'ın yayınladığı portlar ufw'yi atlar hardening_ssh_allow_from (tüm bağlantı ağlarını yaz), hardening_ufw_extra_allow
hardening_ufw_routed_deny (açık) ufw ile yönlendirme/NAT/köprü yapan, Docker'lı sunucularda konteyner trafiği durabilir false
base: postfix/courier kaldırılır, dma kurulur Yerel posta sunucusu bekleyen uygulama bozulur --skip-tags base (tüm rolü atlar)
base: usb-storage kapalı; kernel: cramfs, hfs, jffs2, firewire-core, atm, can, dccp, sctp, rds, tipc yüklenemez USB diske yedek, bu dosya sistemi/protokolü kullanan uygulama çalışmaz --skip-tags kernel,base
kernel: route_localnet=0 localhost'a DNAT yapan düzenler (bazı Kubernetes NodePort) bozulur --skip-tags kernel
ssh: DisableForwarding, MACs zayıf liste, MaxStartups 10:30:60 Unix soket yönlendirme, çok eski istemciler, çok paralel SSH bağlantısı hardening_ssh_allow_tcp_forwarding=local (yönlendirme), diğerleri için --skip-tags ssh
hardening_kernel_extra_sysctl (açık) kernel.sysrq=0: VM konsolundan SysRq ile acil yeniden başlatma kullanılamaz; net.core.bpf_jit_harden=2: eBPF yoğun iş yüklerinde küçük performans bedeli false
hardening_tmp_noexec (açık) /tmp'e nodev,nosuid,noexec: bu dizinden doğrudan çalıştırma kapanır; /tmp'ten ikili çalıştıran uygulamalar (PHP/Java/Node işleri, bazı paket betikleri) bozulabilir. Ansible etkilenmez false (yazılmış drop-in elle silinir)
hardening_shm_noexec (açık) /dev/shm'ye nodev,nosuid,noexec (/etc/fstab satırı); paylaşımlı bellekten çalıştıran uygulamalar bozulabilir false (yazılmış fstab satırı elle silinir)
hardening_pam_tmpdir (açık) libpam-tmpdir: $TMPDIR artık /tmp değil (/tmp/user/<uid>); /tmp'i sabit varsayan betikler etkilenebilir false
hardening_apt_listchanges (açık) apt-listchanges kurulur; apt yükseltmelerinde değişiklik notları (onaysız, e-postasız) yazdırılır; çıktıyı ayrıştıran betikler fazladan metin görebilir false (kurulu paket kaldırılmaz)
hardening_disable_apport (açık) Ubuntu çökme raporları toplanmaz false
hardening_disable_update_notifier_motd (açık) Oturum açılışındaki güncelleme iletisi yenilenmez false
hardening_su_restrict (kapalı) Açılırsa su yalnızca hardening_su_group üyelerine açılır; varsayılan boş sugroup ile root dışında kimse su yapamaz (sudo, ssh etkilenmez) false (yazılmış satır elle silinir)
hardening_sudo_enabled (açık) use_pty: arka plana atılan sudo süreçleri oturum kapanınca takılabilir false
hardening_files_enabled (açık) İzinler yalnızca sıkılaşır; bu dosyalara başka kullanıcıyla erişen betikler bozulabilir false

Varsayılan KAPALI, bilinçli açılacaklar: hardening_pam_faillock (hesap kilitleme: deny yanlış parolada hesap unlock_time boyunca kilitlenir; sudo/su/konsol, SSH anahtarı etkilenmez; geri alma güvenlik ağı açık olmalı), hardening_pam_pwhistory_remember (parola geçmişi: N > 0 ise son N parola yeniden kullanılamaz; yalnızca parola DEĞİŞTİRMEYİ etkiler, girişi değil; enforce_for_root kapalıyken root'un chpasswd'si engellenmez), hardening_time_makestep (büyük saat kaymasını düzeltir; saati SIÇRATIR: sertifika, cron ve günlük sırası etkilenebilir), hardening_docker_enabled (salt okunur Docker raporu), hardening_docker_daemon_manage (daemon.json birleştirme), hardening_docker_no_new_privileges / hardening_docker_userland_proxy_off / hardening_docker_icc_off (daemon.json'a CIS Docker 2.15 / 2.17 / 2.2 anahtarı; yalnızca daemon_manage açıkken; icc=false mevcut köprüye yalnızca konteynerler durdurulup Docker yeniden başlatılınca işler), hardening_docker_restart (Docker yeniden başlar, live-restore yoksa konteynerler durur), hardening_kernel_disable_ipv6_ra (IPv6'sını yalnızca yönlendirici duyurusundan alan sunucuyu keser), hardening_auditd_grub_audit (audit=1, yeniden başlatma gerekir, geri alma kapsamında değil), hardening_auditd_restart_services (servis kesintisi), hardening_ufw_prune_ssh (kural siler).

Varsayılan KAPALI (CIS kalan Level 1), bilinçli açılır: hardening_pwquality_difok, hardening_pwquality_maxsequence, hardening_pwquality_enforce_for_root (parola DEĞİŞTİRİRKEN ek kalite kuralları; girişi etkilemez), hardening_journald_rotation (journald boyut/süre sınırı; sınırı aşan ESKİ günlükler silinir) ve hardening_ssh_allow_users / hardening_ssh_allow_groups (SSH erişim kısıtı; Ansible'ın bağlandığı kullanıcı listede değilse rol hiçbir şey yazmadan durur). Yeni salt okunur rapor (hardening_report, varsayılan açık, --tags report): IPv6 durumu, dinleyen servisler (hardening_approved_listeners doluysa listede olmayanlar uyarı), kullanıcı nokta dizinleri ve nullok/boş parolalı hesaplar; hiçbir şeyi değiştirmez.

Varsayılan KAPALI (Grup 2), sunucu türüne göre açılır: hardening_disable_coredump, hardening_shell_timeout_seconds (TMOUT), hardening_password_inactive_days, hardening_log_file_permissions ve hardening_remove_legacy_clients (telnet/ftp kaldırma). Sonuncusu için not: bu programlar port açmaz (güvenlik riski yaratmaz), ama telnet host port ile port yoklayan betikleri ve ftp kullanan yedek akışlarını kırar; kaldırma apt remove ile yapılır (purge değil), geri alma apt installdır. ubuntu-standard metapaketi de kalkar (bir ftp istemcisi ister, yoksa apt bir istemciyi kaldırınca öbürünü kurar); dosya içermez, ama apt autoremove ondan gelen otomatik paketleri aday gösterebilir. Ayrıntı: docs/ROADMAP.md. Henüz kodlanmadı: /tmp ve /dev/shm noexec, su kısıtı, kullanıcı dot dizinleri (tasarım gerekir).

Testler

test/ altındaki testler her PR'da CI'da (.github/workflows/ci.yml) çalışır; yerelde:

python3 -m venv .venv && .venv/bin/pip install --require-hashes -r requirements-dev.txt
PATH="$PWD/.venv/bin:$PATH" test/run-all.sh          # hepsi
PATH="$PWD/.venv/bin:$PATH" test/run-all.sh summary  # adı "summary" içerenler
Test Neyi korur
test_lint.sh --syntax-check, yamllint --strict, ansible-lint (0 bulgu), shellcheck
test_access_guards.sh allow_from boş/geçersiz/kaynak dışı, SSH_CONNECTION yok, root, IPv4/IPv6
test_expressions.py sshd portlarının ss çıktısından türetilmesi
test_fail2ban_ignoreip.py fail2ban ignoreip yalnız değişkenden (otomatik adres yok), bağlı adres için tek satırlık NOT (CIDR üyeliği, UYARI değil, hardening_ssh_allow_from eklenmez); gerçek Ansible
test_templates.py Şablonların varsayılan çıktısı (golden dosyalar) ve güvenli varsayılanlar
test_scan_dir.py Tarama dizini varsayılanı kullanıcı klasörüdür (HOME/XDG), paket klasörüne yazılmaz, izinler 0700/0600, HOME yoksa durur
test_summary.py summary.json alanları, null davranışı, dizin/dosya izinleri
test_tags_and_hosts.sh --tags ile preflight/korumaların atlanmaması, hardening/ubuntu grubu seçimi ve olmayan grup için uyarı çıkmaması
test_facts_namespace.sh Fact'ler yalnızca ansible_facts[...] ile okunur (INJECT_FACTS_AS_VARS=False altında OS denetimi), üst düzey fact adı yasağı
test_docker_scripts.py Docker karar betikleri (gerçek docker ps/daemon.json biçimleriyle): yayınlanan port raporu, docker grubu, TCP API, daemon.json birleştirme (mevcut ayarları silmez, bozuk JSON'a dokunmaz, idempotent)
test_docker_tasks.py hardening_docker görevleri uçtan uca (sahte okuma çıktısı + gerçek betik): varsayılan kapalı, Docker yoksa atla, okumalar salt okunur, yedekli yazma, auditd'de yalnız var olan yollar
test_examples.py examples/ tutarlılığı: gerçek ansible-inventory ile group_vars birleşimi, sshpocket dosyalarıyla aynı; yalnız var olan değişkenler, ek ufw kuralları doğrulama kalıbına uyar, DB portu açılmaz
test_usb_storage.py hardening_disable_usb_storage: varsayılan true; false iken kural dosyası silinir, USB depolama tekrar kullanılabilir
test_ansible_cfg.py ansible.cfg ssh canlılık seçenekleri (ölü bağlantıda takılmama), varsayılan ssh_args ezilmez
test_apt_listchanges.py apt-listchanges: kurulum + bloklamayan yapılandırma (confirm=false, frontend=text), idempotent, warn_if yok
test_pam_faillock.py hesap kilitleme: korumalar (güvenlik ağı kapalı/armed değil → durur), yığın SIRASI (gerçek Ubuntu çıktısı ve bozuk varyantlar), faillock.conf satırları, rescue geri alma
test_cis_report.py, test_cis_remaining.py Salt okunur rapor (IPv6, dinleyiciler, nokta dizinleri, nullok/boş parola) karar mantığı; pwquality, journald döndürme ve sshd erişim listeleri (kendini kilitleyen liste reddi); mutasyonla doğrulandı
test_rpi_platform.py Raspberry Pi platformu: algılama, raspberry-pi reddi (Pi değilse), generic + Pi notu, usb-storage gevşetmesi, Proxmox gevşetmesinin Pi'yi kapsamaması
test_pve_report.py, test_pve_report_tasks.py Proxmox VE host durum raporu (playbooks/pve-report.yml): gerçek Proxmox 9.2 değerleriyle karar mantığı + görev zinciri, salt okunur, harden.yml'e bağlı değil
test_pve_firewall_plan.py, test_pve_firewall_tasks.py Proxmox güvenlik duvarı (playbooks/pve-firewall.yml): karar betiği (küme, allow_from, kontrol makinesi, kullanıcı dosyası reddi), görev sırası (enable 0 → compile → enable 1), apply kapısı, ön izleme zinciri; test_rollback_script.sh bölüm 10: cluster.fw yedek/geri alma
test_pwhistory.py parola geçmişi (pam_pwhistory): pam-auth-update profili (sıra), pwhistory.conf satırları gerçek dosyada, rescue ile geri alma, varsayılan kapalı
test_tmp_plan.py, test_tmp_noexec_tasks.py /tmp ve /dev/shm noexec UYGULAMA: plan kararları (yalnız ayrı+tmpfs, fstab satırı ezilmez) + gerçek copy/lineinfile zinciri, idempotens
test_tmp_report.py, test_tmp_tasks.py /tmp ve /dev/shm bağlama seçenekleri raporu (CIS 1.1.2): nodev/nosuid/noexec/ayrı bağlama kararları + gerçek görev zinciri, salt okunur
test_root_env_report.py, test_root_env_tasks.py root ortamı raporu (CIS 5.4.2, PATH/umask): PATH ve umask kararları (betik) + gerçek görev zinciri, salt okunur, kapatılabilir
test_aide_timer.py AIDE günlük zamanlayıcısı (CIS 6.3.2): dailyaidecheck.timer açık+başlatılmış, AIDE işi değişmez, warn_if yok
test_su_restrict.py su kısıtı (CIS 5.2.7): gerçek /etc/pam.d/su üzerinde lineinfile (pam_rootok sonrası, çoğalmaz), geçersiz grup adı reddedilir, varsayılan kapalı
test_lynis_small.py Lynis'ten çıkan küçük maddeler: ek sysctl (şablon varyantları) ve libpam-tmpdir (gerçek when), warn_if yok
test_cis_group2.py Grup 2 (hepsi varsayılan kapalı): core dump, telnet/ftp kaldırma (remove, purge yok), TMOUT ve INACTIVE sınırları ve idempotensi, mevcut hesaplara dokunulmaması
test_cis_group1.py apport ve update-notifier-motd kapatma (olmayan birime dokunulmaz, kendi değişkeniyle kapanır, lineinfile idempotent) ve SUID/SGID özetinin salt okunur kalması
test_files_role.py dosya izinleri gerçek ansible-playbook ile geçici ağaçta: yalnızca sıkılaşır (0600 gevşemez), olmayan dosya oluşturulmaz, sembolik bağ izlenmez, --check değiştirmez, ikinci koşu changed=0
test_sudo_role.py sudoers drop-in: visudo -cf ile doğrulanır (üretilen içerik gerçek visudo ile), become denemesi, başarısızlıkta temizlik, NOPASSWD yok
test_cis_quickwins.py CIS kolay kazançlar: modül listeleri, ufw routed ilkesi, audit=1 (gerçek replace modülüyle, idempotent), ssh yeniden başlatma yasağı, riskli seçeneklerin varsayılanı kapalı
test_time_report.py zaman raporu kararı (gerçek chronyc -c sources biçimiyle): sağlıklı, bayat/kayık saat, servis kapalı, kaynak yok, eşik, bozuk satır
test_time_tasks.py zaman rolü salt okunur kalır: yalnızca okuma modülleri, --check'te çalışır, kapatılabilir, saati değiştiren komut yok
test_ufw_extra_allow.py ufw ek kuralları: grup ve sunucu listeleri birleşir, geçersiz girdi (14 örnek) roller çalışmadan reddedilir, iki doğrulayıcı aynı kalıpta, sshpocket değişkeni
test_ufw_stale_rules.py ufw eski SSH kuralı kararı: ağ normalleştirme, kontrol makinesi/boş allow_from/extra_allow korumaları, eksik kural tespiti
test_ufw_prune_tasks.py ufw silme görevlerinin yapısı: varsayılan kapalı, --check'te silmez, silme sonrası doğrulama ufw enable'dan önce
test_auditd_unaudited.py auditd'den önce başlamış süreçlerin salt okunur tespiti (sahte ps/systemctl ile), çekirdek iş parçacıkları ve eşik dışarıda
test_auditd_rules_order.py auditd kuralları servis başladıktan hemen sonra yüklenir (handler/play sonu değil), --check'te atlanır
test_handlers.py Her notify bir handler'a bağlı
test_vars_defined.py group_vars olmadan değişkenler tanımlı, güvenli varsayılanlar
test_consistency.sh VERSION/component.yml/destek matrisi tutarlılığı (kasıtlı bozmalar yakalanır)
test_rollback_script.sh geri alma betiği: arm/disarm/restore (önceki içeriği geri yükler, silmez), sahte komutlarla
test_lynis_paketler.py Lynis paket seçenekleri: debsums (+CRON_CHECK), apt-show-versions, acct, boş jail.local (varsayılan açık) ve apt_upgrade (varsayılan kapalı, dist-upgrade değil)
test_ufw_log_martians.py log_martians ufw etkinken /etc/ufw/sysctl.conf tarafından 0'a çekiliyordu: dosya hizalama ve canlı değer düzeltmesi (gerçek lineinfile, idempotens)
test_auditd_secenekleri.py auditd/AIDE Level 2 seçenekleri (hepsi kapalı): auditd.conf, disk dolunca durdur, GRUB audit_backlog_limit, -e 2 (kilitliyken yükleme atlanır), AIDE audit araçları
test_auditd_l2.py CIS Level 2 auditd kural üreticisi (audit_l2_rules.py): varsayılan kapalı, tekrarlanan kural yok, var olmayan yola kural yok, 32 bit yalnızca 32 bit mimaride
test_erisim_ag_secenekleri.py Erişim/ağ seçenekleri: MaxSessions (1-10), ufw giden DROP + izin listesi, derleyici kısıtı (gerçek chmod), AppArmor enforce (aa-status --json ayrıştırma)
test_malware_scanner.py hardening_malware_scanner (none | rkhunter): kurulum, günlük kontrol ayarı, ilk veritabanı; ClamAV yok
test_modul_onyukleme.py kernel.modules_disabled önyükleme modül listesi (yüklü modüller + netfilter + binfmt_misc), Proxmox'ta reddi, verify_access tek anahtar/ek bağımsız değişken/ipucu
test_proxmox_web_jail.py Proxmox web arayüzü fail2ban jail'i: filtre regex'i örnek günlük satırlarında, kapı koşulları, kaldırma
test_pveproxy_siniri.py pveproxy erişim sınırı: karar betiği (kontrol makinesi, kullanıcı satırı koruması), yazma/geri yükleme/kaldırma, 8006 doğrulaması
test_pve_banner.py Proxmox pvebanner.service drop-in'i: yasal uyarının her açılışta geri yazılması (yazma, 2. koşu changed=0, generic'te/birim yokken yazmama, kapatınca silme)
test_kaldir.py Kalıcı kapatma (kaldir_onizle, kaldir, kaldir_geri_yukle): gerçek Ansible, yollar geçici dizinde; önizleme yazmaz, içeriği bizim olmayan dosya atlanır, yedek 0700/0600 ve manifest, idempotens, geri yükleme, katalog dışı yol ve yol gezdirme reddi, --check'te silmez
test_alan_anahtarlari.sh Alan anahtarları (hardening_<alan>_enabled): kapalıyken rol hiç çalışmaz, varsayılanda çalışır; ufw+ssh ikisi de kapalıyken erişim korumaları/geri alma/doğrulama atlanır, biri açıkken çalışır; tanım tutarlılığı (tür, varsayılan, group, warn_if)
test_ilerleme.py İlerleme satırları (SSHPOCKET_PROGRESS): gerçek Ansible, sahte roller, ansible.cfg başka dizinden; başladı/bitti, degisen/atlanan/kesin (önizlemede komut görevi), hata veren alana bitti yazılmaz, bozuk/eksik plan Ansible'ı düşürmez ve uyarı basmaz, AIDE bekle_tahmin; harden.yml planı roles: ile aynı sırada
test_bulgular.py bulgular.tsv üretimi (gerçek Ansible, gerçek Lynis satırları): 10 sütun ve sshpocket'in satır kuralları, aynı kimlik birden çok satır (SSH-7408), GENEL-n, sekme/- temizliği, 0600; eşleme tablosu component.yml ile çapraz denetlenir (değişken var mı, evet ⇔ varsayılan); bozuk/eksik girdi ve üretim hatası denetimi düşürmez
test_platform_anahtarlari.py sshpocket menü süzmesi (platform_var, platforms, group) ve tutarlılık denetiminin geçersiz platform bilgisini yakalaması; koşulsuz görevlerin sunucu başına anahtarları (false atlar, true davranışı korur)
test_proxmox_guard.py Preflight platform ve Proxmox koruması: gerçek stat/set_fact/fail, hardening_allow_unsupported atlatamaz
test_platform_wiring.py Platform bağlantısı: hardening_platform=proxmox-host iken hangi roller/görevler ne yapar (when ifadeleri gerçek Ansible ile)
test_debian_support.py Debian 13 desteği (yapısal): alt sürüm anahtarı, Debian'a özgü farklar
test_cron_order.py cron kurulumu hardening_files'tan önce (minimal imajda cron izinlerinin ilk koşuda sıkılaşması)
test_rollback_wiring.py Geri alma ağının playbook/rol bağlantısı: arm sırası, başarıda disarm, hatada restore
test_rollback_playbook.sh playbooks/rollback.yml: varsayılan yalnızca status; disarm/now yalnızca --tags ile; armed iken changed=1, değilken changed=0
test_rollback_role.sh hardening_rollback arm görevleri: zaman aşımı doğrulaması, kapalıyken uyarı, --check'te atlanma
test_apt_secenekleri.py apt seçenekleri (varsayılan kapalı): kademeli (phased) güncellemeler dahil upgrade (dist-upgrade değil) ve yalnızca Debian'da apt-listbugs (kanca -y, apt'yi bloklamaz)
test_lynis_son_kalemler.py Postfix SMTP banner (yalnızca postfix kuruluysa) ve /proc hidepid=2 (grup, logind drop-in, fstab, yeniden bağlama koşulu)
test_release_publish.sh scripts/release-publish.sh: --dry-run, ret koşulları (kirli ağaç, CI, HEAD, Release var, Python), gerçek imza ile tam koşu, sahte gh ile özet doğrulaması
test_release_script.sh scripts/release.sh: gerçek imzalama/doğrulama, reddedilme senaryoları
test_repo_hygiene.sh, test_ip_addresses.py Anahtar/token/IP sızıntısı, paket içeriği

CI ayrıca Python 3.12/3.13/3.14'te hash'li kurulumu dener ve gerçek bir Linux'ta (linux-smoke) harden.yml --check çalıştırır.

Sınır: CI canlı sunucu testi yerine geçmez; firewall/SSH değişiklikleri uygulanmaz (runner'ın kendi bağlantısını keserdi). Golden dosyaları bilerek değiştirirseniz: UPDATE_GOLDEN=1 python3 -I test/test_templates.py ve farkı PR'da inceleyin.

Kökeni ve nasıl geliştirildi

Bu proje, aynı bakımcının eski kabuk betiği tabanlı Proxmox sertleştirme çalışmasından (proxmoxhardeningv2.1.0-2, v2.1.0, Ağustos 2025) çıkmıştır: fikirler ve kapsam Ansible rollerine çevrilmiş, Ubuntu 26.04 için genişletilmiştir. Eski betik burada kullanılmaz ve bakımı yapılmaz.

Bu paket, sshpocket içinde bir bileşen olarak çalıştırılmak üzere tasarlanmıştır (component.yml / component.json bildirimi, imzalı sürüm paketi, SSHPOCKET_PROGRESS ilerleme satırları ve bulgular.tsv çıktısı onun içindir). ansible-playbook ile tek başına da kullanılabilir.

Kod, test ve belgeler yapay zekâ desteğiyle (Claude) yazılmıştır; her değişikliği bakımcı inceler, sertleştirmenin davranışı gerçek VM'lerde ölçülür (docs/verification-log.md). Yine de her sertleştirme gibi önce test sunucusunda deneyin.

Lisans

MIT, bkz. LICENSE. Kullanım sorumluluğu size aittir: sertleştirme erişimi kesebilir; önce test sunucusunda deneyin.

About

Ansible-based Linux server hardening (Ubuntu 26.04 first, extensible)

Topics

Resources

Contributing

Security policy

Stars

2 stars

Watchers

1 watching

Forks

Releases

Packages

Used by

Contributors

Languages