web-dev-qa-db-ja.com

無人アップグレードを毎日ではなく数時間ごとに実行する方法

デフォルトでは nattended-upgrades cron.dailyで実行されますが、これはせいぜい毎日です。これは、攻撃者にとって多くの時間になる可能性があります。 4時間ごとに実行したいのですが、どうすればよいですか?

6
nachtigall

古い質問ですが、私が持っていたのと同じ問題を抱えている可能性がある人のためにこれを言っています:

Ubuntu 16.04(およびおそらく他のsystemdシステム)では、無人アップグレードはcronによってトリガーされなくなりました。代わりに、systemdタイマーを使用します。

ランタイムとランダム化された遅延を変更するには、タイマーを変更またはオーバーライドする必要があります。詳細については、こちらをご覧ください: https://github.com/systemd/systemd/issues/32

5
daniel f.

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/に記録されます。

3
minimalis

/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"

必要に応じてコマンドを調整します。

1

無人アップグレードの頻度は、次の2つのステップで決定されます。

  1. システムスケジューラ(例:systemdタイマーまたはcron/anacron)、および
  2. APT ::定期的な間隔。

これらの一方の周波数が低いと、もう一方の周波数が高くなるため、両方のステップの設定が正しいことを確認してください。

2番目のステップ(APT :: Periodic interval)では、1日1回より高い頻度の場合、aptバージョン1.5以上が必要です。 Debian 10(バスター)にはapt 1.8.2が同梱されているため、問題ありません。

1.5未満のaptバージョン、たとえばDebian 9(ストレッチ)を使用する場合、2番目のステップは問題になります。この回答の一番下までスクロールして、ステップ1から始める前に、そこで提案されている醜い回避策を適用してもよいかどうかを確認します。

また、aptの通常の使用と同様に、updateupgrade/installの間には違いがあることに注意してください。 1つ目は利用可能なパッケージのリストを更新することであり、2つ目はパッケージのアップグレードです。繰り返しますが、必ず両方の設定を変更してください。

1.システムスケジューラ

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_が実行されます。つまり、updateinstall。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 から取得。)

2. APT ::定期的な間隔

システムスケジューラは、スクリプト_/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により、接尾辞sm、または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タイマー)と対話する必要があるため、これを好みます。

Apt <1.5の場合

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についても心配する必要はありません。

1
Peter Nowee