0

以下の簡単なスクリプトは、gpg-agent キャッシュ内の有効なパスフレーズをチェックするために使用されます。パスフレーズが有効な場合は OK と表示されますが、パスフレーズが無効な場合は警告メッセージが表示されます。

#!/bin/bash
# checkgpg
KEY_ID=2B705B8B6FA943B1
test=$(echo "1234" | gpg -q --batch --status-fd 1 --sign --local-user "$KEY_ID" --passphrase-fd 0 > /dev/null)
RET_VAL=$?

if [ $RET_VAL -eq 0 ]; then
        echo "OK, passphrase cached in gpg-agent is valid!"
else
        echo "Warning, passphrase cached in gpg-agent is invalid!"
fi

上記のスクリプトを実行すると、キャッシュされたパスフレーズを保存するための新しい gpg-agent プロセスも実行されます。したがって、この場合は PID です。3309

上記のスクリプトで問題ありません。

次に、cronjob を介して実行するように設定したいくつかの bash スクリプトがあります。したがって、このスクリプトのそれぞれが cronjob を介して実行されると、突然、異なる PID を持つランダムな gpg-agent プロセスが実行されていることがわかります (そして、今では 2 つの gpg-agents を取得しています):

[root@earth chkrootkit]# pidof gpg-agent
392612 3309

ここで、PID392612は、cronjob プロセス中に実行されていた新しいランダム gpg エージェントです。

実行中であってもかまいませんが、ここでの大きな問題は、新しいランダム gpg-agent プロセスが実行されているときに、上記の bash スクリプトを再実行して gpg-agent で有効なパスフレーズを確認すると、次のエラーが発生することです。 :

[root@earth]# ./checkgpg
gpg: signing failed: Inappropriate ioctl for device
gpg: signing failed: Inappropriate ioctl for device
Warning, passphrase cached in gpg-agent is invalid!

cronjob スクリプトの実行が終了すると、有効なパスフレーズが再び表示されます。

[root@earth chkrootkit]# ./testgpg
OK, passphrase cached in gpg-agent is valid!

したがって、エラーはランダムな gpg-agent が原因で発生し、それ自体が終了するまで実行され、キャッシュされたパスフレーズが再び有効になります。これが、bash スクリプトを実行するとこの gpg-agent プロセスも実行できる理由を混乱させます。

したがって、これone example of my cronjob scriptsにより、新しいランダム gpg-agent が実行されます (cronjob を介して実行した場合のみ)。これをターミナル経由で実行すると、ランダムな gpg-agent が作成されません)。cronjob のすべてのスクリプトが同じ問題を生成したため、このコードを示すことは重要ではないと思います。

#!/bin/bash
PATH=/bin:/usr/bin:/sbin:/usr/sbin
export PATH
echo "======================================"
echo "[chkrootkit | info]: Chkrootkit is checking system..."

#Global variables
MYHOSTNAME=`/bin/hostname`
MYEMAIL="webmaster@sofibox.com"
CHKROOTKIT_LOG_PATH="/usr/local/maxicron/chkrootkit/log"
REPORT_FILE="/usr/local/maxicron/chkrootkit/log/chkrootkit-file.log"
REPORT_FILE_GREP="/usr/local/maxicron/chkrootkit/log/chkrootkit-file-grep.log"
MAIL_BIN="/usr/local/bin/mail"
WARNING_STATUS="N/A"

mkdir -p $CHKROOTKIT_LOG_PATH

sudo touch $REPORT_FILE
sudo chown root:adm $REPORT_FILE
sudo chmod 640 $REPORT_FILE
cat /dev/null > $REPORT_FILE

sudo touch $REPORT_FILE_GREP
sudo chown root:adm $REPORT_FILE_GREP
sudo chmod 640 $REPORT_FILE_GREP
cat /dev/null > $REPORT_FILE_GREP

echo "[chkrootkit | info]: Please wait..."
echo "Chkrootkit checked on `date`" >> $REPORT_FILE
/usr/local/chkrootkit/chkrootkit >> $REPORT_FILE
echo "Rootkit scan return: $?"
echo "" >> $REPORT_FILE
echo "==================SCAN COMPLETED=================" >> $REPORT_FILE
echo "" >> $REPORT_FILE
echo "================= WARNING NOTICE ================" >> $REPORT_FILE

if (grep -e "Warning" -e "INFECTED" -e "were found" $REPORT_FILE >> $REPORT_FILE_GREP) then
        WARNING_STATUS="WARNING"
        cat $REPORT_FILE_GREP >> $REPORT_FILE
        echo "[chkrootkit | info]: You may Check chkrootkit update manually" >> $REPORT_FILE
        echo "================== END OF NOTICE ================" >> $REPORT_FILE
        $MAIL_BIN -s "[chkrootkit | $WARNING_STATUS] Check Rootkit Scan Report  @ $MYHOSTNAME" $MYEMAIL < $REPORT_FILE
else
        WARNING_STATUS="OK"
        echo "" >> $REPORT_FILE
        echo "NO WARNING FOUND" >> $REPORT_FILE
        echo "" >> $REPORT_FILE
fi
$MAIL_BIN -s "[chkrootkit | $WARNING_STATUS] Check Rootkit Scan Report  @ $MYHOSTNAME" $MYEMAIL < $REPORT_FILE
echo "[chkrootkit | info]: Scan Status: $WARNING_STATUS"
echo "[chkrootkit | info]: Done checking system. Email notification is set to $MYEMAIL"
echo "======================================"

上記のスクリプトの crontab は次のようになります。

26 18 * * * ルート /root/testgpg > /dev/null

そのため、18:26 の正確な時刻に、新しいランダム gpg-agent が作成されました。コードに問題は見られず、gpg に関連するものは何もありません。上記のスクリプトを cronjob 経由でこのように実行すると、新しい gpg-agent プロセスが実行されるのはなぜですか? これは、バックアップ スクリプトなどの他のスクリプトでも発生します。これをデバッグする方法はありますか? このエラーの背後にある理由を見つけるために数週間費やしましたが、今はその理由とこれを防ぐ方法を知りたいだけです.

4

1 に答える 1

0

最後に、この問題を再現できます。このスクリプトを cronjob で実行すると:

!#/bin/bash
#testscript.sh
sudo sleep 60 

これにより、gpg パスフレーズが 60 秒間無効になり、2 番目のランダムな gpg-agent プロセスが 60 秒間実行されます。

しかし、このスクリプトを cronjob で (sudo なしで) 実行すると、問題は発生しません。

!#/bin/bash
#testscript.sh
sleep 60 

sudoだけでなく、このような cronjob のようにスクリプト全体を実行すると、問題も発生します。

14 23 * * * root sudo /root/testscript.sh > /dev/null

sudo次のように端末から直接スクリプトを実行すると、次のようになります。

sudo testscript.sh

その後、新しいプロセスは作成されません。これは、cronjob で sudo を使用する場合にのみ発生します。

簡単に言えば、ランダムな gpg-agent プロセスが作成された理由は、sudocronjob で使用されているコマンドのためです。sudoコマンドを使用すると gpg-agent プロセスが再生成される理由はまだわかりません。

プログラミング関連のエラーだと思ったのは間違いなく謎のバグですが、すべてのスクリプトで sudo コマンドを使用しないことで、最終的にこのエラーを防ぐことができます。解決しました。

于 2020-10-12T10:59:07.793 に答える