Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
10 changes: 7 additions & 3 deletions CHANGELOG.md
Original file line number Diff line number Diff line change
Expand Up @@ -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/<UTC tarih>/` 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
Expand All @@ -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.
16 changes: 12 additions & 4 deletions README.md
Original file line number Diff line number Diff line change
Expand Up @@ -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_*`.

Expand Down Expand Up @@ -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).

Expand Down
4 changes: 2 additions & 2 deletions component.json
Original file line number Diff line number Diff line change
Expand Up @@ -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": {
Expand Down
2 changes: 1 addition & 1 deletion docs/vm-turu.md
Original file line number Diff line number Diff line change
Expand Up @@ -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?
Expand Down
4 changes: 2 additions & 2 deletions roles/common/defaults/main.yml
Original file line number Diff line number Diff line change
Expand Up @@ -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
24 changes: 16 additions & 8 deletions roles/common/tasks/preflight.yml
Original file line number Diff line number Diff line change
Expand Up @@ -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:
Expand Down
2 changes: 1 addition & 1 deletion roles/ntp/tasks/apply.yml
Original file line number Diff line number Diff line change
Expand Up @@ -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
Expand Down
17 changes: 17 additions & 0 deletions test/e2e/lab.bats
Original file line number Diff line number Diff line change
Expand Up @@ -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; }