web-dev-qa-db-ja.com

ユーザーとしてログインすることと、root経由でsuを使用してユーザーを変更することとの違いは何ですか?

ある種のサーバーがある場合は、ssh user1@ipなどからアクセスできます。また、ssh root@ipを実行して、su特権を使用してrootユーザーに移動し、su user1に移動することもできます。私の考えでは、これらの両方の方法は同じユーザー環境(この場合は「user1」)につながるはずですが、実際の経験ではそうではなく、ssh user1@ipsu user1にインストールされているものがありますありません。

何故ですか?

17
Miguel Corti

SSHはログインシェルを開始します。 su、デフォルトではありません。

特に、これはそのユーザーの~/.profile(または同様のファイル)がソースされていないことを意味します。したがって、~/.profileで行った変更は有効になりません。次の場合もあります。

  • ログインシェルを起動しても、ルートの~/.profileにさまざまな変更が加えられ、ユーザーの環境を汚染する可能性があります。
    • /etc/profileおよび/etc/profile.d/*は、ユーザーごとに異なる設定を適用する場合があります(ただし、デフォルトではありません)
  • sSH構成では、ユーザーごとに設定が異なる場合があります。
  • PAM構成は異なります。たとえば、/etc/pam.d/sshには次のものがあります。

    session    required     pam_env.so user_readenv=1 envfile=/etc/default/locale
    

    一方、/etc/pam.d/suには次のものがあります。

    session       required   pam_env.so readenv=1 envfile=/etc/default/locale
    

    つまり、SSHは~/.pam_environmentをロードしますが、suはロードしません。 ~/.pam_environmentは環境変数のシェルに依存しない場所であり、GUI、TTYまたはSSHからログインする場合に適用されるため、これは大きなものです。

ログインシェルを開始するには、次のいずれかを実行します。

su - <username>
Sudo -iu <username>

例:

# su muru -c 'sh -c "echo $HOME $PATH"'
/home/muru /usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin:/usr/games:/usr/local/games
# su - muru -c 'sh -c "echo $HOME $PATH"'
/home/muru /home/muru/bin:/usr/local/bin:/usr/bin:/bin:/usr/local/games:/usr/games
# Sudo -iu muru sh -c 'echo $HOME $PATH'
/home/muru /home/muru/bin:/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin
# Sudo -u muru sh -c 'echo $HOME $PATH'
/root /usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin
# ssh muru@localhost 'echo $HOME $PATH'
/home/muru /home/muru/devel/go/bin:/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin:/usr/games:/usr/local/games

SSHを使用しても、シェルを起動する代わりにコマンドを実行すると、ログインシェルは実行されません(~/binおよびsu -にあるSSHテストにSudo -iがないことに注意してください)。真の結果を得るには、ログインシェルとしてシェルを実行します。

# ssh muru@localhost '$Shell -ilc "echo \$HOME \$PATH"'
/home/muru /home/muru/bin:/home/muru/devel/go/bin:/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin:/usr/games:/usr/local/games

これが、Sudo suSudo -sがルートシェルを取得する安っぽい方法である理由でもあります。これらの両方の方法は、環境によって汚染されています。


関連する:

15
muru