web-dev-qa-db-ja.com

特定のコマンドに常にSudoパスワードを適用するにはどうすればよいですか?

先日、Webサーバーでいくつかのメンテナンスタスクを実行していました。私は急いで眠くなっていたので、Sudoコマンドを使用してすべてを行いました。

そして、誤って押した Ctrl+V、このコマンドをWebサーバーに送信します。

Sudo rm -rf /*

上記のコマンドが何をするのか疑問に思う人のために:これは私のwhole web serverを削除しました

幸いなことに、バックアップがありましたが、悲しいことに、このすばらしいエラーを修正するために、さらに2時間目を覚まさなければなりませんでした。しかし、それ以来、私は疑問に思っていました:

特定のコマンドに常にSudoパスワードを適用する方法はありますか?

サーバーからパスワードの入力を求められた場合、多くのトラブルから身を守ることができます。この巨大なエラーの前に約5個のSudoコマンドを実行したため、そうではありませんでした。

だから、それを行う方法はありますか?常に強制されるrmコマンドでパスワードが必要です。私が使用している他のコマンドは通常nanoまたはcpで、両方とも(ある程度)復帰可能です。

12
Pavel Janicek

timestamp_timeoutの特定のコマンドに対して、0/etc/sudoersに設定できます。次の内容のファイルvisudo -f /etc/sudoers.d/pduckを作成します。

Cmnd_Alias DANGEROUS = /bin/rm

Defaults!DANGEROUS timestamp_timeout=0

pduck ALL = (ALL:ALL) DANGEROUS

これで、ユーザーがpduckグループおよびSudoのメンバーであっても、Sudo rmの実行時に(追加のパラメーターが指定されていても)ユーザーSudoに常にパスワードが要求されます。他のコマンドのパスワードを記憶しています。

欠点は、ファイルの/bin/rm行にパラメーターを簡単に追加してこれをさらに制限できないことです。まあ...あなたは、次のようにすることができます:

Cmnd_Alias DANGEROUS = /bin/rm -f

しかし、その後、ちょうど[もう一度] Sudo rm -fではなく、正確にSudo rm -rfのプロンプトが表示されます。

17
PerlDuck

1つの方法は、 safe-rm を使用することです。これは、「rm」の使用を制限し、「rm」の特定のバージョンが実行されるのを防ぐだけです。これにはルートシステムの削除が含まれますが、「/ usr /」や「/ var /」などのシステム関連ディレクトリの削除を防ぐためにも使用できます。リンクから:

重要なファイルの偶発的な削除の発生

Safe-rmは、/bin/rmをラッパーで置き換えることにより、重要なファイルを誤って削除することを防ぐための安全ツールです。

これらの保護されたファイルまたはディレクトリのいずれかを削除しようとすると、ユーザーは削除できず、代わりに警告メッセージが表示されます。

$ rm -rf /usr   
Skipping /usr

(保護されたパスは、サイトレベルとユーザーレベルの両方で設定できます。)

誤って削除した重要なファイルを復元するのは非常に困難です。 safe-rmをインストールして今日の自分を守り、データ復旧サービスに連絡する必要性を減らしましょう!

enter image description here

9
Rinzwind

Sudoはオプション-k, --reset-timestampを提供します。 man Sudo を参照してください:

パスワードを必要とする可能性のあるコマンドまたはオプションと組み合わせて使用​​すると、このオプションにより、Sudoはユーザーのキャッシュされた資格情報を無視します。その結果、Sudoはパスワードを要求し(セキュリティポリシーでパスワードが必要な場合)、ユーザーのキャッシュされた資格情報を更新しません。

rm -rf /*をテストして実行するSudoの簡単なラッパーを書くことができます

Sudo -k rm -rf /*

代わりに、例えばこのような:

Sudo ()                                                                                                                                                 
{ 
    [[ "$*" == "rm -rf /*" ]] && opt="-k";
    /usr/bin/Sudo $opt "$@"
}

使用例

ここでecho aでテストします。

$ Sudo echo
[Sudo] password for dessert: 

$ Sudo echo

$ Sudo echo a
[Sudo] password for dessert: 
a
$ Sudo echo a
[Sudo] password for dessert: 
a

every一般的にrmを実行する時間を尋ねる場合は、上記の関数を次のように調整できます。

Sudo () 
{ 
    [[ "$1" == "rm" ]] && opt="-k";
    /usr/bin/Sudo $opt "$@"
}

combineにしたい場合は、一般的なコマンドコールと特定のコマンドラインの両方を使用します。たとえば、caseの使用をお勧めします。

Sudo () 
{ 
    case "$*" in 
        rm*)            opt="-k" ;;
        "mv /home"*)    opt="-k" ;;
        "ln -s /usr/bin/fish /bin/sh") opt="-k" && echo "Don't you dare!" ;;
        *)              opt="" ;;
    esac;
    /usr/bin/Sudo $opt "$@"
}

オプションを使用してSudoを実行すると、これらのアプローチは機能しないことに注意してください。スペースで囲まれた文字列「rm」をチェックする[[ "$*" =~ " rm " ]]または「rm」を含むコマンドラインをキャッチするcaseを使用する*" rm "*).

3
dessert

この回答では、質問のSudo部分は取り上げていませんが、一方で、anyユーザーに対する偶発的なrm呼び出しの危険性を軽減する方法を扱っています。

rmrm -Iにエイリアスできます。

  • ディレクトリまたは3つ以上のファイルを削除するとすぐに確認を求めます
  • -fを省く限り以前の-Iオプションを上書きします。

--one-file-systemは、rmエイリアスで使用する意図しない削除に対する別の可能な保護手段です。

セットアップ

このようなエイリアスを作成するには、次のコマンドを使用します。

alias rm='rm -I --one-file-system'

~/.bashrcまたは/etc/bash.bashrcに入れることができます。

使用法

$ Sudo rm -r /etc/apt/sources.list.d /*
rm: remove all arguments?

タイプyesまたはロケールへの翻訳またはいずれかのWordの最初の文字を確認して、 Enter。 noneを含む他の入力は、操作を中止します。

1
David Foerster