こんにちは、かつコーチです。
Linuxを使っていると、当たり前のように打っているsudoコマンド。
実はこの仕組みを正しく理解していないと、必要以上に強い権限を配ってしまい、セキュリティ上のリスクを抱えることになります。
この記事では、Ubuntu 26.04 LTSでの実例を交えながら、sudoの仕組みと安全な使い方を解説します。
sudoとは?
sudoの定義:一時的に管理者権限でコマンドを実行する仕組み
sudo(superuser do)とは、許可されたユーザーが、自分のパスワードを使って一時的に管理者(root)権限でコマンドを実行できる仕組みです。
似た仕組みにsu(switch user、主にrootへの切り替え)がありますが、suはrootのパスワードを共有する必要があるのに対し、sudoは自分のパスワードのまま、必要なコマンドだけを実行できる点が異なります。
なぜsudoが必要なのか
rootユーザーで直接ログインして作業する運用は、以下のようなリスクを抱えます。
- 誰がいつどのコマンドを実行したか、履歴から追いにくい
- 操作ミス1つでシステム全体を壊しかねない、強すぎる権限を常時持つことになる
- rootのパスワードを複数人で共有すると、漏洩時の被害範囲が読めない
sudoを使えば、必要なユーザーに、必要なコマンドだけを、ログを残しながら許可できます。
Ubuntuではセットアップ時に作成した最初のユーザーが、デフォルトでsudoを使えるグループ(sudoグループ)に所属する設計になっています。
基本の書き方:sudoの使い方
手順1:sudoでコマンドを実行する
管理者権限が必要なコマンドの前にsudoを付けるだけです。
$ sudo apt update
[sudo] password for katsu:
自分のログインパスワードを入力すると、そのコマンドがroot権限で実行されます。
一度認証すると、Ubuntuのデフォルト設定では数分間(多くの場合15分間)はパスワード再入力なしでsudoを使い続けられます。
手順2:sudoグループにユーザーを追加する
前回の記事で解説したusermodを使い、ユーザーをsudoグループに追加します。
$ sudo usermod -aG sudo deploy
これでdeployユーザーもsudoコマンドを使えるようになります。
反映には再ログインが必要な点は、前回のグループ管理と同じです。
手順3:visudoで設定ファイルを安全に編集する
sudoの詳細な権限は/etc/sudoersファイルで管理されていますが、このファイルは直接エディタで開くのではなく、visudoコマンドで編集するのが鉄則です。
$ sudo visudo
visudoは保存時に構文チェックを行うため、書き間違えてsudoersファイルが壊れ、誰もsudoを使えなくなるという事態を防いでくれます。
つまずきやすい設定・注意点
/etc/sudoers.d/ディレクトリに個別のファイルを追加する方法もよく使われます。
$ sudo visudo -f /etc/sudoers.d/deploy
deploy用の設定をdeployファイルとして分離しておくと、他の設定と混ざらず管理しやすくなります。
このときも必ずvisudo -f経由で編集し、直接viやnanoで開かないようにしてください。
よくあるつまずきポイント・エラー対処
sudoersを直接編集して構文エラーになった
私が実際に検証環境で試したとき、visudoを使わずにvi /etc/sudoersで直接編集し、保存後にsudoが一切使えなくなったことがあります。
❌Before:vi /etc/sudoersのようにエディタで直接編集する
$ sudo vi /etc/sudoers
$ sudo apt update
sudo: /etc/sudoers is owned by uid 1000, should be 0
sudo: no valid sudoers sources found, quitting
構文を1文字誤っただけで、システム上のすべてのユーザーがsudoを使えなくなりました。
幸い検証環境だったのでrootログインで復旧できましたが、本番環境で起きていたら深刻な障害になっていたはずです。
✅After:必ずvisudo経由で編集し、構文エラーを保存前に検知する
$ sudo visudo
>>> /etc/sudoers: syntax error near line 28 <<<
What now?
visudoは保存しようとした時点で構文エラーを検出し、このように確認を求めてきます。
ここでe(再編集)を選べば、壊れた状態のまま保存されることを防げます。
sudoersの編集は必ずvisudoを使う、という原則を徹底しましょう。
NOPASSWDを安易に設定してしまう
CI/CDの自動化スクリプトなどで、パスワード入力を省略したいがためにNOPASSWDを安易に設定してしまうケースもよく見かけます。
❌Before:全コマンドをパスワードなしでsudo実行できるようにする
deploy ALL=(ALL) NOPASSWD: ALL
これは「deployユーザーが、パスワードなしで、あらゆるコマンドをroot権限で実行できる」という設定です。
自動化のためとはいえ、このアカウントが乗っ取られた場合、システム全体が無防備になります。
✅After:必要なコマンドだけをNOPASSWDの対象に絞り込む
deploy ALL=(ALL) NOPASSWD: /usr/bin/systemctl restart app.service
デプロイ時にアプリを再起動する処理だけをパスワードなしで許可し、それ以外のコマンドは通常通りパスワードを要求する設定です。
「何を」「誰に」許可するかを、必要最小限に絞り込むのがsudo設計の基本方針です。
応用・一歩先の使い方
sudoのログを確認する
sudoの実行履歴は/var/log/auth.log(Ubuntuの場合)に記録されます。
$ sudo grep sudo /var/log/auth.log | tail -n 5
誰がいつどのコマンドをsudoで実行したかを追跡でき、障害調査やセキュリティ監査の際に役立ちます。
最小権限の原則を意識した設計
sudoを設計するときは、最小権限の原則(必要な操作にだけ、必要な範囲の権限を与える考え方)を意識することが重要です。
「とりあえずALL=(ALL) ALLを全員に付ける」運用は一見楽ですが、事故や不正利用が起きたときの被害範囲を自ら広げてしまいます。
コマンドの範囲を絞る、対象ユーザーを絞る、NOPASSWDは本当に必要な処理だけに限定する、という3つの視点を持っておくと、安全なsudo運用に近づきます。
まとめ
この記事のポイント
- sudoは自分のパスワードのまま一時的に管理者権限を使える仕組み
- ユーザーを
sudoグループに追加すると、sudoコマンドが使えるようになる /etc/sudoersの編集は必ずvisudo(またはvisudo -f)経由で行うNOPASSWD: ALLのような広すぎる権限付与は避け、必要なコマンドだけに絞る/var/log/auth.logでsudoの実行履歴を確認できる
次に読むべき記事
権限管理の基本を一通り押さえたら、次はサーバー上で動いているプログラムそのものを扱う「プロセスとは?ps・topでプロセスを確認する」に進んでみてください。
sudoで実行したコマンドが、実際にどうプロセスとして動くかが見えてきます。
タグ: Linux, 中級者向け, 権限管理