web-dev-qa-db-ja.com

シェルスクリプトでrootパスワードを安全に渡す

私は常にコンソールモードでGNU/Linuxラップトップを起動します。しかし、時々私はGUIモードを立ち上げる必要があります。常にrootパスワードを入力する必要があります。そこで、次のスクリプト「gogui.sh」を作成して/usr/bin

#!/bin/bash
echo "mypassword" | Sudo service lightdm start

誰かがファイルを読んでも、簡単に私のパスワードを見ることができるので、それは本当に愚かな考えです。

これの代替はありますか?

7
Saeid Yazdani

スクリプトでパスワードをSudoに渡してもまったく意味がありません。代わりに、Sudoルール NOPASSWDタグを使用して実行する特定のコマンドを追加 を追加します。コマンド固有のNOPASSWDルールは、一般的なルールの後に置く必要があることに注意してください。

saeid ALL = (ALL:ALL) ALL
saeid ALL = (root) NOPASSWD: service lightdm start

しかし、これはおそらくいずれにしても役に立たないでしょう。 lightdm startはログインプロンプトを開始しますが、他のユーザーにグラフィカルにログインさせる場合にのみ必要です。 GUIセッションを開始するだけの場合は必要ありません。代わりに、 startx を呼び出して、テキストモードセッションからGUIセッションを開始します。これには特別な権限は必要ありません。

startxはlightdmが使用するものと同じデフォルトのセッションタイプを取得しない可能性があるため、ウィンドウマネージャーまたはデスクトップ環境を明示的に指定する必要がある場合があります。

startx -- gnome-session

いくつかのオプションがあり、そのうちの1つは、NOPASSWDフラグを指定したvisudoを使用して特定のコマンドを追加することです。

%wheel ALL=(ALL) NOPASSWD: /path/to/myscript

cat /path/to/myscript
#!/bin/bash
service lightdm start
8
Lambert

[〜#〜]編集[〜#〜]
Unityについて言及しているコメントでちょうど気づいたので、Ubuntuを実行しているようです。私の元の答えはSysVinitシステムに向けられていましたが、互換性のために telinit のようなコマンドがまだ存在し、機能しますディストリビューションではSystemdまたはUpstartを使用します。

SysVウェイ

    telinit 5

最新のSystemdシステムでは、 telinitsystemctl にリダイレクトされます。

Systemd way

    systemctl isolate runlevel5.target

または

    systemctl isolate graphical.target

元の答え:
Systemd以外の古いディストリビューション(RHEL/CentOS 6以前など)では、コンソールモードからGUIに切り替える最も簡単な方法は telinit コマンドを使用することです。たとえば、RHEL/Centosディストリビューションでは、マルチユーザーテキストベースモードは実行レベル3で、マルチユーザーGUIモードは実行レベル5です。コンソールからGUIモードへの切り替えは、次のように行われます。デフォルトでは、telinitにはroot権限が必要です。これをパスワードなしの通常のユーザーとして実行するには、sudoersエントリが必要か、telinit実行可能ファイルにsetuidフラグを設定する必要があります。 Sudoメソッドは、アカウントのみに制限できるため、推奨される方法です。

3
Nigel Tufnel

古典的なUNIXの方法は、スクリプトを作成することです setuid

$ Sudo chown root gogui.sh  #not necessary if root is already the owner of the file
$ Sudo chmod u+s gogui.sh

これにより、ファイルに特別な許可ビットが設定されます。

$ ls -l gogui.sh
  -rwsr-xr-x 1 root root [omitted] gogui.sh

(4番目の位置のsではなく、xに注意してください。)

これを行うと、スクリプトを実行するたびに、スクリプトを実行するユーザーの権限ではなく、ファイルの所有者の権限で実行されます。

スクリプトgogui.shを単純化して、

/usr/sbin/service lightdm start

実行可能ファイルの明示的なパスを追加したことに注意してください(which serviceと入力して見つけた)。これは、setuidファイルで必要です。そうしないと、serviceにあるPATHという最初のプログラムが実行されます。明示的なパスを忘れるとhugeのセキュリティ問題が発生します。これは、すべてのユーザーがPATH変数を微調整し、root権限で任意のプログラムを実行できることを意味します。

必要に応じて、他のユーザーがchgrp some_group gogui.sh; chmod o-x gogui.shを使用してファイルを実行できないように制限することもできます。これにより、ファイルはsome_groupのメンバーに対してのみ実行可能になります。

2
Federico Poloni

特にSudoを参照しているので、 Gillesの答え に固執します。ただし、質問のタイトルは単にプログラムのstdinのパスワードを取得することに関するものであり、私も最近同様の状況にありました。

echo $(read -sp "Password: " password; echo $password) | yourcommand

私はおそらくそのためにいくらかバッシングを稼ぐでしょうが、それはうまくいきました。

bashと言えば、おそらくここでも使用できます

yourcommand <$(read -sp "Password: " password; echo $password)
0
Tobias Kienzler