こんにちは!日々のインフラ管理や開発、本当にお疲れ様です。
突然ですが、皆さんはご自宅の玄関の鍵をしっかり閉めてお出かけしていますよね。「ちょっとコンビニに行くだけだから」「うちの地域は安全だから」といって、鍵を開けっぱなしにすることはないはずです。もし鍵を開けっぱなしにしていたら、空き巣に入られて大切なプライベートな写真や通帳を全部持っていかれてしまうかもしれません。
実は、これと同じことがクラウドの世界でも起きています。AWSの「Amazon S3」という、インターネット上にデータを保存できる非常に便利な金庫(ストレージ)があるのですが、ここに保管するファイルの「鍵(アクセス設定)」をうっかり「誰でも自由に見られますよ」という状態(パブリックアクセス)に変えてしまうミスが、現場では後を絶ちません。
今回は、この「うっかり公開」を自動で嗅ぎつけて、一瞬で元に戻す(さらに私たちのスマホに「おい!大変だぞ!」と知らせてくれる)防犯カメラシステムの作り方を、初心者の方にも分かりやすく一歩ずつ紐解いていきたいと思います。一緒に安全なクラウドの仕組みを作っていきましょう!
—
1. なぜ「うっかり公開」が起きてしまうのか?
開発の現場では、日々新しい機能を作ったり、テストをしたりで大忙しです。そんな中、次のようなシチュエーションで事故が起きます。
- 「テストだから、とりあえず誰でも見られるようにしておこう」 と、一時的にバケット(S3の入れ物)の鍵を全開にした。
- その後、テストが終わったのに 鍵を閉め忘れたまま 本番データをいれてしまった。
- 新しくチームに参加したメンバーが、仕組みをよく知らずに設定を変更してしまった。
攻撃者(泥棒)たちは、世界中のクラウド上にある「鍵の開いた金庫」を、専用の自動ツールを使って常に探し回っています。鍵が開いていると分かると、わずか数秒のうちに顧客の個人情報や社外秘のソースコードを根こそぎ盗み出していきます。
「人間のチェック」だけに頼っていると、いつか必ず見落としがおきます。だからこそ、「変な変更があったら、システムが自動で検知して秒速で元に戻す」 という自動の警備システムが絶対に必要になるんです。
—
2. 防犯システムの全体像を理解しよう
今回作るシステムは、身の回りの防犯装置とまったく同じ仕組みです。
1. 防犯センサー(AWS CloudTrail & EventBridge)
- 金庫の鍵(バケットポリシー)がガチャリと動かされた瞬間を、AWSの監視カメラがパッと捉えます。
2. 自動通報・警備員(AWS Lambda)
- 「おい!今、勝手に鍵が開けられたぞ!」とセンサーから連絡を受けたロボット(プログラム)が即座に駆けつけます。
3. 自動施錠&アラート(自動修復コード)
- ロボットが、勝手に開けられた鍵を強制的に「非公開(プライベート)」にガチャリと閉め直します。同時に、Slackやメールで私たちに「今、危ないところを直しました!」と報告してくれます。
これらを連携させることで、人間が気づくよりもはるかに速く、不正な公開を防ぐことができるようになります。
—
3. 実装してみよう!自動修復プログラムの作り方
それでは、実際に動く「自動修復ロボット(AWS Lambdaのプログラム)」を作ってみましょう。今回は、プログラミング言語にPythonを使用します。
ステップ1:Lambda関数のコードを書く
AWSのLambdaサービス上で動かすPythonコードのサンプルです。S3の公開設定が変更されたというイベントを受け取ると、自動的にパブリックアクセスをブロックする設定へと上書きします。
import json
import boto3
# boto3というAWS操作用の専用ライブラリを読み込みます
s3_client = boto3.client('s3')
def lambda_handler(event, context):
"""
S3のバケットポリシー変更イベントを検知して実行されるメイン関数です。
"""
print("=== S3のセキュリティチェックを開始します ===")
try:
# 1. どのバケット(金庫)の設定が変更されたのかをイベント情報から特定します
detail = event.get('detail', {})
request_parameters = detail.get('requestParameters', {})
bucket_name = request_parameters.get('bucketName')
if not bucket_name:
print("対象のバケット名が見つかりませんでした。処理を終了します。")
return {'statusCode': 400, 'body': 'Bucket name not found'}
print(f"検知対象のバケット: {bucket_name}")
# 2. 自動セキュリティ対策:パブリックアクセスを強制的にブロックする設定を適用します
# これにより、外部からの不正なアクセスを完全に遮断します
s3_client.put_public_access_block(
Bucket=bucket_name,
PublicAccessBlockConfiguration={
'BlockPublicAcls': True, # 従来のアクセスリストによる公開をブロック
'IgnorePublicAcls': True, # 公開設定のアクセスリストを無視
'BlockPublicPolicy': True, # 新たなパブリックポリシーの適用をブロック
'RestrictPublicBuckets': True # 既存の公開バケットへのアクセスを制限
}
)
print(f"【成功】バケット [{bucket_name}] のパブリックアクセスを強制ブロックしました!")
# ここにSlackやメールへ通知を送る処理(SNSなど)を組み合わせるとさらに完璧です!
return {
'statusCode': 200,
'body': json.dumps(f'Successfully secured bucket: {bucket_name}')
}
except Exception as e:
print(f"【エラー】処理中に問題が発生しました: {str(e)}")
raise e
ステップ2:イベントルールの設定(防犯センサーの接続)
プログラムだけを用意しても、センサーと繋がっていなければ意味がありませんよね。AWSの Amazon EventBridge というサービスを使い、次のようなルールを設定します。
- イベントパターン(監視する条件):
{
"source": ["aws.s3"],
"detail-type": ["AWS API Call via CloudTrail"],
"detail": {
"eventSource": ["s3.amazonaws.com"],
"eventName": [
"PutBucketPolicy",
"PutBucketAcl",
"PutPublicAccessBlock"
]
}
}
- ターゲット: 先ほど作成したPythonのLambda関数を指定します。
この設定をしておくだけで、誰かがS3の鍵穴に触れた瞬間にLambdaが叩かれ、泥棒が入ってくる隙も与えずに自動で鍵を閉め直してくれる要塞が完成します。
—
4. 現場のプロからのアドバイス
「これで完璧!」と言いたいところですが、実際の現場ではもう少しだけ気をつけておかなければいけないポイントがあります。
1. 社内の正当なシステム開発を邪魔しないこと
- たまに、社内の正当なWebサイト公開システムなどが意図してS3を公開しようとすることがあります。その場合、この自動修復プログラムがすべてを強制ブロックしてしまうため、「社内システムが動かなくなった!」という大クレームに発展することがあります。
- 対策として、特定の安全なユーザー(デプロイ用の専用アカウント等)からの変更は除外するなどの「例外処理」をコードに組み込んでおくと、現場のエンジニアたちから嫌われません(笑)。
2. 監査ログを必ず残すこと
- 「誰が、いつ、どんな意図でその変更を試みたのか」の履歴は、必ずCloudTrailなどのログとして残しておきましょう。後から「うっかりミス」なのか「悪意ある内部不正」なのかを調査する際の重要な手がかりになります。
—
おわりに
セキュリティの対策と聞くと、なんだか難しそうな呪文のような設定や、高価な専用ソフトが必要なイメージがあるかもしれません。しかし、クラウドの仕組みを正しく理解し、ちょっとした「自動化の仕組み」を取り入れるだけで、誰でも堅牢な防犯システムを作り上げることができます。
「一歩ずつ対策を学んでいきましょう!」と最初にお伝えした通り、まずは身近な一つのバケットから、こうした監視の目を光らせてみてください。皆さんのクラウド環境が、今日も安全で快適である事を心から応援しています!
コメント