序章

特権の分離は、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ユーザーを指定します。

  1. ssh [email protected]server_domain_or_ip

root ユーザーのSSHキーを設定していない場合は、プロンプトが表示されたらrootパスワードを入力します。

suを使用してルートになる

root として直接ログインすることは、通常はお勧めしません。これは、システムを非管理タスクに使用し始めるのが簡単であり、危険であるためです。

スーパーユーザー権限を取得する次の方法では、必要に応じていつでもrootユーザーになることができます。

これを行うには、「substituteuser」を表すsuコマンドを呼び出します。 root 特権を取得するには、次のように入力します。

  1. su

root ユーザーのパスワードの入力を求められます。その後、rootシェルセッションに移動します。

root 権限を必要とするタスクを終了したら、次のように入力して通常のシェルに戻ります。

  1. exit

sudoを使用してルートとしてコマンドを実行する

ここで説明するroot特権を取得する最後の方法は、sudoコマンドを使用することです。

sudoコマンドを使用すると、新しいシェルを生成することなく、root特権で1回限りのコマンドを実行できます。 これは次のように実行されます。

  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に戻す場合は、次のコマンドを発行します。

  1. sudo update-alternatives --config editor
Output
There 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に次の行を追加することで、この値を変更できます。

  1. export EDITOR=`which name_of_editor`

ファイルを入手して変更を実装します。

  1. . ~/.bashrc

visudoを構成した後、コマンドを実行して/etc/sudoersファイルにアクセスします。

  1. sudo visudo

Sudoersファイルを変更する方法

選択したテキストエディタに/etc/sudoersファイルが表示されます。

コメントを削除して、Ubuntu20.04からファイルをコピーして貼り付けました。 CentOS /etc/sudoersファイルにはさらに多くの行があり、その一部についてはこのガイドでは説明しません。

/ 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行

最後の行は、一見コメントのように見えるかもしれません。

/ etc / sudoers
. . .

#includedir /etc/sudoers.d

#で始まり、通常はコメントを示します。 ただし、この行は、実際には/etc/sudoers.dディレクトリ内のファイルもソースおよび適用されることを示しています。

そのディレクトリ内のファイルは、/etc/sudoersファイル自体と同じルールに従います。 ~で終わらないファイルで、.が含まれていないファイルはすべて読み取られ、sudo構成に追加されます。

これは主に、アプリケーションがインストール時にsudo特権を変更することを目的としています。 /etc/sudoers.dディレクトリ内の単一のファイル内に関連するすべてのルールを配置すると、/etc/sudoersを操作しなくても、どの特権がどのアカウントに関連付けられているかを簡単に確認し、資格情報を簡単に取り消すことができます。直接ファイルします。

/etc/sudoersファイル自体と同様に、/etc/sudoers.dディレクトリ内のファイルは常にvisudoで編集する必要があります。 これらのファイルを編集するための構文は次のようになります。

  1. sudo visudo -f /etc/sudoers.d/file_to_edit

ユーザーにSudo特権を与える方法

sudo権限を管理するときにユーザーが実行する最も一般的な操作は、新しいユーザーに一般的なsudoアクセスを許可することです。 これは、アカウントにシステムへの完全な管理アクセスを許可する場合に役立ちます。

このガイドのUbuntuシステムのように、汎用管理グループでセットアップされたシステムでこれを行う最も簡単な方法は、実際には、問題のユーザーをそのグループに追加することです。

たとえば、Ubuntu 20.04では、sudoグループに完全な管理者権限があります。 次のようにグループに追加することで、ユーザーに同じ権限を付与できます。

  1. sudo usermod -aG sudo username

gpasswdコマンドも使用できます。

  1. sudo gpasswd -a username sudo

これらは両方とも同じことを達成します。

CentOSでは、これは通常、sudoグループではなくwheelグループです。

  1. sudo usermod -aG wheel username

または、gpasswdを使用します。

  1. sudo gpasswd -a username wheel

CentOSでは、ユーザーをグループに追加してもすぐに機能しない場合は、/etc/sudoersファイルを編集してグループ名のコメントを解除する必要があります。

  1. sudo visudo
/ etc / sudoers
. . .
%wheel ALL=(ALL) ALL
. . .

カスタムルールを設定する方法

ファイルの一般的な構文に慣れてきたので、いくつかの新しいルールを作成しましょう。

エイリアスを作成する方法

sudoersファイルは、さまざまな種類の「エイリアス」でグループ化することで、より簡単に整理できます。

たとえば、メンバーシップが重複する3つの異なるユーザーグループを作成できます。

/ etc / sudoers
. . .
User_Alias		GROUPONE = abby, brent, carl
User_Alias		GROUPTWO = brent, doris, eric,
User_Alias		GROUPTHREE = doris, felicia, grant
. . .

グループ名は大文字で始める必要があります。 次に、次のようなルールを作成することにより、GROUPTWOのメンバーがaptデータベースを更新できるようにすることができます。

/ etc / sudoers
. . .
GROUPTWO	ALL = /usr/bin/apt-get update
. . .

上記のように実行するユーザー/グループを指定しない場合、sudoはデフォルトでrootユーザーになります。

「コマンドエイリアス」を作成し、それをGROUPTHREEのルールで使用することにより、GROUPTHREEのメンバーがマシンをシャットダウンおよび再起動できるようにすることができます。

/ etc / sudoers
. . .
Cmnd_Alias		POWER = /sbin/shutdown, /sbin/halt, /sbin/reboot, /sbin/restart
GROUPTHREE	ALL = POWER
. . .

POWERというコマンドエイリアスを作成します。このエイリアスには、マシンの電源をオフにして再起動するコマンドが含まれています。 次に、GROUPTHREEのメンバーがこれらのコマンドを実行できるようにします。

「実行」エイリアスを作成することもできます。これにより、コマンドを実行するユーザーを指定するルールの部分を次のように置き換えることができます。

/ etc / sudoers
. . .
Runas_Alias		WEB = www-data, apache
GROUPONE	ALL = (WEB) ALL
. . .

これにより、GROUPONEのメンバーであるすべてのユーザーが、www-dataユーザーまたはapacheユーザーとしてコマンドを実行できるようになります。

2つの間に競合がある場合、後のルールが前のルールをオーバーライドすることに注意してください。

ルールをロックダウンする方法

sudoが通話にどのように反応するかをより細かく制御できる方法はいくつかあります。

mlocateパッケージに関連付けられているupdatedbコマンドは、シングルユーザーシステムでは比較的無害です。 ユーザーがroot特権を使用してパスワードを入力せずに実行できるようにする場合は、次のようなルールを作成できます。

/ etc / sudoers
. . .
GROUPONE	ALL = NOPASSWD: /usr/bin/updatedb
. . .

NOPASSWDは、パスワードが要求されないことを意味する「タグ」です。 PASSWDというコンパニオンコマンドがあり、これがデフォルトの動作です。 タグは、後で「ツイン」タグによって却下されない限り、ルールの残りの部分に関連します。

たとえば、次のような行を作成できます。

/ etc / sudoers
. . .
GROUPTWO	ALL = NOPASSWD: /usr/bin/updatedb, PASSWD: /bin/kill
. . .

もう1つの便利なタグはNOEXECです。これは、特定のプログラムでの危険な動作を防ぐために使用できます。

たとえば、lessなどの一部のプログラムは、インターフェイス内から次のように入力することで、他のコマンドを生成できます。

!command_to_run

これは基本的に、lessが実行されているのと同じ権限でユーザーがコマンドに与えるコマンドを実行しますが、これは非常に危険です。

これを制限するには、次のような行を使用できます。

/ etc / sudoers
. . .
username	ALL = NOEXEC: /usr/bin/less
. . .

その他の情報

sudoを扱うときに役立つ情報がさらにいくつかあります。

構成ファイルで「実行」するユーザーまたはグループを指定した場合は、それぞれ-uおよび-gフラグを使用して、それらのユーザーとしてコマンドを実行できます。

  1. sudo -u run_as_user command
  2. sudo -g run_as_group command

便宜上、デフォルトでは、sudoは認証の詳細を1つの端末に一定期間保存します。 これは、タイマーが切れるまでパスワードを再入力する必要がないことを意味します。

セキュリティ上の理由から、管理コマンドの実行が終了したときにこのタイマーをクリアしたい場合は、次のコマンドを実行できます。

  1. sudo -k

一方、sudoコマンドを「プライミング」して後でプロンプトが表示されないようにする場合、またはsudoリースを更新する場合は、いつでも次のように入力できます。

  1. sudo -v

パスワードの入力を求められます。パスワードは、sudoの期限が切れるまでsudoが使用するためにキャッシュされます。

ユーザー名にどのような特権が定義されているのか疑問に思っている場合は、次のように入力できます。

  1. sudo -l

これにより、ユーザーに適用される/etc/sudoersファイル内のすべてのルールが一覧表示されます。 これにより、sudoをユーザーとして使用できるようになるかどうかがわかります。

コマンドを実行すると、sudoの前に付けるのを忘れたために、コマンドが失敗することがよくあります。 コマンドを再入力する必要をなくすために、「最後のコマンドを繰り返す」という意味のbash機能を利用できます。

  1. sudo !!

二重感嘆符は最後のコマンドを繰り返します。 その前にsudoを付けて、非特権コマンドを特権コマンドにすばやく変更しました。

楽しみのために、visudoを使用して/etc/sudoersファイルに次の行を追加できます。

  1. sudo visudo
/ etc / sudoers
. . .
Defaults	insults
. . .

これにより、ユーザーがsudoに間違ったパスワードを入力すると、sudoは愚かな侮辱を返します。 sudo -kを使用して、以前のsudoのキャッシュされたパスワードをクリアして、試してみることができます。

  1. sudo -k
  2. 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特権で実行する各コマンドの機能を理解することが重要です。 責任を軽視しないでください。 ユースケースにこれらのツールを使用するための最良の方法を学び、不要な機能をすべてロックダウンします。