管理者権限: sudo コマンド

Linux Permission 3/N

公開日: 2021-05-09
更新日: 2023-08-08
所要時間: 10 min

  Table of Contents

What is “root user”?

Linuxでは, アカウント情報を/etc/passwdというテキストファイルで管理しています. cat /etc/passwdとターミナルで実行してみると中身を確認することができます. 自分しか利用していないパソコンでもcat /etc/passwdで確認してみると,パソコン内部にたくさんのユーザーが存在することがわかります.

これはLinuxが管理者ユーザー, 一般ユーザー, システムユーザーの3種類にユーザーを分類して管理していることに起因します.

root システムに配置されたディレクトリやファイルのすべてを編集できるユーザー
システムユーザー Webサーバー, メールサーバーといった, 各種サービスを実行するユーザー
一般ユーザー Linuxシステムにログインしてファイルやディレクトリを編集/コマンドを実行するユーザー

このようにたくさんのユーザーがシステムの中に共存していますが, システムの安全性/安定性の観点から,

  • システムの一部を変更/修正
  • 新規のユーザーを追加
  • ユーザーを削除

というシステム作業は一部の限定したユーザーにすべきという思想にLinuxは基づいています. このシステム面の編集権限を含むすべての権限を有しているユーザーがroot userとなります.

システムユーザーの意義

システムユーザーはrpmやdebパッケージによりサービスがインストールされた際にユーザーとして作成されます. rootではなく,システムユーザーでサービスを起動するのはセキュリティ対策が理由の一つです. 仮にとあるサービスに脆弱性が存在し, そのサービスのシステムユーザーの権限が乗っ取られたとします. このときサービスがシステムユーザーの権限で動作していれば, 攻撃された場合の影響はそのシステムユーザーの権限内に収めることができます.

sudoコマンドとは?

Def: sudo command

sudoコマンドは, 指定したユーザー権限で特定のコマンドを実行するコマンド

1
sudo [option] [-u user-name] command

システム面の編集作業は, 一般ユーザーとしてログインしているときに必要になるケースが多々あります (例:Pythonの分析環境を構築したいとき). この場合, 管理者権限を手に入れる必要がありますが, その手法は大きく分けて2つあります.

  1. suコマンドやsudo -iコマンドを用いて, 管理者へユーザーを切り替える
  2. sudoコマンドを使って, 一時的に管理者権限を一般ユーザーが手に入れる

suコマンドはUbuntuのデフォルト設定ではdisabledされているので基本的にはsudoコマンドを使います. sudoコマンドが実行できるかどうかは, /etc/sudoersファイルの設定に依存します.

sudoの設定

sudoコマンドは/etc/sudoersファイルを参照して, ユーザーがコマンドの実行権限があるかどうかを判定します.

1
2
3
4
5
6
7
% cat/etc/sudoers
#
# This file MUST be edited with the 'visudo' command as root.
#
# Please consider adding local content in /etc/sudoers.d/ instead of
# directly modifying this file.
# (略)

上記を読むと, visudoコマンドを実行して編集しろという指示があるので編集する場合はvisudoコマンドを使い default editorで編集します.

/etc/sudoersファイルの書式

1
username hostname=(effective username) [NOPASSWD:] command
username コマンドの実行を許可するユーザー名 or グループ名, or ALL
hostname 実行を許可するホスト名 or IPアドレス, or ALL
effective username コマンド実行時のユーザー(省略時はroot) or ALL
command 実行を許可するコマンド, or ALL
NOPASSWD: 指定するとコマンド実行時にパスワードを問われない

エントリの追加例は以下となります

1
2
3
4
5
6
7
8
# user kirbyにdhclient commandを実行できるようにする
kirby ALL=(ALL) /sbin/dhclient

# user kirbyに対し, 管理者権限が必要なすべてのコマンドを許可する
kirby ALL=(ALL) ALL

# adminグループに対しパスワードコマンド無しで管理者権限が必要なすべてのコマンドを許可する
%admin ALL=(ALL) NOPASSWD:ALL

Column: /var/log/auth.log

sudoコマンドのメリットは, 上記のようにユーザーごとに実行できる権限を細かく指定できる点に加えて, ユーザーが何をしたのかというlogを残せる点もあります. 認証関係のログを格納する /var/log/auth/logファイルを 対象にgrep sudoを実行するといつどのユーザーがsudoコマンドを利用したかが確認できます.

Appendix: Why su - root command cannot be used by defalut in Ubuntu?

なぜ su コマンドがデフォルトで使用できないのか?

  • Ubuntu のデフォルト設定では root ユーザーはパスワードが設定されていないためsu - rootコマンドは利用不可
  • 基本は管理者として設定したユーザーで sudo コマンドを利用して root 特権を行使するべきという思想
su - root rootユーザーのlogin shellが立ち上がる sudo -i
su root root userでシェルを起動 sudo -s
1
2
3
4
5
6
user@localhost% sudo -i
localhost# echo $0
-zsh
localhost# pwd
/root
localhost# exit

su コマンドの使い方

sequenceDiagram
    participant A as uid=1000(kirby)
    participant B as uid=1001(dedede)

    A->>B: su dedede
    B->>A: exit

一時的にアカウントを別ユーザーのものに切り替えるコマンドとして, suコマンドがあります. root ユーザーへ切り替える場合は以下のように入力します.

1
2
3
4
5
6
7
8
9
## 現在の環境変数を引き継いだまま root userへ
% su root

## root userのログイン環境へ
% su - root

## ユーザー名省略はroot userになる
% su
% su -

- optionを用いることなくユーザーを切り替えた場合, 環境変数に設定した値などは, suコマンド実行前のユーザーが利用していた環境値がそのまま参照されます. 上記では, - optionを使用しているので, 切り替えたユーザー(= 上記ではroot user) のログイン環境になります. (例: ホームディレクトリが遷移したりしまう)

su コマンドが実行されると, 指定されたユーザーで新しいシェルが起動されます. そのため, 元のユーザーに戻る場合は exit コマンドを使用してシェルを終了させる形で戻ります.

root ユーザーのパスワード設定

passwdコマンドを root userを対象に実行することでroot ユーザーのパスワード設定を設定することができます

1
2
3
4
5
% sudo passwd root
[sudo] password for ubuntu:   # 自身のパスワード
New password:                 # root パスワード設定
Retype new password:          # 確認再入力
passwd: password updated successfully

References



Share Buttons
Share on:

Feature Tags
Leave a Comment
(注意:GitHub Accountが必要となります)