1
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

OCI Bastion について整理する

1
Posted at

001samune.png

はじめに

本記事では、以下についてまとめます。

  • OCI Bastion について
  • 使用方法 (デモ)

概要

プライベートNW に位置する以下サービスへのセキュアな接続を提供してくれるサービス です。

  • OCI Compute ( Linux / Windows Server )
  • Oracle MySQL Database Service ( Oracle MySQL HeatWave )
  • Autonomous Transaction Processing ( ATP )
  • OCI OKE
  • SSH アクセスを許可するその他のリソース

上記サービスに外部接点(グルーバルIP)を持たせることなく、外部からの接続を可能にします。
無償で利用可能です。

  • AWS で言うところの、AWS Systems Manager Session Manager に役割が似ていますね

概念

全体像

全てのセッションタイプに必要なコンポーネントを含めた全体像は以下の通りです。
overview.drawio.png

OCI Bastion を作成すると、プライベートリソースへ接続するために、OCI Bastion に紐づけられた Private Endpoint (プライベートIPを持つVNIC) が作成されます。
この Private Endpoint がクライアントからの接続をバイパスし、接続先ターゲットリソースとの接続を確立します。

  • Private Endpoint は、OCI Bastion 毎に作成されます
  • 加えて、プライベートIPは 2つ 使用します ( 作成したOCI Bastion × 2 )
  • OCI では、各サブネット毎に「最初の2つ」と「最後の1つ」のプライベートIPが予約されていて使えないので、その点考慮する必要があります

上図では、Private Endpoint と接続先ターゲットリソースのサブネットを分けていますが、もちろん同一サブネットとしても問題ありません。
この点は、通信制御やセキュリティ等の要件次第です。

セッションタイプ

セッションタイプは以下 3つ です。

  • 管理対象SSHセッション
  • SSHポート転送セッション
  • 動的ポート転送(SOCKS5)セッション

どのセッションタイプでも、クライアントから OCI Bastion のサービスエンドポイントの接続に SSH を利用します。

管理対象SSHセッション

接続先ターゲットリソースへの SSH 接続を中継します。

動きとしては、クライアントから OCI Bastion サービスエンドポイントにSSH接続し、その接続を経由して Private Endpoint から接続先ターゲットにSSH接続します。

本セッションを利用するには以下要件すべて満たしている必要があります。

  • OCI Compute インスタンスがLinuxプラットフォーム・イメージで実行されていること
  • OCI Compute インスタンスでOpenSSHサーバーが実行されていること
  • OCI Compute インスタンスでOracle Cloud Agentが実行されていること
  • Oracle Cloud Agentで、要塞プラグインが有効になっていること

つまり本セッションは OCI Compute インスタンス (Linux) のみ利用できる ということです。

managed-ssh-session.drawio.png

SSHポート転送セッション

SSHトンネルを利用し、接続先ターゲットリソースへ接続します。

動きとしては、クライアントから OCI Bastion サービスエンドポイントにSSHトンネルを張り、そのトンネルを経由して Private Endpoint から接続先ターゲットに接続します。

本セッションを利用するための要件はありません。

ssh-port-forwarding-session.drawio.png

動的ポート転送(SOCKS5)セッション

動きとしては、SSHポート転送セッションとほぼ変わりません。
そのため、本セッションを利用するための要件はありません。

SSHポート転送セッションとの違いは、接続先ターゲットリソースをクライアント側で適宜変えられる という点です。

SSHポート転送セッションは、セッション作成時に接続先ターゲットリソースを一つだけ指定します。 (管理対象SSHセッションもです)
つまり、セッションと接続先ターゲットリソースは1:1で固定です。(後から接続先ターゲットリソースを変更することはできません。その場合は、セッション再作成する必要があります。)

対して動的ポート転送セッションは、セッションを作成する際に接続先ターゲットリソースを指定しません。クライアント側(PC)で指定します。

dynamic-port-forwarding-session.drawio.png

通信要件

全てのセッションに共通している要件は以下の通りです。

  • Private Endpoint から、接続先ターゲットリソース宛通信のアウトバウンド (例:TCP/22, RDP/3389)
  • 接続先ターゲットターゲットリソースのインバウンド (例:TCP/22, RDP/3389)
  • Private Endpoint は Network Security Group (NSG) で制御できないので、Security List (SL) で許可する必要があります

管理対象SSHセッションのみ追加で以下要件が必要です。

  • Oracle Cloud Agent (OCI Compute Instance) から、Oracle Service Network 宛通信 (TCP/443) のアウトバウンド
  • セッション構成及び接続先ターゲットリソースへのアクセス権を付与するために使用されるSSH公開キーが格納されている OCI Bastion Backend への通信に必要です

使用方法(デモ)

検証構成

検証構成図は以下の通りです。
3つのセッション試していきます。
なお、OCI Bastion 以外のリソースは作成済みで進めていきます。

architecture.drawio.png

  • 環境構築コードは以下 GitHub にあげてますので、よかったら覗いてみてください

実践(OCI Bastion 作成)

始めに OCI Bastion を作成していきます。
本検証では、1つの OCI Bastion に各セッションを作成していきます。

OCI Bastion の制限は以下のとおりです

  • Bastion: リージョン当たり最大5つの要塞
  • セッション: Bastion 当たり最大20セッション

OCI コンソール左上のハンバーガーマークをクリックし、「Identity & Security」→「Bastion」をクリックします。
image.png

任意のコンパートメントを指定し、「Create bastion」をクリックします
image.png

設定を入力し、「Create bastion」をクリックします。
今回は以下のようにしています。
image.png
image.png

項目 概要 設定値
Bastion name ・Bastionを識別する名前 bastion
Configure networking
Target virtual cloud network ・Bastion Private Endpointを作成するsubnetが所属するVCN vcn
※vcnという名前のVCN
Target subnet ・Bastion Private Endpointを作成するsubnet private-bastion
Enable FQDN Support and SOCKS5 ・管理対象SSHセッション以外のセッションで接続する際にFQDN指定を有効化するかどうか
・SOCKS5を有効化するかどうか
Enabled
CIDR block allowlist ・Bastionに接続可能な送信元CIDR
・複数指定可能
0.0.0.0/0
Advanced options
Maximum session time-to-live(TTL) ・Bastion に作成するセッションにて指定するTTLの上限値
・最大3時間
180 minutes

「State」が「Active」になれば作成完了です。
image.png

実践(管理対象SSHセッション)

  • こちら でも触れている通り、クライアントから接続先ターゲットに繋ぐ際、中継としてクライアントから OCI Bastin との間でSSH接続(or SSHトンネル)します
  • そのため、それ用のSSHキーペア(公開鍵/秘密鍵)を作成する必要があります
  • 本検証では、事前作成済みとして進めていきます
  • ちなみに、セッション作成時にSSHキーペアを作成することも可能です

管理対象SSHセッションを試していきます。
本検証では、プライベートサブネットに所属する OCI Compute インスタンス(Oracle Linux)へ接続します。

コンソール or CLI で管理対象SSHセッションを作成する際、以下条件を満たしていないと作成に失敗します。

  • OCI Compute インスタンスが RUNNING であること
  • Oracle Cloud Agent Bastion plugin が RUNNING であること

厳密には、コンソールの場合はRUNNINGでないと選択候補に出てきません

こちら で作成した bastion をクリックします。
image.png

「Sessions」タブを選択し、「Create session」をクリックします。
image.png

設定を入力し、「Create session」をクリックします。
今回は以下のようにしています。
image.png
image.png
image.png

項目 概要 設定値
Session type ・セッションタイプ Managed SSH session
Session name ・セッションを識別する名前 managed-ssh-session-to-oracle
Username ・ターゲットに接続する際のOSユーザー名 opc
Compute instance ・接続先ターゲット oracle-instance
Add SSH key
SSH key ・クライアントとBastionとの間でSSH接続(SSHトンネル)する際に使用する公開鍵 public_bastion.pub
※事前生成した公開鍵ファイル
Advanced options
Maximum session time-to-live ・セッション接続有効時間
・最大3時間
・Bastion側で設定した上限値は超えられない
180 minutes
Target compute instance port ・ターゲットに接続する際のポート 22
Target compute instance IP address ・接続先ターゲットのプライベートIPアドレス 10.0.2.9

「State」が「Active」になれば作成完了です。
image.png

では実際に接続していきます。
作成したセッションの右端に位置する3点マークをクリックし「Copy SSH command」をクリックします。
image.png

コピーされたコマンドは以下の通りです。(見やすいように改行しています)
<privateKey> が2つありますが、どちらも先程登録した公開鍵のペアとなる秘密鍵に修正して実行します。

ssh -i <privateKey> \
-o ProxyCommand="ssh -i <privateKey> -W %h:%p -p 22 ocid1.bastionsession.oc1.ap-tokyo-1.amaaaaaakipmm7yavfimmk63tjrgeiekkuxtizbq3gejasnhcb5phxztwaja@host.bastion.ap-tokyo-1.oci.oraclecloud.com" \
-p 22 opc@10.0.2.9

厳密には、各<privateKey>は以下の通りです。

  • 1つ目:接続先ターゲットに登録してある公開鍵のペアとなる秘密鍵
  • 2つ目:セッション作成時に登録した公開鍵のペアとなる秘密鍵

そのため、OCI Compute インスタンス側に別の公開鍵を設定している場合は、そのペアとなる秘密鍵を1つ目の<privateKey>に指定すれば問題なく接続ができます。

本検証では、OCI Compute インスタンス側には事前に公開鍵を設定していません。

そのため、2つの<privateKey>には、セッション作成時に登録した公開鍵のペアとなる秘密鍵を指定します。

それでも接続できる理由は、セッション作成時に、OCI Compute インスタンスで動いている Oracle Cloud Agent (Bastion plugin) が、セッション作成時に登録した公開鍵を OCI Bastion Backend から取得しているためです

実際に接続してみましょう。
問題なく接続できていることが確認できています。
2回接続先ホストの信頼性について確認されていますが、1回目が OCI Bastion の APIエンドポイントで、2回目が接続先ターゲットの OCI Compute インスタンスです。

$ ssh -i ./private_bastion.pem \
-o ProxyCommand="ssh -i ./private_bastion.pem -W %h:%p -p 22 ocid1.bastionsession.oc1.ap-tokyo-1.amaaaaaakipmm7yavfimmk63tjrgeiekkuxtizbq3gejasnhcb5phxztwaja@host.bastion.ap-tokyo-1.oci.oraclecloud.com" \
-p 22 opc@10.0.2.9
The authenticity of host 'host.bastion.ap-tokyo-1.oci.oraclecloud.com (192.29.38.223)' can't be established.
ED25519 key fingerprint is SHA256:3aOy6j3hXj3lRciOXTNWML9Eu4dD1KLkmk5zEP3UXF0.
This key is not known by any other names.
Are you sure you want to continue connecting (yes/no/[fingerprint])? yes
Warning: Permanently added 'host.bastion.ap-tokyo-1.oci.oraclecloud.com' (ED25519) to the list of known hosts.
The authenticity of host '10.0.2.9 (<no hostip for proxy command>)' can't be established.
ED25519 key fingerprint is SHA256:exyyjMkIpmbvoXySluYAVVDPtj8XBBoiAHvvhsJvC40.
This key is not known by any other names.
Are you sure you want to continue connecting (yes/no/[fingerprint])? yes
Warning: Permanently added '10.0.2.9' (ED25519) to the list of known hosts.
Last login: Mon Jan 12 18:16:12 2026 from 10.0.1.168
[opc@oracle-instance ~]$ 
[opc@oracle-instance ~]$ 
[opc@oracle-instance ~]$ uname -n
oracle-instance
[opc@oracle-instance ~]$ 

実践(SSHポート転送セッション)

  • こちら でも触れている通り、クライアントから接続先ターゲットに繋ぐ際、中継としてクライアントから OCI Bastin との間でSSH接続(or SSHトンネル)します
  • そのため、それ用のSSHキーペア(公開鍵/秘密鍵)を作成する必要があります
  • 本検証では、事前作成済みとして進めていきます
  • ちなみに、セッション作成時にSSHキーペアを作成することも可能です

SSHポート転送セッションを試していきます。
本検証では、プライベートサブネットに所属する OCI Compute インスタンス(Windows Server)へ接続します。

コンソール or CLI でSSHポート転送セッションを作成する際、以下条件を満たしていないと作成に失敗します。

  • 接続先ターゲットが RUNNING であること

厳密には、コンソールの場合はRUNNINGでないと選択候補に出てきません

こちら で作成した bastion をクリックします。
image.png

「Sessions」タブを選択し、「Create session」をクリックします。
image.png

設定を入力し、「Create session」をクリックします。
今回は以下のようにしています。
image.png
image.png
image.png

項目 概要 設定値
Session type ・セッションタイプ SSH port forwarding session
Session name ・セッションを識別する名前 ssh-port-forwarding-session-to-windows
Connect to the target host by using ・Private Endpointからターゲットリソースに接続する際の接続情報
・IP address / Domain name / Instance name
Instance name
windows-instance
port ・ターゲットに接続する際のポート 3389
※windowsのため
Add SSH key
SSH key ・クライアントとBastionとの間でSSH接続(SSHトンネル)する際に使用する公開鍵 public_bastion.pub
※事前生成した公開鍵ファイル
Advanced options
※「Connect to the target host by using」の指定値により変動する
Maximum session time-to-live ・セッション接続有効時間
・最大3時間
・Bastion側で設定した上限値は超えられない
180 minutes
Target compute instance IP address ・接続先ターゲットのプライベートIPアドレス 10.0.3.112

「State」が「Active」になれば作成完了です。
image.png

では実際に接続していきます。
作成したセッションの右端に位置する3点マークをクリックし「Copy SSH command」をクリックします。
image.png

コピーされたコマンドは以下の通りです。(見やすいように改行しています。)
<privateKey> は先程登録した公開鍵のペアとなる秘密鍵に修正します。
<localPort> はSSHトンネルで経由する通信(今回はRDP)をマッピングするエフェメラルポートに修正します。

ssh -v -i <privateKey> \
-N -L <localPort>:10.0.3.112:3389 \
-p 22 ocid1.bastionsession.oc1.ap-tokyo-1.amaaaaaakipmm7ya3t43sp22dfw4prluhgpafirv5dp74ftoefblawaz6fda@host.bastion.ap-tokyo-1.oci.oraclecloud.com
  • コンソールからコピーしたコマンドに対して、-v オプションを追加しています
  • そうしないと、SSHトンネル接続成功有無がわからないためです

実際に接続してみましょう。
まず以下コマンドを実行して、クライアントからBastion までSSHトンネルを張ります。
最終行に debug1: pledge: filesystem もしくは debug1: pledge: network と出力されていれば SSHトンネル成功となります。

  • ターミナルは閉じないでください
$ ssh -v -i ./private_bastion.pem \
 -N -L 33389:10.0.3.112:3389 \
 -p 22 ocid1.bastionsession.oc1.ap-tokyo-1.amaaaaaakipmm7ya3t43sp22dfw4prluhgpafirv5dp74ftoefblawaz6fda@host.bastion.ap-tokyo-1.oci.oraclecloud.com
OpenSSH_9.9p2, LibreSSL 3.3.6
debug1: Reading configuration data /etc/ssh/ssh_config
~~~
(省略)
~~~
Authenticated to host.bastion.ap-tokyo-1.oci.oraclecloud.com ([192.29.38.223]:22) using "publickey".
debug1: Local connections to LOCALHOST:33389 forwarded to remote address 10.0.3.112:3389
debug1: Local forwarding listening on ::1 port 33389.
debug1: channel 0: new port-listener [port listener] (inactive timeout: 0)
debug1: Local forwarding listening on 127.0.0.1 port 33389.
debug1: channel 1: new port-listener [port listener] (inactive timeout: 0)
debug1: Entering interactive session.
+ debug1: pledge: filesystem

この状態で、RDPアプリケーションで接続します。
私は mac を使っているので、Windows App を使用します。
「+」→「Add PC」をクリックします。
image.png

「PC name」はセッションを張る際に指定したエフェメラルポートを記載し「Add」をクリックします。
image.png

登録したPCの3点マークをクリックし「Connect」をクリックします。
image.png

初めて繋ぐ際は信頼性の確認がされますが「Connect」をクリックします。
image.png

RDPで接続する際のユーザー情報を入力し「Continue」をクリックします。
image.png

問題なく接続できていることが確認できています。
image.png

実践(動的ポート転送セッション)

  • こちら でも触れている通り、クライアントから接続先ターゲットに繋ぐ際、中継としてクライアントから OCI Bastin との間でSSH接続(or SSHトンネル)します
  • そのため、それ用のSSHキーペア(公開鍵/秘密鍵)を作成する必要があります
  • 本検証では、事前作成済みとして進めていきます
  • ちなみに、セッション作成時にSSHキーペアを作成することも可能です

動的ポート転送セッションを試していきます。
本検証では、プライベートサブネットに所属する OCI Compute インスタンス(Oracle Linux)へ接続します。

コンソール or CLI で動的ポート転送セッションを作成する際の条件はありません

ただし、管理対象SSHセッションとは違い、接続先ターゲットが OCI Compute インスタンス(Linux)の場合は、インスタンス側で事前にSSH接続で利用する公開鍵を登録しておく必要があります

こちら で作成した bastion をクリックします。
image.png

「Sessions」タブを選択し、「Create session」をクリックします。
image.png

設定を入力し、「Create session」をクリックします。
今回は以下のようにしています。
image.png
image.png
image.png

項目 概要 設定値
Session type ・セッションタイプ Dynamic Port Forwarding (SOCKS5) Session
Session name ・セッションを識別する名前 dynamic-port-forwarding-session
Add SSH key
SSH key ・クライアントとBastionとの間でSSH接続(SSHトンネル)する際に使用する公開鍵 public_bastion.pub
※事前生成した公開鍵ファイル
Advanced options
Maximum session time-to-live ・セッション接続有効時間
・最大3時間
・Bastion側で設定した上限値は超えられない
180 minutes

「State」が「Active」になれば作成完了です。
image.png

では実際に接続していきます。
作成したセッションの右端に位置する3点マークをクリックし「Copy SSH command」をクリックします。
image.png

コピーされたコマンドは以下の通りです。(見やすいように改行しています。)
<privateKey> は先程登録した公開鍵のペアとなる秘密鍵に修正します。
<localPort> はSSHトンネルで経由する通信をマッピングするエフェメラルポートに修正します。

ssh -v -i <privateKey> \
-N -D 127.0.0.1:<localPort> \
-p 22 ocid1.bastionsession.oc1.ap-tokyo-1.amaaaaaakipmm7yabfbtjx4gfvocen33etgc4aif6xw3k2klmq6ardrcoitq@host.bastion.ap-tokyo-1.oci.oraclecloud.com
  • コンソールからコピーしたコマンドに対して、-v オプションを追加しています
  • そうしないと、SSHトンネル接続成功有無がわからないためです

実際に接続してみましょう。
まず以下コマンドを実行して、クライアントからBastion までSSHトンネルを張ります。
最終行に debug1: pledge: filesystem もしくは debug1: pledge: network と出力されていれば SSHトンネル成功となります。

  • ターミナルは閉じないでください
ssh -v -i ./private_bastion.pem \
 -N -D 127.0.0.1:33333 \
 -p 22 ocid1.bastionsession.oc1.ap-tokyo-1.amaaaaaakipmm7yabfbtjx4gfvocen33etgc4aif6xw3k2klmq6ardrcoitq@host.bastion.ap-tokyo-1.oci.oraclecloud.com
OpenSSH_9.9p2, LibreSSL 3.3.6
debug1: Reading configuration data /etc/ssh/ssh_config
~~~
(省略)
~~~
Authenticated to host.bastion.ap-tokyo-1.oci.oraclecloud.com ([192.29.38.223]:22) using "publickey".
debug1: Local connections to 127.0.0.1:33333 forwarded to remote address socks:0
debug1: Local forwarding listening on 127.0.0.1 port 33333.
debug1: channel 0: new port-listener [port listener] (inactive timeout: 0)
debug1: Entering interactive session.
debug1: pledge: filesystem

この状態で、以下コマンドで接続を実施します。
<localPort> は先程指定したエフェメラルポート記載します。
<privateKey> は OCI Compute インスタンスに事前に登録した公開鍵のペアとなる秘密鍵を指定します。
<ユーザー名> 及び <IPアドレス> は、SSH接続する際のOSユーザーと OCI Compute インスタンスのプライベートIPを指定します。

ssh -o \
ProxyCommand="nc -x 127.0.0.1:<localPort> %h %p" \
-i <privateKey> <ユーザー名>@<IPアドレス>

実行すると、問題なく接続できていることが確認できています。

$ ssh -o \                                                                              
ProxyCommand="nc -x 127.0.0.1:33333 %h %p" \
-i ./private_socks5.pem opc@10.0.2.9
The authenticity of host '10.0.2.9 (<no hostip for proxy command>)' can't be established.
ED25519 key fingerprint is SHA256:exyyjMkIpmbvoXySluYAVVDPtj8XBBoiAHvvhsJvC40.
This key is not known by any other names.
Are you sure you want to continue connecting (yes/no/[fingerprint])? yes
Warning: Permanently added '10.0.2.9' (ED25519) to the list of known hosts.
Last login: Mon Jan 12 19:21:55 2026 from 10.0.1.168
[opc@oracle-instance ~]$ 
[opc@oracle-instance ~]$ 
[opc@oracle-instance ~]$ uname -n
oracle-instance
[opc@oracle-instance ~]$ 

おわりに

本記事では、OCI Bastion についてと、使用方法についてまとめました。

OCI 上で IaaS 及び PaaS を使う際は、基本的に外部接点を持たないプライベートNWで構築することが大半だと思います。そのため、OCI Bastion の利用頻度は高くなると思いますのでぜひ本記事を参考に理解を深めていただければと思います。


🌟この記事が誰かの役に立てば幸いです!
また、ご質問やフィードバックもお待ちしています。


番外編

Private EndpointのIP確認

OCI Bastionを作成すると、対応するPrivate Endpointが作成されます。
そして、Private Endpointは2つのプライベートIPを使用しますが、気になったので確認してみました。

コンソール上からは、一つしか確認できません。
image.png

そのためCLIで確認しましたが、確認することはできませんでした。。。(やり方が悪いのかも。。。)
値の確認はできませんでしたが、仕様の手っ取り早い確認方法は /30 のサブネットを指定して作成したときにどうなるかですかね。(本記事では割愛しますが)

$ oci bastion bastion get --bastion-id ocid1.bastion.oc1.ap-tokyo-1.amaaaaaakipmm7yaiosydgvjpqdrkc2vl5en3xm4uc2bzfk5hogehogehoge
{
  "data": {
    "bastion-type": "STANDARD",
    "client-cidr-block-allow-list": [
      "0.0.0.0/0"
    ],
    "compartment-id": "ocid1.compartment.oc1..aaaaaaaamrqe66q2bcum2t25nj755hnzlqkaaqqmhogehogehogehoge",
    "defined-tags": {
      "Common": {
        "Env": "prd",
        "ManagedByTerraform": "true",
        "System": "oci-bastion-organize"
      },
      "Oracle-Tags": {
        "CreatedBy": "hogehoge",
        "CreatedOn": "2026-01-12T02:50:10.624Z"
      }
    },
    "dns-proxy-status": "ENABLED",
    "freeform-tags": {},
    "id": "ocid1.bastion.oc1.ap-tokyo-1.amaaaaaakipmm7yaiosydgvjpqdrkc2vl5enhogehogehogehogeho",
    "lifecycle-details": null,
    "lifecycle-state": "ACTIVE",
    "max-session-ttl-in-seconds": 10800,
    "max-sessions-allowed": 20,
    "name": "bastion",
    "phone-book-entry": null,
    "private-endpoint-ip-address": "10.0.1.168",
    "static-jump-host-ip-addresses": null,
    "system-tags": {},
    "target-subnet-id": "ocid1.subnet.oc1.ap-tokyo-1.aaaaaaaacnpydfyb2xxw2cmiya7fhogehogehogehogehogehogehogehoge",
    "target-vcn-id": "ocid1.vcn.oc1.ap-tokyo-1.amaaaaaakipmm7yai4o4h6xhogehogehogehogehogehogehogehogehogeh",
    "time-created": "2026-01-12T02:50:14.895000+00:00",
    "time-updated": "2026-01-12T02:53:23.649000+00:00"
  },
  "etag": "hogehogehogehogehogehogehoge15ffa99c324d37aad848e3aad25e18c28c2460--gzip"
}

参考資料

リファレンス

ブログ

1
0
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
1
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?