目次にジャンプページナビゲーションにジャンプ: 前のページ[アクセスキーp]/次のページ[アクセスキーn]
documentation.suse.com / SUSE Linux Enterprise Desktopドキュメント / 管理ガイド / 共通のタスク / sudoの基本
適用項目 SUSE Linux Enterprise Desktop 15 SP6

2 sudoの基本

特定のコマンドを実行するには、root特権が必要です。ただし、セキュリティ上の理由のため、また間違いを避けるため、rootとしてログインすることは推奨されません。より安全な方法は、通常のユーザとしてログインしてから、sudoを使用して昇格された特権でコマンドを実行することです。

SUSE Linux Enterprise Desktopでは、sudosuと同様に機能するように設定されています。ただし、sudoには、ユーザが他のユーザの特権でコマンドを実行できるようにする柔軟なメカニズムがあります。このコマンドを使用して、指定の特権を持つ役割を特定のユーザとグループに割り当てることができます。たとえば、usersグループのメンバーが、wilberユーザの特権でコマンドを実行できるようにすることができます。コマンドへのアクセスは、コマンドオプションを禁止することにより、さらに制限できます。suでは、PAMを使用した認証で常にrootパスワードを必要としますが、sudoでは、ユーザの資格情報を使用して認証するように設定できます。すなわち、ユーザはrootパスワードを共有する必要がなく、セキュリティが向上します。

2.1 sudoの基本的な使用方法

次の章では、sudoの基本的な使用方法の概要について説明します。

2.1.1 単一コマンドの実行

標準ユーザは、コマンドの前にsudoを追加することで、任意のコマンドをrootとして実行できます。これにより、rootパスワードを入力するように求められます。正常に認証されたら、rootとしてコマンドが実行されます。

> id -un1
tux
> sudo id -un
root's password:2
root
> id -un
tux3
> sudo id -un
4
root

1

id -unコマンドは、現在のユーザのログイン名を出力します。

2

入力時には、パスワードは表示されません(クリアテキストとしてだけでなく、マスク文字としても表示されません)。

3

sudoで始まるコマンドのみが、昇格された特権で実行されます。

4

昇格された特権は特定の期間保持されるため、再びrootパスワードを入力する必要はありません。

ヒント
ヒント: I/Oリダイレクト

sudoの使用時に、I/Oリダイレクトは機能しません。

> sudo echo s > /proc/sysrq-trigger
bash: /proc/sysrq-trigger: Permission denied
> sudo cat < /proc/1/maps
bash: /proc/1/maps: Permission denied

上記の例では、echoおよびcatコマンドのみが昇格された特権で実行されます。リダイレクトはユーザの特権を使用してユーザのシェルで実行されます。昇格された権限でリダイレクトを実行するには、2.1.2項 「シェルの起動」に記載されているようにシェルを起動するか、ddユーティリティを使用します。

echo s | sudo dd of=/proc/sysrq-trigger
sudo dd if=/proc/1/maps | cat

2.1.2 シェルの起動

昇格された特権でコマンドを実行するたびにsudoを使用することは、必ずしも実用的ではありません。sudo bashコマンドを使用できますが、組み込みメカニズムのいずれかを使用してシェルを起動することをお勧めします。

sudo -s (<command>)

SHELL環境変数で指定したシェル、またはターゲットユーザのデフォルトのシェルを起動します。コマンドが指定される場合は、シェルに渡されます(-cオプションを使用)。そうでない場合、シェルは対話的モードで実行されます。

tux:~ > sudo -s
root's password:
root:/home/tux # exit
tux:~ > 
sudo -i (<command>)

-sと同様ですが、シェルはログインシェルとして起動します。これは、シェルの起動ファイル(.profileなど)が処理され、現在の作業ディレクトリがターゲットユーザのホームディレクトリに設定されることを意味します。

tux:~ > sudo -i
root's password:
root:~ # exit
tux:~ > 
ヒント
ヒント: 環境変数

デフォルトでは、sudoは環境変数を伝達しません。この動作は、env_resetオプションを使用して変更できます(有用なフラグとオプションを参照してください)。

2.2 sudoの構成

sudoは、設定可能なオプションの幅広い範囲を提供します。

注記
注記: sudoからのロックアウト

誤ってsudoからロックアウトした場合は、su -rootパスワードを使用してルートシェルを起動してください。エラーを修正するには、visudoを実行します。

警告
警告: 設定例はデモンストレーションのみを目的としています

以下で紹介するルールの例はデモンストレーションのみを目的としています。これらのルール例を利用して、sudo設定ファイルの一般的な構文を理解してください。実際の環境では、このルール例をそのまま使用しないでください。環境の複雑さを反映していないからです。

2.2.1 sudoの設定でのベストプラクティス

まず、sudo設定を維持するための基本ルールについて説明します。

sudoの設定ファイルの編集には必ずvisudoを使用する

sudoの設定の変更では、どの場合もvisudoコマンドを使用する必要があります。visudoは、sudo設定ファイルを編集することができ、基本的な構文チェックを実行して、設定がそのまま機能できるようにする、オーダーメイドツールです。sudoの設定に不備があると、ユーザが自身のシステムからロックアウトされることがあります。

必ず/etc/sudoers.d/にカスタム設定を作成する

カスタム設定は、sudoによって取得できるように、/etc/sudoers.d/に置く必要があります。カスタム設定ファイルに記述した設定は、/etc/sudoersのデフォルト設定よりも優先されます。

設定が読み取られる順序にいつでも注意する

カスタム設定が確実に正しい順序で読み取られるように数字のプレフィクスを付加します。先頭に0を付加してファイルの読み取り順序を指定します。これにより、たとえば01_myfirstconfig10_myotherconfigよりも前に解析されます。順番に読み取られる複数のディレクティブを設定したファイルで、これらの各ディレクティブに記述された情報が互いに矛盾していると、最後に読み込まれたディレクティブが適用されます。

必ずわかりやすいファイル名を使用する

設定ファイルの機能がわかるようなファイル名を使用します。sudoのセットアップで想定している動作を追跡する際に、この措置が効果的です。

2.2.2 ユーザ固有の設定ファイルの作成

通常のユーザ(tux)が、rootパスワードではなく自身のパスワードを使用して、useraddコマンドを使用できるように、sudoの設定ファイルを作成します。

例 2.1: ユーザ固有の設定ファイルの作成
  1. 新しいユーザ固有のディレクティブを保持するカスタム設定ファイルを作成します。そのためには、システム管理者(root)としてvisudoを起動します。番号付けと説明的な名前の両方を使用します。

      # visudo -f /etc/sudoers.d/02_usermanagement
  2. このsudo設定を適用する環境全体でtux/usr/sbin/useraddバイナリを実行できるようにするルールを作成します。

      tux1 ALL2 = /usr/sbin/useradd3

    1

    ユーザまたはグループを指定します。ユーザは、名前または#UIDで一覧にし、グループは、%GROUPNAMEで一覧にします。複数の項目はコンマで区切ります。エントリを無効にするには!を使用します。

    2

    ホストを1つまたはコンマで区切って複数指定します。完全修飾ホスト名またはIPアドレスを使用します。すべてのホストにこの設定をグローバルに適用するにはALLを追記します。適用しない場合は!を使用します。

    3

    実行可能ファイルを1つまたはコンマで区切って複数指定します。各ファイルの指定では次のルールに留意します。

    /usr/sbin/useradd

    追加オプションを追記しない場合は、実行可能なすべてのuseraddコマンドを実行できます。

    /usr/sbin/useradd -c

    明示的にオプションを指定すると、そのオプションのみが適用されます。上記で指定したユーザは、これ以外のオプションを利用できません。

    /usr/sbin/useradd ""

    オプションを指定せずにuseraddの呼び出しのみができるようにします。

    上記の例では、すべてのオプションおよびサブコマンドを許可したり、セキュリティ上の理由からいくつかに制限したりできますが、ユーザがオプションを指定できないようにすることは、このコンテキストでは意味がありません。

  3. ユーザがrootパスワードの代わりに、自分のパスワードを使用できるようにするには、次の行を追加します。

    Defaults:tux !targetpw

    このフラグがアクティブな場合、目的のユーザ(root)のパスワードの入力が求められます。SUSE Linux Enterprise Desktopシステムでは、このフラグがデフォルトで有効になっています。!を使用してこのフラグを無効にすると、ユーザはrootパスワードの代わりに自分のパスワードの入力を求められます。

  4. 設定を保存し、エディタを終了して、2番目のシェルを開き、sudoが新しい設定に従うかどうかをテストします。

2.2.3 項目のグループ化によるカスタム設定の作成

指定したユーザのグループがrootパスワードを必要とせずにuseraddコマンドを実行できるように、例2.1「ユーザ固有の設定ファイルの作成」の設定を変更します。また、このグループで使用できるコマンドのリストにusermoduserdelを追加します。

例 2.2: 項目のグループ化によるカスタム設定の作成
  1. この設定例を変更するには、visudoを使用してシステム管理者として設定を開きます。

    # visudo /etc/sudoers.d/02_usermanagement
  2. コンマ区切りで記述した複数のユーザをルールに追加します。

    tux, wilber ALL = /usr/sbin/useradd
  3. ここで記述したユーザが複数のコマンドを実行できるようにするには、それらのコマンドをコンマ区切りで指定します。

    tux, wilber ALL = /usr/sbin/useradd, /usr/sbin/usermod, /usr/sbin/userdel
  4. ここで記述したユーザがrootパスワードの代わりに、自分のパスワードを使用できるようにするには、次の行を追加します。

    Defaults:tux, wilber !targetpw

    このフラグがアクティブな場合、ここで記述したユーザは目的のユーザ(root)のパスワードの入力が求められます。SUSE Linux Enterprise Desktopシステムでは、このフラグがデフォルトで有効になっています。!を使用してこのフラグを無効にすると、ここで記述したユーザはrootパスワードの代わりに自分のパスワードの入力を求められます。

  5. 設定を保存し、エディタを終了して、2番目のシェルを開き、sudoが新しい設定に従うかどうかをテストします。

2.2.4 エイリアスの適用による設定の簡潔化

エイリアスを使用して、例2.2「項目のグループ化によるカスタム設定の作成」のカスタム設定の簡素化を進めます。項目をグループ化することはある程度役立ちますが、ユーザ、コマンド、およびホストのグローバルエイリアスを使用することが、クリーンで無駄のないsudo設定を保つための最も効率的な方法です。

リストの代わりにエイリアスやグループを使用する方が、セットアップの変更に対処する上ではるかに良い方法です。グループからユーザが離れる場合は、独立したカスタム設定ファイルをすべて調べるのではなく、エイリアス宣言ファイル内のグローバルUser_Alias宣言からそのユーザを削除するだけですみます。他のタイプのエイリアス(Host_AliasCmnd_Alias、およびRunas_Alias)についても、同じ手順が適用されます。

例 2.3: エイリアスの適用による設定の簡潔化
  1. グローバルエイリアス定義を保持する新しいファイルを作成します。

    # visudo /etc/sudoers.d/01_aliases
  2. 次の行を追加して、TEAMLEADERSエイリアスを作成します。

    User_Alias    TEAMLEADERS = tux, wilber
  3. 次の行を追加して、USERMANAGEMENTエイリアスを作成します。

    Cmnd_Alias    USERMANAGEMENT = /usr/sbin/useradd, /usr/sbin/usermod, /usr/sbin/userdel
  4. 変更を保存し、visudoを終了します。

  5. システム管理者としてvisudoを起動して、設定ファイル例を次のように編集します。

    # visudo -f /etc/sudoers.d/02_usermanagement
  6. 前のルールを削除し、上記で定義したエイリアスを使用する次のルールに置き換えます。

    TEAMLEADERS ALL = USERMANAGEMENT
  7. User_Aliasで定義されたすべてのユーザがrootパスワードの代わりに、自分のパスワードを使用できるようにするには、次の行を追加します。

    Defaults:TEAMLEADERS !targetpw
  8. 設定を保存し、エディタを終了して、2番目のシェルを開き、sudoが新しい設定に従うかどうかをテストします。

2.2.5 基本的なsudoersの設定構文

sudoersの設定ファイルには、2種類のオプション(文字列とフラグ)があります。文字列には任意の値を含めることができますが、フラグはONかOFFのいずれかのみです。sudoersの設定ファイルの最も重要な構文構造は次のとおりです。

# Everything on a line after # is ignored 1
Defaults !insults # Disable the insults flag 2
Defaults env_keep += "DISPLAY HOME" # Add DISPLAY and HOME to env_keep
tux ALL = NOPASSWD: /usr/bin/frobnicate, PASSWD: /usr/bin/journalctl 3

1

例外が2つあります。#include#includedirは通常のコマンドです。

2

!文字を削除して、目的のフラグをONに設定します。

3

2.2.6項 「基本的なsudoersのルール」を参照してください。

有用なフラグとオプション
targetpw

このフラグは、呼び出し元のユーザが、ターゲットユーザのパスワード(ON)(rootなど)と、呼び出し元のユーザのパスワード(OFF)のいずれを要求されるかを決定します。

Defaults targetpw # Turn targetpw flag ON
rootpw

設定すると、sudoは、rootパスワードを要求します。デフォルトはOFFです。

Defaults !rootpw # Turn rootpw flag OFF
env_reset

設定すると、sudoTERMPATHHOMEMAILSHELLLOGNAMEUSERUSERNAME、およびSUDO_*で最小限の環境を構築します。また、env_keepに列挙されている変数は、呼び出し元の環境からインポートされます。デフォルトは[ON]です。

Defaults env_reset # Turn env_reset flag ON
env_keep

env_resetフラグがONの場合に保持する環境変数の一覧。

# Set env_keep to contain EDITOR and PROMPT
Defaults env_keep = "EDITOR PROMPT"
Defaults env_keep += "JRE_HOME" # Add JRE_HOME
Defaults env_keep -= "JRE_HOME" # Remove JRE_HOME
env_delete

env_resetフラグがOFFの場合に削除する環境変数の一覧。

# Set env_delete to contain EDITOR and PROMPT
Defaults env_delete = "EDITOR PROMPT"
Defaults env_delete += "JRE_HOME" # Add JRE_HOME
Defaults env_delete -= "JRE_HOME" # Remove JRE_HOME

Defaultsトークンを使用することで、ユーザ、ホスト、およびコマンドのコレクションのエイリアスを作成することもできます。さらに、一連のユーザのみを対象としてオプションを適用することができます。

sudoers設定ファイルの詳細については、man 5 sudoersを参照してください。

2.2.6 基本的なsudoersのルール

各ルールは、次のスキームに従います([]はオプション部分を示しています)。

#Who      Where         As whom      Tag                What
User_List Host_List = [(User_List)] [NOPASSWD:|PASSWD:] Cmnd_List
sudoersルールの構文
User_List

1つ以上の(コンマで区切られた)識別子。ユーザ名、%GROUPNAME形式のグループ、または#UID形式のユーザIDを指定します。否定は!プレフィクスで指定できます。

Host_List

1つ以上の(コンマで区切られた)識別子。(完全修飾された)ホスト名またはIPアドレスのいずれかを指定します。否定は!プレフィクスで指定できます。通常、Host_ListにはALLを選択します。

NOPASSWD:|PASSWD:

NOPASSWD:の後に記述した、Cmd_Listと一致するコマンドを実行する場合は、パスワードが要求されません。

PASSWDはデフォルトです。PASSWDNOPASSWDの両方が同じ行に存在する場合にのみ指定する必要があります。

tux ALL = PASSWD: /usr/bin/foo, NOPASSWD: /usr/bin/bar
Cmnd_List

1つまたは複数の(コンマで区切られた)指定子。実行可能ファイルへのパスの後に、オプションで使用可能な引数を指定します。

/usr/bin/foo     # Anything allowed
/usr/bin/foo bar # Only "/usr/bin/foo bar" allowed
/usr/bin/foo ""  # No arguments allowed

ALLは、User_ListHost_List、およびCmnd_Listとして使用できます。

パスワードを入力しなくても、tuxがすべてのコマンドをrootとして実行できるようにするルールは次のとおりです。

tux ALL = NOPASSWD: ALL

tuxsystemctl restart apache2を実行できるようにするルールは次のとおりです。

tux ALL = /usr/bin/systemctl restart apache2

tuxwalladminとして引数なしで実行できるようにするルールは次のとおりです。

tux ALL = (admin) /usr/bin/wall ""
警告
警告: 危険なルール

Defaults targetpwなしで、ALL ALL = ALLのようなルールを使用「しないでください」。そうしないと、だれでもrootとしてコマンドを実行できるようになります。

重要
重要: Winbindとsudo

sudoersファイルでグループ名を指定する場合は、レルムの代わりにNetBIOSドメイン名を使用するようにしてください。次に例を示します。

%DOMAIN\\GROUP_NAME ALL = (ALL) ALL

winbinddを使用する場合、この形式は、smb.confファイルのwinbind separatorオプションによっても異なることに注意してください。デフォルトでは、\です。たとえば、+に変更された場合、sudoersファイルのアカウント形式はDOMAIN+GROUP_NAMEである必要があります。

2.3 X.Orgアプリケーションでのsudoの使用

グラフィカルアプリケーションをsudoで起動すると、通常、次のエラーが発生します。

> sudo xterm
xterm: Xt error: Can't open display: %s
xterm: DISPLAY is not set

簡単な回避策は、xhostを使用して、ルートユーザがローカルユーザのXセッションに一時的にアクセスできるようにすることです。これは、次のコマンドを使用して実行されます。

xhost si:localuser:root

次のコマンドは許可されたアクセスを削除します。

xhost -si:localuser:root
警告
警告: 潜在的なセキュリティの問題

ルート特権でグラフィカルアプリケーションを実行すると、セキュリティに影響を与えます。例外としてのみグラフィカルアプリケーションのルートアクセスを有効にすることをお勧めします。グラフィカルアプリケーションが閉じられたらすぐに、許可されたルートアクセスを取り消すことも推奨されます。

2.4 詳細情報

sudo --helpコマンドは、使用可能なコマンドラインオプションの簡単な概要を提供し、man sudoersコマンドは、sudoersとその設定に関する詳細情報を提供します。