Linux におけるユーザーアカウントと Sudo 権限の設定

CompTIABeginner
オンラインで実践に進む

はじめに

この実験では、Linux システムのセキュリティを向上させるために不可欠な、ユーザーアカウント管理と sudo 権限の設定に関する主要な技術を習得します。パスワードポリシーの強制適用、ユーザーアカウントのロックと解除、root アカウントの保護、および管理者権限の委譲を実践します。これらのスキルは、安全で適切に管理された Linux 環境を維持する責任を負うシステム管理者にとって、極めて重要な基礎知識です。

まず、chage コマンドを使用してパスワードの有効期限ルールを設定し、passwd コマンドでアカウントへのアクセスを制御する方法から始めます。次に、root ユーザーによる直接の SSH ログインを無効化することで、システムのセキュリティを強化します。最後に、権限を昇格させる 2 つの方法を学習します。1 つは一般的な sudo アクセスのためにユーザーを wheel グループに追加する方法、もう 1 つは visudo コマンドを使用してカスタムのきめ細かなルールを作成し、特定の管理タスクを安全に委譲する方法です。

chage によるユーザーパスワードポリシーの管理

このステップでは、chage コマンドを使用してユーザーのパスワードポリシーを管理する方法を学びます。有効期限の設定などのパスワードポリシーを適用することは、不正アクセスからユーザーアカウントを保護するための重要なセキュリティ対策です。chage コマンド("change age" の略)を使用すると、ユーザーアカウントのパスワードの有効期限に関する情報を表示および変更できます。

まず、安全に練習するために新しいユーザーを作成しましょう。このユーザーの名前を testuser とします。以下のコマンドを実行してユーザーを追加します。

sudo useradd -m testuser

次に、testuser のパスワードを設定します。新しいパスワードの入力と確認を求められます。この実験では簡単にするために、パスワードとして password を使用してください。

sudo passwd testuser

パスワードが正常に更新されたことを確認するメッセージが表示されます。

New password:
Retype new password:
passwd: password updated successfully

testuser が作成されたので、デフォルトのパスワード有効期限設定を確認してみましょう。chage コマンドに -l(list)オプションを付けて実行します。

sudo chage -l testuser

出力には現在のポリシーが表示されます。デフォルトでは、ほとんどの設定が無効になっており、パスワードの期限は切れないようになっています。

Last password change     : <date>
Password expires     : never
Password inactive     : never
Account expires      : never
Minimum number of days between password change  : 0
Maximum number of days between password change  : 99999
Number of days of warning before password expires : 7

より厳格なポリシーを適用してみましょう。以下のようにアカウントを設定します。

  • -m 7: 次にパスワードを変更できるようになるまで、最低 7 日間待機する必要があります。
  • -M 90: パスワードは 90 日後に期限切れになります。
  • -W 14: パスワードが切れる 14 日前にユーザーに警告が表示されます。

これらの設定は、1 つの chage コマンドでまとめて適用できます。

sudo chage -m 7 -M 90 -W 14 testuser

設定を再度リスト表示して、変更が適用されたことを確認します。

sudo chage -l testuser

出力に、今設定した新しいポリシーが反映されているはずです。

Last password change     : <date>
Password expires     : <date + 90 days>
Password inactive     : never
Account expires      : never
Minimum number of days between password change  : 7
Maximum number of days between password change  : 90
Number of days of warning before password expires : 14

ユーザーのパスワードステータスを素早く確認するためのもう 1 つの便利なコマンドは passwd -S です。testuser で試してみましょう。

sudo passwd -S testuser

出力には、最終変更日、最小有効期間、最大有効期間、警告期間など、パスワードステータスの簡潔な要約が表示されます。

testuser PS <date> 7 90 14 -1

これで、ユーザーアカウントのパスワード有効期限ポリシーの設定と確認が正常に完了しました。

passwd によるユーザーアカウントのロックと解除

このステップでは、ユーザーアカウントを一時的にロックおよび解除する方法を学びます。これは、従業員が長期休暇に入る場合や、アカウントが侵害された疑いがある場合などによく行われる管理タスクです。アカウントをロックするとログインはできなくなりますが、ユーザーのデータや設定は保持されます。前のステップで作成した testuser アカウントを使用します。

まず、testuser アカウントをロックしましょう。これには passwd コマンドの -l(lock)オプションを使用します。

sudo passwd -l testuser

確認メッセージが表示されるはずです。

passwd: password expiry information changed.

アカウントがロックされていることを確認するために、再度 passwd -S コマンドでステータスをチェックします。

sudo passwd -S testuser

出力のステータスフィールドに注目してください。L(Locked)で始まっているはずで、これはパスワードによるログインが無効になっていることを示しています。

testuser L <date> 7 90 14 -1

アクセスできないことを確認するために、testuser アカウントに切り替えてみましょう。su(substitute user)コマンドを使用します。testuser のパスワードを求められます。

su - testuser

パスワード password を入力します。ログイン試行は失敗しますが、これはロックされたアカウントに対する期待通りの動作です。

Password:
su: Authentication failure

次に、アカウントのロックを解除します。これには passwd -u(unlock)オプションを使用します。

sudo passwd -u testuser

再び確認メッセージが表示されます。

passwd: password expiry information changed.

passwd -S でロック解除されたステータスを確認します。

sudo passwd -S testuser

ステータスが PS(Password Set)になり、アカウントがアクティブで有効なパスワードを持っていることを示しているはずです。

testuser PS <date> 7 90 14 -1

最後に、もう一度 testuser アカウントへの切り替えを試みます。

su - testuser

プロンプトが表示されたらパスワード password を入力します。今回はログインに成功し、コマンドプロンプトが testuser としてログインしていることを示す表示に変わります。

Password:
testuser@<hostname>:~$

元の labex ユーザーセッションに戻るには、exit と入力して Enter キーを押します。

exit

これで、ユーザーアカウントのロックと解除の実践が正常に完了しました。

SSH ログインの無効化による root アカウントの保護

このステップでは、root ユーザーによる直接の SSH ログインを無効にすることで、システムのセキュリティを強化します。リモートからの root ログインを許可することは、攻撃者に対して特権の高いターゲットを直接提供することになり、重大なセキュリティリスクとなります。標準ユーザーとしてログインし、管理タスクを実行する際に sudo を使用するのがベストプラクティスです。

まず、/etc/ssh/sshd_config にある SSH デーモンの設定ファイルを編集する必要があります。このファイルを修正するために nano テキストエディタを使用します。これは保護されたシステムファイルであるため、sudo を使用する必要があります。

sudo nano /etc/ssh/sshd_config

nano エディタ内で、PermitRootLogin を含む行を探します。Ctrl+W を押し、PermitRootLogin と入力して Enter を押すと検索機能を使用できます。

注意: 一部のオペレーティングシステムやブラウザ環境では、Ctrl+W ショートカットがブラウザのショートカットと競合する場合があります。検索に Ctrl+W が使用できない場合は、ファイルを手動でスクロールして PermitRootLogin の行を探してください。通常、設定ファイルの認証(authentication)セクションにあります。

おそらく、以下のような行が見つかるはずです。

#PermitRootLogin prohibit-password

あるいは、yes に設定されているかもしれません。あなたのタスクは、この行を PermitRootLogin no に変更することです。行の先頭に # がある場合は、その行がコメントアウトされて無効になっていることを意味するため、必ず削除してください。最終的な行は正確に以下のようになっている必要があります。

PermitRootLogin no

変更後、ファイルを保存して nano を終了します。Ctrl+X を押し、変更を保存するか確認されたら Y を押し、最後に Enter を押してファイル名を確定します。

新しい設定を反映させるには、SSH サービスを再起動する必要があります。これには service コマンドを使用します。

sudo service ssh restart

正常に実行された場合、コマンドは何も出力しません。サービスが正しく動作しているか確認するために、ステータスをチェックできます。

sudo service ssh status

サービスが running(実行中)であることを確認してください。

では、変更が機能するかテストしてみましょう。自分自身のマシンから(localhost を使用して)root として SSH ログインを試みます。テストを有効にするために、まず root ユーザーのパスワードを設定する必要があります。パスワードには password を使用してください。

sudo passwd root
New password:
Retype new password:
passwd: password updated successfully

次に、root として SSH 接続を試みます。

ssh root@localhost

接続はすぐに拒否され、"Permission denied" エラーが表示されるはずです。これにより、セキュリティ強化が正しく機能していることが確認できます。

root@localhost: Permission denied (publickey,password).

SSH 経由の直接の root ログインを無効にすることで、システムの保護に成功しました。

wheel グループ経由の Sudo アクセス権限の付与

このステップでは、管理者権限を付与するための標準的な方法を学びます。それは、sudo アクセスができるようにあらかじめ設定された特別なグループ(一般的には wheel または sudo)にユーザーを追加する方法です。このアプローチは、sudoers ファイルに個々のユーザーエントリを追加するよりも管理しやすく、拡張性があります。引き続き testuser アカウントを使用します。

まず、testuser が現在 sudo 権限を持っていないことを確認しましょう。testuser アカウントに切り替えます。パスワードは password です。

su - testuser

次に、testuser として、sudo を使用して whoami などの root 権限が必要なコマンドを実行してみます。testuser のパスワードを求められます。

sudo whoami

パスワードを入力すると、コマンドは失敗します。testuser が sudoers ファイルに存在しないことを示すメッセージが表示されます。これは期待通りの結果です。

[sudo] password for testuser:
testuser is not in the sudoers file.  This incident will be reported.

exit と入力して、labex ユーザーセッションに戻ります。

exit

次に、wheel グループのすべてのメンバーに sudo アクセスを許可するように sudoers 設定を編集する必要があります。この設定を編集する最も安全な方法は visudo コマンドを使用することです。このコマンドは、保存前に構文を検証し、設定ミスによってシステムから締め出されるのを防いでくれます。

sudo visudo

これにより、テキストエディタ(通常は vi または nano)で /etc/sudoers ファイルが開きます。%wheel グループに言及している行を探してください。おそらく # 文字でコメントアウトされています。

## %wheel ALL=(ALL) ALL

または

## %wheel ALL=(ALL:ALL) ALL

行頭の # を削除して、この行のコメントを解除する必要があります。結果は以下のようになります。

%wheel ALL=(ALL) ALL

vi エディタを使用している場合は、矢印キーで # まで移動し、x を押して削除してから、:wq と入力して Enter を押し、保存して終了します。nano の場合は、単に # を削除し、Ctrl+XYEnter の順に押します。

wheel グループに権限が与えられたので、testuser をそのグループに追加します。usermod コマンドに -aG オプションを付けて使用します。-a は追加(append)、-G は補助グループの指定を意味します。

sudo usermod -aG wheel testuser

testuserwheel グループのメンバーになったことを確認するには、groups コマンドを使用します。

groups testuser

出力の testuser のグループリストに wheel が表示されているはずです。

testuser : testuser wheel

最後に、新しい権限が機能するかテストしましょう。testuser に戻ります。

su - testuser

もう一度 sudo コマンドを試します。プロンプトが表示されたら password を入力します。

sudo whoami

今回はコマンドが正常に実行され、root と出力されるはずです。これにより、testusersudo 権限を持っていることが確認できました。

[sudo] password for testuser:
root

exit と入力して labex セッションに戻ります。ユーザーを wheel グループに追加することで、sudo アクセス権限の付与に成功しました。

visudo によるカスタム Sudo ルールの作成

このステップでは、広範なグループベースの権限を超えて、きめ細かな sudo ルールを作成する方法を学びます。これは、ユーザーに対して業務遂行に必要な最小限の権限のみを付与する「最小権限の原則(principle of least privilege)」を実装するために不可欠です。sudoers ファイル内でエイリアス(別名)を使用してユーザーのセットとコマンドのセットを定義し、それらをルールで結び付けます。

まず、ルールをテストするための状況を作りましょう。root ユーザーとしてプロセスを開始します。シンプルなプロセスモニターである top コマンドが最適です。sudo を使用してバックグラウンドで実行します。開始前に、他の top プロセスが実行されていないことを確認しましょう。

pgrep top || echo "No top processes running"
sudo top &

バックグラウンドジョブのプロセス ID (PID) が表示されます。プロンプトがすぐに戻らない場合は Enter を押してください。

[1] <PID>

次に、カスタムルールを作成します。testuser に対して、kill および pkill コマンドを使用してプロセスを終了させる特定の権限を付与します。visudo コマンドを使用して sudoers ファイルを編集用に開きます。このファイルを編集する唯一の安全な方法です。

sudo visudo

エディタで /etc/sudoers が開きます。ファイルの末尾に移動し、以下の行を追加してコマンドエイリアスとユーザーエイリアスを定義し、それらを接続するルールを作成します。

## Custom rule for junior administrators
Cmnd_Alias      KILL_CMDS = /usr/bin/kill, /usr/bin/pkill
User_Alias      JUNIOR_ADMINS = testuser

JUNIOR_ADMINS   ALL=(ALL) KILL_CMDS

これらの行の意味を解説します。

  • Cmnd_Alias: コマンドのリストに名前を付けます。ここでは KILL_CMDS としました。コマンドはフルパスで指定する必要があります。
  • User_Alias: ユーザーのリストに名前を付けます。ここでは JUNIOR_ADMINS としました。
  • 最後の行がルール本体です。JUNIOR_ADMINS に含まれるユーザーに対し、すべてのホスト(ALL)で KILL_CMDS に含まれるコマンドを実行する権限を付与します。

行を追加したら、ファイルを保存してエディタを終了します。

この特定のルールを正しくテストするために、まず testuserwheel グループから削除し、前のステップで付与した完全な sudo アクセス権を取り消す必要があります。これにより、テストの妥当性が保証されます。

sudo gpasswd -d testuser wheel

確認メッセージが表示されます。

Removing user testuser from group wheel

では、新しく制限された権限をテストしましょう。testuser アカウントに切り替えます。パスワードは password です。

su - testuser

まず、完全な sudo アクセス権がなくなっていることを確認します。KILL_CMDS エイリアスに含まれていないコマンド(whoami など)を実行してみます。

sudo whoami

この試行は失敗し、testuser がこのコマンドの実行を許可されていないことを示すメッセージが表示されるはずです。

[sudo] password for testuser:
Sorry, user testuser is not allowed to execute '/usr/bin/whoami' as root on <hostname>.

次に、許可されたコマンドの 1 つを試します。pkill を使用して、先ほど開始した top プロセスを停止させます。pkill -u root top を使用して、root として実行されている top プロセスを明示的にターゲットにします。

sudo pkill -u root top

このコマンドはエラーメッセージなしで正常に実行されるはずです。top プロセスが終了したことを確認するために、labex ユーザーに戻ってプロセスをチェックします。

exit

top プロセスがまだ実行されているか確認します。

pgrep -u root top

出力が表示されなければ、testuser によってプロセスが正常に強制終了されたことが確認できます。これで、きめ細かな sudo ルールの作成とテストに成功しました。

まとめ

この実験では、Linux 環境におけるユーザーアカウントとそのセキュリティポリシーを管理するための不可欠な技術を学びました。chage コマンドを使用して、パスワードの最小・最大有効期間や警告期間などのパスワード有効期限ルールを適用する方法を実践しました。また、passwd コマンドを使用してユーザーアカウントをロックおよび解除し、ログインアクセスを制御する方法も学びました。システムのセキュリティを強化するために、SSH デーモンの設定を修正して root の直接ログインを無効にしました。これは、システムの最も特権的なアカウントを保護するための重要なベストプラクティスです。

さらに、sudo を使用して管理者権限を安全に委譲する方法を探索しました。usermod コマンドを使用してユーザーを wheel グループに追加し、完全な sudo アクセスを許可する標準的な手法を学びました。より詳細な制御のために、visudo コマンドを使用して sudoers ファイルを安全に編集し、特定のユーザーが root パスワードを必要とせずに指定されたコマンドのみを実行できるようにするカスタムルールを作成しました。このアプローチにより、ユーザーにタスクの実行に必要な権限のみを与える「最小権限の原則」を実現できます。