web-dev-qa-db-ja.com

Ubuntuで$ HOMEを変更しないようにSudoを設定するにはどうすればよいですか?

Ubuntu 12.04では、$ HOME変数がSudo -s変更されていないため、通常のユーザーがregularuserの場合、状況は次のようになります。

$ cd
$ pwd
/home/regularuser
$ Sudo -s
# cd
# pwd
/home/regularuser

私はずっと前にUbuntuを放棄したので確信が持てませんが、これはデフォルトの動作だと思います。だから、私の質問は:

Q1。これはどのように行われますか?設定はどこにありますか?

Q2。どうすれば無効にできますか?

編集:回答をありがとうございました。少し明確になりましたが、私が探している回答を得るには、いくつか質問を追加する必要があると思います。

Q3。 Debian Sudo -sでは、$ HOME変数を/rootに変更します。私が答えから得たものから、man Sudoで実行されたSudo -sシェルは/etc/passwdで与えられたものですよね?

Q4。ただし、UbuntuとDebianの両方で、ルートの/etc/passwdで指定されたシェルは/bin/bashです。どちらのシステムでも、$ HOMEに関する限り、.profileまたは.bashrcファイルの違いがどこにあるかを見つけることができないため、Sudo -sの動作が異なります。これについて何か助けはありますか?

42
alxs

Sudoには、多くのコンパイル時構成オプションがあります。 Sudo -Vを使用して、バージョンの設定を一覧表示できます。 Debian wheezyとUbuntu 12.04の構成の違いの1つは、HOME環境変数がUbuntuでは保持されるがDebianでは保持されないことです。どちらのディストリビューションでも、安全に保存できると明示的にマークされているものを除いて、すべての環境変数を消去します。したがって、Sudo -sはUbuntuではHOMEを保持しますが、DebianではHOMEが消去され、Sudoがターゲットユーザーのホームディレクトリに設定します。

sudoers ファイルでこの動作を上書きできます。 visudoを実行して、sudoersファイルを編集します。関連するオプションがいくつかあります。

  • env_keepは、保持する環境変数を決定します。 Defaults env_keep += "HOME"を使用して、呼び出し元のHOME環境変数を保持するか、Defaults env_keep -= "HOME"を使用して消去します(ターゲットユーザーのホームディレクトリに置き換えます)。
  • env_resetは、環境変数をまったくリセットするかどうかを決定します。多くの場合、特定のコマンドの実行を許可するルールには環境変数のリセットが必要ですが、任意のコマンドの実行を許可するルールには直接的なセキュリティ上のメリットはありません。
  • always_set_homeが設定されている場合、env_resetが無効になっているため、またはHOMEenv_keepリスト内にあるために保存されていても、HOMEが上書きされます。 HOMEが保存されていない場合、このオプションは効果がありません。
  • set_homealways_set_homeに似ていますが、Sudo -sにのみ適用され、明示的なコマンドでSudoを呼び出す場合は適用されません。

これらのオプションは、特定のソースユーザー、特定のターゲットユーザー、または特定のコマンドに対して設定できます。詳細については、sudoersマニュアルを参照してください。

オプション-Hを渡すことにより、HOMEへの特定の呼び出しに対して常にSudoをオーバーライドすることを選択できます。

シェルがHOMEの値をオーバーライドすることはありません。 (未設定の場合はHOMEが設定されますが、Sudoは常にHOMEを何らかの方法で設定します。)

Sudo -iを実行すると、Sudoは初期ログインをシミュレートします。これには、HOMEをターゲットユーザーのホームディレクトリに設定し、 ログインシェル を呼び出すことが含まれます。

使用する Sudo -H -i の代わりに Sudo -sインタラクティブログインルートシェルを取得するには:

Sudo -H -i
cd
pwd -P  #  /private/var/root  (on Mac OS X 10.6.8)

man Sudo

-H      The -H (HOME) option sets the HOME environment variable to
        the homedir of the target user (root by default) as
        specified in passwd(5).  By default, Sudo does not modify
        HOME (see set_home and always_set_home in sudoers(5)).
17
franco

これはSudoの動作とはほとんど関係がなく、「ログインシェル」と「非ログインシェル」の違いに関係しています。クイックフィックスは

$ Sudo -i

で見ることができるように:

$ Sudo -s
# id
uid=0(root) gid=0(root) groups=0(root)
# echo $HOME
/home/msw
# exit
$ Sudo -i
# echo $HOME
/root
# pwd
/root

Sudoマニュアルに記載されているように:

-i(初期ログインをシミュレート)オプションは、ターゲットユーザーのパスワードデータベースエントリで指定されたシェルをログインシェルとして実行します。これは、.profileや.loginなどのログイン固有のリソースファイルがシェルによって読み取られることを意味します。コマンドが指定されている場合、シェルの-cオプションを介して実行するためにコマンドがシェルに渡されます。コマンドが指定されていない場合、対話型のシェルが実行されます。

5
msw

ルートシェルを取得する非常に人気のある方法も使用しています:

 $ Sudo su - 
 # id
 uid=0(root) gid=0(root) groups=0(root)
 # pwd
 /root
2
Satanowski

UbuntuとDebianでのSudo -sの異なる動作を取り除くには、Sudoラッパーを使用できます(Q4に回答)。

sudos() {
   local PATH="$(getconf PATH)" root_homedir
   root_homedir="$(Sudo -H sh -c 'printf "%s" "$HOME"')"
   Sudo sh -c 'export HOME="$0"; exec sh -i' "$root_homedir"
   return 0
}

Sudo -k
sudos
{
logname
whoami
id -un
id -ur
echo "PATH: $PATH"
}
exit
echo "PATH: $PATH"
0
tacz