公開アクセス可能なAWS S3バケットの問題を見つけて修正する方法は次のとおりです。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3347065/40b248bf-c914-a36c-9e23-16bf9354be5c.png)

## 導入

AWS S3バケットへのパブリックアクセスの問題は、AWS S3サービスで最も一般的な問題の1つです。これにより、S3に格納されている機密データが公開される可能性があります。この問題の存在は、ストレージバケットのパブリックアクセスポリシーの設定に起因しています。この記事では、この問題を検出および防止する方法について説明します。

## 問題の理解

ストレージバケットのファイルに直接アクセスできる場合、バケットにパブリックアクセスの問題があることを示しています。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3347065/c1af2f1c-f1fb-e6f7-3b81-b8b12259da79.png)


上記のイメージで見られるように、ストレージバケットのファイルに直接アクセスできます。では、なぜこれが起こっているのかを理解しましょう。

このバケットのポリシーを調べると、次のような設定があるかもしれません。

```
{
    "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は検出プロセスを開始します。以下は結果の例です：

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3347065/1e55f66d-a257-a6d4-ec4e-c080254cfe07.png)

結果では、リスクのあるバケットが表示されます。上記の方法以外にも、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."

```

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3347065/e988eb96-8e10-847c-0ab6-27d6860420be.png)


上記の例のように、簡単な文でパブリックにアクセス可能なバケットを見つけることができます。非常に便利です。

## 結論

S3バケットへのパブリックアクセスは、頻繁かつ切迫した問題です。この記事がAWS S3のストレージバケットへのパブリックアクセスの問題を理解し、解決するのに役立てば幸いです。Selefraを使用することで、クラウドをより安全にすることができます。