初めに
冒頭ですが、この記事は次のシリーズ記事の1つです。
シリーズ1:OCI Bastion サービス
シリーズ2:プライベート・サブネット内の Oracle DB/ADB に接続
接続先のOracle DBがクラウド上にある場合、一般的にはプライベート・サブネットに配置され、On-Pからパブリック・アクセスを通じて直接アクセスできません。VPNを設定しない場合、踏み台サーバを経由して接続できますが、OCI Bastionサービスを利用すれば、踏み台サーバを構築せずにOn-Pのクライアントから直接プライベート・サブネット内のOracle DBに接続できます。OCI Bastionサービスは無料で利用できます。
検証環境
項目 | 内容 | コメント |
---|---|---|
DBタイプ | OCI Base DB (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アドレスのみを許可するように。 |
注意
- このテストでは、CIDRブロックの許可リストを「0.0.0.0/0」に設定しています。運用時には範囲を絞り込むことが推奨されます。例えば、接続元(クライアント)のIPアドレス範囲のみを許可するのが良いでしょう。
- OCI Bastionを作成する際には、ターゲットのVCNとサブネットを指定する必要がありますが、Bastion自体に対し、配置場所を指定する必要はありません(誤解されることがよくあります)。
Bastionがアクティブの状態になると、「プライベート・エンドポイントIP」は次の画面から確認できます。このIPはターゲット・サブネット内で自動的に割り当てられます。次のステップで、このIPをセキュリティ・リストの入力ルールに追加します。「CIDRブロック許可リスト」を編集したい場合は、「編集」ボタンをクリックすれば大丈夫です。
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トンネルの作成で使用されます。
デフォルトでは、セッションは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: チェックしたら、次回接続の時、パスワードの入力が省略できます。
「テスト」ボタンを押し、接続をテストします。接続成功を確認したら、「接続」ボタンを押し、接続を立てます。
サービス名の確認方法は、以下の記事をご参考ください。
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に接続する