Hash-zəncirinin audit davamlılığını necə təmin etdiyi (EU AI Act maddə 12)
EU AI Act-ın 12-ci maddəsi yüksək risk AI sistemlərindən «avtomatik yaradılan hadisə qeydləri» tələb edir, saxtakarlığa qarşı dayanıqlı. AZTender Audit bunu hash-zənjirli append-only log vasitəsilə həyata keçirir: hər qeyd əvvəlkinin SHA-256 hashini ehtiva edir və Postgres trigger fiziki olaraq UPDATE/DELETE-i qadağan edir. Burada — bu necə işləyir və necə yoxlanılır.
EU AI Act maddə 12 nə deyir (qısaca)
«Yüksək risk AI sistemləri sistemin ömrü boyu hadisələrin («loglar») avtomatik qeydiyyatına texniki olaraq imkan verməlidir. Loglar sistemin işinin nəzərdə tutulan məqsədə uyğun dərəcədə izlənilməsini təmin etməlidir.»
Açar söz — «izlənilmə». Tənzimləyici aylarla/illərlə sonra sistemin istənilən qərarını bərpa edə bilməlidir. Bu o deməkdir ki, logları sonradan redaktə etmək və ya silmək olmaz — hətta verilənlər bazası administratoru da.
Arxitektura: append-only + hash chain + Postgres trigger
1. Append-only cədvəl sxemi:
audit_logs cədvəlində sahələr: id, tenant_id, sequence_number (tenant başına monotonik artan), actor_email, action, entity_type, changes (jsonb), timestamp, previous_hash, record_hash.
2. Hər qeyd əvvəlkini hashlayır:
INSERT zamanı record_hash = SHA256(prev_record_hash || JSON(bu_qeydin_payload-u)) hesablanır. previous_hash sahəsi əvvəlki qeydin hashini saxlayır. Əgər kimsə zəncirin ortasındakı bir qeydi dəyişərsə — növbəti previous_hash əvvəlki qeydin yeni record_hash-i ilə uyğun gəlməyəcək. Bir SQL sorğusu ilə aşkarlanır.
3. Postgres trigger UPDATE və DELETE-i bloklayır:
CREATE FUNCTION raise_audit_immutable() RETURNS trigger AS $$
BEGIN
RAISE EXCEPTION '%s is append-only (TG_OP=%s)', TG_TABLE_NAME, TG_OP;
END $$ LANGUAGE plpgsql;CREATE TRIGGER audit_logs_no_update BEFORE UPDATE OR DELETE ON audit_logs FOR EACH ROW EXECUTE FUNCTION raise_audit_immutable(); ```
Bu trigger VERİLƏNLƏR BAZASI SƏVİYYƏSİNDƏ işləyir — proqram kompromis edilsə belə, heç bir UPDATE audit_logs və ya DELETE FROM audit_logs keçməyəcək. Yalnız Postgres-ə root giriş + DROP TRIGGER + backup-ın bərpası nəyisə dəyişə bilər — və hər belə cəhd sistem loglarında öz izini buraxır.
Zəncirin bütövlüyünü necə yoxlamaq (1 SQL sorğu)
Auditor istənilən vaxt read-only sorğu icra edə bilər:
WITH chain AS (
SELECT sequence_number, record_hash, previous_hash,
LAG(record_hash) OVER (ORDER BY sequence_number) AS prev_actual
FROM audit_logs
)
SELECT COUNT(*) FILTER (WHERE previous_hash IS DISTINCT FROM prev_actual
AND sequence_number > 1) AS broken_links
FROM chain;
Əgər broken_links = 0 — zəncir bütövdür. Əgər > 0 — bir yerdə müdaxilə baş verib.
Bütün cari AZTender Audit yerləşdirmələrində broken_links = 0 hər 24 saatdan bir avtomatik.
Niyə bu tənzimləyici üçün vacibdir (HP / IFI)
Hash-zənciri olmadan loglar sadəcə mətn qeydləridir. Onları UPDATE audit_logs SET action='confirm' WHERE id=... vasitəsilə redaktə etmək olar və oxuma anında iz «düzgün» görünər.
Hash-zəncirilə belə düzəliş dərhal növbəti qeydi sındırır. Tənzimləyici snapshot və ya backup vasitəsilə «hər şeyin necə olduğunu» bərpa edə bilər və uyğunsuzluğu müqayisə edə bilər. Bu sadəcə «inanca razılıq» deyil, qeyri-mükəmməllik sübutu verir.
Hesablama Palatası və oxşar audit institutları üçün bu kritikdir — audit nəticələri məhkəmə, parlament yoxlaması, donor due diligence-i keçməlidir. Hash-chain — EU AI Act-ın tələb etdiyi və Almaniyada (BSI), Estoniyada (X-Road), Finlandiyada (Suomi.fi) PARALEL inkişaf etdirilən texniki standartdır.
Hash-zəncirinin TƏMİN ETMƏDİYİ
- ❌ Lap əvvəldə YALAN məlumat daxil edilməsindən qorumur. Əgər operator şüurlu şəkildə
actor_email='audit-team@hp.gov.az'daxil edib öz adını əvəz edibsə — bu yazılacaq və hashlanacaq. Hash-chain POSTFAKTUM modifikasiyadan qoruyur, ilkin saxtakarlıqdan deyil.
- ❌ Verilənlər bazasının tam silinməsindən qorumur (DROP DATABASE). Bu backuplarla həll olunur.
- ❌ AI qərarlarını «düzgün» etmir — sadəcə təmin edir ki, AI hansı qərarı qəbul etsə də, dəyişməz şəkildə yazılır.
- ✅ Bir şeyi təmin edir: qeyd yazıldıqdan sonra heç kim, sysadmin-lər, developerlər, təchizatçı kimi AZTender daxil olmaqla, onu proqram vasitəsilə dəyişə bilməz. İstənilən modifikasiya Postgres-ə root giriş tələb edir və sistemdə izlər buraxır.
Metodologiya
İcra: Postgres triggerləri (migration 0019_procurement_notifications + əvvəllər). Hash funksiyası: JSON-serializasiya olunmuş payload qeydində SHA-256. Sequence number tenant başına monotonikdir (Postgres sequence istifadə edir). Saxlama: tenant Row-Level Security policies vasitəsilə izolyasiya olunub. Audit log-un öz auditi: UPDATE/DELETE cəhdi Postgres loglarına (pg_log) yazılır.
Təkrar oluna bilmə üçün SQL
-- Re-verify the integrity of the audit chain (run any time, read-only):
WITH chain AS (
SELECT
sequence_number,
record_hash,
previous_hash,
LAG(record_hash) OVER (PARTITION BY tenant_id ORDER BY sequence_number) AS prev_actual
FROM audit_logs
)
SELECT
COUNT(*) AS total_records,
COUNT(*) FILTER (WHERE previous_hash IS DISTINCT FROM prev_actual
AND sequence_number > 1) AS broken_links
FROM chain;
-- broken_links MUST equal 0 — any non-zero result means the chain
-- was tampered with at the storage layer (which would require root
-- DB access bypassing the row-level trigger; recovery requires the
-- backup chain).Sitat
AZTender Audit Methodology, Hash-chained audit log per EU AI Act Art. 12, accessed 2026-05-24. https://aztender.ai/data-storytelling/hash-chained-audit-log-eu-ai-act
Müəllif
AZTender komandası
EKM Global Consulting GmbH · Baden-Baden
Bu məqalə üzrə suallar?
Müəlliflərə yazın — 1 iş günü ərzində cavablandırırıq. Konkret CPV kateqoriyası və ya təşkilatın dərinləşdirilmiş auditi sorğusu — eyni kanal.
audit@aztender.ai