初めに
冒頭ですが、この記事は次のシリーズ記事の1つです。
シリーズ1:OCI Bastion サービス
シリーズ2:プライベート・サブネット内の Oracle DB/ADB に接続
プライベート・サブネットにADBを作成した場合、ADBへのアクセスはプライベート・エンドポイントを介して行います。VPNを設定しない場合、OCI Bastionサービスを利用すると、踏み台サーバを構築せずにOn-Pのクライアントからプライベート・サブネット内のADBに接続できます。OCI Bastionサービスは無料で利用できます。
検証環境
項目 | 内容 | コメント |
---|---|---|
ADBタイプ | Data Warehouse | ATPにも適用 |
クライアントOS | Windows Server 2019 | |
DB接続ツール | SQL Developer Ver 21.4 | SQL PlusでもOK |
SSHソフト | OpenSSH |
ステップ
- 1. 事前準備
- 2. Bastionの作成
- 3. セッションの作成
- 4. NSGにイングレス・ルールを追加する
- 5. ADBのホスト名をローカルで識別可能にするため
- 6. SSHトンネルの作成
- 7. ADBに接続する
- 付録
1. 事前準備
ADB Walletをダウンロード
OCIコンソールからダウンロードした後(詳細は省略)、それをクライアント側に保存します。
ADBの「プライベート・エンドポイントIP」を確認
ADBの詳細ページから、「プライベート・エンドポイントIP」を取得できます。
2. Bastionの作成
Identity & Security -> Bastion -> Create Bastion
項目 | 内容 |
---|---|
要塞名 | 適当な名前を入力 |
ターゲットVCNとサブネット | ADBが所属するVCNとサブネットを選択 |
CIDRブロック許可リスト | このテストではCIDRブロックの許可リストを「0.0.0.0/0」に設定しているが、運用時には範囲を絞り込むことが推奨される。例えば、 接続元(クライアント)のIPアドレスのみを許可するように。 |
注意
- このテストでは、CIDRブロックの許可リストを「0.0.0.0/0」に設定しています。運用時には範囲を絞り込むことが推奨されます。例えば、接続元(クライアント)のIPアドレス範囲のみを許可するのが良いでしょう。
- OCI Bastionを作成する際には、ターゲットのVCNとサブネットを指定する必要がありますが、Bastion自体に対し、配置場所を指定する必要はありません(誤解されることがよくあります)。
Bastionがアクティブの状態になると、「プライベート・エンドポイントIP」は次の画面から確認できます。このIPはターゲット・サブネット内で自動的に割り当てられます。次のステップで、このIPをNSGのイングレス・ルールに追加します。「CIDRブロック許可リスト」を編集したい場合は、「編集」ボタンをクリックすれば大丈夫です。
3. セッションの作成
Bastion -> Sessions -> Create session
項目 | 内容 |
---|---|
セッション・タイプ | "SSH port forwarding session"を選択 |
ターゲット・ホストに接続する方法 | "IPアドレス"を選択 (デフォルト) |
IPアドレス | ADBの「プライベート・エンドポイントIP」 |
ポート | 1522 |
SSHキー | 既存のキーファイルを利用するか、新しいキーペアを作成する。 |
セッションはアクティブの状態になりましたら、次のように、3ドットのメニューをクリックしてSSHコマンドをコピーします。このコマンドは、「STEP 6. SSHトンネルの作成」で使用されます。
デフォルトでは、セッションは3時間有効ですが、Bastionを作成する際にはこの期間を変更することが可能です。
4. NSGにイングレス・ルールを追加する
プライベートADBを作成する時、ネットワーク・セキュリティ・グループ(NSG)がアタッチされます。ADBにアクセスするため、TCPポート1522を入力ルールに追加するのは必要です。
まだ行っていない場合は、次のようにルールを追加してください。"Source CIDR"は、Bastionの「プライベート・エンドポイントIP」です(Bastionの情報ページに表示されます)。
5. ADBのホスト名をローカルで識別可能にするため
次の2つの方法があり、どちらもOKです。
方法1. ホストファイルを編集する
接続クライアントに、次のファイルを編集します。
ファイル名
Windows OS: C:\Windows\System32\drivers\etc\hosts
Linux OS: /etc/hosts
追加内容: 127.0.0.1 <プライベート・エンドポイントURL>
例:127.0.0.1 xxxxxxxx.adb.ap-tokyo-1.oraclecloud.com
方法2. tnsnames.oraを編集する
ファイルtnsnames.oraに記載されているホスト名は、ADBの「プライベート・エンドポイントURL」です。 BastionサービスのSSHポート転送を使用するため、ローカル(DBクライアン側)からADBへのSSHトンネルを作成します。それで、ホスト名をlocalhostに変更する必要があります。
重要 !!
ホスト名の編集は、Linux OSで実施してください(例えば、vi, sedコマンド)。Windowsでホスト名を編集して保存したら、tnsnames.oraファイル内のサービス名が識別されませんので、ご注意ください。
以下のようにホスト名を変更してください。
編集前:host=<Private Endpoint URL> 例:host=xxxxxxxx.adb.ap-tokyo-1.oraclecloud.com
編集後:host=localhost
以下は、Oracle Linuxでの実施例です(解凍+編集+圧縮)。
[opc@linux8 ~]$ pwd
/home/opc
[opc@linux8 ~]$ mkdir wallet_local
[opc@linux8 ~]$ unzip Wallet_adw02.zip -d ./wallet_local
Archive: Wallet_adw02.zip
inflating: ./wallet_local/README
inflating: ./wallet_local/cwallet.sso
inflating: ./wallet_local/tnsnames.ora
inflating: ./wallet_local/truststore.jks
inflating: ./wallet_local/ojdbc.properties
inflating: ./wallet_local/sqlnet.ora
inflating: ./wallet_local/ewallet.p12
inflating: ./wallet_local/keystore.jks
[opc@linux8 ~]$ cd wallet_local
[opc@linux8 wallet_local]$ sed -i 's/host=[a-z0-9]*.adb.ap-tokyo-1.oraclecloud.com/host=localhost/' tnsnames.ora
[opc@linux8 wallet_local]$ zip Wallet_adw02_local.zip *
adding: cwallet.sso (stored 0%)
adding: ewallet.p12 (stored 0%)
adding: keystore.jks (deflated 13%)
adding: ojdbc.properties (deflated 49%)
adding: README (deflated 56%)
adding: sqlnet.ora (deflated 9%)
adding: tnsnames.ora (deflated 73%)
adding: truststore.jks (deflated 28%)
[opc@linux8 wallet_local]$
利用中のリージョンにより、リージョン・コード(ap-tokyo-1)を置き換えてください。
名前を区別するため、Wallet_adw02_local.zipを名付けます。当ディレクトリの全ファイルを一つのZipファイルに圧縮します。圧縮後、接続元のクライアントに転送してください。
6. SSHトンネルの作成
クライアント側でSSHコマンドを実行してトンネルを作成します。この例は、OpenSSHを利用します。まだインストールされていない場合、PowerShellを起動して、以下のコマンドでインストールしてください(管理者ユーザで実行)。
コマンド:Get-WindowsCapability -Online | Where-Object Name -like 'OpenSSH*'
PS C:\Windows\system32> Get-WindowsCapability -Online | Where-Object Name -like 'OpenSSH*'
Name : OpenSSH.Client~~~~0.0.1.0
State : Installed
Name : OpenSSH.Server~~~~0.0.1.0
State : Installed
PS C:\Windows\system32>
SSHトンネルを作成するコマンド:
ssh -i <privateKey> -N -L <localPort>:<Private_IP_of_ADB>:1522 -p 22 <bastion_ocid>@host.bastion.ap-tokyo-1.oci.oraclecloud.com
-
<privateKey>
を秘密キーのパスとファイル名に置き換える。
Windowsの例(PowerShell):$home\.ssh\id_rsa
-
<localPort>
を1522に置き換える。 -
<Private_IP_of_ADB>
は自動に実のIPが埋められるので、変更する必要がない。
PowerShllのコマンド例:
ssh -i $home\.ssh\id_rsa -N -L 1522:10.0.1.130:1522 -p 22 <bastion_ocid>@host.bastion.ap-tokyo-1.oci.oraclecloud.com
※、接続成功の場合、コマンドプロンプトを返さない。
7. ADBに接続する
- SQL Developerを開き、接続を新規作成
Database Type: デフォルトのOracleを指定
Connection Type: Cloud Walletを指定
Configuration File:(ZIPファイルのままでよい。)
ホストファイルを編集した場合:元のWalletファイルを指定
ホストファイルを編集していない場合:tnsnames.oraを編集したWalletファイルを指定(次のスクリーンショットのように)。
Service: 必要に応じて、XXXX_high, XXXX_medium, XXXX_lowの選択肢から指定
「テスト」ボタンを押し、接続をテストします。接続成功を確認したら、「接続」ボタンを押し、接続を立てます。
SQL Plusを使いたい場合
クライアント側からSQL Plusを利用しプライベートADBへの接続も可能です。上記ステップ以外、sqlnet.oraの編集も必要です。別のトピックとなりますので、ここで割愛させていただきます。興味のある方は以下の記事をご参照ください。接続元は"OCI Cloud Shell"ですが、作業の流れは同様です。(SQL Plusの場合、tnsnames.oraの修正も必要ですが、最後にWalletファイルの圧縮は不要です。)
OCI Cloud Shell上のSQL PlusからADBに接続する
付録
トラブル・シューティング
ADBへの接続が失敗した場合、以下の原因は一般的です。ご参考ください。
- 無効なユーザーまたはパスワード。
- ユーザー・ロールの指定は間違った。
- ADBインスタンスはまだ起動していない。
- リスナー・ポート(TCP 1522)は、Ingressルールに追加されていない。
- SSHトンネルは未作成か、作成が失敗した。
トンネル作成失敗、或いはタイムアウトの時、以下のメッセージが表示される。
Connection to host.bastion.ap-tokyo-1.oci.oraclecloud.com closed by remote host.
- tnsnames.oraの編集が間違ったため、サービス名が識別できない。(Linux OSで編集)
- Bastionのセッション期限が切れた(デフォルトは3時間)。
セッション期限が切れた後、SSHトンネルを作成しようとしたら、以下のエラーが発生する。
<bastion_ocid>@host.bastion.ap-tokyo-1.oci.oraclecloud.com: Permission denied (publickey)
対策:セッションを再作成する。
Bastionの制限
項目 | 内容 |
---|---|
最大Bastion数 | テナンシ毎に5つ |
最大セッション数 | Bastionあたり20セッション |
最大セッション存続時間 | 3時間 |
最小セッション存続時間 | 30分 |
データ転送制限 | データ転送の制限はありません。 ただし、SSH接続あたりの接続速度は16 Mbpsに制限されます。 |
以上です。
関連記事
オラクル・クラウドの個人ブログ一覧
OCI Cloud Shell上のSQL PlusからAutonomous DBに接続する
SQL Developerで様々なDBに接続する方法
Oracle Base DBのサービス名を取得する
OCI データベース・ツールでオラクルDBへの接続方法
OCI Bastion経由でプライベート・サブネット内のOracle DBに接続する
OCI Bastion経由でMySQL Database Serviceに接続する