LoginSignup
6
5

OCI Bastion経由でプライベート・サブネット内のOracle DBに接続する

Last updated at Posted at 2022-04-19

初めに
冒頭ですが、この記事は次のシリーズ記事の1つです。
シリーズ1:OCI Bastion サービス
シリーズ2:プライベート・サブネット内の Oracle DB/ADB に接続

接続先のOracle DBがクラウド上にある場合、一般的にはプライベート・サブネットに配置され、On-Pからパブリック・アクセスを通じて直接アクセスできません。VPNを設定しない場合、踏み台サーバを経由して接続できますが、OCI Bastionサービスを利用すれば、踏み台サーバを構築せずにOn-Pのクライアントから直接プライベート・サブネット内のOracle DBに接続できます。OCI Bastionサービスは無料で利用できます。

検証環境

項目 内容 コメント
DBタイプ OCI DB System (VM) IaaS DBにも接続可能
DBバージョン 19c Standard Edtion
クライアントOS Windows 2019 Server
DB接続ツール SQL Developer Ver 21.4 ダウンロードURL
SQL Plus
(Oracle Instant Client)
ダウンロードURL
SSHソフト OpenSSH

ステップ

1. Bastionの作成

Identity & Security -> Bastion -> Create Bastion

項目 内容
Bastion名 適当な名前を入力
ターゲットVCNとサブネット Oracle DBが所属するVCNとサブネットを選択
CIDRブロック許可リスト このテストではCIDRブロックの許可リストを「0.0.0.0/0」に設定しているが、運用時には範囲を絞り込むことが推奨される。例えば、 接続元(クライアント)のIPアドレスのみを許可するように。

注意
OCI Bastionを作成する際には、ターゲットのVCNとサブネットを指定する必要がありますが、Bastion自体に対しては置き場所の指定は不要です。

Bastionはアクティブの状態になりましたら、「プライベート・エンドポイントIP」は以下の画面から確認できます。このIPが、ターゲット・サブネット内で自動割り当てられます。次のステップでこのIPをセキュリティ・リストの入力ルールに追加します。 「CIDRブロック許可リスト」を編集したい場合は、「編集」ボタンをクリックすればOKです。
image.png

2. セッションの作成

Bastion -> Sessions -> Create session

項目 内容
セッション・タイプ "SSH port forwarding session"を選択
ターゲット・ホストに接続する方法 "IPアドレス"を選択 (デフォルト)
IPアドレス 接続先DBの「プライベートIP」
ポート 1521
SSHキー 既存のキーファイルを利用するか、新しいキーペアを作成する。(秘密キーをDBクライアント側に保存してください。)


ヒント:OCI DB Cloud Serviceを接続する場合、以下の画面でプライベートIPが取得できます。

セッションはアクティブの状態になりましたら、次のように、3ドットのメニューをクリックしてSSHコマンドをコピーします。このコマンドは、STEP 4. SSHトンネルの作成で使用されます。
image.png
デフォルトでは、セッションは3時間有効ですが、Bastionを作成する際にはこの期間を変更することが可能です。

3. セキュリティ・リストに入力ルールを追加

クラウド上のDBにアクセスするため、TCPポート1521を入力ルールに追加するのは必要です。
設定方法は、以下のどちらでもよいです。

  • プライベート・サブネットに紐づけられるセキュリティ・リストに、ルールを追加
  • DBインスタンスに紐づけられるNSGに、ルールを追加

これから、セキュリティ・リストを例にして設定します。

"Source CIDR"は、Bastionの「プライベート・エンドポイントIP」です(Bastionの情報ページに表示されます)。

4. 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_DB>:1521 -p 22 <bastion_ocid>@host.bastion.ap-tokyo-1.oci.oraclecloud.com

上記ステップ1でコピーしたものです。

  • <privateKey>を秘密キーのパスとファイル名に置き換えます。
     Windowsの例(PowerShell):$home\.ssh\id_rsa
  • <localPort>1521に置き換えます。
  • <Private_IP_of_DB>は自動に実のIPが埋められるので、変更する必要はありません。

ヒント:

  • バック・グラウンドで実行させたい場合:
    Windows (PowerShell): Start-Job { }でコマンドを囲む
    Linux OSを使用する時、コマンドの最後に&を追加
    バック・グラウンドで実施する場合、出力メッセージを表示しませんので、ご注意ください。初回トンネル作成時、或いはトラブル・シューティングの時、フォア・グラウンド・プロセスとして実施してください。
PS C:\Windows\system32> Start-Job { ssh -i $home\.ssh\id_rsa -N -L 1521:10.0.1.171:1521 -p 22 <bastion_ocid>@host.bastion.ap-tokyo-1.oci.oraclecloud.com }

Id     Name            PSJobTypeName   State         HasMoreData     Location             Command
--     ----            -------------   -----         -----------     --------             -------
1      Job1            BackgroundJob   Running       True            localhost             ssh -i $home\.ssh\id_r...


PS C:\Windows\system32>

5. Oracle DBに接続

  • 接続を新規作成
    Database Type: デフォルト(Oracle)を指定
    Role: デフォルトのままでよいが、必要に応じて指定できます。
    Username,Password: ユーザ名とパスワードを入力。
    Hostname: localhostと入力する(重要)。Port: 1521
    SID、Service Name: 片方を入力(PDBへ接続したい場合、PDBのサービス名を入力)。
    Save Password: チェックしたら、次回接続の時、パスワードの入力が省略できます。
    テスト」ボタンを押し、接続をテストします。接続成功を確認したら、「接続」ボタンを押し、接続を立てます。
    image.png
    サービス名の確認方法は、以下の記事をご参考ください。
    Oracle Base DBのサービス名を取得する

SQL Plusで接続したい場合、トンネル作成後、以下のコマンドを実行してください。
sqlplus <User>/<Password>@localhost:1521/<Service_Name>

c:\instantclient_21_3>sqlplus system@localhost:1521/DB19cPri_pdb1.privatesubnet1.vcn1.oraclevcn.com

SQL*Plus: Release 21.0.0.0.0 - Production on Fri Apr 22 07:39:11 2022
Version 21.3.0.0.0

Copyright (c) 1982, 2021, Oracle.  All rights reserved.

Enter password:
Last Successful login time: Fri Apr 22 2022 07:38:39 +00:00

Connected to:
Oracle Database 19c Standard Edition 2 Release 19.0.0.0.0 - Production
Version 19.14.0.0.0

SQL>

付録

トラブル・シューティング

DBへの接続が失敗した場合、以下のような原因は一般的です。ご参考ください。

  • 無効なユーザーまたはパスワード。
  • ユーザー・ロールの指定は間違った。
  • DBインスタンスはまだ起動していない。
  • 物理サーバかIaaS DBの場合、接続先サーバのファイアウォールには、リスナー・ポート(1521)が公開されていない。
  • クラウドDBの場合、リスナー・ポート(TCP 1521)は、Ingressルールに追加されていない。
    対策:セキュリティ・リストまたはNSGを確認してください。
  • SSHトンネルは未作成か、作成が失敗した。
    トンネル作成失敗、或いはタイムアウトの時、以下のメッセージが表示される。
    Connection to host.bastion.ap-tokyo-1.oci.oraclecloud.com closed by remote host.
  • Bastionのセッション期限が切れた(デフォルトは3時間)。
    セッション期限が切れた後、SSHトンネルを作成しようとしたら、以下のエラーが発生する。
    <bastion_ocid>@host.bastion.ap-tokyo-1.oci.oraclecloud.com: Permission denied (publickey)
    対策:セッションを再作成する。

Bastionの制限

項目 内容
最大Bastion数 テナンシ毎に5つ
最大セッション数 Bastionあたり20セッション
セッション存続時間 30分~3時間
データ転送制限 データ転送の制限はありません。
ただし、SSH接続あたりの接続速度は16 Mbpsに制限されます。

以上です。


自分からの関連記事
オラクル・クラウドの個人シリーズ・ブログ
SQL Developerで様々なDBに接続する方法
OCI データベース・ツールでオラクルDBへの接続方法
Oracle Base DBのサービス名を取得する
OCI Bastion経由でMySQL Database Serviceに接続する
OCI Bastion経由でプライベート・サブネット内のAutonomous DBに接続する

6
5
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
6
5