はじめに
なぜ「sudo」と入力しなければならないのか、Linux や Unix などのオペレーティングシステム環境で特定のコマンドを実行しようとするときに不思議に思ったことはありませんか?Sudoは実際には略語であり、「super-user do」の略です。sudoコマンドを使用すると、別のユーザーのセキュリティ権限でプログラムを実行したり、コマンドを実行したりできます。
デフォルトでは、sudoコマンドを使用すると、システムユーザーはスーパーユーザーの権限でコマンドを実行できます。Linux/Unix OSを新規インストールすると、スーパーユーザー権限を持つrootアカウントが作成されます。Linux/Unixシステムの初期サーバーセットアップを行う際、システム管理者はrootアカウントでログインし、他のシステムユーザーにシステム権限を割り当てます。これらの設定は、sudoersと呼ばれるファイルに保存されます。root権限を持つアカウントは、sudoersファイルを編集して他のユーザーの権限を変更できます。
このチュートリアルでは、root権限を取得し、sudoersファイルを編集する方法について説明します。
前提条件
これは実践的なチュートリアルであり、チュートリアルを完全に理解するにはコマンドをテストする必要があります。このチュートリアルではUbuntu 20.04サーバーを使用しますが、Debian や CentOS などの最新のLinuxディストリビューションをお持ちであれば、同じ手順に従うことができます。こちらのリンクから、CloudSigma上で独自のUbuntuクラウドサーバーをセットアップできます。.
root権限の取得
root権限を取得するには、以下で説明する3つの方法があります。
rootとしてログインする
root権限を取得するためにほとんどの人が使用する最も簡単な方法は、rootユーザーの資格情報を使用してシステムにログインすることです。ローカルマシンにアクセスしている場合は、ユーザー名を入力するだけで、パスワードの入力を求められます。
rootとしてログインするもう1つの方法は、サーバーへのログインやタスクの実行を行うためのコマンドラインツールであるSSHを使用することです。これには、サーバーのユーザー名とIPアドレスが必要です。rootとしてログインするための構文は次のとおりです。サーバーのIPアドレスに置き換えてください。
|
1 |
ssh root@your_server_ip_or_domain_name |
ターミナルで上記のコマンドを入力すると、SSHキーを設定していない場合はパスワードの入力を求められ、設定している場合はSSHキーのパスフレーズの入力を求められます。正しい資格情報を入力すると、ログインできます。こちらのUbuntuでリモートサーバーに接続するためにSSHを使用する方法についてのステップバイステップのガイドを参照してください。.
suを使用してrootになる
root以外の他のアカウントを使用してLinuxシステムにログインできます。これは通常、管理タスク以外の作業を行う場合に推奨される方法です。root権限を取得したいときはいつでも、ターミナルでsuと入力するだけです。
|
1 |
su |
システムからrootパスワードの入力を求められ、その後rootシェルセッションにアクセスできるようになります。このシェルセッション中は、すべての管理タスクを実行できます。通常のシェルに戻りたいときはいつでも、単にCtrl + D を押します。または、ターミナルで exit と入力してEnterキーを押すこともできます。
sudoを使用してroot権限のコマンドを実行する
このチュートリアルの最初で簡単に紹介したsudoコマンドを使用すると、root権限のシェルを必要とせずに、1行のコマンドを実行できます。単に sudo に続けて実行するコマンドを入力するだけです。
|
1 |
sudo execute_this_command |
たとえば、システムをアップデートするには、次のように入力します。
|
1 |
sudo apt-get update |
パスワードの入力を求められます。su と sudo コマンドの違いは、su はrootパスワードを求めるのに対し、sudoは現在のユーザーのパスワードを求める点です。sudoアクセスはシステムに重大なセキュリティ上の影響を及ぼすため、デフォルトではユーザーに付与されません。これについては、以降のセクションで詳しく説明します。
Visudoを使用してsudoersファイルを編集する
Sudo権限は、sudoersファイル(/etc/sudoers)に設定されています。. これらの権限は、ユーザーがLinuxシステムにアクセスするために必要です。構文エラーがあると、ユーザーがシステムにログインできなくなり、システムが壊れた状態になります。
Visudo コマンドは、保存時にファイルの構文をチェックする特別なエディタでファイルを開きます。したがって、サーバーシステムを使用不能にしないために、visudo コマンドのみを使用してファイルを開くことが重要です。デフォルトでは、visudoはテキストエディタを(vi) vim で開くように設定されていました。しかし、Ubuntuはvisudoが nano テキストエディタを使用するように設定しています。DebianまたはUbuntuでは、次のコマンドを入力して別のエディタに変更できます。
|
1 |
sudo update-alternatives --config editor |
スクリーンショットに示すように、デフォルトのエディタを選択できるエディタの一覧が表示されます。お好みのエディタに対応する番号を選択してください:

On a CentOS Linuxディストリビューションでは、/etc/sudoersを編集し、以下の行を追加します:
|
1 2 |
Defaults editor = /usr/bin/vim:/usr/bin/vi:/usr/bin/nano Defaults env_keep += "EDITOR" |
次のコマンドを入力します。your_editor_of_choiceの部分を選択したエディタの名前に置き換えることを忘れないでください:
|
1 |
export EDITOR=`which your_editor_of_choice` |
このコマンドは、~/.bashrcファイルに行を追加します。変更を適用するには、ターミナルで以下を入力します:
|
1 |
. ~/.bashrc |
visudoの設定が完了したので、次のコマンドを入力して /etc/sudoers のファイルを開くことができます:
|
1 |
sudo visudo |
Sudoersファイルの編集
前のコマンドを実行すると、設定したプライマリ・エディタでファイルが開きます。ファイルの内容は以下の通りです:
|
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 |
# # 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. # # See the man page for details on how to write a sudoers file. # Defaults env_reset Defaults mail_badpass Defaults secure_path="/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin:/snap/bin" # Host alias specification # User alias specification # Cmnd alias specification # User privilege specification root ALL=(ALL:ALL) ALL # Members of the admin group may gain root privileges %admin ALL=(ALL) NOPASSWD:ALL # Allow members of group sudo to execute any command %sudo ALL=(ALL) NOPASSWD:ALL # See sudoers(5) for more information on "#include" directives: #includedir /etc/sudoers.d |
コメントはかなり分かりやすいですが、以下で各行が何を示しているかを説明します。
デフォルト行
- Defaults env_reset – ターミナルの環境変数をリセットして、ユーザー変数を削除します。これにより、sudoセッションから潜在的に有害な変数がクリアされます。
- Defaults mail_badpass – sudoのパスワード試行に失敗した際の通知を、設定された mailto ユーザー(通常はrootアカウント)にメールで送信するようシステムに指示します。
- Defaults secure_path – システムに危険を及ぼす可能性のある他のユーザー定義パスの使用を防ぐために、sudo操作の実行時に使用するアプリケーションを検索するファイルシステム内の複数のパスが含まれています。
ユーザー権限指定行
|
1 |
root ALL=(ALL:ALL) ALL |
- root ALL=(ALL:ALL) ALL – 最初のフィールドは、ルールが適用されるユーザー名を指定します。この場合は、root ユーザーです。
- root ALL=(ALL:ALL) ALL –最初の ALL は、ルールがすべてのホストに適用されることを指定します。
- root ALL=(ALL:ALL) ALL – 2番目の ALL は、このルールが適用されるユーザー(すなわち root)がすべてのユーザーとしてコマンドを実行できることを指定します。
- root ALL=(ALL:ALL) ALL – 3番目の ALL は、このルールが適用されるユーザー(すなわち root)がすべてのグループとしてコマンドを実行できることを指定します。
- root ALL=(ALL:ALL) ALL – 最後の ALL は、これらのルールがすべてのコマンドに適用されることを指定します。
このルールが示すように、rootユーザーは正しいパスワードを入力すれば、sudoを使用して任意のコマンドを実行できます。
グループ権限指定行
これらの行は、グループに適用されるsudo権限ルールを指定します。フィールドはユーザー権限行と同じアクションを示しますが、わずかな違いがあります。グループ名を示すために % で始まります。
ご覧の通り、admin グループは、任意のホスト上で任意のユーザーとして任意のコマンドを実行できます。sudo グループも同じ権限を持ち、さらに任意のグループとしてコマンドを実行できる追加の権限があります。
Include /etc/sudoers.d Line
The #includedir /etc/sudoers.d line might appear like it is a comment because of the # at the beginning of the line. However, this is an include directive to indicate that the files within the /etc/sudoers.d directory should be sourced and used as part of the sudoers file. Files within this directory follow the same rules as the sudoers file.
ディレクトリ内のファイルのうち、ドット(.)が含まれておらず、~ で終わらないものはすべて読み込まれ、sudoers ファイルの設定に追加されます。このディレクトリを使用すると、アプリケーションはインストール時に、デフォルトの sudoers ファイルを変更することなく、関連するすべてのルールを /etc/sudoers.d ディレクトリ内の単一の専用ファイルに配置することで、sudo権限を変更できます。さらに、アプリケーションの権限を検査または取り消したい場合は、/etc/sudoers.d ディレクトリ内のファイルを簡単に確認または変更でき、/etc/sudoers ファイルを直接変更する必要はありません。
原則として、/etc/sudoers.d ディレクトリ内のすべてのファイルは、常に visudo コマンドを使用して編集する必要があります。以下はその構文です。コマンド内の編集したいファイル名を置き換えることを忘れないでください:
|
1 |
sudo visudo -f /etc/sudoers.d/file_name_to_edit |
ユーザーへのSudo権限の割り当て
新しいユーザーに一般的なsudoアクセス権を付与することは、そのユーザーアカウントにシステムへの完全な管理者アクセス権を与えたことを意味します。これは、システム管理者がsudo権限を持つ他の非rootユーザーを作成する際に行う一般的なタスクです。
すでに汎用管理グループが存在する Ubuntu 20.04 のようなシステムでは、ユーザーをそのグループに追加することで、簡単にsudo権限を割り当てることができます。 /etc/sudoers ファイルに示されているように、sudoグループは完全な管理者権限を持っており、次のコマンドを入力することでユーザー名をグループに追加できます:
|
1 |
sudo usermod -aG sudo username |
必要に応じて、gpasswd コマンドを使用して同じことを行うこともできます:
|
1 |
sudo gpasswd -a username sudo |
On CentOS では、sudo権限を持つデフォルトのグループ名は wheel となっているため、次のコマンドを使用して権限を割り当てることができます:
|
1 |
sudo usermod -aG wheel username |
または、gpasswd コマンドを使用して、次のコマンドで同じことを行うことができます:
|
1 |
sudo gpasswd -a username wheel |
場合によっては、wheel group on CentOS may be commented out in the /etc/sudoers file. To enable it, open the file with visudo and uncomment the line with the group name. You can do this by removing the # at the beginning of the line: %wheel ALL=(ALL) ALL.
カスタムルールの作成
ここまでに学んだsudoersの一般的な構文の知識を活かして、実際にいくつかのルールを設定してみましょう。
エイリアスの作成
エイリアスを使用すると、さまざまな「エイリアス」の下に項目をグループ化して、sudoersファイルを整理できます。このセクションでは、次の3つのディレクティブについて説明します: User_Alias(ユーザー/グループのエイリアスを作成するため)、Cmnd_Alias(コマンドのエイリアスを作成するため)、および Runas_Alias(別のユーザーとして実行することを許可するため)。
たとえば、User_Alias を使用して、/etc/sudoers ファイル内に次のスニペットを追加して、3つの異なるユーザーグループを作成できます。一部のユーザーは複数のグループに属することができます:
|
1 2 3 |
User_Alias GROUPONE = adelle, nikita, ellie User_Alias GROUPTWO = nikita, brenden, natalia User_Alias GROUPTHREE = brenden, walter, james |
すべてのグループ名が大文字で始まることに注意してください。上記のグループエイリアスを /etc/sudoers ファイルに追加すると、apt データベースを更新する権限を GROUPTWO に割り当てることができます。そのためには、/etc/sudoers ファイルに次のルールを追加します:
|
1 |
GROUPTWO ALL = /usr/bin/apt-get update |
実行するユーザー/グループを指定しない場合、sudo コマンドは常にデフォルトで root ユーザーになります。
以下は、システムをシャットダウンおよび再起動するためのコマンドエイリアスを作成する Cmnd_Alias の例です。このルールは GROUPTHREE に割り当てられます。/etc/sudoers ファイル内に次の行を追加することで、これを実現できます:
|
1 2 |
Cmnd_Alias POWER = /sbin/shutdown, /sbin/halt, /sbin/reboot, /sbin/restart GROUPTHREE ALL = POWER |
上記のスニペットでは、最初の行で電源オフと再起動のコマンドを含む POWER というコマンドエイリアスを作成しています。2行目で、GROUPTHREE のメンバーがこのコマンドを実行できるようにしています。
以下は Runas_Alias の例で、ユーザーグループが別のユーザーとして実行できるようにするエイリアスを作成します:
|
1 2 |
Runas_Alias WEB = www-data, apache GROUPONE ALL = (WEB) ALL |
上記のスニペットでは、最初の行で WEB というエイリアスを作成し、このエイリアスが apache ユーザーまたは www-data ユーザーとして実行されることを指定しています。2行目で、このエイリアスを GROUPONE に割り当てています。これで、グループ1のメンバーは、apache または www-data ユーザーとしてコマンドを実行できるようになります。
ロックダウンルール
このセクションでは、sudo の呼び出しに対する反応を制御するさまざまな方法について説明します。シングルユーザーシステムでは、一部のコマンドは比較的無害です。そのような場合、ユーザーが root 権限で実行できるようにし、root パスワードを入力しなくても済むようにすることができます。たとえば、GROUPONE のユーザーがパスワードを入力せずに updatedb コマンドを実行できるようにするルールを作成するには、/etc/sudoers ファイルに以下を追加します:
|
1 |
GROUPONE ALL = NOPASSWD: /usr/bin/updatedb |
タグ NOPASSWD は、パスワードが要求されないことを意味します。NOPASSWD タグの対になるタグは PASSWD で、これがデフォルトの動作です。これは、プロンプトでパスワードを入力する必要があることを意味します。
タグは、対になるタグによって上書きされない限り、ルールに適用されます。たとえば:
|
1 |
GROUPTWO ALL = NOPASSWD: /usr/bin/updatedb, PASSWD: /bin/kill |
このルールでは、GROUPTWO のユーザーは updatedb コマンドをパスワードを入力せずに実行できます。ただし、kill コマンドを実行する前にはパスワードを入力する必要があります。
危険な実行を防ぐために、ユーザーが特定のコマンドを実行するのを制限したい場合があります。ここで登場するのが、NOEXEC タグです。一部のプログラムは、そのインターフェース内から他のコマンドを実行できます。そのようなプログラムの例として、less があります。次の構文のコマンドを less インターフェース内で入力すると、それが実行され、予期しない動作が発生します。
|
1 |
!name_of_command_to_run |
このような動作を防ぐために、/etc/sudoers ファイルに次のルールを追加して、username:
|
1 |
username ALL = NOEXEC: /usr/bin/less |
追加情報
このセクションでは、sudo を使用する際に必要となる可能性のある追加情報、ディレクティブ、およびコマンドについて説明します。
設定で Runas_Alias を使用し、ユーザーまたはグループが別のユーザーとして実行できることを指定した場合、ユーザーには -u フラグ、グループには -g フラグを使用することで、それらのユーザーとしてコマンドを実行できます。構文は次のとおりです。
|
1 2 |
sudo -u run_as_user command sudo -g run_as_group command |
各コマンドを実行すると、関連するパスワードの入力を求められます。利便性のために、sudo はパスワードを一定時間保存するため、sudo でコマンドを実行するたびに入力し続ける必要はありません。sudo 権限が必要なコマンドの実行が終了したら、次のコマンドを入力してこの時間をクリアできます。
|
1 |
sudo -k |
sudo 権限で実行するタスクがまだあり、パスワード要求までの時間を延長したい場合、または後で sudo コマンドからパスワードを求められないようにしたい場合は、次のコマンドを入力して時間を更新できます。
|
1 |
sudo -v |
このコマンドはパスワードの入力を求め、その後の sudo の使用のためにキャッシュします。
自分自身に定義されている sudo 権限を一覧表示するには、次のコマンドを入力します。
|
1 |
sudo -l |
このコマンドは、/etc/sudoers ファイルに設定されている、あなたのユーザー名に適用されるすべてのルールを一覧表示します。これらのルールから、あなたのユーザー名がシステムでどのようなタスクを実行できるかを把握できます。以下はスクリーンショットの例です。

コマンドを実行したものの、先頭に sudo を付け忘れたために失敗することがあります。このような場合、sudo から始まるコマンドを再入力しなければならないことがあります。コマンドを再入力する手間を省くために、「直前のコマンドを繰り返す」という bash の機能を利用できます。構文は二重の感嘆符(!!)です。ターミナルで最後に実行したコマンドを、次のように入力して実行できます。
|
1 |
sudo !! |
最後に、sudo は単にコマンドを sudo 権限で実行できるように昇格させるものであることを理解しておくことが重要です。詳細については、こちらのリンクの手順に従って、ユーザーと少し楽しんでみてください.
結論
複数のユーザーと作業する場合、sudo コマンドと sudoers ファイルの扱いを理解しておくことは極めて重要です。このチュートリアルでは、sudoers ファイルの読み取りと変更の基本、および root 権限を取得するために使用できるさまざまな方法を紹介しました。
権限の分離こそが Linux システムの安全性を保っているということを常に念頭に置いてください。したがって、一般ユーザーにスーパーユーザー権限を与えるべきではありません。特定のユーザーがシステムで特定のタスクを実行するために絶対に必要な権限のみを割り当て、すべての権限を与えないようにしてください。
ハッピーコンピューティング!
コメント
コメントはまだありません。最初のコメントを投稿しましょう。