web-dev-qa-db-ja.com

ログイン後n分間、Sudoがパスワードを要求しないようにする

私は定期的にSSH経由でboxenにログインし、Sudoを使用してrootとしてupdateなどを実行します。

端末などから離れる場合、Sudoが一定時間後にパスワードを要求することを感謝します。ただし、ログインパスワードまたはSSHキーフレーズを既に入力しているため、preferSudonotログイン後の最初のn分間はパスワードを要求しますが、ログイン直後にSudoが正常に実行されたかのように動作します。

これは、ログイン後の最初の呼び出しにパスワードが不要になるように構成できますか?

目的の動作の例を作成するには

ssh [email protected]
[~]$ Sudo somecommand
[~]$ #no password asked.
[~]$ Sudo somecommand #n minutes later
[Sudo] password for foo: 
4
vidarlo

これがどのように行われるかについてのアイデアです。 注:これはハックです。単語passwordless Sudoが眉を頭蓋骨までずっとcraわせたい場合にのみ使用してください。

前提は、ログイン資格情報をSudoに渡すことはできません。したがって、問題は、ログインの最初の数分間だけNOPASSWD Sudoを使用する方法です。これを行うには、NOPASSWDモードでログインシェルを起動し、.bashrcでバックグラウンドプロセスを生成し、数分後にNOPASSWDを取り消します。

# somewhere near the bottom of ~/.bashrc
Sudo -n /bin/bash -c "$HOME/nopasswd-Sudo 60s 12h <&- >&- &"

もちろん、スクリプト自体はwithNOPASSWD Sudoで起動する必要があります。そうしないと、パスワードの入力を求められます。 Andbashセッションが終了すると、スクリプトはNOPASSWDルールを復元し、次のログインにNOPASSWDが設定されるようにする必要があります。

これを行うスクリプト$HOME/nopasswd-Sudoは次のとおりです。

#!/bin/bash

Sudo_FILE="/etc/sudoers.d/$(basename "$0")-${Sudo_USER}"
Sudo_RULE="${Sudo_USER} ALL=(ALL:ALL) NOPASSWD: ALL"

[ -z "$Sudo_USER" ] &&
     echo "$(basename "$0"): must be invoked with Sudo" >&2 &&
     exit 1

# Trap exit to recreate Sudo_FILE for next login
trap "echo '$Sudo_RULE' > '$Sudo_FILE'; exit 0" EXIT

# First time around just exit, creating the Sudo_FILE
[ -f "$Sudo_FILE" ] || exit 0

# After $1 (default 5m) remove Sudo_FILE to end NOPASSWD Sudo
sleep ${1:-5m} && rm -f "$Sudo_FILE"

# Wait until our parent exits, and we will exit via the trap
# If after $2 (default 12h) still alive, we assume we missed the HUP
sleep ${2:-12h}

最初の実行(.bashrcからではなく、コマンドラインから実行する必要があります)で、スクリプトは/etc/sudoers.d/nopasswd-Sudo-$USERNOPASSWDワイルドカードを含む$USERファイルを作成します:

{username} ALL=(ALL:ALL) NOPASSWD: ALL

その後、ログインするたびに起動し、パスワードなしの時間が経過するまでバックグラウンドで待機します。その後、ファイルを削除し、次のSudoにはパスワードが必要になります。

その後、無期限に(実際には、親のHUP信号を見逃した長引く孤児を防ぐために12時間まで)、またはその親であるログインシェルが終了するまで待機します。終了する直前に、EXITトラップはNOPASSWDファイルを再作成します。


冒険のためのヒント:ログインスクリプトやSudoルールをいじる間は、常に別のルートシェルを開いたままにしてください。あなたが自分をロックアウトする最初の人ではないでしょう。

5
zwets