매일이 아닌 몇 시간마다 무인 업그레이드를 실행하는 방법

매일이 아닌 몇 시간마다 무인 업그레이드를 실행하는 방법

기본적으로무인 업그레이드cron.daily로 최대 매일 실행됩니다. 공격자에게는 이 작업에 많은 시간이 걸릴 수 있습니다. 4시간마다 실행하고 싶은데 어떻게 하면 되나요?

답변1

무인 업그레이드 빈도는 다음 두 단계로 결정됩니다.

  1. 시스템 스케줄러(예: systemd 타이머 또는 cron/anacron) 및
  2. APT::주기적인 간격.

하나의 낮은 주파수가 다른 하나의 높은 주파수를 차단하므로 올바르게 설정했는지 확인하세요.둘 다속도.

두 번째 단계(APT::주기적인 간격)에는 apt 버전 1.5 이상이 필요하며 매일보다 더 자주 수행됩니다. Debian 10(buster)에는 apt 1.8.2가 포함되어 있으므로 문제가 없습니다.

Debian 9(stretch)와 같이 1.5 미만의 적절한 버전을 사용하는 경우 두 번째 단계에서 문제가 발생합니다. 1단계를 시작하기 전에 이 답변의 맨 아래로 스크롤하여 여기에 제안된 보기 흉한 해결 방법을 적용할지 확인하세요.

또한 일반적인 사용법과 마찬가지로 apt및 / 사이에도 차이가 있습니다. 첫 번째는 사용 가능한 패키지 목록 업데이트에 관한 것이고, 두 번째는 패키지 업그레이드에 관한 것입니다. 다시 한 번 두 가지 설정을 모두 변경해야 합니다.updateupgradeinstall

1. 시스템 스케줄러

Debian 9(stretch) 및 Debian 10(buster)에서 프로세스는 다음 두 개의 systemd 타이머에 의해 시작됩니다:

  • apt-daily.timer, UpdatePackageList( ) 를 apt-daily.service호출하여/usr/lib/apt/apt.systemd.daily updateapt-get update
  • apt-daily-upgrade.timer, ( )를 apt-daily-upgrade.service호출 하여 /usr/lib/apt/apt.systemd.daily install업그레이드를 설치합니다 unattended-upgrade.

(anacron 작업은 /etc/cron.daily/apt-compat여전히 ​​존재하지만 systemd가 감지되면 종료됩니다. systemd가 없으면 /usr/lib/apt/apt.systemd.daily하위 명령 없이 실행됩니다. 이는 update및 을 의미합니다 install. systemd를 사용하지 않는 경우 다른 답변이나 계획 변경에 대한 내용을 참조하십시오. anacron 설명서.)

기본 일정을 재정의하여 시스템 타이머를 더 자주(예: 4시간마다) 실행하도록 설정할 수 있습니다. 먼저 패키지 목록을 업데이트합니다.

$ sudo systemctl edit apt-daily.timer

이렇게 생성되었습니다 /etc/systemd/system/apt-daily.timer.d/override.conf. 다음을 입력하세요.

[Timer]
OnCalendar=
OnCalendar=*-*-* 0,4,8,12,16,20:00
RandomizedDelaySec=15m

그런 다음 20분 후에 실제 업그레이드를 수행합니다.

$ sudo systemctl edit apt-daily-upgrade.timer

[Timer]
OnCalendar=
OnCalendar=*-*-* 0,4,8,12,16,20:20
RandomizedDelaySec=1m

작업 내용을 확인하세요.

$ systemctl cat apt-daily{,-upgrade}.timer
$ systemctl --all list-timers apt-daily{,-upgrade}.timer

(일부 발췌데비안 위키: 무인 업그레이드.)

2. APT::주기적인 간격

시스템 스케줄러는 /usr/lib/apt/apt.systemd.daily파일 스탬핑 메커니즘을 사용하여 요청된 작업이 마지막으로 실행된 시기를 확인하는 스크립트를 호출합니다. 해당 작업에 대해 APT::Periodic에 설정된 간격과 비교합니다. 일반적으로 다음에서 이러한 설정을 찾을 수 있습니다 /etc/apt/apt.conf.d/20auto-upgrades.

APT::Periodic::Update-Package-Lists "1";
APT::Periodic::Unattended-Upgrade "1";

나는 항상 "1"여기의 값이 True 또는 On을 의미한다고 생각했지만 실제로는 일 단위로 표현되는 실행 간의 최소 간격입니다. 스크립트가 요청된 작업이 마지막으로 수행된 이후 경과된 시간이 더 적다고 판단하면 간단히아니요시스템 스케줄러에서 요구하는지 여부에 관계없이 이 작업을 수행합니다.

이제 apt 1.5~beta2에서 Paul Wise는 접미사 또는 를 추가하여 간격을 초, 분, 시간 단위로 정의할 수 있으므로 s다음 m과 같이 h변경할 수 있습니다 /etc/apt/apt.conf.d/20auto-upgrades.

APT::Periodic::Update-Package-Lists "3h";
APT::Periodic::Unattended-Upgrade "3h";

(보다 작으면 "4h"시스템 스케줄러의 무작위 지연을 고려합니다.)

더 좋은 점은 간격을 다음과 같이 설정할 수 있다는 것입니다."always"마지막 실행 이후 시간이 얼마나 지났는지에 관계없이 요청된 경우에만 작업이 실행되는지 확인하세요.

APT::Periodic::Update-Package-Lists "always";
APT::Periodic::Unattended-Upgrade "always";

한 번 설정한 다음부터 빈도를 변경하려면 시스템 스케줄러(시스템 타이머)와 상호 작용하면 되기 때문에 이 방법을 선호합니다.

<1.5에 적합

Debian 9(stretch)는 apt 1.4.9와 함께 제공되므로 APT::Periodic 간격을 로 설정 "always"하거나 "3h"2단계에서 설명한 방법은 작동하지 않습니다. 그건 그렇고, 며칠의 공백 "0.1"도 작동하지 않습니다.

추악한 해결 방법이 마음에 들지 않으면 /usr/lib/apt/apt.systemd.daily타임스탬프 메커니즘을 함수에 삽입하여 제외하도록 스크립트를 편집하세요(사용 책임은 사용자에게 있습니다!).return 0check_stamp()

--- a/lib/apt/apt.systemd.daily
+++ b/lib/apt/apt.systemd.daily
@@ -82,10 +82,12 @@ check_stamp()
        debug_echo "check_stamp: interval=0"
        # treat as no time has passed
         return 1
     fi

+    return 0
+
     if [ ! -f $stamp ]; then
        debug_echo "check_stamp: missing time stamp file: $stamp."
        # treat as enough time has passed
         return 0
     fi

이렇게 하면 스크립트는 항상 간격이 경과했다고 생각하므로 요청된 모든 작업을 실행합니다. apt를 업그레이드할 때 이 해결 방법을 덮어써야 하며 그런 다음 "always"위의 2단계 방법을 사용하도록 전환할 수 있습니다.

스크립트를 엉망으로 만들고 싶지 않다면 다른 답변에서 언급한 대로 사용자 정의 크론 작업을 고려하십시오. 이 경우 이 답변의 1단계에 대해서도 걱정할 필요가 없습니다.

답변2

오래된 질문이지만 저와 같은 문제를 겪고 있는 분들을 위해:

Ubuntu 16.04(및 기타 시스템 시스템)에서는 자동 업그레이드가 더 이상 cron에 의해 트리거되지 않습니다. 대신 시스템 타이머를 사용합니다.

런타임 및 임의 지연을 수정하려면 타이머를 수정/재정의해야 합니다. 자세한 내용은 여기에서 확인할 수 있습니다. https://github.com/systemd/systemd/issues/3233

답변3

Krzysztof가 지적했듯이 이를 위해서는 별도의 cron 항목이 필요합니다.

패키지 블랙리스트/화이트리스트, 재시작 및 기타 세부 사항이 적절하게 처리되도록 하려면 직접 호출하는 것이 가장 좋습니다 unattended-upgrade(파이썬 스크립트).

예를 들어:

echo "0 0-23/4 * * * root sleep $(( $RANDOM % 14400 ));PATH=/usr/local/sbin:/usr/local/bin:/sbin:/bin:/usr/sbin:/usr/bin unattended-upgrade" > /etc/cron.d/unattended-upgrade

이는 에 구성된 기간을 재정의합니다 /etc/apt/apt.conf.d/. 이는 이러한 검사가 unattended-upgrade스크립트 내에서 수행되지 않고 호출 스크립트보다 한 수준 위에서 수행되기 때문에 작동합니다 /usr/lib/apt/apt.systemd.daily.

출력은 /var/log/unattended-upgrades/평소대로 기록됩니다.

답변4

무인 업그레이드 스크립트는 /etc/cron.daily/apt일 단위의 업그레이드 간격을 사용하므로 빈도를 하루 이상 설정할 수 없습니다.

표준 cron을 사용할 수 있습니다. 다음을 입력하세요 /etc/cron.d.

SHELL=/bin/bash
PATH=/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin
0 0-23/4 * * * root   apt-get -q update && apt-get dist-upgrade -yq -o Dpkg::Options::="--force-confdef" -o Dpkg::Options::="--force-confold"

필요에 맞게 명령을 조정하십시오.

관련 정보