# ============================================================================= # /etc/systemd/system/sht30-sensor.service # Raspberry Pi 4 부팅 시 온습도(SHT30) 모니터를 자동 실행하는 서비스 (2번 모듈) # # 설치 방법: # sudo cp systemd/sht30-sensor.service /etc/systemd/system/ # sudo systemctl daemon-reload # sudo systemctl enable sht30-sensor # sudo systemctl start sht30-sensor # sudo systemctl status sht30-sensor # # ※ WorkingDirectory/ExecStart 경로는 실제 배치 경로에 맞게 수정. # 아래는 /home/pi/raspberry_pi4_sht30 에 배치한 경우 기준. # ============================================================================= [Unit] Description=SHT30 Temp/Humidity Sensor Monitor v2 (Pi 4, Module 2) After=network-online.target Wants=network-online.target [Service] Type=simple User=pi Group=pi # /dev/i2c-1 접근에 i2c 그룹 필요 SupplementaryGroups=i2c WorkingDirectory=/home/pi/raspberry_pi4_sht30 ExecStart=/home/pi/raspberry_pi4_sht30/venv/bin/python sht30_sensor.py Restart=always RestartSec=10 StandardOutput=journal StandardError=journal SyslogIdentifier=sht30-sensor # 환경 변수 Environment=PYTHONUNBUFFERED=1 # 프로세스 전용 /tmp 격리 PrivateTmp=true # ── 샌드박싱(하드닝) — 데몬 침해 시 root 승격·파일시스템 오염을 차단 ────────── # User=pi 는 NOPASSWD sudo 계정이므로 NoNewPrivileges 로 setuid(sudo) 승격 경로를 막는다. NoNewPrivileges=true # 루트파일시스템 읽기전용 + /var/log 만 쓰기 허용(로그 로테이션 포함). /tmp 는 PrivateTmp. ProtectSystem=strict ReadWritePaths=/var/log # /home 는 읽기전용(자기 코드/config_local.py 읽기만; 쓰기·타 계정 홈 접근 차단). ProtectHome=read-only ProtectKernelModules=true ProtectKernelTunables=true ProtectControlGroups=true RestrictSUIDSGID=true LockPersonality=true RestrictRealtime=true # HTTPS(POST)+로컬소켓(DNS/journal)만. I2C 는 /dev/i2c-1 char (소켓 아님)라 무관. # AF_NETLINK 필수 — glibc getaddrinfo/NSS 가 로컬주소 열거에 netlink 를 쓴다 # (빼면 DNS 해석이 간헐 실패 → 서버 POST 불가). AF_INET/6=HTTPS, AF_UNIX=DNS·journal. RestrictAddressFamilies=AF_INET AF_INET6 AF_UNIX AF_NETLINK # ※ PrivateDevices 는 쓰지 않는다 — /dev/i2c-1 이 숨겨져 센서 접근 불능. # 재시작 상한 (10분 내 5번 실패 시 중단) StartLimitBurst=5 StartLimitInterval=600s [Install] WantedBy=multi-user.target