DUICUO

Linux の su と sudo の違いは何ですか?

`su` コマンドと `sudo` コマンドはどちらも、非特権ユーザー(root 以外のユーザー)が実行できないシステム管理タスクをユーザーが実行できるようにします。`sudo` コマンドを好む人もいます。例えば、Seth Kenlon 氏は最近、「Linux で sudo を使用する 5 つの理由」を公開し、`sudo` の多くの利点を称賛しています。

一方、私は「su」コマンドを好み、システム管理作業のほとんどで「sudo」よりも使用しています。この記事では、この2つのコマンドを比較し、なぜ私が「su」を「sudo」よりも好むのか、そしてなぜ両方を使い続けているのかを説明します。

システム管理者の歴史的視点

`su` コマンドと `sudo` コマンドは、異なる用途を想定して設計されました。初期の Unix コンピュータでは、root アカウントを唯一の管理アカウントとして使用する専任のシステム管理者が必要でした。当時、root パスワードを持つユーザーは、テレタイプマシンや CRT 端末に root としてログインし、Unix コンピュータの管理に必要な管理タスクを実行していました。root ユーザーは、文書の作成や個人メールの管理など、root 以外の操作を行うための非 root アカウントも持っていました。

これらのコンピュータには通常、多くの非rootユーザーアカウントが存在しますが、完全なrootアクセスを必要とするユーザーはいません。ユーザーがrootとして1つか2つのコマンドを実行する必要がある場合もありますが、それは稀です。多くのシステム管理者はrootとしてログインし、作業完了後にrootセッションを終了し、時には一日中rootとしてログインしたままでいる必要があります。ほとんどのシステム管理者はsudoをほとんど使用しません。これは、基本的なコマンドを実行するのに必要な入力よりも多くの入力が必要になるためです。これらのツールはすべて権限を昇格できますが、その方法は非常に異なります。この違いは、それぞれが異なるユースケースに重点を置いていることに起因しています。

須藤

sudoの本来の目的は、rootユーザーが1人または2人の非rootユーザーに、頻繁に使用する1つまたは2つの特定のコマンドへのアクセス権限を付与できるようにすることでした。sudoコマンドを使用すると、非rootユーザーは、ユーザーの追加と削除、他のユーザーのファイルの削除、新しいソフトウェアのインストール、その他現代のLinuxホストの管理に一般的に必要なタスクを実行するために必要な昇格された権限に一時的にアクセスできます。

昇格された権限を必要とする、頻繁に使用される1つまたは2つのコマンドへのアクセスをユーザーに許可することで、システム管理者は大量のユーザーリクエストを回避し、待機時間を短縮できます。`sudo`コマンドはユーザーアカウントをrootに切り替えません。ほとんどの非rootユーザーには、完全なrootアクセス権を与えるべきではありません。ほとんどの場合、`sudo`はユーザーが1つまたは2つのコマンドを発行することを許可し、その後、権限の昇格が期限切れになります。この短い間隔(通常は5分に設定されています)の間、ユーザーは昇格された権限を必要とする必要な管理タスクを実行できます。ユーザーが昇格された権限を引き続き使用する必要があり、別のタスク関連コマンドを発行する準備ができていない場合は、`sudo -v`コマンドを実行してログイン情報を再認証し、間隔をさらに5分延長することができます。

sudoコマンドの使用には、確かに副作用があります。非rootユーザーが使用したコマンドのログエントリとそのIDが生成されます。これらのログは、インシデント後の分析で、ユーザーにさらなるトレーニングが必要かどうかを判断するのに役立ちます。

`su`コマンドは、非rootユーザーが権限をrootに昇格させ、実質的にrootユーザーになれるように設計されています。唯一の要件は、ユーザーがrootパスワードを知っていることです。ユーザーはrootとしてログインしているので、この点に関しては制限はありません。`su`コマンドによる権限昇格には時間制限はありません。ユーザーは再認証を受けることなく、好きなだけrootとして作業を続けることができます。作業が完了したら、`exit`コマンドを実行してrootから非rootアカウントに戻ることができます。

論争と変化

最近、suとsudoの使い方に関して意見の相違があります。 「真のシステム管理者はsudoを使わない」—ポール・ヴェネツィア

Venezia氏は記事の中で、多くのシステム管理者にとってsudoは不要なツールとして使われていると述べています。彼はこの見解を擁護したり説明したりすることについては深く触れず、ただそれが真実だと述べているだけです。私も同感です。システム管理者にとって、これはまさにその通りです。仕事をこなすのに補助輪は必要ありません。むしろ、補助輪は往々にして邪魔になるものです。

しかし、時代は変わりました。アメリカのフォークミュージックの父、ボブ・ディランの言葉は正しかったのです。一人一台のコンピューターという時代の到来以来、コンピューターの管理方法は大きく変化しました。多くの環境では、コンピューターのユーザーが管理者を兼任するケースが増えています。そのため、これらのユーザーに部分的なルート権限を付与する必要があります。最近のディストリビューション(Ubuntuやその派生系など)の中には、特権タスクのみにsudoコマンドを使用するように設定されたものも存在します。これらのディストリビューションでは、ルートユーザーとして直接ログインしたり、suコマンドを使用してルートユーザーになったりすることはできないため、ルート以外のユーザーがルート権限にアクセスできるようにするためにsudoコマンドが必要になります。この環境では、すべてのシステム管理タスクはsudoを使用して実行されます。

この設定は、rootアカウントをロックし、通常のユーザーアカウントをwheelグループに追加することで実現できます。しかし、この設定は簡単に回避できます。

まずはUbuntuホストまたは仮想マシンで自由に実験してみてください。私はUbuntu 16.04 LTS1をインストールし、VirtualBoxを使って仮想マシンにインストールしました。インストールプロセス中に、この実験用に「student」という非rootユーザーを作成し、簡単なパスワードを設定しました。

ユーザー「student」としてログインし、ターミナルセッションを開きます。`/etc/shadow`ファイルの「root」のエントリを確認します。暗号化されたパスワードはこのファイルに保存されています。

学生@ubuntu1:~$ cat /etc/shadow
cat: /etc/shadow: 権限が拒否されました

権限が拒否されたため、`/etc/shadow` ファイルを参照できません。これはすべてのディストリビューションに共通しており、権限のないユーザーが暗号化されたパスワードを閲覧・アクセスできないようにするためのものです。暗号化されたパスワードは、一般的なハッキングツールで解読される可能性があります。では、`su -` を使って root 権限を取得してみましょう。

学生@ubuntu1:~$ su -
パスワード: <ルートパスワードを入力してください - ただし、ルートパスワードはありません>
su: 認証失敗

左右にスワイプしてコード全体を表示しようとしても、rootアカウントにパスワードが設定されておらずロックアウトされているため、表示できません。`sudo`コマンドを使用して`/etc/shadow`ファイルを表示してください。

学生@ubuntu1:~$ sudo cat /etc/shadow
[sudo] 学生のパスワード: <学生のパスワードを入力>
ルート:!:17595:0:99999:7:::
<中略>
学生:$6$tUB/y2dt$A5ML1UEdcL4tsGMiq3KOwfMkbtk3WecMroKN/:17597:0:99999:7:::
<中略>

左右にスワイプすると、完全なコードが表示されます。出力は省略し、ルートユーザーと学生ユーザーのエントリのみを表示しています。また、暗号化されたパスワードも短縮されているため、エントリは1行に収まります。フィールドはコロン (:) で区切られており、2番目のフィールドはパスワードです。ルートパスワードフィールドは「bang」、つまり感嘆符 (!) で示されていることに注意してください。これは、アカウントがロックされ、使用できないことを示しています。

ここで、root アカウントを真のシステム管理者として使用するには、root アカウントのパスワードを設定する必要があります。

 Student@ubuntu1:~$ sudo su -
[sudo] 学生のパスワード: <学生のパスワードを入力>
root@ubuntu1:~# パスワード root
新しい UNIX パスワードを入力してください: <新しい root パスワードを入力してください>
新しい UNIX パスワードを再入力してください: <新しい root パスワードを再入力してください>
passwd: パスワードが正常に更新されました
ルート@ubuntu1:~#

左右にスワイプしてコード全体をご覧ください。これで、コンソールで直接rootとしてログインしたり、コマンドごとに`sudo`を使う代わりに`su`でrootになることができます。もちろん、いつでも`sudo su -`でrootとしてログインできますが、わざわざそうする必要はありません。

誤解しないでください。Ubuntuとその派生ディストリビューションは素晴らしいです。私は長年、それらをいくつか使ってきました。Ubuntuや関連ディストリビューションを使う際に最初に行うことの一つは、rootとして直接ログインできるようにrootパスワードを設定することです。

他のディストリビューション(Fedoraとその派生ディストリビューションなど)では、インストールプロセス中にいくつかの興味深いオプションが提供されるようになりました。私がこれに気づいた最初のFedoraバージョンはFedora 34でした。これらのインストールオプションの1つであるrootパスワードの設定は、このページで見つけることができます。新しいオプションでは、「rootアカウントをロック」を選択してUbuntuのrootアカウントをロックできます。また、このページには、パスワードを使用してホストにrootとしてリモートSSHログインできるようにするオプションもありますが、これはrootアカウントがロック解除されている場合にのみ適用されます。

ページの2番目のオプションでは、非rootユーザーアカウントを作成できます。このページのオプションの1つに「このユーザーを管理者にする」があります。このオプションを選択すると、ユーザーIDがwheelグループと呼ばれる特別なグループに追加され、そのグループのメンバーにsudoコマンドの使用権限が付与されます。Fedora 36では、このチェックボックスの説明にwheelグループについて言及されています。

複数の非rootユーザーを管理者として設定できます。この方法で管理者に指定されたユーザーは、sudoコマンドを使用してLinuxコンピューター上のすべての管理タスクを実行できます。

Linuxでは、インストール時に作成できる非rootユーザーは1人だけなので、作成時にwheelグループに他の新規ユーザーを追加できます。rootユーザーまたは他の管理者は、テキストエディタまたは「usermod」コマンドを使用して、既存のユーザーをwheelグループに直接追加できます。今日の管理者は、ほとんどの場合、新しいプリンタの追加、アップデートや新しいソフトウェアのインストール、不要になったソフトウェアの削除など、いくつかの基本的なタスクを実行するだけで済みます。これらのGUIツールは、rootまたは管理者のパスワードを要求し、管理者として指定されたユーザーが入力したパスワードを受け入れます。

Linux で su と sudo を使用するにはどうすればいいですか?

私はsuとsudoの両方を使っています。どちらも私のシステム管理者ツールボックスの中で重要な位置を占めています。

Ansibleプレイブックと、バックアップ用に作成したBashプログラム「rsbu」を実行するためにrootアカウントが必要なため、rootアカウントをロックできません。これらのコマンドはどちらも、私が作成した他のいくつかの管理用Bashスクリプトと同様に、実行にroot権限が必要です。これらのタスクやその他の一般的なタスクを実行できるように、`su`コマンドを使用してユーザーをrootに切り替えています。`su`を使用して権限をrootに昇格することは、特に問題の特定とトラブルシューティングに役立ちます。

非rootユーザーがroot権限を必要とするタスクを実行する場合、sudoコマンドを使用します。sudoersファイルで非rootアカウントを設定し、タスクの完了に必要な1つか2つのコマンドのみにアクセスできるようにしています。私自身も、アップグレード権限で1つか2つの簡単なコマンドを実行する必要がある場合にsudoを使用しています。

結論は

使用するツールよりも、仕事をやり遂げることが重要です。vimとEmacs、systemdとSystemV、RPMとDEB、sudoとsuのどれを使っても、大した違いはありません。

最終的には、自分に最も便利で適したツールを使うべきです。Linuxやオープンソースの最大の利点の一つは、多くのツールを利用できることです。`su`と`sudo`はそれぞれに利点があり、意図したユースケースに合わせて適切に使用すればどちらも優れたパフォーマンスを発揮します。私はほとんどの作業で`su`を使用しています。なぜなら、それが私のワークフローに最も適しているからです。

参考リンク:

ps://opensource.com/article/22/6/linux-su-vs-sudo-sysadmin