TM-ADR-0031¶
| Property | Value |
|---|---|
| ADR ID | TM-ADR-0031 |
| Title | Granular Least-Privilege NTFS Volume Access Controls for Non-Admin Windows Containers, Configuration Namespace Alignment, and Diagnostic Runtime Integrity |
| Project | Tomcat Monitoring |
| Section | Windows Container Security, Least-Privilege Storage ACLs, Multi-OS Runtime Isolation, and Toolchain Integrity |
| Status | Accepted |
| Date | 2026-09-18 |
π Overview¶
Dokumen keputusan arsitektur (Architecture Decision Record β ADR) ini menetapkan standarisasi:
1. Penerapan Hak Akses NTFS Berbasis Least Privilege pada Named Volume Windows Containers: Menolak penggunaan jalan pintas yang tidak aman (seperti menjalankan kontainer sebagai ContainerAdministrator atau memberikan hak FullControl pada host), dan secara formal mewajibkan pemberian hak akses granular Modify ((OI)(CI)M) kepada grup BUILTIN\Users khusus pada subdirektori data volume aplikasi (C:\ProgramData\docker\volumes\<name>\_data) dan host bind mounts (spool/, data/).
2. Penyelarasan Namespace Direktori Konfigurasi Kontainer Windows (tm_home): Menyelesaikan inkonsistensi path antara Docker volume bind mount dan Dockerfile ENTRYPOINT pada komponen diagnostic-service dan tm-agent di Windows NanoServer agar sepenuhnya patuh terhadap standarisasi TM-ADR-0030 (C:\tm_home\config\diagnostic-service\application.json dan C:\tm_home\spool).
3. Integritas Toolchain & Dependensi Runtime SQLite Bawaan (Built-in node:sqlite Standard Library): Mengukuhkan arsitektur zero external C++ native build dependencies pada tomcat-diagnostic-service yang mengandalkan modul bawaan resmi Node.js standard library (node:sqlite / DatabaseSync), serta menetapkan standar base image kontainer minimal Node.js 22 LTS (v22.14.0+ / node:22-alpine) di seluruh platform Linux dan Windows.
π Context & Analisis Temuan (Root Cause Analysis)¶
Pada siklus pengujian multi-node Zero-Touch Deployment ke target host cloud (AWS EC2 Amazon Linux 2023 dan Windows Server 2022 Datacenter), sistem deployment mengidentifikasi tiga kendala eksekusi runtime:
1. Masalah Hak Akses NTFS pada Named Volumes Windows Containers (Access Denied)¶
- Gejala: Kontainer
mailpitdanprometheuspada host Windows (aws-ec2-win-01danaws-ec2-win-02) mengalami statusrestartingterus menerus. - Log Bukti:
- Mailpit:
level=fatal msg="[db] open C:\data\mailpit.db: Access is denied." - Prometheus:
err="open C:\\prometheus\\data\\queries.active: Access is denied." panic: Unable to create mmap-ed active query log - Akar Masalah:
Kontainer Windows NanoServer secara default dieksekusi di bawah akun non-root terbatas (unprivileged) yaitu
ContainerUser. Namun, engine Docker Windows membuat direktori penyimpanan named volume di host (C:\ProgramData\docker\volumes\<volume_name>\_data) dengan Access Control List (ACL) default yang hanya mengizinkanBUILTIN\AdministratorsdanNT AUTHORITY\SYSTEM. Akibatnya,ContainerUsertidak memiliki izin menulis (Write/Modify) ke storage volumenya sendiri. - Evaluasi Keamanan:
Mengubah kontainer untuk dijalankan sebagai
--user ContainerAdministratormelanggar prinsip Least Privilege (NIST SP 800-190). Oleh karena itu, solusi yang benar adalah mempertahankan akunContainerUserdi dalam kontainer dan menerapkan ACLBUILTIN\Users:Modifysecara presisi hanya pada direktori volume data terkait (padanan darichown/chmodpada Linux).
2. Inkonsistensi Path Konfigurasi Diagnostic Service pada Windows NanoServer¶
- Gejala: Kontainer
diagnostic-servicepada host Windows gagal memulai dengan statusRestartingdan logTomcat Diagnostic Service startup failed: ConfigurationError. - Akar Masalah:
Playbook Ansible me-mount volume konfigurasi ke
C:\tm_home\config\diagnostic-servicesesuai TM-ADR-0030, namun berkas Dockerfile legacydocker/windows/diagnostic-service.Dockerfilemengeksekusi instruksiENTRYPOINTyang mencari berkas diC:/monitoring/config/diagnostic-service/application.json.
3. Ketidaksesuaian Versi Base Image Node.js Linux terhadap Modul node:sqlite¶
- Gejala: Service
diagnostic-servicedi Linux mengalami kegagalan readiness probe padahttps://127.0.0.1:8443/health. - Akar Masalah:
Source code
sqlite-repository.jsmenggunakan modul bawaannode:sqlite(DatabaseSync), yang dirilis sejak Node.js v22.5.0+. Dockerfile Linux lama menarik base imagenode:20-alpine, sehingga Node.js melempar errorERR_UNKNOWN_BUILTIN_MODULE.
π‘ Keputusan Arsitektur (Architectural Decisions)¶
WINDOWS CONTAINER LEAST-PRIVILEGE SECURITY ARCHITECTURE
βββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββ
β Windows Host OS (NTFS Filesystem Storage) β
β C:\ProgramData\docker\volumes\ β
β βββ mailpit_data\_data βββΊ ACL: BUILTIN\Users:(OI)(CI)M [Modify Allowed] β
β βββ prometheus_data\_data βββΊ ACL: BUILTIN\Users:(OI)(CI)M [Modify Allowed] β
β βββ alertmanager_data\_data βββΊ ACL: BUILTIN\Users:(OI)(CI)M [Modify Allowed] β
β βββ diagnostic_data\_data βββΊ ACL: BUILTIN\Users:(OI)(CI)M [Modify Allowed] β
βββββββββββββββββββββββββββββββββββββββββββββ¬ββββββββββββββββββββββββββββββββββββββββββββββ
β Volume Mount (Non-Root Isolation)
βββββββββββββββββββββββββββββββββββββββββββββΌββββββββββββββββββββββββββββββββββββββββββββββ
β Windows NanoServer Containers (Execution Context: ContainerUser / Non-Admin) β
β β’ Mailpit Container βββΊ Writes to C:\data\mailpit.db [SUCCESS] β
β β’ Prometheus Container βββΊ Writes to C:\prometheus\data\queries [SUCCESS] β
β β’ Diagnostic Service Container βββΊ Reads C:\tm_home\config\application.json [SUCCESS]β
βββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββ
1. Granular NTFS ACL Enforcement pada Volume Host¶
- Tetap mempertahankan isolasi non-root (
ContainerUser) pada semua Dockerfile Windows NanoServer. - Pada tahap Host Preparation (
role_host_prep/tasks/windows/network_and_volumes.yml), automasi Ansible secara deterministik memastikan direktori_datapada setiap named volume (prometheus_data,alertmanager_data,mailpit_data,spool_data,diagnostic_data,tomcat_logs) memiliki aturan ACL: - Identity:
BUILTIN\Users - Rights:
Modify(Read, Write, Execute, Delete Subitems) - Inheritance:
ContainerInherit, ObjectInherit((OI)(CI)) - Propagation:
None - Akses Administratif: Tidak memberikan hak
FullControl(mencegah modifikasi ownership dan security descriptors).
2. Standarisasi Universal Path Namespace C:\tm_home¶
- Seluruh Dockerfile Windows (
diagnostic-service.Dockerfile,tm-agent.Dockerfile) distandarisasi untuk menggunakan prefixC:\tm_homesebagai path kerja dan volume mount point. - Berkas konfigurasi runtime Windows
application.win.jsonmendefinisikan lokasi sertifikat, secret bearer token, target allowlist, dan spool secara eksplisit di bawah namespaceC:\tm_home\.
3. Standarisasi Engine & Image Node.js 22 LTS¶
- Standarisasi Linux Base Image pada
docker/linux/diagnostic-service.Dockerfilemenggunakannode:22-alpine. - Standarisasi Windows Provisioner pada
roles/role_container_stack/tasks/windows/build_images.ymlmenggunakannode-v22.14.0-win-x64resmi darinodejs.org. - Menjamin keterisolasian modul
node:sqlitetanpa membutuhkan instalasi toolchain compiler C/C++ native (node-gyp,python,gcc,Visual C++ Build Tools).
π Konsekuensi & Bukti Verifikasi (Verification Evidence)¶
Dampak Positif:¶
- Keamanan Maksimal (Defense-in-Depth): Tidak ada kontainer yang dijalankan sebagai akun administrator/root pada Windows maupun Linux.
- Resiliensi Operasional Tinggi: Kontainer
mailpit,prometheus,alertmanager, dandiagnostic-servicelangsung berstatusUp (healthy)tanpa access denied atau crash loops. - Portabilitas Multi-OS Murni: Build context image dan volume bind-mount berjalan identik dan dapat diproduksi ulang secara deterministik di multi-platform.
Bukti Verifikasi Lapangan (Live Target Node Verification):¶
- Windows Target Node (
aws-ec2-win-01=184.194.25.77): diagnostic-service-win:latestβ Up (0.0.0.0:8443->8443), probehttps://172.22.229.173:8443/health/livemerespons HTTP200({"status":"UP"}).prometheus-win:latestβ Up (0.0.0.0:9090->9090), probehttp://172.22.237.18:9090/-/readymerespons HTTP200(Prometheus Server is Ready.).mailpit-win:latestβ Up (0.0.0.0:1025->1025, 0.0.0.0:8025->8025), probehttp://172.22.229.10:8025/api/v1/messagesmerespons HTTP200.alertmanager-win:latestβ Up (0.0.0.0:9093->9093).-
tm-agent-win:latestβ Up. -
Linux Target Node (
aws-ec2-lin-01=3.82.132.6): - Seluruh 5 container service (
diagnostic-service,tomcat-jmx-exporter,prometheus,alertmanager,mailpit) berstatus Up and Healthy.