導入
AWS S3バケットへのパブリックアクセスの問題は、AWS S3サービスで最も一般的な問題の1つです。これにより、S3に格納されている機密データが公開される可能性があります。この問題の存在は、ストレージバケットのパブリックアクセスポリシーの設定に起因しています。この記事では、この問題を検出および防止する方法について説明します。
問題の理解
ストレージバケットのファイルに直接アクセスできる場合、バケットにパブリックアクセスの問題があることを示しています。
上記のイメージで見られるように、ストレージバケットのファイルに直接アクセスできます。では、なぜこれが起こっているのかを理解しましょう。
このバケットのポリシーを調べると、次のような設定があるかもしれません。
{
"Version": "2012-10-17",
"Id": "test",
"Statement": [
{
"Sid": "test",
"Effect": "Allow",
"Principal": "*",
"Action": "s3:GetObject",
"Resource": "arn:aws:s3:::selefra-test-omkqt/*"
}
]
}
このポリシーでは、selefra-test-xxxx
バケットに対して誰でもs3:GetObject
権限が付与されているため、バケット内のオブジェクトにパブリックアクセスが可能となります。
対策
最小特権の原則に従うべきであり、特定のユーザーに特定の権限を付与する代わりに、すべてのユーザーにアクセスを許可するべきではありません。
ビジネス要件によりパブリックアクセスが必要なストレージバケットの場合、それらのバケットには機密データを格納しないようにする必要があります。
クイックディスカバリーにSelefraを使用する
これらの問題を手動で検出すると時間がかかり、一括で行うことはできません。Selefraを使用することで、これらのリスクを迅速に特定できます。
Selefraプロジェクトリポジトリ:[github.com/selefra
/selefra](https://github.com/selefra/selefra)
Selefraの典型的な使用法
まず、Selefraをインストールしましょう:
brew tap selefra/tap
brew install selefra/tap/selefra
次に、新しいプロジェクトフォルダを作成します:
mkdir selefra-test
cd selefra-test
次のYAMLファイルをこのフォルダにコピーします:
selefra:
name: selefra-test
connection:
type: postgres
username: your_username
password: your_password
host: 127.0.0.1
port: 5432
database: postgres
sslmode: disable
log_level: info
providers:
- name: aws
source: aws
version: v0.1.0
providers:
- name: aws
provider: aws
cache: 7d
rules:
- name: bucket_publicly_readable
metadata:
title: S3バケットがパブリックで読み取り可能
query: |-
SELECT
DISTINCT(a1.*)
FROM
aws_s3_buckets a1,
json_array_elements (a1.policy :: json -> 'Statement') a2
WHERE
(
a2 ->> 'Action' = 's3:GetObject'
OR a2 ->> 'Action' = 's3:Get*'
OR a2 ->> 'Action' = 's3:*'
)
AND a2 ->> 'Effect' = 'Allow'
AND (
a2 ->> 'Principal' = '*'
OR a2 -> 'Principal'
->> 'AWS' = '*'
);
output: "S3バケットがパブリックで読み取り可能、arn: {{.arn}}"
Selefraモジュールでは、connection
ブロックに自分のPostgreSQLデータベース接続アドレス、ユーザー名、パスワードを設定します。providers
モジュールのcache
ブロックはデータの取得キャッシュ時間を設定します。rules
モジュールは問題を検出するための設定に関連しています。title
ブロックは検出ポリシーのタイトルを表し、SQLクエリブロックはリスクのあるリソースを検索するためにこのSQLクエリをデータベースで実行します。
検出を開始する前に、AWSの認証情報を設定するために次のコマンドを実行します:
aws configure
次に、次のコマンドを実行してSelefraを起動します:
selefra apply
Selefraは検出プロセスを開始します。以下は結果の例です:
結果では、リスクのあるバケットが表示されます。上記の方法以外にも、SelefraにはSelefraに直接問い合わせることでリスクポイントを発見することができるChatGPT機能が統合されています。
Selefra GPT機能
前の手順と同様に、新しいフォルダを作成し、次のYAMLファイルをフォルダにコピーします:
selefra:
name: selefra-test
connection:
type: postgres
username: yourusername
password: yourpassword
host: 127.0.0.1
port: 5432
database: postgres
sslmode: disable
log_level: info
openai_api_key: your_openai_api_key
openai_mode: gpt-4
openai_limit: 10
providers:
- name: aws
source: aws
version: v0.1.0
providers:
- name: aws
provider: aws
cache: 7d
rules:
この場合、openai_api_key
フィールドに自分のOpenAI APIキーを提供し、openai_mode
フィールドでGPT-4またはGPT-3.5のいずれかを選択します。さらに、AIが自動的に生成するため、rules
ブロックは空のままにしておきます。
検出を開始する前に、AWSの認証情報を設定し、次のようにGPT機能を使用できます:
selefra gpt "Query publicly accessible S3 buckets."
上記の例のように、簡単な文でパブリックにアクセス可能なバケットを見つけることができます。非常に便利です。
結論
S3バケットへのパブリックアクセスは、頻繁かつ切迫した問題です。この記事がAWS S3のストレージバケットへのパブリックアクセスの問題を理解し、解決するのに役立てば幸いです。Selefraを使用することで、クラウドをより安全にすることができます。