今回はAWSのRDSにデータを安全に保存する方法についてお話したいと思います。
RDS(Relational Database Service)はAWSのデータベースサービスです。自社のデータセンターで安定したデータベースの環境を作ろうと思った場合、ハードウェアのセットアップや、定期的なバックアップの取得、負荷が高くなった場合のスケールアップ、ハードウェア故障があった場合の冗長化、定期的なパッチの適用などしなくてはいけないことがたくさんあります。RDSを使うことで、画面を数回クリックするだけで、そういったことが簡単に導入できてしまいます。
しかし、その中でもクレジットカード情報を保存する場合や、個人情報を取り扱うシステムなどでは、安全にデータを保存する必要があります。そのようなシステムをAWS上で構築する場合にまず選択肢になるのは下記の3つかと思います。
- RDS(AWSのリレーショナルデータベースのサービス)
- S3(AWSのストレージサービス)
- DynamoDB(AWSのNo SQLサービス)
今回は、その中でもRDSに限定して安全にデータを保存するために注意する4つのポイントについてお話したいと思います。ポイントは下記の4つです
- パブリックアクセスを無効にする
- DBインスタンスの暗号化を有効にする
- KMSのキーローテーションを1年に設定する
- KMSのキーに対するアクセス権限を設定する
- データ保存前に暗号化する
パブリックアクセスを無効にする

パブリックアクセスを有効にしてしまうと、インターネットからアクセス可能になってしまい、外部からの攻撃を受けてしまう可能性がありますので無効にします。デフォルトで無効になっていますので、有効にしません。また、RDSを配置するサブネットについてもインターネットにアクセスできる必要はありませんので、VPC内にのみルーティングが可能になるようにします。
DBインスタンスの暗号化を有効にする

RDSのインスタンスをストーレジレベルで暗号化するオプションを有効にします。AWSにはKMS(Key Management Service)というサービスがあります。これを使うことで、データの暗号化/復号用の鍵をAWS上で安全に管理することができます。RDSはこのKMSと連携することで、データベースファイルの暗号化を有効にすることができます。注意点として、データベースのテーブル内の情報は暗号化されていないため、データベースユーザーのアカウントが漏えいした場合、攻撃者は暗号化されていないデータを見ることができてしまいます。暗号化に設定するKMSは、最初からリージョンに1つAWSで用意されている標準のキーではなく、カスタマーマスターキーを作成して使用します。その理由は、カスタマーマースターキーでないと、次に説明するキーローテーションやキーポリシーが設定できないためです。キーはこのRDSの用途のみに専用で作成した方がいいです。同じキーを他の用途にも再利用してしまうと、それだけ漏えいした際の被害が大きくなるからです。
KMSのキーローテーションを1年に設定する

DBインスタンスの暗号化に設定したKMSでカスタマーマスターキーを使用した場合、キーローテーションが設定できますので、一年に設定します
そうすると、一年後に自動的にキーが更新されます。KMSのキーローテーションは古いキーもAWSの内部的には保存されており、古いキーで暗号化されたデータの複合には古いキーが使われ、新しいデータの複合から新しいキーが使われますので、ローテーション時にデータが複合できなくなるなどの不具合はおこりません。PCI DSSの要件3.6でもキーをローテーションすることが求められており、一年でローテーションしていれば問題ありません。
KMSのキーに対するアクセス権限を設定する

暗号化に使用したKMSに対するアクセス権げを適切に設定し、最小限の人がアクセスできるようにします。具体的にはキー管理者とキーのユーザーを設定します。キーユーザーはアプリケーションを配置したEC2インスタンスに設定されたIAMロールからのみアクセス可能となるように設定します
データ保存前に暗号化する

先ほども述べた通り、RDSに備わっている暗号化だけではデーターベースアカウントが乗っ取られた場合に生のデータが見えてしまうという心配があります。そのため、万全を期すのであれば、データベースにアクセスするアプリケーションで、保存前に暗号化して、保存した方が良いです。この場合には、暗号化された状態でテーブルにデータが保存されます。
RDS以外の選択肢
今回はRDSに安全にデータを保存する方法について説明しました。AWSでデータを保存する場合は、RDSかS3が選択肢として最初に上がると思います。次回は、S3に安全にデータを保存する方法について説明したいと思います。