[Oracle Cloud] Object Storage へ Private でセキュアに接続 (Transit Routing + Network Sources)

# はじめに

Object Storage は、Internet 上に公開されているサービスです。個人情報の格納など、セキュリティ要件の厳しい使い方のときに、Internet に公開されているサービスの利用は避けたい、といった考え方があります。このような時に対応するため、Private なネットワークに制限が出来ます。

今回の記事では、Object Storage のアクセスを、Private なネットワークに制限する方法をご紹介します。



# 構成

まず、紹介する構成の全体像をお見せします (画像の中のIP アドレスは削除済み)。

![1605194923051.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/104247/21cc8b7a-dfeb-1f7c-1451-6f3d7437094d.png)



赤い吹き出しで書いている2点が重要なポイントです。

- Transit Routing : Internet に公開されている Object Storage を、IPsec VPN や FastConnect などの Private な方法で接続する
- Network Sources : Object Storage にアクセス可能な IP アドレスの制限



これによって、VCN環境とオンプレミス環境の Private Network に限定して、アクセスを利用できます。なお、画像のオンプレミス環境は、Tokyo Region を疑似的にオンプレミスとして扱っています。VyOS という仮想ルーターを使い、Tokyo Region からOsaka Region へ IPsec VPN 接続をしています。



# 前提条件

既に、Osaka Region と疑似オンプレミス環境が、IPsec VPN で接続されている状態から手順を紹介していきます。IPsec VPN で接続していて、BGP 経路交換で互いに接続出来る状態です。

OCI Console で見ると、つぎのように 2つのトンネルが Up になっています。

![1605180897274.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/104247/2d56a732-f62c-3a54-6820-d341b7cf60ae.png)



オンプレミス側ルーターの BGP 情報です。Osaka 側の Subnet の情報が伝わってきています。

```
vyos@vyos:~$ show ip bgp
BGP table version is 2, local router ID is 10.200.1.2, vrf id 0
Default local pref 100, local AS 65000
Status codes:  s suppressed, d damped, h history, * valid, > best, = multipath,
               i internal, r RIB-failure, S Stale, R Removed
Nexthop codes: @NNN nexthop's vrf id, < announce-nh-self
Origin codes:  i - IGP, e - EGP, ? - incomplete

   Network          Next Hop            Metric LocPrf Weight Path
*= 10.100.1.0/24    192.168.0.105                          0 31898 i
*>                  192.168.0.103                          0 31898 i
*> 10.200.0.0/16    0.0.0.0                  0         32768 i

Displayed  2 routes and 3 total paths
vyos@vyos:~$
```





# Transit Routing 設定

まず、Transit Routing の設定のポイントを見てみましょう。赤い吹き出しで書いている通り、Osaka 側の DRG (Dynamic Routing Gateway) と SGW(Service Gateway) に Route Table を設定する箇所です。これを設定することで、オンプレミスに Object Storage を含めた OCI Service 群が BGP で経路広告されます。これによって、IPsec VPN のトンネル経由で、Object Storage が利用できます。

![1605195481047.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/104247/1fc28869-2e79-3a12-a1c6-dd981d8f3f08.png)



それでは設定方法を見て行きましょう。



## DRG 用 Route Table の作成

Osaka DRG 用の Route Table 作成します

![1605147977838.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/104247/7b918d19-d3e8-26ad-abb4-6cf4b5f128c8.png)


Create

![1605148005616.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/104247/3b93705c-c57e-cd8e-5f75-0de3a6e140f7.png)



クリック

![1605148035706.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/104247/88b7526d-7149-b516-4efd-3def879c0e07.png)



Add

![1605148066911.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/104247/c75a290b-0fe9-97f2-9b22-8942b3ff8a55.png)



Service Gateway を選択

![1605148290720.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/104247/65a659de-91f2-466b-4f36-3511f6baa74d.png)



設定完了

![1605148307905.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/104247/a6efd0c8-316d-fee8-458c-0bba91a8c2e1.png)



## DRG に Route Table を設定

DRG に、先ほど作成した Route Table を設定します。そのまえに、未設定のときのオンプレミス側の BGP 情報をみてみましょう。
`10.100.1.0/24` が Osaka 側から伝わっています。それ以外は特に何もない状態です。

```
vyos@vyos:~$ show ip bgp
BGP table version is 2, local router ID is 10.200.1.2, vrf id 0
Default local pref 100, local AS 65000
Status codes:  s suppressed, d damped, h history, * valid, > best, = multipath,
               i internal, r RIB-failure, S Stale, R Removed
Nexthop codes: @NNN nexthop's vrf id, < announce-nh-self
Origin codes:  i - IGP, e - EGP, ? - incomplete

   Network          Next Hop            Metric LocPrf Weight Path
*= 10.100.1.0/24    192.168.0.105                          0 31898 i
*>                  192.168.0.103                          0 31898 i
*> 10.200.0.0/16    0.0.0.0                  0         32768 i

Displayed  2 routes and 3 total paths
vyos@vyos:~$
```



DRG で Associate を選ぶ

![1605148582242.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/104247/2029e1d4-8418-661f-bb2d-586132e2735c.png)



Associate

![1605148667826.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/104247/14c76a0d-76f7-7022-ce66-159799a04e22.png)



Associate 後、オンプレミス側のBGP 経路情報を確認すると、5 つほど経路情報が増えています。これは、Osaka 側の Object Storage を含めた Public IPの レンジが広告されています。

```
vyos@vyos:~$ show ip bgp
BGP table version is 7, local router ID is 10.200.1.2, vrf id 0
Default local pref 100, local AS 65000
Status codes:  s suppressed, d damped, h history, * valid, > best, = multipath,
               i internal, r RIB-failure, S Stale, R Removed
Nexthop codes: @NNN nexthop's vrf id, < announce-nh-selfOrigin codes:  i - IGP, e - EGP, ? - incomplete

   Network          Next Hop            Metric LocPrf Weight Path
*= 10.100.1.0/24    192.168.0.105                          0 31898 i
*>                  192.168.0.103                          0 31898 i
*> 10.200.0.0/16    0.0.0.0                  0         32768 i
*> 134.70.112.0/22  192.168.0.103                          0 31898 i
*=                  192.168.0.105                          0 31898 i
*= 140.91.48.0/23   192.168.0.105                          0 31898 i
*>                  192.168.0.103                          0 31898 i
*= 140.204.30.128/25
                    192.168.0.105                          0 31898 i
*>                  192.168.0.103                          0 31898 i
*> 192.29.240.0/22  192.168.0.103                          0 31898 i
*=                  192.168.0.105                          0 31898 i
*> 192.29.248.0/25  192.168.0.103                          0 31898 i
*=                  192.168.0.105                          0 31898 i

Displayed  7 routes and 13 total paths
vyos@vyos:~$
```



念のため、Object Storage の IP アドレスを確認しましょう。dig コマンドで見てみると、`134.70.112.3`となっています。経路広告されている1つに含まれていることがわかりますね。

```
> dig +dnssec @8.8.4.4 objectstorage.ap-osaka-1.oraclecloud.com

; <<>> DiG 9.11.3-1ubuntu1.1-Ubuntu <<>> +dnssec @8.8.4.4 objectstorage.ap-osaka-1.oraclecloud.com
; (1 server found)
;; global options: +cmd
;; Got answer:
;; ->>HEADER<<- opcode: QUERY, status: NOERROR, id: 14902
;; flags: qr rd ra; QUERY: 1, ANSWER: 2, AUTHORITY: 0, ADDITIONAL: 1

;; OPT PSEUDOSECTION:
; EDNS: version: 0, flags: do; udp: 512
;; QUESTION SECTION:
;objectstorage.ap-osaka-1.oraclecloud.com. IN A

;; ANSWER SECTION:
objectstorage.ap-osaka-1.oraclecloud.com. 2680 IN CNAME objectstorage.ap-osaka-1.oci.oraclecloud.com.
objectstorage.ap-osaka-1.oci.oraclecloud.com. 59 IN A 134.70.112.3

;; Query time: 13 msec
;; SERVER: 8.8.4.4#53(8.8.4.4)
;; WHEN: Thu Nov 12 11:41:22 JST 2020
;; MSG SIZE  rcvd: 128

```



## Service Gateway 用 Route Table の作成

Osaka SGW 用の Route Table 作成します

![1605171706682.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/104247/73d80de1-fabe-10a6-4064-dfca4bc8bdb5.png)



create

![1605171745637.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/104247/9ff294d4-a83f-1be4-ae05-34c71a47b26f.png)



クリック

![1605171786233.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/104247/0c6e7bec-2ebf-4999-09c5-e45bb0839827.png)



add

![1605171844013.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/104247/6d549021-ccb1-5773-4789-4460046dea84.png)



オンプレミス側のネットワーク情報を指定

![1605171959773.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/104247/2355a8c8-a362-9c52-a047-94a7f648416a.png)



結果

![1605171976043.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/104247/b0a462e9-e6cd-c532-6300-02cec9940ca5.png)



## Service Gateway に Route Table を設定

Associate を選ぶ

![1605172071720.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/104247/5eb11096-66ad-7ae0-1c51-3e4f6f7f6711.png)



Associate

![1605172094524.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/104247/a868568b-bbab-4d4a-05db-2264c84a1ab3.png)



# IAM

次に、Network Source を使って、Object Storage にアクセス可能な IP アドレスを制限します。Network Source は、IAM 周りの概念になっていて、IAM Policy と紐づけることで、特定のグループに対して、IP アドレス制限が出来ます。当たり前の内容ですが、IAM Policy は厳密にアクセス権を制御が必要です。特に、Administrators 権限のユーザーは、なにもかも設定変更が出来るので、注意が必要です。

それでは設定方法を紹介します。



## Network Sources

Network Source を作成

![1605185983078.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/104247/9d713bc8-9a92-20e2-57b5-23e6f9ace95a.png)



VCNとオンプレミスのネットワークを定義

![1605186123471.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/104247/ed39cf7f-19cb-0812-e55b-75821eda2002.png)



完了

![1605186156053.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/104247/2a9c1941-0afe-613e-d1ff-2ae2ee9e9b9f.png)



## User

次に、オンプレミスから Object Storage にアクセスする時のユーザーを払いだします。適当に IAM で作成します。

- Group : cli_group01
- User : cli_user01



また、この IAM User について、OCI CLI の実行権限を付与します。適当に Document を参照して設定しましょう。



## IAM Policy

IAM Policy を設定して、先ほど作成したユーザーの Object Storage への権限を設定します。

- `cli_bucket`バケットのみ操作可能
- Network Sourceでネットワーク制限
- オブジェクトの新規作成のみ (Delete 出来ない、上書きできない)

```
Allow group cli_group01 to manage objects in compartment cli where all {target.bucket.name='cli_bucket', request.permission='OBJECT_CREATE', request.networkSource.name='OnPremis_Network'}
```



許可する操作内容は、使い方に応じて調整してください。

![1605196237755.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/104247/30c4227b-dbf3-3c16-2490-21ed4dba44b6.png)



## IAM User Capability

更に厳密にするために、IAM User のコンソールログインを禁止します。払い出したユーザーは、Object Storage へオブジェクトの新規作成のみさせたいため、コンソールログイン権限は不要です。

Edit

![1605193057648.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/104247/0593661a-da4b-7bb9-65a8-a19460dfd84b.png)



API Keys のみ有効化

![1605193090875.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/104247/09d15ae9-ba98-6fd6-6da1-0dfe7686e8f6.png)



外すことにより、OCI Console のログイン不可

![1605193190325.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/104247/4bd18125-12ec-56c5-7d4b-399f9001259a.png)







# 実行確認

これで設定完了です。オンプレミス側に用意している、OCI CLI 設定済みなマシンから、Object Storage へファイルを Put します。

![1605196454099.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/104247/8658c2f0-8b30-2036-16d8-90a54458e29f.png)



まず名前解決を試みます。名前解決自体は、オンプレミス側のDNSで行います。正常に名前解決が出来ています。

```
[opc@private-machine01 .oci]$ dig +dnssec objectstorage.ap-osaka-1.oraclecloud.com

; <<>> DiG 9.11.4-P2-RedHat-9.11.4-26.P2.el7 <<>> +dnssec objectstorage.ap-osaka-1.oraclecloud.com
;; global options: +cmd
;; Got answer:
;; ->>HEADER<<- opcode: QUERY, status: NOERROR, id: 526
;; flags: qr rd ra; QUERY: 1, ANSWER: 2, AUTHORITY: 13, ADDITIONAL: 1

;; OPT PSEUDOSECTION:
; EDNS: version: 0, flags: do; udp: 4096
;; QUESTION SECTION:
;objectstorage.ap-osaka-1.oraclecloud.com. IN A

;; ANSWER SECTION:
objectstorage.ap-osaka-1.oraclecloud.com. 1256 IN CNAME objectstorage.ap-osaka-1.oci.oraclecloud.com.
objectstorage.ap-osaka-1.oci.oraclecloud.com. 3 IN A 134.70.112.3

;; AUTHORITY SECTION:
.                       516323  IN      NS      b.root-servers.net.
.                       516323  IN      NS      h.root-servers.net.
.                       516323  IN      NS      k.root-servers.net.
.                       516323  IN      NS      l.root-servers.net.
.                       516323  IN      NS      a.root-servers.net.
.                       516323  IN      NS      g.root-servers.net.
.                       516323  IN      NS      i.root-servers.net.
.                       516323  IN      NS      j.root-servers.net.
.                       516323  IN      NS      c.root-servers.net.
.                       516323  IN      NS      m.root-servers.net.
.                       516323  IN      NS      d.root-servers.net.
.                       516323  IN      NS      e.root-servers.net.
.                       516323  IN      NS      f.root-servers.net.

;; Query time: 0 msec
;; SERVER: 169.254.169.254#53(169.254.169.254)
;; WHEN: Thu Nov 12 08:39:48 GMT 2020
;; MSG SIZE  rcvd: 339

[opc@private-machine01 .oci]$
```



OCI CLI で、ファイルを格納します。

```
[opc@private-machine01 ~]$ oci os object put --bucket-name cli_bucket --file /home/opc/work/test.txt
Uploading object  [####################################]  100%
{
  "etag": "4c13b759-73ff-41d2-a76d-7a08080eda5a",
  "last-modified": "Thu, 12 Nov 2020 14:55:36 GMT",
  "opc-content-md5": "bBxtqkgS4lAqjcrDhiBBIw=="
}
```



正常に格納が出来ていますね。

![1605196561377.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/104247/785285ae-4fa1-be4b-e654-955bd07db412.png)



では次に、クレデンシャル情報が漏れた時を想定して、VCNとオンプレミス以外の環境から試してみます。エラーになるのが正しい動きです。

```
[opc@test ~]$ oci os object put --bucket-name cli_bucket --file /home/opc/work/test.txt
Uploading object  [####################################]  100%ServiceError:
{
    "code": "BucketNotFound",
    "message": "Either the bucket named 'cli_bucket' does not exist in the namespace 'nrakwqacaro2' or you are not authorized to access it",
    "opc-request-id": "kix-1:hu18f07XBxDTvJ7gxwbcSRd1Hf1JCrjO6JNfkolot04J1q69QE4i4FqIhXNBRhwS",
    "status": 404
}
```



正常に セキュアなアクセスが確認できました。



# 参考URL

https://docs.cloud.oracle.com/en-us/iaas/Content/Network/Tasks/transitroutingoracleservices.htm

https://docs.cloud.oracle.com/en-us/iaas/Content/General/Concepts/addressranges.htm#osn-ranges

https://qiita.com/sugimount/items/f248bb4b147e3d0f4891

https://qiita.com/sugimount/items/beac719948f0f22dd2af

https://qiita.com/sugimount/items/ebbc2ba550136d7a58b2