元バンドマンITエンジニアの語り場

技術とか趣味とか日々の至福と鬱憤とか

【Linux】sudoとsuについて

たまに「sudo suコマンド」って何ですか?なんて聞かれることがあるので、 sudo と su について簡単にまとめてみます。

suコマンドとは?


サーバーの操作をする際に「root」でログインして作業をする、なんてシーンは基本的にないかと思います。 しかし、時にはroot権限でしか実行できないコマンドやファイルがありますよね。 root権限が必要なときにだけrootユーザーとして作業を行えたら便利です。 このような時に登場するのが「suコマンド」であり、suコマンドを使用すると一時的に別のユーザーに切り替えることができます。

書式
su [ - [ "ユーザー名" ] ]

以下の画像では「su root」を実行することでrootに切り替えています。
「idコマンド」でユーザー情報を確認すると「root」になっていることがわかるかと思います。

f:id:Mickey6:20210501001304p:plain

「-」の有無は結構重要です。「-」があると、直接切り替え後のユーザーでシステムにログインした時と同様に、環境がリセットされます。つまりカレントディレクトリは切り替え後のユーザーのホームディレクトリになるなりますし、切り替え前のユーザーで定義していた環境変数も初期化されます。

下の画像は「-」をつけてrootに切り替えた場合の出力結果です。
上の画像と比較すると違いがわかりますね。

f:id:Mickey6:20210501001446p:plain

ちなみに、ユーザー名を省略して「suコマンド」を実行するとrootに切り替わります。
以下が実行結果です。

f:id:Mickey6:20210501001611p:plain

sudoコマンドとは?


「suコマンド」によってrootに切り替えてしまえば、作業者はrootユーザーが実行できるあらゆる操作を同様にできてしまうことになります。恐ろしいですね。 rootユーザーに切り替えるまでもない、特定のコマンドだけ管理者として実行したいんだよな〜という時に便利なのが「sudoコマンド」です。

「sudoコマンド」はユーザーを切り替えずに他のユーザーやrootの権限でコマンドを実行したりファイルを操作したりできるというわけです。

書式
sudo [ オプション ] [ 実行したいコマンド ]

オプションには以下のようなものがあります。

オプション 意味
-b バックグラウンドで実行する
-l 許可されているコマンドを表示する
-g コマンド実行時にグループ名を指定する
-s rootユーザーを保持する(連続してrootで操作する)
-S 標準入力でパスワードを読み込む
-u コマンド実行時にユーザー名またはユーザーIDを指定する

例えば以下のように「-lオプション」をつけて実行すると、自分に許可されているコマンドを確認することができます。 (この場合はすべてのコマンドが許可されています)

f:id:Mickey6:20210501005211p:plain

上記のように、「sudoコマンド」を使用するには、事前に実行したいユーザーに対してsudoで実行できるコマンドを定義してあげる必要があります。 では、sudo可能なコマンドをどうやって定義するのかというと、rootユーザーで「visudoコマンド」を実行します。そうすると、vi等のエディタで「/etc/sudoersファイル」が開かれるので、ファイルを編集することで、sudoの事前定義ができます。

書式
ユーザー名 ホスト名=(実行ユーザー名) [NOPASSWD:]コマンド

項目 意味
ユーザー名 コマンドの実行を許可するユーザー名かグループ、あるいはALL
ホスト名 実行を許可するホスト名かIP、あるいはALL
実行ユーザー名 コマンド実行時のユーザー(省略時はroot)、あるいはALL
コマンド 実行を許可するコマンドのパス、あるいはALL
NOPASSWD: コマンド実行のパスワードの要求有無

以下は「sudoersファイル」の一部ですが、この場合はtomaというユーザーにすべてのコマンドのsudoを許可しています。また「NOPASSWD:」を付けることで、tomaユーザーでsudo実行時にパスワードを要求されないようにしていいることがわかるかと思います。

f:id:Mickey6:20210501010954p:plain

これで例えば、ユーザーtomaがsudoで「visudoコマンド」をパスワードなしで実行することができるようになります。

f:id:Mickey6:20210501011517p:plain

ちなみに、sudoでコマンドを実行する際にパスワードを要求された時に入力すするパスワードは、rootのパスワードではなく、sudoを実行しているユーザーのパスワードである点に注意が必要です。わかりにくい。

sudo su とは?


では最後に冒頭に戻り「sudo suコマンド」とは何か、について考えてみましょう。
これは、sudoでsuコマンドを実行するという意味になります。 本来なら「suコマンド」でrootに切り替えたい場合はrootのパスワードが必要です。rootのパスワードを知らないと「suコマンド」を使用できないのでセキュアと言えます。 しかし、「sudoersファイル」で定義してしまえば(例えば前節のようにユーザーtomaに対してすべてのコマンドのsudoを許可すれば)、rootのパスワードを知らなくても、suが実行できる抜け穴になってしまいます。

なので「sudo suコマンドって何?」と聞かれたら、かくかくしかじかなので、「sudo suコマンド」は使わないようにしましょうと答えるのが正解かもしれませんね。

余談ですが、Ubuntuではデフォルトでrootのパスワードが設定されていないので、suでrootに切り替えることができません。 なのでどうしてもrootに切り替えたい場合は「sudo suコマンド」や「sudo -iコマンド」でrootに切り替えることができます。

まあ、suでrootに切り替えるのはリスキーではあるので、通常時はsudoで必要な操作のみroot権限で実行するようにしましよう。

以上