責任共有とログ|クラウドの基本・IAM・責任

このページはプロモーション(広告)を含みます。

クラウドの基本・IAM・責任(中級・読む35分+演習40分)

この授業のゴール

仕事でどう使うか

「クラウドの提供者が守ってくれるはず」という思い込みは、情報漏洩の典型的な原因です。提供者と利用者は守る範囲を分担しており、その境界を知らないと、誰も守っていない場所が生まれます。そして事故が起きたときに「誰が・いつ・何をしたか」を答えられるかは、ログを残していたかどうかで決まります。

路線 この授業の使いどころ
DS 分析用の保存場所が公開になっていないかを点検し、共有はリンクの公開ではなく権限で行う
ML 学習データの読み取りや、モデルの置き換えを誰がしたかを監査ログで追えるようにする
DX 委託先との契約や運用手順書に、提供者・委託先・自社の責任分担表を付ける
RS 研究データへのアクセス記録を残し、倫理審査や共同研究契約で求められる管理を説明する

この授業の責任分担は一般的なモデルで、実際の境界はサービスや契約ごとに異なり、変わり得ます。導入時には提供者の公式の説明と契約書で確認してください。ログの形式は教材用の簡略版で、分析はPythonによる模擬です。

前提

次の内容を使います。

Pythonでは、辞書のリスト、for 文、datetime モジュールを使います。

身近な状況:解答ファイルが検索で見つかった

あおば学習で、ある受講者から「テストの解答ファイルが検索エンジンで見つかる」と連絡がありました。調べると、解答を置いていた保存場所 edu-answers が「誰でも読める」公開設定になっていました。

関係者の最初の反応はばらばらでした。

答えは次のとおりです。

  1. 提供者の基盤には問題がなかった。保存場所の公開設定は利用者が行う設定で、利用者の責任範囲。
  2. 教材サイトは意図して公開するもの、解答は公開してはいけないもの。同じ「公開」でも、データの区分で判断が変わる。
  3. 監査ログが有効なら、「3月3日 2時40分(日本時間)、user/aoki が公開設定に変更し、その25分後に記録を停止した」と特定できる。

この授業では、責任の境界を表にし、監査ログから危険な操作を見つける方法を学びます。

直感的な説明:貸し倉庫の管理会社と借り主

貸し倉庫にたとえます。

借りる範囲が広がるほど(区画だけ→家具付き→何でも込み)、管理会社の担当は増えますが、「鍵を誰に渡すか」と「何を置くか」は最後まで借り主の担当です。これが責任共有モデルの中心です。

ログは防犯カメラと入退室記録です。事故を防ぐ装置ではありませんが、「誰が・いつ・何をしたか」を後から確かめ、同じ事故を防ぐ手がかりになります。カメラの電源を切った記録そのものが、重要な手がかりになることもあります。

たとえ話の限界:実際のクラウドでは、「区画の扉」に当たる設定がたくさんあり(公開設定、受信ルール、IAM、暗号の設定など)、どれか1つの誤りで露出します。また、ログは自動では全部残らず、何を記録するかを利用者が選ぶものがあります。

正確な定義:責任共有モデルとログの種類

項目 IaaS PaaS SaaS
施設・物理機器・仮想化基盤 提供者 提供者 提供者
OS・パッチ 利用者 提供者 提供者
実行環境・ミドルウェア 利用者 分担(版の選択・設定は利用者) 提供者
アプリケーションのコード 利用者 利用者 提供者
ネットワークの受信ルール 利用者 分担 提供者(利用者は接続元の制限などを設定)
公開設定・共有範囲 利用者 利用者 利用者
アカウント・権限(IAM) 利用者 利用者 利用者
データの分類・暗号の設定・バックアップの方針 利用者 利用者 利用者
ログの有効化・保存期間・確認 利用者 利用者 利用者(提供される範囲で)
種類 記録するもの 例
監査ログ(管理操作のログ) 設定・権限の変更など、資源の管理操作 公開設定の変更、ポリシーの付与、ログの停止
データアクセスログ データの読み書き どのファイルを誰が読んだか(量が多く、追加の設定や費用が必要なことが多い)
ネットワークのログ 通信の送信元・宛先・許可/拒否 外部からDBのポートへの接続試行
アプリケーションログ 自分のアプリの処理 エラー、処理時間、利用者の操作(個人情報に注意)

段階付き例題:監査ログから危険な操作を見つける

問題:次の5件の監査ログ(教材用の簡略形式)から、(1) 成功した危険な操作、(2) 拒否された権限変更の試み を見つけ、日本時間で報告する。

ステップ1:危険な操作を定義する。ここでは storage:PutBucketPolicy(公開設定の変更)、iam:AttachPolicy(権限の付与)、logging:StopLogging(記録の停止)を「重要な操作」とします。

ステップ2:UTCを日本時間に直す。datetime.fromisoformat() は 2026-03-02T17:40:00Z のような文字列を時刻のオブジェクト(datetime型)に変換します(末尾の Z はUTCの意味)。.astimezone(JST) で日本時間に変換します。

ステップ3:条件で絞る。

from datetime import datetime, timezone, timedelta
JST = timezone(timedelta(hours=9))
events = [
  {"id": "e1", "time": "2026-03-02T01:10:00Z", "principal": "user/aoki",      "action": "storage:PutObject",       "resource": "bucket/edu-site/l1.html", "result": "success"},
  {"id": "e2", "time": "2026-03-02T17:40:00Z", "principal": "user/aoki",      "action": "storage:PutBucketPolicy", "resource": "bucket/edu-answers",      "result": "success", "detail": {"public_read": True}},
  {"id": "e3", "time": "2026-03-02T17:42:00Z", "principal": "svc/web-app",    "action": "storage:GetObject",       "resource": "bucket/edu-site/l1.html", "result": "success"},
  {"id": "e4", "time": "2026-03-02T17:50:00Z", "principal": "user/unknown01", "action": "iam:AttachPolicy",        "resource": "role/admin",              "result": "denied"},
  {"id": "e5", "time": "2026-03-02T18:05:00Z", "principal": "user/aoki",      "action": "logging:StopLogging",     "resource": "trail/main",              "result": "success"},
]

SENSITIVE = {"storage:PutBucketPolicy", "iam:AttachPolicy", "logging:StopLogging"}

def jst(t):
    return datetime.fromisoformat(t).astimezone(JST).strftime("%m/%d %H:%M")

for e in events:
    if e["action"] in SENSITIVE:
        mark = "要確認(成功)" if e["result"] == "success" else "試行(拒否)"
        print(jst(e["time"]), e["principal"], e["action"], e["resource"], mark, e.get("detail", ""))

出力:

03/03 02:40 user/aoki storage:PutBucketPolicy bucket/edu-answers 要確認(成功) {'public_read': True}
03/03 02:50 user/unknown01 iam:AttachPolicy role/admin 試行(拒否)
03/03 03:05 user/aoki logging:StopLogging trail/main 要確認(成功)

ステップ4:意味を読む。

日本時間 何が起きたか 対応
03/03 02:40 user/aoki が解答の保存場所を公開に変更(成功) すぐ非公開に戻し、公開中の読み取り記録を確認
03/03 02:50 不明な主体が管理者ロールへの権限付与を試行(拒否) 最小権限が効いて防げた。主体の正体と認証情報の漏洩を調査
03/03 03:05 user/aoki が記録を停止(成功) 記録を再開。停止の権限を持つ人を限定する

深夜2時台の公開設定の変更と、直後の記録停止は、本人の誤操作だけでなく認証情報の盗用も疑うべき組合せです。UTCのまま「17時40分」と読むと夕方の通常作業に見えてしまう点にも注意してください。

操作して理解する:公開設定の点検表を作る

保存場所の一覧から、公開の妥当性を点検します。data_class(データ区分)が public(公開してよい情報)以外のものが公開されていたら事故、public でも理由の記録がなければ要修正、と判定します。

buckets = [
    {"name": "edu-site",    "public_read": True,  "data_class": "public",       "reason": "教材サイトの配信(承認: 管理者 2026-01)"},
    {"name": "edu-answers", "public_read": True,  "data_class": "confidential", "reason": None},
    {"name": "edu-logs",    "public_read": False, "data_class": "internal",     "reason": None},
    {"name": "edu-banner",  "public_read": True,  "data_class": "public",       "reason": None},
]
for b in buckets:
    if not b["public_read"]:
        verdict = "OK(非公開)"
    elif b["data_class"] != "public":
        verdict = "事故:公開してはいけない区分"
    elif not b["reason"]:
        verdict = "要修正:公開の理由・承認の記録なし"
    else:
        verdict = "OK(意図した公開)"
    print(f"{b['name']:<12} {verdict}")

出力:

edu-site     OK(意図した公開)
edu-answers  事故:公開してはいけない区分
edu-logs     OK(非公開)
edu-banner   要修正:公開の理由・承認の記録なし

試してみましょう。

発展:ログの保護・保存期間・検知の設計

よくある失敗

失敗1:「クラウドだから提供者が守る」と公開設定を確認しない

誤った判断:PaaSのデータ分析サービスにCSVを置き、「マネージドサービスだから安全」として共有設定を確認しなかった。実際は「リンクを知っている人は誰でも閲覧可」になっていた。

なぜ誤りか:責任共有モデルの表で、公開設定・共有範囲はIaaS・PaaS・SaaSすべてで利用者の責任です。マネージドサービスが肩代わりするのは、OSや基盤ソフトウェアの更新などです。

直し方:新しいサービスを使い始めるときに、責任分担表の「利用者」の行(公開設定、権限、データの分類、ログ)を1つずつ確認するチェックリストを作る。共有は「誰でも」ではなく、特定の主体への権限で行う。

失敗2:UTCのログを日本時間と思って読む

誤った読み方:監査ログの 2026-03-02T17:40:00Z を見て「3月2日の夕方、業務時間内の作業」と判断し、調査対象から外した。

from datetime import datetime, timezone, timedelta
t = datetime.fromisoformat("2026-03-02T17:40:00Z")
print("UTC:", t.strftime("%Y-%m-%d %H:%M"))
print("JST:", t.astimezone(timezone(timedelta(hours=9))).strftime("%Y-%m-%d %H:%M"))

出力:UTC: 2026-03-02 17:40、JST: 2026-03-03 02:40。

なぜ誤りか:末尾の Z はUTCを表します。日本時間では翌日の深夜2時40分で、通常の業務時間外です。日付まで変わるため、日別の集計もずれます。

直し方:ログを読む・集計する前に、時刻のタイムゾーンを確認し、報告書ではタイムゾーンを明記する(「JST」「UTC」)。集計の日付の区切りをどちらで行うかも決めておく。

失敗3:調査のためにログへ秘密情報や個人情報を書く

誤った実装:認証エラーの原因を調べるため、アプリのログにリクエスト全体を出力した。

# 誤り:パスワードやトークン、メールアドレスがログに残る
log.info(f"login failed: {request_body}")
# request_body = {"email": "user@example.com", "password": "…", "token": "…"}

なぜ誤りか:ログは多くの人が読め、長く保存され、別のシステムに転送されます。秘密情報が残れば、ログを読めるすべての人が認証情報を得られます。個人情報は、必要以上に複製されることになります。

直し方:ログに書く項目を決めておく(例:時刻、要求ID、仮名化した利用者ID、結果、エラーの種類)。パスワード・トークンは絶対に書かず、出力前に伏せ字にする処理(「鍵と秘密情報」(有料版))を通す。誤って書いてしまった場合は、秘密情報を失効・再発行し、ログの扱いを漏洩時の手順(「漏洩時の対応」(有料版))に沿って判断する。

まとめ

用語

責任共有モデル(shared responsibility model)

クラウドの安全と運用の責任を、提供者(クラウドそのもの)と利用者(クラウドに置くもの)で分担する考え方。

公開設定(public access setting)

保存場所やファイルを、認証なしで誰でも読める状態にするかどうかの設定。

監査ログ(audit log)

設定変更や権限付与など、資源の管理操作を記録したログ。

データアクセスログ(data access log)

データの読み書きを、誰がいつ行ったか記録したログ。

UTC(協定世界時)(Coordinated Universal Time)

世界共通の基準時刻。日本時間はUTC+9時間。

よくある質問

なぜ責任の境界を表にする必要があるのですか?

「誰かがやっているはず」の項目が生まれるのを防ぐためです。提供者・委託先・自社の情報システム部門・分析チームのように関係者が増えるほど、OSの更新、ログの確認、権限の棚卸しなどが抜けやすくなります。表にして担当者名まで書くと、抜けが見えるようになります。

監査ログとアプリケーションログの違いは何ですか?

監査ログはクラウドの資源に対する管理操作(設定変更・権限付与など)を提供者の仕組みが記録するもの、アプリケーションログは自分のアプリが自分で書く処理の記録です。事故調査では両方を時刻で突き合わせます。

ログの確認でどこを間違えやすいですか?

タイムゾーン(UTCと日本時間)の取り違え、拒否された操作を無視すること、サービスの主体(svc/)の操作を見落とすこと、記録の停止そのものを見逃すことです。読む前に「時刻の基準」「主体の種類」「結果の値」を確認します。

マネージドサービスに切り替えたら、確認すべき項目は減りますか?

OSの更新など一部は提供者に移りますが、公開設定・権限・データの分類・ログの有効化は残ります。新しいサービスは既定の設定が自分の要求と合っているか(公開範囲、記録の範囲)を必ず確認します。

仕事で公開設定の事故を見つけたら、まず何をしますか?

(1) 非公開に戻して拡大を止める、(2) 公開されていた期間と、その間の読み取り記録を確認する、(3) 公開した操作の主体と経緯を監査ログで特定する、(4) 漏洩時の手順(「漏洩時の対応」(有料版))に沿って報告・判断する、の順です。証拠となるログは消さずに保全します。

確認問題

問1 IaaSの仮想サーバーでOSの既知の脆弱性が放置され、侵入された。責任共有モデルで一般にこの対応を担うのは誰か。

  1. ① 提供者
  2. ② 利用者
  3. ③ OSの開発元だけ
  4. ④ 誰の責任でもない
解答と解説

正解:②

IaaSではOSより上は利用者の管理範囲で、パッチの適用も利用者の責任です。

問2 SaaSのファイル共有サービスで、顧客リストが「リンクを知っている全員が閲覧可」になっていた。責任の所在として最も適切なのはどれか。

  1. ① SaaSなので提供者の責任
  2. ② 共有範囲の設定は利用者の責任
  3. ③ リンクを知っていた人の責任だけ
  4. ④ サービスモデルによらず提供者と利用者が半分ずつ
解答と解説

正解:②

公開設定・共有範囲・アカウントと権限は、SaaSでも利用者の責任です。

問3 監査ログに 2026-07-01T16:30:00Z とある。日本時間ではいつか。

  1. ① 7月1日 16:30
  2. ② 7月1日 7:30
  3. ③ 7月2日 1:30
  4. ④ 7月2日 16:30
解答と解説

正解:③

Z はUTC。日本時間はUTCに9時間を足すので、16:30+9時間=翌日1:30です。

問4 保存場所の公開について最も適切な方針はどれか。

  1. ① 理由を書けば、どの区分のデータも公開してよい
  2. ② 公開は例外とし、公開してよい区分のデータに限り、理由・承認・見直し日を記録する
  3. ③ 社内の人に共有するには公開にするのが最も簡単でよい
  4. ④ 公開設定はクラウドが自動で防ぐので気にしなくてよい
解答と解説

正解:②

まずデータ区分で公開してよいかを判断し、そのうえで理由と承認を記録します。社内共有は公開ではなく権限で行います。

問5 監査ログで「拒否された権限付与の試み」が深夜に複数回見つかった。最も適切な対応はどれか。

  1. ① 拒否されたので問題なし。記録も消してよい
  2. ② 最小権限が機能した証拠として残しつつ、その主体の認証情報の漏洩や不審な活動を調査する
  3. ③ その主体に権限を付けて試行を止めさせる
  4. ④ ログの記録を停止して容量を節約する
解答と解説

正解:②

拒否は防御が効いた結果ですが、攻撃や認証情報の盗用の前兆の可能性があり、調査の手がかりです。

問6 アプリケーションログの設計として適切なものはどれか。

  1. ① 調査に便利なので、リクエスト全体(パスワード含む)を記録する
  2. ② 時刻・要求ID・仮名化した利用者ID・結果・エラーの種類など必要な項目に絞り、秘密情報は記録しない
  3. ③ ログは誰でも見られる公開の保存場所に置く
  4. ④ ログは一切残さない
解答と解説

正解:②

ログは多くの人が読み、長く残るため、必要な項目に絞り、秘密情報や不要な個人情報を書きません。

次に学ぶこと

次は 費用と停止 で、クラウドの費用の内訳と、使い終わった資源の止め方・消し方を学びます。

漏洩が疑われるときの手順は 「漏洩時の対応」(有料版)、保存場所のアクセス制御と鮮度は 「鮮度とアクセス制御」(有料版)、ログ・メトリクス・トレースによる監視は 「ログ・メトリクス・トレース」(有料版) で深めます。

キャリア学習:データサイエンティスト・機械学習エンジニア・DX推進・研究者を目指す人の学習アプリ。164モジュール・984授業を、ブラウザで動くSQLとPythonの演習で。基礎と各分野の最初のモジュールは無料。全部は2,980円の買い切り。

アプリを無料で開く有料版と無料版の違い