diff --git a/CHANGELOG.md b/CHANGELOG.md index ffa4924..b65bf4a 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -12,7 +12,8 @@ Biçim [Keep a Changelog](https://keepachangelog.com/) esas alınmıştır. - Eylemler: `durum` (salt okunur), `preview` (`--check --diff`), `apply` (`yes-no` onay, `preview` ön koşul), `geri_yukle`. - Saat dilimi (`utility_timezone`), sistem dili yalnızca `LANG` (`utility_locale`), NTP kaynakları (`utility_ntp_servers`, chrony `sources.d/utility.sources` drop-in'i; `chrony.conf`'a dokunulmaz). - Değiştirmeden önce `/var/backups/utility//` yedeği (dizin 0700, dosyalar 0600, `manifest.json`); yalnızca değişecek yollar. `geri_yukle` yalnızca katalogdaki dosyaları geri yazar. -- Ubuntu 26.04: `supported`. Debian 13: `planned` (playbook çalışır ve uyarır; sshpocket açmaz). +- Ubuntu 26.04 ve Debian 13: `supported` (Debian 13.7 tek gerçek VM'de, hardening'siz, auditd/ufw olmadan denendi). +- Proxmox VE koruması: `/usr/bin/pveversion` ya da `/etc/pve` varsa `--check` dahil durur (Proxmox VE 9 Debian 13 tabanlı olduğundan OS eşlemesinden geçerdi). Sahte `pveversion` ile LAB'da test edildi; gerçek Proxmox'ta denenmedi. - Release araçları (`scripts/release.sh`, `release-publish.sh`, `check-consistency.py`) linux-hardening'den/şablondan uyarlandı; LAB e2e (`test/e2e/lab.bats`) ve yedek betiği birim testleri. ### Denendi @@ -22,11 +23,14 @@ Biçim [Keep a Changelog](https://keepachangelog.com/) esas alınmıştır. - Gerçek Ubuntu 26.04 VM, ikinci tur: `tr_TR.UTF-8` ile `locale-gen` yolu, 2 NTP kaynağı, `ausearch -k time-change` kaydı (`/etc/localtime` CREATE/DELETE), ikinci `preview` `changed=0`, `geri_yukle` ✅. Geri yükleme üretilmiş locale'leri silmez (`locale -a` hâlâ `tr_TR.utf8`; beklenen). +- Gerçek Debian 13.7 VM (düz, hardening'siz): durum → preview → apply (chrony kuruldu, timesyncd kaldırıldı) → bağımsız doğrulama → ikinci preview `changed=0` → geri_yukle ✅; tırnaklı `LANG` doğru okundu, `LANGUAGE` satırı korundu. + ### Denenmedi -- Gerçek Debian 13 VM; sshpocket menüsünden uçtan uca; `locales` paketinin gerçek VM'de kurulum yolu (VM'de zaten kuruluydu); 3'ten fazla NTP kaynağı; ufw giden-reddi açıkken davranış. LAB'da chrony servisi başlamadığı için LAB'da NTP **senkronu** denenmedi. +- Gerçek Debian 13 VM'de ufw giden-reddi, hardening'li ve auditd'li Debian, Proxmox (gerçek); sshpocket menüsünden uçtan uca; `locales` paketinin gerçek VM'de kurulum yolu (VM'de zaten kuruluydu); 3'ten fazla NTP kaynağı; ufw giden-reddi açıkken davranış. LAB'da chrony servisi başlamadığı için LAB'da NTP **senkronu** denenmedi. ### Bilinen sınırlar - Ubuntu 26.04'te doğrudan `ansible-playbook --ask-become-pass` sudo-rs yüzünden zaman aşımına düşer: `-e ansible_become_exe=/usr/bin/sudo.ws` (sshpocket menüsünde doğrulanmadı). -- Debian 13'te chrony kurulumu, `systemd-timesyncd`'nin yerini alması ve `conf.d`/`sources.d` varlığı gerçek VM'de doğrulanmadı. +- NTP kaynakları eklenir, dağıtım varsayılanları silinmez/kapatılmaz; `prefer`/`minpoll` gibi seçenekler yok (v0.2 adayı). +- `durum`: chrony kurulu değilken `ntp_senkron=yes` görünebilir (timesyncd senkronu). - NTP kaynakları dağıtımın varsayılanlarının yanına eklenir; varsayılanları kaldırmaz. NTS desteklenmez. - Zamanlayıcılı geri alma yoktur; geri dönüş yalnızca `geri_yukle` (dosyalar) ile olur, paketler/üretilmiş locale'ler/servis durumu geri alınmaz. diff --git a/README.md b/README.md index cb40a0d..7d6193e 100644 --- a/README.md +++ b/README.md @@ -3,13 +3,15 @@ [sshpocket](https://github.com/syhgorath/sshpocket) paketi: sunucunun **saat dilimini**, **sistem dilini (`LANG`)** ve **NTP kaynaklarını (chrony)** menüden, önizleyerek, yedekleyerek ve onayla yönetir. Düşük riskli, dar kapsamlı bir pakettir: ssh, ufw ve PAM'a dokunmaz, erişimi kesmez. Bu yüzden `linux-hardening`'deki zamanlayıcılı geri alma güvenlik ağı **yoktur**; yerine önizleme, yedek ve idempotans vardır. -> **Durum: v0.1.0.** Aşağıdaki "Neyin denendiği" tablosu gerçeği söyler: Ubuntu 26.04 gerçek VM'de denendi, Debian 13 VM ve sshpocket menüsü denenmedi. +> **Durum: v0.1.0.** Aşağıdaki "Neyin denendiği" tablosu gerçeği söyler: Ubuntu 26.04 ve Debian 13.7 birer gerçek VM'de denendi (ikisi de tek VM); sshpocket menüsü ve Proxmox denenmedi. ## Profiller | Profil | Durum | Not | |---|---|---| -| `ubuntu-26.04` | supported | LAB'da (Docker konteyneri) uçtan uca denendi; **gerçek VM turu bekliyor** | -| `debian-13` | **planned** | Playbook çalışır ve uyarı verir, ama sshpocket bu profili açmaz. Konteynerde denendi; chrony/systemd-timesyncd etkileşimi **gerçek Debian 13 VM'inde doğrulanmadı** | +| `ubuntu-26.04` | supported | LAB'da ve gerçek VM'de (iki tur, linux-hardening'li) denendi | +| `debian-13` | supported | **Yalnızca Debian 13.7, tek gerçek VM'de, hardening'siz, auditd ve ufw olmadan** denendi (chrony kurulumu `systemd-timesyncd`'yi kaldırdı). Başka Debian 13 kurulumları, hardening'li/auditd'li/ufw'li Debian denenmedi | + +**Proxmox VE bilerek reddedilir:** Proxmox VE 9 Debian 13 tabanlıdır ve OS eşlemesinden geçerdi; bu yüzden ön kontrol `/usr/bin/pveversion` ya da `/etc/pve` varsa (`--check` dahil) "Proxmox VE v0.1 kapsam dışı" diye durur. Bu koruma sahte `pveversion` ile LAB'da test edildi, **gerçek Proxmox'ta denenmedi**. Kapsam dışı (v0.1): Proxmox VE, Raspberry Pi, hostname, apt kaynakları, NTS, `makestep`, `LC_*`. @@ -59,12 +61,18 @@ Bilinen etkileşimler (kaynak: Ubuntu 26.04 chrony dosyaları ve linux-hardening | Gerçek VM: ubuntutest (Ubuntu 26.04, linux-hardening uygulanmış; doğrudan playbook) | ✅ `durum` → `preview` (`degisen=2 plan=timezone+ntp`, auditd uyarısı görüldü) → `apply` (`changed` yazanlar yalnızca timezone+ntp) → bağımsız ssh doğrulaması → ikinci `preview` `changed=0` → `geri_yukle` (saat dilimi ve utility.sources geri geldi). Yedek dizin 0700, manifest 0600; `files/` boştu (değişen yollar sembolik bağ ve olmayan dosyalardı) | | Gerçek VM: ubuntutest, **ikinci tur** (`tr_TR.UTF-8` + 2 NTP kaynağı + saat dilimi) | ✅ `preview` `degisen=3 plan=timezone+locale+ntp`; `apply` `locale-gen` gerçekten çalıştı (`locales` zaten kuruluydu, kurulum yolu denenmedi); `/etc/default/locale` → `../locale.conf` bağı bozulmadı, LANG `locale.conf` içinde; `locale -a` `tr_TR.utf8`; chrony 2 utility kaynağı + Canonical NTS kaynakları; ikinci `preview` `changed=0`; `geri_yukle` `geri_yuklenen=6` (Etc/UTC, LANG=en_US.UTF-8, locale.gen satırı yorumda, utility.sources silindi). `ausearch -k time-change`: `/etc/localtime` CREATE/DELETE kaydı alındı. `preview` diff'inde `/etc/default/locale` için görünen "mode 0777→0644" sembolik bağın lstat izninden gelir, hedef zaten 0644 ve apply'da değişmedi | | Gerçek VM: **denenmeyenler** | `locales` paketinin kurulum yolu, 3'ten fazla NTP kaynağı, ufw giden-reddi açıkken davranış | -| **Gerçek VM: düz Debian 13** | **denenmedi** | +| Gerçek VM: debiantest (Debian 13.7, düz VM, doğrudan playbook; `sudo.ws` gerekmedi) | ✅ ön durum: chrony kurulu değil, `systemd-timesyncd` aktif, tırnaklı `LANG="en_US.UTF-8"` + `LANGUAGE` satırı. `durum` → `preview` (`degisen=4 plan=timezone+locale+paket+ntp`; apt diff'i chrony kurar, timesyncd'yi kaldırır) → `apply` (`sourcedir /etc/chrony/sources.d` denetimi geçti) → bağımsız doğrulama (Europe/Berlin, `tr_TR.UTF-8`, `/etc/default/locale` → `../locale.conf` bağı sağlam, chrony `^*` senkron) → ikinci `preview` `changed=0` (paket dahil) → `geri_yukle` (dosyalar döndü, `LANGUAGE` satırı korundu; chrony kurulu kaldı, timesyncd `rc`) | +| Gerçek VM: **Debian'da denenmeyenler** | ufw giden-reddi, hardening'li Debian, auditd'li Debian (`ausearch`), sshpocket menüsü, Proxmox | | linux-hardening ile birlikte | kısmen: yukarıdaki VM hardening'liydi (auditd aktif, `time-change` kaydı alındı); ufw giden-reddi denenmedi | | sshpocket menüsünden uçtan uca | **denenmedi** (kilit PR'ından sonra) | LAB'ın sınırları: chrony.service konteynerde başlamaz (`ConditionVirtualization=!container`), bu yüzden LAB'da NTP **senkronu** denenemez; yalnızca yapılandırma, paket ve idempotans denenir. Çekirdek paylaşılır; `--privileged` yalnızca bu LAB içindir. +## Sınırlar ve v0.2 için bilinenler +- NTP kaynakları dağıtımın varsayılanlarının **yanına eklenir**; mevcut kaynakları (Ubuntu `ubuntu-ntp-pools.sources`, Debian `chrony.conf` pool satırları) silmez ve devre dışı bırakmaz. Biçim denetimi yalnızca `host`, `server host`, `pool host` kabul eder. +- v0.2 adayları (kod yok): (a) yerel NTP için dağıtım varsayılan kaynaklarını devre dışı bırakma seçeneği, (b) `prefer`, `minpoll` gibi kaynak seçenekleri. +- `durum`: chrony kurulu değilken `ntp_senkron=yes` görünebilir, çünkü `timedatectl` `systemd-timesyncd`'nin senkronunu da sayar (`ntp_servis=inactive` ile birlikte okuyun). + ## Bilinen sorunlar - Ubuntu 26.04'te doğrudan `ansible-playbook --ask-become-pass` ile `Timeout (12s) waiting for privilege escalation prompt` alınır (sudo-rs): `-e ansible_become_exe=/usr/bin/sudo.ws` ekleyin. sshpocket menüsünün bunu kendi çözüp çözmediği doğrulanmadı. Ayrıntı: [docs/vm-turu.md](docs/vm-turu.md). diff --git a/component.json b/component.json index 9af35e9..077992a 100644 --- a/component.json +++ b/component.json @@ -3,13 +3,13 @@ "version": "0.1.0", "sshpocket_api": 1, "name": "Sunucu araçları: saat dilimi, locale, NTP", - "description": "Saat dilimini, sistem dilini (LANG) ve NTP kaynaklarını (chrony drop-in) önizleyerek, yedekleyerek ve onayla yönetir. Ubuntu 26.04; Debian 13 planlanmış.", + "description": "Saat dilimini, sistem dilini (LANG) ve NTP kaynaklarını (chrony drop-in) önizleyerek, yedekleyerek ve onayla yönetir. Ubuntu 26.04 ve Debian 13; Proxmox VE kapsam dışı.", "runner": "ansible", "requires": { "control": { "python": ">=3.12", "packages": ["ansible-core"] }, "target": { "python": ">=3.9" } }, "inventory_group": "utility", "profiles": [ { "id": "ubuntu-26.04", "status": "supported" }, - { "id": "debian-13", "status": "planned" } + { "id": "debian-13", "status": "supported" } ], "actions": { "durum": { diff --git a/docs/vm-turu.md b/docs/vm-turu.md index 1f88cd6..1c90d33 100644 --- a/docs/vm-turu.md +++ b/docs/vm-turu.md @@ -38,7 +38,7 @@ ssh KULLANICI@IP 'timedatectl; grep ^LANG= /etc/default/locale; cat /etc/chrony/ ``` (Menüden değil doğrudan çalıştırıldığı için sshpocket'in onay/ön koşul kapıları yoktur.) -## Debian 13'te özellikle bakılacaklar (doğrulanana kadar `planned`) +## Debian 13'te bakılacaklar (13.7 tek VM'de doğrulandı: chrony kurulumu timesyncd'yi kaldırdı, `sourcedir` var) - `apt` ile chrony kurulumu `systemd-timesyncd`'yi kaldırıyor/devre dışı bırakıyor mu? (`systemctl status systemd-timesyncd chrony` önce/sonra) - `/etc/chrony/chrony.conf` içinde `sourcedir /etc/chrony/sources.d` var mı? (yoksa apply bilerek durur) - `chronyc sources` utility kaynağını gösteriyor mu; `timedatectl show -p NTPSynchronized` `yes` oluyor mu? diff --git a/roles/common/defaults/main.yml b/roles/common/defaults/main.yml index 6ff344e..e18a414 100644 --- a/roles/common/defaults/main.yml +++ b/roles/common/defaults/main.yml @@ -4,6 +4,6 @@ utility_backup: true # false = değiştirmeden önce yedek ALMA utility_restore_from: "" # geri_yukle: yedek adı (örn. 20261105T101500Z); boş = en son yedek # İç değerler -utility_supported_os: { Ubuntu: ["26.04"] } -utility_planned_os: { Debian: ["13"] } # component.json'da planned: playbook çalışır ama doğrulanmadı (uyarı) +utility_supported_os: { Ubuntu: ["26.04"], Debian: ["13"] } +utility_planned_os: {} # component.json'da planned: playbook çalışır ama doğrulanmadı (şu an boş) utility_backup_root: /var/backups/utility diff --git a/roles/common/tasks/preflight.yml b/roles/common/tasks/preflight.yml index 8d02922..3110aa0 100644 --- a/roles/common/tasks/preflight.yml +++ b/roles/common/tasks/preflight.yml @@ -11,16 +11,24 @@ (utility_supported_os.get(utility_os_name, []) + utility_planned_os.get(utility_os_name, [])) | select('in', [utility_os_version, utility_os_version.split('.')[0]]) | list | length > 0 fail_msg: >- - utility: desteklenmeyen sistem ({{ utility_os_name }} {{ utility_os_version }}). v0.1 yalnızca Ubuntu 26.04 destekler - (Debian 13 planlanmış, doğrulanmadı). Proxmox VE ve Raspberry Pi kapsam dışıdır. + utility: desteklenmeyen sistem ({{ utility_os_name }} {{ utility_os_version }}). v0.1 yalnızca Ubuntu 26.04 ve Debian 13 destekler. + Proxmox VE ve Raspberry Pi kapsam dışıdır. quiet: true -- name: Warn that Debian 13 is not verified - ansible.builtin.debug: - msg: >- - UYARI (utility): {{ utility_os_name }} {{ utility_os_version }} doğrulanmış profil değil (planned). Chrony kurulumu, systemd-timesyncd'nin - yerini alması ve conf.d/sources.d varlığı gerçek bir Debian 13 üzerinde denenmedi; sonucu elle kontrol edin. - when: utility_planned_os.get(utility_os_name, []) | select('in', [utility_os_version, utility_os_version.split('.')[0]]) | list | length > 0 +# Proxmox VE 9 Debian 13 tabanlıdır ve ansible_facts'te "Debian" görünür: OS eşlemesi onu yakalayamaz. --check'te de çalışır (yalnızca okur). +- name: Detect Proxmox VE + ansible.builtin.stat: + path: "{{ item }}" + loop: [/usr/bin/pveversion, /etc/pve] + register: utility_pve + check_mode: false + +- name: Refuse Proxmox VE + ansible.builtin.assert: + that: utility_pve.results | selectattr('stat.exists') | list | length == 0 + fail_msg: >- + utility: Proxmox VE tespit edildi (/usr/bin/pveversion ya da /etc/pve var). Proxmox VE v0.1 kapsam dışıdır; hiçbir şey değiştirilmedi. + quiet: true - name: Validate variable shapes ansible.builtin.assert: diff --git a/roles/ntp/tasks/apply.yml b/roles/ntp/tasks/apply.yml index fa8e3e3..40d1946 100644 --- a/roles/ntp/tasks/apply.yml +++ b/roles/ntp/tasks/apply.yml @@ -20,7 +20,7 @@ ansible.builtin.fail: msg: >- utility: /etc/chrony/chrony.conf 'sourcedir /etc/chrony/sources.d' satırını içermiyor; utility chrony.conf'a dokunmadığı için - drop-in uygulanamaz (Ubuntu 26.04'te bu satır vardır; Debian 13'te doğrulanmadı). + drop-in uygulanamaz (Ubuntu 26.04 ve Debian 13'te bu satır vardır). when: not ansible_check_mode and utility_ntp_sourcedir.rc != 0 - name: Ensure sources.d exists diff --git a/test/e2e/lab.bats b/test/e2e/lab.bats index ac30eb6..084a061 100644 --- a/test/e2e/lab.bats +++ b/test/e2e/lab.bats @@ -133,4 +133,21 @@ v2() { cat "$BATS_FILE_TMPDIR/v2path"; } [ "$status" -ne 0 ] } +@test "Proxmox VE reddedilir (sahte pveversion), --check dahil; hiçbir şey değişmez" { + lab sh -c 'touch /usr/bin/pveversion' + run "$RUN" preview -e "@$(v1)" --check --diff + [ "$status" -ne 0 ] + [[ "$output" == *"Proxmox VE tespit edildi"* ]] || false + run "$RUN" apply -e "@$(v1)" + [ "$status" -ne 0 ] + [[ "$output" == *"Proxmox VE tespit edildi"* ]] || false + lab sh -c 'rm /usr/bin/pveversion; mkdir /etc/pve' + run "$RUN" apply -e "@$(v1)" + [ "$status" -ne 0 ] + [[ "$output" == *"Proxmox VE tespit edildi"* ]] || false + lab sh -c 'rmdir /etc/pve' + run "$RUN" preview -e "@$(v1)" --check + [ "$status" -eq 0 ] +} + teardown_file() { "$BATS_TEST_DIRNAME/lab/down.sh" --clean >&3 || true; }