「常時フル権限」は死へのパスポート:JITアクセスでインフラの脆弱性を封じ込めろ
現場でインフラを触っていると、「運用が面倒だから」「トラブル時にすぐ入れるように」という理由で、サーバーの root 権限やクラウドの Administrator 権限を、開発メンバー全員に常時付与しているケースによく出くわす。
はっきり言おう。その設定は、攻撃者にとっての「ゴール」を最初から用意しているのと同じだ。
万が一、開発者のPCがマルウェアに感染したり、SSH鍵が漏洩したりした瞬間、その権限は攻撃者の手に渡る。一度侵入した攻撃者は、その常時付与された権限を悪用し、横展開(Lateral Movement)を行い、バックアップを破壊し、データを暗号化する。これがランサムウェアの定石だ。
今回は、この「常時権限」という甘美な毒を捨て、必要な時だけ鍵を開ける「Just-In-Time (JIT) アクセス」による要塞化の極意を伝授する。
—
1. 攻撃者が狙う「常時特権」という盲点
攻撃者が侵入した際、最初に行うのは whoami や sudo -l だ。ここで「自分には無制限の権限がある」と分かった瞬間、彼らは攻撃のアクセルを全開にする。
逆に、JITアクセスが徹底されている環境では、侵入したところで「一般ユーザー」としての権限しかなく、昇格しようとすれば「管理者の承認」という高い壁に阻まれる。この「承認プロセス」が、攻撃者が最も嫌う「時間稼ぎ」と「異常検知」のトリガーになるのだ。
2. 実践:AWS IAMを用いたJIT昇格の仕組み
クラウドインフラにおいて、JITを実現する最も手堅い方法は、「普段は権限のないロールで動かし、必要な時だけ一時的な権限を付与(AssumeRole)する」ことだ。
AWSであれば、AWS IAM Identity Center (旧SSO) と連携し、開発者には「昇格申請フロー」を通さない限り、本番環境への書き込み権限を与えない設計にする。以下は、昇格をリクエストする際のPythonスクリプトの概念例だ。
PythonによるJIT昇格リクエストのイメージ(Boto3利用)
import boto3
from datetime import datetime
def assume_jit_role(role_arn, session_name):
"""
一時的な権限昇格をリクエストする関数
※実際にはこの前にSlack等での承認プロセスが必要
"""
sts_client = boto3.client('sts')
# 1時間の有効期限で一時的なクレデンシャルを取得
assumed_role = sts_client.assume_role(
RoleArn=role_arn,
RoleSessionName=session_name,
DurationSeconds=3600 # 最大でも1時間で切れるように設定
)
return assumed_role['Credentials']
# 実際に利用する際は、取得したクレデンシャルを環境変数にセットする
# os.environ['AWS_ACCESS_KEY_ID'] = creds['AccessKeyId']
3. なぜ「1時間」なのか?
JITの肝は 「有効期限」 にある。
もし攻撃者が不正にアクセス権を取得できたとしても、その権限が「1時間後には無効になる」と分かっていれば、彼らの心理的・技術的ハードルは跳ね上がる。さらに、この assume_role の履歴は CloudTrail に全て残る。
「誰が」「いつ」「何の目的で」昇格したのか。これをログ監視ツール(DatadogやCloudWatch Logs)で監視し、「昇格リクエストが発生した瞬間にSlackへ通知を飛ばす」設定をしておくだけで、インシデントの検知速度は劇的に向上する。
4. サーバーOS(Linux)におけるJIT的アプローチ:Google Authenticatorの活用
クラウド外、つまりオンプレミスやEC2上のLinuxサーバーでもJITの思想は適用できる。SSHの鍵認証に加え、pam_google_authenticator を用いたMFA(多要素認証)を強制することだ。
/etc/pam.d/sshd に以下の設定を追加し、ログインのたびに物理的なMFAデバイス(スマホ)を要求させる。
# /etc/pam.d/sshd の末尾に追記
# ログイン成功には、鍵認証だけでなくMFAコードも必須とする
auth required pam_google_authenticator.so
これにより、「秘密鍵を盗まれた」という単一障害点(Single Point of Failure)を排除できる。鍵があっても、手元のスマホがなければログインできない。これも一種の「アクセス時の検証によるJIT」と言える。
最後に:セキュリティは「性悪説」で設計せよ
エンジニア諸君、セキュリティは「利便性」と「堅牢性」の綱引きだ。しかし、システムが破壊されてからでは、いくらコードを磨いていても意味がない。
1. 最小権限の原則: 必要な時に、必要な分だけ権限を与える。
2. トレーサビリティ: 誰が何をしたか、後から確実に追えるようにする。
3. 時間制限: 権限は常に「期限付き」であるべき。
今日から、自身の開発環境や運用フローを見直してほしい。「自分は管理者だから大丈夫」という思い込みこそが、最も危険な脆弱性だ。まずは、最も権限の強いアカウントから、多要素認証と最小権限の棚卸しを始めてみてくれ。
現場からは以上だ。何か詰まったら、また相談に来るといい。
コメント