Sudoの2FAによるセキュリティ強化:Root権限奪取を防ぐ最後の砦

Security tutorial - IT technology blog
Security tutorial - IT technology blog

なぜsudoパスワードだけでは不十分なのか?

私はかつて、油断が原因でSSHのブルートフォース攻撃への対応に一晩中追われたことがあります。多くの人は、長いパスワードを設定し、SSHのポート番号を変更すれば十分に安全だと信じています。しかし、サーバーにWebシェルの脆弱性があれば, ハッカーは一般ユーザー権限でコマンドを実行できてしまいます。彼らの次なる標的は、常にsudoコマンドを通じた権限昇格(Privilege Escalation)によるRoot権限の奪取です。

セキュリティ企業の報告によると、Linuxへの攻撃の大部分は、脆弱なパスワードや漏洩したパスワードを悪用したものです。SSHで2FAを有効にしていても、アクティブなセッションを奪われる可能性があります。sudoにGoogle Authenticatorを導入することで、物理的な保護レイヤーが生まれます。ハッカーがパスワードを持っていても、あなたのスマートフォンがなければ? 彼らは即座に遮断されます。

PAMとGoogle Authenticatorの仕組み

Linuxでは、ログインやsudoなどの認証アクティビティはすべてPAM (Pluggable Authentication Modules)によって管理されています。PAMを柔軟な「門番」と考えてください。システムのコードを修正することなく、任意のチェックルールを自由に追加・削除できます。

pam_google_authenticatorモジュールを統合すると、このプロセスに条件が追加されます。PAMは「正しいパスワードに加えて、6桁のトークンコードも提示してください」と要求するようになります。どちらか一方が欠けていれば、Root権限への扉は固く閉ざされたままです。

詳細な導入手順

ステップ1:ライブラリパッケージのインストール

まず、必要なPAMモジュールをインストールします。UbuntuまたはDebianの場合は、以下のコマンドを使用します:

sudo apt update
sudo apt install libpam-google-authenticator -y

CentOSまたはRHELを使用している場合は、インストール前にEPELリポジトリを有効にしてください:

sudo yum install epel-release -y
sudo yum install google-authenticator -y

ステップ2:ユーザーの2FAコード初期化

このコマンドは必ず一般ユーザーとして実行してください。絶対にroot権限で直接実行しないでください。

google-authenticator

システムからいくつか質問が表示されます。最高のセキュリティを確保するために、以下の設定を推奨します:

  • Time-based tokens (y/n): 30秒ごとにOTPが変更されるよう、yを選択します。
  • 表示されたQRコードをスマートフォンのGoogle AuthenticatorまたはAuthyアプリでスキャンします。
  • Update your “/home/user/.google_authenticator” file? 設定を保存するためにyを選択します。
  • Disallow multiple uses of the same token? リプレイ攻撃を防ぐためにyを選択します。
  • Rate-limiting? 連続したOTPの推測試行をブロックするためにyを選択します。

注意: 5つのemergency scratch codes(緊急用スクラッチコード)を必ずメモしておいてください。スマートフォンが故障したり紛失したりした場合、これがアクセス権を回復する唯一の方法となります。

ステップ3:Sudoコマンド用のPAM設定

これは極めて重要なステップです。小さなミスでsudo権限を永久に失う可能性があるため、慎重に行ってください。

sudo nano /etc/pam.d/sudo

ファイルの先頭に以下の行を追加します:

auth required pam_google_authenticator.so

requiredキーワードにより、ユーザーは正しいOTPを入力しなければ先に進めなくなります。段階的に導入したい場合は、行の末尾にnullokを付けることもできます。このオプションを使用すると、2FAをまだ設定していないユーザーも一時的にsudoを使用できます。

完成したファイルは以下のようになります:

#%PAM-1.0
auth required pam_google_authenticator.so
@include common-auth
@include common-account
@include common-session-noninteractive

ステップ4:動作確認(元のターミナルは閉じないでください!)

現在のウィンドウをすぐに閉じないでください。新しいターミナルを開き、以下を入力してみてください:

sudo su -

この時、システムからVerification code(認証コード)が要求されます。スマートフォンのアプリに表示されている6桁の数字を入力してください。Root権限に入ることができれば、システムの保護は完了です。

トラブルを避けるためのヒント

セキュリティ設定を行う際、時にはトラブルが発生することもあります。以下の点に注意してください:

  1. 時刻同期: OTPはリアルタイムの時刻に基づいています。サーバーの時計が30秒以上ずれていると、コードが正しく認識されません。chronyなどをインストールして、サーバーの時刻を常に正確に保ってください。
  2. 認証の順序: パスワードを先に入力し、その後にOTPを入力したい場合は、auth requiredの行を@include common-authの行の下に移動してください。
  3. スマートフォンの紛失: スマートフォンとバックアップコードの両方を紛失した場合は、VPSのコントロールパネル(コンソール)を使用して、PAMファイルの設定行を削除する必要があります。

まとめ

sudoに2FAを設定することは、最も実用的な多層防御(Defense in Depth)戦略の一つです。設定にはわずか10分しかかかりませんが、これにより枕を高くして眠れるようになります。不審なログを見つけてから慌てるのではなく、今日からサーバーを保護しましょう。

Share: