デフォルトでは nattended-upgrades cron.dailyで実行されますが、これはせいぜい毎日です。これは、攻撃者にとって多くの時間になる可能性があります。 4時間ごとに実行したいのですが、どうすればよいですか?
古い質問ですが、私が持っていたのと同じ問題を抱えている可能性がある人のためにこれを言っています:
Ubuntu 16.04(およびおそらく他のsystemdシステム)では、無人アップグレードはcronによってトリガーされなくなりました。代わりに、systemdタイマーを使用します。
ランタイムとランダム化された遅延を変更するには、タイマーを変更またはオーバーライドする必要があります。詳細については、こちらをご覧ください: https://github.com/systemd/systemd/issues/32
Krzysztofが指摘するように、これには別のcronエントリが必要になります。
パッケージのブラックリスト/ホワイトリスト、再起動、その他の詳細が適切に処理されるように、unattended-upgrade
を直接呼び出す(pythonスクリプト))のがおそらく最善です。
例えば:
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
の1レベル上で行われるため、これは機能します。
出力は通常どおり/var/log/unattended-upgrades/
に記録されます。
/etc/cron.daily/apt
の無人アップグレードスクリプトは、日数で表されるアップグレード間隔を使用するため、1日より頻繁に設定することはできません。
標準の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"
必要に応じてコマンドを調整します。
無人アップグレードの頻度は、次の2つのステップで決定されます。
これらの一方の周波数が低いと、もう一方の周波数が高くなるため、両方のステップの設定が正しいことを確認してください。
2番目のステップ(APT :: Periodic interval)では、1日1回より高い頻度の場合、aptバージョン1.5以上が必要です。 Debian 10(バスター)にはapt 1.8.2が同梱されているため、問題ありません。
1.5未満のaptバージョン、たとえばDebian 9(ストレッチ)を使用する場合、2番目のステップは問題になります。この回答の一番下までスクロールして、ステップ1から始める前に、そこで提案されている醜い回避策を適用してもよいかどうかを確認します。
また、apt
の通常の使用と同様に、update
とupgrade
/install
の間には違いがあることに注意してください。 1つ目は利用可能なパッケージのリストを更新することであり、2つ目はパッケージのアップグレードです。繰り返しますが、必ず両方の設定を変更してください。
Debian 9(ストレッチ)とDebian 10(バスター)の両方で、プロセスは次の2つのsystemdタイマーによって開始されます。
apt-daily.timer
_、これは_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のドキュメントを参照してください。)
Systemdタイマーは、デフォルトのスケジュールを上書きすることで、より高い頻度で、たとえば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
_
(一部は Debian Wiki:UnattendedUpgrades から取得。)
システムスケジューラは、スクリプト_/usr/lib/apt/apt.systemd.daily
_を呼び出します。このスクリプトは、filestamp-mechanismを使用して、要求されたアクションが最後にいつ実行されたかを判断します。これを、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";
_
これを一度設定すると、頻度を変更する場合にのみ、システムスケジューラ(systemdタイマー)と対話する必要があるため、これを好みます。
Debian 9(ストレッチ)はapt 1.4.9に同梱されているため、手順2で説明したようにAPT :: Periodic間隔を_"always"
_または_"3h"
_に設定しても機能しません。ちなみに、_"0.1"
_日の間隔も機能しません。
醜い回避策を気にしない場合は、スクリプト_/usr/lib/apt/apt.systemd.daily
_を編集して、check_stamp()
関数に_return 0
_を挿入してタイムスタンプメカニズムを回避します(自己責任で使用してください)。
_--- 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をアップグレードするときに上書きされます。その後、上記の手順2で説明したように、_"always"
_の使用に切り替えることができます。
スクリプトを台無しにしたくない場合は、他のいくつかの回答で説明されているカスタムcronジョブを検討してください。その場合は、この回答のステップ1についても心配する必要はありません。