最近のLinux記事のほとんどは、ルートにログインするのではなく、Sudoを使用することを勧めています。このアドバイスは非常に根深いため、一部のディストリビューションではrootログインを自動的に許可していません。実際、ユーザーのパスワードを使用してSudoが事前構成されており、任意のコマンドをrootとして実行します。
何がうまくいかないのですか?
実際には、上記のコマンドを実行すると、彼はほぼrootとしても実行される可能性があります !!
マルウェアは何をしますか?
含めるように.bashrcを変更する
export PATH=/home/user/.hack:$PATH
スクリプトを〜/ .hackにドロップします。
ハッカーは(ユーザーとルート)パスワードを取得します。
同じ懸念がプレーンなsuにも存在し、回避する唯一の方法は次のとおりです。
最初のオプションははるかに安全なようですが、現代の慣習に反するようです。どうして?
Sudoには有効な便利な使用法がありますが、それらはすでに他の投稿で適切に説明されているため、ここでは詳しく説明しません。ただし、Sudo構成ファイルである sudoers(5)
を示します。 Sudoで可能な広範な構成の一部を示しています。純粋にセキュリティ上の理由から、Sudoを使用して通常のユーザーからrootに昇格するべきではない場合と理由を説明します。
短い回答:通常のユーザーが危険にさらされている可能性がある場合、Sudoを安全に使用する方法はありません。セキュリティのためではなく、利便性のためにのみ使用してください。同じことはsuや、通常のユーザーをより特権のあるユーザーに昇格させるために使用できる他のすべてのプログラムにも適用されます。
長い答え:Sudoのフルパスを使用することで悪意のある環境から保護されるとは限りません。それはよくある誤解です。 bash関数は、先頭に/
を含む名前をハイジャックすることもできます。以下を実行してみてください:
$ echo $Shell
/bin/bash
$ function /usr/bin/Sudo { echo "Trust me, now put in your password:"; }
$ /usr/bin/Sudo id
Trust me, now put in your password:
あなたmustは、オプション1、別名agettyでのログイン、または別のttyへのログインのみを使用する必要があります(一部のディストリビューションでは、tty1がXorgを実行していることに注意してください。 Fedoraなど。ただし、ほとんどのディストリビューションでは、tty1は予備のttyであり、Xorgはtty7で実行されます。 ただし、マルウェアはハイジャックできることに注意する必要があります ctrl+alt+f1 偽の画面が表示されるため、 Secure Attention Key の組み合わせ(SAK、つまり alt+sysrq+k Linuxシステムでは)、そのtty内のすべてのプロセスを強制終了します。これにより、偽のログイン画面が強制終了され、実際の画面のみが表示されます。 rootパスワードを盗もうとする偽のログイン画面がない場合(うまくいけばそうです)、agettyが再起動するだけで、ログインプロンプトが点滅するだけです。一部のシステムでは、SAKを含む多くのSysRq機能が無効になっています。 /proc/sys/kernel/sysrq
に整数1を書き込むことで、一時的にそれらすべてを有効にすることができます。 /proc/sys/kernel/sysrq
の値はビットマップなので、/etc/sysctl.conf
で永続化する前に、現在のビットマップを調べ、SAKサポートを追加するために変換する必要があるものを計算します。永久に1に設定するのは悪い考えです(だれでもできるようにしたくない) alt+sysrq+e xscreensaverを殺すためですか?).
通常のユーザーを保護し、Sudoまたはsuを安全に使用できるという考えは、非常に危険な考えです。 LD_PRELOAD
のように、実行中のセッションをハイジャックする方法は無数にあります。これは、強制的にロードされる共有オブジェクト(ライブラリ)を指す環境変数です。プログラムによってその動作を変更します。 suやSudoなどのsetuidプログラムでは機能しませんが、bashや、suやSudoを実行する他のすべてのシェルで機能し、すべてのキーストロークを見ることができます。 LD_PRELOAD
は、ユーザーとして実行されているプログラムをハイジャックできる唯一の変数ではありません。 LD_LIBRARY_PATH
は、システムライブラリの代わりに悪意のあるライブラリを使用するようにプログラムに指示できます。実行中のプログラムの動作をさまざまな方法で変更するために使用できる もっと多く 環境変数があります。基本的に、環境変数が危険にさらされる可能性がある場合、ユーザーとそのユーザーとして入力されたすべてのキーストロークが危険にさらされる可能性があります。
それが十分でない場合、ほとんどのディストリビューションでは、ユーザーは ptrace()
をGETREGS
またはPEEKTEXT/PEEKDATA
オプションとともに使用して、プロセスのすべてのメモリを表示できます同じユーザーとして実行している(suまたはSudoを実行しているbashプロセスなど)。それを無効にするディストリビューションを使用している場合(たとえば Yama LSM を使用して)、プロセスは process_vm_readv()
およびprocess_vm_writev()
それぞれ。一部のカーネルでは、書き込みを行うプロセスが同じユーザーである限り、/proc/pid/mem
を介してメモリに直接書き込むこともできます。 Linuxカーネルには、プロセスが相互に干渉できないことを確認するために、無数のセキュリティチェックがあります。ただし、これらはすべてinter-user保護ではなく、intra-user保護です。 Linuxカーネルは、ユーザーAとして実行されるすべてのことはユーザーAによって信頼されると想定しているため、ユーザーAとしてrootにsuする場合、rootはそのユーザーと同じくらい信頼されている必要があります。
Xorgに進む前に、まずXorgがキーロガーから 保護なし を提供すると言ってみましょう。つまり、Xorgが実行されているttyでSudoまたはsuを使用すると、同じユーザーとして実行されているすべてのプロセスがキーストロークを傍受(および注入)できるようになります。これは、X11プロトコルのセキュリティモデルでは、X11 Cookieにアクセスできるものはすべて信頼され、そのCookieはユーザーの下で実行されているすべてのものにアクセスできると想定しているためです。これはX11プロトコルの基本的な制限であり、UIDの概念がLinuxにあるのと同じくらい深く根付いています。これを無効にする設定や機能はありません。これは、suまたはSudo(またはgksu、gksudo、kdesu、kdesudo、pinentryなどのフロントエンド)に入力したものを含め、Xorgセッションで入力したものはすべて、同じユーザー、つまりブラウザー、ゲームとして実行されているすべてのユーザーが傍受できることを意味します、あなたのビデオプレーヤー、そしてもちろんあなたの.bashrcによってフォークされたすべてのもの。これを自分でテストするには、1つのターミナルで次のコマンドを実行し、別のターミナルに移動してSudoでコマンドを実行します。
$ xinput list
Virtual core pointer id=2 [master pointer (3)]
↳ Virtual core XTEST pointer id=4 [slave pointer (2)]
↳ ETPS/2 Elantech Touchpad id=13 [slave pointer (2)]
Virtual core keyboard id=3 [master keyboard (2)]
↳ Virtual core XTEST keyboard id=5 [slave keyboard (3)]
↳ Power Button id=8 [slave keyboard (3)]
↳ USB Camera id=10 [slave keyboard (3)]
↳ AT Translated Set 2 keyboard id=12 [slave keyboard (3)]
↳ Video Bus id=7 [slave keyboard (3)]
↳ Sleep Button id=9 [slave keyboard (3)]
↳ Asus WMI hotkeys id=11 [slave keyboard (3)]
↳ Power Button id=6 [slave keyboard (3)]
$ xinput test 12 # replace 12 with the id number of your keyboard
key press 45
key press 44
key release 40
key press 41
key release 45
key release 44
key release 41
key press 31
^C
この特定のテストが機能しない場合は、XTEST
拡張機能がアクティブになっていないことを意味します。アクティブでなくても、 XQueryKeymap()
を使用してキーボードイベントを記録することは可能です。あなたが取るべき教訓は、侵害されたユーザーを介してsuまたはSudoを使用してパスワードを安全に入力する方法がないことです。絶対に新しいttyに切り替えてSAKを使用してから、rootとして直接ログインする必要があります。
Sudo
は、「rootとしてログインしてから、必要なことを何でも実行する」よりも より細かい制御 を許可するためです。たとえば、一部のユーザーが特定のコマンド(ラッパースクリプトや「許容される」バイナリなど)の実行のみを許可されるようにSudo
を構成できます。シングルユーザーのコンピューターを侵害するトロイの木馬が心配ですが、Sudo
は、複数のユーザーが管理するサーバーでのログ記録とアクセス制御を可能にするために作成されました。
もちろん、シングルユーザーシステムでは、 重要なファイルはユーザーのファイル であり、ユーザーのアカウントにアクセスできるようになるとすでにこれらのファイルにアクセスできますなので、パスワードを取得することはもはや重要ではありません。パスワードが目標である場合(たとえば、パスワードを再利用する誰かを攻撃している場合)でも、Sudo
を使用せずにパスワードを取得する方法はたくさんあります。たとえば、最近、デフォルトでインストールされる2つのプログラムに遭遇しました。これらのプログラムは、パスワードまたはパスワードエラーをプレーンテキストで記録します。
最後に、コマンドを誤って入力した場合の影響(rm_-rf_._/
は明らかな例です)はそれほど深刻ではないため、可能な限りrootとして実行しないことをお勧めします。 「rootとしてログインしていることを忘れて破壊的なことをする」のではなく、コマンドの最初にSudo
を書くという追加の手順を要求することで、単純だが重大なミスを回避できます。
他のユーザーが何を言っているかは別にして、Sudoはコマンドを実行しているユーザーの元のIDも保持します。つまり、コマンドを実行したユーザーIDを追跡できます。マルチユーザー環境でrootを使用している場合、uidが0になるため、単一ユーザーに対するコマンドの実行を追跡できません。
私にとって、Sudo
を使用する最大の理由の1つは(su
とは対照的に)、管理するすべてのサーバーの「rootパスワード」を追跡して変更する必要を回避することですそれを知っている誰かが会社を辞めるたびに。
代わりに、wheel
グループのメンバーを管理するだけで済みます。グループのメンバーは、お互いのパスワードを強制的に変更しなくても、頻繁に変更することができます。
これはおそらくそれ自体で全体の回答とは見なされませんが、完全を期すために、承認された回答に含める必要があります。
Rootとして実行しない理由は、Sudoを使用することで、特定のコマンドをrootとして実行するという意識的な決定を下しているためです。
ルートとして実行すると、不注意なタイプミスによって1日が台無しになってしまいます。