Sudoersファイルを編集する方法
序章
特権の分離は、LinuxおよびUnixライクなオペレーティングシステムに実装されている基本的なセキュリティパラダイムの1つです。 通常のユーザーは、より広いオペレーティングシステムではなく、自分の環境への影響の範囲を減らすために、制限された特権で操作します。
root と呼ばれる特別なユーザーには、スーパーユーザー特権があります。 これは、通常のユーザーに存在する制限のない管理アカウントです。 ユーザーは、さまざまな方法でスーパーユーザーまたはroot特権でコマンドを実行できます。
この記事では、/etc/sudoers
ファイルの編集に特に焦点を当てて、root特権を正しく安全に取得する方法について説明します。
これらの手順はUbuntu20.04サーバーで完了しますが、DebianやCentOSなどの最新のLinuxディストリビューションのほとんどは同様の方法で動作するはずです。
このガイドは、ここで説明するサーバーの初期セットアップがすでに完了していることを前提としています。 root 以外の通常のユーザーとしてサーバーにログインし、以下を続行します。
注:このチュートリアルでは、特権の昇格とsudoers
ファイルについて詳しく説明します。 sudo
権限をユーザーに追加するだけの場合は、新しいSudo対応ユーザーを作成する方法クイックスタートチュートリアルUbuntuおよびCentOSを確認してください。 。
ルート権限を取得する方法
root 特権を取得するには、3つの基本的な方法がありますが、それらは洗練度が異なります。
ルートとしてログイン
root 特権を取得する最も簡単で簡単な方法は、rootユーザーとしてサーバーに直接ログインすることです。
ローカルマシンにログインしている場合(または仮想サーバーで帯域外コンソール機能を使用している場合)、ログインプロンプトでユーザー名としてroot
を入力し、rootパスワードを入力します尋ねられたとき。
SSH経由でログインしている場合は、SSH接続文字列のIPアドレスまたはドメイン名の前にrootユーザーを指定します。
- ssh root@server_domain_or_ip
root ユーザーのSSHキーを設定していない場合は、プロンプトが表示されたらrootパスワードを入力します。
su
を使用してルートになる
root として直接ログインすることは、通常はお勧めしません。これは、システムを非管理タスクに使用し始めるのが簡単であり、危険であるためです。
スーパーユーザー権限を取得する次の方法では、必要に応じていつでもrootユーザーになることができます。
これを行うには、「substituteuser」を表すsu
コマンドを呼び出します。 root 特権を取得するには、次のように入力します。
- su
root ユーザーのパスワードの入力を求められます。その後、rootシェルセッションに移動します。
root 権限を必要とするタスクを終了したら、次のように入力して通常のシェルに戻ります。
- exit
sudo
を使用してルートとしてコマンドを実行する
ここで説明するroot特権を取得する最後の方法は、sudo
コマンドを使用することです。
sudo
コマンドを使用すると、新しいシェルを生成することなく、root特権で1回限りのコマンドを実行できます。 これは次のように実行されます。
- sudo command_to_execute
su
とは異なり、sudo
コマンドは、 root パスワードではなく、currentユーザーのパスワードを要求します。
セキュリティへの影響があるため、sudo
アクセスはデフォルトではユーザーに許可されておらず、正しく機能する前に設定する必要があります。 新しいSudo対応ユーザーの作成方法クイックスタートチュートリアルUbuntuおよびCentOSをチェックして、sudo
の設定方法を確認してください-有効なユーザー。
次のセクションでは、sudo
構成を変更する方法について詳しく説明します。
Visudoとは何ですか?
sudo
コマンドは、/etc/sudoers
にあるファイルを介して構成されます。
警告:通常のテキストエディタでこのファイルを編集しないでください。 代わりに、常にvisudo
コマンドを使用してください。
/etc/sudoers
ファイルの構文が不適切な場合、システムが壊れて昇格された特権を取得できない可能性があるため、visudo
コマンドを使用してファイルを編集することが重要です。
visudo
コマンドは通常のようにテキストエディタを開きますが、保存時にファイルの構文を検証します。 これにより、構成エラーがsudo
操作をブロックするのを防ぎます。これは、root特権を取得する唯一の方法である可能性があります。
従来、visudo
は、vi
テキストエディタで/etc/sudoers
ファイルを開きます。 ただし、Ubuntuは、代わりにnano
テキストエディターを使用するようにvisudo
を構成しています。
vi
に戻す場合は、次のコマンドを発行します。
- sudo update-alternatives --config editor
OutputThere are 4 choices for the alternative editor (providing /usr/bin/editor).
Selection Path Priority Status
------------------------------------------------------------
* 0 /bin/nano 40 auto mode
1 /bin/ed -100 manual mode
2 /bin/nano 40 manual mode
3 /usr/bin/vim.basic 30 manual mode
4 /usr/bin/vim.tiny 10 manual mode
Press <enter> to keep the current choice[*], or type selection number:
選択したい番号に対応する番号を選択してください。
CentOSでは、~/.bashrc
に次の行を追加することで、この値を変更できます。
- export EDITOR=`which name_of_editor`
ファイルを入手して変更を実装します。
- . ~/.bashrc
visudo
を構成した後、コマンドを実行して/etc/sudoers
ファイルにアクセスします。
- sudo visudo
Sudoersファイルを変更する方法
選択したテキストエディタに/etc/sudoers
ファイルが表示されます。
コメントを削除して、Ubuntu20.04からファイルをコピーして貼り付けました。 CentOS /etc/sudoers
ファイルにはさらに多くの行があり、その一部についてはこのガイドでは説明しません。
Defaults env_reset
Defaults mail_badpass
Defaults secure_path="/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin:/snap/bin"
root ALL=(ALL:ALL) ALL
%admin ALL=(ALL) ALL
%sudo ALL=(ALL:ALL) ALL
#includedir /etc/sudoers.d
これらの行が何をするかを見てみましょう。
デフォルトの行
最初の行Defaults env_reset
は、ターミナル環境をリセットしてユーザー変数を削除します。 これは、sudo
セッションから潜在的に有害な環境変数をクリアするために使用される安全対策です。
2行目のDefaults mail_badpass
は、設定されたmailto
ユーザーに不正なsudo
パスワード試行の通知をメールで送信するようにシステムに指示します。 デフォルトでは、これはrootアカウントです。
Defaults secure_path=...
で始まる3行目は、sudo
操作に使用されるPATH
(オペレーティングシステムがアプリケーションを検索するファイルシステム内の場所)を指定します。 これにより、有害な可能性のあるユーザーパスの使用を防ぐことができます。
ユーザー特権行
rootユーザーのsudo
特権を指定する4行目は、前の行とは異なります。 さまざまなフィールドの意味を見てみましょう。
-
root ALL=(ALL:ALL) ALL
最初のフィールドは、ルールが適用されるユーザー名( root )を示します。 -
root ALL=(ALL:ALL) ALL
最初の「ALL」は、このルールがすべてのホストに適用されることを示します。 -
root ALL=(ALL:ALL) ALL
この「ALL」は、rootユーザーがすべてのユーザーとしてコマンドを実行できることを示します。 -
root ALL=(ALL:ALL) ALL
この「ALL」は、rootユーザーがすべてのグループとしてコマンドを実行できることを示します。 -
root ALL=(ALL:ALL) ALL
最後の「ALL」は、これらのルールがすべてのコマンドに適用されることを示します。
つまり、 root ユーザーは、パスワードを提供する限り、sudo
を使用して任意のコマンドを実行できます。
グループ特権ライン
次の2行はユーザー特権行に似ていますが、グループにsudo
ルールを指定しています。
%
で始まる名前は、グループ名を示します。
ここでは、 admin グループが、任意のホスト上の任意のユーザーとして任意のコマンドを実行できることがわかります。 同様に、 sudo グループにも同じ権限がありますが、任意のグループとして実行することもできます。
含まれている/etc/sudoers.d行
最後の行は、一見コメントのように見えるかもしれません。
. . .
#includedir /etc/sudoers.d
#
で始まり、通常はコメントを示します。 ただし、この行は、実際には/etc/sudoers.d
ディレクトリ内のファイルもソースおよび適用されることを示しています。
そのディレクトリ内のファイルは、/etc/sudoers
ファイル自体と同じルールに従います。 ~
で終わらないファイルで、.
が含まれていないファイルはすべて読み取られ、sudo
構成に追加されます。
これは主に、アプリケーションがインストール時にsudo
特権を変更することを目的としています。 /etc/sudoers.d
ディレクトリ内の単一のファイル内に関連するすべてのルールを配置すると、/etc/sudoers
を操作しなくても、どの特権がどのアカウントに関連付けられているかを簡単に確認し、資格情報を簡単に取り消すことができます。直接ファイルします。
/etc/sudoers
ファイル自体と同様に、/etc/sudoers.d
ディレクトリ内のファイルは常にvisudo
で編集する必要があります。 これらのファイルを編集するための構文は次のようになります。
- sudo visudo -f /etc/sudoers.d/file_to_edit
ユーザーにSudo特権を与える方法
sudo
権限を管理するときにユーザーが実行する最も一般的な操作は、新しいユーザーに一般的なsudo
アクセスを許可することです。 これは、アカウントにシステムへの完全な管理アクセスを許可する場合に役立ちます。
このガイドのUbuntuシステムのように、汎用管理グループでセットアップされたシステムでこれを行う最も簡単な方法は、実際には、問題のユーザーをそのグループに追加することです。
たとえば、Ubuntu 20.04では、sudo
グループに完全な管理者権限があります。 次のようにグループに追加することで、ユーザーに同じ権限を付与できます。
- sudo usermod -aG sudo username
gpasswd
コマンドも使用できます。
- sudo gpasswd -a username sudo
これらは両方とも同じことを達成します。
CentOSでは、これは通常、sudo
グループではなくwheel
グループです。
- sudo usermod -aG wheel username
または、gpasswd
を使用します。
- sudo gpasswd -a username wheel
CentOSでは、ユーザーをグループに追加してもすぐに機能しない場合は、/etc/sudoers
ファイルを編集してグループ名のコメントを解除する必要があります。
- sudo visudo
. . .
%wheel ALL=(ALL) ALL
. . .
カスタムルールを設定する方法
ファイルの一般的な構文に慣れてきたので、いくつかの新しいルールを作成しましょう。
エイリアスを作成する方法
sudoers
ファイルは、さまざまな種類の「エイリアス」でグループ化することで、より簡単に整理できます。
たとえば、メンバーシップが重複する3つの異なるユーザーグループを作成できます。
. . .
User_Alias GROUPONE = abby, brent, carl
User_Alias GROUPTWO = brent, doris, eric,
User_Alias GROUPTHREE = doris, felicia, grant
. . .
グループ名は大文字で始める必要があります。 次に、次のようなルールを作成することにより、GROUPTWO
のメンバーがapt
データベースを更新できるようにすることができます。
. . .
GROUPTWO ALL = /usr/bin/apt-get update
. . .
上記のように実行するユーザー/グループを指定しない場合、sudo
はデフォルトでrootユーザーになります。
「コマンドエイリアス」を作成し、それをGROUPTHREE
のルールで使用することにより、GROUPTHREE
のメンバーがマシンをシャットダウンおよび再起動できるようにすることができます。
. . .
Cmnd_Alias POWER = /sbin/shutdown, /sbin/halt, /sbin/reboot, /sbin/restart
GROUPTHREE ALL = POWER
. . .
POWER
というコマンドエイリアスを作成します。このエイリアスには、マシンの電源をオフにして再起動するコマンドが含まれています。 次に、GROUPTHREE
のメンバーがこれらのコマンドを実行できるようにします。
「実行」エイリアスを作成することもできます。これにより、コマンドを実行するユーザーを指定するルールの部分を次のように置き換えることができます。
. . .
Runas_Alias WEB = www-data, apache
GROUPONE ALL = (WEB) ALL
. . .
これにより、GROUPONE
のメンバーであるすべてのユーザーが、www-data
ユーザーまたはapache
ユーザーとしてコマンドを実行できるようになります。
2つの間に競合がある場合、後のルールが前のルールをオーバーライドすることに注意してください。
ルールをロックダウンする方法
sudo
が通話にどのように反応するかをより細かく制御できる方法はいくつかあります。
mlocate
パッケージに関連付けられているupdatedb
コマンドは、シングルユーザーシステムでは比較的無害です。 ユーザーがroot特権を使用してパスワードを入力せずに実行できるようにする場合は、次のようなルールを作成できます。
. . .
GROUPONE ALL = NOPASSWD: /usr/bin/updatedb
. . .
NOPASSWD
は、パスワードが要求されないことを意味する「タグ」です。 PASSWD
というコンパニオンコマンドがあり、これがデフォルトの動作です。 タグは、後で「ツイン」タグによって却下されない限り、ルールの残りの部分に関連します。
たとえば、次のような行を作成できます。
. . .
GROUPTWO ALL = NOPASSWD: /usr/bin/updatedb, PASSWD: /bin/kill
. . .
もう1つの便利なタグはNOEXEC
です。これは、特定のプログラムでの危険な動作を防ぐために使用できます。
たとえば、less
などの一部のプログラムは、インターフェイス内から次のように入力することで、他のコマンドを生成できます。
!command_to_run
これは基本的に、less
が実行されているのと同じ権限でユーザーがコマンドに与えるコマンドを実行しますが、これは非常に危険です。
これを制限するには、次のような行を使用できます。
. . .
username ALL = NOEXEC: /usr/bin/less
. . .
その他の情報
sudo
を扱うときに役立つ情報がさらにいくつかあります。
構成ファイルで「実行」するユーザーまたはグループを指定した場合は、それぞれ-u
および-g
フラグを使用して、それらのユーザーとしてコマンドを実行できます。
- sudo -u run_as_user command
- sudo -g run_as_group command
便宜上、デフォルトでは、sudo
は認証の詳細を1つの端末に一定期間保存します。 これは、タイマーが切れるまでパスワードを再入力する必要がないことを意味します。
セキュリティ上の理由から、管理コマンドの実行が終了したときにこのタイマーをクリアしたい場合は、次のコマンドを実行できます。
- sudo -k
一方、sudo
コマンドを「プライミング」して後でプロンプトが表示されないようにする場合、またはsudo
リースを更新する場合は、いつでも次のように入力できます。
- sudo -v
パスワードの入力を求められます。パスワードは、sudo
の期限が切れるまでsudo
が使用するためにキャッシュされます。
ユーザー名にどのような特権が定義されているのか疑問に思っている場合は、次のように入力できます。
- sudo -l
これにより、ユーザーに適用される/etc/sudoers
ファイル内のすべてのルールが一覧表示されます。 これにより、sudo
をユーザーとして使用できるようになるかどうかがわかります。
コマンドを実行すると、sudo
の前に付けるのを忘れたために、コマンドが失敗することがよくあります。 コマンドを再入力する必要をなくすために、「最後のコマンドを繰り返す」という意味のbash機能を利用できます。
- sudo !!
二重感嘆符は最後のコマンドを繰り返します。 その前にsudo
を付けて、非特権コマンドを特権コマンドにすばやく変更しました。
楽しみのために、visudo
を使用して/etc/sudoers
ファイルに次の行を追加できます。
- sudo visudo
. . .
Defaults insults
. . .
これにより、ユーザーがsudo
に間違ったパスワードを入力すると、sudo
は愚かな侮辱を返します。 sudo -k
を使用して、以前のsudo
のキャッシュされたパスワードをクリアして、試してみることができます。
- sudo -k
- sudo ls
Output[sudo] password for demo: # enter an incorrect password here to see the results
Your mind just hasn't been the same since the electro-shock, has it?
[sudo] password for demo:
My mind is going. I can feel it.
結論
これで、sudoers
ファイルの読み取りと変更の基本的な理解と、root特権を取得するために使用できるさまざまな方法を理解できたはずです。
スーパーユーザー権限は、理由により通常のユーザーには付与されないことに注意してください。 root特権で実行する各コマンドの機能を理解することが重要です。 責任を軽視しないでください。 ユースケースにこれらのツールを使用するための最良の方法を学び、不要な機能をすべてロックダウンします。