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


12

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

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

sudo rm -rf /*

上記のコマンドが何をするのか疑問に思う人のために:これは私のウェブサーバー全体を削除

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

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

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

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



2
@solsTiCe /*は、rmコマンドに渡される前に展開されます。したがって、コマンドは単一の引数ではなく、引数のリスト(/bin /boot /cdrom /dev /etc /home...)を表示します
ダン

3
これを取り除くための重要な教訓は、本当に必要な場合を除き、sudoで実行しないことです。あなたがここで尋ねたものには答えないことは知っていますが、最も重要な質問は、(うまくいけば)自分のサーバーを再び削除しないようにする方法です(sudoを避けることはあなたの最初の防衛線でなければなりません)。
デビッドZ


2
@ WinEunuuchs2Unixこれはまったく重複した質問ではありません。ここでのopはrmコマンドにパスワードを持たせたくないのです。彼らはsudo、rmコマンドが使用されるたびにプロンプ​​トを出したいだけです。あなたがリンクした質問に対する解決策はあなたの最初のコマンドがあるときわずかに迷惑になるでしょうsudo rm。2つのパスワードを要求するため、1つはのパスワードsudoですrm
ダン

回答:


17

あなたは、設定することができますtimestamp_timeoutにする0には、特定のコマンドのために/etc/sudoersvisudo -f /etc/sudoers.d/pduck次の内容のファイルを作成します。

Cmnd_Alias DANGEROUS = /bin/rm

Defaults!DANGEROUS timestamp_timeout=0

pduck ALL = (ALL:ALL) DANGEROUS

これで、ユーザーpduckはグループのsudo rmメンバーであり、他のコマンドのパスワードを覚えていても、実行時に(追加のパラメーターが指定されていても)常にパスワードを要求されます。sudosudo

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

Cmnd_Alias DANGEROUS = /bin/rm -f

ただし、たとえば、sudo rm -f(もう一度)ではなく、正確にプロンプ​​トが表示されますsudo rm -rf


9

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

重要なファイルの誤った削除の発生

Safe-rmは、重要なファイルが誤って削除されないようにするための安全ツールです。/bin/rmラッパーに置き換えることで、削除しないファイルとディレクトリの構成可能なブラックリストに対して指定された引数をチェックします。

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

$ rm -rf /usr   
Skipping /usr

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

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

ここに画像の説明を入力してください


安全な牛に賛成
マイケルフルトン

3

sudoオプションを提供し-k, --reset-timestamp、参照man sudo

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

sudoテストrm -rf /*と実行のためのシンプルなラッパーを書くことができます

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

あなたが尋ねたことにしたい場合は、すべてあなたが実行した時間rm、一般的には次のように、あなたは上記の機能を適応させることができます。

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

一般的なコマンドコールと特定のコマンドラインの両方を組み合わせたい場合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」を含む任意のコマンドラインをキャッチします。


[[ "$1" == "rm" ]] && opt="-k";そしてどう/bin/rm
リンツウィンド

@Rinzwind関数は特定のニーズ、特にcaseアプローチに簡単に適応できると思います。
デザート

1

この回答はsudo、あなたの質問の一部に対処するものではありませんが、一方でrmあらゆるユーザーの偶発的な呼び出しの危険性を軽減する方法に対処します。

することができますエイリアスrmrm -I

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

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

セットアップ

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

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

あなたはそれをあなたの~/.bashrcまたはに入れることさえできます/etc/bash.bashrc

使用法

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

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

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.