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つあります.
suコマンドやsudo -iコマンドを用いて, 管理者へユーザーを切り替える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
(注意:GitHub Accountが必要となります)