기본적으로무인 업그레이드cron.daily로 최대 매일 실행됩니다. 공격자에게는 이 작업에 많은 시간이 걸릴 수 있습니다. 4시간마다 실행하고 싶은데 어떻게 하면 되나요?
답변1
무인 업그레이드 빈도는 다음 두 단계로 결정됩니다.
- 시스템 스케줄러(예: systemd 타이머 또는 cron/anacron) 및
- APT::주기적인 간격.
하나의 낮은 주파수가 다른 하나의 높은 주파수를 차단하므로 올바르게 설정했는지 확인하세요.둘 다속도.
두 번째 단계(APT::주기적인 간격)에는 apt 버전 1.5 이상이 필요하며 매일보다 더 자주 수행됩니다. Debian 10(buster)에는 apt 1.8.2가 포함되어 있으므로 문제가 없습니다.
Debian 9(stretch)와 같이 1.5 미만의 적절한 버전을 사용하는 경우 두 번째 단계에서 문제가 발생합니다. 1단계를 시작하기 전에 이 답변의 맨 아래로 스크롤하여 여기에 제안된 보기 흉한 해결 방법을 적용할지 확인하세요.
또한 일반적인 사용법과 마찬가지로 apt
및 / 사이에도 차이가 있습니다. 첫 번째는 사용 가능한 패키지 목록 업데이트에 관한 것이고, 두 번째는 패키지 업그레이드에 관한 것입니다. 다시 한 번 두 가지 설정을 모두 변경해야 합니다.update
upgrade
install
1. 시스템 스케줄러
Debian 9(stretch) 및 Debian 10(buster)에서 프로세스는 다음 두 개의 systemd 타이머에 의해 시작됩니다:
apt-daily.timer
, UpdatePackageList( ) 를apt-daily.service
호출하여/usr/lib/apt/apt.systemd.daily update
apt-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 0
check_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"
필요에 맞게 명령을 조정하십시오.