なぜ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権限に入ることができれば、システムの保護は完了です。
トラブルを避けるためのヒント
セキュリティ設定を行う際、時にはトラブルが発生することもあります。以下の点に注意してください:
- 時刻同期: OTPはリアルタイムの時刻に基づいています。サーバーの時計が30秒以上ずれていると、コードが正しく認識されません。
chronyなどをインストールして、サーバーの時刻を常に正確に保ってください。 - 認証の順序: パスワードを先に入力し、その後にOTPを入力したい場合は、
auth requiredの行を@include common-authの行の下に移動してください。 - スマートフォンの紛失: スマートフォンとバックアップコードの両方を紛失した場合は、VPSのコントロールパネル(コンソール)を使用して、PAMファイルの設定行を削除する必要があります。
まとめ
sudoに2FAを設定することは、最も実用的な多層防御(Defense in Depth)戦略の一つです。設定にはわずか10分しかかかりませんが、これにより枕を高くして眠れるようになります。不審なログを見つけてから慌てるのではなく、今日からサーバーを保護しましょう。

