パスワードプロンプトなしでルートとして特定のプログラムを実行する方法は?


169

パスワードなしでsudoとして何かを実行する必要があるので、これを使用visudoしてsudoersファイルに追加しました:

MYUSERNAME ALL = NOPASSWD: /path/to/my/program

それから私はそれを試してみました:

$ sudo /path/to/my/program
[sudo] password for MYUSERNAME: 

なぜパスワードを要求するのですか?パスワードを要求せずに、root以外のユーザーでrootとしてコマンドを実行/使用するにはどうすればよいですか?

回答:


91

sudoersユーザーに一致する別のエントリがファイルにあります。NOPASSWDルールが優先されるためには、そのルールの後にある必要があります。

これを行うと、sudoを除くすべてのコマンドに対して通常/path/to/my/programパスワードの入力が求められます。これにより、パスワードを要求せずに常に実行できます。


6
/path/to/my/programpythonスクリプトだった場合、これはまだ機能しますか?
sadmicrowave 14

代わりにプログラムをエイリアスにして、bashに設定することはできます.bashrcか(つまり)。または、内部にシェルスクリプトもあり/usr/local/sbinますか?試してみる。
ニコスアレクサン

ニコス-いいえ、エイリアスにすることはできません。実際のパスを指している必要があります。
ポール・ヘダリー

sudoers?どこですか あなたの答えを使用するためにうんざり(
Vasilii Suricov

@VasiliiSuricov:通常は/etcにありますが、一部のシステムでは別の場所に配置されています。見つからない場合は、を試してくださいman sudoers。そのシステム用に構築さmanれた時点で、そのファイルのローカルの場所をページに置き換える必要がありますsudo
ウォーレンヤング

135

に一致するエントリが複数ある場合/etc/sudoers、sudoは最後のエントリを使用します。したがって、パスワードプロンプトを使用してコマンドを実行でき、パスワードプロンプトを使用せずに特定のコマンドを実行できるようにするには、最後に例外が必要です。

myusername ALL = (ALL) ALL
myusername ALL = (root) NOPASSWD: /path/to/my/program

の使用に注意して(root)、プログラムを他のユーザーとしてではなくrootとして実行できるようにします。(影響を考え出さない限り、最低限必要な許可よりも多くの許可を与えないでください。)

Ubuntuを実行していない読者、またはデフォルトのsudo構成を変更した読者への注意(デフォルトではUbuntuのsudoは問題ありません):昇格された特権でシェルスクリプトを実行するのは危険です。クリーンな環境から開始する必要があります(シェルが開始したら遅すぎます(シェルスクリプトでsetuid許可するをご覧ください)。そのためにはsudoが必要です)。があることDefaults env_reset/etc/sudoersまたはこのオプションがコンパイル時のデフォルトであることを確認してください(sudo sudo -V | grep envを含める必要がありますReset the environment to a default set of variables)。


3
exでsudo suを使用してjhonからrootに移行する-----> john ALL =(ALL)NOPASSWD:/ bin / su
bortunac

5
@adrian任意のコマンドをルートとして許可したい場合は、それを作成しjohn ALL=(ALL) NOPASSWD: allます。を経由しても意味がありませんsu
ジル14

質問:セキュリティのために、rootユーザーのみが変更および読み取りできるように、シェルスクリプトの権限を変更する必要がありますか?私は、攻撃者がスクリプトを変更することを考えています。このスクリプトは、パスワードを必要とせずにすべての権限が付与されているため、望んでいることを実行できます。明らかに、攻撃者はsudoersファイルを読み取ってこのスクリプトがどの特権を持っているかを知ることさえできませんが、許可されていることを期待してそれらが格納されているフォルダーを見つけたら、すべてのカスタムスクリプトを試すことができます。 。
ジェフリールボウスキ

1
@JeffreyLebowskiスクリプトを(直接または間接的に)実行するsudoルールがある場合は、root(またはとにかくroot権限を持っている人)だけがスクリプトファイル、およびスクリプトファイルを含むディレクトリに書き込むことができることが重要です。その親ディレクトリなど。誰でもスクリプトファイルを読み取れるかどうかは関係ありません(パスワードなどが含まれていない限り、それは悪い考えです。パスワードがある場合は、それを自分のファイルに含める必要があります。このサイトの質問のコードのそのセクションをコピーして貼り付けます)。
ジル

1
@alperいいえ。再起動が必要なものはほとんどありません。を変更した後sudoers、特別なことをする必要はありませんsudo。毎回チェックします。
ジル

24

警告:この回答は安全ではないとみなされています。以下のコメントをご覧ください

完全なソリューション:次の手順は、目的の出力を達成するのに役立ちます。

  1. 新しいスクリプトファイルを作成します(create_dir.sh目的のスクリプト名に置き換えます)。

    vim ~/create_dir.sh
    

    スクリプトはユーザーのホームディレクトリに作成されます

  2. ルートディレクトリレベルでフォルダーを作成するなどrootsudoユーザーのみが実行できるコマンドをいくつか追加します。

    mkdir /abc
    

    注:sudoこれらのコマンドには追加しないでください。保存して終了(を使用:wq!

  3. 以下を使用して実行許可を割り当てます。

    sudo chmod u+x create_dir.sh
    
  4. このスクリプトがパスワードを必要としないように変更を加えます。

    1. sudoersファイルを開きます。

      sudo visudo -f /etc/sudoers
      
    2. 最後に次の行を追加します。

      ahmad ALL=(root) NOPASSWD: /home/ahmad/create_dir.sh
      

      ahmadユーザー名は何でも置き換えます。また、これが最後の行であることを確認してください。保存して終了。

  5. コマンドを実行するとき、次のsudoように追加します:

    sudo ./create_dir.sh
    

    これにより、パスワードを要求せずにスクリプトファイル内のコマンドが実行されます。

ここに記載されている簡単な手順に従ってくださいhttp://step4wd.com/2013/09/14/run-root-commands-in-linux-ubuntu-without-password/


ここで関連する手順を提供し、詳細情報のバックアップとしてリンクを使用した方が良いでしょう。そうすれば、そのリンクがもう有効でなくなっても、答えは可能な値を保持します。
アントン

15
このアドバイスは安全ではありません。ユーザーは(おそらく)ホームディレクトリの所有権を持っているため、のsudo一部sudo chmod u+x create_dir.shは不要です。ユーザーはに書き込むことができるので、create_dir.sh事実上そのユーザーに無料のルートシェルを与えました。
Lekensteyn

1
@Lekensteynこれは、ユーザーとして実行されているプログラムにとっても意味します。ユーザーがパスワードなしでsudoを使用して何でも実行できるようにすることもできます。
pydsigner

2
何か不足していますか?あなたは特権の昇格にchmod頼っているので、全体は不要だと思いますsudo
Gマン

10

あなたの構文は間違っていると思います。少なくとも私は私のために働く次のものを使用します:

myusername ALL=(ALL) NOPASSWD: /path/to/executable

6
この(ALL)部分はオプションで、省略してもまったく同じ効果があります。持つことは(root)いえ良いだろうが、その不在が問題を説明しません。
ジル

このコマンドのsudoの場合は+1、それ以外は何もありません システム全体を壊すする理由ない...
ヨハン

3
@ヨハン:それはすでに問題になっていた。
ジル

5

sudoを使用する必要がなく、sudoers構成ファイルを変更する必要がない場合は、次を使用できます。

sudo chown root:root path/to/command/COMMAND_NAME
sudo chmod 4775 path/to/command/COMMAND_NAME

これにより、sudoを使用せずにコマンドがrootとして実行されます。


うわー、私は前にこの解決策を聞いたことがない、気が遠くなる
何か何か

最適な答えを見つけるために、これらのものの一番下までスクロールする必要があるのはなぜですか?このシンプルで安全なソリューションをありがとう。
ライアンナード

5

Manjaroのようなディストリビューションがある場合、/ etc / sudoersの定義をオーバーライドするファイルを最初に処理する必要があります。そのファイルを削除するか、そのファイルを直接操作して新しい構成を追加します。

このファイルは次のとおりです。

sudo cat /etc/sudoers.d/10-installer

それを見る唯一の方法はルート権限の下にあり、それなしではこのディレクトリをリストすることはできません。このファイルはマンジャロ固有で、この設定は他の名前で同じディレクトリにあります。

選択したファイルに、次の行を追加して、目的の構成を取得できます。

グループの認証を無視する

%group ALL=(ALL) NOPASSWD: ALL

またはユーザーの認証を無視する

youruser ALL=(ALL) NOPASSWD: ALL

または特定のユーザーの実行可能ファイルの認証を無視する

youruser ALL=(ALL) NOPASSWD: /path/to/executable

クイックノート:認証なしでSUDOを使用するための扉を開いています。つまり、システムからすべてを変更してすべてを実行し、責任を持って使用できます。


4

sudoがエイリアスされていないことを確認します。このように走る

/usr/bin/sudo /path/to/my/program

たとえば、次のようなシェルエイリアス:

alias sudo="sudo env PATH=$PATH"

この動作を引き起こす可能性があります。


あなたは正しいです、私のコメントはここで順不同でした、ごめんなさい。それにもかかわらず、私は興味をそそらsudoersれます-sudoによる処理を変更するためにエイリアスをどのように期待しますか。または、sudoこのエラーメッセージを常に出力してパスワードをすくうようなものにリダイレクトすることについて話していますか?それは...ここケースはほとんどありません
peterph

2
私はOPと同じ問題を抱えていました。それalias sudo="sudo env PATH=$PATH"は私の中にあることによって引き起こされることが判明しました~/.bashrc。自分で解決するだけでなく、やみくもに自分のビジネスに取り掛かるのではなく、このスレッドに沿ってやってくる他の誰かのための可能な解決策として答えを提出しました。
Sepero 14

1
それは問題ありませんが、明らかではない場合(この場合は少なくとも一部の人にとってはそうではありません)、何らかのコンテキストを提供し、人々が魔法の呪文を盲目的に使用するのを防ぐために説明に答えを入れるのは良いことです。+2(-(-1)+ +1)。:)
ピーター14

2

スクリプトを実行するときは、として実行する必要がありますsudo /path/to/my/script

編集:別の回答に対するコメントに基づいて、アイコンからこれを実行します。あなたは、作成する必要があります.desktopだけで、端末上のように、sudoをして、あなたのプログラムを実行ファイルを。

gtk-sudo視覚的なパスワードプロンプトの使用を検討することもできます。

おそらく、ルートとして物事を実行するべきではなく、ルート権限をまったく必要としないようにシステムをさらに変更することがより良い方法であるという考えを考慮する必要があります。


7
シェルスクリプトをsetuidにしないでくださいシェルスクリプトでsetuid許可するをご覧ください。
ジル

それはそのような悪いオプションなので、私はそれを言及さえしないことを考えました。私はそれを削除したばかりです。なぜなら、この質問者は、それが悪いアドバイスであるという警告があっても、そのアドバイスを使用するのではないかと心配しているからです。
カレブ

2

これは私のために問題を解決しました(また助けたかもしれない他の答えのいくつかを試みました):

呼び出していたスクリプトはにあり/usr/bin、書き込み許可のないディレクトリにあります(ただし、通常はそこにあるすべてのファイルを読み取ることができます)。スクリプトはchmodded + x(実行可能権限)でしたが、まだ機能しませんでした。このファイルをの代わりにホームディレクトリのパスに移動/usr/binすると、パスワードを入力せずにsudoで呼び出すことができました。

また、私が疑ったこと(将来の読者のために明確にする):スクリプトをsudoとして実行する必要があります。スクリプトを呼び出すsudoときに入力します。スクリプト内で実際にルートが必要なコマンドには使用しないでください(私の場合はキーボードのバックライトを変更します)。おそらくそれでも機能しますが、あなたはする必要はありませんし、そうしないより良い解決策のように思えます。sudo


2番目の段落は私の問題に答えていた
M.アフマドZafar

おめでとうございます!
リュック

4
実際にsudoスクリプト内で使用するsudoersことは、パスワードなしで問題のコマンドを実行するための適切な権限(で設定)があれば提供されます。それは物事をもう少し安全にします。
ペテルフ14

本当にこの答えを他の答えとの対話としてではなく、段階的な「これがあなたのやり方」として書き直したものを使うことができます
セイウチ猫

@WalrustheCat良い点。私の答えをもう一度読んで、私は少し自分自身を混乱させたかもしれないと思います。しかし、今のところ、正確な状況が何であったか覚えていないので、これ以上良い記事を書くことはできません。おそらくいくつかの回答の組み合わせであると思われる場合は、必ず新しい回答を送信してください!
リュック

1

別の可能性としては、インストール、構成、スーパーコマンドを使用してスクリプトを次のように実行することです。

super /path/to/your/script

あなたには、いくつかのバイナリ実行したい場合は、実行可能(おにコンパイルされている例えばELFです-whichいくつかのCソースコードからバイナリ)ではないルートとしてscript-を、あなたは可能性がある、それがすることを検討のsetuid(および実際に/bin/login/usr/bin/sudoそして/bin/suそしてsuperすべてその技術を使用しています)。ただし、非常に注意して、大きなセキュリティホールを開けることができます

具体的には、あなたのプログラムがparanoicallyコード化されなければならない、あなたは使用することができます(その潜在的に敵対的な利用者を想定し、「演技」の前に、すべての引数と環境と外部の条件をチェック)のseteuidを(2)と友人(も参照ではsetreuid(2) )を注意深く(capabilities(7)credentials(7)execve(2)も参照してください...)

このようなバイナリをインストールするときは(chmod(1)をchmod u+s読んで使用します。

しかし、非常に注意してください

そのようなことをコーディングする前に、高度なLinuxプログラミングを含むsetuidに関する多くのことを読んでください。

スクリプト、またはシバン処理されたものはsetuidできないことに注意してください。しかし、それをラップする小さなsetuid-binaryを(Cで)コーディングできます。


0

理想的には、どのコマンドを介しsudoて実行できるかをカスタマイズする場合/etc/sudoers.d/sudoersファイルを直接編集するのではなく、別のファイルでこれらの変更を行う必要があります。またvisudo、ファイルの編集にも常に使用する必要があります。コマンドを許可NOPASSWDしないでくださいALL

例: sudo visudo -f /etc/sudoers.d/mynotriskycommand

許可を与える行を挿入します。 myuser ALL= NOPASSWD: /path/to/your/program

その後、保存して終了するとvisudo、構文エラーがある場合は警告が表示されます。

sudo -lユーザー固有のNOPASSWDコマンドのいずれか%groupyouarein ALL=(ALL) ALLが出力のコマンドの前に表示される場合、ユーザーに付与されたアクセス許可を確認するために実行できます。パスワードの入力を求められます。

これらのsudoers.dファイルを大量に作成していることに気付いた場合は、ユーザーごとに名前を付けて作成し、視覚化しやすくすることができます。ファイル内のファイル名とルールの順序は非常に重要であり、最後にロードされたものが優先されることに注意してください。

00-99またはaa / bb / ccのプレフィックスを使用してファイル名の順序を制御できますが、数字のプレフィックスを持たないファイルがある場合は、番号の付いたファイルの後にロードされ、上書きされることに注意してください設定。これは、言語設定によっては、シェルが最初にソート番号を使用する「字句ソート」によって、「昇順」でソートするときに大文字と小文字が交互に挿入される場合があるためです。

実行してみてくださいprintf '%s\n' {{0..99},{A-Z},{a-z}} | sortprintf '%s\n' {{0..99},{A-Z},{a-z}} | LANG=C sortあなたの現在の言語の印刷物かどうかを確認するAaBbCcなどやABC、その後abc使用するのに最適な「最後」の文字のプレフィックスがどうなるかを決定します。


0

パスワードを要求せずにすべてのユーザーがsudoとしてプログラムを実行できるようにするには、次の行を追加できます

%sudo ALL=(root) NOPASSWD: /path/to/your/program

/etc/sudoers

%sudoが作成することに注意してください。


これはsudoルールを達成する1つの方法ですが、このルールにNOPASSWDフラグを設定してもパスワードプロンプトが表示される理由についての質問には答えていません。なぜ起こったのかについては、受け入れられた答えをご覧ください。
ジェフシャラー

0

以下は、オプションの一部がvariableである特定のオプションセットがある場合にのみ、パスワードなしでコマンド実行する場合です。私の知る限り、sudoers宣言で変数または値の範囲を使用することはできません。つまりcommand option1、次のものcommand option2を使用せずに明示的にアクセスを許可できます。

user_name ALL=(root) /usr/bin/command option1

ただし、構造がである場合command option1 value1、どこでもvalue1異なる可能性があるため、可能な値ごとに明示的なsudoers行が必要ですvalue1。シェルスクリプトはそれを回避する方法を提供します。

この回答は、M。Ahmad Zafarの回答に触発され、そこでのセキュリティ問題を修正しました。

  1. なしでコマンドを呼び出すシェルスクリプトを作成しますsudo
  2. スクリプトをルート特権フォルダー(例/usr/local/bin/)に保存し、ファイルをルート所有(例chown root:wheel /usr/local/bin/script_name)にし、他のユーザー(例chmod 755 /usr/local/bin/script_name)の書き込みアクセス権を持たないようにします。
  3. visudoを使用して、例外をsudoersに追加します。

    user_name ALL=(root) NOPASSWD: /usr/local/bin/script_name

  4. スクリプトを実行しますsudo script_name

たとえば、macOSのディスプレイスリープタイムアウトを変更したい。これは次を使用して行われます。

sudo pmset displaysleep time_in_minutes

スリープタイムアウトを変更することは、パスワード入力の手間を正当化するものではありませんpmsetが、多くのことを行うことができる無害なアクションであると考えています。

だから私は次のスクリプトを持っています/usr/local/bin/ds

#!/bin/bash
if [ $# -eq 0 ]; then
        echo 'To set displaysleep time, run "sudo ds [sleep_time_in_minutes]"'
else
        if [[ $1 =~ ^([0-9]|[1-9][0-9]|1[0-7][0-9]|180)$ ]]; then
                pmset displaysleep $1 
        else
                echo 'Time must be 0..180, where 0 = never, 1..180 = number of minutes'
        fi
fi

sudoersファイルの最後に次の行があります。

user_name ALL=(root) NOPASSWD: /usr/local/bin/ds

タイムアウトを3分に設定するには、通常のユーザーアカウントからスクリプトを実行しますuser_name

sudo ds 3

PS私のスクリプトのほとんどは入力の検証であり、必須ではありません。したがって、以下も機能します。

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