Linux における su と sudo の違い

root は、Linux をはじめとする UNIX 系 OS における管理者アカウントです。原則としてシステムに対してあらゆる操作が許されています。それゆえに、思いがけない操作ミスでシステムを破壊する可能性があり、常に root で作業するのは危険です。普段は操作の権限が適切に制限された一般ユーザーで作業し、必要なときだけ root になるのが最善といえます。

また、システムの侵入を試みる悪意ある第三者は、真っ先に管理者アカウントである root を攻撃対象とします。root でのリモートログインを許可していると、常にブルートフォースアタック (総当りによってパスワードを取得しようとする力まかせの攻撃手段) の脅威に晒されることになります。root でのリモートログインを禁止すれば、そのような攻撃を無効化できます。

以上のような事情から、一般ユーザーを経由して間接的に root になる必要が生じてくるわけです。

su は、別のユーザーに切り替わるためのコマンドです。特に、一般ユーザーから一時的に root になるときに利用されます。このコマンドを使うには、切り替わろうとしているユーザーのパスワードを知っている必要があります。

一つのマシンを複数の管理者で管理する際、su コマンドでは root のパスワードを共有する必要があります。そのような状況は、root パスワードの漏洩を引き起こしかねません。また、root になって作業した際、su では root ユーザーが実行したという記録しか残りません。

sudo は、別のユーザーの権限でコマンドを実行するためのコマンドであり、特に、一般ユーザーが root 権限のコマンドを実行するときに利用されます。sudo では、コマンドを実行したユーザーのパスワードを入力します。なので、sudo を導入すれば、root のパスワードを共有しないで済みます。

sudo では、sudoers ファイルを編集する (実際には、編集ミス防止のため visudo という専用コマンドで編集) ことで、操作の制限を細かく指定することができます。また、root になって作業した際、sudo では、いつ、だれが、どこから、どのコマンドを実行したかがログに保存されます。

sudo は su よりも高機能ですが、かといって、単純に su を sudo に置き換えるのは、セキュリティ的に危険な場合があります。

もし sudo によって全てのコマンドが実行可能だったとしたら、sudo を実行する一般ユーザーは root と本質的に同じものになってしまいます。これがまだ su であれば、仮に su の使用を許可された一般ユーザーアカウントが悪意ある第三者に乗っ取られても、その者が root パスワードを知らなければ一般ユーザー以上のことはできません。

ただ、root アカウントを常に使用するのに比べれば sudo コマンドで root 権限のコマンドを実行するほうがすっと安全であり、運用上の利便性を優先するポリシーの下では sudo による運用も実際に行われています。

su においては root パスワードの管理が問題になりましたが、sudo においては sudo コマンドを許可した一般ユーザーのパスワード管理が問題になります。いずれにせよ、これらのコマンドの使用をむやみやたらに許可すべきでないという点では共通しています。

あとは、su は root になったまま継続的に複数のコマンドを実行します。sudo は一般に一つのコマンドを実行しますが、デフォルト設定では一定時間パスワードをキャッシュします。いずれにせよ、席を離れる際には画面をパスワードでロックする習慣をつけたほうがよいでしょう。

su と sudo の両者にはそれなりに違いがあるものの、それらをどう使い分けるかは、まさにケース・バイ・ケースと言うしかなく、明文化するのはなかなか難しいところです。