Linux – sudo コマンドと sudoers の設定について

目次

概要

sudo コマンドと sudoers 設定は、Linux システムでユーザーに特権コマンドの実行権限を安全に付与するためのツールと設定ファイルです。 sudoers ファイルを適切に設定することで、特定のユーザーやグループに対して、特定のコマンドを制御された環境で実行させることができます。

su: ユーザーの切り替え

su(substitute user)は、指定したユーザーとして新しいシェルを起動するためのコマンドです。 デフォルトでは、root ユーザーに切り替えることが多いですが、任意のユーザーに切り替えることもできます。 root 権限を持つユーザーへの切り替えは慎重に行い、システム全体に影響を与える可能性があるため、必要な操作のみを行うようにしてください。

基本構文

su [オプション] [ユーザー名]
  • ユーザー名 を指定しない場合、デフォルトで root ユーザーに切り替わります。
  • su コマンドを実行すると、対象ユーザーのパスワードを求められます。

よく使われるオプション

オプション 概要
- ログインシェルを起動し、ユーザーの環境変数を読み込む
-c <command> 指定したコマンドを実行し、終了後に元のシェルに戻る
-l または --login ログインシェルを起動し、ユーザーの環境変数を読み込む(-と同じ)
-s <shell> 使用するシェルを指定する

使用例

su コマンドの使用例

  • root ユーザーに切り替える

    su
  • 特定のユーザーに切り替える

    su <username>
  • ログインシェルとして特定のユーザーに切り替える

    su - <username>
  • 特定のコマンドを別ユーザーとして実行する

    su -c "ls /root" root
  • 特定のシェルを使用してユーザーに切り替える

    su -s /bin/bash <username>

sudo: 指定したユーザーでコマンドの実行

sudo コマンドは、Linux や Unix 系のオペレーティングシステムで、特定のコマンドを別のユーザー権限で実行するための非常に重要なツールです。 通常、スーパーユーザー (root) 権限でコマンドを実行するために使用されますが、特定のユーザーとしてコマンドを実行することも可能です。

基本的な使用法

通常、sudo コマンドは以下のように使用されます:

sudo <コマンド>

例えば、スーパーユーザー権限でシステムのパッケージを更新するには、次のようにします:

sudo apt update

特定のユーザーとしてコマンドを実行

特定のユーザーとしてコマンドを実行するには、-u オプションを使用します。

sudo -u <ユーザー名> <コマンド>

例えば、john というユーザーとして ls コマンドを実行するには、次のようにします:

sudo -u john ls /home/john

特定のグループとしてコマンドを実行

特定のグループとしてコマンドを実行するには、-g オプションを使用します。

sudo -g <グループ名> <コマンド>

例えば、developers というグループとして ls コマンドを実行するには、次のようにします:

sudo -g developers ls /path/to/directory

sudoers: sudo の設定

/etc/sudoers ファイルは、sudo コマンドの動作を制御するための設定ファイルです。このファイルを編集することで、特定のユーザーやグループに対して sudo 権限を付与したり、特定のコマンドだけを実行できるように制限したりすることができます。

このファイルは非常に重要であり、誤った設定を行うとシステムの管理が困難になる可能性があります。 直接編集することもできますが、構文エラーがあると sudo が使えなくなるため、visudoコマンドを使って編集することが推奨されています。visudo は編集時に構文エラーをチェックし、誤った設定によるシステムの問題を防ぎます。

sudo visudo

editor に関連付けられたエディタが起動されます。以下のコマンドで使用するエディタを変更できます。

vim に変更する例:

sudo update-alternatives --set editor /usr/bin/vim.basic

書式

sudoers ファイルの各行は、次のような形式で記述されます:

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

各フィールドの説明

  • ユーザー名: sudo 権限を与えるユーザー名またはグループ名

    • ユーザー名: username
    • グループ名: %groupname
    • UID: #1000
    • GID: %#1000
  • ホスト名: sudo コマンドを実行できるホスト名

    • 複数の PC で同じ sudoers を使う場合に、ホストごとに適用を限定するための機能です。
    • 全ホスト: ALL
    • 特定のホスト名: myhost.example.com
    • ネットワークアドレス: 192.168.1.0/24
    • ホストの IP アドレス: 192.168.1.100
  • 実行ユーザー名: コマンドを実行するユーザー

    • ユーザー名: そのユーザー名でコマンドが実行できる
    • :グループ名: グループ名の権限でコマンドが実行できる
    • ユーザー名:グループ名: そのユーザー名またはグループ名でコマンドが実行できる
    • ALL: 任意のユーザーとしてコマンドが実行できる
    • :ALL: 任意のグループとしてコマンドが実行できる
    • ALL:ALL: 任意のユーザーまたはグループとしてコマンドが実行できる
  • コマンド: 実行を許可するコマンド

    • ALL: すべてのコマンドを許可
    • 実行できるコマンドをフルパスで指定
    • 複数のコマンドを指定する場合はカンマ区切りで指定
    • ディレクトリを指定した場合、そのディレクトリ内の全てのコマンドが実行できる
    • ワイルドカードを使って複数のコマンドを指定することもできる
  • NOPASSWD: オプション:

    • NOPASSWD: オプションを付けると、指定されたコマンドを実行する際にパスワードの入力を求められません。

重複する設定の優先順位

sudoers ファイルでは、同じユーザーやグループに対する重複する設定がある場合、最後に記述された設定が優先されます。 例えば、以下のような sudoers ファイルのエントリがあるとします:

# この設定では user1 はすべてのコマンドを実行可能
user1 ALL=(ALL) ALL

# この設定では user1 は /usr/bin/apt のみ実行可能
user1 ALL=(ALL) /usr/bin/apt

この場合、user1 に対して最後に記述された設定が適用されるため、user1/usr/bin/apt コマンドのみ実行できることになります。

全てのコマンドを実行可能

ユーザー john がどのホストでも全てのコマンドを実行できるようにする設定:

john ALL=(ALL) ALL

特定のコマンドだけを実行可能

ユーザー john/usr/bin/apt コマンドだけを実行できるようにする設定:

john ALL=(ALL) /usr/bin/apt

グループに対する設定

グループ admin 内の全てのユーザーが全てのコマンドを実行できるようにする設定:

%admin ALL=(ALL) ALL

パスワードなしでコマンドを実行

ユーザー john がパスワードなしで全てのコマンドを実行できるようにする設定:

john ALL=(ALL) NOPASSWD: ALL

特定のユーザーとして特定のコマンドを実行

ユーザー johnpostgres ユーザーとして psql コマンドを実行できるようにする設定:

john ALL=(postgres) /usr/bin/psql

エイリアスの使用

sudoers ファイルではエイリアスを使用して設定を簡略化することができます。エイリアスには次の 4 種類があります:

  • User_Alias: ユーザーのエイリアス
  • Runas_Alias: 実行対象ユーザーのエイリアス
  • Host_Alias: ホストのエイリアス
  • Cmnd_Alias: コマンドのエイリアス

エイリアスの使用

ユーザー johnjaneAPT_CMDS として定義されたコマンドを実行できるようにする設定:

User_Alias ADMINS = john, jane
Cmnd_Alias APT_CMDS = /usr/bin/apt, /usr/bin/apt-get

ADMINS ALL=(ALL) APT_CMDS

設定ファイルのインクルード

#includedir#include を使って設定ファイルをインクルードすることができます。

  • /etc/sudoers.d ディレクトリ内の設定ファイルをインクルードする

    #includedir /etc/sudoers.d
  • /etc/sudoers.d/username をインクルードする

    #include /etc/sudoers.d/username

例えば、デフォルトの sudoers ファイルは以下のようになっています。

  • root ユーザーは任意のユーザーまたはグループとして、すべてのコマンドを sudo で実行できる
  • admin グループは任意のユーザーとして、すべてのコマンドを sudo で実行できる
  • sudo グループは任意のユーザーまたはグループとして、すべてのコマンドを sudo で実行できる
# User privilege specification
root    ALL=(ALL:ALL) ALL

# Members of the admin group may gain root privileges
%admin ALL=(ALL) ALL

# Allow members of group sudo to execute any command
%sudo   ALL=(ALL:ALL) ALL

このため、デフォルトでは、sudo を付ければ一般ユーザーが管理者権限のコマンドを実行したり、権限がない他のユーザーにアクセスしたりできるようになります。

コメント

コメントする

目次