特定のネットワークからのアクセスのみに限定したオブジェクト・ストレージのPARを作成してみる。

オブジェクト・ストレージには事前認証済みリクエスト（Pre-Authenticated Request, PAR）という機能があります。これは、プライベート・バケットであっても、ユーザが独自の認証を行わずにバケットまたはオブジェクトにアクセスできるようにする一定期間のみ有効なURLを発行できる機能です。

PARに対してアクセスを行う際にはユーザ認証を経ることがないので一見すると権限設定などが反映されないようにも思えますが、「事前認証済みリクエスト」はその名の通り事前にPAR作成ユーザによって認証が済んでいるという意味になるので、実際にはPARを作成したユーザに付与されている権限が適用されます。

今回は、PAR作成ユーザのアクセス権限をネットワーク・ソースで絞り込み、PARを特定のネットワークからのアクセスにのみ限定することができるかを確認していきます。

ここでは、
　1. インターネット経由でクライアントPCからOCIコンソールでユーザ名/パスワードを使って認証してPAR作成するケース
　2. VCN内のプライベートなインスタンスからインスタンス・プリンシパルを用いて認証してPAR作成する場合
の2パターンを実施していきます。


## 1. インターネット経由で特定のIPアドレスのクライアントからのアクセスのみを許可するPARをOCIコンソールから作成する

まず、ネットワーク・ソースでソースIPアドレス条件をつけて権限付与をしたOCIユーザでPARを作成して動作確認します。

1. 検証するクライアントPCのIPアドレスを指定してネットワーク・ソースを作成する。
![image-20240322104833120.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2524827/75d238eb-8e02-d22c-d266-210d0dc64a3c.png)

2. IAMポリシーでテスト用ユーザのグループに対して権限を付与する。この際、Where句の条件として`request.networkSource.name` を使用し、先ほど作成したネットワーク・ソースからのアクセスのみに絞る。

   ```
   allow group <グループ名> to manage all-resources in compartment <コンパートメント名> where request.networkSource.name=<ネットワーク・ソース名>
   ```
   ![image-20240322104843721.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2524827/8c5fa150-4a77-8e2a-e370-2fbfd51df8ef.png)


3. ネットワーク・ソースで指定したIPを持つクライアントからは、上記ポリシーで設定したグループ内のユーザでOCIコンソールにログインして、対象のオブジェクトストレージのバケットに正しくアクセスができることを確認。
![image-20240322104850623.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2524827/286ef3a0-3c46-8d72-2da1-ef59d0efc26d.png)

4. 同一PCだがVPNを使ってクライアントのIPアドレスを変えると、同じユーザ、同じバケットであってもアクセスができないことを確認。ネットワーク・ソースによる絞り込みが有効になっていることが分かる。![image-20240322104854891.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2524827/f1a17749-7fb6-1731-74d1-865a5654fc13.png)

5. ネットワーク・ソースで許可されているIPアドレスのクライアントから、オブジェクトに対して読み取り権限を持つPARを作成する。
・PARの名前を入力し、オブジェクトの読取りを許可、有効期限はデフォルトの一週間後とした。
 ![image-20240322104902226.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2524827/1a8860a4-d707-243e-ddf6-e97aa6df88ef.png)

6. 同じクライアントの、OCIコンソールにログインしていない別ブラウザからでもPARのURLにアクセスすれば、ユーザ認証は行わずに対象のオブジェクトを読み取りできることを確認。![image-20240322104905037.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2524827/c682184e-0206-c47e-0e1d-dd8e79482220.png)

7. 再度VPNを有効にしてクライアントのIPアドレスを変更してから、ブラウザでPARのURLをリロードするとエラーになった。つまり、ネットワーク・ソースの条件からはずれたクライアントからはPARであっても読み取りはできなくなっていることが確認できた。また、OCIコンソールにログインしていたほうのブラウザもエラーになった。![image-20240322104911731.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2524827/d111c32c-1c00-6922-5deb-b865ea4fd2d8.png)
![image-20240322104916569.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2524827/24d4fe8f-ef48-b318-00fa-19beade7ba77.png)

PARに対して、適切にIAMポリシーによってアクセス制御が行われていることが確認できた。


## 2. プライベート・サブネット内のインスタンス・プリンシパルからPARを作成する

続いて同じ環境で、ネットワーク・ソースでソースIPアドレス条件をつけて権限付与をした動的グループ（インスタンス・プリンシパル）を使ってPARを作成してみます。

1. VCNのプライベート・サブネット内にインスタンスを作成する。![image-20240322104953630.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2524827/6c13a0a5-2736-a7c2-4a77-e7dc9d4c8777.png)


2. 上記インスタンスが含まれる動的グループを作成する。ここではコンパートメント内のインスタンスをすべて対象とした動的グループを作成。
![image-20240326130730823.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2524827/b48d003b-dcba-1f5c-c766-a277595b11c7.png)

3. プライベート・サブネットのルート表にはサービス・ゲートウェイ経由でのルート・ルールが存在するので、インスタンスからオブジェクト・ストレージへの疎通は可能な状態となっている。また、セキュリティ・リストではすべてのエグレス通信を許可している。
![image-20240322105002067.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2524827/0f151f7f-57c3-c0c0-09ac-241d8d43154b.png)

4. ネットワーク・ソースに、作成したインスタンスの所属するVCNと、インスタンスのプライベートIPアドレスを追加する。
![image-20240322173542388.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2524827/d9fafc3f-8322-0ed3-5a3c-30c2add560f6.png)

5. IAMポリシーでインスタンスの動的グループに対してのみ権限を付与する。この際、Where句の条件として`request.networkSource.name` を使用し、先ほど作成したネットワーク・ソースからのアクセスのみに絞る。
   ```
   Allow dynamic-group <動的グループ名> to manage all-resources in compartment <コンパートメント名> where request.networkSource.name=<ネットワーク・ソース名>
   ```
   ![image-20240322171651728.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2524827/011c181b-69b7-88e2-7359-d3b6c77030fa.png)

6. Cloud Shellからプライベート・サブネットに接続してsshでインスタンスのOSにログインする。
![image-20240322105004444.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2524827/435b0e6d-0406-59a9-b805-96fdb9f6be60.png)

7. インスタンスのOS上でOCI CLIをインストールする。（CLIのインストールとセットアップの手順は省略。）
   `--auth instance_principal`のオプションを利用し、ユーザのAPIキー認証ではなくインスタンス・プリンシパル認証を利用してPARを作成する。`--auth` オプションを各コマンドに付ける以外に、環境変数 `OCI_CLI_AUTH=instance_principal` を設定してもインスタンス・プリンシパルの利用は可能。
   ```
   [opc@tk-inst-priv ~]$ oci os preauth-request create --access-type ObjectRead --bucket-name tk_test_bucket --object-name oracle-team-usa.jpg --name tk_par2 --time-expires 2024-03-29 --auth instance_principal
   {
     "data": {
       "access-type": "ObjectRead",
       "access-uri": "/p/OxQzIvI6KW2zSKXQ09PM3EWZtFAE_MpJuF-j2wy6B5s46iEEQhYEBEbADHzAAJZR/n/nr3c2r62ocsa/b/tk_test_bucket/o/oracle-team-usa.jpg",
       "bucket-listing-action": null,
       "full-path": "https://nr3c2r62ocsa.objectstorage.ap-tokyo-1.oci.customer-oci.com/p/OxQzIvI6KW2zSKXQ09PM3EWZtFAE_MpJuF-j2wy6B5s46iEEQhYEBEbADHzAAJZR/n/nr3c2r62ocsa/b/tk_test_bucket/o/oracle-team-usa.jpg",
       "id": "nBQLDfnEgeWyjyjHctwcYbdtgw3xqxIhfyiLRZNJHK8cgD/7Ke5lekvi0fD6lJsu:oracle-team-usa.jpg",
       "name": "tk_par2",
       "object-name": "oracle-team-usa.jpg",
       "time-created": "2024-03-22T08:20:26.967000+00:00",
       "time-expires": "2024-03-29T00:00:00+00:00"
     }
   }
   [opc@tk-inst-priv ~]$ 
   ```

8. そのままの状態で同じインスタンスのOS上からPARの読み取りアクセスが可能なことを確認。ここでは、curlコマンドのヘッダ取得とwgetで確認した。
   ```
   [opc@tk-inst-priv ~]$ curl -I https://objectstorage.ap-tokyo-1.oraclecloud.com/p/OxQzIvI6KW2zSKXQ09PM3EWZtFAE_MpJuF-j2wy6B5s46iEEQhYEBEbADHzAAJZR/n/nr3c2r62ocsa/b/tk_test_bucket/o/oracle-team-usa.jpg
   HTTP/1.1 200 OK
   accept-ranges: bytes
   Content-Length: 93658
   content-md5: wMARN3+Kos2F5v/Bdmtnsw==
   last-modified: Fri, 22 Mar 2024 01:01:24 GMT
   etag: 78a169b0-97b6-490a-a5c6-85702073b31c
   version-id: 8ade4376-0965-4ab5-ac5b-b866a43977b2
   storage-tier: Standard
   Content-Type: image/jpeg
   date: Fri, 22 Mar 2024 08:21:16 GMT
   opc-request-id: nrt-1:xLx1_feA5RteYmnzL1s3Wh1WF0MhJ8QM7lg4zzYqt5hdU0-CMp8gksP_gT_Ydn1q
   x-api-id: native
   x-content-type-options: nosniff
   strict-transport-security: max-age=31536000; includeSubDomains
   access-control-allow-origin: *
   access-control-allow-methods: POST,PUT,GET,HEAD,DELETE,OPTIONS
   access-control-allow-credentials: true
   access-control-expose-headers: accept-ranges,access-control-allow-credentials,access-control-allow-methods,access-control-allow-origin,content-length,content-md5,content-type,date,etag,last-modified,opc-client-info,opc-request-id,storage-tier,strict-transport-security,version-id,x-api-id,x-content-type-options
   
   [opc@tk-inst-priv ~]$ 
   [opc@tk-inst-priv ~]$ wget https://objectstorage.ap-tokyo-1.oraclecloud.com/p/OxQzIvI6KW2zSKXQ09PM3EWZtFAE_MpJuF-j2wy6B5s46iEEQhYEBEbADHzAAJZR/n/nr3c2r62ocsa/b/tk_test_bucket/o/oracle-team-usa.jpg
   --2024-03-22 08:21:22--  https://objectstorage.ap-tokyo-1.oraclecloud.com/p/OxQzIvI6KW2zSKXQ09PM3EWZtFAE_MpJuF-j2wy6B5s46iEEQhYEBEbADHzAAJZR/n/nr3c2r62ocsa/b/tk_test_bucket/o/oracle-team-usa.jpg
   Resolving objectstorage.ap-tokyo-1.oraclecloud.com (objectstorage.ap-tokyo-1.oraclecloud.com)... 134.70.80.3
   Connecting to objectstorage.ap-tokyo-1.oraclecloud.com (objectstorage.ap-tokyo-1.oraclecloud.com)|134.70.80.3|:443... connected.
   HTTP request sent, awaiting response... 200 OK
   Length: 93658 (91K) [image/jpeg]
   Saving to: ‘oracle-team-usa.jpg.6’
   
   oracle-team-usa.jpg.6                                      100%[=====================================================================================================================================>]  91.46K  --.-KB/s    in 0.001s  
   
   2024-03-22 08:21:22 (132 MB/s) - ‘oracle-team-usa.jpg.6’ saved [93658/93658]
   
   [opc@tk-inst-priv ~]$ 
   ```

9. クライアントPCのブラウザからも同じPARのURLにアクセスできることも可能。これはネットワーク・ソースにクライアントPCのIPアドレスも含まれているため。
![image-20240322172245331.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2524827/4655d29a-df52-1784-4d93-87c77af59a7d.png)

10. クライアントPC側で再度VPNを有効化してIPアドレスを変更すると、ネットワーク・ソースの範囲外となるのでPARへのアクセスはできなくなる。
![image-20240322172341035.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2524827/e4ce7de4-adb2-b0f2-9d5d-abf913302da1.png)

11. また、この時点でネットワーク・ソースからインスタンスのプライベートIPアドレスの指定を削除すると、同じインスタンス上からさきほどと同様のリクエストをなげても404エラーとなってアクセスはできない。つまり、プリンシパルの認証はPAR作成時点で事前に行われているが、認可（権限有無の判断）は作成時点ではなくてPARへアクセスした時点でのポリシーが適用されるということがわかる。
![image-20240322172733603.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2524827/f64a50c8-8191-73f3-170e-68db9f14d1dc.png)

    ```
    [opc@tk-inst-priv ~]$ curl -I 'https://objectstorage.ap-tokyo-1.oraclecloud.com/p/wMvtR_cOhAvyYt-NoDXxsFnFXaEafjjrPgTYAcAwMIIavKcplju9Le6Kqu77Wq11/n/nr3c2r62ocsa/b/tk_test_bucket/o/oracle-team-usa.jpg'
    HTTP/1.1 404 Not Found
    date: Fri, 22 Mar 2024 08:27:52 GMT
    opc-request-id: nrt-1:nXhhGpEPgXLZiIh9-qCDk6XZdc56PBIkgR89-0XvKGMYzYp-NJEitzWYg46GpkLv
    x-api-id: native
    x-content-type-options: nosniff
    strict-transport-security: max-age=31536000; includeSubDomains
    access-control-allow-origin: *
    access-control-allow-methods: POST,PUT,GET,HEAD,DELETE,OPTIONS
    access-control-allow-credentials: true
    access-control-expose-headers: access-control-allow-credentials,access-control-allow-methods,access-control-allow-origin,date,opc-client-info,opc-request-id,strict-transport-security,x-api-id,x-content-type-options
    
    [opc@tk-inst-priv ~]$ 
    [opc@tk-inst-priv ~]$  wget https://objectstorage.ap-tokyo-1.oraclecloud.com/p/OxQzIvI6KW2zSKXQ09PM3EWZtFAE_MpJuF-j2wy6B5s46iEEQhYEBEbADHzAAJZR/n/nr3c2r62ocsa/b/tk_test_bucket/o/oracle-team-usa.jpg
    --2024-03-22 08:28:47--  https://objectstorage.ap-tokyo-1.oraclecloud.com/p/OxQzIvI6KW2zSKXQ09PM3EWZtFAE_MpJuF-j2wy6B5s46iEEQhYEBEbADHzAAJZR/n/nr3c2r62ocsa/b/tk_test_bucket/o/oracle-team-usa.jpg
    Resolving objectstorage.ap-tokyo-1.oraclecloud.com (objectstorage.ap-tokyo-1.oraclecloud.com)... 134.70.80.3
    Connecting to objectstorage.ap-tokyo-1.oraclecloud.com (objectstorage.ap-tokyo-1.oraclecloud.com)|134.70.80.3|:443... connected.
    HTTP request sent, awaiting response... 404 Not Found
    2024-03-22 08:28:47 ERROR 404: Not Found.
    
    [opc@tk-inst-priv ~]$ 
    ```




インスタンス・プリンシパルで認証してPARを作成した場合も、正しく動的グループに対して設定したIAMポリシーによってアクセス制御が行われていることが確認できました。
また、作成時点では権限を持っていても、その後ポリシーを変更したりした場合は、PARへのアクセス時点での権限に応じてアクセス可否が判断されることもわかりました。

以上で、ソースIPアドレス制御を適用したPARの動作確認は完了です！