sudoersファイルを編集する方法

紹介

特権分離は、LinuxやUnix系オペレーティングシステムで実装されている基本的なセキュリティパラダイムの1つです。通常のユーザーは、自分自身の環境に影響を及ぼす範囲を狭めるために、制限された特権で操作します。この記事では、

A special user, called root, has super-user privileges. This is an administrative account without the restrictions that are present on normal users. Users can execute commands with super-user or root privileges in a number of different ways.

正確かつ安全にroot権限を取得する方法について、特に/etc/sudoersファイルの編集に焦点を当てて説明します。

これらの手順を、Ubuntu 20.04サーバーで完了しますが、DebianやCentOSなどのほとんどの現代のLinuxディストリビューションも同様の方法で操作できるはずです。

このガイドでは、ここで議論されている初期サーバーセットアップを既に完了していることを前提としています。通常のrootユーザーではなく、サーバーにログインし、以下を続行してください。注意:このチュートリアルでは特権昇格とsudoersファイルについて詳しく説明します。ユーザーにsudo特権を追加するだけの場合は、新しいSudo有効ユーザーの作成方法を確認してください。UbuntuおよびCentOSのクイックスタートチュートリアル。

注意: このチュートリアルでは、特権昇格とsudoersファイルについて詳しく説明します。sudo特権をユーザーに追加するだけの場合は、新しいSudo有効ユーザーの作成方法クイックスタートチュートリアルをUbuntuCentOSでご覧ください。

ルート特権の取得方法

ルート特権を取得する基本的な方法は3つあり、その洗練度が異なります。

ルートとしてログイン

ルート特権を取得する最も単純で直接的な方法は、サーバーにルートユーザーとして直接ログインすることです。ルートユーザー。

ローカルマシンにログインしている場合(または仮想サーバーのオフバンドコンソール機能を使用している場合)、ログインプロンプトでユーザー名としてrootを入力し、rootパスワードを入力してください。

SSHでログインする場合、SSH接続文字列でIPアドレスまたはドメイン名の前にrootユーザーを指定してください:

  1. ssh root@server_domain_or_ip

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

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

rootとして直接ログインすることは通常お勧めしません。なぜなら、システムを非管理タスク用に使用し始めることが危険だからです。

次の方法では、必要な時にいつでもrootユーザーになることができます。

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

  1. su

rootユーザーのパスワードを求められた後、rootシェルセッションにドロップされます。

root権限が必要なタスクが完了したら、通常のシェルに戻るには、次のように入力します。

  1. exit

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

最後に、root 特権を取得する方法として議論するのは、sudo コマンドです。

sudo コマンドを使用すると、新しいシェルを起動する必要なく、root 特権で一度限りのコマンドを実行できます。次のように実行します。

  1. sudo command_to_execute

su とは異なり、sudo コマンドは 現在の ユーザーのパスワードを要求し、root パスワードではありません。

セキュリティへの影響から、sudo アクセスはユーザーにデフォルトで付与されておらず、正しく機能する前に設定する必要があります。sudo 対応のユーザーを作成する方法について、新しい sudo 対応ユーザーの作成方法 クイックスタートチュートリアルを UbuntuCentOS でチェックしてください。

次のセクションでは、sudo の設定を詳細に変更する方法について説明します。

Visudo とは何ですか?

sudo コマンドは、/etc/sudoers にあるファイルを通じて設定されます。

警告: 決して通常のテキストエディタでこのファイルを編集しないでください!代わりに常に visudo コマンドを使用してください!

不適切な構文が/etc/sudoersファイルにあると、昇格した特権を得ることが不可能な壊れたシステムになることがあるため、visudoコマンドを使用してファイルを編集することが重要です。

visudoコマンドは通常のテキストエディタを開きますが、保存時にファイルの構文を検証します。これにより、sudo操作をブロックするような設定エラーを防ぐことができ、root特権を得るための唯一の方法かもしれません。

伝統的に、visudoviテキストエディタで/etc/sudoersファイルを開きます。しかし、Ubuntuはvisudonanoテキストエディタを使用するように設定しています。

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ファイルが表示されます。

I have copied and pasted the file from Ubuntu 20.04, with comments removed. The CentOS /etc/sudoers file has many more lines, some of which we will not discuss in this guide.

/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は、悪いsudoパスワード試行の通知を構成されたmailtoユーザーにメールで送るシステムに指示します。デフォルトでは、これはrootアカウントです。

3行目、Defaults secure_path=...で始まり、sudo操作で使用されるPATH(オペレーティングシステムがアプリケーションを探すファイルシステム内の場所)を指定します。これにより、有害である可能性のあるユーザーパスを使用できなくなります。

ユーザープリビジョンの行

4行目、rootユーザーのsudo権限を規定する行は、前の行とは異なります。異なるフィールドが何を意味するか見てみましょう。

  • 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 20.04では、sudoグループには完全な管理者権限があります。以下のようにユーザーをグループに追加することで、これらの同じ権限をユーザーに付与できます。

  1. sudo usermod -aG sudo username

gpasswdコマンドを使用することもできます。

  1. sudo gpasswd -a username sudo

これらはどちらも同じことを達成します。

CentOSでは、通常wheelグループがsudoグループの代わりに使用されます:

  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
. . .

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

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
. . .

別の便利なタグは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 !!

2 つの感嘆符は最後のコマンドを繰り返します。私たちはそれを 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 権限で実行する各コマンドの意味を理解することが重要です。責任を軽く受け取らないでください。ご利用のユースケースに最適な方法を学び、不要な機能をロックダウンしてください。

Source:
https://www.digitalocean.com/community/tutorials/how-to-edit-the-sudoers-file