紹介
特権分離は、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
特権を追加するだけの場合は、
注意: このチュートリアルでは、特権昇格とsudoers
ファイルについて詳しく説明します。sudo
特権をユーザーに追加するだけの場合は、新しいSudo有効ユーザーの作成方法クイックスタートチュートリアルをUbuntuとCentOSでご覧ください。
ルート特権の取得方法
ルート特権を取得する基本的な方法は3つあり、その洗練度が異なります。
ルートとしてログイン
ルート特権を取得する最も単純で直接的な方法は、サーバーにルートユーザーとして直接ログインすることです。ルートユーザー。
ローカルマシンにログインしている場合(または仮想サーバーのオフバンドコンソール機能を使用している場合)、ログインプロンプトでユーザー名としてroot
を入力し、rootパスワードを入力してください。
SSHでログインする場合、SSH接続文字列でIPアドレスまたはドメイン名の前にrootユーザーを指定してください:
また、rootユーザー用にSSHキーを設定していない場合は、プロンプトが表示されたらrootパスワードを入力してください。
su
を使用してルートになる
rootとして直接ログインすることは通常お勧めしません。なぜなら、システムを非管理タスク用に使用し始めることが危険だからです。
次の方法では、必要な時にいつでもrootユーザーになることができます。
これを行うには、「substitute user」を意味するsu
コマンドを呼び出します。root権限を取得するには、次のように入力します。
rootユーザーのパスワードを求められた後、rootシェルセッションにドロップされます。
root権限が必要なタスクが完了したら、通常のシェルに戻るには、次のように入力します。
sudo
を使用してルートとしてコマンドを実行する
最後に、root 特権を取得する方法として議論するのは、sudo
コマンドです。
sudo
コマンドを使用すると、新しいシェルを起動する必要なく、root 特権で一度限りのコマンドを実行できます。次のように実行します。
su
とは異なり、sudo
コマンドは 現在の ユーザーのパスワードを要求し、root パスワードではありません。
セキュリティへの影響から、sudo
アクセスはユーザーにデフォルトで付与されておらず、正しく機能する前に設定する必要があります。sudo
対応のユーザーを作成する方法について、新しい sudo 対応ユーザーの作成方法 クイックスタートチュートリアルを Ubuntu と CentOS でチェックしてください。
次のセクションでは、sudo
の設定を詳細に変更する方法について説明します。
Visudo とは何ですか?
sudo
コマンドは、/etc/sudoers
にあるファイルを通じて設定されます。
警告: 決して通常のテキストエディタでこのファイルを編集しないでください!代わりに常に visudo
コマンドを使用してください!
不適切な構文が/etc/sudoers
ファイルにあると、昇格した特権を得ることが不可能な壊れたシステムになることがあるため、visudo
コマンドを使用してファイルを編集することが重要です。
visudo
コマンドは通常のテキストエディタを開きますが、保存時にファイルの構文を検証します。これにより、sudo
操作をブロックするような設定エラーを防ぐことができ、root特権を得るための唯一の方法かもしれません。
伝統的に、visudo
はvi
テキストエディタで/etc/sudoers
ファイルを開きます。しかし、Ubuntuはvisudo
をnano
テキストエディタを使用するように設定しています。
vi
に戻すには、次のコマンドを発行します。
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
に次の行を追加することでこの値を変更できます。
変更を適用するには、ファイルをソースします。
visudo
を設定した後、コマンドを実行して/etc/sudoers
ファイルにアクセスします。
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.
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の行
最後の行は最初はコメントに見えるかもしれません:
. . .
#includedir /etc/sudoers.d
それは実際にコメントを示す通常の#
で始まります。しかし、この行は実際には/etc/sudoers.d
ディレクトリ内のファイルがソース化され、同様に適用されることを示しています。
そのディレクトリ内のファイルは/etc/sudoers
ファイル自体と同じルールに従います。~
で終わらないファイルと.
が含まれていないファイルはすべて読み取られ、sudo
構成に追加されます。
これは主に、インストール時にsudo
の権限を変更するアプリケーションのためのものです。関連するルールをすべて/etc/sudoers.d
ディレクトリ内の単一のファイルに配置することで、どのアカウントにどのような権限が関連しているかを簡単に確認し、/etc/sudoers
ファイルを直接操作することなく資格情報を簡単に取り消すことができます。
/etc/sudoers
ファイル自体と同様に、/etc/sudoers.d
ディレクトリ内のファイルは常にvisudo
で編集する必要があります。これらのファイルを編集するための構文は次のとおりです。
ユーザーにsudo権限を付与する方法
sudo
権限を管理する際にユーザーが達成したい最も一般的な操作は、新しいユーザーに一般的なsudo
アクセスを与えることです。これは、アカウントにシステムへの完全な管理者アクセス権を与えたい場合に役立ちます。
このガイドで説明するような汎用の管理者グループでシステムが設定されている場合、実は問題のユーザーをそのグループに追加することが最も簡単な方法です。
たとえば、Ubuntu 20.04では、sudo
グループには完全な管理者権限があります。以下のようにユーザーをグループに追加することで、これらの同じ権限をユーザーに付与できます。
gpasswd
コマンドを使用することもできます。
これらはどちらも同じことを達成します。
CentOSでは、通常wheel
グループがsudo
グループの代わりに使用されます:
または、gpasswd
を使用して:
CentOSでユーザーをグループに追加してもすぐに機能しない場合は、/etc/sudoers
ファイルを編集してグループ名をコメント解除する必要があるかもしれません:
. . .
%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
. . .
別の便利なタグはNOEXEC
で、特定のプログラムで危険な動作を防ぐために使用できます。
たとえば、less
のようなプログラムは、インターフェイス内からこれを入力して他のコマンドを起動できます。
!command_to_run
これは基本的に、ユーザーがそれに与えた任意のコマンドを、less
が実行されているのと同じ権限で実行します。これはかなり危険です。
これを制限するには、次のような行を使用できます。
. . .
username ALL = NOEXEC: /usr/bin/less
. . .
その他の情報
sudo
に関連する場合に役立つ可能性があるいくつかの追加情報があります。
コンフィギュレーションファイルで「実行するユーザー」または「グループ」を指定した場合、-u
および-g
フラグをそれぞれ使用して、それらのユーザーとしてコマンドを実行できます。
便宜上、デフォルトでは、sudo
は一定期間、1つのターミナルに認証詳細を保存します。これは、タイマーが終了するまでパスワードを再入力する必要がないことを意味します。
セキュリティ上の理由から、管理者コマンドを実行した後にこのタイマーをクリアする場合は、次のように実行できます。
一方、後でプロンプトが表示されないようにsudo
コマンドを「プライム」にしたい、またはsudo
リースを更新したい場合は、常に次のように入力できます。
パスワードを求められます。これは、sudo
の時間枠が切れるまで、後で sudo
を使用するためにキャッシュされます。
ユーザー名に定義されている特権がどのようなものかを単に知りたいだけの場合は、次のように入力できます。
これにより、/etc/sudoers
ファイルのルールすべてが、ユーザーに適用されます。これにより、sudo
を使用する際に、どのようなことが許可されているのか、または許可されていないのかがわかります。
コマンドを実行して失敗することがあります。これは、sudo
で始めることを忘れたためです。コマンドを再入力する必要がないようにするために、bash の機能を利用できます。これは「最後のコマンドを繰り返す」という意味です。
2 つの感嘆符は最後のコマンドを繰り返します。私たちはそれを sudo
で始めることで、特権のないコマンドを特権のあるコマンドにすばやく変更しました。
面白いことに、visudo
で /etc/sudoers
ファイルに次の行を追加できます。
. . .
Defaults insults
. . .
これにより、ユーザーが sudo
のパスワードを間違えると、sudo
はおかしな侮辱を返します。sudo -k
を使用して、以前の sudo
キャッシュされたパスワードをクリアし、試してみることができます。
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