대상 OS: Debian 12 (bookworm)

cron과 systemd timer는 운영 자동화의 핵심이지만, 보안 관점에서는 “주기적으로 실행되는 코드(종종 root)”입니다. 즉, 한 번만 뚫리면 “매일/매시간 자동 실행되는 취약점”이 되기 쉬워요. 아래는 Debian 12 기준으로, 크론/타이머가 보안 사고로 이어지는 대표 패턴과 최소 체크리스트입니다.

1) 우선 전체 목록을 ‘한 번에’ 모은다(크론 + systemd timers)

보안 점검의 첫 단계는 “어디에 무엇이 돌아가는지”를 한 화면에 모으는 겁니다.

# 사용자 크론(현재 계정)
crontab -l 2>/dev/null || true

# root 크론(권한 필요)
sudo crontab -l 2>/dev/null || true

# 시스템 크론
ls -al /etc/cron.*
cat /etc/crontab

# systemd timers 전체
systemctl list-timers --all


2) 대표 취약 패턴 6가지(특히 root 작업에서 위험)

  • 상대 경로 실행 (예: cd /tmp; ./backup.sh)
  • PATH 의존 (예: tar, curl을 절대경로 없이 실행) → PATH 하이재킹 위험
  • world-writable 경로에 스크립트/출력 (예: /tmp, 공유 디렉터리) → 스크립트 변조/심볼릭 링크 공격
  • 외부 입력을 그대로 실행 (예: curl ... | sh, 원격에서 내려받아 실행)
  • 권한 과다(root로 모든 자동화 수행) → 침해 시 피해 범위 확대
  • 로그/에러 처리 부재 → 실패가 누적되다 한 번에 장애/보안 문제로 폭발


3) 체크리스트: “파일 권한 + 실행 문맥”부터 본다

크론/타이머가 실행하는 파일은 “수정 가능자”가 곧 “코드 실행권”입니다. 먼저 권한을 확인하세요.

# 예: /etc/cron.daily 아래 스크립트 권한/소유자 확인
sudo ls -al /etc/cron.daily

# 타이머/서비스가 실행하는 ExecStart 경로 확인(예시)
systemctl cat your-job.service 2>/dev/null || true

# 실제 스크립트 파일 권한 확인
sudo stat -c '%a %U:%G %n' /path/to/job.sh 2>/dev/null || true

# 상위 디렉터리까지 누가 쓸 수 있는지 확인(디렉터리 권한 중요)
namei -l /path/to/job.sh 2>/dev/null || true


4) 체크리스트: 크론 라인 자체를 ‘안전한 형태’로 바꾸는 습관

크론 라인은 짧지만, 안전하게 만들 수 있는 포인트가 많습니다.

권장 패턴

  • 절대 경로 사용(예: /usr/bin/rsync)
  • PATH를 직접 고정(크론 파일 상단 또는 라인 내)
  • 스크립트는 set -euo pipefail로 실패를 빨리 감지
  • 락 파일로 중복 실행 방지(flock)
# 예: /etc/cron.d/backup (예시)
# PATH 고정
PATH=/usr/sbin:/usr/bin:/sbin:/bin

# 중복 실행 방지 + 절대 경로
0 3 * * * root /usr/bin/flock -n /run/backup.lock /usr/local/sbin/backup.sh >>/var/log/backup.log 2>&1


5) 가능하면 cron보다 systemd timer를 쓰는 이유(보안/운영)

Debian 12에서는 systemd timer가 “실행 문맥”을 더 명확하게 통제하기 좋습니다.

  • User/Group로 권한 최소화
  • ProtectSystem, NoNewPrivileges 같은 샌드박싱 옵션 적용 가능
  • 로그가 journalctl에 남아 추적이 쉬움
# 예: 서비스 유닛 하드닝(예시)
# /etc/systemd/system/backup.service
# [Service]
# User=backup
# Group=backup
# ExecStart=/usr/local/sbin/backup.sh
# NoNewPrivileges=true
# PrivateTmp=true
# ProtectSystem=strict
# ProtectHome=true
# ReadWritePaths=/var/backups /var/log/backup.log


사례(현장에서 자주 겪는 상황)

  • root 크론이 /tmp에 결과 파일 생성 → 공격자가 심볼릭 링크를 만들어 민감 파일을 덮어쓰게 유도(권한 상승/파괴로 이어짐).
  • 백업 크론에 상대경로 사용 → 작업 디렉터리가 예상과 달라져 다른 파일을 백업/삭제, 또는 공격자가 같은 이름의 실행파일을 앞에 두고 실행 유도.
  • curl | sh 형태로 주기 업데이트 → 공급망/중간자 공격, DNS 하이재킹 등으로 즉시 원격 코드 실행으로 전환.

트러블슈팅(증상→원인→해결)

  • 증상: 크론은 등록되어 있는데 작업이 실행되지 않음
    원인: PATH/환경변수 차이로 명령을 찾지 못함, 실행 권한 없음, 메일 전송 실패로 오류가 묻힘
    해결: 절대경로로 수정, >> /var/log/job.log 2>&1로 로그 남기기, chmod +x 및 소유자 점검
  • 증상: 주기 작업이 가끔 두 번씩 겹쳐 실행되어 장애 발생
    원인: 실행 시간이 길어 다음 주기와 중첩(특히 백업/동기화)
  • 해결: flock으로 중복 실행 방지 또는 systemd timer에서 Persistent=true와 함께 설계 재검토
  • 증상: 타이머 작업이 root 권한으로 실행되어 피해 범위가 큼
    원인: 편의상 root로 통일해둔 운영 습관
    해결: 전용 계정(User=)으로 분리, 필요한 경로만 쓰기 허용(ReadWritePaths), 파일 권한 최소화

요약: 크론/타이머는 “자동화”가 아니라 “정기적으로 실행되는 권한”입니다. 목록 수집 → 실행 파일 권한/디렉터리 권한 → 절대경로/PATH 고정 → 중복실행 방지/로그 남기기 순서로만 점검해도 사고 가능성이 크게 줄어듭니다.

- 이 글은 ai가 random적으로 만들어 올리는 글입니다. -