4
1

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 1 year has passed since last update.

IBM Cloud: Hyper Protect Crypto Services(HPCS) + Unified Key Orchestrator(UKO)を使って、AWSのKMSにBYOKしてみた

Last updated at Posted at 2022-09-13

1. はじめに

Hyper Protect Crypto Services(HPCS) は Unified Key Orchestrator(UKO)を利用することで、HPCSで生成した鍵を他社クラウドにBYOKするための機能を提供している。

https://cloud.ibm.com/docs/hs-crypto?topic=hs-crypto-uko-use-cases
image.png

HPCSの初期化作業については、以下の記事がよくまとまっているが、(私自身がやったことがなかったので)念の為その記事をなぞる形でコマンド結果を載せている。
Hyper Protect Crypto Servicesを使ってみた その1(初期化)
Hyper Protect Crypto Servicesを使ってみた その2(ROKS連携)

HPCSの初期化作業について興味がない人は、3章をスキップして4章から参照してもらうと良い。本稿ではAWSへのBYOKを試してみた。以下の手順は、
https://cloud.ibm.com/docs/hs-crypto?topic=hs-crypto-get-started
における、Step1, Step2, Step 3 (Unified Key Orchestrator Plan only)を順に追う形で試している。

2. 注文

東京リージョンおよび、プランとしてUnified Key Orchestratorを選択する。東京リージョンでは、Failover regionは選択できないため、最小構成の以下で注文する。
image.png
image.png

2-30分程でプロビジョニングが完了した。
image.png

3. HPCSの初期化

3-1. 暗号化ユニットを表示

ログイン
$ ibmcloud plugin install tke
$ ibmcloud plugin update tke
$ mkdir tke-files
$ export CLOUDTKEFILES=/Users/syasuda/tke-files
$ ibmcloud target -r jp-tok -g Default
Crypto Unitは2つ存在し、SELECTEDはfalse状態
$ ibmcloud tke cryptounits
Verifying the OA certificate chain for serial number 93AACH95...
Successfully verified the OA certificate chain for 93AACH95.

Verifying the OA certificate chain for serial number 93AAB5FR...
Successfully verified the OA certificate chain for 93AAB5FR.


API endpoint:     https://cloud.ibm.com
Region:           jp-tok
User:             xxxxxxx@xx.xxx.xxx
Account:          xxx (xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx)
Resource group:   Default

SERVICE INSTANCE: 2f3b5e36-3ab8-4946-aee6-192d1a71bee3
CRYPTO UNIT NUM   SELECTED   LOCATION
1                 false      [jp-tok].[AZ2-tok2-qz1-sr2-rk071-a01].[06].[04]
2                 false      [jp-tok].[AZ3-tok3-qz1-sr2-rk048-a01].[05].[03]

Note: all crypto units in a service instance must be configured the same.
Use 'ibmcloud tke cryptounit-compare' to check how crypto units are configured.

3-2. 操作対象とする暗号化ユニットを選択

Crypto Unit 1, 2を選択
$ ibmcloud tke cryptounit-add

API endpoint:     https://cloud.ibm.com
Region:           jp-tok
User:             xxxxxxx@xx.xxx.xxx
Account:          xxx (xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx)
Resource group:   Default

SERVICE INSTANCE: 2f3b5e36-3ab8-4946-aee6-192d1a71bee3
CRYPTO UNIT NUM   SELECTED   LOCATION
1                 false      [jp-tok].[AZ2-tok2-qz1-sr2-rk071-a01].[06].[04]
2                 false      [jp-tok].[AZ3-tok3-qz1-sr2-rk048-a01].[05].[03]

Note: all crypto units in a service instance must be configured the same.
Use 'ibmcloud tke cryptounit-compare' to check how crypto units are configured.

Enter a list of CRYPTO UNIT NUM to add, separated by spaces:
> 1 2
OK

API endpoint:     https://cloud.ibm.com
Region:           jp-tok
User:             xxxxxxx@xx.xxx.xxx
Account:          xxx (xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx)
Resource group:   Default

SERVICE INSTANCE: 2f3b5e36-3ab8-4946-aee6-192d1a71bee3
CRYPTO UNIT NUM   SELECTED   LOCATION
1                 true       [jp-tok].[AZ2-tok2-qz1-sr2-rk071-a01].[06].[04]
2                 true       [jp-tok].[AZ3-tok3-qz1-sr2-rk048-a01].[05].[03]

Note: all crypto units in a service instance must be configured the same.
Use 'ibmcloud tke cryptounit-compare' to check how crypto units are configured.
SELECTEDはtrue状態
$ ibmcloud tke cryptounits

API endpoint:     https://cloud.ibm.com
Region:           jp-tok
User:             xxxxxxx@xx.xxx.xxx
Account:          xxx (xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx)
Resource group:   Default

SERVICE INSTANCE: 2f3b5e36-3ab8-4946-aee6-192d1a71bee3
CRYPTO UNIT NUM   SELECTED   LOCATION
1                 true       [jp-tok].[AZ2-tok2-qz1-sr2-rk071-a01].[06].[04]
2                 true       [jp-tok].[AZ3-tok3-qz1-sr2-rk048-a01].[05].[03]

Note: all crypto units in a service instance must be configured the same.
Use 'ibmcloud tke cryptounit-compare' to check how crypto units are configured.
Crypt Unitの比較。差異がないことを確認。
$ ibmcloud tke cryptounit-compare

SIGNATURE THRESHOLDS
SERVICE INSTANCE: 2f3b5e36-3ab8-4946-aee6-192d1a71bee3
CRYPTO UNIT NUM   SIGNATURE THRESHOLD   REVOCATION THRESHOLD
1                 0                     0
2                 0                     0

==> Crypto units with a signature threshold of 0 are in IMPRINT MODE. <==


CRYPTO UNIT ADMINISTRATORS
SERVICE INSTANCE: 2f3b5e36-3ab8-4946-aee6-192d1a71bee3
CRYPTO UNIT NUM   ADMIN NAME          SUBJECT KEY IDENTIFIER
1                 No administrators
2                 No administrators


NEW MASTER KEY REGISTER
SERVICE INSTANCE: 2f3b5e36-3ab8-4946-aee6-192d1a71bee3
CRYPTO UNIT NUM   STATUS   VERIFICATION PATTERN
1                 Empty    00000000000000000000000000000000
                           00000000000000000000000000000000
2                 Empty    00000000000000000000000000000000
                           00000000000000000000000000000000


CURRENT MASTER KEY REGISTER
SERVICE INSTANCE: 2f3b5e36-3ab8-4946-aee6-192d1a71bee3
CRYPTO UNIT NUM   STATUS   VERIFICATION PATTERN
1                 Empty    00000000000000000000000000000000
                           00000000000000000000000000000000
2                 Empty    00000000000000000000000000000000
                           00000000000000000000000000000000


CONTROL POINTS
SERVICE INSTANCE: 2f3b5e36-3ab8-4946-aee6-192d1a71bee3
CRYPTO UNIT NUM   XCP_CPB_ALG_EC_25519   XCP_CPB_BTC   XCP_CPB_ECDSA_OTHER
1                 Set                    Set           Set
2                 Set                    Set           Set

==> All crypto units are configured the same. <==

3-3. マスターキーのロード

3-3-1. signature keyの作成

signature keyの確認。
$ ibmcloud tke sigkeys
No files containing a signature key were found.

To create a file containing a signature key, use the 'ibmcloud tke sigkey-add' command.
signature keyを作成。
$ ibmcloud tke sigkey-add
Enter an administrator name to be associated with the signature key:
> syasuda
Enter a password to protect the signature key:
>
Re-enter the password to confirm:
>
OK
A signature key was created.
The available signature keys on this workstation are:

KEYNUM   DESCRIPTION   SUBJECT KEY IDENTIFIER
1        syasuda       4f834177b192f433e8adb188445166...

No KEYNUM are selected as current signature keys.
signature keyの確認。
$ ibmcloud tke sigkeys

KEYNUM   DESCRIPTION   SUBJECT KEY IDENTIFIER
1        syasuda       4f834177b192f433e8adb188445166...

No KEYNUM are selected as current signature keys.
signature keyを選択。
$ ibmcloud tke sigkey-sel

KEYNUM   DESCRIPTION   SUBJECT KEY IDENTIFIER
1        syasuda       4f834177b192f433e8adb188445166...

No KEYNUM are selected as current signature keys.

Enter the KEYNUM values to select as current signature keys, separated by spaces:
> 1
Enter the password for KEYNUM 1:
>
OK
KEYNUM 1 has been made the current signature key.
signature keyの確認。
$ ibmcloud tke sigkeys

KEYNUM   DESCRIPTION   SUBJECT KEY IDENTIFIER
1        syasuda       4f834177b192f433e8adb188445166...

KEYNUM 1 is selected as the current signature key.

3-3-2. 暗号化ユニットにadministratorを追加

administratorの確認
$ ibmcloud tke cryptounit-admins

No crypto unit administrators for service instance 2f3b5e36-3ab8-4946-aee6-192d1a71bee3
administratorの追加
$ ibmcloud tke cryptounit-admin-add

KEYNUM   DESCRIPTION   SUBJECT KEY IDENTIFIER
1        syasuda       4f834177b192f433e8adb188445166...

KEYNUM 1 is selected as the current signature key.

Enter the KEYNUM of the administrator signature key you wish to load:
> 1
Enter the password for the administrator signature key file:
>
OK
The crypto unit administrator was added to the selected crypto units.
administratorの確認
$ ibmcloud tke cryptounit-admins

SERVICE INSTANCE: 2f3b5e36-3ab8-4946-aee6-192d1a71bee3
CRYPTO UNIT NUM   ADMIN NAME   SUBJECT KEY IDENTIFIER
1                 syasuda      4f834177b192f433e8adb188445166...
2                 syasuda      4f834177b192f433e8adb188445166...

3-3-3. 閾値の設定

「コマンドを実行するのに何人のadministratorが必要か?」を設定する閾値確認
$ ibmcloud tke cryptounit-thrhlds

SIGNATURE THRESHOLDS
SERVICE INSTANCE: 2f3b5e36-3ab8-4946-aee6-192d1a71bee3
CRYPTO UNIT NUM   SIGNATURE THRESHOLD   REVOCATION THRESHOLD
1                 0                     0
2                 0                     0

==> Crypto units with a signature threshold of 0 are in IMPRINT MODE. <==
閾値の設定
$ ibmcloud tke cryptounit-thrhld-set

Enter the new signature threshold value:
> 1

Enter the new revocation signature threshold value:
> 1
Enter the password for the signature key identified by:
syasuda (4f834177b192f433e8adb188445166...)
>
OK
New signature threshold values have been set in the selected crypto units.

SIGNATURE THRESHOLDS
SERVICE INSTANCE: 2f3b5e36-3ab8-4946-aee6-192d1a71bee3
CRYPTO UNIT NUM   SIGNATURE THRESHOLD   REVOCATION THRESHOLD
1                 1                     1
2                 1                     1

==> Crypto units with a signature threshold of 0 are in IMPRINT MODE. <==
「コマンドを実行するのに何人のadministratorが必要か?」を設定する閾値確認
$ ibmcloud tke cryptounit-thrhlds

SIGNATURE THRESHOLDS
SERVICE INSTANCE: 2f3b5e36-3ab8-4946-aee6-192d1a71bee3
CRYPTO UNIT NUM   SIGNATURE THRESHOLD   REVOCATION THRESHOLD
1                 1                     1
2                 1                     1

==> Crypto units with a signature threshold of 0 are in IMPRINT MODE. <==

3-3-4. マスターキーパーツの作成

キーパーツの確認
$ ibmcloud tke mks

No files containing an EP11 master key part were found.
1つ目のキーパーツの作成
$ ibmcloud tke mk-add --random
Enter a description for the key part:
> masterkeypart01
Enter a password to protect the key part:
>
Re-enter the password to confirm:
>
OK
A key part was created.
The available EP11 master key parts on this workstation are:

KEYNUM   DESCRIPTION       VERIFICATION PATTERN
1        masterkeypart01   4cf069ff93ee657ef8b946f7ae9d87eb
                           1381b044df21fe55eb3707b98fcfa649
2つ目のキーパーツの作成
$ ibmcloud tke mk-add --random
Enter a description for the key part:
> masterkeypart02
Enter a password to protect the key part:
>
Re-enter the password to confirm:
>
OK
A key part was created.
The available EP11 master key parts on this workstation are:

KEYNUM   DESCRIPTION       VERIFICATION PATTERN
1        masterkeypart01   4cf069ff93ee657ef8b946f7ae9d87eb
                           1381b044df21fe55eb3707b98fcfa649
2        masterkeypart02   44875df8111694a4e377d54d83b0d5fd
                           4230feb0ccee04e1cb8bb82bd4254815
キーパーツの確認
$ ibmcloud tke mks

KEYNUM   DESCRIPTION       VERIFICATION PATTERN
1        masterkeypart01   4cf069ff93ee657ef8b946f7ae9d87eb
                           1381b044df21fe55eb3707b98fcfa649
2        masterkeypart02   44875df8111694a4e377d54d83b0d5fd
                           4230feb0ccee04e1cb8bb82bd4254815

3-3-5. master keyのアップロード

Crypto Unitにおけるmaster keyの状態
$ ibmcloud tke cryptounit-mks

NEW MASTER KEY REGISTER
SERVICE INSTANCE: 2f3b5e36-3ab8-4946-aee6-192d1a71bee3
CRYPTO UNIT NUM   STATUS   VERIFICATION PATTERN
1                 Empty    00000000000000000000000000000000
                           00000000000000000000000000000000
2                 Empty    00000000000000000000000000000000
                           00000000000000000000000000000000


CURRENT MASTER KEY REGISTER
SERVICE INSTANCE: 2f3b5e36-3ab8-4946-aee6-192d1a71bee3
CRYPTO UNIT NUM   STATUS   VERIFICATION PATTERN
1                 Empty    00000000000000000000000000000000
                           00000000000000000000000000000000
2                 Empty    00000000000000000000000000000000
                           00000000000000000000000000000000
master keyのアップロード
$ ibmcloud tke cryptounit-mk-load

KEYNUM   DESCRIPTION       VERIFICATION PATTERN
1        masterkeypart01   4cf069ff93ee657ef8b946f7ae9d87eb
                           1381b044df21fe55eb3707b98fcfa649
2        masterkeypart02   44875df8111694a4e377d54d83b0d5fd
                           4230feb0ccee04e1cb8bb82bd4254815

Enter the KEYNUM values of the master key parts you wish to load.
2 or 3 values must be specified, separated by spaces.
> 1 2
Enter the password for the signature key identified by:
syasuda (4f834177b192f433e8adb188445166...)
>
Enter the password for key file 1
>
Enter the password for key file 2
>
OK
The new master key register has been loaded in the selected crypto units.

NEW MASTER KEY REGISTER
SERVICE INSTANCE: 2f3b5e36-3ab8-4946-aee6-192d1a71bee3
CRYPTO UNIT NUM   STATUS             VERIFICATION PATTERN
1                 Full Uncommitted   ad4bed6dd9e3c07654762508fd5f969f
                                     0f811f0a27ec8ff3ae031adc6ff92aa4
2                 Full Uncommitted   ad4bed6dd9e3c07654762508fd5f969f
                                     0f811f0a27ec8ff3ae031adc6ff92aa4

3-3-6. master keyのコミット

Crypto Unitにおけるmaster keyの状態。NEW MASTER KEYの登録状態は、まだFull Uncommitted
$ ibmcloud tke cryptounit-mks

NEW MASTER KEY REGISTER
SERVICE INSTANCE: 2f3b5e36-3ab8-4946-aee6-192d1a71bee3
CRYPTO UNIT NUM   STATUS             VERIFICATION PATTERN
1                 Full Uncommitted   ad4bed6dd9e3c07654762508fd5f969f
                                     0f811f0a27ec8ff3ae031adc6ff92aa4
2                 Full Uncommitted   ad4bed6dd9e3c07654762508fd5f969f
                                     0f811f0a27ec8ff3ae031adc6ff92aa4


CURRENT MASTER KEY REGISTER
SERVICE INSTANCE: 2f3b5e36-3ab8-4946-aee6-192d1a71bee3
CRYPTO UNIT NUM   STATUS   VERIFICATION PATTERN
1                 Empty    00000000000000000000000000000000
                           00000000000000000000000000000000
2                 Empty    00000000000000000000000000000000
                           00000000000000000000000000000000
Commit
$ ibmcloud tke cryptounit-mk-commit
Enter the password for the signature key identified by:
syasuda (4f834177b192f433e8adb188445166...)
>
OK
The new master key register has been committed in the selected crypto units.

NEW MASTER KEY REGISTER
SERVICE INSTANCE: 2f3b5e36-3ab8-4946-aee6-192d1a71bee3
CRYPTO UNIT NUM   STATUS           VERIFICATION PATTERN
1                 Full Committed   ad4bed6dd9e3c07654762508fd5f969f
                                   0f811f0a27ec8ff3ae031adc6ff92aa4
2                 Full Committed   ad4bed6dd9e3c07654762508fd5f969f
                                   0f811f0a27ec8ff3ae031adc6ff92aa4
Crypto Unitにおけるmaster keyの状態。NEW MASTER KEYの登録状態は、Full Committedになった。ただし、CURRENT MASTER KEYはまだEmptyのまま。
$ ibmcloud tke cryptounit-mks

NEW MASTER KEY REGISTER
SERVICE INSTANCE: 2f3b5e36-3ab8-4946-aee6-192d1a71bee3
CRYPTO UNIT NUM   STATUS           VERIFICATION PATTERN
1                 Full Committed   ad4bed6dd9e3c07654762508fd5f969f
                                   0f811f0a27ec8ff3ae031adc6ff92aa4
2                 Full Committed   ad4bed6dd9e3c07654762508fd5f969f
                                   0f811f0a27ec8ff3ae031adc6ff92aa4


CURRENT MASTER KEY REGISTER
SERVICE INSTANCE: 2f3b5e36-3ab8-4946-aee6-192d1a71bee3
CRYPTO UNIT NUM   STATUS   VERIFICATION PATTERN
1                 Empty    00000000000000000000000000000000
                           00000000000000000000000000000000
2                 Empty    00000000000000000000000000000000
                           00000000000000000000000000000000

3-3-7. master keyのactivate

master keyのactivate
$ ibmcloud tke cryptounit-mk-setimm
Warning!  Any key storage associated with the targeted service instance must be prepared to accept the new master key value before running this command.  Otherwise, key storage may become unusable.
Do you want to continue?
Answer [y/N]:
> y
Enter the password for the signature key identified by:
syasuda (4f834177b192f433e8adb188445166...)
>
OK
Set immediate completed successfully in the selected crypto units.

NEW MASTER KEY REGISTER
SERVICE INSTANCE: 2f3b5e36-3ab8-4946-aee6-192d1a71bee3
CRYPTO UNIT NUM   STATUS   VERIFICATION PATTERN
1                 Empty    00000000000000000000000000000000
                           00000000000000000000000000000000
2                 Empty    00000000000000000000000000000000
                           00000000000000000000000000000000


CURRENT MASTER KEY REGISTER
SERVICE INSTANCE: 2f3b5e36-3ab8-4946-aee6-192d1a71bee3
CRYPTO UNIT NUM   STATUS   VERIFICATION PATTERN
1                 Valid    ad4bed6dd9e3c07654762508fd5f969f
                           0f811f0a27ec8ff3ae031adc6ff92aa4
2                 Valid    ad4bed6dd9e3c07654762508fd5f969f
                           0f811f0a27ec8ff3ae031adc6ff92aa4
Crypto Unitにおけるmaster keyの状態。CURRENT MASTER KEYがValidとなった。
$ ibmcloud tke cryptounit-mks

NEW MASTER KEY REGISTER
SERVICE INSTANCE: 2f3b5e36-3ab8-4946-aee6-192d1a71bee3
CRYPTO UNIT NUM   STATUS   VERIFICATION PATTERN
1                 Empty    00000000000000000000000000000000
                           00000000000000000000000000000000
2                 Empty    00000000000000000000000000000000
                           00000000000000000000000000000000


CURRENT MASTER KEY REGISTER
SERVICE INSTANCE: 2f3b5e36-3ab8-4946-aee6-192d1a71bee3
CRYPTO UNIT NUM   STATUS   VERIFICATION PATTERN
1                 Valid    ad4bed6dd9e3c07654762508fd5f969f
                           0f811f0a27ec8ff3ae031adc6ff92aa4
2                 Valid    ad4bed6dd9e3c07654762508fd5f969f
                           0f811f0a27ec8ff3ae031adc6ff92aa4

3-4. 最終形態でのUI上の表示

Master key not activatedの警告がなくなった。
image.png

4. Unified Key Orchestrator(UKO)

4-1. IAMで権限を付与する。

以下は全部の権限を割り当てた際の例。
image.png
image.png
image.png

4-2. Vaultの作成

Vaultは

  • HPCSと同一インスタンス内のKeystore
  • AWS/AzureのようなリモートにあるKeystore

の集まりを管理するための器であり、Vault単位でIAMによるアクセス制御が可能である。

https://cloud.ibm.com/docs/hs-crypto?topic=hs-crypto-create-vaults&interface=ui
https://cloud.ibm.com/docs/hs-crypto?topic=hs-crypto-grant-access-vaults

  • Create Vault image.png
  • Vaultの名前などを入力 image.png
  • 作成完了image.png

4-3. Keystoreの作成

  • Add keystore image.png
  • 先程作成したVaultを選択してNext image.png
  • 今回はremote keystoreとしてAWSを利用するため、AWS keystoreを選択。image.png
  • keystoreの名称や、AWSのリージョン(東京リージョンはap_northeast)、Access key情報などを入力。Test Connectionによって接続の可否を確認。image.png
  • 接続テストがうまくいったらNext image.png
  • Add keystore image.png
  • 作成完了 image.png

4-4 AWSに配布するmanaged keyの作成

  • Create key image.png
  • 先程作成したVaultを選択 image.png
  • AWS Key Management Serviceを選択 image.png
  • 鍵の名称などを選択。Stateは即時に有効するか、後から有効にするかを選択できる。今回は即時に有効にするActiveを選択。その他expiration dateやタグ情報を入力。本稿執筆時点でのUKOではこのexpiration dateになったからといって勝手にstateが変わる訳ではない。 image.png
  • 鍵の配置先(配布先)であるkeystoreを選択。 image.png
  • 最終確認。問題なければ、Create Key。 image.png
  • 鍵が作成された。image.png

4-5 配布された鍵と関連イベントの確認

以下は、AWS上でのKMSの状態。確かに鍵が配布されている。

image.png
image.png
image.png
image.png
image.png
image.png

また一連のイベントは、IBM Cloud側ではActivity Tracker with LogDNAにて確認が可能である。
https://cloud.ibm.com/docs/hs-crypto?topic=hs-crypto-uko-at-events&interface=ui#uko-at-events-analyze-failed

  • Activity Tracker with LogDNA image.png

AWS側では、AWS CloudTrailを使って一連のAPI呼び出し処理の内容が確認可能である。

  • イベント一覧
    image.png
  • イベント詳細。例えば、TLS1.3を使ってAPIが呼び出されていることがわかる。image.png

5. UKOを使った鍵の状態変更に伴うテスト

5-1 Deactivate

  • HPCS上でdeactivateする。image.png
  • deactivateの確認画面 image.png
  • deactivateになった(見えない場合は、フィルタリングされている可能性があるので注意)image.png
  • AWS上ではPending Importになった。image.png

5-2 Activate

  • 再度activateする。image.png
  • 確認画面 image.png
  • AWS上で再度Enabledになったimage.png

5-3 Destroy

  • deactivateした後に、destroyする(activate状態から直接destroyはできない)。image.png
  • 確認。image.png
  • Destroyed状態になった。image.png
  • AWS上では、Pending Deletionになった。image.png

5-4 Remove from vault

  • Remove From Vault image.png
  • 確認。image.png
  • Vaultから消えた。image.png
  • AWSではPending Deletionのままだった。image.png

5-5. 複数の鍵の配布とPre-activeの鍵の状態

  • 複数の鍵を作成する。test3のみはPre-activeの状態で鍵を作成する。 image.png
  • AWS上での確認。Pre-activeの鍵は作成されていない。image.png
4
1
1

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

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?