こんにちは!日々、見えないサイバー空間の「鍵師」として、システムの裏側を守っているセキュリティエンジニアです。
皆さんは、自分の家の鍵を最後に作り直したのはいつか覚えていますか?「えっ、家を建ててから一度も変えていないよ」という方がほとんどかもしれませんね。でも、もしその鍵が「誰でもコピー可能な魔法の鍵」で、しかも「うっかり道端に落としてしまったかもしれない」としたら……。夜も眠れないほど不安になりますよね。
実は、クラウドの世界(AWSなど)で使う「IAMユーザーのアクセスキー」は、まさにその「魔法の鍵」なんです。今日は、新人エンジニアの方やセキュリティに初めて触れる方向けに、この「鍵」をどう守り、どうやって自動で交換していくべきか、泥棒の心理を交えながら優しく紐解いていこうと思います。
—
1. なぜ「鍵」には種類があるの?(共通鍵と公開鍵)
まず、技術の土台となる「暗号の仕組み」を、身の回りのものに例えてお話しします。
共通鍵暗号(例:AES)
これは、「一つの鍵で、閉めることも開けることもできる」仕組みです。
- 例: 昔ながらの南京錠や、家の玄関の鍵。
- 特徴: 処理がとても速いのが自慢です。
- 弱点: 鍵を相手に渡すときに盗まれたら、もうおしまいです。
公開鍵暗号(例:RSA、楕円曲線暗号 ECC)
これは、「閉める専用の鍵(公開鍵)」と「開ける専用の鍵(秘密鍵)」がペアになっている仕組みです。
- 例: 郵便ポスト。誰でも手紙を入れる(ロックする)ことはできますが、中身を取り出す(開錠する)には、受取人だけが持っている専用の鍵が必要です。
- 特徴: 鍵を渡すリスクが低く、非常に安全です。
- 弱点: 仕組みが複雑なので、処理に少し時間がかかります。
私たちが今回扱うAWSのアクセスキーは、いわば「共通鍵」のような性質を持っています。これ一つあれば、あなたのクラウド上の資産(サーバーやデータ)を自由に操作できてしまいます。だからこそ、「漏洩させない」のはもちろん、「もし漏洩しても被害を最小限にする」工夫が必要なのです。
—
2. 泥棒(攻撃者)はどうやってあなたの「鍵」を狙うのか
泥棒は、あなたの家の前でじっと待っているわけではありません。彼らは「全自動の鍵探しロボット」をインターネット中に放っています。
1. うっかりミスを待つ: 開発者がプログラムの中にアクセスキーを書き込んだまま、GitHubなどの公開サイトにアップロードするのを、ロボットは秒単位で監視しています。
2. 鍵を拾う: ロボットが鍵を見つけた瞬間、泥棒に通知が行きます。
3. 勝手に入る: 泥棒は数分以内にその鍵を使い、高額なサーバーを勝手に立ち上げて仮想通貨のマイニングを始めたり、顧客データを盗み出したりします。
「自分は大丈夫」と思っていても、人間は必ずミスをします。そこで重要になるのが、「鍵の有効期限(ローテーション)」という考え方です。
—
3. 「鍵のローテーション」は、ホテルのカードキーと同じ!
ホテルのカードキーって、チェックアウトの時間を過ぎると使えなくなりますよね? あれと同じことを、私たちが使うアクセスキーでも行いましょう。
もし鍵が盗まれても、「その鍵はもうすぐ期限切れで使えなくなる」という状態になっていれば、泥棒が活動できる時間はごくわずかになります。
対策のゴール
- 90日経過した鍵: 「そろそろ交換してくださいね」と通知する。
- 100日経過した鍵: 「危ないので強制的に使えなく(無効化)」する。
これを手動でやるのは大変なので、スクリプト(自動プログラム)に任せてしまいましょう!
—
4. 実践!アクセスキー自動無効化スクリプト
今回は、Pythonというプログラミング言語を使って、「古くなった鍵を見つけ出して無効化する」簡単なプログラムの例をご紹介します。
import boto3
from datetime import datetime, timezone
# 期限の設定(例:90日で警告、100日で無効化)
EXPIRATION_DAYS = 100
def lambda_handler(event, context):
# AWSのIAMサービスに接続するための準備
iam = boto3.client('iam')
# 全てのIAMユーザーを取得
users = iam.list_users()['Users']
now = datetime.now(timezone.utc)
for user in users:
user_name = user['UserName']
# ユーザーごとのアクセスキー一覧を取得
access_keys = iam.list_access_keys(UserName=user_name)['AccessKeyMetadata']
for key in access_keys:
key_id = key['AccessKeyId']
create_date = key['CreateDate']
status = key['Status']
# 鍵が作られてからの日数を計算
age = (now - create_date).days
# すでに無効なものはスキップ
if status == 'Inactive':
continue
print(f"ユーザー: {user_name} の鍵 ({key_id}) は作成から {age} 日経過しています。")
# 期限を過ぎているかチェック
if age > EXPIRATION_DAYS:
print(f"--- [警告] {age}日経過しているため、鍵 {key_id} を無効化します ---")
# 実際に鍵を「無効(Inactive)」にする処理
# ※本番環境で動かす際は、事前に通知を送る仕組みを組み合わせるのがベストです
iam.update_access_key(
UserName=user_name,
AccessKeyId=key_id,
Status='Inactive'
)
return {
'statusCode': 200,
'body': 'チェック完了!古い鍵の掃除が終わりました。'
}
このスクリプトのポイント
1. list_access_keys で、誰がどんな鍵を持っているかを確認します。
2. create_date を見て、その鍵が「いつ生まれたか」を計算します。
3. update_access_key で、古くなった鍵に「今日でもうお役御免です」と印(Inactive)をつけます。
このように、「人間が忘れても、システムが勝手に守ってくれる」状態を作ることが、セキュリティの第一歩になります。
—
5. 最後に:一歩ずつ対策を学んでいきましょう!
「暗号」や「自動化」と聞くと、なんだか難しそうに感じてしまいますよね。でも、その本質は「大事なものを守るために、面倒なことを機械に任せる」という、とても人間味のある知恵なんです。
今回紹介したローテーション以外にも、例えば「そもそもアクセスキーを使わずに済む方法(IAMロールなど)」など、さらに安全な道はたくさんあります。
まずは、「鍵には期限があるんだな」「放置するのは危ないんだな」という感覚を持つだけで、あなたのセキュリティ意識は格段にレベルアップしています。焦らず、一歩ずつ、一緒に安全なシステムを作っていきましょう!
もし分からないことがあれば、いつでも「鍵師」に相談してくださいね。それでは、また次回の記事でお会いしましょう!
コメント