【実務・中級編】 マネージドデータベース(RDS/Cloud SQL)のパブリックアクセス無効化と暗号化 – 暗号理論・認証基盤 & エンドポイントセキュリティ防御ガイド

なぜ「RDSをインターネットに晒す」ことが、あなたのキャリアを終わらせるのか

現場で数々のインシデントを見てきたが、未だに「開発の利便性」を理由にRDSをパブリック公開し、セキュリティグループでIP制限をかけて安心しているエンジニアがいる。ハッキリ言おう。それは玄関の鍵を開けたまま、チェーンロックだけかけて「泥棒は入らないはずだ」と信じ込んでいるのと同じだ。

攻撃者は、あなたが設定したIP制限の隙間を縫うように、クラウド環境のメタデータサービスや周辺の踏み台サーバーを経由して侵入してくる。今回は、データベースという「組織の心臓部」をどう守り抜くか、実務レベルの防衛術を叩き込む。

—

1. データベース防御の鉄則:ネットワークと暗号化の二段構え

データベースを守るには「ネットワークの隔離」と「データの暗号化」の二つが不可欠だ。

ネットワーク:パブリックアクセス無効化は「絶対」

クラウド上のDB(RDSやCloud SQL)をパブリックアクセス可能にする理由は、現代のアーキテクチャでは存在しない。VPC内に閉じ込め、プライベートサブネットに配置する。接続が必要なら、Bastionホスト(踏み台)を経由するか、AWS Systems Manager Session Managerのような「鍵管理不要のトンネル」を利用すべきだ。

暗号化:AES-256で「ゴミ」にする

保存時暗号化(TDE/KMS)は、物理ストレージが盗難に遭った際や、バックアップデータが漏洩した際の「最後の砦」だ。暗号化されていれば、データが流出してもただのバイナリの羅列(ゴミ)に過ぎない。

—

2. 【コピペで防ぐ】実務で使える設定とコード例

まずは、Terraform等でインフラを定義する際の「セキュアな設定」の勘所だ。

AWS RDS (Terraform設定例)

resource "aws_db_instance" "secure_db" {
  # パブリックアクセスを明示的に拒否
  publicly_accessible    = false
  
  # 保存時暗号化を有効化(KMSキーを指定)
  storage_encrypted      = true
  kms_key_id             = aws_kms_key.db_key.arn
  
  # IAM認証の有効化(パスワード流出リスクの低減)
  iam_database_authentication_enabled = true
  
  # VPC内への限定
  vpc_security_group_ids = [aws_security_group.db_sg.id]
  db_subnet_group_name   = aws_db_subnet_group.private.name
}

PythonでDB接続をIAM認証で行う(RDS用)

パスワードをコードに直書きするのは論外だ。IAMロールを利用して短命な認証トークンを取得する。

import boto3

def get_db_auth_token(hostname, port, db_user):
    # RDSへの接続用認証トークンを生成(有効期限は15分)
    client = boto3.client('rds')
    token = client.generate_db_auth_token(
        DBHostname=hostname,
        Port=port,
        DBUsername=db_user
    )
    return token

# このトークンをDB接続時のパスワードとして利用する
# これにより、DBのパスワードを環境変数や設定ファイルに書く必要がなくなる

—

3. なぜ「公開」が致命的なリスクを生むのか:攻撃者の視点

もし君がDBをパブリック公開し、セキュリティグループのIP制限のみで守っているなら、攻撃者は以下のように動く。

1. ポートスキャン: 3306や5432が世界中に公開されていることを検知。
2. ブルートフォース: 管理者のパスワードを推測攻撃する。
3. 脆弱性の突撃: 特定のバージョンのMySQL/PostgreSQLに公開されている既知の脆弱性(CVE)を突き、権限昇格を狙う。

特に怖いのは、設定ミスによる意図しない公開だ。CloudWatchアラームで「DBインスタンスのパブリックフラグが変更されたら即時通知」を設定し、GitHubにTerraformファイルが誤ってプッシュされていないか、git-secrets等で常に監視する体制が必要だ。

—

4. セキュリティチーフからの「最後の警告」

技術スタックがいかに進化しても、攻撃手法の根っこにあるのは常に「人間の不注意」だ。

  • 監査: AWS CloudTrailやGCP Cloud Audit Logsを有効にし、誰がいつDBの設定を変えたか、誰が接続を試みたかを常にログへ吐き出せ。
  • 暗号化の基本: 共通鍵暗号(AES-256)は非常に高速で強固だ。ストレージ暗号化はパフォーマンスへの影響も軽微なので、迷わず全インスタンスで有効化すること。

「面倒だから」という言葉は、インシデント発生時の始末書の書き出しと同じだ。 今日紹介した設定は、明日からチーム全体で「デフォルトルール」として強制してほしい。セキュリティは足し算ではなく、掛け算だ。一つでも「適当」な部分があれば、全体のリスクはゼロに等しくなる。

君たちの手で、強固なインフラを作り上げてくれ。健闘を祈る。

コメント

タイトルとURLをコピーしました