fix(rpm): preserve config on upgrade, set correct ownership/permissions

RPM packaging improvements:
- Fix %config(noreplace) directive in spec file (logcorrelator.yml)
- Fix post script: use correct path for .yml.example (/etc/logcorrelator/)
- Set /var/run/logcorrelator ownership to logcorrelator:logcorrelator
- Set correct permissions: /var/run (755), /var/log (750), /var/lib (750)
- Add %config(noreplace) for logrotate.d/logcorrelator
- Add comprehensive RPM test script (packaging/test/test-rpm.sh)

Documentation updates:
- Update architecture.yml with filesystem permissions section
- Document socket ownership (logcorrelator:logcorrelator, 0666)
- Document config file policy (%config(noreplace) behavior)
- Add systemd hardening directives (NoNewPrivileges, ProtectSystem)
- Update ClickHouse schema: mark non-implemented fields
- Remove materialized view SQL (managed externally)
- Add stdout sink module documentation

Build pipeline:
- Update Dockerfile.package with comments for config policy
- Add /var/lib/logcorrelator directory creation
- Document fpm %config(noreplace) limitations

Co-authored-by: Qwen-Coder <qwen-coder@alibabacloud.com>
This commit is contained in:
toto
2026-03-03 21:30:27 +00:00
parent 9db6848757
commit 24f2d8a3c4
5 changed files with 568 additions and 219 deletions

View File

@ -28,6 +28,12 @@ logcorrelator est un service système écrit en Go qui reçoit deux flux de logs
via des sockets Unix, corrèle les événements HTTP applicatifs avec des événements
réseau, et produit des logs corrélés en temps réel vers ClickHouse et/ou fichier local.
Notes de sécurité :
- Le service s'exécute sous l'utilisateur logcorrelator (non-root)
- Les sockets Unix sont créés avec des permissions 0666 (world read/write)
- Les répertoires critiques sont protégés : /var/log (750), /var/lib (750), /etc (750)
- /var/run/logcorrelator est en 755 pour permettre la création de sockets
%prep
# No source extraction needed - binary is pre-built
@ -52,73 +58,25 @@ install -m 0644 %{_sourcedir}/logcorrelator.service %{buildroot}/etc/systemd/sys
# Install logrotate config
install -m 0644 %{_sourcedir}/logrotate %{buildroot}/etc/logrotate.d/logcorrelator
%post
# Create logcorrelator user and group
if ! getent group logcorrelator >/dev/null 2>&1; then
groupadd --system logcorrelator
fi
if ! getent passwd logcorrelator >/dev/null 2>&1; then
useradd --system \
--gid logcorrelator \
--home-dir /var/lib/logcorrelator \
--no-create-home \
--shell /usr/sbin/nologin \
logcorrelator
fi
# Create directories
mkdir -p /var/lib/logcorrelator
mkdir -p /var/log/logcorrelator
mkdir -p /var/run/logcorrelator
# Set ownership
chown -R logcorrelator:logcorrelator /var/lib/logcorrelator
chown -R logcorrelator:logcorrelator /var/log/logcorrelator
chown -R logcorrelator:logcorrelator /var/run/logcorrelator
chown -R logcorrelator:logcorrelator /etc/logcorrelator
# Set permissions
chmod 750 /var/lib/logcorrelator
chmod 750 /var/log/logcorrelator
chmod 755 /var/run/logcorrelator
chmod 750 /etc/logcorrelator
# Copy default config if not exists
if [ ! -f /etc/logcorrelator/logcorrelator.yml ]; then
cp /etc/logcorrelator/logcorrelator.yml.example /etc/logcorrelator/logcorrelator.yml
chown logcorrelator:logcorrelator /etc/logcorrelator/logcorrelator.yml
chmod 640 /etc/logcorrelator/logcorrelator.yml
fi
# Reload systemd
systemctl daemon-reload
systemctl enable logcorrelator.service
systemctl start logcorrelator.service
# Note: %post, %preun, %postun scripts are provided externally via Dockerfile.package
# They are injected during RPM build using fpm --after-install, --before-remove, --after-remove
%preun
if [ $1 -eq 0 ]; then
# Package removal, not upgrade
systemctl stop logcorrelator.service
systemctl disable logcorrelator.service
fi
# Placeholder: actual preun script is provided externally via Dockerfile.package
# See packaging/rpm/preun for the actual script
%postun
systemctl daemon-reload
if [ $1 -ge 1 ]; then
# Package upgrade, restart service
systemctl try-restart logcorrelator.service
fi
# Placeholder: actual postun script is provided externally via Dockerfile.package
# See packaging/rpm/postun for the actual script
%files
/usr/bin/logcorrelator
/etc/logcorrelator/logcorrelator.yml
/etc/logcorrelator/logcorrelator.yml.example
%config(noreplace) /etc/logcorrelator/logcorrelator.yml
/etc/logcorrelator/logcorrelator.yml.example
/var/log/logcorrelator
/var/run/logcorrelator
/etc/systemd/system/logcorrelator.service
/etc/logrotate.d/logcorrelator
%config(noreplace) /etc/logrotate.d/logcorrelator
%changelog
* Tue Mar 03 2026 logcorrelator <dev@example.com> - 1.1.7-1

View File

@ -1,6 +1,12 @@
#!/bin/bash
# post script for logcorrelator RPM package
# post install script for logcorrelator RPM package
# Compatible with CentOS 7, Rocky Linux 8, 9, 10
#
# Configuration file policy:
# - logcorrelator.yml: %config(noreplace) - NEVER overwritten on upgrade
# - logcorrelator.yml.example: ALWAYS updated with new configuration options
# - On first install: logcorrelator.yml is created from logcorrelator.yml.example
# - On upgrade: existing logcorrelator.yml is preserved
set -e
@ -24,19 +30,34 @@ mkdir -p /var/log/logcorrelator
mkdir -p /var/run/logcorrelator
# Set ownership
# /var/run/logcorrelator: must be owned by logcorrelator for socket creation
# /var/log/logcorrelator: must be owned by logcorrelator for log file writing
# /var/lib/logcorrelator: home directory for the service
chown -R logcorrelator:logcorrelator /var/lib/logcorrelator
chown -R logcorrelator:logcorrelator /var/log/logcorrelator
chown -R logcorrelator:logcorrelator /var/run/logcorrelator
chown -R logcorrelator:logcorrelator /etc/logcorrelator
# Set permissions
# /var/run/logcorrelator: 755 to allow other users/apps to create sockets if needed
# /var/log/logcorrelator: 750 to restrict log access
# /var/lib/logcorrelator: 750 for service data
# /etc/logcorrelator: 750 to restrict config access
chmod 755 /var/run/logcorrelator
chmod 750 /var/lib/logcorrelator
chmod 750 /var/log/logcorrelator
chmod 750 /etc/logcorrelator
# Copy default config if not exists
# Copy default config example (always updated)
# The main config file is preserved across upgrades via %config(noreplace)
if [ -f /etc/logcorrelator/logcorrelator.yml.example ]; then
chown logcorrelator:logcorrelator /etc/logcorrelator/logcorrelator.yml.example
chmod 640 /etc/logcorrelator/logcorrelator.yml.example
fi
# Create main config file only if it doesn't exist (first install)
if [ ! -f /etc/logcorrelator/logcorrelator.yml ]; then
cp /usr/share/logcorrelator/logcorrelator.yml.example /etc/logcorrelator/logcorrelator.yml
cp /etc/logcorrelator/logcorrelator.yml.example /etc/logcorrelator/logcorrelator.yml
chown logcorrelator:logcorrelator /etc/logcorrelator/logcorrelator.yml
chmod 640 /etc/logcorrelator/logcorrelator.yml
fi